From 0aeadebf36eab6d537b67b38c5dcacf648f2f69f Mon Sep 17 00:00:00 2001 From: bkoz Date: Fri, 18 Jan 2008 08:16:51 +0000 Subject: 2008-01-18 Benjamin Kosnik * docs/*: To... * doc/*: ...here. * testsuite/Makefile.am: Move doc-performance to... * Makefile.am: Add doc to SUBDIRS, move doxygen-* rules to... * doc/Makefile.am: Consolidate documentation creation here. (doc-doxygen-html): New. (doc-doxygen-man): New. (doc-performance): New. * doc/Makefile.in: New. * acinclude.m4 (glibcxx_SUBDIRS): Add doc directory. * doc/doxygen/guide.html: Edit for unified html configuration. * doc/doxygen/mainpage.html: Same. * doc/doxygen/run_doxygen: Same, more namespace fixups for man generation. * doc/doxygen/user.cfg.in: Update for doxygen 1.5.4. * include/tr1_impl/random: Remove maint from doxygen markup. * include/tr1_impl/functional: Same. * include/std/tuple: Same. * include/std/streambuf: Same. * include/std/bitset: Same. * include/std/limits: Same. * include/std/fstream: Same. * include/std/istream: Same. * include/std/sstream: Same. * include/ext/pool_allocator.h: Same. * include/ext/rc_string_base.h: Same. * include/bits/basic_ios.h: Same. * include/bits/stl_list.h: Same. * include/bits/stl_map.h: Same. * include/bits/locale_classes.h: Same. * include/bits/stl_set.h: Same. * include/bits/stl_iterator_base_types.h: Same. * include/bits/basic_string.h: Same. * include/bits/stl_multimap.h: Same. * include/bits/stl_vector.h: Same. * include/bits/ios_base.h: Same. * include/bits/stl_deque.h: Same. * include/bits/postypes.h: Same. * include/bits/stl_multiset.h: Same. * include/bits/stl_algo.h: Same. * include/bits/stl_iterator.h: Same. * include/bits/stl_tempbuf.h: Same. * include/bits/stl_construct.h: Same. * include/bits/stl_relops.h: Same. * include/tr1/tuple: Same. * include/backward/auto_ptr.h: Same. * testsuite/23_containers/vector/requirements/dr438/assign_neg.cc: Fixups for line number changes. * testsuite/23_containers/vector/requirements/dr438/insert_neg.cc: Same. * testsuite/23_containers/vector/requirements/dr438/ constructor_1_neg.cc: Same. * testsuite/23_containers/vector/requirements/dr438/ constructor_2_neg.cc: Same. * testsuite/23_containers/deque/requirements/dr438/assign_neg.cc: Same. * testsuite/23_containers/deque/requirements/dr438/insert_neg.cc: Same. * testsuite/23_containers/deque/requirements/dr438/ constructor_1_neg.cc: Same. * testsuite/23_containers/deque/requirements/dr438/ constructor_2_neg.cc: Same. * testsuite/23_containers/list/requirements/dr438/assign_neg.cc: Same. * testsuite/23_containers/list/requirements/dr438/insert_neg.cc: Same. * testsuite/23_containers/list/requirements/dr438/ constructor_1_neg.cc: Same. * testsuite/23_containers/list/requirements/dr438/ constructor_2_neg.cc: Same. * testsuite/20_util/auto_ptr/assign_neg.cc: Same. * aclocal.m4: Regenerate. * config.h.in: Regenerate. * configure: Regenerate. * Makefile.in: Regenerate. * src/Makefile.in: Regenerate. * po/Makefile.in: Regenerate. * libmath/Makefile.in: Regenerate. * include/Makefile.in: Regenerate. * libsupc++/Makefile.in: Regenerate. * testsuite/Makefile.in: Regenerate. * scripts/make_graphs.py: Correct paths for new layout. 2008-01-17 Benjamin Kosnik * acinclude.m4 (AC_LC_MESSAGES): Remove serial. * linkage.m4 (AC_REPLACE_MATHFUNCS): Same. * configure: Regenerate. * aclocal.m4: Regenerate. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@131625 138bc75d-0d04-0410-961f-82ee72b054a4 --- libstdc++-v3/ChangeLog | 91 + libstdc++-v3/Makefile.am | 39 +- libstdc++-v3/Makefile.in | 210 +- libstdc++-v3/acinclude.m4 | 4 +- libstdc++-v3/aclocal.m4 | 159 +- libstdc++-v3/config.h.in | 3 + libstdc++-v3/configure | 68238 +++++++++---------- libstdc++-v3/doc/Makefile.am | 62 + libstdc++-v3/doc/Makefile.in | 459 + libstdc++-v3/doc/doxygen/Intro.3 | 132 + libstdc++-v3/doc/doxygen/TODO | 70 + libstdc++-v3/doc/doxygen/doxygroups.cc | 238 + libstdc++-v3/doc/doxygen/guide.html | 111 + libstdc++-v3/doc/doxygen/mainpage.html | 96 + libstdc++-v3/doc/doxygen/run_doxygen | 334 + libstdc++-v3/doc/doxygen/stdheader.cc | 170 + libstdc++-v3/doc/doxygen/style.css | 74 + libstdc++-v3/doc/doxygen/tables.html | 645 + libstdc++-v3/doc/doxygen/user.cfg.in | 1488 + libstdc++-v3/doc/html/17_intro/BADNAMES | 182 + libstdc++-v3/doc/html/17_intro/C++STYLE | 399 + libstdc++-v3/doc/html/17_intro/COPYING | 340 + libstdc++-v3/doc/html/17_intro/COPYING.DOC | 355 + libstdc++-v3/doc/html/17_intro/DESIGN | 859 + libstdc++-v3/doc/html/17_intro/TODO | 164 + libstdc++-v3/doc/html/17_intro/abi.html | 991 + libstdc++-v3/doc/html/17_intro/api.html | 290 + .../doc/html/17_intro/backwards_compatibility.html | 1073 + libstdc++-v3/doc/html/17_intro/c++0x_status.html | 2290 + libstdc++-v3/doc/html/17_intro/c++1998_status.html | 6004 ++ libstdc++-v3/doc/html/17_intro/confdeps.dot | 14 + libstdc++-v3/doc/html/17_intro/confdeps.png | Bin 0 -> 3486 bytes libstdc++-v3/doc/html/17_intro/configury.html | 305 + libstdc++-v3/doc/html/17_intro/contribute.html | 135 + libstdc++-v3/doc/html/17_intro/howto.html | 737 + libstdc++-v3/doc/html/17_intro/license.html | 119 + libstdc++-v3/doc/html/17_intro/porting.html | 992 + libstdc++-v3/doc/html/17_intro/porting.texi | 570 + libstdc++-v3/doc/html/17_intro/tr1_status.html | 2322 + libstdc++-v3/doc/html/18_support/howto.html | 435 + libstdc++-v3/doc/html/19_diagnostics/howto.html | 127 + libstdc++-v3/doc/html/20_util/allocator.html | 554 + libstdc++-v3/doc/html/20_util/howto.html | 234 + libstdc++-v3/doc/html/20_util/shared_ptr.html | 419 + libstdc++-v3/doc/html/21_strings/gotw29a.txt | 159 + libstdc++-v3/doc/html/21_strings/howto.html | 472 + libstdc++-v3/doc/html/21_strings/stringtok_h.txt | 102 + .../doc/html/21_strings/stringtok_std_h.txt | 39 + libstdc++-v3/doc/html/22_locale/codecvt.html | 595 + libstdc++-v3/doc/html/22_locale/ctype.html | 166 + libstdc++-v3/doc/html/22_locale/howto.html | 240 + libstdc++-v3/doc/html/22_locale/locale.html | 543 + libstdc++-v3/doc/html/22_locale/messages.html | 461 + libstdc++-v3/doc/html/23_containers/howto.html | 457 + libstdc++-v3/doc/html/23_containers/wrappers_h.txt | 48 + libstdc++-v3/doc/html/24_iterators/howto.html | 200 + libstdc++-v3/doc/html/25_algorithms/howto.html | 116 + libstdc++-v3/doc/html/26_numerics/howto.html | 179 + .../doc/html/27_io/binary_iostreams_kanze.txt | 51 + .../doc/html/27_io/binary_iostreams_kuehl.txt | 89 + libstdc++-v3/doc/html/27_io/howto.html | 779 + libstdc++-v3/doc/html/configopts.html | 342 + libstdc++-v3/doc/html/debug.html | 474 + libstdc++-v3/doc/html/documentation.html | 361 + libstdc++-v3/doc/html/ext/ballocator_doc.html | 426 + libstdc++-v3/doc/html/ext/concurrence.html | 342 + libstdc++-v3/doc/html/ext/debug_mode.html | 578 + libstdc++-v3/doc/html/ext/howto.html | 675 + libstdc++-v3/doc/html/ext/lwg-active.html | 14696 ++++ libstdc++-v3/doc/html/ext/lwg-closed.html | 10627 +++ libstdc++-v3/doc/html/ext/lwg-defects.html | 24284 +++++++ libstdc++-v3/doc/html/ext/mt_allocator.html | 560 + libstdc++-v3/doc/html/ext/parallel_mode.html | 593 + .../doc/html/ext/pb_ds/PythonPoweredSmall.gif | Bin 0 -> 361 bytes libstdc++-v3/doc/html/ext/pb_ds/acks.html | 65 + .../doc/html/ext/pb_ds/assoc_container_tag_cd.png | Bin 0 -> 21668 bytes .../doc/html/ext/pb_ds/assoc_container_tag_cd.svg | 491 + .../doc/html/ext/pb_ds/assoc_container_traits.html | 170 + libstdc++-v3/doc/html/ext/pb_ds/assoc_design.html | 46 + .../doc/html/ext/pb_ds/assoc_examples.html | 174 + .../html/ext/pb_ds/assoc_performance_tests.html | 345 + .../doc/html/ext/pb_ds/assoc_regression_tests.html | 96 + libstdc++-v3/doc/html/ext/pb_ds/assoc_tests.html | 24 + .../html/ext/pb_ds/associative_container_tag.html | 47 + libstdc++-v3/doc/html/ext/pb_ds/balls_and_bins.png | Bin 0 -> 10139 bytes .../doc/html/ext/pb_ds/basic_hash_table.html | 436 + .../doc/html/ext/pb_ds/basic_hash_tag.html | 47 + .../ext/pb_ds/basic_invalidation_guarantee.html | 26 + libstdc++-v3/doc/html/ext/pb_ds/basic_tree.html | 660 + ...c_tree_assoc_container_const_node_iterator.html | 383 + .../doc/html/ext/pb_ds/basic_tree_tag.html | 47 + .../doc/html/ext/pb_ds/binary_heap_tag.html | 47 + ...ority_queue_random_int_push_timing_test_gcc.png | Bin 0 -> 5357 bytes ...ity_queue_random_int_push_timing_test_local.png | Bin 0 -> 6710 bytes ...rity_queue_random_int_push_timing_test_msvc.png | Bin 0 -> 5373 bytes .../doc/html/ext/pb_ds/binomial_heap_tag.html | 47 + ...cc_hash_max_collision_check_resize_trigger.html | 532 + .../cc_hash_random_int_find_timing_test_gcc.png | Bin 0 -> 7074 bytes .../cc_hash_random_int_find_timing_test_local.png | Bin 0 -> 8534 bytes .../cc_hash_random_int_find_timing_test_msvc.png | Bin 0 -> 7235 bytes ...h_random_int_subscript_timing_test_find_gcc.png | Bin 0 -> 6811 bytes ...random_int_subscript_timing_test_find_local.png | Bin 0 -> 8445 bytes ..._random_int_subscript_timing_test_find_msvc.png | Bin 0 -> 7230 bytes ...random_int_subscript_timing_test_insert_gcc.png | Bin 0 -> 7636 bytes ...ndom_int_subscript_timing_test_insert_local.png | Bin 0 -> 9396 bytes ...andom_int_subscript_timing_test_insert_msvc.png | Bin 0 -> 6840 bytes libstdc++-v3/doc/html/ext/pb_ds/cc_hash_table.html | 724 + libstdc++-v3/doc/html/ext/pb_ds/cc_hash_tag.html | 47 + ...random_int_subscript_timing_test_insert_gcc.png | Bin 0 -> 7355 bytes ...ndom_int_subscript_timing_test_insert_local.png | Bin 0 -> 9557 bytes ...andom_int_subscript_timing_test_insert_msvc.png | Bin 0 -> 7572 bytes .../doc/html/ext/pb_ds/checked_by_tidy.gif | Bin 0 -> 1367 bytes libstdc++-v3/doc/html/ext/pb_ds/concepts.html | 118 + libstdc++-v3/doc/html/ext/pb_ds/contact.html | 22 + .../doc/html/ext/pb_ds/container_base.html | 1063 + libstdc++-v3/doc/html/ext/pb_ds/container_cd.png | Bin 0 -> 11884 bytes libstdc++-v3/doc/html/ext/pb_ds/container_cd.svg | 418 + libstdc++-v3/doc/html/ext/pb_ds/container_tag.html | 24 + .../doc/html/ext/pb_ds/counter_lu_policy.html | 259 + libstdc++-v3/doc/html/ext/pb_ds/design.html | 96 + .../html/ext/pb_ds/different_underlying_dss.png | Bin 0 -> 31858 bytes .../html/ext/pb_ds/direct_mask_range_hashing.html | 167 + .../html/ext/pb_ds/direct_mod_range_hashing.html | 144 + libstdc++-v3/doc/html/ext/pb_ds/disclaimer.html | 34 + libstdc++-v3/doc/html/ext/pb_ds/ds_gen.html | 344 + .../doc/html/ext/pb_ds/embedded_lists_1.png | Bin 0 -> 16350 bytes .../doc/html/ext/pb_ds/embedded_lists_2.png | Bin 0 -> 18206 bytes .../doc/html/ext/pb_ds/embedded_lists_3.png | Bin 0 -> 5612 bytes libstdc++-v3/doc/html/ext/pb_ds/examples.html | 24 + libstdc++-v3/doc/html/ext/pb_ds/exceptions.html | 46 + .../gp_hash_random_int_find_timing_test_gcc.png | Bin 0 -> 6194 bytes .../gp_hash_random_int_find_timing_test_local.png | Bin 0 -> 7916 bytes .../gp_hash_random_int_find_timing_test_msvc.png | Bin 0 -> 6140 bytes ...h_random_int_subscript_timing_test_find_gcc.png | Bin 0 -> 6110 bytes ...random_int_subscript_timing_test_find_local.png | Bin 0 -> 7570 bytes ..._random_int_subscript_timing_test_find_msvc.png | Bin 0 -> 6314 bytes ...random_int_subscript_timing_test_insert_gcc.png | Bin 0 -> 6763 bytes ...ndom_int_subscript_timing_test_insert_local.png | Bin 0 -> 8499 bytes ...andom_int_subscript_timing_test_insert_msvc.png | Bin 0 -> 6721 bytes libstdc++-v3/doc/html/ext/pb_ds/gp_hash_table.html | 891 + libstdc++-v3/doc/html/ext/pb_ds/gp_hash_tag.html | 47 + .../doc/html/ext/pb_ds/hash_based_containers.html | 835 + .../ext/pb_ds/hash_exponential_size_policy.html | 183 + .../ext/pb_ds/hash_load_check_resize_trigger.html | 583 + libstdc++-v3/doc/html/ext/pb_ds/hash_policy_cd.png | Bin 0 -> 25302 bytes .../doc/html/ext/pb_ds/hash_prime_size_policy.html | 149 + .../hash_random_int_erase_mem_usage_test.html | 173 + .../hash_random_int_erase_mem_usage_test_gcc.png | Bin 0 -> 6356 bytes .../hash_random_int_erase_mem_usage_test_local.png | Bin 0 -> 7405 bytes .../hash_random_int_erase_mem_usage_test_msvc.png | Bin 0 -> 6401 bytes .../hash_random_int_find_find_timing_test.html | 247 + ...hash_random_int_subscript_find_timing_test.html | 220 + ...sh_random_int_subscript_insert_timing_test.html | 365 + .../ext/pb_ds/hash_range_hashing_seq_diagram.png | Bin 0 -> 12962 bytes .../ext/pb_ds/hash_range_hashing_seq_diagram2.png | Bin 0 -> 8918 bytes .../pb_ds/hash_ranged_hash_range_hashing_fns.png | Bin 0 -> 19773 bytes .../ext/pb_ds/hash_standard_resize_policy.html | 795 + .../ext/pb_ds/hash_text_find_find_timing_test.html | 164 + ...hash_zlob_random_int_find_find_timing_test.html | 163 + .../hash_zlob_random_int_find_timing_test_gcc.png | Bin 0 -> 6910 bytes ...hash_zlob_random_int_find_timing_test_local.png | Bin 0 -> 8436 bytes .../hash_zlob_random_int_find_timing_test_msvc.png | Bin 0 -> 7204 bytes libstdc++-v3/doc/html/ext/pb_ds/index.html | 146 + libstdc++-v3/doc/html/ext/pb_ds/insert_error.html | 53 + .../ext/pb_ds/insert_resize_sequence_diagram1.png | Bin 0 -> 25834 bytes .../ext/pb_ds/insert_resize_sequence_diagram2.png | Bin 0 -> 25522 bytes .../ext/pb_ds/insert_resize_sequence_diagram3.png | Bin 0 -> 24542 bytes libstdc++-v3/doc/html/ext/pb_ds/interface.html | 446 + libstdc++-v3/doc/html/ext/pb_ds/introduction.html | 120 + .../html/ext/pb_ds/invalidation_guarantee_cd.png | Bin 0 -> 8331 bytes .../ext/pb_ds/invalidation_guarantee_erase.png | Bin 0 -> 25884 bytes libstdc++-v3/doc/html/ext/pb_ds/join_error.html | 48 + .../doc/html/ext/pb_ds/linear_probe_fn.html | 140 + libstdc++-v3/doc/html/ext/pb_ds/list_update.html | 316 + .../doc/html/ext/pb_ds/list_update_tag.html | 47 + libstdc++-v3/doc/html/ext/pb_ds/lu.png | Bin 0 -> 20987 bytes .../doc/html/ext/pb_ds/lu_based_containers.html | 229 + libstdc++-v3/doc/html/ext/pb_ds/misc.html | 26 + libstdc++-v3/doc/html/ext/pb_ds/motivation.html | 993 + .../html/ext/pb_ds/move_to_front_lu_policy.html | 194 + .../multimap_text_find_timing_test_large.html | 215 + ...ap_text_find_timing_test_large_s2p_hash_gcc.png | Bin 0 -> 6323 bytes ..._text_find_timing_test_large_s2p_hash_local.png | Bin 0 -> 7299 bytes ...p_text_find_timing_test_large_s2p_hash_msvc.png | Bin 0 -> 6490 bytes ...ap_text_find_timing_test_large_s2p_tree_gcc.png | Bin 0 -> 6284 bytes ..._text_find_timing_test_large_s2p_tree_local.png | Bin 0 -> 6706 bytes ...p_text_find_timing_test_large_s2p_tree_msvc.png | Bin 0 -> 6204 bytes .../multimap_text_find_timing_test_small.html | 215 + ...ap_text_find_timing_test_small_s2p_hash_gcc.png | Bin 0 -> 6237 bytes ..._text_find_timing_test_small_s2p_hash_local.png | Bin 0 -> 6732 bytes ...p_text_find_timing_test_small_s2p_hash_msvc.png | Bin 0 -> 6268 bytes ...ap_text_find_timing_test_small_s2p_tree_gcc.png | Bin 0 -> 6064 bytes ..._text_find_timing_test_small_s2p_tree_local.png | Bin 0 -> 6396 bytes ...p_text_find_timing_test_small_s2p_tree_msvc.png | Bin 0 -> 6012 bytes .../multimap_text_insert_mem_usage_test_large.html | 210 + ...xt_insert_mem_usage_test_large_s2p_hash_gcc.png | Bin 0 -> 6835 bytes ..._insert_mem_usage_test_large_s2p_hash_local.png | Bin 0 -> 7275 bytes ...t_insert_mem_usage_test_large_s2p_hash_msvc.png | Bin 0 -> 6588 bytes ...xt_insert_mem_usage_test_large_s2p_tree_gcc.png | Bin 0 -> 6778 bytes ..._insert_mem_usage_test_large_s2p_tree_local.png | Bin 0 -> 7191 bytes ...t_insert_mem_usage_test_large_s2p_tree_msvc.png | Bin 0 -> 6535 bytes .../multimap_text_insert_mem_usage_test_small.html | 212 + ...xt_insert_mem_usage_test_small_s2p_hash_gcc.png | Bin 0 -> 6449 bytes ..._insert_mem_usage_test_small_s2p_hash_local.png | Bin 0 -> 6845 bytes ...t_insert_mem_usage_test_small_s2p_hash_msvc.png | Bin 0 -> 6570 bytes ...xt_insert_mem_usage_test_small_s2p_tree_gcc.png | Bin 0 -> 6419 bytes ..._insert_mem_usage_test_small_s2p_tree_local.png | Bin 0 -> 6925 bytes ...t_insert_mem_usage_test_small_s2p_tree_msvc.png | Bin 0 -> 6569 bytes .../multimap_text_insert_timing_test_large.html | 212 + ..._text_insert_timing_test_large_s2p_hash_gcc.png | Bin 0 -> 6380 bytes ...ext_insert_timing_test_large_s2p_hash_local.png | Bin 0 -> 7000 bytes ...text_insert_timing_test_large_s2p_hash_msvc.png | Bin 0 -> 6460 bytes ..._text_insert_timing_test_large_s2p_tree_gcc.png | Bin 0 -> 6204 bytes ...ext_insert_timing_test_large_s2p_tree_local.png | Bin 0 -> 6764 bytes ...text_insert_timing_test_large_s2p_tree_msvc.png | Bin 0 -> 6357 bytes .../multimap_text_insert_timing_test_small.html | 217 + ..._text_insert_timing_test_small_s2p_hash_gcc.png | Bin 0 -> 6456 bytes ...ext_insert_timing_test_small_s2p_hash_local.png | Bin 0 -> 7035 bytes ...text_insert_timing_test_small_s2p_hash_msvc.png | Bin 0 -> 6547 bytes ..._text_insert_timing_test_small_s2p_tree_gcc.png | Bin 0 -> 6111 bytes ...ext_insert_timing_test_small_s2p_tree_local.png | Bin 0 -> 6853 bytes ...text_insert_timing_test_small_s2p_tree_msvc.png | Bin 0 -> 6430 bytes .../ext/pb_ds/node_invariant_invalidations.png | Bin 0 -> 32276 bytes .../doc/html/ext/pb_ds/node_invariants.png | Bin 0 -> 16553 bytes libstdc++-v3/doc/html/ext/pb_ds/null_hash_fn.html | 32 + .../doc/html/ext/pb_ds/null_lu_metadata.html | 25 + .../doc/html/ext/pb_ds/null_mapped_type.html | 25 + libstdc++-v3/doc/html/ext/pb_ds/null_probe_fn.html | 29 + .../doc/html/ext/pb_ds/null_tree_node_update.html | 101 + .../doc/html/ext/pb_ds/null_trie_node_update.html | 102 + libstdc++-v3/doc/html/ext/pb_ds/ov_tree_tag.html | 47 + .../doc/html/ext/pb_ds/pairing_heap_tag.html | 47 + ...riority_queue_text_push_pop_timing_test_gcc.png | Bin 0 -> 5395 bytes ...ority_queue_text_push_pop_timing_test_local.png | Bin 0 -> 6892 bytes ...iority_queue_text_push_pop_timing_test_msvc.png | Bin 0 -> 5514 bytes ...ng_priority_queue_text_push_timing_test_gcc.png | Bin 0 -> 5678 bytes ..._priority_queue_text_push_timing_test_local.png | Bin 0 -> 6760 bytes ...g_priority_queue_text_push_timing_test_msvc.png | Bin 0 -> 5878 bytes libstdc++-v3/doc/html/ext/pb_ds/pat_trie.png | Bin 0 -> 26182 bytes libstdc++-v3/doc/html/ext/pb_ds/pat_trie_tag.html | 47 + .../ext/pb_ds/point_invalidation_guarantee.html | 51 + .../doc/html/ext/pb_ds/point_iterators_cd.png | Bin 0 -> 20307 bytes .../html/ext/pb_ds/point_iterators_range_ops_1.png | Bin 0 -> 14206 bytes .../html/ext/pb_ds/point_iterators_range_ops_2.png | Bin 0 -> 12876 bytes .../doc/html/ext/pb_ds/pq_container_traits.html | 132 + libstdc++-v3/doc/html/ext/pb_ds/pq_design.html | 381 + .../html/ext/pb_ds/pq_different_underlying_dss.png | Bin 0 -> 15660 bytes libstdc++-v3/doc/html/ext/pb_ds/pq_examples.html | 60 + .../doc/html/ext/pb_ds/pq_performance_tests.html | 332 + .../doc/html/ext/pb_ds/pq_regression_tests.html | 52 + libstdc++-v3/doc/html/ext/pb_ds/pq_tests.html | 24 + libstdc++-v3/doc/html/ext/pb_ds/prerequisites.html | 46 + .../doc/html/ext/pb_ds/priority_queue.html | 995 + ...rity_queue_random_int_push_pop_timing_test.html | 161 + ...y_queue_random_int_push_pop_timing_test_gcc.png | Bin 0 -> 7350 bytes ...queue_random_int_push_pop_timing_test_local.png | Bin 0 -> 9275 bytes ..._queue_random_int_push_pop_timing_test_msvc.png | Bin 0 -> 7065 bytes ...priority_queue_random_int_push_timing_test.html | 200 + ...ority_queue_random_int_push_timing_test_gcc.png | Bin 0 -> 7021 bytes ...ity_queue_random_int_push_timing_test_local.png | Bin 0 -> 8986 bytes ...rity_queue_random_int_push_timing_test_msvc.png | Bin 0 -> 7100 bytes .../doc/html/ext/pb_ds/priority_queue_tag.html | 47 + .../doc/html/ext/pb_ds/priority_queue_tag_cd.png | Bin 0 -> 10845 bytes .../doc/html/ext/pb_ds/priority_queue_tag_cd.svg | 368 + .../priority_queue_text_join_timing_test.html | 141 + .../priority_queue_text_join_timing_test_gcc.png | Bin 0 -> 6458 bytes .../priority_queue_text_join_timing_test_local.png | Bin 0 -> 7989 bytes .../priority_queue_text_join_timing_test_msvc.png | Bin 0 -> 6461 bytes ...riority_queue_text_modify_down_timing_test.html | 204 + ...rity_queue_text_modify_down_timing_test_gcc.png | Bin 0 -> 6788 bytes ...ty_queue_text_modify_down_timing_test_local.png | Bin 0 -> 7633 bytes ...ity_queue_text_modify_down_timing_test_msvc.png | Bin 0 -> 6956 bytes ...xt_modify_down_timing_test_pairing_thin_gcc.png | Bin 0 -> 5007 bytes ..._modify_down_timing_test_pairing_thin_local.png | Bin 0 -> 5878 bytes ...t_modify_down_timing_test_pairing_thin_msvc.png | Bin 0 -> 4996 bytes .../priority_queue_text_modify_up_timing_test.html | 222 + ...iority_queue_text_modify_up_timing_test_gcc.png | Bin 0 -> 6950 bytes ...rity_queue_text_modify_up_timing_test_local.png | Bin 0 -> 7748 bytes ...ority_queue_text_modify_up_timing_test_msvc.png | Bin 0 -> 6983 bytes ...text_modify_up_timing_test_pairing_thin_gcc.png | Bin 0 -> 4867 bytes ...xt_modify_up_timing_test_pairing_thin_local.png | Bin 0 -> 6105 bytes ...ext_modify_up_timing_test_pairing_thin_msvc.png | Bin 0 -> 5216 bytes .../priority_queue_text_pop_mem_usage_test.html | 143 + .../priority_queue_text_pop_mem_usage_test_gcc.png | Bin 0 -> 6582 bytes ...riority_queue_text_pop_mem_usage_test_local.png | Bin 0 -> 7424 bytes ...priority_queue_text_pop_mem_usage_test_msvc.png | Bin 0 -> 6849 bytes .../priority_queue_text_push_pop_timing_test.html | 209 + ...riority_queue_text_push_pop_timing_test_gcc.png | Bin 0 -> 7072 bytes ...ority_queue_text_push_pop_timing_test_local.png | Bin 0 -> 9006 bytes ...iority_queue_text_push_pop_timing_test_msvc.png | Bin 0 -> 7289 bytes .../priority_queue_text_push_timing_test.html | 219 + .../priority_queue_text_push_timing_test_gcc.png | Bin 0 -> 6832 bytes .../priority_queue_text_push_timing_test_local.png | Bin 0 -> 8477 bytes .../priority_queue_text_push_timing_test_msvc.png | Bin 0 -> 7266 bytes .../doc/html/ext/pb_ds/quadratic_probe_fn.html | 141 + .../random_int_find_find_timing_test_tree_gcc.png | Bin 0 -> 5960 bytes ...random_int_find_find_timing_test_tree_local.png | Bin 0 -> 7377 bytes .../random_int_find_find_timing_test_tree_msvc.png | Bin 0 -> 5636 bytes .../ext/pb_ds/range_invalidation_guarantee.html | 52 + .../html/ext/pb_ds/rationale_null_node_updator.png | Bin 0 -> 25097 bytes libstdc++-v3/doc/html/ext/pb_ds/rb_tree_tag.html | 47 + .../doc/html/ext/pb_ds/rc_binomial_heap_tag.html | 47 + libstdc++-v3/doc/html/ext/pb_ds/references.html | 258 + libstdc++-v3/doc/html/ext/pb_ds/resize_error.html | 50 + .../doc/html/ext/pb_ds/resize_policy_cd.png | Bin 0 -> 20806 bytes .../html/ext/pb_ds/restoring_node_invariants.png | Bin 0 -> 14432 bytes .../doc/html/ext/pb_ds/sample_probe_fn.html | 152 + .../doc/html/ext/pb_ds/sample_range_hashing.html | 172 + .../doc/html/ext/pb_ds/sample_ranged_hash_fn.html | 171 + .../doc/html/ext/pb_ds/sample_ranged_probe_fn.html | 178 + .../doc/html/ext/pb_ds/sample_resize_policy.html | 413 + .../doc/html/ext/pb_ds/sample_resize_trigger.html | 462 + .../doc/html/ext/pb_ds/sample_size_policy.html | 163 + .../html/ext/pb_ds/sample_tree_node_update.html | 193 + .../ext/pb_ds/sample_trie_e_access_traits.html | 231 + .../html/ext/pb_ds/sample_trie_node_update.html | 194 + .../doc/html/ext/pb_ds/sample_update_policy.html | 178 + libstdc++-v3/doc/html/ext/pb_ds/simple_list.png | Bin 0 -> 4299 bytes .../doc/html/ext/pb_ds/splay_tree_tag.html | 47 + .../ext/pb_ds/string_trie_e_access_traits.html | 400 + libstdc++-v3/doc/html/ext/pb_ds/tests.html | 24 + .../ext/pb_ds/text_find_timing_test_hash_gcc.png | Bin 0 -> 7013 bytes .../ext/pb_ds/text_find_timing_test_hash_local.png | Bin 0 -> 9361 bytes .../ext/pb_ds/text_find_timing_test_hash_msvc.png | Bin 0 -> 6932 bytes .../pb_ds/text_find_timing_test_tree_like_gcc.png | Bin 0 -> 6207 bytes .../text_find_timing_test_tree_like_local.png | Bin 0 -> 7650 bytes .../pb_ds/text_find_timing_test_tree_like_msvc.png | Bin 0 -> 6059 bytes libstdc++-v3/doc/html/ext/pb_ds/thin_heap_tag.html | 47 + libstdc++-v3/doc/html/ext/pb_ds/tree.html | 516 + .../doc/html/ext/pb_ds/tree_based_containers.html | 358 + .../doc/html/ext/pb_ds/tree_node_iterator.html | 143 + .../html/ext/pb_ds/tree_node_updator_policy_cd.png | Bin 0 -> 9236 bytes .../pb_ds/tree_order_statistics_node_update.html | 678 + .../pb_ds/tree_order_statistics_timing_test.html | 118 + .../tree_order_statistics_timing_test_gcc.png | Bin 0 -> 5698 bytes .../tree_order_statistics_timing_test_local.png | Bin 0 -> 6739 bytes .../tree_order_statistics_timing_test_msvc.png | Bin 0 -> 5684 bytes .../tree_random_int_find_find_timing_test.html | 160 + .../ext/pb_ds/tree_split_join_timing_test.html | 143 + .../ext/pb_ds/tree_split_join_timing_test_gcc.png | Bin 0 -> 5649 bytes .../pb_ds/tree_split_join_timing_test_local.png | Bin 0 -> 6734 bytes .../ext/pb_ds/tree_split_join_timing_test_msvc.png | Bin 0 -> 5675 bytes libstdc++-v3/doc/html/ext/pb_ds/tree_tag.html | 47 + .../ext/pb_ds/tree_text_find_find_timing_test.html | 162 + .../ext/pb_ds/tree_text_insert_timing_test.html | 226 + .../tree_text_insert_timing_test_node_tree_gcc.png | Bin 0 -> 5373 bytes ...ree_text_insert_timing_test_node_tree_local.png | Bin 0 -> 6690 bytes ...tree_text_insert_timing_test_node_tree_msvc.png | Bin 0 -> 5212 bytes .../tree_text_insert_timing_test_pat_trie_gcc.png | Bin 0 -> 4895 bytes ...tree_text_insert_timing_test_pat_trie_local.png | Bin 0 -> 6011 bytes .../tree_text_insert_timing_test_pat_trie_msvc.png | Bin 0 -> 4881 bytes ...ree_text_insert_timing_test_vector_tree_gcc.png | Bin 0 -> 5140 bytes ...e_text_insert_timing_test_vector_tree_local.png | Bin 0 -> 6270 bytes ...ee_text_insert_timing_test_vector_tree_msvc.png | Bin 0 -> 5131 bytes .../pb_ds/tree_text_lor_find_find_timing_test.html | 126 + .../pb_ds/tree_text_lor_find_timing_test_gcc.png | Bin 0 -> 6162 bytes .../pb_ds/tree_text_lor_find_timing_test_local.png | Bin 0 -> 7796 bytes .../pb_ds/tree_text_lor_find_timing_test_msvc.png | Bin 0 -> 5831 bytes libstdc++-v3/doc/html/ext/pb_ds/trie.html | 489 + .../doc/html/ext/pb_ds/trie_based_containers.html | 241 + .../html/ext/pb_ds/trie_const_node_iterator.html | 478 + .../doc/html/ext/pb_ds/trie_node_iterator.html | 235 + .../html/ext/pb_ds/trie_node_updator_policy_cd.png | Bin 0 -> 12126 bytes .../pb_ds/trie_order_statistics_node_update.html | 770 + .../ext/pb_ds/trie_prefix_search_node_update.html | 628 + libstdc++-v3/doc/html/ext/pb_ds/trie_tag.html | 47 + .../doc/html/ext/pb_ds/trivial_iterator_tag.html | 25 + libstdc++-v3/doc/html/ext/pb_ds/tutorial.html | 670 + .../doc/html/ext/pb_ds/update_policy_cd.png | Bin 0 -> 8570 bytes .../doc/html/ext/pb_ds/update_seq_diagram.png | Bin 0 -> 10789 bytes libstdc++-v3/doc/html/ext/sgiexts.html | 253 + libstdc++-v3/doc/html/faq/index.html | 1215 + libstdc++-v3/doc/html/install.html | 240 + libstdc++-v3/doc/html/lib3styles.css | 6 + libstdc++-v3/doc/html/test.html | 722 + libstdc++-v3/docs/doxygen/Intro.3 | 132 - libstdc++-v3/docs/doxygen/TODO | 70 - libstdc++-v3/docs/doxygen/doxygroups.cc | 238 - libstdc++-v3/docs/doxygen/guide.html | 112 - libstdc++-v3/docs/doxygen/mainpage.html | 101 - libstdc++-v3/docs/doxygen/run_doxygen | 328 - libstdc++-v3/docs/doxygen/stdheader.cc | 170 - libstdc++-v3/docs/doxygen/style.css | 74 - libstdc++-v3/docs/doxygen/tables.html | 645 - libstdc++-v3/docs/doxygen/user.cfg.in | 1436 - libstdc++-v3/docs/html/17_intro/BADNAMES | 182 - libstdc++-v3/docs/html/17_intro/C++STYLE | 399 - libstdc++-v3/docs/html/17_intro/COPYING | 340 - libstdc++-v3/docs/html/17_intro/COPYING.DOC | 355 - libstdc++-v3/docs/html/17_intro/DESIGN | 859 - libstdc++-v3/docs/html/17_intro/TODO | 164 - libstdc++-v3/docs/html/17_intro/abi.html | 991 - libstdc++-v3/docs/html/17_intro/api.html | 290 - .../html/17_intro/backwards_compatibility.html | 1073 - libstdc++-v3/docs/html/17_intro/c++0x_status.html | 2290 - .../docs/html/17_intro/c++1998_status.html | 6004 -- libstdc++-v3/docs/html/17_intro/confdeps.dot | 14 - libstdc++-v3/docs/html/17_intro/confdeps.png | Bin 3486 -> 0 bytes libstdc++-v3/docs/html/17_intro/configury.html | 305 - libstdc++-v3/docs/html/17_intro/contribute.html | 135 - libstdc++-v3/docs/html/17_intro/howto.html | 737 - libstdc++-v3/docs/html/17_intro/license.html | 119 - libstdc++-v3/docs/html/17_intro/porting.html | 992 - libstdc++-v3/docs/html/17_intro/porting.texi | 570 - libstdc++-v3/docs/html/17_intro/tr1_status.html | 2322 - libstdc++-v3/docs/html/18_support/howto.html | 435 - libstdc++-v3/docs/html/19_diagnostics/howto.html | 127 - libstdc++-v3/docs/html/20_util/allocator.html | 554 - libstdc++-v3/docs/html/20_util/howto.html | 234 - libstdc++-v3/docs/html/20_util/shared_ptr.html | 419 - libstdc++-v3/docs/html/21_strings/gotw29a.txt | 159 - libstdc++-v3/docs/html/21_strings/howto.html | 472 - libstdc++-v3/docs/html/21_strings/stringtok_h.txt | 102 - .../docs/html/21_strings/stringtok_std_h.txt | 39 - libstdc++-v3/docs/html/22_locale/codecvt.html | 595 - libstdc++-v3/docs/html/22_locale/ctype.html | 166 - libstdc++-v3/docs/html/22_locale/howto.html | 240 - libstdc++-v3/docs/html/22_locale/locale.html | 543 - libstdc++-v3/docs/html/22_locale/messages.html | 461 - libstdc++-v3/docs/html/23_containers/howto.html | 457 - .../docs/html/23_containers/wrappers_h.txt | 48 - libstdc++-v3/docs/html/24_iterators/howto.html | 200 - libstdc++-v3/docs/html/25_algorithms/howto.html | 116 - libstdc++-v3/docs/html/26_numerics/howto.html | 179 - .../docs/html/27_io/binary_iostreams_kanze.txt | 51 - .../docs/html/27_io/binary_iostreams_kuehl.txt | 89 - libstdc++-v3/docs/html/27_io/howto.html | 779 - libstdc++-v3/docs/html/configopts.html | 342 - libstdc++-v3/docs/html/debug.html | 474 - libstdc++-v3/docs/html/documentation.html | 361 - libstdc++-v3/docs/html/ext/ballocator_doc.html | 426 - libstdc++-v3/docs/html/ext/concurrence.html | 342 - libstdc++-v3/docs/html/ext/debug_mode.html | 578 - libstdc++-v3/docs/html/ext/howto.html | 675 - libstdc++-v3/docs/html/ext/lwg-active.html | 14696 ---- libstdc++-v3/docs/html/ext/lwg-closed.html | 10627 --- libstdc++-v3/docs/html/ext/lwg-defects.html | 24284 ------- libstdc++-v3/docs/html/ext/mt_allocator.html | 560 - libstdc++-v3/docs/html/ext/parallel_mode.html | 593 - .../docs/html/ext/pb_ds/PythonPoweredSmall.gif | Bin 361 -> 0 bytes libstdc++-v3/docs/html/ext/pb_ds/acks.html | 65 - .../docs/html/ext/pb_ds/assoc_container_tag_cd.png | Bin 21668 -> 0 bytes .../docs/html/ext/pb_ds/assoc_container_tag_cd.svg | 491 - .../html/ext/pb_ds/assoc_container_traits.html | 170 - libstdc++-v3/docs/html/ext/pb_ds/assoc_design.html | 46 - .../docs/html/ext/pb_ds/assoc_examples.html | 174 - .../html/ext/pb_ds/assoc_performance_tests.html | 345 - .../html/ext/pb_ds/assoc_regression_tests.html | 96 - libstdc++-v3/docs/html/ext/pb_ds/assoc_tests.html | 24 - .../html/ext/pb_ds/associative_container_tag.html | 47 - .../docs/html/ext/pb_ds/balls_and_bins.png | Bin 10139 -> 0 bytes .../docs/html/ext/pb_ds/basic_hash_table.html | 436 - .../docs/html/ext/pb_ds/basic_hash_tag.html | 47 - .../ext/pb_ds/basic_invalidation_guarantee.html | 26 - libstdc++-v3/docs/html/ext/pb_ds/basic_tree.html | 660 - ...c_tree_assoc_container_const_node_iterator.html | 383 - .../docs/html/ext/pb_ds/basic_tree_tag.html | 47 - .../docs/html/ext/pb_ds/binary_heap_tag.html | 47 - ...ority_queue_random_int_push_timing_test_gcc.png | Bin 5357 -> 0 bytes ...ity_queue_random_int_push_timing_test_local.png | Bin 6710 -> 0 bytes ...rity_queue_random_int_push_timing_test_msvc.png | Bin 5373 -> 0 bytes .../docs/html/ext/pb_ds/binomial_heap_tag.html | 47 - ...cc_hash_max_collision_check_resize_trigger.html | 532 - .../cc_hash_random_int_find_timing_test_gcc.png | Bin 7074 -> 0 bytes .../cc_hash_random_int_find_timing_test_local.png | Bin 8534 -> 0 bytes .../cc_hash_random_int_find_timing_test_msvc.png | Bin 7235 -> 0 bytes ...h_random_int_subscript_timing_test_find_gcc.png | Bin 6811 -> 0 bytes ...random_int_subscript_timing_test_find_local.png | Bin 8445 -> 0 bytes ..._random_int_subscript_timing_test_find_msvc.png | Bin 7230 -> 0 bytes ...random_int_subscript_timing_test_insert_gcc.png | Bin 7636 -> 0 bytes ...ndom_int_subscript_timing_test_insert_local.png | Bin 9396 -> 0 bytes ...andom_int_subscript_timing_test_insert_msvc.png | Bin 6840 -> 0 bytes .../docs/html/ext/pb_ds/cc_hash_table.html | 724 - libstdc++-v3/docs/html/ext/pb_ds/cc_hash_tag.html | 47 - ...random_int_subscript_timing_test_insert_gcc.png | Bin 7355 -> 0 bytes ...ndom_int_subscript_timing_test_insert_local.png | Bin 9557 -> 0 bytes ...andom_int_subscript_timing_test_insert_msvc.png | Bin 7572 -> 0 bytes .../docs/html/ext/pb_ds/checked_by_tidy.gif | Bin 1367 -> 0 bytes libstdc++-v3/docs/html/ext/pb_ds/concepts.html | 118 - libstdc++-v3/docs/html/ext/pb_ds/contact.html | 22 - .../docs/html/ext/pb_ds/container_base.html | 1063 - libstdc++-v3/docs/html/ext/pb_ds/container_cd.png | Bin 11884 -> 0 bytes libstdc++-v3/docs/html/ext/pb_ds/container_cd.svg | 418 - .../docs/html/ext/pb_ds/container_tag.html | 24 - .../docs/html/ext/pb_ds/counter_lu_policy.html | 259 - libstdc++-v3/docs/html/ext/pb_ds/design.html | 96 - .../html/ext/pb_ds/different_underlying_dss.png | Bin 31858 -> 0 bytes .../html/ext/pb_ds/direct_mask_range_hashing.html | 167 - .../html/ext/pb_ds/direct_mod_range_hashing.html | 144 - libstdc++-v3/docs/html/ext/pb_ds/disclaimer.html | 34 - libstdc++-v3/docs/html/ext/pb_ds/ds_gen.html | 344 - .../docs/html/ext/pb_ds/embedded_lists_1.png | Bin 16350 -> 0 bytes .../docs/html/ext/pb_ds/embedded_lists_2.png | Bin 18206 -> 0 bytes .../docs/html/ext/pb_ds/embedded_lists_3.png | Bin 5612 -> 0 bytes libstdc++-v3/docs/html/ext/pb_ds/examples.html | 24 - libstdc++-v3/docs/html/ext/pb_ds/exceptions.html | 46 - .../gp_hash_random_int_find_timing_test_gcc.png | Bin 6194 -> 0 bytes .../gp_hash_random_int_find_timing_test_local.png | Bin 7916 -> 0 bytes .../gp_hash_random_int_find_timing_test_msvc.png | Bin 6140 -> 0 bytes ...h_random_int_subscript_timing_test_find_gcc.png | Bin 6110 -> 0 bytes ...random_int_subscript_timing_test_find_local.png | Bin 7570 -> 0 bytes ..._random_int_subscript_timing_test_find_msvc.png | Bin 6314 -> 0 bytes ...random_int_subscript_timing_test_insert_gcc.png | Bin 6763 -> 0 bytes ...ndom_int_subscript_timing_test_insert_local.png | Bin 8499 -> 0 bytes ...andom_int_subscript_timing_test_insert_msvc.png | Bin 6721 -> 0 bytes .../docs/html/ext/pb_ds/gp_hash_table.html | 891 - libstdc++-v3/docs/html/ext/pb_ds/gp_hash_tag.html | 47 - .../docs/html/ext/pb_ds/hash_based_containers.html | 835 - .../ext/pb_ds/hash_exponential_size_policy.html | 183 - .../ext/pb_ds/hash_load_check_resize_trigger.html | 583 - .../docs/html/ext/pb_ds/hash_policy_cd.png | Bin 25302 -> 0 bytes .../html/ext/pb_ds/hash_prime_size_policy.html | 149 - .../hash_random_int_erase_mem_usage_test.html | 173 - .../hash_random_int_erase_mem_usage_test_gcc.png | Bin 6356 -> 0 bytes .../hash_random_int_erase_mem_usage_test_local.png | Bin 7405 -> 0 bytes .../hash_random_int_erase_mem_usage_test_msvc.png | Bin 6401 -> 0 bytes .../hash_random_int_find_find_timing_test.html | 247 - ...hash_random_int_subscript_find_timing_test.html | 220 - ...sh_random_int_subscript_insert_timing_test.html | 365 - .../ext/pb_ds/hash_range_hashing_seq_diagram.png | Bin 12962 -> 0 bytes .../ext/pb_ds/hash_range_hashing_seq_diagram2.png | Bin 8918 -> 0 bytes .../pb_ds/hash_ranged_hash_range_hashing_fns.png | Bin 19773 -> 0 bytes .../ext/pb_ds/hash_standard_resize_policy.html | 795 - .../ext/pb_ds/hash_text_find_find_timing_test.html | 164 - ...hash_zlob_random_int_find_find_timing_test.html | 163 - .../hash_zlob_random_int_find_timing_test_gcc.png | Bin 6910 -> 0 bytes ...hash_zlob_random_int_find_timing_test_local.png | Bin 8436 -> 0 bytes .../hash_zlob_random_int_find_timing_test_msvc.png | Bin 7204 -> 0 bytes libstdc++-v3/docs/html/ext/pb_ds/index.html | 146 - libstdc++-v3/docs/html/ext/pb_ds/insert_error.html | 53 - .../ext/pb_ds/insert_resize_sequence_diagram1.png | Bin 25834 -> 0 bytes .../ext/pb_ds/insert_resize_sequence_diagram2.png | Bin 25522 -> 0 bytes .../ext/pb_ds/insert_resize_sequence_diagram3.png | Bin 24542 -> 0 bytes libstdc++-v3/docs/html/ext/pb_ds/interface.html | 446 - libstdc++-v3/docs/html/ext/pb_ds/introduction.html | 120 - .../html/ext/pb_ds/invalidation_guarantee_cd.png | Bin 8331 -> 0 bytes .../ext/pb_ds/invalidation_guarantee_erase.png | Bin 25884 -> 0 bytes libstdc++-v3/docs/html/ext/pb_ds/join_error.html | 48 - .../docs/html/ext/pb_ds/linear_probe_fn.html | 140 - libstdc++-v3/docs/html/ext/pb_ds/list_update.html | 316 - .../docs/html/ext/pb_ds/list_update_tag.html | 47 - libstdc++-v3/docs/html/ext/pb_ds/lu.png | Bin 20987 -> 0 bytes .../docs/html/ext/pb_ds/lu_based_containers.html | 229 - libstdc++-v3/docs/html/ext/pb_ds/misc.html | 26 - libstdc++-v3/docs/html/ext/pb_ds/motivation.html | 993 - .../html/ext/pb_ds/move_to_front_lu_policy.html | 194 - .../multimap_text_find_timing_test_large.html | 215 - ...ap_text_find_timing_test_large_s2p_hash_gcc.png | Bin 6323 -> 0 bytes ..._text_find_timing_test_large_s2p_hash_local.png | Bin 7299 -> 0 bytes ...p_text_find_timing_test_large_s2p_hash_msvc.png | Bin 6490 -> 0 bytes ...ap_text_find_timing_test_large_s2p_tree_gcc.png | Bin 6284 -> 0 bytes ..._text_find_timing_test_large_s2p_tree_local.png | Bin 6706 -> 0 bytes ...p_text_find_timing_test_large_s2p_tree_msvc.png | Bin 6204 -> 0 bytes .../multimap_text_find_timing_test_small.html | 215 - ...ap_text_find_timing_test_small_s2p_hash_gcc.png | Bin 6237 -> 0 bytes ..._text_find_timing_test_small_s2p_hash_local.png | Bin 6732 -> 0 bytes ...p_text_find_timing_test_small_s2p_hash_msvc.png | Bin 6268 -> 0 bytes ...ap_text_find_timing_test_small_s2p_tree_gcc.png | Bin 6064 -> 0 bytes ..._text_find_timing_test_small_s2p_tree_local.png | Bin 6396 -> 0 bytes ...p_text_find_timing_test_small_s2p_tree_msvc.png | Bin 6012 -> 0 bytes .../multimap_text_insert_mem_usage_test_large.html | 210 - ...xt_insert_mem_usage_test_large_s2p_hash_gcc.png | Bin 6835 -> 0 bytes ..._insert_mem_usage_test_large_s2p_hash_local.png | Bin 7275 -> 0 bytes ...t_insert_mem_usage_test_large_s2p_hash_msvc.png | Bin 6588 -> 0 bytes ...xt_insert_mem_usage_test_large_s2p_tree_gcc.png | Bin 6778 -> 0 bytes ..._insert_mem_usage_test_large_s2p_tree_local.png | Bin 7191 -> 0 bytes ...t_insert_mem_usage_test_large_s2p_tree_msvc.png | Bin 6535 -> 0 bytes .../multimap_text_insert_mem_usage_test_small.html | 212 - ...xt_insert_mem_usage_test_small_s2p_hash_gcc.png | Bin 6449 -> 0 bytes ..._insert_mem_usage_test_small_s2p_hash_local.png | Bin 6845 -> 0 bytes ...t_insert_mem_usage_test_small_s2p_hash_msvc.png | Bin 6570 -> 0 bytes ...xt_insert_mem_usage_test_small_s2p_tree_gcc.png | Bin 6419 -> 0 bytes ..._insert_mem_usage_test_small_s2p_tree_local.png | Bin 6925 -> 0 bytes ...t_insert_mem_usage_test_small_s2p_tree_msvc.png | Bin 6569 -> 0 bytes .../multimap_text_insert_timing_test_large.html | 212 - ..._text_insert_timing_test_large_s2p_hash_gcc.png | Bin 6380 -> 0 bytes ...ext_insert_timing_test_large_s2p_hash_local.png | Bin 7000 -> 0 bytes ...text_insert_timing_test_large_s2p_hash_msvc.png | Bin 6460 -> 0 bytes ..._text_insert_timing_test_large_s2p_tree_gcc.png | Bin 6204 -> 0 bytes ...ext_insert_timing_test_large_s2p_tree_local.png | Bin 6764 -> 0 bytes ...text_insert_timing_test_large_s2p_tree_msvc.png | Bin 6357 -> 0 bytes .../multimap_text_insert_timing_test_small.html | 217 - ..._text_insert_timing_test_small_s2p_hash_gcc.png | Bin 6456 -> 0 bytes ...ext_insert_timing_test_small_s2p_hash_local.png | Bin 7035 -> 0 bytes ...text_insert_timing_test_small_s2p_hash_msvc.png | Bin 6547 -> 0 bytes ..._text_insert_timing_test_small_s2p_tree_gcc.png | Bin 6111 -> 0 bytes ...ext_insert_timing_test_small_s2p_tree_local.png | Bin 6853 -> 0 bytes ...text_insert_timing_test_small_s2p_tree_msvc.png | Bin 6430 -> 0 bytes .../ext/pb_ds/node_invariant_invalidations.png | Bin 32276 -> 0 bytes .../docs/html/ext/pb_ds/node_invariants.png | Bin 16553 -> 0 bytes libstdc++-v3/docs/html/ext/pb_ds/null_hash_fn.html | 32 - .../docs/html/ext/pb_ds/null_lu_metadata.html | 25 - .../docs/html/ext/pb_ds/null_mapped_type.html | 25 - .../docs/html/ext/pb_ds/null_probe_fn.html | 29 - .../docs/html/ext/pb_ds/null_tree_node_update.html | 101 - .../docs/html/ext/pb_ds/null_trie_node_update.html | 102 - libstdc++-v3/docs/html/ext/pb_ds/ov_tree_tag.html | 47 - .../docs/html/ext/pb_ds/pairing_heap_tag.html | 47 - ...riority_queue_text_push_pop_timing_test_gcc.png | Bin 5395 -> 0 bytes ...ority_queue_text_push_pop_timing_test_local.png | Bin 6892 -> 0 bytes ...iority_queue_text_push_pop_timing_test_msvc.png | Bin 5514 -> 0 bytes ...ng_priority_queue_text_push_timing_test_gcc.png | Bin 5678 -> 0 bytes ..._priority_queue_text_push_timing_test_local.png | Bin 6760 -> 0 bytes ...g_priority_queue_text_push_timing_test_msvc.png | Bin 5878 -> 0 bytes libstdc++-v3/docs/html/ext/pb_ds/pat_trie.png | Bin 26182 -> 0 bytes libstdc++-v3/docs/html/ext/pb_ds/pat_trie_tag.html | 47 - .../ext/pb_ds/point_invalidation_guarantee.html | 51 - .../docs/html/ext/pb_ds/point_iterators_cd.png | Bin 20307 -> 0 bytes .../html/ext/pb_ds/point_iterators_range_ops_1.png | Bin 14206 -> 0 bytes .../html/ext/pb_ds/point_iterators_range_ops_2.png | Bin 12876 -> 0 bytes .../docs/html/ext/pb_ds/pq_container_traits.html | 132 - libstdc++-v3/docs/html/ext/pb_ds/pq_design.html | 381 - .../html/ext/pb_ds/pq_different_underlying_dss.png | Bin 15660 -> 0 bytes libstdc++-v3/docs/html/ext/pb_ds/pq_examples.html | 60 - .../docs/html/ext/pb_ds/pq_performance_tests.html | 332 - .../docs/html/ext/pb_ds/pq_regression_tests.html | 52 - libstdc++-v3/docs/html/ext/pb_ds/pq_tests.html | 24 - .../docs/html/ext/pb_ds/prerequisites.html | 46 - .../docs/html/ext/pb_ds/priority_queue.html | 995 - ...rity_queue_random_int_push_pop_timing_test.html | 161 - ...y_queue_random_int_push_pop_timing_test_gcc.png | Bin 7350 -> 0 bytes ...queue_random_int_push_pop_timing_test_local.png | Bin 9275 -> 0 bytes ..._queue_random_int_push_pop_timing_test_msvc.png | Bin 7065 -> 0 bytes ...priority_queue_random_int_push_timing_test.html | 200 - ...ority_queue_random_int_push_timing_test_gcc.png | Bin 7021 -> 0 bytes ...ity_queue_random_int_push_timing_test_local.png | Bin 8986 -> 0 bytes ...rity_queue_random_int_push_timing_test_msvc.png | Bin 7100 -> 0 bytes .../docs/html/ext/pb_ds/priority_queue_tag.html | 47 - .../docs/html/ext/pb_ds/priority_queue_tag_cd.png | Bin 10845 -> 0 bytes .../docs/html/ext/pb_ds/priority_queue_tag_cd.svg | 368 - .../priority_queue_text_join_timing_test.html | 141 - .../priority_queue_text_join_timing_test_gcc.png | Bin 6458 -> 0 bytes .../priority_queue_text_join_timing_test_local.png | Bin 7989 -> 0 bytes .../priority_queue_text_join_timing_test_msvc.png | Bin 6461 -> 0 bytes ...riority_queue_text_modify_down_timing_test.html | 204 - ...rity_queue_text_modify_down_timing_test_gcc.png | Bin 6788 -> 0 bytes ...ty_queue_text_modify_down_timing_test_local.png | Bin 7633 -> 0 bytes ...ity_queue_text_modify_down_timing_test_msvc.png | Bin 6956 -> 0 bytes ...xt_modify_down_timing_test_pairing_thin_gcc.png | Bin 5007 -> 0 bytes ..._modify_down_timing_test_pairing_thin_local.png | Bin 5878 -> 0 bytes ...t_modify_down_timing_test_pairing_thin_msvc.png | Bin 4996 -> 0 bytes .../priority_queue_text_modify_up_timing_test.html | 222 - ...iority_queue_text_modify_up_timing_test_gcc.png | Bin 6950 -> 0 bytes ...rity_queue_text_modify_up_timing_test_local.png | Bin 7748 -> 0 bytes ...ority_queue_text_modify_up_timing_test_msvc.png | Bin 6983 -> 0 bytes ...text_modify_up_timing_test_pairing_thin_gcc.png | Bin 4867 -> 0 bytes ...xt_modify_up_timing_test_pairing_thin_local.png | Bin 6105 -> 0 bytes ...ext_modify_up_timing_test_pairing_thin_msvc.png | Bin 5216 -> 0 bytes .../priority_queue_text_pop_mem_usage_test.html | 143 - .../priority_queue_text_pop_mem_usage_test_gcc.png | Bin 6582 -> 0 bytes ...riority_queue_text_pop_mem_usage_test_local.png | Bin 7424 -> 0 bytes ...priority_queue_text_pop_mem_usage_test_msvc.png | Bin 6849 -> 0 bytes .../priority_queue_text_push_pop_timing_test.html | 209 - ...riority_queue_text_push_pop_timing_test_gcc.png | Bin 7072 -> 0 bytes ...ority_queue_text_push_pop_timing_test_local.png | Bin 9006 -> 0 bytes ...iority_queue_text_push_pop_timing_test_msvc.png | Bin 7289 -> 0 bytes .../priority_queue_text_push_timing_test.html | 219 - .../priority_queue_text_push_timing_test_gcc.png | Bin 6832 -> 0 bytes .../priority_queue_text_push_timing_test_local.png | Bin 8477 -> 0 bytes .../priority_queue_text_push_timing_test_msvc.png | Bin 7266 -> 0 bytes .../docs/html/ext/pb_ds/quadratic_probe_fn.html | 141 - .../random_int_find_find_timing_test_tree_gcc.png | Bin 5960 -> 0 bytes ...random_int_find_find_timing_test_tree_local.png | Bin 7377 -> 0 bytes .../random_int_find_find_timing_test_tree_msvc.png | Bin 5636 -> 0 bytes .../ext/pb_ds/range_invalidation_guarantee.html | 52 - .../html/ext/pb_ds/rationale_null_node_updator.png | Bin 25097 -> 0 bytes libstdc++-v3/docs/html/ext/pb_ds/rb_tree_tag.html | 47 - .../docs/html/ext/pb_ds/rc_binomial_heap_tag.html | 47 - libstdc++-v3/docs/html/ext/pb_ds/references.html | 258 - libstdc++-v3/docs/html/ext/pb_ds/resize_error.html | 50 - .../docs/html/ext/pb_ds/resize_policy_cd.png | Bin 20806 -> 0 bytes .../html/ext/pb_ds/restoring_node_invariants.png | Bin 14432 -> 0 bytes .../docs/html/ext/pb_ds/sample_probe_fn.html | 152 - .../docs/html/ext/pb_ds/sample_range_hashing.html | 172 - .../docs/html/ext/pb_ds/sample_ranged_hash_fn.html | 171 - .../html/ext/pb_ds/sample_ranged_probe_fn.html | 178 - .../docs/html/ext/pb_ds/sample_resize_policy.html | 413 - .../docs/html/ext/pb_ds/sample_resize_trigger.html | 462 - .../docs/html/ext/pb_ds/sample_size_policy.html | 163 - .../html/ext/pb_ds/sample_tree_node_update.html | 193 - .../ext/pb_ds/sample_trie_e_access_traits.html | 231 - .../html/ext/pb_ds/sample_trie_node_update.html | 194 - .../docs/html/ext/pb_ds/sample_update_policy.html | 178 - libstdc++-v3/docs/html/ext/pb_ds/simple_list.png | Bin 4299 -> 0 bytes .../docs/html/ext/pb_ds/splay_tree_tag.html | 47 - .../ext/pb_ds/string_trie_e_access_traits.html | 400 - libstdc++-v3/docs/html/ext/pb_ds/tests.html | 24 - .../ext/pb_ds/text_find_timing_test_hash_gcc.png | Bin 7013 -> 0 bytes .../ext/pb_ds/text_find_timing_test_hash_local.png | Bin 9361 -> 0 bytes .../ext/pb_ds/text_find_timing_test_hash_msvc.png | Bin 6932 -> 0 bytes .../pb_ds/text_find_timing_test_tree_like_gcc.png | Bin 6207 -> 0 bytes .../text_find_timing_test_tree_like_local.png | Bin 7650 -> 0 bytes .../pb_ds/text_find_timing_test_tree_like_msvc.png | Bin 6059 -> 0 bytes .../docs/html/ext/pb_ds/thin_heap_tag.html | 47 - libstdc++-v3/docs/html/ext/pb_ds/tree.html | 516 - .../docs/html/ext/pb_ds/tree_based_containers.html | 358 - .../docs/html/ext/pb_ds/tree_node_iterator.html | 143 - .../html/ext/pb_ds/tree_node_updator_policy_cd.png | Bin 9236 -> 0 bytes .../pb_ds/tree_order_statistics_node_update.html | 678 - .../pb_ds/tree_order_statistics_timing_test.html | 118 - .../tree_order_statistics_timing_test_gcc.png | Bin 5698 -> 0 bytes .../tree_order_statistics_timing_test_local.png | Bin 6739 -> 0 bytes .../tree_order_statistics_timing_test_msvc.png | Bin 5684 -> 0 bytes .../tree_random_int_find_find_timing_test.html | 160 - .../ext/pb_ds/tree_split_join_timing_test.html | 143 - .../ext/pb_ds/tree_split_join_timing_test_gcc.png | Bin 5649 -> 0 bytes .../pb_ds/tree_split_join_timing_test_local.png | Bin 6734 -> 0 bytes .../ext/pb_ds/tree_split_join_timing_test_msvc.png | Bin 5675 -> 0 bytes libstdc++-v3/docs/html/ext/pb_ds/tree_tag.html | 47 - .../ext/pb_ds/tree_text_find_find_timing_test.html | 162 - .../ext/pb_ds/tree_text_insert_timing_test.html | 226 - .../tree_text_insert_timing_test_node_tree_gcc.png | Bin 5373 -> 0 bytes ...ree_text_insert_timing_test_node_tree_local.png | Bin 6690 -> 0 bytes ...tree_text_insert_timing_test_node_tree_msvc.png | Bin 5212 -> 0 bytes .../tree_text_insert_timing_test_pat_trie_gcc.png | Bin 4895 -> 0 bytes ...tree_text_insert_timing_test_pat_trie_local.png | Bin 6011 -> 0 bytes .../tree_text_insert_timing_test_pat_trie_msvc.png | Bin 4881 -> 0 bytes ...ree_text_insert_timing_test_vector_tree_gcc.png | Bin 5140 -> 0 bytes ...e_text_insert_timing_test_vector_tree_local.png | Bin 6270 -> 0 bytes ...ee_text_insert_timing_test_vector_tree_msvc.png | Bin 5131 -> 0 bytes .../pb_ds/tree_text_lor_find_find_timing_test.html | 126 - .../pb_ds/tree_text_lor_find_timing_test_gcc.png | Bin 6162 -> 0 bytes .../pb_ds/tree_text_lor_find_timing_test_local.png | Bin 7796 -> 0 bytes .../pb_ds/tree_text_lor_find_timing_test_msvc.png | Bin 5831 -> 0 bytes libstdc++-v3/docs/html/ext/pb_ds/trie.html | 489 - .../docs/html/ext/pb_ds/trie_based_containers.html | 241 - .../html/ext/pb_ds/trie_const_node_iterator.html | 478 - .../docs/html/ext/pb_ds/trie_node_iterator.html | 235 - .../html/ext/pb_ds/trie_node_updator_policy_cd.png | Bin 12126 -> 0 bytes .../pb_ds/trie_order_statistics_node_update.html | 770 - .../ext/pb_ds/trie_prefix_search_node_update.html | 628 - libstdc++-v3/docs/html/ext/pb_ds/trie_tag.html | 47 - .../docs/html/ext/pb_ds/trivial_iterator_tag.html | 25 - libstdc++-v3/docs/html/ext/pb_ds/tutorial.html | 670 - .../docs/html/ext/pb_ds/update_policy_cd.png | Bin 8570 -> 0 bytes .../docs/html/ext/pb_ds/update_seq_diagram.png | Bin 10789 -> 0 bytes libstdc++-v3/docs/html/ext/sgiexts.html | 253 - libstdc++-v3/docs/html/faq/index.html | 1215 - libstdc++-v3/docs/html/install.html | 240 - libstdc++-v3/docs/html/lib3styles.css | 6 - libstdc++-v3/docs/html/test.html | 722 - libstdc++-v3/include/Makefile.in | 116 +- libstdc++-v3/include/backward/auto_ptr.h | 6 +- libstdc++-v3/include/bits/basic_ios.h | 4 +- libstdc++-v3/include/bits/basic_string.h | 4 +- libstdc++-v3/include/bits/ios_base.h | 6 +- libstdc++-v3/include/bits/locale_classes.h | 2 - libstdc++-v3/include/bits/postypes.h | 4 +- libstdc++-v3/include/bits/stl_algo.h | 245 +- libstdc++-v3/include/bits/stl_construct.h | 10 +- libstdc++-v3/include/bits/stl_deque.h | 39 +- libstdc++-v3/include/bits/stl_iterator.h | 4 +- .../include/bits/stl_iterator_base_types.h | 4 +- libstdc++-v3/include/bits/stl_list.h | 28 +- libstdc++-v3/include/bits/stl_map.h | 8 +- libstdc++-v3/include/bits/stl_multimap.h | 8 +- libstdc++-v3/include/bits/stl_multiset.h | 8 +- libstdc++-v3/include/bits/stl_relops.h | 4 +- libstdc++-v3/include/bits/stl_set.h | 6 +- libstdc++-v3/include/bits/stl_tempbuf.h | 4 +- libstdc++-v3/include/bits/stl_vector.h | 12 +- libstdc++-v3/include/ext/pool_allocator.h | 5 +- libstdc++-v3/include/ext/rc_string_base.h | 4 +- libstdc++-v3/include/std/bitset | 12 +- libstdc++-v3/include/std/fstream | 32 +- libstdc++-v3/include/std/istream | 2 - libstdc++-v3/include/std/limits | 6 +- libstdc++-v3/include/std/sstream | 22 +- libstdc++-v3/include/std/streambuf | 21 +- libstdc++-v3/include/std/tuple | 12 +- libstdc++-v3/include/tr1/tuple | 12 +- libstdc++-v3/include/tr1_impl/functional | 351 +- libstdc++-v3/include/tr1_impl/random | 6 +- libstdc++-v3/libmath/Makefile.in | 130 +- libstdc++-v3/libsupc++/Makefile.in | 134 +- libstdc++-v3/linkage.m4 | 3 - libstdc++-v3/po/Makefile.in | 115 +- libstdc++-v3/scripts/make_graphs.py | 4 +- libstdc++-v3/src/Makefile.in | 137 +- .../testsuite/20_util/auto_ptr/assign_neg.cc | 7 +- .../deque/requirements/dr438/assign_neg.cc | 2 +- .../deque/requirements/dr438/constructor_1_neg.cc | 4 +- .../deque/requirements/dr438/constructor_2_neg.cc | 4 +- .../deque/requirements/dr438/insert_neg.cc | 4 +- .../list/requirements/dr438/assign_neg.cc | 4 +- .../list/requirements/dr438/constructor_1_neg.cc | 4 +- .../list/requirements/dr438/constructor_2_neg.cc | 4 +- .../list/requirements/dr438/insert_neg.cc | 4 +- .../vector/requirements/dr438/assign_neg.cc | 4 +- .../vector/requirements/dr438/constructor_1_neg.cc | 4 +- .../vector/requirements/dr438/constructor_2_neg.cc | 4 +- .../vector/requirements/dr438/insert_neg.cc | 2 +- .../testsuite/27_io/ios_base/cons/assign_neg.cc | 9 +- .../testsuite/27_io/ios_base/cons/copy_neg.cc | 9 +- libstdc++-v3/testsuite/Makefile.am | 8 - libstdc++-v3/testsuite/Makefile.in | 125 +- 796 files changed, 147944 insertions(+), 152495 deletions(-) create mode 100644 libstdc++-v3/doc/Makefile.am create mode 100644 libstdc++-v3/doc/Makefile.in create mode 100644 libstdc++-v3/doc/doxygen/Intro.3 create mode 100644 libstdc++-v3/doc/doxygen/TODO create mode 100644 libstdc++-v3/doc/doxygen/doxygroups.cc create mode 100644 libstdc++-v3/doc/doxygen/guide.html create mode 100644 libstdc++-v3/doc/doxygen/mainpage.html create mode 100644 libstdc++-v3/doc/doxygen/run_doxygen create mode 100644 libstdc++-v3/doc/doxygen/stdheader.cc create mode 100644 libstdc++-v3/doc/doxygen/style.css create mode 100644 libstdc++-v3/doc/doxygen/tables.html create mode 100644 libstdc++-v3/doc/doxygen/user.cfg.in create mode 100644 libstdc++-v3/doc/html/17_intro/BADNAMES create mode 100644 libstdc++-v3/doc/html/17_intro/C++STYLE create mode 100644 libstdc++-v3/doc/html/17_intro/COPYING create mode 100644 libstdc++-v3/doc/html/17_intro/COPYING.DOC create mode 100644 libstdc++-v3/doc/html/17_intro/DESIGN create mode 100644 libstdc++-v3/doc/html/17_intro/TODO create mode 100644 libstdc++-v3/doc/html/17_intro/abi.html create mode 100644 libstdc++-v3/doc/html/17_intro/api.html create mode 100644 libstdc++-v3/doc/html/17_intro/backwards_compatibility.html create mode 100644 libstdc++-v3/doc/html/17_intro/c++0x_status.html create mode 100644 libstdc++-v3/doc/html/17_intro/c++1998_status.html create mode 100644 libstdc++-v3/doc/html/17_intro/confdeps.dot create mode 100644 libstdc++-v3/doc/html/17_intro/confdeps.png create mode 100644 libstdc++-v3/doc/html/17_intro/configury.html create mode 100644 libstdc++-v3/doc/html/17_intro/contribute.html create mode 100644 libstdc++-v3/doc/html/17_intro/howto.html create mode 100644 libstdc++-v3/doc/html/17_intro/license.html create mode 100644 libstdc++-v3/doc/html/17_intro/porting.html create mode 100644 libstdc++-v3/doc/html/17_intro/porting.texi create mode 100644 libstdc++-v3/doc/html/17_intro/tr1_status.html create mode 100644 libstdc++-v3/doc/html/18_support/howto.html create mode 100644 libstdc++-v3/doc/html/19_diagnostics/howto.html create mode 100644 libstdc++-v3/doc/html/20_util/allocator.html create mode 100644 libstdc++-v3/doc/html/20_util/howto.html create mode 100644 libstdc++-v3/doc/html/20_util/shared_ptr.html create mode 100644 libstdc++-v3/doc/html/21_strings/gotw29a.txt create mode 100644 libstdc++-v3/doc/html/21_strings/howto.html create mode 100644 libstdc++-v3/doc/html/21_strings/stringtok_h.txt create mode 100644 libstdc++-v3/doc/html/21_strings/stringtok_std_h.txt create mode 100644 libstdc++-v3/doc/html/22_locale/codecvt.html create mode 100644 libstdc++-v3/doc/html/22_locale/ctype.html create mode 100644 libstdc++-v3/doc/html/22_locale/howto.html create mode 100644 libstdc++-v3/doc/html/22_locale/locale.html create mode 100644 libstdc++-v3/doc/html/22_locale/messages.html create mode 100644 libstdc++-v3/doc/html/23_containers/howto.html create mode 100644 libstdc++-v3/doc/html/23_containers/wrappers_h.txt create mode 100644 libstdc++-v3/doc/html/24_iterators/howto.html create mode 100644 libstdc++-v3/doc/html/25_algorithms/howto.html create mode 100644 libstdc++-v3/doc/html/26_numerics/howto.html create mode 100644 libstdc++-v3/doc/html/27_io/binary_iostreams_kanze.txt create mode 100644 libstdc++-v3/doc/html/27_io/binary_iostreams_kuehl.txt create mode 100644 libstdc++-v3/doc/html/27_io/howto.html create mode 100644 libstdc++-v3/doc/html/configopts.html create mode 100644 libstdc++-v3/doc/html/debug.html create mode 100644 libstdc++-v3/doc/html/documentation.html create mode 100644 libstdc++-v3/doc/html/ext/ballocator_doc.html create mode 100644 libstdc++-v3/doc/html/ext/concurrence.html create mode 100644 libstdc++-v3/doc/html/ext/debug_mode.html create mode 100644 libstdc++-v3/doc/html/ext/howto.html create mode 100644 libstdc++-v3/doc/html/ext/lwg-active.html create mode 100644 libstdc++-v3/doc/html/ext/lwg-closed.html create mode 100644 libstdc++-v3/doc/html/ext/lwg-defects.html create mode 100644 libstdc++-v3/doc/html/ext/mt_allocator.html create mode 100644 libstdc++-v3/doc/html/ext/parallel_mode.html create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/PythonPoweredSmall.gif create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/acks.html create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/assoc_container_tag_cd.png create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/assoc_container_tag_cd.svg create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/assoc_container_traits.html create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/assoc_design.html create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/assoc_examples.html create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/assoc_performance_tests.html create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/assoc_regression_tests.html create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/assoc_tests.html create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/associative_container_tag.html create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/balls_and_bins.png create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/basic_hash_table.html create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/basic_hash_tag.html create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/basic_invalidation_guarantee.html create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/basic_tree.html create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/basic_tree_assoc_container_const_node_iterator.html create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/basic_tree_tag.html create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/binary_heap_tag.html create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/binary_priority_queue_random_int_push_timing_test_gcc.png create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/binary_priority_queue_random_int_push_timing_test_local.png create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/binary_priority_queue_random_int_push_timing_test_msvc.png create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/binomial_heap_tag.html create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/cc_hash_max_collision_check_resize_trigger.html create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/cc_hash_random_int_find_timing_test_gcc.png create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/cc_hash_random_int_find_timing_test_local.png create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/cc_hash_random_int_find_timing_test_msvc.png create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/cc_hash_random_int_subscript_timing_test_find_gcc.png create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/cc_hash_random_int_subscript_timing_test_find_local.png create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/cc_hash_random_int_subscript_timing_test_find_msvc.png create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/cc_hash_random_int_subscript_timing_test_insert_gcc.png create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/cc_hash_random_int_subscript_timing_test_insert_local.png create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/cc_hash_random_int_subscript_timing_test_insert_msvc.png create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/cc_hash_table.html create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/cc_hash_tag.html create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/ccgp_hash_random_int_subscript_timing_test_insert_gcc.png create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/ccgp_hash_random_int_subscript_timing_test_insert_local.png create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/ccgp_hash_random_int_subscript_timing_test_insert_msvc.png create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/checked_by_tidy.gif create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/concepts.html create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/contact.html create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/container_base.html create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/container_cd.png create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/container_cd.svg create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/container_tag.html create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/counter_lu_policy.html create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/design.html create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/different_underlying_dss.png create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/direct_mask_range_hashing.html create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/direct_mod_range_hashing.html create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/disclaimer.html create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/ds_gen.html create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/embedded_lists_1.png create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/embedded_lists_2.png create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/embedded_lists_3.png create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/examples.html create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/exceptions.html create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/gp_hash_random_int_find_timing_test_gcc.png create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/gp_hash_random_int_find_timing_test_local.png create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/gp_hash_random_int_find_timing_test_msvc.png create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/gp_hash_random_int_subscript_timing_test_find_gcc.png create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/gp_hash_random_int_subscript_timing_test_find_local.png create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/gp_hash_random_int_subscript_timing_test_find_msvc.png create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/gp_hash_random_int_subscript_timing_test_insert_gcc.png create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/gp_hash_random_int_subscript_timing_test_insert_local.png create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/gp_hash_random_int_subscript_timing_test_insert_msvc.png create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/gp_hash_table.html create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/gp_hash_tag.html create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/hash_based_containers.html create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/hash_exponential_size_policy.html create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/hash_load_check_resize_trigger.html create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/hash_policy_cd.png create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/hash_prime_size_policy.html create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/hash_random_int_erase_mem_usage_test.html create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/hash_random_int_erase_mem_usage_test_gcc.png create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/hash_random_int_erase_mem_usage_test_local.png create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/hash_random_int_erase_mem_usage_test_msvc.png create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/hash_random_int_find_find_timing_test.html create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/hash_random_int_subscript_find_timing_test.html create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/hash_random_int_subscript_insert_timing_test.html create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/hash_range_hashing_seq_diagram.png create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/hash_range_hashing_seq_diagram2.png create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/hash_ranged_hash_range_hashing_fns.png create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/hash_standard_resize_policy.html create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/hash_text_find_find_timing_test.html create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/hash_zlob_random_int_find_find_timing_test.html create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/hash_zlob_random_int_find_timing_test_gcc.png create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/hash_zlob_random_int_find_timing_test_local.png create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/hash_zlob_random_int_find_timing_test_msvc.png create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/index.html create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/insert_error.html create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/insert_resize_sequence_diagram1.png create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/insert_resize_sequence_diagram2.png create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/insert_resize_sequence_diagram3.png create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/interface.html create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/introduction.html create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/invalidation_guarantee_cd.png create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/invalidation_guarantee_erase.png create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/join_error.html create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/linear_probe_fn.html create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/list_update.html create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/list_update_tag.html create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/lu.png create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/lu_based_containers.html create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/misc.html create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/motivation.html create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/move_to_front_lu_policy.html create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/multimap_text_find_timing_test_large.html create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/multimap_text_find_timing_test_large_s2p_hash_gcc.png create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/multimap_text_find_timing_test_large_s2p_hash_local.png create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/multimap_text_find_timing_test_large_s2p_hash_msvc.png create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/multimap_text_find_timing_test_large_s2p_tree_gcc.png create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/multimap_text_find_timing_test_large_s2p_tree_local.png create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/multimap_text_find_timing_test_large_s2p_tree_msvc.png create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/multimap_text_find_timing_test_small.html create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/multimap_text_find_timing_test_small_s2p_hash_gcc.png create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/multimap_text_find_timing_test_small_s2p_hash_local.png create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/multimap_text_find_timing_test_small_s2p_hash_msvc.png create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/multimap_text_find_timing_test_small_s2p_tree_gcc.png create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/multimap_text_find_timing_test_small_s2p_tree_local.png create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/multimap_text_find_timing_test_small_s2p_tree_msvc.png create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/multimap_text_insert_mem_usage_test_large.html create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/multimap_text_insert_mem_usage_test_large_s2p_hash_gcc.png create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/multimap_text_insert_mem_usage_test_large_s2p_hash_local.png create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/multimap_text_insert_mem_usage_test_large_s2p_hash_msvc.png create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/multimap_text_insert_mem_usage_test_large_s2p_tree_gcc.png create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/multimap_text_insert_mem_usage_test_large_s2p_tree_local.png create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/multimap_text_insert_mem_usage_test_large_s2p_tree_msvc.png create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/multimap_text_insert_mem_usage_test_small.html create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/multimap_text_insert_mem_usage_test_small_s2p_hash_gcc.png create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/multimap_text_insert_mem_usage_test_small_s2p_hash_local.png create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/multimap_text_insert_mem_usage_test_small_s2p_hash_msvc.png create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/multimap_text_insert_mem_usage_test_small_s2p_tree_gcc.png create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/multimap_text_insert_mem_usage_test_small_s2p_tree_local.png create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/multimap_text_insert_mem_usage_test_small_s2p_tree_msvc.png create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/multimap_text_insert_timing_test_large.html create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/multimap_text_insert_timing_test_large_s2p_hash_gcc.png create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/multimap_text_insert_timing_test_large_s2p_hash_local.png create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/multimap_text_insert_timing_test_large_s2p_hash_msvc.png create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/multimap_text_insert_timing_test_large_s2p_tree_gcc.png create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/multimap_text_insert_timing_test_large_s2p_tree_local.png create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/multimap_text_insert_timing_test_large_s2p_tree_msvc.png create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/multimap_text_insert_timing_test_small.html create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/multimap_text_insert_timing_test_small_s2p_hash_gcc.png create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/multimap_text_insert_timing_test_small_s2p_hash_local.png create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/multimap_text_insert_timing_test_small_s2p_hash_msvc.png create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/multimap_text_insert_timing_test_small_s2p_tree_gcc.png create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/multimap_text_insert_timing_test_small_s2p_tree_local.png create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/multimap_text_insert_timing_test_small_s2p_tree_msvc.png create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/node_invariant_invalidations.png create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/node_invariants.png create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/null_hash_fn.html create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/null_lu_metadata.html create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/null_mapped_type.html create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/null_probe_fn.html create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/null_tree_node_update.html create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/null_trie_node_update.html create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/ov_tree_tag.html create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/pairing_heap_tag.html create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/pairing_priority_queue_text_push_pop_timing_test_gcc.png create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/pairing_priority_queue_text_push_pop_timing_test_local.png create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/pairing_priority_queue_text_push_pop_timing_test_msvc.png create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/pairing_priority_queue_text_push_timing_test_gcc.png create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/pairing_priority_queue_text_push_timing_test_local.png create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/pairing_priority_queue_text_push_timing_test_msvc.png create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/pat_trie.png create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/pat_trie_tag.html create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/point_invalidation_guarantee.html create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/point_iterators_cd.png create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/point_iterators_range_ops_1.png create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/point_iterators_range_ops_2.png create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/pq_container_traits.html create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/pq_design.html create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/pq_different_underlying_dss.png create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/pq_examples.html create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/pq_performance_tests.html create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/pq_regression_tests.html create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/pq_tests.html create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/prerequisites.html create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/priority_queue.html create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/priority_queue_random_int_push_pop_timing_test.html create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/priority_queue_random_int_push_pop_timing_test_gcc.png create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/priority_queue_random_int_push_pop_timing_test_local.png create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/priority_queue_random_int_push_pop_timing_test_msvc.png create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/priority_queue_random_int_push_timing_test.html create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/priority_queue_random_int_push_timing_test_gcc.png create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/priority_queue_random_int_push_timing_test_local.png create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/priority_queue_random_int_push_timing_test_msvc.png create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/priority_queue_tag.html create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/priority_queue_tag_cd.png create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/priority_queue_tag_cd.svg create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/priority_queue_text_join_timing_test.html create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/priority_queue_text_join_timing_test_gcc.png create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/priority_queue_text_join_timing_test_local.png create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/priority_queue_text_join_timing_test_msvc.png create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/priority_queue_text_modify_down_timing_test.html create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/priority_queue_text_modify_down_timing_test_gcc.png create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/priority_queue_text_modify_down_timing_test_local.png create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/priority_queue_text_modify_down_timing_test_msvc.png create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/priority_queue_text_modify_down_timing_test_pairing_thin_gcc.png create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/priority_queue_text_modify_down_timing_test_pairing_thin_local.png create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/priority_queue_text_modify_down_timing_test_pairing_thin_msvc.png create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/priority_queue_text_modify_up_timing_test.html create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/priority_queue_text_modify_up_timing_test_gcc.png create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/priority_queue_text_modify_up_timing_test_local.png create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/priority_queue_text_modify_up_timing_test_msvc.png create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/priority_queue_text_modify_up_timing_test_pairing_thin_gcc.png create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/priority_queue_text_modify_up_timing_test_pairing_thin_local.png create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/priority_queue_text_modify_up_timing_test_pairing_thin_msvc.png create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/priority_queue_text_pop_mem_usage_test.html create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/priority_queue_text_pop_mem_usage_test_gcc.png create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/priority_queue_text_pop_mem_usage_test_local.png create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/priority_queue_text_pop_mem_usage_test_msvc.png create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/priority_queue_text_push_pop_timing_test.html create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/priority_queue_text_push_pop_timing_test_gcc.png create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/priority_queue_text_push_pop_timing_test_local.png create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/priority_queue_text_push_pop_timing_test_msvc.png create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/priority_queue_text_push_timing_test.html create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/priority_queue_text_push_timing_test_gcc.png create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/priority_queue_text_push_timing_test_local.png create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/priority_queue_text_push_timing_test_msvc.png create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/quadratic_probe_fn.html create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/random_int_find_find_timing_test_tree_gcc.png create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/random_int_find_find_timing_test_tree_local.png create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/random_int_find_find_timing_test_tree_msvc.png create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/range_invalidation_guarantee.html create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/rationale_null_node_updator.png create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/rb_tree_tag.html create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/rc_binomial_heap_tag.html create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/references.html create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/resize_error.html create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/resize_policy_cd.png create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/restoring_node_invariants.png create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/sample_probe_fn.html create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/sample_range_hashing.html create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/sample_ranged_hash_fn.html create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/sample_ranged_probe_fn.html create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/sample_resize_policy.html create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/sample_resize_trigger.html create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/sample_size_policy.html create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/sample_tree_node_update.html create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/sample_trie_e_access_traits.html create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/sample_trie_node_update.html create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/sample_update_policy.html create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/simple_list.png create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/splay_tree_tag.html create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/string_trie_e_access_traits.html create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/tests.html create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/text_find_timing_test_hash_gcc.png create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/text_find_timing_test_hash_local.png create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/text_find_timing_test_hash_msvc.png create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/text_find_timing_test_tree_like_gcc.png create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/text_find_timing_test_tree_like_local.png create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/text_find_timing_test_tree_like_msvc.png create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/thin_heap_tag.html create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/tree.html create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/tree_based_containers.html create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/tree_node_iterator.html create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/tree_node_updator_policy_cd.png create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/tree_order_statistics_node_update.html create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/tree_order_statistics_timing_test.html create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/tree_order_statistics_timing_test_gcc.png create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/tree_order_statistics_timing_test_local.png create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/tree_order_statistics_timing_test_msvc.png create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/tree_random_int_find_find_timing_test.html create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/tree_split_join_timing_test.html create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/tree_split_join_timing_test_gcc.png create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/tree_split_join_timing_test_local.png create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/tree_split_join_timing_test_msvc.png create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/tree_tag.html create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/tree_text_find_find_timing_test.html create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/tree_text_insert_timing_test.html create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/tree_text_insert_timing_test_node_tree_gcc.png create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/tree_text_insert_timing_test_node_tree_local.png create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/tree_text_insert_timing_test_node_tree_msvc.png create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/tree_text_insert_timing_test_pat_trie_gcc.png create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/tree_text_insert_timing_test_pat_trie_local.png create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/tree_text_insert_timing_test_pat_trie_msvc.png create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/tree_text_insert_timing_test_vector_tree_gcc.png create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/tree_text_insert_timing_test_vector_tree_local.png create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/tree_text_insert_timing_test_vector_tree_msvc.png create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/tree_text_lor_find_find_timing_test.html create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/tree_text_lor_find_timing_test_gcc.png create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/tree_text_lor_find_timing_test_local.png create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/tree_text_lor_find_timing_test_msvc.png create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/trie.html create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/trie_based_containers.html create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/trie_const_node_iterator.html create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/trie_node_iterator.html create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/trie_node_updator_policy_cd.png create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/trie_order_statistics_node_update.html create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/trie_prefix_search_node_update.html create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/trie_tag.html create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/trivial_iterator_tag.html create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/tutorial.html create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/update_policy_cd.png create mode 100644 libstdc++-v3/doc/html/ext/pb_ds/update_seq_diagram.png create mode 100644 libstdc++-v3/doc/html/ext/sgiexts.html create mode 100644 libstdc++-v3/doc/html/faq/index.html create mode 100644 libstdc++-v3/doc/html/install.html create mode 100644 libstdc++-v3/doc/html/lib3styles.css create mode 100644 libstdc++-v3/doc/html/test.html delete mode 100644 libstdc++-v3/docs/doxygen/Intro.3 delete mode 100644 libstdc++-v3/docs/doxygen/TODO delete mode 100644 libstdc++-v3/docs/doxygen/doxygroups.cc delete mode 100644 libstdc++-v3/docs/doxygen/guide.html delete mode 100644 libstdc++-v3/docs/doxygen/mainpage.html delete mode 100644 libstdc++-v3/docs/doxygen/run_doxygen delete mode 100644 libstdc++-v3/docs/doxygen/stdheader.cc delete mode 100644 libstdc++-v3/docs/doxygen/style.css delete mode 100644 libstdc++-v3/docs/doxygen/tables.html delete mode 100644 libstdc++-v3/docs/doxygen/user.cfg.in delete mode 100644 libstdc++-v3/docs/html/17_intro/BADNAMES delete mode 100644 libstdc++-v3/docs/html/17_intro/C++STYLE delete mode 100644 libstdc++-v3/docs/html/17_intro/COPYING delete mode 100644 libstdc++-v3/docs/html/17_intro/COPYING.DOC delete mode 100644 libstdc++-v3/docs/html/17_intro/DESIGN delete mode 100644 libstdc++-v3/docs/html/17_intro/TODO delete mode 100644 libstdc++-v3/docs/html/17_intro/abi.html delete mode 100644 libstdc++-v3/docs/html/17_intro/api.html delete mode 100644 libstdc++-v3/docs/html/17_intro/backwards_compatibility.html delete mode 100644 libstdc++-v3/docs/html/17_intro/c++0x_status.html delete mode 100644 libstdc++-v3/docs/html/17_intro/c++1998_status.html delete mode 100644 libstdc++-v3/docs/html/17_intro/confdeps.dot delete mode 100644 libstdc++-v3/docs/html/17_intro/confdeps.png delete mode 100644 libstdc++-v3/docs/html/17_intro/configury.html delete mode 100644 libstdc++-v3/docs/html/17_intro/contribute.html delete mode 100644 libstdc++-v3/docs/html/17_intro/howto.html delete mode 100644 libstdc++-v3/docs/html/17_intro/license.html delete mode 100644 libstdc++-v3/docs/html/17_intro/porting.html delete mode 100644 libstdc++-v3/docs/html/17_intro/porting.texi delete mode 100644 libstdc++-v3/docs/html/17_intro/tr1_status.html delete mode 100644 libstdc++-v3/docs/html/18_support/howto.html delete mode 100644 libstdc++-v3/docs/html/19_diagnostics/howto.html delete mode 100644 libstdc++-v3/docs/html/20_util/allocator.html delete mode 100644 libstdc++-v3/docs/html/20_util/howto.html delete mode 100644 libstdc++-v3/docs/html/20_util/shared_ptr.html delete mode 100644 libstdc++-v3/docs/html/21_strings/gotw29a.txt delete mode 100644 libstdc++-v3/docs/html/21_strings/howto.html delete mode 100644 libstdc++-v3/docs/html/21_strings/stringtok_h.txt delete mode 100644 libstdc++-v3/docs/html/21_strings/stringtok_std_h.txt delete mode 100644 libstdc++-v3/docs/html/22_locale/codecvt.html delete mode 100644 libstdc++-v3/docs/html/22_locale/ctype.html delete mode 100644 libstdc++-v3/docs/html/22_locale/howto.html delete mode 100644 libstdc++-v3/docs/html/22_locale/locale.html delete mode 100644 libstdc++-v3/docs/html/22_locale/messages.html delete mode 100644 libstdc++-v3/docs/html/23_containers/howto.html delete mode 100644 libstdc++-v3/docs/html/23_containers/wrappers_h.txt delete mode 100644 libstdc++-v3/docs/html/24_iterators/howto.html delete mode 100644 libstdc++-v3/docs/html/25_algorithms/howto.html delete mode 100644 libstdc++-v3/docs/html/26_numerics/howto.html delete mode 100644 libstdc++-v3/docs/html/27_io/binary_iostreams_kanze.txt delete mode 100644 libstdc++-v3/docs/html/27_io/binary_iostreams_kuehl.txt delete mode 100644 libstdc++-v3/docs/html/27_io/howto.html delete mode 100644 libstdc++-v3/docs/html/configopts.html delete mode 100644 libstdc++-v3/docs/html/debug.html delete mode 100644 libstdc++-v3/docs/html/documentation.html delete mode 100644 libstdc++-v3/docs/html/ext/ballocator_doc.html delete mode 100644 libstdc++-v3/docs/html/ext/concurrence.html delete mode 100644 libstdc++-v3/docs/html/ext/debug_mode.html delete mode 100644 libstdc++-v3/docs/html/ext/howto.html delete mode 100644 libstdc++-v3/docs/html/ext/lwg-active.html delete mode 100644 libstdc++-v3/docs/html/ext/lwg-closed.html delete mode 100644 libstdc++-v3/docs/html/ext/lwg-defects.html delete mode 100644 libstdc++-v3/docs/html/ext/mt_allocator.html delete mode 100644 libstdc++-v3/docs/html/ext/parallel_mode.html delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/PythonPoweredSmall.gif delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/acks.html delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/assoc_container_tag_cd.png delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/assoc_container_tag_cd.svg delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/assoc_container_traits.html delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/assoc_design.html delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/assoc_examples.html delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/assoc_performance_tests.html delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/assoc_regression_tests.html delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/assoc_tests.html delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/associative_container_tag.html delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/balls_and_bins.png delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/basic_hash_table.html delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/basic_hash_tag.html delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/basic_invalidation_guarantee.html delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/basic_tree.html delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/basic_tree_assoc_container_const_node_iterator.html delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/basic_tree_tag.html delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/binary_heap_tag.html delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/binary_priority_queue_random_int_push_timing_test_gcc.png delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/binary_priority_queue_random_int_push_timing_test_local.png delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/binary_priority_queue_random_int_push_timing_test_msvc.png delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/binomial_heap_tag.html delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/cc_hash_max_collision_check_resize_trigger.html delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/cc_hash_random_int_find_timing_test_gcc.png delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/cc_hash_random_int_find_timing_test_local.png delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/cc_hash_random_int_find_timing_test_msvc.png delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/cc_hash_random_int_subscript_timing_test_find_gcc.png delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/cc_hash_random_int_subscript_timing_test_find_local.png delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/cc_hash_random_int_subscript_timing_test_find_msvc.png delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/cc_hash_random_int_subscript_timing_test_insert_gcc.png delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/cc_hash_random_int_subscript_timing_test_insert_local.png delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/cc_hash_random_int_subscript_timing_test_insert_msvc.png delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/cc_hash_table.html delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/cc_hash_tag.html delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/ccgp_hash_random_int_subscript_timing_test_insert_gcc.png delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/ccgp_hash_random_int_subscript_timing_test_insert_local.png delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/ccgp_hash_random_int_subscript_timing_test_insert_msvc.png delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/checked_by_tidy.gif delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/concepts.html delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/contact.html delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/container_base.html delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/container_cd.png delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/container_cd.svg delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/container_tag.html delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/counter_lu_policy.html delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/design.html delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/different_underlying_dss.png delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/direct_mask_range_hashing.html delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/direct_mod_range_hashing.html delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/disclaimer.html delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/ds_gen.html delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/embedded_lists_1.png delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/embedded_lists_2.png delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/embedded_lists_3.png delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/examples.html delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/exceptions.html delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/gp_hash_random_int_find_timing_test_gcc.png delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/gp_hash_random_int_find_timing_test_local.png delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/gp_hash_random_int_find_timing_test_msvc.png delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/gp_hash_random_int_subscript_timing_test_find_gcc.png delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/gp_hash_random_int_subscript_timing_test_find_local.png delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/gp_hash_random_int_subscript_timing_test_find_msvc.png delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/gp_hash_random_int_subscript_timing_test_insert_gcc.png delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/gp_hash_random_int_subscript_timing_test_insert_local.png delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/gp_hash_random_int_subscript_timing_test_insert_msvc.png delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/gp_hash_table.html delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/gp_hash_tag.html delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/hash_based_containers.html delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/hash_exponential_size_policy.html delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/hash_load_check_resize_trigger.html delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/hash_policy_cd.png delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/hash_prime_size_policy.html delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/hash_random_int_erase_mem_usage_test.html delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/hash_random_int_erase_mem_usage_test_gcc.png delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/hash_random_int_erase_mem_usage_test_local.png delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/hash_random_int_erase_mem_usage_test_msvc.png delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/hash_random_int_find_find_timing_test.html delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/hash_random_int_subscript_find_timing_test.html delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/hash_random_int_subscript_insert_timing_test.html delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/hash_range_hashing_seq_diagram.png delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/hash_range_hashing_seq_diagram2.png delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/hash_ranged_hash_range_hashing_fns.png delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/hash_standard_resize_policy.html delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/hash_text_find_find_timing_test.html delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/hash_zlob_random_int_find_find_timing_test.html delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/hash_zlob_random_int_find_timing_test_gcc.png delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/hash_zlob_random_int_find_timing_test_local.png delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/hash_zlob_random_int_find_timing_test_msvc.png delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/index.html delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/insert_error.html delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/insert_resize_sequence_diagram1.png delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/insert_resize_sequence_diagram2.png delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/insert_resize_sequence_diagram3.png delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/interface.html delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/introduction.html delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/invalidation_guarantee_cd.png delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/invalidation_guarantee_erase.png delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/join_error.html delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/linear_probe_fn.html delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/list_update.html delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/list_update_tag.html delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/lu.png delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/lu_based_containers.html delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/misc.html delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/motivation.html delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/move_to_front_lu_policy.html delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/multimap_text_find_timing_test_large.html delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/multimap_text_find_timing_test_large_s2p_hash_gcc.png delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/multimap_text_find_timing_test_large_s2p_hash_local.png delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/multimap_text_find_timing_test_large_s2p_hash_msvc.png delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/multimap_text_find_timing_test_large_s2p_tree_gcc.png delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/multimap_text_find_timing_test_large_s2p_tree_local.png delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/multimap_text_find_timing_test_large_s2p_tree_msvc.png delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/multimap_text_find_timing_test_small.html delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/multimap_text_find_timing_test_small_s2p_hash_gcc.png delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/multimap_text_find_timing_test_small_s2p_hash_local.png delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/multimap_text_find_timing_test_small_s2p_hash_msvc.png delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/multimap_text_find_timing_test_small_s2p_tree_gcc.png delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/multimap_text_find_timing_test_small_s2p_tree_local.png delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/multimap_text_find_timing_test_small_s2p_tree_msvc.png delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/multimap_text_insert_mem_usage_test_large.html delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/multimap_text_insert_mem_usage_test_large_s2p_hash_gcc.png delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/multimap_text_insert_mem_usage_test_large_s2p_hash_local.png delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/multimap_text_insert_mem_usage_test_large_s2p_hash_msvc.png delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/multimap_text_insert_mem_usage_test_large_s2p_tree_gcc.png delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/multimap_text_insert_mem_usage_test_large_s2p_tree_local.png delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/multimap_text_insert_mem_usage_test_large_s2p_tree_msvc.png delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/multimap_text_insert_mem_usage_test_small.html delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/multimap_text_insert_mem_usage_test_small_s2p_hash_gcc.png delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/multimap_text_insert_mem_usage_test_small_s2p_hash_local.png delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/multimap_text_insert_mem_usage_test_small_s2p_hash_msvc.png delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/multimap_text_insert_mem_usage_test_small_s2p_tree_gcc.png delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/multimap_text_insert_mem_usage_test_small_s2p_tree_local.png delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/multimap_text_insert_mem_usage_test_small_s2p_tree_msvc.png delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/multimap_text_insert_timing_test_large.html delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/multimap_text_insert_timing_test_large_s2p_hash_gcc.png delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/multimap_text_insert_timing_test_large_s2p_hash_local.png delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/multimap_text_insert_timing_test_large_s2p_hash_msvc.png delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/multimap_text_insert_timing_test_large_s2p_tree_gcc.png delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/multimap_text_insert_timing_test_large_s2p_tree_local.png delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/multimap_text_insert_timing_test_large_s2p_tree_msvc.png delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/multimap_text_insert_timing_test_small.html delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/multimap_text_insert_timing_test_small_s2p_hash_gcc.png delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/multimap_text_insert_timing_test_small_s2p_hash_local.png delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/multimap_text_insert_timing_test_small_s2p_hash_msvc.png delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/multimap_text_insert_timing_test_small_s2p_tree_gcc.png delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/multimap_text_insert_timing_test_small_s2p_tree_local.png delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/multimap_text_insert_timing_test_small_s2p_tree_msvc.png delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/node_invariant_invalidations.png delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/node_invariants.png delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/null_hash_fn.html delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/null_lu_metadata.html delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/null_mapped_type.html delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/null_probe_fn.html delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/null_tree_node_update.html delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/null_trie_node_update.html delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/ov_tree_tag.html delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/pairing_heap_tag.html delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/pairing_priority_queue_text_push_pop_timing_test_gcc.png delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/pairing_priority_queue_text_push_pop_timing_test_local.png delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/pairing_priority_queue_text_push_pop_timing_test_msvc.png delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/pairing_priority_queue_text_push_timing_test_gcc.png delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/pairing_priority_queue_text_push_timing_test_local.png delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/pairing_priority_queue_text_push_timing_test_msvc.png delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/pat_trie.png delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/pat_trie_tag.html delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/point_invalidation_guarantee.html delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/point_iterators_cd.png delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/point_iterators_range_ops_1.png delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/point_iterators_range_ops_2.png delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/pq_container_traits.html delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/pq_design.html delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/pq_different_underlying_dss.png delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/pq_examples.html delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/pq_performance_tests.html delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/pq_regression_tests.html delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/pq_tests.html delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/prerequisites.html delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/priority_queue.html delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/priority_queue_random_int_push_pop_timing_test.html delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/priority_queue_random_int_push_pop_timing_test_gcc.png delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/priority_queue_random_int_push_pop_timing_test_local.png delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/priority_queue_random_int_push_pop_timing_test_msvc.png delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/priority_queue_random_int_push_timing_test.html delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/priority_queue_random_int_push_timing_test_gcc.png delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/priority_queue_random_int_push_timing_test_local.png delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/priority_queue_random_int_push_timing_test_msvc.png delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/priority_queue_tag.html delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/priority_queue_tag_cd.png delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/priority_queue_tag_cd.svg delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/priority_queue_text_join_timing_test.html delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/priority_queue_text_join_timing_test_gcc.png delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/priority_queue_text_join_timing_test_local.png delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/priority_queue_text_join_timing_test_msvc.png delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/priority_queue_text_modify_down_timing_test.html delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/priority_queue_text_modify_down_timing_test_gcc.png delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/priority_queue_text_modify_down_timing_test_local.png delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/priority_queue_text_modify_down_timing_test_msvc.png delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/priority_queue_text_modify_down_timing_test_pairing_thin_gcc.png delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/priority_queue_text_modify_down_timing_test_pairing_thin_local.png delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/priority_queue_text_modify_down_timing_test_pairing_thin_msvc.png delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/priority_queue_text_modify_up_timing_test.html delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/priority_queue_text_modify_up_timing_test_gcc.png delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/priority_queue_text_modify_up_timing_test_local.png delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/priority_queue_text_modify_up_timing_test_msvc.png delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/priority_queue_text_modify_up_timing_test_pairing_thin_gcc.png delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/priority_queue_text_modify_up_timing_test_pairing_thin_local.png delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/priority_queue_text_modify_up_timing_test_pairing_thin_msvc.png delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/priority_queue_text_pop_mem_usage_test.html delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/priority_queue_text_pop_mem_usage_test_gcc.png delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/priority_queue_text_pop_mem_usage_test_local.png delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/priority_queue_text_pop_mem_usage_test_msvc.png delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/priority_queue_text_push_pop_timing_test.html delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/priority_queue_text_push_pop_timing_test_gcc.png delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/priority_queue_text_push_pop_timing_test_local.png delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/priority_queue_text_push_pop_timing_test_msvc.png delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/priority_queue_text_push_timing_test.html delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/priority_queue_text_push_timing_test_gcc.png delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/priority_queue_text_push_timing_test_local.png delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/priority_queue_text_push_timing_test_msvc.png delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/quadratic_probe_fn.html delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/random_int_find_find_timing_test_tree_gcc.png delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/random_int_find_find_timing_test_tree_local.png delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/random_int_find_find_timing_test_tree_msvc.png delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/range_invalidation_guarantee.html delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/rationale_null_node_updator.png delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/rb_tree_tag.html delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/rc_binomial_heap_tag.html delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/references.html delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/resize_error.html delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/resize_policy_cd.png delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/restoring_node_invariants.png delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/sample_probe_fn.html delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/sample_range_hashing.html delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/sample_ranged_hash_fn.html delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/sample_ranged_probe_fn.html delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/sample_resize_policy.html delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/sample_resize_trigger.html delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/sample_size_policy.html delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/sample_tree_node_update.html delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/sample_trie_e_access_traits.html delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/sample_trie_node_update.html delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/sample_update_policy.html delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/simple_list.png delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/splay_tree_tag.html delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/string_trie_e_access_traits.html delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/tests.html delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/text_find_timing_test_hash_gcc.png delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/text_find_timing_test_hash_local.png delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/text_find_timing_test_hash_msvc.png delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/text_find_timing_test_tree_like_gcc.png delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/text_find_timing_test_tree_like_local.png delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/text_find_timing_test_tree_like_msvc.png delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/thin_heap_tag.html delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/tree.html delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/tree_based_containers.html delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/tree_node_iterator.html delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/tree_node_updator_policy_cd.png delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/tree_order_statistics_node_update.html delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/tree_order_statistics_timing_test.html delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/tree_order_statistics_timing_test_gcc.png delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/tree_order_statistics_timing_test_local.png delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/tree_order_statistics_timing_test_msvc.png delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/tree_random_int_find_find_timing_test.html delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/tree_split_join_timing_test.html delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/tree_split_join_timing_test_gcc.png delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/tree_split_join_timing_test_local.png delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/tree_split_join_timing_test_msvc.png delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/tree_tag.html delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/tree_text_find_find_timing_test.html delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/tree_text_insert_timing_test.html delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/tree_text_insert_timing_test_node_tree_gcc.png delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/tree_text_insert_timing_test_node_tree_local.png delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/tree_text_insert_timing_test_node_tree_msvc.png delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/tree_text_insert_timing_test_pat_trie_gcc.png delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/tree_text_insert_timing_test_pat_trie_local.png delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/tree_text_insert_timing_test_pat_trie_msvc.png delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/tree_text_insert_timing_test_vector_tree_gcc.png delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/tree_text_insert_timing_test_vector_tree_local.png delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/tree_text_insert_timing_test_vector_tree_msvc.png delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/tree_text_lor_find_find_timing_test.html delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/tree_text_lor_find_timing_test_gcc.png delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/tree_text_lor_find_timing_test_local.png delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/tree_text_lor_find_timing_test_msvc.png delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/trie.html delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/trie_based_containers.html delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/trie_const_node_iterator.html delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/trie_node_iterator.html delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/trie_node_updator_policy_cd.png delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/trie_order_statistics_node_update.html delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/trie_prefix_search_node_update.html delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/trie_tag.html delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/trivial_iterator_tag.html delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/tutorial.html delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/update_policy_cd.png delete mode 100644 libstdc++-v3/docs/html/ext/pb_ds/update_seq_diagram.png delete mode 100644 libstdc++-v3/docs/html/ext/sgiexts.html delete mode 100644 libstdc++-v3/docs/html/faq/index.html delete mode 100644 libstdc++-v3/docs/html/install.html delete mode 100644 libstdc++-v3/docs/html/lib3styles.css delete mode 100644 libstdc++-v3/docs/html/test.html diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 94388f51373..c663fb92ec2 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,94 @@ +2008-01-18 Benjamin Kosnik + + * docs/*: To... + * doc/*: ...here. + * testsuite/Makefile.am: Move doc-performance to... + * Makefile.am: Add doc to SUBDIRS, move doxygen-* rules to... + * doc/Makefile.am: Consolidate documentation creation here. + (doc-doxygen-html): New. + (doc-doxygen-man): New. + (doc-performance): New. + * doc/Makefile.in: New. + * acinclude.m4 (glibcxx_SUBDIRS): Add doc directory. + * doc/doxygen/guide.html: Edit for unified html configuration. + * doc/doxygen/mainpage.html: Same. + * doc/doxygen/run_doxygen: Same, more namespace fixups for man + generation. + * doc/doxygen/user.cfg.in: Update for doxygen 1.5.4. + + * include/tr1_impl/random: Remove maint from doxygen markup. + * include/tr1_impl/functional: Same. + * include/std/tuple: Same. + * include/std/streambuf: Same. + * include/std/bitset: Same. + * include/std/limits: Same. + * include/std/fstream: Same. + * include/std/istream: Same. + * include/std/sstream: Same. + * include/ext/pool_allocator.h: Same. + * include/ext/rc_string_base.h: Same. + * include/bits/basic_ios.h: Same. + * include/bits/stl_list.h: Same. + * include/bits/stl_map.h: Same. + * include/bits/locale_classes.h: Same. + * include/bits/stl_set.h: Same. + * include/bits/stl_iterator_base_types.h: Same. + * include/bits/basic_string.h: Same. + * include/bits/stl_multimap.h: Same. + * include/bits/stl_vector.h: Same. + * include/bits/ios_base.h: Same. + * include/bits/stl_deque.h: Same. + * include/bits/postypes.h: Same. + * include/bits/stl_multiset.h: Same. + * include/bits/stl_algo.h: Same. + * include/bits/stl_iterator.h: Same. + * include/bits/stl_tempbuf.h: Same. + * include/bits/stl_construct.h: Same. + * include/bits/stl_relops.h: Same. + * include/tr1/tuple: Same. + * include/backward/auto_ptr.h: Same. + + * testsuite/23_containers/vector/requirements/dr438/assign_neg.cc: + Fixups for line number changes. + * testsuite/23_containers/vector/requirements/dr438/insert_neg.cc: Same. + * testsuite/23_containers/vector/requirements/dr438/ + constructor_1_neg.cc: Same. + * testsuite/23_containers/vector/requirements/dr438/ + constructor_2_neg.cc: Same. + * testsuite/23_containers/deque/requirements/dr438/assign_neg.cc: Same. + * testsuite/23_containers/deque/requirements/dr438/insert_neg.cc: Same. + * testsuite/23_containers/deque/requirements/dr438/ + constructor_1_neg.cc: Same. + * testsuite/23_containers/deque/requirements/dr438/ + constructor_2_neg.cc: Same. + * testsuite/23_containers/list/requirements/dr438/assign_neg.cc: Same. + * testsuite/23_containers/list/requirements/dr438/insert_neg.cc: Same. + * testsuite/23_containers/list/requirements/dr438/ + constructor_1_neg.cc: Same. + * testsuite/23_containers/list/requirements/dr438/ + constructor_2_neg.cc: Same. + * testsuite/20_util/auto_ptr/assign_neg.cc: Same. + + * aclocal.m4: Regenerate. + * config.h.in: Regenerate. + * configure: Regenerate. + * Makefile.in: Regenerate. + * src/Makefile.in: Regenerate. + * po/Makefile.in: Regenerate. + * libmath/Makefile.in: Regenerate. + * include/Makefile.in: Regenerate. + * libsupc++/Makefile.in: Regenerate. + * testsuite/Makefile.in: Regenerate. + + * scripts/make_graphs.py: Correct paths for new layout. + +2008-01-17 Benjamin Kosnik + + * acinclude.m4 (AC_LC_MESSAGES): Remove serial. + * linkage.m4 (AC_REPLACE_MATHFUNCS): Same. + * configure: Regenerate. + * aclocal.m4: Regenerate. + 2008-01-14 Paolo Carlini * include/parallel/list_partition.h: Formatting fixes, inline tweaks. diff --git a/libstdc++-v3/Makefile.am b/libstdc++-v3/Makefile.am index 562b3e86a91..c1649e4a383 100644 --- a/libstdc++-v3/Makefile.am +++ b/libstdc++-v3/Makefile.am @@ -1,6 +1,6 @@ ## Makefile for the toplevel directory of the GNU C++ Standard library. ## -## Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003 +## Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2008 ## Free Software Foundation, Inc. ## ## This file is part of the libstdc++ version 3 distribution. @@ -25,41 +25,20 @@ include $(top_srcdir)/fragment.am if GLIBCXX_HOSTED - hosted_source = libmath src po testsuite + hosted_source = libmath doc src po testsuite endif ## Keep this list sync'd with acinclude.m4:GLIBCXX_CONFIGURE. SUBDIRS = include libsupc++ $(hosted_source) ACLOCAL_AMFLAGS = -I . -I .. -I ../config -# These rules are messy, but are hella worth it. -doxygen: - -(srcdir=`cd ${top_srcdir}; ${PWD_COMMAND}`; \ - builddir=`${PWD_COMMAND}`; \ - ${SHELL} ${srcdir}/docs/doxygen/run_doxygen \ - --host_alias=${host_alias} \ - --mode=user $${srcdir} $${builddir}) - -doxygen-maint: - -(srcdir=`cd ${top_srcdir}; ${PWD_COMMAND}`; \ - builddir=`${PWD_COMMAND}`; \ - ${SHELL} ${srcdir}/docs/doxygen/run_doxygen \ - --host_alias=${host_alias} \ - --mode=maint $${srcdir} $${builddir}) - -doxygen-man: - -(srcdir=`cd ${top_srcdir}; ${PWD_COMMAND}`; \ - builddir=`${PWD_COMMAND}`; \ - ${SHELL} ${srcdir}/docs/doxygen/run_doxygen \ - --host_alias=${host_alias} \ - --mode=man $${srcdir} $${builddir}) - -.PHONY: doxygen doxygen-maint doxygen-man - # Handy forwarding targets. check-%: cd testsuite && $(MAKE) $@ +doc-%: + cd doc && $(MAKE) $@ + # Multilib support. MAKEOVERRIDES= @@ -110,11 +89,3 @@ AM_MAKEFLAGS = \ # Subdir rules rely on $(FLAGS_TO_PASS) FLAGS_TO_PASS = $(AM_MAKEFLAGS) - -# Installation of distribution html documentation not yet supported -# TODO: Write custom install-html rule. -.PHONY: install-html install-pdf -install-html: - -# No install-pdf support in automake yet -install-pdf: diff --git a/libstdc++-v3/Makefile.in b/libstdc++-v3/Makefile.in index 60e3d0fa0e4..9b3aa2c8398 100644 --- a/libstdc++-v3/Makefile.in +++ b/libstdc++-v3/Makefile.in @@ -1,8 +1,8 @@ -# Makefile.in generated by automake 1.9.6 from Makefile.am. +# Makefile.in generated by automake 1.10 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005 Free Software Foundation, Inc. +# 2003, 2004, 2005, 2006 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. @@ -13,15 +13,11 @@ # PARTICULAR PURPOSE. @SET_MAKE@ -srcdir = @srcdir@ -top_srcdir = @top_srcdir@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ -top_builddir = . am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd -INSTALL = @INSTALL@ install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c @@ -63,7 +59,7 @@ am__aclocal_m4_deps = $(top_srcdir)/../config/enable.m4 \ am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ - configure.lineno configure.status.lineno + configure.lineno config.status.lineno CONFIG_HEADER = config.h CONFIG_CLEAN_FILES = scripts/testsuite_flags depcomp = @@ -78,13 +74,16 @@ MULTIDO = true MULTICLEAN = true RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ html-recursive info-recursive install-data-recursive \ - install-exec-recursive install-info-recursive \ - install-recursive installcheck-recursive installdirs-recursive \ - pdf-recursive ps-recursive uninstall-info-recursive \ - uninstall-recursive + install-dvi-recursive install-exec-recursive \ + install-html-recursive install-info-recursive \ + install-pdf-recursive install-ps-recursive install-recursive \ + installcheck-recursive installdirs-recursive pdf-recursive \ + ps-recursive uninstall-recursive +RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ + distclean-recursive maintainer-clean-recursive ETAGS = etags CTAGS = ctags -DIST_SUBDIRS = include libsupc++ libmath src po testsuite +DIST_SUBDIRS = include libsupc++ libmath doc src po testsuite DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) distdir = $(PACKAGE)-$(VERSION) top_distdir = $(distdir) @@ -142,42 +141,13 @@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ -ENABLE_PARALLEL_FALSE = @ENABLE_PARALLEL_FALSE@ -ENABLE_PARALLEL_TRUE = @ENABLE_PARALLEL_TRUE@ -ENABLE_SYMVERS_DARWIN_FALSE = @ENABLE_SYMVERS_DARWIN_FALSE@ -ENABLE_SYMVERS_DARWIN_TRUE = @ENABLE_SYMVERS_DARWIN_TRUE@ -ENABLE_SYMVERS_FALSE = @ENABLE_SYMVERS_FALSE@ -ENABLE_SYMVERS_GNU_FALSE = @ENABLE_SYMVERS_GNU_FALSE@ -ENABLE_SYMVERS_GNU_NAMESPACE_FALSE = @ENABLE_SYMVERS_GNU_NAMESPACE_FALSE@ -ENABLE_SYMVERS_GNU_NAMESPACE_TRUE = @ENABLE_SYMVERS_GNU_NAMESPACE_TRUE@ -ENABLE_SYMVERS_GNU_TRUE = @ENABLE_SYMVERS_GNU_TRUE@ -ENABLE_SYMVERS_TRUE = @ENABLE_SYMVERS_TRUE@ -ENABLE_VISIBILITY_FALSE = @ENABLE_VISIBILITY_FALSE@ -ENABLE_VISIBILITY_TRUE = @ENABLE_VISIBILITY_TRUE@ ERROR_CONSTANTS_SRCDIR = @ERROR_CONSTANTS_SRCDIR@ EXEEXT = @EXEEXT@ EXTRA_CXX_FLAGS = @EXTRA_CXX_FLAGS@ FGREP = @FGREP@ -GLIBCXX_BUILD_DEBUG_FALSE = @GLIBCXX_BUILD_DEBUG_FALSE@ -GLIBCXX_BUILD_DEBUG_TRUE = @GLIBCXX_BUILD_DEBUG_TRUE@ -GLIBCXX_BUILD_PCH_FALSE = @GLIBCXX_BUILD_PCH_FALSE@ -GLIBCXX_BUILD_PCH_TRUE = @GLIBCXX_BUILD_PCH_TRUE@ -GLIBCXX_C_HEADERS_COMPATIBILITY_FALSE = @GLIBCXX_C_HEADERS_COMPATIBILITY_FALSE@ -GLIBCXX_C_HEADERS_COMPATIBILITY_TRUE = @GLIBCXX_C_HEADERS_COMPATIBILITY_TRUE@ -GLIBCXX_C_HEADERS_C_FALSE = @GLIBCXX_C_HEADERS_C_FALSE@ -GLIBCXX_C_HEADERS_C_GLOBAL_FALSE = @GLIBCXX_C_HEADERS_C_GLOBAL_FALSE@ -GLIBCXX_C_HEADERS_C_GLOBAL_TRUE = @GLIBCXX_C_HEADERS_C_GLOBAL_TRUE@ -GLIBCXX_C_HEADERS_C_STD_FALSE = @GLIBCXX_C_HEADERS_C_STD_FALSE@ -GLIBCXX_C_HEADERS_C_STD_TRUE = @GLIBCXX_C_HEADERS_C_STD_TRUE@ -GLIBCXX_C_HEADERS_C_TRUE = @GLIBCXX_C_HEADERS_C_TRUE@ -GLIBCXX_C_HEADERS_EXTRA_FALSE = @GLIBCXX_C_HEADERS_EXTRA_FALSE@ -GLIBCXX_C_HEADERS_EXTRA_TRUE = @GLIBCXX_C_HEADERS_EXTRA_TRUE@ -GLIBCXX_HOSTED_FALSE = @GLIBCXX_HOSTED_FALSE@ -GLIBCXX_HOSTED_TRUE = @GLIBCXX_HOSTED_TRUE@ GLIBCXX_INCLUDES = @GLIBCXX_INCLUDES@ -GLIBCXX_LDBL_COMPAT_FALSE = @GLIBCXX_LDBL_COMPAT_FALSE@ -GLIBCXX_LDBL_COMPAT_TRUE = @GLIBCXX_LDBL_COMPAT_TRUE@ GREP = @GREP@ +INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ @@ -194,9 +164,8 @@ LN_S = @LN_S@ LTLIBICONV = @LTLIBICONV@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ -MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@ -MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@ MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ NM = @NM@ OBJEXT = @OBJEXT@ OPTIMIZE_CXXFLAGS = @OPTIMIZE_CXXFLAGS@ @@ -222,13 +191,13 @@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ WARN_FLAGS = @WARN_FLAGS@ WERROR = @WERROR@ -ac_ct_AR = @ac_ct_AR@ -ac_ct_AS = @ac_ct_AS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ -ac_ct_RANLIB = @ac_ct_RANLIB@ -ac_ct_STRIP = @ac_ct_STRIP@ am__leading_dot = @am__leading_dot@ am__tar = @am__tar@ am__untar = @am__untar@ @@ -239,8 +208,12 @@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ +builddir = @builddir@ check_msgfmt = @check_msgfmt@ datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ enable_shared = @enable_shared@ enable_static = @enable_static@ exec_prefix = @exec_prefix@ @@ -260,29 +233,36 @@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ +htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ libtool_VERSION = @libtool_VERSION@ +localedir = @localedir@ localstatedir = @localstatedir@ lt_ECHO = @lt_ECHO@ mandir = @mandir@ mkdir_p = @mkdir_p@ multi_basedir = @multi_basedir@ oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ port_specific_symbol_files = @port_specific_symbol_files@ prefix = @prefix@ program_transform_name = @program_transform_name@ +psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ toplevel_srcdir = @toplevel_srcdir@ # May be used by various substitution variables. @@ -305,7 +285,7 @@ WARN_CXXFLAGS = \ # -I/-D flags to pass when compiling. AM_CPPFLAGS = $(GLIBCXX_INCLUDES) -@GLIBCXX_HOSTED_TRUE@hosted_source = libmath src po testsuite +@GLIBCXX_HOSTED_TRUE@hosted_source = libmath doc src po testsuite SUBDIRS = include libsupc++ $(hosted_source) ACLOCAL_AMFLAGS = -I . -I .. -I ../config @@ -397,7 +377,7 @@ $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) config.h: stamp-h1 @if test ! -f $@; then \ rm -f stamp-h1; \ - $(MAKE) stamp-h1; \ + $(MAKE) $(AM_MAKEFLAGS) stamp-h1; \ else :; fi stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status @@ -438,7 +418,6 @@ distclean-multi: $(MULTICLEAN) $(AM_MAKEFLAGS) DO=distclean multi-clean # $(MAKE) maintainer-clean-multi: $(MULTICLEAN) $(AM_MAKEFLAGS) DO=maintainer-clean multi-clean # $(MAKE) -uninstall-info-am: # This directory's subdirectories are mostly independent; you can cd # into them and run `make' without going through this Makefile. @@ -471,8 +450,7 @@ $(RECURSIVE_TARGETS): $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" -mostlyclean-recursive clean-recursive distclean-recursive \ -maintainer-clean-recursive: +$(RECURSIVE_CLEAN_TARGETS): @failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ @@ -545,24 +523,22 @@ distclean-tags: distdir: $(DISTFILES) $(am__remove_distdir) - mkdir $(distdir) - $(mkdir_p) $(distdir)/.. $(distdir)/../config $(distdir)/scripts - @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ - topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ - list='$(DISTFILES)'; for file in $$list; do \ - case $$file in \ - $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ - $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ - esac; \ + test -d $(distdir) || mkdir $(distdir) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ - dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ - if test "$$dir" != "$$file" && test "$$dir" != "."; then \ - dir="/$$dir"; \ - $(mkdir_p) "$(distdir)$$dir"; \ - else \ - dir=''; \ - fi; \ if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ @@ -576,7 +552,7 @@ distdir: $(DISTFILES) list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test -d "$(distdir)/$$subdir" \ - || $(mkdir_p) "$(distdir)/$$subdir" \ + || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ distdir=`$(am__cd) $(distdir) && pwd`; \ top_distdir=`$(am__cd) $(top_distdir) && pwd`; \ @@ -584,6 +560,8 @@ distdir: $(DISTFILES) $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$top_distdir" \ distdir="$$distdir/$$subdir" \ + am__remove_distdir=: \ + am__skip_length_check=: \ distdir) \ || exit 1; \ fi; \ @@ -591,7 +569,7 @@ distdir: $(DISTFILES) -find $(distdir) -type d ! -perm -777 -exec chmod a+rwx {} \; -o \ ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ - ! -type d ! -perm -444 -exec $(SHELL) $(install_sh) -c -m a+r {} {} \; \ + ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \ || chmod -R a+r $(distdir) dist-gzip: distdir tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz @@ -666,7 +644,7 @@ distcheck: dist $(am__remove_distdir) @(echo "$(distdir) archives ready for distribution: "; \ list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ - sed -e '1{h;s/./=/g;p;x;}' -e '$${p;x;}' + sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x' distuninstallcheck: @cd $(distuninstallcheck_dir) \ && test `$(distuninstallcheck_listfiles) | wc -l` -le 1 \ @@ -736,12 +714,20 @@ info-am: install-data-am: +install-dvi: install-dvi-recursive + install-exec-am: install-multi +install-html: install-html-recursive + install-info: install-info-recursive install-man: +install-pdf: install-pdf-recursive + +install-ps: install-ps-recursive + installcheck-am: maintainer-clean: maintainer-clean-multi maintainer-clean-recursive @@ -762,67 +748,41 @@ ps: ps-recursive ps-am: -uninstall-am: uninstall-info-am - -uninstall-info: uninstall-info-recursive - -.PHONY: $(RECURSIVE_TARGETS) CTAGS GTAGS all all-am all-multi \ - am--refresh check check-am clean clean-generic clean-libtool \ - clean-multi clean-recursive ctags ctags-recursive dist \ - dist-all dist-bzip2 dist-gzip dist-shar dist-tarZ dist-zip \ - distcheck distclean distclean-generic distclean-hdr \ - distclean-libtool distclean-multi distclean-recursive \ - distclean-tags distcleancheck distdir distuninstallcheck dvi \ - dvi-am html html-am info info-am install install-am \ - install-data install-data-am install-exec install-exec-am \ - install-info install-info-am install-man install-multi \ - install-strip installcheck installcheck-am installdirs \ - installdirs-am maintainer-clean maintainer-clean-generic \ - maintainer-clean-multi maintainer-clean-recursive mostlyclean \ - mostlyclean-generic mostlyclean-libtool mostlyclean-multi \ - mostlyclean-recursive pdf pdf-am ps ps-am tags tags-recursive \ - uninstall uninstall-am uninstall-info-am - - -# These rules are messy, but are hella worth it. -doxygen: - -(srcdir=`cd ${top_srcdir}; ${PWD_COMMAND}`; \ - builddir=`${PWD_COMMAND}`; \ - ${SHELL} ${srcdir}/docs/doxygen/run_doxygen \ - --host_alias=${host_alias} \ - --mode=user $${srcdir} $${builddir}) - -doxygen-maint: - -(srcdir=`cd ${top_srcdir}; ${PWD_COMMAND}`; \ - builddir=`${PWD_COMMAND}`; \ - ${SHELL} ${srcdir}/docs/doxygen/run_doxygen \ - --host_alias=${host_alias} \ - --mode=maint $${srcdir} $${builddir}) - -doxygen-man: - -(srcdir=`cd ${top_srcdir}; ${PWD_COMMAND}`; \ - builddir=`${PWD_COMMAND}`; \ - ${SHELL} ${srcdir}/docs/doxygen/run_doxygen \ - --host_alias=${host_alias} \ - --mode=man $${srcdir} $${builddir}) - -.PHONY: doxygen doxygen-maint doxygen-man +uninstall-am: + +.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) all-multi \ + clean-multi distclean-multi install-am install-multi \ + install-strip maintainer-clean-multi mostlyclean-multi + +.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ + all all-am all-multi am--refresh check check-am clean \ + clean-generic clean-libtool clean-multi ctags ctags-recursive \ + dist dist-all dist-bzip2 dist-gzip dist-shar dist-tarZ \ + dist-zip distcheck distclean distclean-generic distclean-hdr \ + distclean-libtool distclean-multi distclean-tags \ + distcleancheck distdir distuninstallcheck dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-multi install-pdf \ + install-pdf-am install-ps install-ps-am install-strip \ + installcheck installcheck-am installdirs installdirs-am \ + maintainer-clean maintainer-clean-generic \ + maintainer-clean-multi mostlyclean mostlyclean-generic \ + mostlyclean-libtool mostlyclean-multi pdf pdf-am ps ps-am tags \ + tags-recursive uninstall uninstall-am + # Handy forwarding targets. check-%: cd testsuite && $(MAKE) $@ +doc-%: + cd doc && $(MAKE) $@ + # All the machinations with string instantiations messes up the # automake-generated TAGS rule. Make a simple one here. TAGS: tags-recursive $(LISP) - -# Installation of distribution html documentation not yet supported -# TODO: Write custom install-html rule. -.PHONY: install-html install-pdf -install-html: - -# No install-pdf support in automake yet -install-pdf: # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: diff --git a/libstdc++-v3/acinclude.m4 b/libstdc++-v3/acinclude.m4 index b85a2a8f1a3..c4ccb2a14c1 100644 --- a/libstdc++-v3/acinclude.m4 +++ b/libstdc++-v3/acinclude.m4 @@ -49,7 +49,7 @@ AC_DEFUN([GLIBCXX_CONFIGURE], [ # Keep these sync'd with the list in Makefile.am. The first provides an # expandable list at autoconf time; the second provides an expandable list # (i.e., shell variable) at configure time. - m4_define([glibcxx_SUBDIRS],[include libmath libsupc++ src po testsuite]) + m4_define([glibcxx_SUBDIRS],[include libmath libsupc++ src doc po testsuite]) SUBDIRS='glibcxx_SUBDIRS' # These need to be absolute paths, yet at the same time need to @@ -2547,8 +2547,6 @@ AC_DEFUN([GLIBCXX_ENABLE_THREADS], [ # be used in projects which are not available under the GNU Public License # but which still want to provide support for the GNU gettext functionality. # Please note that the actual code is *not* freely available. - -# serial 1 AC_DEFUN([AC_LC_MESSAGES], [ AC_CHECK_HEADER(locale.h, [ AC_CACHE_CHECK([for LC_MESSAGES], ac_cv_val_LC_MESSAGES, diff --git a/libstdc++-v3/aclocal.m4 b/libstdc++-v3/aclocal.m4 index baabee6eb6a..552822f13ed 100644 --- a/libstdc++-v3/aclocal.m4 +++ b/libstdc++-v3/aclocal.m4 @@ -1,7 +1,7 @@ -# generated automatically by aclocal 1.9.6 -*- Autoconf -*- +# generated automatically by aclocal 1.10 -*- Autoconf -*- # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, -# 2005 Free Software Foundation, Inc. +# 2005, 2006 Free Software Foundation, Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. @@ -11,7 +11,12 @@ # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. -# Copyright (C) 2002, 2003, 2005 Free Software Foundation, Inc. +m4_if(m4_PACKAGE_VERSION, [2.61],, +[m4_fatal([this file was generated for autoconf 2.61. +You have another version of autoconf. If you want to use that, +you should regenerate the build system entirely.], [63])]) + +# Copyright (C) 2002, 2003, 2005, 2006 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -21,14 +26,29 @@ # ---------------------------- # Automake X.Y traces this macro to ensure aclocal.m4 has been # generated from the m4 files accompanying Automake X.Y. -AC_DEFUN([AM_AUTOMAKE_VERSION], [am__api_version="1.9"]) +# (This private macro should not be called outside this file.) +AC_DEFUN([AM_AUTOMAKE_VERSION], +[am__api_version='1.10' +dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to +dnl require some minimum version. Point them to the right macro. +m4_if([$1], [1.10], [], + [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl +]) + +# _AM_AUTOCONF_VERSION(VERSION) +# ----------------------------- +# aclocal traces this macro to find the Autoconf version. +# This is a private macro too. Using m4_define simplifies +# the logic in aclocal, which can simply ignore this definition. +m4_define([_AM_AUTOCONF_VERSION], []) # AM_SET_CURRENT_AUTOMAKE_VERSION # ------------------------------- -# Call AM_AUTOMAKE_VERSION so it can be traced. +# Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced. # This function is AC_REQUIREd by AC_INIT_AUTOMAKE. AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], - [AM_AUTOMAKE_VERSION([1.9.6])]) +[AM_AUTOMAKE_VERSION([1.10])dnl +_AM_AUTOCONF_VERSION(m4_PACKAGE_VERSION)]) # AM_AUX_DIR_EXPAND -*- Autoconf -*- @@ -85,14 +105,14 @@ am_aux_dir=`cd $ac_aux_dir && pwd` # AM_CONDITIONAL -*- Autoconf -*- -# Copyright (C) 1997, 2000, 2001, 2003, 2004, 2005 +# Copyright (C) 1997, 2000, 2001, 2003, 2004, 2005, 2006 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. -# serial 7 +# serial 8 # AM_CONDITIONAL(NAME, SHELL-CONDITION) # ------------------------------------- @@ -101,8 +121,10 @@ AC_DEFUN([AM_CONDITIONAL], [AC_PREREQ(2.52)dnl ifelse([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl -AC_SUBST([$1_TRUE]) -AC_SUBST([$1_FALSE]) +AC_SUBST([$1_TRUE])dnl +AC_SUBST([$1_FALSE])dnl +_AM_SUBST_NOTMAKE([$1_TRUE])dnl +_AM_SUBST_NOTMAKE([$1_FALSE])dnl if $2; then $1_TRUE= $1_FALSE='#' @@ -118,8 +140,8 @@ fi])]) # Do all the work for Automake. -*- Autoconf -*- -# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 -# Free Software Foundation, Inc. +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, +# 2005, 2006 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -142,16 +164,20 @@ fi])]) # arguments mandatory, and then we can depend on a new Autoconf # release and drop the old call support. AC_DEFUN([AM_INIT_AUTOMAKE], -[AC_PREREQ([2.58])dnl +[AC_PREREQ([2.60])dnl dnl Autoconf wants to disallow AM_ names. We explicitly allow dnl the ones we care about. m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl AC_REQUIRE([AC_PROG_INSTALL])dnl -# test to see if srcdir already configured -if test "`cd $srcdir && pwd`" != "`pwd`" && - test -f $srcdir/config.status; then - AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) +if test "`cd $srcdir && pwd`" != "`pwd`"; then + # Use -I$(srcdir) only when $(srcdir) != ., so that make's output + # is not polluted with repeated "-I." + AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl + # test to see if srcdir already configured + if test -f $srcdir/config.status; then + AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) + fi fi # test whether we have cygpath @@ -171,6 +197,9 @@ m4_ifval([$2], AC_SUBST([PACKAGE], [$1])dnl AC_SUBST([VERSION], [$2])], [_AM_SET_OPTIONS([$1])dnl +dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT. +m4_if(m4_ifdef([AC_PACKAGE_NAME], 1)m4_ifdef([AC_PACKAGE_VERSION], 1), 11,, + [m4_fatal([AC_INIT should be called with package and version arguments])])dnl AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl @@ -206,6 +235,10 @@ AC_PROVIDE_IFELSE([AC_PROG_CXX], [_AM_DEPENDENCIES(CXX)], [define([AC_PROG_CXX], defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl +AC_PROVIDE_IFELSE([AC_PROG_OBJC], + [_AM_DEPENDENCIES(OBJC)], + [define([AC_PROG_OBJC], + defn([AC_PROG_OBJC])[_AM_DEPENDENCIES(OBJC)])])dnl ]) ]) @@ -241,7 +274,7 @@ echo "timestamp for $1" >`AS_DIRNAME([$1])`/stamp-h[]$_am_stamp_count]) # Define $install_sh. AC_DEFUN([AM_PROG_INSTALL_SH], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl -install_sh=${install_sh-"$am_aux_dir/install-sh"} +install_sh=${install_sh-"\$(SHELL) $am_aux_dir/install-sh"} AC_SUBST(install_sh)]) # Add --enable-maintainer-mode option to configure. -*- Autoconf -*- @@ -275,14 +308,14 @@ AU_DEFUN([jm_MAINTAINER_MODE], [AM_MAINTAINER_MODE]) # Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- -# Copyright (C) 1997, 1999, 2000, 2001, 2003, 2005 +# Copyright (C) 1997, 1999, 2000, 2001, 2003, 2004, 2005 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. -# serial 4 +# serial 5 # AM_MISSING_PROG(NAME, PROGRAM) # ------------------------------ @@ -298,6 +331,7 @@ AC_SUBST($1)]) # If it does, set am_missing_run to use it, otherwise, to nothing. AC_DEFUN([AM_MISSING_HAS_RUN], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +AC_REQUIRE_AUX_FILE([missing])dnl test x"${MISSING+set}" = xset || MISSING="\${SHELL} $am_aux_dir/missing" # Use eval to expand $SHELL if eval "$MISSING --run true"; then @@ -308,7 +342,7 @@ else fi ]) -# Copyright (C) 2003, 2004, 2005 Free Software Foundation, Inc. +# Copyright (C) 2003, 2004, 2005, 2006 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -316,60 +350,23 @@ fi # AM_PROG_MKDIR_P # --------------- -# Check whether `mkdir -p' is supported, fallback to mkinstalldirs otherwise. -# -# Automake 1.8 used `mkdir -m 0755 -p --' to ensure that directories -# created by `make install' are always world readable, even if the -# installer happens to have an overly restrictive umask (e.g. 077). -# This was a mistake. There are at least two reasons why we must not -# use `-m 0755': -# - it causes special bits like SGID to be ignored, -# - it may be too restrictive (some setups expect 775 directories). -# -# Do not use -m 0755 and let people choose whatever they expect by -# setting umask. -# -# We cannot accept any implementation of `mkdir' that recognizes `-p'. -# Some implementations (such as Solaris 8's) are not thread-safe: if a -# parallel make tries to run `mkdir -p a/b' and `mkdir -p a/c' -# concurrently, both version can detect that a/ is missing, but only -# one can create it and the other will error out. Consequently we -# restrict ourselves to GNU make (using the --version option ensures -# this.) +# Check for `mkdir -p'. AC_DEFUN([AM_PROG_MKDIR_P], -[if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then - # We used to keeping the `.' as first argument, in order to - # allow $(mkdir_p) to be used without argument. As in - # $(mkdir_p) $(somedir) - # where $(somedir) is conditionally defined. However this is wrong - # for two reasons: - # 1. if the package is installed by a user who cannot write `.' - # make install will fail, - # 2. the above comment should most certainly read - # $(mkdir_p) $(DESTDIR)$(somedir) - # so it does not work when $(somedir) is undefined and - # $(DESTDIR) is not. - # To support the latter case, we have to write - # test -z "$(somedir)" || $(mkdir_p) $(DESTDIR)$(somedir), - # so the `.' trick is pointless. - mkdir_p='mkdir -p --' -else - # On NextStep and OpenStep, the `mkdir' command does not - # recognize any option. It will interpret all options as - # directories to create, and then abort because `.' already - # exists. - for d in ./-p ./--version; - do - test -d $d && rmdir $d - done - # $(mkinstalldirs) is defined by Automake if mkinstalldirs exists. - if test -f "$ac_aux_dir/mkinstalldirs"; then - mkdir_p='$(mkinstalldirs)' - else - mkdir_p='$(install_sh) -d' - fi -fi -AC_SUBST([mkdir_p])]) +[AC_PREREQ([2.60])dnl +AC_REQUIRE([AC_PROG_MKDIR_P])dnl +dnl Automake 1.8 to 1.9.6 used to define mkdir_p. We now use MKDIR_P, +dnl while keeping a definition of mkdir_p for backward compatibility. +dnl @MKDIR_P@ is magic: AC_OUTPUT adjusts its value for each Makefile. +dnl However we cannot define mkdir_p as $(MKDIR_P) for the sake of +dnl Makefile.ins that do not define MKDIR_P, so we do our own +dnl adjustment using top_builddir (which is defined more often than +dnl MKDIR_P). +AC_SUBST([mkdir_p], ["$MKDIR_P"])dnl +case $mkdir_p in + [[\\/$]]* | ?:[[\\/]]*) ;; + */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; +esac +]) # Helper functions for option handling. -*- Autoconf -*- @@ -481,9 +478,21 @@ dnl Don't test for $cross_compiling = yes, because it might be `maybe'. if test "$cross_compiling" != no; then AC_CHECK_TOOL([STRIP], [strip], :) fi -INSTALL_STRIP_PROGRAM="\${SHELL} \$(install_sh) -c -s" +INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" AC_SUBST([INSTALL_STRIP_PROGRAM])]) +# Copyright (C) 2006 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# _AM_SUBST_NOTMAKE(VARIABLE) +# --------------------------- +# Prevent Automake from outputing VARIABLE = @VARIABLE@ in Makefile.in. +# This macro is traced by Automake. +AC_DEFUN([_AM_SUBST_NOTMAKE]) + # Check how to create a tarball. -*- Autoconf -*- # Copyright (C) 2004, 2005 Free Software Foundation, Inc. diff --git a/libstdc++-v3/config.h.in b/libstdc++-v3/config.h.in index f25ab541dff..4113e0bb940 100644 --- a/libstdc++-v3/config.h.in +++ b/libstdc++-v3/config.h.in @@ -147,6 +147,9 @@ /* Define to 1 if you have the `frexpl' function. */ #undef HAVE_FREXPL +/* Define to 1 if you have the header file. */ +#undef HAVE_GCONF_H + /* Define to 1 if you have the header file. */ #undef HAVE_GCONV_H diff --git a/libstdc++-v3/configure b/libstdc++-v3/configure index 7bc0f068a4d..8a3ef8084df 100755 --- a/libstdc++-v3/configure +++ b/libstdc++-v3/configure @@ -1,25 +1,54 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.59 for package-unused version-unused. +# Generated by GNU Autoconf 2.61 for package-unused version-unused. # -# Copyright (C) 2003 Free Software Foundation, Inc. +# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, +# 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc. # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## --------------------- ## ## M4sh Initialization. ## ## --------------------- ## -# Be Bourne compatible +# Be more Bourne compatible +DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' -elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then - set -o posix + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in + *posix*) set -o posix ;; +esac + +fi + + + + +# PATH needs CR +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + echo "#! /bin/sh" >conf$$.sh + echo "exit 0" >>conf$$.sh + chmod +x conf$$.sh + if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then + PATH_SEPARATOR=';' + else + PATH_SEPARATOR=: + fi + rm -f conf$$.sh fi -DUALCASE=1; export DUALCASE # for MKS sh # Support unset when possible. if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then @@ -29,8 +58,43 @@ else fi +# IFS +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent editors from complaining about space-tab. +# (If _AS_PATH_WALK were called with IFS unset, it would disable word +# splitting by setting IFS to empty value.) +as_nl=' +' +IFS=" "" $as_nl" + +# Find who we are. Look in the path if we contain no directory separator. +case $0 in + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break +done +IFS=$as_save_IFS + + ;; +esac +# We did not find ourselves, most probably we were run as `sh COMMAND' +# in which case we are not to be found in the path. +if test "x$as_myself" = x; then + as_myself=$0 +fi +if test ! -f "$as_myself"; then + echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + { (exit 1); exit 1; } +fi + # Work around bugs in pre-3.0 UWIN ksh. -$as_unset ENV MAIL MAILPATH +for as_var in ENV MAIL MAILPATH +do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var +done PS1='$ ' PS2='> ' PS4='+ ' @@ -44,18 +108,19 @@ do if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then eval $as_var=C; export $as_var else - $as_unset $as_var + ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var fi done # Required to use basename. -if expr a : '\(a\)' >/dev/null 2>&1; then +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi -if (basename /) >/dev/null 2>&1 && test "X`basename / 2>&1`" = "X/"; then +if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false @@ -63,157 +128,388 @@ fi # Name of the executable. -as_me=`$as_basename "$0" || +as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ - X"$0" : 'X\(/\)$' \| \ - . : '\(.\)' 2>/dev/null || + X"$0" : 'X\(/\)' \| . 2>/dev/null || echo X/"$0" | - sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; } - /^X\/\(\/\/\)$/{ s//\1/; q; } - /^X\/\(\/\).*/{ s//\1/; q; } - s/.*/./; q'` + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` +# CDPATH. +$as_unset CDPATH -# PATH needs CR, and LINENO needs CR and PATH. -# Avoid depending upon Character Ranges. -as_cr_letters='abcdefghijklmnopqrstuvwxyz' -as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' -as_cr_Letters=$as_cr_letters$as_cr_LETTERS -as_cr_digits='0123456789' -as_cr_alnum=$as_cr_Letters$as_cr_digits -# The user is always right. -if test "${PATH_SEPARATOR+set}" != set; then - echo "#! /bin/sh" >conf$$.sh - echo "exit 0" >>conf$$.sh - chmod +x conf$$.sh - if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then - PATH_SEPARATOR=';' - else - PATH_SEPARATOR=: - fi - rm -f conf$$.sh +if test "x$CONFIG_SHELL" = x; then + if (eval ":") 2>/dev/null; then + as_have_required=yes +else + as_have_required=no fi + if test $as_have_required = yes && (eval ": +(as_func_return () { + (exit \$1) +} +as_func_success () { + as_func_return 0 +} +as_func_failure () { + as_func_return 1 +} +as_func_ret_success () { + return 0 +} +as_func_ret_failure () { + return 1 +} - as_lineno_1=$LINENO - as_lineno_2=$LINENO - as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` - test "x$as_lineno_1" != "x$as_lineno_2" && - test "x$as_lineno_3" = "x$as_lineno_2" || { - # Find who we are. Look in the path if we contain no path at all - # relative or not. - case $0 in - *[\\/]* ) as_myself=$0 ;; - *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break -done +exitcode=0 +if as_func_success; then + : +else + exitcode=1 + echo as_func_success failed. +fi - ;; - esac - # We did not find ourselves, most probably we were run as `sh COMMAND' - # in which case we are not to be found in the path. - if test "x$as_myself" = x; then - as_myself=$0 - fi - if test ! -f "$as_myself"; then - { echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2 - { (exit 1); exit 1; }; } - fi - case $CONFIG_SHELL in - '') +if as_func_failure; then + exitcode=1 + echo as_func_failure succeeded. +fi + +if as_func_ret_success; then + : +else + exitcode=1 + echo as_func_ret_success failed. +fi + +if as_func_ret_failure; then + exitcode=1 + echo as_func_ret_failure succeeded. +fi + +if ( set x; as_func_ret_success y && test x = \"\$1\" ); then + : +else + exitcode=1 + echo positional parameters were not saved. +fi + +test \$exitcode = 0) || { (exit 1); exit 1; } + +( + as_lineno_1=\$LINENO + as_lineno_2=\$LINENO + test \"x\$as_lineno_1\" != \"x\$as_lineno_2\" && + test \"x\`expr \$as_lineno_1 + 1\`\" = \"x\$as_lineno_2\") || { (exit 1); exit 1; } +") 2> /dev/null; then + : +else + as_candidate_shells= as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for as_base in sh bash ksh sh5; do - case $as_dir in + case $as_dir in /*) - if ("$as_dir/$as_base" -c ' + for as_base in sh bash ksh sh5; do + as_candidate_shells="$as_candidate_shells $as_dir/$as_base" + done;; + esac +done +IFS=$as_save_IFS + + + for as_shell in $as_candidate_shells $SHELL; do + # Try only shells that exist, to save several forks. + if { test -f "$as_shell" || test -f "$as_shell.exe"; } && + { ("$as_shell") 2> /dev/null <<\_ASEOF +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then + emulate sh + NULLCMD=: + # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in + *posix*) set -o posix ;; +esac + +fi + + +: +_ASEOF +}; then + CONFIG_SHELL=$as_shell + as_have_required=yes + if { "$as_shell" 2> /dev/null <<\_ASEOF +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then + emulate sh + NULLCMD=: + # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in + *posix*) set -o posix ;; +esac + +fi + + +: +(as_func_return () { + (exit $1) +} +as_func_success () { + as_func_return 0 +} +as_func_failure () { + as_func_return 1 +} +as_func_ret_success () { + return 0 +} +as_func_ret_failure () { + return 1 +} + +exitcode=0 +if as_func_success; then + : +else + exitcode=1 + echo as_func_success failed. +fi + +if as_func_failure; then + exitcode=1 + echo as_func_failure succeeded. +fi + +if as_func_ret_success; then + : +else + exitcode=1 + echo as_func_ret_success failed. +fi + +if as_func_ret_failure; then + exitcode=1 + echo as_func_ret_failure succeeded. +fi + +if ( set x; as_func_ret_success y && test x = "$1" ); then + : +else + exitcode=1 + echo positional parameters were not saved. +fi + +test $exitcode = 0) || { (exit 1); exit 1; } + +( as_lineno_1=$LINENO as_lineno_2=$LINENO - as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` test "x$as_lineno_1" != "x$as_lineno_2" && - test "x$as_lineno_3" = "x$as_lineno_2" ') 2>/dev/null; then - $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; } - $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; } - CONFIG_SHELL=$as_dir/$as_base - export CONFIG_SHELL - exec "$CONFIG_SHELL" "$0" ${1+"$@"} - fi;; - esac - done -done -;; - esac + test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2") || { (exit 1); exit 1; } + +_ASEOF +}; then + break +fi + +fi + + done + + if test "x$CONFIG_SHELL" != x; then + for as_var in BASH_ENV ENV + do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var + done + export CONFIG_SHELL + exec "$CONFIG_SHELL" "$as_myself" ${1+"$@"} +fi + + + if test $as_have_required = no; then + echo This script requires a shell more modern than all the + echo shells that I found on your system. Please install a + echo modern shell, or manually run the script under such a + echo shell if you do have one. + { (exit 1); exit 1; } +fi + + +fi + +fi + + + +(eval "as_func_return () { + (exit \$1) +} +as_func_success () { + as_func_return 0 +} +as_func_failure () { + as_func_return 1 +} +as_func_ret_success () { + return 0 +} +as_func_ret_failure () { + return 1 +} + +exitcode=0 +if as_func_success; then + : +else + exitcode=1 + echo as_func_success failed. +fi + +if as_func_failure; then + exitcode=1 + echo as_func_failure succeeded. +fi + +if as_func_ret_success; then + : +else + exitcode=1 + echo as_func_ret_success failed. +fi + +if as_func_ret_failure; then + exitcode=1 + echo as_func_ret_failure succeeded. +fi + +if ( set x; as_func_ret_success y && test x = \"\$1\" ); then + : +else + exitcode=1 + echo positional parameters were not saved. +fi + +test \$exitcode = 0") || { + echo No shell found that supports shell functions. + echo Please tell autoconf@gnu.org about your system, + echo including any error possibly output before this + echo message +} + + + + as_lineno_1=$LINENO + as_lineno_2=$LINENO + test "x$as_lineno_1" != "x$as_lineno_2" && + test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || { # Create $as_me.lineno as a copy of $as_myself, but with $LINENO # uniformly replaced by the line number. The first 'sed' inserts a - # line-number line before each line; the second 'sed' does the real - # work. The second script uses 'N' to pair each line-number line - # with the numbered line, and appends trailing '-' during - # substitution so that $LINENO is not a special case at line end. + # line-number line after each line using $LINENO; the second 'sed' + # does the real work. The second script uses 'N' to pair each + # line-number line with the line containing $LINENO, and appends + # trailing '-' during substitution so that $LINENO is not a special + # case at line end. # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the - # second 'sed' script. Blame Lee E. McMahon for sed's syntax. :-) - sed '=' <$as_myself | + # scripts with optimization help from Paolo Bonzini. Blame Lee + # E. McMahon (1931-1989) for sed's syntax. :-) + sed -n ' + p + /[$]LINENO/= + ' <$as_myself | sed ' + s/[$]LINENO.*/&-/ + t lineno + b + :lineno N - s,$,-, - : loop - s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3, + :loop + s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop - s,-$,, - s,^['$as_cr_digits']*\n,, + s/-\n.*// ' >$as_me.lineno && - chmod +x $as_me.lineno || + chmod +x "$as_me.lineno" || { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2 { (exit 1); exit 1; }; } # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the - # original and so on. Autoconf is especially sensible to this). - . ./$as_me.lineno + # original and so on. Autoconf is especially sensitive to this). + . "./$as_me.lineno" # Exit status is that of the last command. exit } -case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in - *c*,-n*) ECHO_N= ECHO_C=' -' ECHO_T=' ' ;; - *c*,* ) ECHO_N=-n ECHO_C= ECHO_T= ;; - *) ECHO_N= ECHO_C='\c' ECHO_T= ;; +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in +-n*) + case `echo 'x\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + *) ECHO_C='\c';; + esac;; +*) + ECHO_N='-n';; esac -if expr a : '\(a\)' >/dev/null 2>&1; then +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi rm -f conf$$ conf$$.exe conf$$.file +if test -d conf$$.dir; then + rm -f conf$$.dir/conf$$.file +else + rm -f conf$$.dir + mkdir conf$$.dir +fi echo >conf$$.file if ln -s conf$$.file conf$$ 2>/dev/null; then - # We could just check for DJGPP; but this test a) works b) is more generic - # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04). - if test -f conf$$.exe; then - # Don't use ln at all; we don't have any links + as_ln_s='ln -s' + # ... but there are two gotchas: + # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. + # In both cases, we have to default to `cp -p'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -p' - else - as_ln_s='ln -s' - fi elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -p' fi -rm -f conf$$ conf$$.exe conf$$.file +rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file +rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p=: @@ -222,7 +518,28 @@ else as_mkdir_p=false fi -as_executable_p="test -f" +if test -x / >/dev/null 2>&1; then + as_test_x='test -x' +else + if ls -dL / >/dev/null 2>&1; then + as_ls_L_option=L + else + as_ls_L_option= + fi + as_test_x=' + eval sh -c '\'' + if test -d "$1"; then + test -d "$1/."; + else + case $1 in + -*)set "./$1";; + esac; + case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in + ???[sx]*):;;*)false;;esac;fi + '\'' sh + ' +fi +as_executable_p=$as_test_x # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" @@ -231,15 +548,6 @@ as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" -# IFS -# We need space, tab and new line, in precisely that order. -as_nl=' -' -IFS=" $as_nl" - -# CDPATH. -$as_unset CDPATH - # Check that we are running under the correct shell. @@ -390,29 +698,26 @@ fi +exec 7<&0 &1 + # Name of the host. # hostname on some systems (SVR3.2, Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` -exec 6>&1 - # # Initializations. # ac_default_prefix=/usr/local +ac_clean_files= ac_config_libobj_dir=. +LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= SHELL=${CONFIG_SHELL-/bin/sh} -# Maximum number of lines to put in a shell here document. -# This variable seems obsolete. It should probably be removed, and -# only ac_max_sed_lines should be used. -: ${ac_max_here_lines=38} - # Identity of this package. PACKAGE_NAME='package-unused' PACKAGE_TARNAME='libstdc++' @@ -424,42 +729,244 @@ ac_unique_file="src/ios.cc" # Factoring default headers for most tests. ac_includes_default="\ #include -#if HAVE_SYS_TYPES_H +#ifdef HAVE_SYS_TYPES_H # include #endif -#if HAVE_SYS_STAT_H +#ifdef HAVE_SYS_STAT_H # include #endif -#if STDC_HEADERS +#ifdef STDC_HEADERS # include # include #else -# if HAVE_STDLIB_H +# ifdef HAVE_STDLIB_H # include # endif #endif -#if HAVE_STRING_H -# if !STDC_HEADERS && HAVE_MEMORY_H +#ifdef HAVE_STRING_H +# if !defined STDC_HEADERS && defined HAVE_MEMORY_H # include # endif # include #endif -#if HAVE_STRINGS_H +#ifdef HAVE_STRINGS_H # include #endif -#if HAVE_INTTYPES_H +#ifdef HAVE_INTTYPES_H # include -#else -# if HAVE_STDINT_H -# include -# endif #endif -#if HAVE_UNISTD_H +#ifdef HAVE_STDINT_H +# include +#endif +#ifdef HAVE_UNISTD_H # include #endif" -ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS libtool_VERSION multi_basedir build build_cpu build_vendor build_os host host_cpu host_vendor host_os target target_cpu target_vendor target_os INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA CYGPATH_W PACKAGE VERSION ACLOCAL AUTOCONF AUTOMAKE AUTOHEADER MAKEINFO install_sh STRIP ac_ct_STRIP INSTALL_STRIP_PROGRAM mkdir_p AWK SET_MAKE am__leading_dot AMTAR am__tar am__untar glibcxx_builddir glibcxx_srcdir toplevel_srcdir CC ac_ct_CC EXEEXT OBJEXT CXX ac_ct_CXX CFLAGS CXXFLAGS LN_S AS ac_ct_AS AR ac_ct_AR RANLIB ac_ct_RANLIB MAINTAINER_MODE_TRUE MAINTAINER_MODE_FALSE MAINT CPP CPPFLAGS EGREP LIBTOOL SED FGREP GREP LD DUMPBIN ac_ct_DUMPBIN NM lt_ECHO LDFLAGS CXXCPP enable_shared enable_static GLIBCXX_HOSTED_TRUE GLIBCXX_HOSTED_FALSE GLIBCXX_BUILD_PCH_TRUE GLIBCXX_BUILD_PCH_FALSE glibcxx_PCHFLAGS CSTDIO_H BASIC_FILE_H BASIC_FILE_CC check_msgfmt glibcxx_MOFILES glibcxx_POFILES glibcxx_localedir USE_NLS CLOCALE_H CMESSAGES_H CCODECVT_CC CCOLLATE_CC CCTYPE_CC CMESSAGES_CC CMONEY_CC CNUMERIC_CC CTIME_H CTIME_CC CLOCALE_CC CLOCALE_INTERNAL_H ALLOCATOR_H ALLOCATOR_NAME C_INCLUDE_DIR GLIBCXX_C_HEADERS_C_TRUE GLIBCXX_C_HEADERS_C_FALSE GLIBCXX_C_HEADERS_C_STD_TRUE GLIBCXX_C_HEADERS_C_STD_FALSE GLIBCXX_C_HEADERS_C_GLOBAL_TRUE GLIBCXX_C_HEADERS_C_GLOBAL_FALSE GLIBCXX_C_HEADERS_COMPATIBILITY_TRUE GLIBCXX_C_HEADERS_COMPATIBILITY_FALSE GLIBCXX_C_HEADERS_EXTRA_TRUE GLIBCXX_C_HEADERS_EXTRA_FALSE DEBUG_FLAGS GLIBCXX_BUILD_DEBUG_TRUE GLIBCXX_BUILD_DEBUG_FALSE ENABLE_PARALLEL_TRUE ENABLE_PARALLEL_FALSE EXTRA_CXX_FLAGS glibcxx_thread_h WERROR SECTION_FLAGS SECTION_LDFLAGS OPT_LDFLAGS LIBMATHOBJS LIBICONV LTLIBICONV SYMVER_FILE port_specific_symbol_files ENABLE_SYMVERS_TRUE ENABLE_SYMVERS_FALSE ENABLE_SYMVERS_GNU_TRUE ENABLE_SYMVERS_GNU_FALSE ENABLE_SYMVERS_GNU_NAMESPACE_TRUE ENABLE_SYMVERS_GNU_NAMESPACE_FALSE ENABLE_SYMVERS_DARWIN_TRUE ENABLE_SYMVERS_DARWIN_FALSE ENABLE_VISIBILITY_TRUE ENABLE_VISIBILITY_FALSE GLIBCXX_LDBL_COMPAT_TRUE GLIBCXX_LDBL_COMPAT_FALSE baseline_dir ATOMICITY_SRCDIR ATOMIC_WORD_SRCDIR ATOMIC_FLAGS CPU_DEFINES_SRCDIR ABI_TWEAKS_SRCDIR OS_INC_SRCDIR ERROR_CONSTANTS_SRCDIR glibcxx_prefixdir gxx_include_dir glibcxx_toolexecdir glibcxx_toolexeclibdir GLIBCXX_INCLUDES TOPLEVEL_INCLUDES OPTIMIZE_CXXFLAGS WARN_FLAGS LIBSUPCXX_PICFLAGS LIBOBJS LTLIBOBJS' +ac_subst_vars='SHELL +PATH_SEPARATOR +PACKAGE_NAME +PACKAGE_TARNAME +PACKAGE_VERSION +PACKAGE_STRING +PACKAGE_BUGREPORT +exec_prefix +prefix +program_transform_name +bindir +sbindir +libexecdir +datarootdir +datadir +sysconfdir +sharedstatedir +localstatedir +includedir +oldincludedir +docdir +infodir +htmldir +dvidir +pdfdir +psdir +libdir +localedir +mandir +DEFS +ECHO_C +ECHO_N +ECHO_T +LIBS +build_alias +host_alias +target_alias +libtool_VERSION +multi_basedir +build +build_cpu +build_vendor +build_os +host +host_cpu +host_vendor +host_os +target +target_cpu +target_vendor +target_os +INSTALL_PROGRAM +INSTALL_SCRIPT +INSTALL_DATA +am__isrc +CYGPATH_W +PACKAGE +VERSION +ACLOCAL +AUTOCONF +AUTOMAKE +AUTOHEADER +MAKEINFO +install_sh +STRIP +INSTALL_STRIP_PROGRAM +mkdir_p +AWK +SET_MAKE +am__leading_dot +AMTAR +am__tar +am__untar +glibcxx_builddir +glibcxx_srcdir +toplevel_srcdir +CC +CFLAGS +LDFLAGS +CPPFLAGS +ac_ct_CC +EXEEXT +OBJEXT +CXX +CXXFLAGS +ac_ct_CXX +LN_S +AS +AR +RANLIB +MAINTAINER_MODE_TRUE +MAINTAINER_MODE_FALSE +MAINT +CPP +GREP +EGREP +LIBTOOL +SED +FGREP +LD +DUMPBIN +ac_ct_DUMPBIN +NM +lt_ECHO +CXXCPP +enable_shared +enable_static +GLIBCXX_HOSTED_TRUE +GLIBCXX_HOSTED_FALSE +GLIBCXX_BUILD_PCH_TRUE +GLIBCXX_BUILD_PCH_FALSE +glibcxx_PCHFLAGS +CSTDIO_H +BASIC_FILE_H +BASIC_FILE_CC +check_msgfmt +glibcxx_MOFILES +glibcxx_POFILES +glibcxx_localedir +USE_NLS +CLOCALE_H +CMESSAGES_H +CCODECVT_CC +CCOLLATE_CC +CCTYPE_CC +CMESSAGES_CC +CMONEY_CC +CNUMERIC_CC +CTIME_H +CTIME_CC +CLOCALE_CC +CLOCALE_INTERNAL_H +ALLOCATOR_H +ALLOCATOR_NAME +C_INCLUDE_DIR +GLIBCXX_C_HEADERS_C_TRUE +GLIBCXX_C_HEADERS_C_FALSE +GLIBCXX_C_HEADERS_C_STD_TRUE +GLIBCXX_C_HEADERS_C_STD_FALSE +GLIBCXX_C_HEADERS_C_GLOBAL_TRUE +GLIBCXX_C_HEADERS_C_GLOBAL_FALSE +GLIBCXX_C_HEADERS_COMPATIBILITY_TRUE +GLIBCXX_C_HEADERS_COMPATIBILITY_FALSE +GLIBCXX_C_HEADERS_EXTRA_TRUE +GLIBCXX_C_HEADERS_EXTRA_FALSE +DEBUG_FLAGS +GLIBCXX_BUILD_DEBUG_TRUE +GLIBCXX_BUILD_DEBUG_FALSE +ENABLE_PARALLEL_TRUE +ENABLE_PARALLEL_FALSE +EXTRA_CXX_FLAGS +glibcxx_thread_h +WERROR +SECTION_FLAGS +SECTION_LDFLAGS +OPT_LDFLAGS +LIBMATHOBJS +LIBICONV +LTLIBICONV +SYMVER_FILE +port_specific_symbol_files +ENABLE_SYMVERS_TRUE +ENABLE_SYMVERS_FALSE +ENABLE_SYMVERS_GNU_TRUE +ENABLE_SYMVERS_GNU_FALSE +ENABLE_SYMVERS_GNU_NAMESPACE_TRUE +ENABLE_SYMVERS_GNU_NAMESPACE_FALSE +ENABLE_SYMVERS_DARWIN_TRUE +ENABLE_SYMVERS_DARWIN_FALSE +ENABLE_VISIBILITY_TRUE +ENABLE_VISIBILITY_FALSE +GLIBCXX_LDBL_COMPAT_TRUE +GLIBCXX_LDBL_COMPAT_FALSE +baseline_dir +ATOMICITY_SRCDIR +ATOMIC_WORD_SRCDIR +ATOMIC_FLAGS +CPU_DEFINES_SRCDIR +ABI_TWEAKS_SRCDIR +OS_INC_SRCDIR +ERROR_CONSTANTS_SRCDIR +glibcxx_prefixdir +gxx_include_dir +glibcxx_toolexecdir +glibcxx_toolexeclibdir +GLIBCXX_INCLUDES +TOPLEVEL_INCLUDES +OPTIMIZE_CXXFLAGS +WARN_FLAGS +LIBSUPCXX_PICFLAGS +LIBOBJS +LTLIBOBJS' ac_subst_files='' + ac_precious_vars='build_alias +host_alias +target_alias +CPP +CPPFLAGS +CXX +CXXFLAGS +LDFLAGS +LIBS +CCC +CXXCPP' + # Initialize some variables set by options. ac_init_help= @@ -486,34 +993,48 @@ x_libraries=NONE # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. +# (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' -datadir='${prefix}/share' +datarootdir='${prefix}/share' +datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' -libdir='${exec_prefix}/lib' includedir='${prefix}/include' oldincludedir='/usr/include' -infodir='${prefix}/info' -mandir='${prefix}/man' +docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' +infodir='${datarootdir}/info' +htmldir='${docdir}' +dvidir='${docdir}' +pdfdir='${docdir}' +psdir='${docdir}' +libdir='${exec_prefix}/lib' +localedir='${datarootdir}/locale' +mandir='${datarootdir}/man' ac_prev= +ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then - eval "$ac_prev=\$ac_option" + eval $ac_prev=\$ac_option ac_prev= continue fi - ac_optarg=`expr "x$ac_option" : 'x[^=]*=\(.*\)'` + case $ac_option in + *=*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; + *) ac_optarg=yes ;; + esac # Accept the important Cygnus configure options, so we can diagnose typos. - case $ac_option in + case $ac_dashdash$ac_option in + --) + ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; @@ -535,33 +1056,45 @@ do --config-cache | -C) cache_file=config.cache ;; - -datadir | --datadir | --datadi | --datad | --data | --dat | --da) + -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; - -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \ - | --da=*) + -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; + -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ + | --dataroo | --dataro | --datar) + ac_prev=datarootdir ;; + -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ + | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) + datarootdir=$ac_optarg ;; + -disable-* | --disable-*) ac_feature=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. - expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null && + expr "x$ac_feature" : ".*[^-._$as_cr_alnum]" >/dev/null && { echo "$as_me: error: invalid feature name: $ac_feature" >&2 { (exit 1); exit 1; }; } - ac_feature=`echo $ac_feature | sed 's/-/_/g'` - eval "enable_$ac_feature=no" ;; + ac_feature=`echo $ac_feature | sed 's/[-.]/_/g'` + eval enable_$ac_feature=no ;; + + -docdir | --docdir | --docdi | --doc | --do) + ac_prev=docdir ;; + -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) + docdir=$ac_optarg ;; + + -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) + ac_prev=dvidir ;; + -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) + dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_feature=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. - expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null && + expr "x$ac_feature" : ".*[^-._$as_cr_alnum]" >/dev/null && { echo "$as_me: error: invalid feature name: $ac_feature" >&2 { (exit 1); exit 1; }; } - ac_feature=`echo $ac_feature | sed 's/-/_/g'` - case $ac_option in - *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;; - *) ac_optarg=yes ;; - esac - eval "enable_$ac_feature='$ac_optarg'" ;; + ac_feature=`echo $ac_feature | sed 's/[-.]/_/g'` + eval enable_$ac_feature=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ @@ -588,6 +1121,12 @@ do -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; + -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) + ac_prev=htmldir ;; + -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ + | --ht=*) + htmldir=$ac_optarg ;; + -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; @@ -612,13 +1151,16 @@ do | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; + -localedir | --localedir | --localedi | --localed | --locale) + ac_prev=localedir ;; + -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) + localedir=$ac_optarg ;; + -localstatedir | --localstatedir | --localstatedi | --localstated \ - | --localstate | --localstat | --localsta | --localst \ - | --locals | --local | --loca | --loc | --lo) + | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ - | --localstate=* | --localstat=* | --localsta=* | --localst=* \ - | --locals=* | --local=* | --loca=* | --loc=* | --lo=*) + | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) @@ -683,6 +1225,16 @@ do | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; + -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) + ac_prev=pdfdir ;; + -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) + pdfdir=$ac_optarg ;; + + -psdir | --psdir | --psdi | --psd | --ps) + ac_prev=psdir ;; + -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) + psdir=$ac_optarg ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; @@ -735,24 +1287,20 @@ do -with-* | --with-*) ac_package=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. - expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null && + expr "x$ac_package" : ".*[^-._$as_cr_alnum]" >/dev/null && { echo "$as_me: error: invalid package name: $ac_package" >&2 { (exit 1); exit 1; }; } - ac_package=`echo $ac_package| sed 's/-/_/g'` - case $ac_option in - *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;; - *) ac_optarg=yes ;; - esac - eval "with_$ac_package='$ac_optarg'" ;; + ac_package=`echo $ac_package | sed 's/[-.]/_/g'` + eval with_$ac_package=\$ac_optarg ;; -without-* | --without-*) ac_package=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. - expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null && + expr "x$ac_package" : ".*[^-._$as_cr_alnum]" >/dev/null && { echo "$as_me: error: invalid package name: $ac_package" >&2 { (exit 1); exit 1; }; } - ac_package=`echo $ac_package | sed 's/-/_/g'` - eval "with_$ac_package=no" ;; + ac_package=`echo $ac_package | sed 's/[-.]/_/g'` + eval with_$ac_package=no ;; --x) # Obsolete; use --with-x. @@ -783,8 +1331,7 @@ Try \`$0 --help' for more information." >&2 expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null && { echo "$as_me: error: invalid variable name: $ac_envvar" >&2 { (exit 1); exit 1; }; } - ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` - eval "$ac_envvar='$ac_optarg'" + eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) @@ -804,27 +1351,19 @@ if test -n "$ac_prev"; then { (exit 1); exit 1; }; } fi -# Be sure to have absolute paths. -for ac_var in exec_prefix prefix +# Be sure to have absolute directory names. +for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ + datadir sysconfdir sharedstatedir localstatedir includedir \ + oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ + libdir localedir mandir do - eval ac_val=$`echo $ac_var` + eval ac_val=\$$ac_var case $ac_val in - [\\/$]* | ?:[\\/]* | NONE | '' ) ;; - *) { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2 - { (exit 1); exit 1; }; };; - esac -done - -# Be sure to have absolute paths. -for ac_var in bindir sbindir libexecdir datadir sysconfdir sharedstatedir \ - localstatedir libdir includedir oldincludedir infodir mandir -do - eval ac_val=$`echo $ac_var` - case $ac_val in - [\\/$]* | ?:[\\/]* ) ;; - *) { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2 - { (exit 1); exit 1; }; };; + [\\/$]* | ?:[\\/]* ) continue;; + NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac + { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2 + { (exit 1); exit 1; }; } done # There might be people who depend on the old broken behavior: `$host' @@ -851,78 +1390,76 @@ test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null +ac_pwd=`pwd` && test -n "$ac_pwd" && +ac_ls_di=`ls -di .` && +ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || + { echo "$as_me: error: Working directory cannot be determined" >&2 + { (exit 1); exit 1; }; } +test "X$ac_ls_di" = "X$ac_pwd_ls_di" || + { echo "$as_me: error: pwd does not report name of working directory" >&2 + { (exit 1); exit 1; }; } + + # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes - # Try the directory containing this script, then its parent. - ac_confdir=`(dirname "$0") 2>/dev/null || + # Try the directory containing this script, then the parent directory. + ac_confdir=`$as_dirname -- "$0" || $as_expr X"$0" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$0" : 'X\(//\)[^/]' \| \ X"$0" : 'X\(//\)$' \| \ - X"$0" : 'X\(/\)' \| \ - . : '\(.\)' 2>/dev/null || + X"$0" : 'X\(/\)' \| . 2>/dev/null || echo X"$0" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } - /^X\(\/\/\)[^/].*/{ s//\1/; q; } - /^X\(\/\/\)$/{ s//\1/; q; } - /^X\(\/\).*/{ s//\1/; q; } - s/.*/./; q'` + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` srcdir=$ac_confdir - if test ! -r $srcdir/$ac_unique_file; then + if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi -if test ! -r $srcdir/$ac_unique_file; then - if test "$ac_srcdir_defaulted" = yes; then - { echo "$as_me: error: cannot find sources ($ac_unique_file) in $ac_confdir or .." >&2 +if test ! -r "$srcdir/$ac_unique_file"; then + test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." + { echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2 { (exit 1); exit 1; }; } - else - { echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2 - { (exit 1); exit 1; }; } - fi -fi -(cd $srcdir && test -r ./$ac_unique_file) 2>/dev/null || - { echo "$as_me: error: sources are in $srcdir, but \`cd $srcdir' does not work" >&2 - { (exit 1); exit 1; }; } -srcdir=`echo "$srcdir" | sed 's%\([^\\/]\)[\\/]*$%\1%'` -ac_env_build_alias_set=${build_alias+set} -ac_env_build_alias_value=$build_alias -ac_cv_env_build_alias_set=${build_alias+set} -ac_cv_env_build_alias_value=$build_alias -ac_env_host_alias_set=${host_alias+set} -ac_env_host_alias_value=$host_alias -ac_cv_env_host_alias_set=${host_alias+set} -ac_cv_env_host_alias_value=$host_alias -ac_env_target_alias_set=${target_alias+set} -ac_env_target_alias_value=$target_alias -ac_cv_env_target_alias_set=${target_alias+set} -ac_cv_env_target_alias_value=$target_alias -ac_env_CPP_set=${CPP+set} -ac_env_CPP_value=$CPP -ac_cv_env_CPP_set=${CPP+set} -ac_cv_env_CPP_value=$CPP -ac_env_CPPFLAGS_set=${CPPFLAGS+set} -ac_env_CPPFLAGS_value=$CPPFLAGS -ac_cv_env_CPPFLAGS_set=${CPPFLAGS+set} -ac_cv_env_CPPFLAGS_value=$CPPFLAGS -ac_env_CXX_set=${CXX+set} -ac_env_CXX_value=$CXX -ac_cv_env_CXX_set=${CXX+set} -ac_cv_env_CXX_value=$CXX -ac_env_CXXFLAGS_set=${CXXFLAGS+set} -ac_env_CXXFLAGS_value=$CXXFLAGS -ac_cv_env_CXXFLAGS_set=${CXXFLAGS+set} -ac_cv_env_CXXFLAGS_value=$CXXFLAGS -ac_env_LDFLAGS_set=${LDFLAGS+set} -ac_env_LDFLAGS_value=$LDFLAGS -ac_cv_env_LDFLAGS_set=${LDFLAGS+set} -ac_cv_env_LDFLAGS_value=$LDFLAGS -ac_env_CXXCPP_set=${CXXCPP+set} -ac_env_CXXCPP_value=$CXXCPP -ac_cv_env_CXXCPP_set=${CXXCPP+set} -ac_cv_env_CXXCPP_value=$CXXCPP +fi +ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" +ac_abs_confdir=`( + cd "$srcdir" && test -r "./$ac_unique_file" || { echo "$as_me: error: $ac_msg" >&2 + { (exit 1); exit 1; }; } + pwd)` +# When building in place, set srcdir=. +if test "$ac_abs_confdir" = "$ac_pwd"; then + srcdir=. +fi +# Remove unnecessary trailing slashes from srcdir. +# Double slashes in file names in object file debugging info +# mess up M-x gdb in Emacs. +case $srcdir in +*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; +esac +for ac_var in $ac_precious_vars; do + eval ac_env_${ac_var}_set=\${${ac_var}+set} + eval ac_env_${ac_var}_value=\$${ac_var} + eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} + eval ac_cv_env_${ac_var}_value=\$${ac_var} +done # # Report the --help message. @@ -951,9 +1488,6 @@ Configuration: -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] -_ACEOF - - cat <<_ACEOF Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] @@ -971,15 +1505,22 @@ Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] - --datadir=DIR read-only architecture-independent data [PREFIX/share] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] - --infodir=DIR info documentation [PREFIX/info] - --mandir=DIR man documentation [PREFIX/man] + --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] + --datadir=DIR read-only architecture-independent data [DATAROOTDIR] + --infodir=DIR info documentation [DATAROOTDIR/info] + --localedir=DIR locale-dependent data [DATAROOTDIR/locale] + --mandir=DIR man documentation [DATAROOTDIR/man] + --docdir=DIR documentation root [DATAROOTDIR/doc/libstdc++] + --htmldir=DIR html documentation [DOCDIR] + --dvidir=DIR dvi documentation [DOCDIR] + --pdfdir=DIR pdf documentation [DOCDIR] + --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF @@ -1008,10 +1549,8 @@ Optional Features: --enable-multilib build many library versions (default) --enable-maintainer-mode enable make rules and dependencies not useful (and sometimes confusing) to the casual installer - --enable-shared[=PKGS] - build shared libraries [default=yes] - --enable-static[=PKGS] - build static libraries [default=yes] + --enable-shared[=PKGS] build shared libraries [default=yes] + --enable-static[=PKGS] build static libraries [default=yes] --enable-fast-install[=PKGS] optimize for fast installation [default=yes] --disable-libtool-lock avoid locking (might break parallel builds) @@ -1022,23 +1561,19 @@ Optional Features: [default=auto] --enable-libstdcxx-pch build pre-compiled libstdc++ headers [default=$is_hosted] - --enable-cstdio=PACKAGE use target-specific I/O package - [default=stdio] + --enable-cstdio=PACKAGE use target-specific I/O package [default=stdio] --enable-clocale[=MODEL] - use MODEL for target locale package - [default=auto] + use MODEL for target locale package [default=auto] --enable-nls use Native Language Support (default) --enable-libstdcxx-allocator=KIND use KIND for target std::allocator base [default=auto] - --enable-cheaders=KIND construct "C" headers for g++ - [default=$c_model] + --enable-cheaders=KIND construct "C" headers for g++ [default=$c_model] --enable-long-long enable template specializations for 'long long' [default=yes] --enable-wchar_t enable template specializations for 'wchar_t' [default=yes] - --enable-c99 turns on ISO/IEC 9899:1999 support - [default=yes] + --enable-c99 turns on ISO/IEC 9899:1999 support [default=yes] --enable-concept-checks use Boost-derived template checks [default=no] --enable-libstdcxx-debug-flags=FLAGS pass compiler FLAGS when building debug library @@ -1046,15 +1581,13 @@ Optional Features: --enable-libstdcxx-debug build extra debug library [default=no] --enable-cxx-flags=FLAGS - pass compiler FLAGS when building library - [default=] + pass compiler FLAGS when building library [default=] --enable-fully-dynamic-string do not put empty strings in per-process static memory [default=no] --enable-tls Use thread-local storage [default=yes] --disable-rpath do not hardcode runtime library paths - --enable-linux-futex use the Linux futex system call - [default=default] + --enable-linux-futex use the Linux futex system call [default=default] --enable-symvers=STYLE enables symbol versioning of the shared library [default=yes] --enable-visibility enables visibility safe usage [default=yes] @@ -1083,8 +1616,9 @@ Some influential environment variables: CFLAGS C compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory - CPPFLAGS C/C++ preprocessor flags, e.g. -I if you have - headers in a nonstandard directory + LIBS libraries to pass to the linker, e.g. -l + CPPFLAGS C/C++/Objective C preprocessor flags, e.g. -I if + you have headers in a nonstandard directory CXX C++ compiler command CXXFLAGS C++ compiler flags CPP C preprocessor @@ -1094,120 +1628,86 @@ Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. _ACEOF +ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. - ac_popdir=`pwd` for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue - test -d $ac_dir || continue + test -d "$ac_dir" || continue ac_builddir=. -if test "$ac_dir" != .; then +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` - # A "../" for each directory in $ac_dir_suffix. - ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'` -else - ac_dir_suffix= ac_top_builddir= -fi + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,/..,g;s,/,,'` + case $ac_top_builddir_sub in + "") ac_top_builddir_sub=. ac_top_build_prefix= ;; + *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; + esac ;; +esac +ac_abs_top_builddir=$ac_pwd +ac_abs_builddir=$ac_pwd$ac_dir_suffix +# for backward compatibility: +ac_top_builddir=$ac_top_build_prefix case $srcdir in - .) # No --srcdir option. We are building in place. + .) # We are building in place. ac_srcdir=. - if test -z "$ac_top_builddir"; then - ac_top_srcdir=. - else - ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'` - fi ;; - [\\/]* | ?:[\\/]* ) # Absolute path. + ac_top_srcdir=$ac_top_builddir_sub + ac_abs_top_srcdir=$ac_pwd ;; + [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; - ac_top_srcdir=$srcdir ;; - *) # Relative path. - ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix - ac_top_srcdir=$ac_top_builddir$srcdir ;; -esac - -# Do not use `cd foo && pwd` to compute absolute paths, because -# the directories may not exist. -case `pwd` in -.) ac_abs_builddir="$ac_dir";; -*) - case "$ac_dir" in - .) ac_abs_builddir=`pwd`;; - [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";; - *) ac_abs_builddir=`pwd`/"$ac_dir";; - esac;; -esac -case $ac_abs_builddir in -.) ac_abs_top_builddir=${ac_top_builddir}.;; -*) - case ${ac_top_builddir}. in - .) ac_abs_top_builddir=$ac_abs_builddir;; - [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;; - *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;; - esac;; -esac -case $ac_abs_builddir in -.) ac_abs_srcdir=$ac_srcdir;; -*) - case $ac_srcdir in - .) ac_abs_srcdir=$ac_abs_builddir;; - [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;; - *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;; - esac;; -esac -case $ac_abs_builddir in -.) ac_abs_top_srcdir=$ac_top_srcdir;; -*) - case $ac_top_srcdir in - .) ac_abs_top_srcdir=$ac_abs_builddir;; - [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;; - *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;; - esac;; + ac_top_srcdir=$srcdir + ac_abs_top_srcdir=$srcdir ;; + *) # Relative name. + ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_build_prefix$srcdir + ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac - - cd $ac_dir - # Check for guested configure; otherwise get Cygnus style configure. - if test -f $ac_srcdir/configure.gnu; then - echo - $SHELL $ac_srcdir/configure.gnu --help=recursive - elif test -f $ac_srcdir/configure; then - echo - $SHELL $ac_srcdir/configure --help=recursive - elif test -f $ac_srcdir/configure.ac || - test -f $ac_srcdir/configure.in; then - echo - $ac_configure --help +ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix + + cd "$ac_dir" || { ac_status=$?; continue; } + # Check for guested configure. + if test -f "$ac_srcdir/configure.gnu"; then + echo && + $SHELL "$ac_srcdir/configure.gnu" --help=recursive + elif test -f "$ac_srcdir/configure"; then + echo && + $SHELL "$ac_srcdir/configure" --help=recursive else echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 - fi - cd $ac_popdir + fi || ac_status=$? + cd "$ac_pwd" || { ac_status=$?; break; } done fi -test -n "$ac_init_help" && exit 0 +test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF package-unused configure version-unused -generated by GNU Autoconf 2.59 +generated by GNU Autoconf 2.61 -Copyright (C) 2003 Free Software Foundation, Inc. +Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, +2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF - exit 0 + exit fi -exec 5>config.log -cat >&5 <<_ACEOF +cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by package-unused $as_me version-unused, which was -generated by GNU Autoconf 2.59. Invocation command line was +generated by GNU Autoconf 2.61. Invocation command line was $ $0 $@ _ACEOF +exec 5>>config.log { cat <<_ASUNAME ## --------- ## @@ -1226,7 +1726,7 @@ uname -v = `(uname -v) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` -hostinfo = `(hostinfo) 2>/dev/null || echo unknown` +/usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` @@ -1240,6 +1740,7 @@ do test -z "$as_dir" && as_dir=. echo "PATH: $as_dir" done +IFS=$as_save_IFS } >&5 @@ -1261,7 +1762,6 @@ _ACEOF ac_configure_args= ac_configure_args0= ac_configure_args1= -ac_sep= ac_must_keep_next=false for ac_pass in 1 2 do @@ -1272,7 +1772,7 @@ do -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; - *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*) + *\'*) ac_arg=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in @@ -1294,9 +1794,7 @@ do -* ) ac_must_keep_next=true ;; esac fi - ac_configure_args="$ac_configure_args$ac_sep'$ac_arg'" - # Get rid of the leading space. - ac_sep=" " + ac_configure_args="$ac_configure_args '$ac_arg'" ;; esac done @@ -1307,8 +1805,8 @@ $as_unset ac_configure_args1 || test "${ac_configure_args1+set}" != set || { ac_ # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. -# WARNING: Be sure not to use single quotes in there, as some shells, -# such as our DU 5.0 friend, will then `close' the trap. +# WARNING: Use '\'' to represent an apostrophe within the trap. +# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { @@ -1321,20 +1819,34 @@ trap 'exit_status=$? _ASBOX echo # The following way of writing the cache mishandles newlines in values, -{ +( + for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do + eval ac_val=\$$ac_var + case $ac_val in #( + *${as_nl}*) + case $ac_var in #( + *_cv_*) { echo "$as_me:$LINENO: WARNING: Cache variable $ac_var contains a newline." >&5 +echo "$as_me: WARNING: Cache variable $ac_var contains a newline." >&2;} ;; + esac + case $ac_var in #( + _ | IFS | as_nl) ;; #( + *) $as_unset $ac_var ;; + esac ;; + esac + done (set) 2>&1 | - case `(ac_space='"'"' '"'"'; set | grep ac_space) 2>&1` in - *ac_space=\ *) + case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( + *${as_nl}ac_space=\ *) sed -n \ - "s/'"'"'/'"'"'\\\\'"'"''"'"'/g; - s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='"'"'\\2'"'"'/p" - ;; + "s/'\''/'\''\\\\'\'''\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" + ;; #( *) - sed -n \ - "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p" + sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; - esac; -} + esac | + sort +) echo cat <<\_ASBOX @@ -1345,22 +1857,28 @@ _ASBOX echo for ac_var in $ac_subst_vars do - eval ac_val=$`echo $ac_var` - echo "$ac_var='"'"'$ac_val'"'"'" + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then cat <<\_ASBOX -## ------------- ## -## Output files. ## -## ------------- ## +## ------------------- ## +## File substitutions. ## +## ------------------- ## _ASBOX echo for ac_var in $ac_subst_files do - eval ac_val=$`echo $ac_var` - echo "$ac_var='"'"'$ac_val'"'"'" + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + echo "$ac_var='\''$ac_val'\''" done | sort echo fi @@ -1372,26 +1890,24 @@ _ASBOX ## ----------- ## _ASBOX echo - sed "/^$/d" confdefs.h | sort + cat confdefs.h echo fi test "$ac_signal" != 0 && echo "$as_me: caught signal $ac_signal" echo "$as_me: exit $exit_status" } >&5 - rm -f core *.core && - rm -rf conftest* confdefs* conf$$* $ac_clean_files && + rm -f core *.core core.conftest.* && + rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status - ' 0 +' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. -rm -rf conftest* confdefs.h -# AIX cpp loses on an empty file, so make sure it contains at least a newline. -echo >confdefs.h +rm -f -r conftest* confdefs.h # Predefined preprocessor variables. @@ -1422,14 +1938,17 @@ _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer explicitly selected file to automatically selected ones. -if test -z "$CONFIG_SITE"; then - if test "x$prefix" != xNONE; then - CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site" - else - CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" - fi +if test -n "$CONFIG_SITE"; then + set x "$CONFIG_SITE" +elif test "x$prefix" != xNONE; then + set x "$prefix/share/config.site" "$prefix/etc/config.site" +else + set x "$ac_default_prefix/share/config.site" \ + "$ac_default_prefix/etc/config.site" fi -for ac_site_file in $CONFIG_SITE; do +shift +for ac_site_file +do if test -r "$ac_site_file"; then { echo "$as_me:$LINENO: loading site script $ac_site_file" >&5 echo "$as_me: loading site script $ac_site_file" >&6;} @@ -1445,8 +1964,8 @@ if test -r "$cache_file"; then { echo "$as_me:$LINENO: loading cache $cache_file" >&5 echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in - [\\/]* | ?:[\\/]* ) . $cache_file;; - *) . ./$cache_file;; + [\\/]* | ?:[\\/]* ) . "$cache_file";; + *) . "./$cache_file";; esac fi else @@ -1458,12 +1977,11 @@ fi # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false -for ac_var in `(set) 2>&1 | - sed -n 's/^ac_env_\([a-zA-Z_0-9]*\)_set=.*/\1/p'`; do +for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set - eval ac_old_val="\$ac_cv_env_${ac_var}_value" - eval ac_new_val="\$ac_env_${ac_var}_value" + eval ac_old_val=\$ac_cv_env_${ac_var}_value + eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 @@ -1488,8 +2006,7 @@ echo "$as_me: current value: $ac_new_val" >&2;} # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in - *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*) - ac_arg=$ac_var=`echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; + *\'*) ac_arg=$ac_var=`echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in @@ -1506,12 +2023,6 @@ echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start ov { (exit 1); exit 1; }; } fi -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - @@ -1536,10 +2047,15 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu - ac_config_headers="$ac_config_headers config.h" +ac_config_headers="$ac_config_headers config.h" # This works around the fact that libtool configuration may change LD @@ -1554,10 +2070,9 @@ libtool_VERSION=6:10:0 # Find the rest of the source tree framework. # Default to --enable-multilib -# Check whether --enable-multilib or --disable-multilib was given. +# Check whether --enable-multilib was given. if test "${enable_multilib+set}" = set; then - enableval="$enable_multilib" - case "$enableval" in + enableval=$enable_multilib; case "$enableval" in yes) multilib=yes ;; no) multilib=no ;; *) { { echo "$as_me:$LINENO: error: bad value $enableval for multilib option" >&5 @@ -1566,7 +2081,8 @@ echo "$as_me: error: bad value $enableval for multilib option" >&2;} esac else multilib=yes -fi; +fi + # We may get other options which we leave undocumented: # --with-target-subdir, --with-multisrctop, --with-multisubdir @@ -1590,7 +2106,7 @@ if test $cross_compiling = no && test $multilib = yes \ cross_compiling=maybe fi - ac_config_commands="$ac_config_commands default-1" +ac_config_commands="$ac_config_commands default-1" # Gets build, host, target, *_vendor, *_cpu, *_os, etc. @@ -1608,104 +2124,154 @@ fi # Do not delete or change the following two lines. For why, see # http://gcc.gnu.org/ml/libstdc++/2003-07/msg00451.html ac_aux_dir= -for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do - if test -f $ac_dir/install-sh; then +for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do + if test -f "$ac_dir/install-sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install-sh -c" break - elif test -f $ac_dir/install.sh; then + elif test -f "$ac_dir/install.sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install.sh -c" break - elif test -f $ac_dir/shtool; then + elif test -f "$ac_dir/shtool"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/shtool install -c" break fi done if test -z "$ac_aux_dir"; then - { { echo "$as_me:$LINENO: error: cannot find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." >&5 -echo "$as_me: error: cannot find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." >&2;} + { { echo "$as_me:$LINENO: error: cannot find install-sh or install.sh in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" >&5 +echo "$as_me: error: cannot find install-sh or install.sh in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" >&2;} { (exit 1); exit 1; }; } fi -ac_config_guess="$SHELL $ac_aux_dir/config.guess" -ac_config_sub="$SHELL $ac_aux_dir/config.sub" -ac_configure="$SHELL $ac_aux_dir/configure" # This should be Cygnus configure. + +# These three variables are undocumented and unsupported, +# and are intended to be withdrawn in a future Autoconf release. +# They can cause serious problems if a builder's source tree is in a directory +# whose full name contains unusual characters. +ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. +ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. +ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. + # Make sure we can run config.sub. -$ac_config_sub sun4 >/dev/null 2>&1 || - { { echo "$as_me:$LINENO: error: cannot run $ac_config_sub" >&5 -echo "$as_me: error: cannot run $ac_config_sub" >&2;} +$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || + { { echo "$as_me:$LINENO: error: cannot run $SHELL $ac_aux_dir/config.sub" >&5 +echo "$as_me: error: cannot run $SHELL $ac_aux_dir/config.sub" >&2;} { (exit 1); exit 1; }; } -echo "$as_me:$LINENO: checking build system type" >&5 -echo $ECHO_N "checking build system type... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking build system type" >&5 +echo $ECHO_N "checking build system type... $ECHO_C" >&6; } if test "${ac_cv_build+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - ac_cv_build_alias=$build_alias -test -z "$ac_cv_build_alias" && - ac_cv_build_alias=`$ac_config_guess` -test -z "$ac_cv_build_alias" && + ac_build_alias=$build_alias +test "x$ac_build_alias" = x && + ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` +test "x$ac_build_alias" = x && { { echo "$as_me:$LINENO: error: cannot guess build type; you must specify one" >&5 echo "$as_me: error: cannot guess build type; you must specify one" >&2;} { (exit 1); exit 1; }; } -ac_cv_build=`$ac_config_sub $ac_cv_build_alias` || - { { echo "$as_me:$LINENO: error: $ac_config_sub $ac_cv_build_alias failed" >&5 -echo "$as_me: error: $ac_config_sub $ac_cv_build_alias failed" >&2;} +ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || + { { echo "$as_me:$LINENO: error: $SHELL $ac_aux_dir/config.sub $ac_build_alias failed" >&5 +echo "$as_me: error: $SHELL $ac_aux_dir/config.sub $ac_build_alias failed" >&2;} { (exit 1); exit 1; }; } fi -echo "$as_me:$LINENO: result: $ac_cv_build" >&5 -echo "${ECHO_T}$ac_cv_build" >&6 +{ echo "$as_me:$LINENO: result: $ac_cv_build" >&5 +echo "${ECHO_T}$ac_cv_build" >&6; } +case $ac_cv_build in +*-*-*) ;; +*) { { echo "$as_me:$LINENO: error: invalid value of canonical build" >&5 +echo "$as_me: error: invalid value of canonical build" >&2;} + { (exit 1); exit 1; }; };; +esac build=$ac_cv_build -build_cpu=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` -build_vendor=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` -build_os=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` - - -echo "$as_me:$LINENO: checking host system type" >&5 -echo $ECHO_N "checking host system type... $ECHO_C" >&6 +ac_save_IFS=$IFS; IFS='-' +set x $ac_cv_build +shift +build_cpu=$1 +build_vendor=$2 +shift; shift +# Remember, the first character of IFS is used to create $*, +# except with old shells: +build_os=$* +IFS=$ac_save_IFS +case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac + + +{ echo "$as_me:$LINENO: checking host system type" >&5 +echo $ECHO_N "checking host system type... $ECHO_C" >&6; } if test "${ac_cv_host+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - ac_cv_host_alias=$host_alias -test -z "$ac_cv_host_alias" && - ac_cv_host_alias=$ac_cv_build_alias -ac_cv_host=`$ac_config_sub $ac_cv_host_alias` || - { { echo "$as_me:$LINENO: error: $ac_config_sub $ac_cv_host_alias failed" >&5 -echo "$as_me: error: $ac_config_sub $ac_cv_host_alias failed" >&2;} + if test "x$host_alias" = x; then + ac_cv_host=$ac_cv_build +else + ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || + { { echo "$as_me:$LINENO: error: $SHELL $ac_aux_dir/config.sub $host_alias failed" >&5 +echo "$as_me: error: $SHELL $ac_aux_dir/config.sub $host_alias failed" >&2;} { (exit 1); exit 1; }; } +fi fi -echo "$as_me:$LINENO: result: $ac_cv_host" >&5 -echo "${ECHO_T}$ac_cv_host" >&6 +{ echo "$as_me:$LINENO: result: $ac_cv_host" >&5 +echo "${ECHO_T}$ac_cv_host" >&6; } +case $ac_cv_host in +*-*-*) ;; +*) { { echo "$as_me:$LINENO: error: invalid value of canonical host" >&5 +echo "$as_me: error: invalid value of canonical host" >&2;} + { (exit 1); exit 1; }; };; +esac host=$ac_cv_host -host_cpu=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` -host_vendor=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` -host_os=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` - - -echo "$as_me:$LINENO: checking target system type" >&5 -echo $ECHO_N "checking target system type... $ECHO_C" >&6 +ac_save_IFS=$IFS; IFS='-' +set x $ac_cv_host +shift +host_cpu=$1 +host_vendor=$2 +shift; shift +# Remember, the first character of IFS is used to create $*, +# except with old shells: +host_os=$* +IFS=$ac_save_IFS +case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac + + +{ echo "$as_me:$LINENO: checking target system type" >&5 +echo $ECHO_N "checking target system type... $ECHO_C" >&6; } if test "${ac_cv_target+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - ac_cv_target_alias=$target_alias -test "x$ac_cv_target_alias" = "x" && - ac_cv_target_alias=$ac_cv_host_alias -ac_cv_target=`$ac_config_sub $ac_cv_target_alias` || - { { echo "$as_me:$LINENO: error: $ac_config_sub $ac_cv_target_alias failed" >&5 -echo "$as_me: error: $ac_config_sub $ac_cv_target_alias failed" >&2;} + if test "x$target_alias" = x; then + ac_cv_target=$ac_cv_host +else + ac_cv_target=`$SHELL "$ac_aux_dir/config.sub" $target_alias` || + { { echo "$as_me:$LINENO: error: $SHELL $ac_aux_dir/config.sub $target_alias failed" >&5 +echo "$as_me: error: $SHELL $ac_aux_dir/config.sub $target_alias failed" >&2;} { (exit 1); exit 1; }; } +fi fi -echo "$as_me:$LINENO: result: $ac_cv_target" >&5 -echo "${ECHO_T}$ac_cv_target" >&6 +{ echo "$as_me:$LINENO: result: $ac_cv_target" >&5 +echo "${ECHO_T}$ac_cv_target" >&6; } +case $ac_cv_target in +*-*-*) ;; +*) { { echo "$as_me:$LINENO: error: invalid value of canonical target" >&5 +echo "$as_me: error: invalid value of canonical target" >&2;} + { (exit 1); exit 1; }; };; +esac target=$ac_cv_target -target_cpu=`echo $ac_cv_target | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` -target_vendor=`echo $ac_cv_target | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` -target_os=`echo $ac_cv_target | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` +ac_save_IFS=$IFS; IFS='-' +set x $ac_cv_target +shift +target_cpu=$1 +target_vendor=$2 +shift; shift +# Remember, the first character of IFS is used to create $*, +# except with old shells: +target_os=$* +IFS=$ac_save_IFS +case $target_os in *\ *) target_os=`echo "$target_os" | sed 's/ /-/g'`;; esac # The aliases save the names the user supplied, while $host etc. @@ -1755,7 +2321,8 @@ fi # no-dependencies: turns off auto dependency generation (just for now) # -Wall: turns on all automake warnings... # -Wno-portability: ...except this one, since GNU make is now required. -am__api_version="1.9" +am__api_version='1.10' + # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: @@ -1769,8 +2336,8 @@ am__api_version="1.9" # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. -echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5 -echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5 +echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6; } if test -z "$INSTALL"; then if test "${ac_cv_path_install+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 @@ -1792,7 +2359,7 @@ case $as_dir/ in # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then + if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; }; then if test $ac_prog = install && grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. @@ -1811,21 +2378,22 @@ case $as_dir/ in ;; esac done +IFS=$as_save_IFS fi if test "${ac_cv_path_install+set}" = set; then INSTALL=$ac_cv_path_install else - # As a last resort, use the slow shell script. We don't cache a - # path for INSTALL within a source directory, because that will + # As a last resort, use the slow shell script. Don't cache a + # value for INSTALL within a source directory, because that will # break other packages using the cache if that directory is - # removed, or if the path is relative. + # removed, or if the value is a relative name. INSTALL=$ac_install_sh fi fi -echo "$as_me:$LINENO: result: $INSTALL" >&5 -echo "${ECHO_T}$INSTALL" >&6 +{ echo "$as_me:$LINENO: result: $INSTALL" >&5 +echo "${ECHO_T}$INSTALL" >&6; } # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. @@ -1835,8 +2403,8 @@ test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' -echo "$as_me:$LINENO: checking whether build environment is sane" >&5 -echo $ECHO_N "checking whether build environment is sane... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking whether build environment is sane" >&5 +echo $ECHO_N "checking whether build environment is sane... $ECHO_C" >&6; } # Just in case sleep 1 echo timestamp > conftest.file @@ -1878,20 +2446,20 @@ echo "$as_me: error: newly created file is older than distributed files! Check your system clock" >&2;} { (exit 1); exit 1; }; } fi -echo "$as_me:$LINENO: result: yes" >&5 -echo "${ECHO_T}yes" >&6 +{ echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6; } test "$program_prefix" != NONE && - program_transform_name="s,^,$program_prefix,;$program_transform_name" + program_transform_name="s&^&$program_prefix&;$program_transform_name" # Use a double $ so make ignores it. test "$program_suffix" != NONE && - program_transform_name="s,\$,$program_suffix,;$program_transform_name" + program_transform_name="s&\$&$program_suffix&;$program_transform_name" # Double any \ or $. echo might interpret backslashes. # By default was `s,x,x', remove it if useless. cat <<\_ACEOF >conftest.sed s/[\\$]/&&/g;s/;s,x,x,$// _ACEOF program_transform_name=`echo $program_transform_name | sed -f conftest.sed` -rm conftest.sed +rm -f conftest.sed # expand $ac_aux_dir to an absolute path am_aux_dir=`cd $ac_aux_dir && pwd` @@ -1906,45 +2474,60 @@ else echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;} fi -if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then - # We used to keeping the `.' as first argument, in order to - # allow $(mkdir_p) to be used without argument. As in - # $(mkdir_p) $(somedir) - # where $(somedir) is conditionally defined. However this is wrong - # for two reasons: - # 1. if the package is installed by a user who cannot write `.' - # make install will fail, - # 2. the above comment should most certainly read - # $(mkdir_p) $(DESTDIR)$(somedir) - # so it does not work when $(somedir) is undefined and - # $(DESTDIR) is not. - # To support the latter case, we have to write - # test -z "$(somedir)" || $(mkdir_p) $(DESTDIR)$(somedir), - # so the `.' trick is pointless. - mkdir_p='mkdir -p --' -else - # On NextStep and OpenStep, the `mkdir' command does not - # recognize any option. It will interpret all options as - # directories to create, and then abort because `.' already - # exists. - for d in ./-p ./--version; - do - test -d $d && rmdir $d - done - # $(mkinstalldirs) is defined by Automake if mkinstalldirs exists. - if test -f "$ac_aux_dir/mkinstalldirs"; then - mkdir_p='$(mkinstalldirs)' +{ echo "$as_me:$LINENO: checking for a thread-safe mkdir -p" >&5 +echo $ECHO_N "checking for a thread-safe mkdir -p... $ECHO_C" >&6; } +if test -z "$MKDIR_P"; then + if test "${ac_cv_path_mkdir+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in mkdir gmkdir; do + for ac_exec_ext in '' $ac_executable_extensions; do + { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; } || continue + case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( + 'mkdir (GNU coreutils) '* | \ + 'mkdir (coreutils) '* | \ + 'mkdir (fileutils) '4.1*) + ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext + break 3;; + esac + done + done +done +IFS=$as_save_IFS + +fi + + if test "${ac_cv_path_mkdir+set}" = set; then + MKDIR_P="$ac_cv_path_mkdir -p" else - mkdir_p='$(install_sh) -d' + # As a last resort, use the slow shell script. Don't cache a + # value for MKDIR_P within a source directory, because that will + # break other packages using the cache if that directory is + # removed, or if the value is a relative name. + test -d ./--version && rmdir ./--version + MKDIR_P="$ac_install_sh -d" fi fi +{ echo "$as_me:$LINENO: result: $MKDIR_P" >&5 +echo "${ECHO_T}$MKDIR_P" >&6; } + +mkdir_p="$MKDIR_P" +case $mkdir_p in + [\\/$]* | ?:[\\/]*) ;; + */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; +esac for ac_prog in gawk mawk nawk awk do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_AWK+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -1957,54 +2540,57 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_AWK="$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done +IFS=$as_save_IFS fi fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then - echo "$as_me:$LINENO: result: $AWK" >&5 -echo "${ECHO_T}$AWK" >&6 + { echo "$as_me:$LINENO: result: $AWK" >&5 +echo "${ECHO_T}$AWK" >&6; } else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } fi + test -n "$AWK" && break done -echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \$(MAKE)" >&5 -echo $ECHO_N "checking whether ${MAKE-make} sets \$(MAKE)... $ECHO_C" >&6 -set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y,:./+-,___p_,'` -if eval "test \"\${ac_cv_prog_make_${ac_make}_set+set}\" = set"; then +{ echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \$(MAKE)" >&5 +echo $ECHO_N "checking whether ${MAKE-make} sets \$(MAKE)... $ECHO_C" >&6; } +set x ${MAKE-make}; ac_make=`echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` +if { as_var=ac_cv_prog_make_${ac_make}_set; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.make <<\_ACEOF +SHELL = /bin/sh all: - @echo 'ac_maketemp="$(MAKE)"' + @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF # GNU make sometimes prints "make[1]: Entering...", which would confuse us. -eval `${MAKE-make} -f conftest.make 2>/dev/null | grep temp=` -if test -n "$ac_maketemp"; then - eval ac_cv_prog_make_${ac_make}_set=yes -else - eval ac_cv_prog_make_${ac_make}_set=no -fi +case `${MAKE-make} -f conftest.make 2>/dev/null` in + *@@@%%%=?*=@@@%%%*) + eval ac_cv_prog_make_${ac_make}_set=yes;; + *) + eval ac_cv_prog_make_${ac_make}_set=no;; +esac rm -f conftest.make fi -if eval "test \"`echo '$ac_cv_prog_make_'${ac_make}_set`\" = yes"; then - echo "$as_me:$LINENO: result: yes" >&5 -echo "${ECHO_T}yes" >&6 +if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then + { echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6; } SET_MAKE= else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi @@ -2017,12 +2603,16 @@ else fi rmdir .tst 2>/dev/null -# test to see if srcdir already configured -if test "`cd $srcdir && pwd`" != "`pwd`" && - test -f $srcdir/config.status; then - { { echo "$as_me:$LINENO: error: source directory already configured; run \"make distclean\" there first" >&5 +if test "`cd $srcdir && pwd`" != "`pwd`"; then + # Use -I$(srcdir) only when $(srcdir) != ., so that make's output + # is not polluted with repeated "-I." + am__isrc=' -I$(srcdir)' + # test to see if srcdir already configured + if test -f $srcdir/config.status; then + { { echo "$as_me:$LINENO: error: source directory already configured; run \"make distclean\" there first" >&5 echo "$as_me: error: source directory already configured; run \"make distclean\" there first" >&2;} { (exit 1); exit 1; }; } + fi fi # test whether we have cygpath @@ -2056,7 +2646,7 @@ AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} -install_sh=${install_sh-"$am_aux_dir/install-sh"} +install_sh=${install_sh-"\$(SHELL) $am_aux_dir/install-sh"} # Installed binaries are usually stripped using `strip' when the user # run `make install-strip'. However `strip' might not be the right @@ -2066,8 +2656,8 @@ if test "$cross_compiling" != no; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_STRIP+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -2080,32 +2670,34 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done +IFS=$as_save_IFS fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then - echo "$as_me:$LINENO: result: $STRIP" >&5 -echo "${ECHO_T}$STRIP" >&6 + { echo "$as_me:$LINENO: result: $STRIP" >&5 +echo "${ECHO_T}$STRIP" >&6; } else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } fi + fi if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -2118,33 +2710,47 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_STRIP="strip" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done +IFS=$as_save_IFS - test -z "$ac_cv_prog_ac_ct_STRIP" && ac_cv_prog_ac_ct_STRIP=":" fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then - echo "$as_me:$LINENO: result: $ac_ct_STRIP" >&5 -echo "${ECHO_T}$ac_ct_STRIP" >&6 + { echo "$as_me:$LINENO: result: $ac_ct_STRIP" >&5 +echo "${ECHO_T}$ac_ct_STRIP" >&6; } else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } fi - STRIP=$ac_ct_STRIP + if test "x$ac_ct_STRIP" = x; then + STRIP=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&5 +echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&2;} +ac_tool_warned=yes ;; +esac + STRIP=$ac_ct_STRIP + fi else STRIP="$ac_cv_prog_STRIP" fi fi -INSTALL_STRIP_PROGRAM="\${SHELL} \$(install_sh) -c -s" +INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" # We need awk for the "check" target. The system "awk" is bad on # some platforms. @@ -2171,8 +2777,8 @@ ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu -echo "$as_me:$LINENO: checking how to run the C preprocessor" >&5 -echo $ECHO_N "checking how to run the C preprocessor... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking how to run the C preprocessor" >&5 +echo $ECHO_N "checking how to run the C preprocessor... $ECHO_C" >&6; } # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= @@ -2206,24 +2812,22 @@ cat >>conftest.$ac_ext <<_ACEOF #endif Syntax error _ACEOF -if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 - (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 +if { (ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null; then - if test -s conftest.err; then - ac_cpp_err=$ac_c_preproc_warn_flag - ac_cpp_err=$ac_cpp_err$ac_c_werror_flag - else - ac_cpp_err= - fi -else - ac_cpp_err=yes -fi -if test -z "$ac_cpp_err"; then + (exit $ac_status); } >/dev/null && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then : else echo "$as_me: failed program was:" >&5 @@ -2232,9 +2836,10 @@ sed 's/^/| /' conftest.$ac_ext >&5 # Broken: fails on valid input. continue fi + rm -f conftest.err conftest.$ac_ext - # OK, works on sane cases. Now check whether non-existent headers + # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ @@ -2244,24 +2849,22 @@ cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF -if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 - (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 +if { (ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null; then - if test -s conftest.err; then - ac_cpp_err=$ac_c_preproc_warn_flag - ac_cpp_err=$ac_cpp_err$ac_c_werror_flag - else - ac_cpp_err= - fi -else - ac_cpp_err=yes -fi -if test -z "$ac_cpp_err"; then + (exit $ac_status); } >/dev/null && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then # Broken: success on invalid input. continue else @@ -2272,6 +2875,7 @@ sed 's/^/| /' conftest.$ac_ext >&5 ac_preproc_ok=: break fi + rm -f conftest.err conftest.$ac_ext done @@ -2289,8 +2893,8 @@ fi else ac_cv_prog_CPP=$CPP fi -echo "$as_me:$LINENO: result: $CPP" >&5 -echo "${ECHO_T}$CPP" >&6 +{ echo "$as_me:$LINENO: result: $CPP" >&5 +echo "${ECHO_T}$CPP" >&6; } ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do @@ -2313,24 +2917,22 @@ cat >>conftest.$ac_ext <<_ACEOF #endif Syntax error _ACEOF -if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 - (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 +if { (ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null; then - if test -s conftest.err; then - ac_cpp_err=$ac_c_preproc_warn_flag - ac_cpp_err=$ac_cpp_err$ac_c_werror_flag - else - ac_cpp_err= - fi -else - ac_cpp_err=yes -fi -if test -z "$ac_cpp_err"; then + (exit $ac_status); } >/dev/null && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then : else echo "$as_me: failed program was:" >&5 @@ -2339,9 +2941,10 @@ sed 's/^/| /' conftest.$ac_ext >&5 # Broken: fails on valid input. continue fi + rm -f conftest.err conftest.$ac_ext - # OK, works on sane cases. Now check whether non-existent headers + # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ @@ -2351,24 +2954,22 @@ cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF -if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 - (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 +if { (ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null; then - if test -s conftest.err; then - ac_cpp_err=$ac_c_preproc_warn_flag - ac_cpp_err=$ac_cpp_err$ac_c_werror_flag - else - ac_cpp_err= - fi -else - ac_cpp_err=yes -fi -if test -z "$ac_cpp_err"; then + (exit $ac_status); } >/dev/null && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then # Broken: success on invalid input. continue else @@ -2379,6 +2980,7 @@ sed 's/^/| /' conftest.$ac_ext >&5 ac_preproc_ok=: break fi + rm -f conftest.err conftest.$ac_ext done @@ -2401,19 +3003,166 @@ ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $ ac_compiler_gnu=$ac_cv_c_compiler_gnu -echo "$as_me:$LINENO: checking for egrep" >&5 -echo $ECHO_N "checking for egrep... $ECHO_C" >&6 -if test "${ac_cv_prog_egrep+set}" = set; then +{ echo "$as_me:$LINENO: checking for grep that handles long lines and -e" >&5 +echo $ECHO_N "checking for grep that handles long lines and -e... $ECHO_C" >&6; } +if test "${ac_cv_path_GREP+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + # Extract the first word of "grep ggrep" to use in msg output +if test -z "$GREP"; then +set dummy grep ggrep; ac_prog_name=$2 +if test "${ac_cv_path_GREP+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_path_GREP_found=false +# Loop through the user's path and test for each of PROGNAME-LIST +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in grep ggrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" + { test -f "$ac_path_GREP" && $as_test_x "$ac_path_GREP"; } || continue + # Check for GNU ac_path_GREP and select it if it is found. + # Check for GNU $ac_path_GREP +case `"$ac_path_GREP" --version 2>&1` in +*GNU*) + ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; +*) + ac_count=0 + echo $ECHO_N "0123456789$ECHO_C" >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + echo 'GREP' >> "conftest.nl" + "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + ac_count=`expr $ac_count + 1` + if test $ac_count -gt ${ac_path_GREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_GREP="$ac_path_GREP" + ac_path_GREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + + $ac_path_GREP_found && break 3 + done +done + +done +IFS=$as_save_IFS + + +fi + +GREP="$ac_cv_path_GREP" +if test -z "$GREP"; then + { { echo "$as_me:$LINENO: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&5 +echo "$as_me: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&2;} + { (exit 1); exit 1; }; } +fi + +else + ac_cv_path_GREP=$GREP +fi + + +fi +{ echo "$as_me:$LINENO: result: $ac_cv_path_GREP" >&5 +echo "${ECHO_T}$ac_cv_path_GREP" >&6; } + GREP="$ac_cv_path_GREP" + + +{ echo "$as_me:$LINENO: checking for egrep" >&5 +echo $ECHO_N "checking for egrep... $ECHO_C" >&6; } +if test "${ac_cv_path_EGREP+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 + then ac_cv_path_EGREP="$GREP -E" + else + # Extract the first word of "egrep" to use in msg output +if test -z "$EGREP"; then +set dummy egrep; ac_prog_name=$2 +if test "${ac_cv_path_EGREP+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - if echo a | (grep -E '(a|b)') >/dev/null 2>&1 - then ac_cv_prog_egrep='grep -E' - else ac_cv_prog_egrep='egrep' + ac_path_EGREP_found=false +# Loop through the user's path and test for each of PROGNAME-LIST +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in egrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" + { test -f "$ac_path_EGREP" && $as_test_x "$ac_path_EGREP"; } || continue + # Check for GNU ac_path_EGREP and select it if it is found. + # Check for GNU $ac_path_EGREP +case `"$ac_path_EGREP" --version 2>&1` in +*GNU*) + ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; +*) + ac_count=0 + echo $ECHO_N "0123456789$ECHO_C" >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + echo 'EGREP' >> "conftest.nl" + "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + ac_count=`expr $ac_count + 1` + if test $ac_count -gt ${ac_path_EGREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_EGREP="$ac_path_EGREP" + ac_path_EGREP_max=$ac_count fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + + $ac_path_EGREP_found && break 3 + done +done + +done +IFS=$as_save_IFS + + +fi + +EGREP="$ac_cv_path_EGREP" +if test -z "$EGREP"; then + { { echo "$as_me:$LINENO: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&5 +echo "$as_me: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&2;} + { (exit 1); exit 1; }; } +fi + +else + ac_cv_path_EGREP=$EGREP +fi + + + fi fi -echo "$as_me:$LINENO: result: $ac_cv_prog_egrep" >&5 -echo "${ECHO_T}$ac_cv_prog_egrep" >&6 - EGREP=$ac_cv_prog_egrep +{ echo "$as_me:$LINENO: result: $ac_cv_path_EGREP" >&5 +echo "${ECHO_T}$ac_cv_path_EGREP" >&6; } + EGREP="$ac_cv_path_EGREP" @@ -2421,7 +3170,7 @@ echo "${ECHO_T}$ac_cv_prog_egrep" >&6 # expandable list at autoconf time; the second provides an expandable list # (i.e., shell variable) at configure time. - SUBDIRS='include libmath libsupc++ src po testsuite' + SUBDIRS='include libmath libsupc++ src doc po testsuite' # These need to be absolute paths, yet at the same time need to # canonicalize only relative paths, because then amd will not unmount @@ -2439,25 +3188,25 @@ echo "${ECHO_T}$ac_cv_prog_egrep" >&6 # We use these options to decide which functions to include. They are # set from the top level. -# Check whether --with-target-subdir or --without-target-subdir was given. +# Check whether --with-target-subdir was given. if test "${with_target_subdir+set}" = set; then - withval="$with_target_subdir" + withval=$with_target_subdir; +fi -fi; -# Check whether --with-cross-host or --without-cross-host was given. +# Check whether --with-cross-host was given. if test "${with_cross_host+set}" = set; then - withval="$with_cross_host" + withval=$with_cross_host; +fi -fi; -# Check whether --with-newlib or --without-newlib was given. +# Check whether --with-newlib was given. if test "${with_newlib+set}" = set; then - withval="$with_newlib" + withval=$with_newlib; +fi -fi; # We're almost certainly being configured before anything else which uses # C++, so all of our AC_PROG_* discoveries will be cached. It's vital that @@ -2489,8 +3238,8 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -2503,32 +3252,34 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="${ac_tool_prefix}gcc" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done +IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then - echo "$as_me:$LINENO: result: $CC" >&5 -echo "${ECHO_T}$CC" >&6 + { echo "$as_me:$LINENO: result: $CC" >&5 +echo "${ECHO_T}$CC" >&6; } else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } fi + fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_ac_ct_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -2541,36 +3292,51 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_CC="gcc" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done +IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then - echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 -echo "${ECHO_T}$ac_ct_CC" >&6 + { echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 +echo "${ECHO_T}$ac_ct_CC" >&6; } else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } fi - CC=$ac_ct_CC + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&5 +echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -2583,74 +3349,34 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="${ac_tool_prefix}cc" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done +IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then - echo "$as_me:$LINENO: result: $CC" >&5 -echo "${ECHO_T}$CC" >&6 -else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 -fi - -fi -if test -z "$ac_cv_prog_CC"; then - ac_ct_CC=$CC - # Extract the first word of "cc", so it can be a program name with args. -set dummy cc; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 -if test "${ac_cv_prog_ac_ct_CC+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test -n "$ac_ct_CC"; then - ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. + { echo "$as_me:$LINENO: result: $CC" >&5 +echo "${ECHO_T}$CC" >&6; } else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_CC="cc" - echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done -done - -fi -fi -ac_ct_CC=$ac_cv_prog_ac_ct_CC -if test -n "$ac_ct_CC"; then - echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 -echo "${ECHO_T}$ac_ct_CC" >&6 -else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } fi - CC=$ac_ct_CC -else - CC="$ac_cv_prog_CC" -fi + fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -2664,7 +3390,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue @@ -2675,6 +3401,7 @@ do fi done done +IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. @@ -2692,22 +3419,23 @@ fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then - echo "$as_me:$LINENO: result: $CC" >&5 -echo "${ECHO_T}$CC" >&6 + { echo "$as_me:$LINENO: result: $CC" >&5 +echo "${ECHO_T}$CC" >&6; } else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } fi + fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then - for ac_prog in cl + for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -2720,36 +3448,38 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done +IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then - echo "$as_me:$LINENO: result: $CC" >&5 -echo "${ECHO_T}$CC" >&6 + { echo "$as_me:$LINENO: result: $CC" >&5 +echo "${ECHO_T}$CC" >&6; } else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } fi + test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC - for ac_prog in cl + for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_ac_ct_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -2762,29 +3492,45 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_CC="$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done +IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then - echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 -echo "${ECHO_T}$ac_ct_CC" >&6 + { echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 +echo "${ECHO_T}$ac_ct_CC" >&6; } else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } fi + test -n "$ac_ct_CC" && break done - CC=$ac_ct_CC + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&5 +echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi fi fi @@ -2797,21 +3543,35 @@ See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } # Provide some information about the compiler. -echo "$as_me:$LINENO:" \ - "checking for C compiler version" >&5 +echo "$as_me:$LINENO: checking for C compiler version" >&5 ac_compiler=`set X $ac_compile; echo $2` -{ (eval echo "$as_me:$LINENO: \"$ac_compiler --version &5\"") >&5 - (eval $ac_compiler --version &5) 2>&5 +{ (ac_try="$ac_compiler --version >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compiler --version >&5") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } -{ (eval echo "$as_me:$LINENO: \"$ac_compiler -v &5\"") >&5 - (eval $ac_compiler -v &5) 2>&5 +{ (ac_try="$ac_compiler -v >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compiler -v >&5") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } -{ (eval echo "$as_me:$LINENO: \"$ac_compiler -V &5\"") >&5 - (eval $ac_compiler -V &5) 2>&5 +{ (ac_try="$ac_compiler -V >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compiler -V >&5") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } @@ -2869,47 +3629,77 @@ ac_clean_files="$ac_clean_files a.out a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. -echo "$as_me:$LINENO: checking for C compiler default output file name" >&5 -echo $ECHO_N "checking for C compiler default output file name... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking for C compiler default output file name" >&5 +echo $ECHO_N "checking for C compiler default output file name... $ECHO_C" >&6; } ac_link_default=`echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` -if { (eval echo "$as_me:$LINENO: \"$ac_link_default\"") >&5 - (eval $ac_link_default) 2>&5 +# +# List of possible output files, starting from the most likely. +# The algorithm is not robust to junk in `.', hence go to wildcards (a.*) +# only as a last resort. b.out is created by i960 compilers. +ac_files='a_out.exe a.exe conftest.exe a.out conftest a.* conftest.* b.out' +# +# The IRIX 6 linker writes into existing files which may not be +# executable, retaining their permissions. Remove them first so a +# subsequent execution test works. +ac_rmfiles= +for ac_file in $ac_files +do + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.o | *.obj ) ;; + * ) ac_rmfiles="$ac_rmfiles $ac_file";; + esac +done +rm -f $ac_rmfiles + +if { (ac_try="$ac_link_default" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link_default") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; then - # Find the output, starting from the most likely. This scheme is -# not robust to junk in `.', hence go to wildcards (a.*) only as a last -# resort. - -# Be careful to initialize this variable, since it used to be cached. -# Otherwise an old cache value of `no' led to `EXEEXT = no' in a Makefile. -ac_cv_exeext= -# b.out is created by i960 compilers. -for ac_file in a_out.exe a.exe conftest.exe a.out conftest a.* conftest.* b.out + # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. +# So ignore a value of `no', otherwise this would lead to `EXEEXT = no' +# in a Makefile. We should not override ac_cv_exeext if it was cached, +# so that the user can short-circuit this test for compilers unknown to +# Autoconf. +for ac_file in $ac_files '' do test -f "$ac_file" || continue case $ac_file in - *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj ) - ;; - conftest.$ac_ext ) - # This is the source file. + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) - ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` - # FIXME: I believe we export ac_cv_exeext for Libtool, - # but it would be cool to find out if it's true. Does anybody - # maintain Libtool? --akim. - export ac_cv_exeext + if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; + then :; else + ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + fi + # We set ac_cv_exeext here because the later test for it is not + # safe: cross compilers may not add the suffix if given an `-o' + # argument, so we may need to know it at that point already. + # Even if this section looks crufty: it has the advantage of + # actually working. break;; * ) break;; esac done +test "$ac_cv_exeext" = no && ac_cv_exeext= + else + ac_file='' +fi + +{ echo "$as_me:$LINENO: result: $ac_file" >&5 +echo "${ECHO_T}$ac_file" >&6; } +if test -z "$ac_file"; then echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 @@ -2921,19 +3711,21 @@ See \`config.log' for more details." >&2;} fi ac_exeext=$ac_cv_exeext -echo "$as_me:$LINENO: result: $ac_file" >&5 -echo "${ECHO_T}$ac_file" >&6 -# Check the compiler produces executables we can run. If not, either +# Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. -echo "$as_me:$LINENO: checking whether the C compiler works" >&5 -echo $ECHO_N "checking whether the C compiler works... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking whether the C compiler works" >&5 +echo $ECHO_N "checking whether the C compiler works... $ECHO_C" >&6; } # FIXME: These cross compiler hacks should be removed for Autoconf 3.0 # If not cross compiling, check that we can run a simple program. if test "$cross_compiling" != yes; then if { ac_try='./$ac_file' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then @@ -2952,22 +3744,27 @@ See \`config.log' for more details." >&2;} fi fi fi -echo "$as_me:$LINENO: result: yes" >&5 -echo "${ECHO_T}yes" >&6 +{ echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6; } rm -f a.out a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save -# Check the compiler produces executables we can run. If not, either +# Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. -echo "$as_me:$LINENO: checking whether we are cross compiling" >&5 -echo $ECHO_N "checking whether we are cross compiling... $ECHO_C" >&6 -echo "$as_me:$LINENO: result: $cross_compiling" >&5 -echo "${ECHO_T}$cross_compiling" >&6 - -echo "$as_me:$LINENO: checking for suffix of executables" >&5 -echo $ECHO_N "checking for suffix of executables... $ECHO_C" >&6 -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>&5 +{ echo "$as_me:$LINENO: checking whether we are cross compiling" >&5 +echo $ECHO_N "checking whether we are cross compiling... $ECHO_C" >&6; } +{ echo "$as_me:$LINENO: result: $cross_compiling" >&5 +echo "${ECHO_T}$cross_compiling" >&6; } + +{ echo "$as_me:$LINENO: checking for suffix of executables" >&5 +echo $ECHO_N "checking for suffix of executables... $ECHO_C" >&6; } +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; then @@ -2978,9 +3775,8 @@ if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in - *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj ) ;; + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` - export ac_cv_exeext break;; * ) break;; esac @@ -2994,15 +3790,15 @@ See \`config.log' for more details." >&2;} fi rm -f conftest$ac_cv_exeext -echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5 -echo "${ECHO_T}$ac_cv_exeext" >&6 +{ echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5 +echo "${ECHO_T}$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT fi -echo "$as_me:$LINENO: checking for suffix of object files" >&5 -echo $ECHO_N "checking for suffix of object files... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking for suffix of object files" >&5 +echo $ECHO_N "checking for suffix of object files... $ECHO_C" >&6; } if test "${ac_cv_objext+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -3022,14 +3818,20 @@ main () } _ACEOF rm -f conftest.o conftest.obj -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>&5 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; then - for ac_file in `(ls conftest.o conftest.obj; ls conftest.*) 2>/dev/null`; do + for ac_file in conftest.o conftest.obj conftest.*; do + test -f "$ac_file" || continue; case $ac_file in - *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg ) ;; + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac @@ -3047,12 +3849,12 @@ fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: $ac_cv_objext" >&5 -echo "${ECHO_T}$ac_cv_objext" >&6 +{ echo "$as_me:$LINENO: result: $ac_cv_objext" >&5 +echo "${ECHO_T}$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT -echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5 -echo $ECHO_N "checking whether we are using the GNU C compiler... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5 +echo $ECHO_N "checking whether we are using the GNU C compiler... $ECHO_C" >&6; } if test "${ac_cv_c_compiler_gnu+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -3075,50 +3877,49 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then ac_compiler_gnu=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -ac_compiler_gnu=no + ac_compiler_gnu=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi -echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5 -echo "${ECHO_T}$ac_cv_c_compiler_gnu" >&6 +{ echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5 +echo "${ECHO_T}$ac_cv_c_compiler_gnu" >&6; } GCC=`test $ac_compiler_gnu = yes && echo yes` ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS -CFLAGS="-g" -echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5 -echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5 +echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6; } if test "${ac_cv_prog_cc_g+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - cat >conftest.$ac_ext <<_ACEOF + ac_save_c_werror_flag=$ac_c_werror_flag + ac_c_werror_flag=yes + ac_cv_prog_cc_g=no + CFLAGS="-g" + cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext @@ -3134,38 +3935,118 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_prog_cc_g=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + CFLAGS="" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + : +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_c_werror_flag=$ac_save_c_werror_flag + CFLAGS="-g" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then ac_cv_prog_cc_g=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -ac_cv_prog_cc_g=no + fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5 -echo "${ECHO_T}$ac_cv_prog_cc_g" >&6 + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_c_werror_flag=$ac_save_c_werror_flag +fi +{ echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5 +echo "${ECHO_T}$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then @@ -3181,12 +4062,12 @@ else CFLAGS= fi fi -echo "$as_me:$LINENO: checking for $CC option to accept ANSI C" >&5 -echo $ECHO_N "checking for $CC option to accept ANSI C... $ECHO_C" >&6 -if test "${ac_cv_prog_cc_stdc+set}" = set; then +{ echo "$as_me:$LINENO: checking for $CC option to accept ISO C89" >&5 +echo $ECHO_N "checking for $CC option to accept ISO C89... $ECHO_C" >&6; } +if test "${ac_cv_prog_cc_c89+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - ac_cv_prog_cc_stdc=no + ac_cv_prog_cc_c89=no ac_save_CC=$CC cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ @@ -3220,12 +4101,17 @@ static char *f (char * (*g) (char **, int), char **p, ...) /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated - as 'x'. The following induces an error, until -std1 is added to get + as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something - that's true only with -std1. */ + that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; +/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters + inside strings and character constants. */ +#define FOO(x) 'x' +int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; + int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; @@ -3240,223 +4126,79 @@ return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; return 0; } _ACEOF -# Don't try gcc -ansi; that turns off useful extensions and -# breaks some systems' header files. -# AIX -qlanglvl=ansi -# Ultrix and OSF/1 -std1 -# HP-UX 10.20 and later -Ae -# HP-UX older versions -Aa -D_HPUX_SOURCE -# SVR4 -Xc -D__EXTENSIONS__ -for ac_arg in "" -qlanglvl=ansi -std1 -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" +for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ + -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_prog_cc_stdc=$ac_arg -break + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_prog_cc_c89=$ac_arg else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 + fi -rm -f conftest.err conftest.$ac_objext + +rm -f core conftest.err conftest.$ac_objext + test "x$ac_cv_prog_cc_c89" != "xno" && break done -rm -f conftest.$ac_ext conftest.$ac_objext +rm -f conftest.$ac_ext CC=$ac_save_CC fi - -case "x$ac_cv_prog_cc_stdc" in - x|xno) - echo "$as_me:$LINENO: result: none needed" >&5 -echo "${ECHO_T}none needed" >&6 ;; +# AC_CACHE_VAL +case "x$ac_cv_prog_cc_c89" in + x) + { echo "$as_me:$LINENO: result: none needed" >&5 +echo "${ECHO_T}none needed" >&6; } ;; + xno) + { echo "$as_me:$LINENO: result: unsupported" >&5 +echo "${ECHO_T}unsupported" >&6; } ;; *) - echo "$as_me:$LINENO: result: $ac_cv_prog_cc_stdc" >&5 -echo "${ECHO_T}$ac_cv_prog_cc_stdc" >&6 - CC="$CC $ac_cv_prog_cc_stdc" ;; + CC="$CC $ac_cv_prog_cc_c89" + { echo "$as_me:$LINENO: result: $ac_cv_prog_cc_c89" >&5 +echo "${ECHO_T}$ac_cv_prog_cc_c89" >&6; } ;; esac -# Some people use a C++ compiler to compile C. Since we use `exit', -# in C++ we need to declare it. In case someone uses the same compiler -# for both compiling C and C++ we need to have the C++ compiler decide -# the declaration of exit, since it's the most demanding environment. -cat >conftest.$ac_ext <<_ACEOF -#ifndef __cplusplus - choke me -#endif -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - for ac_declaration in \ - '' \ - 'extern "C" void std::exit (int) throw (); using std::exit;' \ - 'extern "C" void std::exit (int); using std::exit;' \ - 'extern "C" void exit (int) throw ();' \ - 'extern "C" void exit (int);' \ - 'void exit (int);' -do - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_declaration -#include -int -main () -{ -exit (42); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - : -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -continue -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_declaration -int -main () -{ -exit (42); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - break -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -done -rm -f conftest* -if test -n "$ac_declaration"; then - echo '#ifdef __cplusplus' >>confdefs.h - echo $ac_declaration >>confdefs.h - echo '#endif' >>confdefs.h -fi - -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu -if test -n "$ac_tool_prefix"; then - for ac_prog in $CCC g++ c++ gpp aCC CC cxx cc++ cl FCC KCC RCC xlC_r xlC +if test -z "$CXX"; then + if test -n "$CCC"; then + CXX=$CCC + else + if test -n "$ac_tool_prefix"; then + for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${glibcxx_cv_prog_CXX+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -3469,36 +4211,38 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then glibcxx_cv_prog_CXX="$ac_tool_prefix$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done +IFS=$as_save_IFS fi fi CXX=$glibcxx_cv_prog_CXX if test -n "$CXX"; then - echo "$as_me:$LINENO: result: $CXX" >&5 -echo "${ECHO_T}$CXX" >&6 + { echo "$as_me:$LINENO: result: $CXX" >&5 +echo "${ECHO_T}$CXX" >&6; } else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } fi + test -n "$CXX" && break done fi if test -z "$CXX"; then ac_ct_CXX=$CXX - for ac_prog in $CCC g++ c++ gpp aCC CC cxx cc++ cl FCC KCC RCC xlC_r xlC + for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_ac_ct_CXX+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -3511,55 +4255,85 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_CXX="$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done +IFS=$as_save_IFS fi fi ac_ct_CXX=$ac_cv_prog_ac_ct_CXX if test -n "$ac_ct_CXX"; then - echo "$as_me:$LINENO: result: $ac_ct_CXX" >&5 -echo "${ECHO_T}$ac_ct_CXX" >&6 + { echo "$as_me:$LINENO: result: $ac_ct_CXX" >&5 +echo "${ECHO_T}$ac_ct_CXX" >&6; } else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } fi + test -n "$ac_ct_CXX" && break done -test -n "$ac_ct_CXX" || ac_ct_CXX="g++" - CXX=$ac_ct_CXX + if test "x$ac_ct_CXX" = x; then + CXX="g++" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&5 +echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&2;} +ac_tool_warned=yes ;; +esac + CXX=$ac_ct_CXX + fi fi - + fi +fi # Provide some information about the compiler. -echo "$as_me:$LINENO:" \ - "checking for C++ compiler version" >&5 +echo "$as_me:$LINENO: checking for C++ compiler version" >&5 ac_compiler=`set X $ac_compile; echo $2` -{ (eval echo "$as_me:$LINENO: \"$ac_compiler --version &5\"") >&5 - (eval $ac_compiler --version &5) 2>&5 +{ (ac_try="$ac_compiler --version >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compiler --version >&5") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } -{ (eval echo "$as_me:$LINENO: \"$ac_compiler -v &5\"") >&5 - (eval $ac_compiler -v &5) 2>&5 +{ (ac_try="$ac_compiler -v >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compiler -v >&5") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } -{ (eval echo "$as_me:$LINENO: \"$ac_compiler -V &5\"") >&5 - (eval $ac_compiler -V &5) 2>&5 +{ (ac_try="$ac_compiler -V >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compiler -V >&5") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } -echo "$as_me:$LINENO: checking whether we are using the GNU C++ compiler" >&5 -echo $ECHO_N "checking whether we are using the GNU C++ compiler... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking whether we are using the GNU C++ compiler" >&5 +echo $ECHO_N "checking whether we are using the GNU C++ compiler... $ECHO_C" >&6; } if test "${ac_cv_cxx_compiler_gnu+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -3582,50 +4356,49 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then ac_compiler_gnu=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -ac_compiler_gnu=no + ac_compiler_gnu=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_cxx_compiler_gnu=$ac_compiler_gnu fi -echo "$as_me:$LINENO: result: $ac_cv_cxx_compiler_gnu" >&5 -echo "${ECHO_T}$ac_cv_cxx_compiler_gnu" >&6 +{ echo "$as_me:$LINENO: result: $ac_cv_cxx_compiler_gnu" >&5 +echo "${ECHO_T}$ac_cv_cxx_compiler_gnu" >&6; } GXX=`test $ac_compiler_gnu = yes && echo yes` ac_test_CXXFLAGS=${CXXFLAGS+set} ac_save_CXXFLAGS=$CXXFLAGS -CXXFLAGS="-g" -echo "$as_me:$LINENO: checking whether $CXX accepts -g" >&5 -echo $ECHO_N "checking whether $CXX accepts -g... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking whether $CXX accepts -g" >&5 +echo $ECHO_N "checking whether $CXX accepts -g... $ECHO_C" >&6; } if test "${ac_cv_prog_cxx_g+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - cat >conftest.$ac_ext <<_ACEOF + ac_save_cxx_werror_flag=$ac_cxx_werror_flag + ac_cxx_werror_flag=yes + ac_cv_prog_cxx_g=no + CXXFLAGS="-g" + cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext @@ -3641,159 +4414,133 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then ac_cv_prog_cxx_g=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -ac_cv_prog_cxx_g=no -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: $ac_cv_prog_cxx_g" >&5 -echo "${ECHO_T}$ac_cv_prog_cxx_g" >&6 -if test "$ac_test_CXXFLAGS" = set; then - CXXFLAGS=$ac_save_CXXFLAGS -elif test $ac_cv_prog_cxx_g = yes; then - if test "$GXX" = yes; then - CXXFLAGS="-g -O2" - else - CXXFLAGS="-g" - fi -else - if test "$GXX" = yes; then - CXXFLAGS="-O2" - else - CXXFLAGS= - fi -fi -for ac_declaration in \ - '' \ - 'extern "C" void std::exit (int) throw (); using std::exit;' \ - 'extern "C" void std::exit (int); using std::exit;' \ - 'extern "C" void exit (int) throw ();' \ - 'extern "C" void exit (int);' \ - 'void exit (int);' -do - cat >conftest.$ac_ext <<_ACEOF + CXXFLAGS="" + cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ -$ac_declaration -#include + int main () { -exit (42); + ; return 0; } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then : else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -continue -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext - cat >conftest.$ac_ext <<_ACEOF + ac_cxx_werror_flag=$ac_save_cxx_werror_flag + CXXFLAGS="-g" + cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ -$ac_declaration + int main () { -exit (42); + ; return 0; } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - break + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_prog_cxx_g=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 + fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -done -rm -f conftest* -if test -n "$ac_declaration"; then - echo '#ifdef __cplusplus' >>confdefs.h - echo $ac_declaration >>confdefs.h - echo '#endif' >>confdefs.h + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_cxx_werror_flag=$ac_save_cxx_werror_flag +fi +{ echo "$as_me:$LINENO: result: $ac_cv_prog_cxx_g" >&5 +echo "${ECHO_T}$ac_cv_prog_cxx_g" >&6; } +if test "$ac_test_CXXFLAGS" = set; then + CXXFLAGS=$ac_save_CXXFLAGS +elif test $ac_cv_prog_cxx_g = yes; then + if test "$GXX" = yes; then + CXXFLAGS="-g -O2" + else + CXXFLAGS="-g" + fi +else + if test "$GXX" = yes; then + CXXFLAGS="-O2" + else + CXXFLAGS= + fi +fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -3807,15 +4554,15 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu # Will set LN_S to either 'ln -s', 'ln', or 'cp -p' (if linking isn't # available). Uncomment the next line to force a particular method. - echo "$as_me:$LINENO: checking whether ln -s works" >&5 -echo $ECHO_N "checking whether ln -s works... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking whether ln -s works" >&5 +echo $ECHO_N "checking whether ln -s works... $ECHO_C" >&6; } LN_S=$as_ln_s if test "$LN_S" = "ln -s"; then - echo "$as_me:$LINENO: result: yes" >&5 -echo "${ECHO_T}yes" >&6 + { echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6; } else - echo "$as_me:$LINENO: result: no, using $LN_S" >&5 -echo "${ECHO_T}no, using $LN_S" >&6 + { echo "$as_me:$LINENO: result: no, using $LN_S" >&5 +echo "${ECHO_T}no, using $LN_S" >&6; } fi #LN_S='cp -p' @@ -3823,8 +4570,8 @@ fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}as", so it can be a program name with args. set dummy ${ac_tool_prefix}as; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_AS+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -3837,32 +4584,34 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_AS="${ac_tool_prefix}as" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done +IFS=$as_save_IFS fi fi AS=$ac_cv_prog_AS if test -n "$AS"; then - echo "$as_me:$LINENO: result: $AS" >&5 -echo "${ECHO_T}$AS" >&6 + { echo "$as_me:$LINENO: result: $AS" >&5 +echo "${ECHO_T}$AS" >&6; } else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } fi + fi if test -z "$ac_cv_prog_AS"; then ac_ct_AS=$AS # Extract the first word of "as", so it can be a program name with args. set dummy as; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_ac_ct_AS+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -3875,26 +4624,41 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_AS="as" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done +IFS=$as_save_IFS fi fi ac_ct_AS=$ac_cv_prog_ac_ct_AS if test -n "$ac_ct_AS"; then - echo "$as_me:$LINENO: result: $ac_ct_AS" >&5 -echo "${ECHO_T}$ac_ct_AS" >&6 + { echo "$as_me:$LINENO: result: $ac_ct_AS" >&5 +echo "${ECHO_T}$ac_ct_AS" >&6; } else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } fi - AS=$ac_ct_AS + if test "x$ac_ct_AS" = x; then + AS="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&5 +echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&2;} +ac_tool_warned=yes ;; +esac + AS=$ac_ct_AS + fi else AS="$ac_cv_prog_AS" fi @@ -3902,8 +4666,8 @@ fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ar", so it can be a program name with args. set dummy ${ac_tool_prefix}ar; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_AR+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -3916,32 +4680,34 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_AR="${ac_tool_prefix}ar" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done +IFS=$as_save_IFS fi fi AR=$ac_cv_prog_AR if test -n "$AR"; then - echo "$as_me:$LINENO: result: $AR" >&5 -echo "${ECHO_T}$AR" >&6 + { echo "$as_me:$LINENO: result: $AR" >&5 +echo "${ECHO_T}$AR" >&6; } else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } fi + fi if test -z "$ac_cv_prog_AR"; then ac_ct_AR=$AR # Extract the first word of "ar", so it can be a program name with args. set dummy ar; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_ac_ct_AR+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -3954,26 +4720,41 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_AR="ar" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done +IFS=$as_save_IFS fi fi ac_ct_AR=$ac_cv_prog_ac_ct_AR if test -n "$ac_ct_AR"; then - echo "$as_me:$LINENO: result: $ac_ct_AR" >&5 -echo "${ECHO_T}$ac_ct_AR" >&6 + { echo "$as_me:$LINENO: result: $ac_ct_AR" >&5 +echo "${ECHO_T}$ac_ct_AR" >&6; } else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } fi - AR=$ac_ct_AR + if test "x$ac_ct_AR" = x; then + AR="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&5 +echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&2;} +ac_tool_warned=yes ;; +esac + AR=$ac_ct_AR + fi else AR="$ac_cv_prog_AR" fi @@ -3981,8 +4762,8 @@ fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. set dummy ${ac_tool_prefix}ranlib; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_RANLIB+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -3995,32 +4776,34 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done +IFS=$as_save_IFS fi fi RANLIB=$ac_cv_prog_RANLIB if test -n "$RANLIB"; then - echo "$as_me:$LINENO: result: $RANLIB" >&5 -echo "${ECHO_T}$RANLIB" >&6 + { echo "$as_me:$LINENO: result: $RANLIB" >&5 +echo "${ECHO_T}$RANLIB" >&6; } else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } fi + fi if test -z "$ac_cv_prog_RANLIB"; then ac_ct_RANLIB=$RANLIB # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -4033,46 +4816,58 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_RANLIB="ranlib" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done +IFS=$as_save_IFS - test -z "$ac_cv_prog_ac_ct_RANLIB" && ac_cv_prog_ac_ct_RANLIB="ranlib-not-found-in-path-error" fi fi ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB if test -n "$ac_ct_RANLIB"; then - echo "$as_me:$LINENO: result: $ac_ct_RANLIB" >&5 -echo "${ECHO_T}$ac_ct_RANLIB" >&6 + { echo "$as_me:$LINENO: result: $ac_ct_RANLIB" >&5 +echo "${ECHO_T}$ac_ct_RANLIB" >&6; } else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } fi - RANLIB=$ac_ct_RANLIB + if test "x$ac_ct_RANLIB" = x; then + RANLIB="ranlib-not-found-in-path-error" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&5 +echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&2;} +ac_tool_warned=yes ;; +esac + RANLIB=$ac_ct_RANLIB + fi else RANLIB="$ac_cv_prog_RANLIB" fi - echo "$as_me:$LINENO: checking whether to enable maintainer-specific portions of Makefiles" >&5 -echo $ECHO_N "checking whether to enable maintainer-specific portions of Makefiles... $ECHO_C" >&6 - # Check whether --enable-maintainer-mode or --disable-maintainer-mode was given. + { echo "$as_me:$LINENO: checking whether to enable maintainer-specific portions of Makefiles" >&5 +echo $ECHO_N "checking whether to enable maintainer-specific portions of Makefiles... $ECHO_C" >&6; } + # Check whether --enable-maintainer-mode was given. if test "${enable_maintainer_mode+set}" = set; then - enableval="$enable_maintainer_mode" - USE_MAINTAINER_MODE=$enableval + enableval=$enable_maintainer_mode; USE_MAINTAINER_MODE=$enableval else USE_MAINTAINER_MODE=no -fi; - echo "$as_me:$LINENO: result: $USE_MAINTAINER_MODE" >&5 -echo "${ECHO_T}$USE_MAINTAINER_MODE" >&6 - +fi -if test $USE_MAINTAINER_MODE = yes; then + { echo "$as_me:$LINENO: result: $USE_MAINTAINER_MODE" >&5 +echo "${ECHO_T}$USE_MAINTAINER_MODE" >&6; } + if test $USE_MAINTAINER_MODE = yes; then MAINTAINER_MODE_TRUE= MAINTAINER_MODE_FALSE='#' else @@ -4153,10 +4948,9 @@ ltmain="$ac_aux_dir/ltmain.sh" enable_win32_dll=no -# Check whether --enable-shared or --disable-shared was given. +# Check whether --enable-shared was given. if test "${enable_shared+set}" = set; then - enableval="$enable_shared" - p=${PACKAGE-default} + enableval=$enable_shared; p=${PACKAGE-default} case $enableval in yes) enable_shared=yes ;; no) enable_shared=no ;; @@ -4175,7 +4969,7 @@ if test "${enable_shared+set}" = set; then esac else enable_shared=yes -fi; +fi @@ -4184,10 +4978,10 @@ fi; -# Check whether --enable-static or --disable-static was given. + +# Check whether --enable-static was given. if test "${enable_static+set}" = set; then - enableval="$enable_static" - p=${PACKAGE-default} + enableval=$enable_static; p=${PACKAGE-default} case $enableval in yes) enable_static=yes ;; no) enable_static=no ;; @@ -4206,7 +5000,7 @@ if test "${enable_static+set}" = set; then esac else enable_static=yes -fi; +fi @@ -4216,13 +5010,14 @@ fi; -# Check whether --with-pic or --without-pic was given. + +# Check whether --with-pic was given. if test "${with_pic+set}" = set; then - withval="$with_pic" - pic_mode="$withval" + withval=$with_pic; pic_mode="$withval" else pic_mode=default -fi; +fi + test -z "$pic_mode" && pic_mode=default @@ -4232,10 +5027,9 @@ test -z "$pic_mode" && pic_mode=default -# Check whether --enable-fast-install or --disable-fast-install was given. +# Check whether --enable-fast-install was given. if test "${enable_fast_install+set}" = set; then - enableval="$enable_fast_install" - p=${PACKAGE-default} + enableval=$enable_fast_install; p=${PACKAGE-default} case $enableval in yes) enable_fast_install=yes ;; no) enable_fast_install=no ;; @@ -4254,7 +5048,7 @@ if test "${enable_fast_install+set}" = set; then esac else enable_fast_install=yes -fi; +fi @@ -4263,64 +5057,90 @@ fi; -echo "$as_me:$LINENO: checking for a sed that does not truncate output" >&5 -echo $ECHO_N "checking for a sed that does not truncate output... $ECHO_C" >&6 -if test "${lt_cv_path_SED+set}" = set; then + +{ echo "$as_me:$LINENO: checking for a sed that does not truncate output" >&5 +echo $ECHO_N "checking for a sed that does not truncate output... $ECHO_C" >&6; } +if test "${ac_cv_path_SED+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ + for ac_i in 1 2 3 4 5 6 7; do + ac_script="$ac_script$as_nl$ac_script" + done + echo "$ac_script" | sed 99q >conftest.sed + $as_unset ac_script || ac_script= + # Extract the first word of "sed gsed" to use in msg output +if test -z "$SED"; then +set dummy sed gsed; ac_prog_name=$2 +if test "${ac_cv_path_SED+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - # Loop through the user's path and test for sed and gsed. -# Then use that list of sed's as ones to test for truncation. + ac_path_SED_found=false +# Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for lt_ac_prog in sed gsed; do - for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then - lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext" - fi - done - done -done -IFS=$as_save_IFS -lt_ac_max=0 -lt_ac_count=0 -# Add /usr/xpg4/bin/sed as it is typically found on Solaris -# along with /bin/sed that truncates output. -for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do - test ! -f $lt_ac_sed && continue - cat /dev/null > conftest.in - lt_ac_count=0 - echo $ECHO_N "0123456789$ECHO_C" >conftest.in - # Check for GNU sed and select it if it is found. - if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then - lt_cv_path_SED=$lt_ac_sed - break - fi - while true; do - cat conftest.in conftest.in >conftest.tmp - mv conftest.tmp conftest.in - cp conftest.in conftest.nl - echo >>conftest.nl - $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break - cmp -s conftest.out conftest.nl || break - # 10000 chars as input seems more than enough - test $lt_ac_count -gt 10 && break - lt_ac_count=`expr $lt_ac_count + 1` - if test $lt_ac_count -gt $lt_ac_max; then - lt_ac_max=$lt_ac_count - lt_cv_path_SED=$lt_ac_sed + for ac_prog in sed gsed; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_SED="$as_dir/$ac_prog$ac_exec_ext" + { test -f "$ac_path_SED" && $as_test_x "$ac_path_SED"; } || continue + # Check for GNU ac_path_SED and select it if it is found. + # Check for GNU $ac_path_SED +case `"$ac_path_SED" --version 2>&1` in +*GNU*) + ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;; +*) + ac_count=0 + echo $ECHO_N "0123456789$ECHO_C" >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + echo '' >> "conftest.nl" + "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + ac_count=`expr $ac_count + 1` + if test $ac_count -gt ${ac_path_SED_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_SED="$ac_path_SED" + ac_path_SED_max=$ac_count fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + + $ac_path_SED_found && break 3 + done +done + done +IFS=$as_save_IFS + fi -SED=$lt_cv_path_SED +SED="$ac_cv_path_SED" +if test -z "$SED"; then + { { echo "$as_me:$LINENO: error: no acceptable $ac_prog_name could be found in \$PATH" >&5 +echo "$as_me: error: no acceptable $ac_prog_name could be found in \$PATH" >&2;} + { (exit 1); exit 1; }; } +fi -echo "$as_me:$LINENO: result: $SED" >&5 -echo "${ECHO_T}$SED" >&6 +else + ac_cv_path_SED=$SED +fi + +fi +{ echo "$as_me:$LINENO: result: $ac_cv_path_SED" >&5 +echo "${ECHO_T}$ac_cv_path_SED" >&6; } + SED="$ac_cv_path_SED" + rm -f conftest.sed test -z "$SED" && SED=sed Xsed="$SED -e 1s/^X//" @@ -4335,19 +5155,87 @@ Xsed="$SED -e 1s/^X//" -echo "$as_me:$LINENO: checking for fgrep" >&5 -echo $ECHO_N "checking for fgrep... $ECHO_C" >&6 -if test "${ac_cv_prog_fgrep+set}" = set; then +{ echo "$as_me:$LINENO: checking for fgrep" >&5 +echo $ECHO_N "checking for fgrep... $ECHO_C" >&6; } +if test "${ac_cv_path_FGREP+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - if echo 'ab*c' | (grep -F 'ab*c') >/dev/null 2>&1 - then ac_cv_prog_fgrep='grep -F' - else ac_cv_prog_fgrep='fgrep' + if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1 + then ac_cv_path_FGREP="$GREP -F" + else + # Extract the first word of "fgrep" to use in msg output +if test -z "$FGREP"; then +set dummy fgrep; ac_prog_name=$2 +if test "${ac_cv_path_FGREP+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_path_FGREP_found=false +# Loop through the user's path and test for each of PROGNAME-LIST +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in fgrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_FGREP="$as_dir/$ac_prog$ac_exec_ext" + { test -f "$ac_path_FGREP" && $as_test_x "$ac_path_FGREP"; } || continue + # Check for GNU ac_path_FGREP and select it if it is found. + # Check for GNU $ac_path_FGREP +case `"$ac_path_FGREP" --version 2>&1` in +*GNU*) + ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_found=:;; +*) + ac_count=0 + echo $ECHO_N "0123456789$ECHO_C" >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + echo 'FGREP' >> "conftest.nl" + "$ac_path_FGREP" FGREP < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + ac_count=`expr $ac_count + 1` + if test $ac_count -gt ${ac_path_FGREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_FGREP="$ac_path_FGREP" + ac_path_FGREP_max=$ac_count fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + + $ac_path_FGREP_found && break 3 + done +done + +done +IFS=$as_save_IFS + + fi -echo "$as_me:$LINENO: result: $ac_cv_prog_fgrep" >&5 -echo "${ECHO_T}$ac_cv_prog_fgrep" >&6 - FGREP=$ac_cv_prog_fgrep + +FGREP="$ac_cv_path_FGREP" +if test -z "$FGREP"; then + { { echo "$as_me:$LINENO: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&5 +echo "$as_me: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&2;} + { (exit 1); exit 1; }; } +fi + +else + ac_cv_path_FGREP=$FGREP +fi + + + fi +fi +{ echo "$as_me:$LINENO: result: $ac_cv_path_FGREP" >&5 +echo "${ECHO_T}$ac_cv_path_FGREP" >&6; } + FGREP="$ac_cv_path_FGREP" test -z "$GREP" && GREP=grep @@ -4370,18 +5258,18 @@ test -z "$GREP" && GREP=grep -# Check whether --with-gnu-ld or --without-gnu-ld was given. +# Check whether --with-gnu-ld was given. if test "${with_gnu_ld+set}" = set; then - withval="$with_gnu_ld" - test "$withval" = no || with_gnu_ld=yes + withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes else with_gnu_ld=no -fi; +fi + ac_prog=ld if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. - echo "$as_me:$LINENO: checking for ld used by $CC" >&5 -echo $ECHO_N "checking for ld used by $CC... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for ld used by $CC" >&5 +echo $ECHO_N "checking for ld used by $CC... $ECHO_C" >&6; } case $host in *-*-mingw*) # gcc leaves a trailing carriage return which upsets mingw @@ -4410,11 +5298,11 @@ echo $ECHO_N "checking for ld used by $CC... $ECHO_C" >&6 ;; esac elif test "$with_gnu_ld" = yes; then - echo "$as_me:$LINENO: checking for GNU ld" >&5 -echo $ECHO_N "checking for GNU ld... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for GNU ld" >&5 +echo $ECHO_N "checking for GNU ld... $ECHO_C" >&6; } else - echo "$as_me:$LINENO: checking for non-GNU ld" >&5 -echo $ECHO_N "checking for non-GNU ld... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for non-GNU ld" >&5 +echo $ECHO_N "checking for non-GNU ld... $ECHO_C" >&6; } fi if test "${lt_cv_path_LD+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 @@ -4447,17 +5335,17 @@ fi LD="$lt_cv_path_LD" if test -n "$LD"; then - echo "$as_me:$LINENO: result: $LD" >&5 -echo "${ECHO_T}$LD" >&6 + { echo "$as_me:$LINENO: result: $LD" >&5 +echo "${ECHO_T}$LD" >&6; } else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } fi test -z "$LD" && { { echo "$as_me:$LINENO: error: no acceptable ld found in \$PATH" >&5 echo "$as_me: error: no acceptable ld found in \$PATH" >&2;} { (exit 1); exit 1; }; } -echo "$as_me:$LINENO: checking if the linker ($LD) is GNU ld" >&5 -echo $ECHO_N "checking if the linker ($LD) is GNU ld... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking if the linker ($LD) is GNU ld" >&5 +echo $ECHO_N "checking if the linker ($LD) is GNU ld... $ECHO_C" >&6; } if test "${lt_cv_prog_gnu_ld+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -4471,8 +5359,8 @@ case `$LD -v 2>&1 &5 -echo "${ECHO_T}$lt_cv_prog_gnu_ld" >&6 +{ echo "$as_me:$LINENO: result: $lt_cv_prog_gnu_ld" >&5 +echo "${ECHO_T}$lt_cv_prog_gnu_ld" >&6; } with_gnu_ld=$lt_cv_prog_gnu_ld @@ -4484,8 +5372,8 @@ with_gnu_ld=$lt_cv_prog_gnu_ld -echo "$as_me:$LINENO: checking for BSD- or MS-compatible name lister (nm)" >&5 -echo $ECHO_N "checking for BSD- or MS-compatible name lister (nm)... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking for BSD- or MS-compatible name lister (nm)" >&5 +echo $ECHO_N "checking for BSD- or MS-compatible name lister (nm)... $ECHO_C" >&6; } if test "${lt_cv_path_NM+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -4533,8 +5421,8 @@ else : ${lt_cv_path_NM=no} fi fi -echo "$as_me:$LINENO: result: $lt_cv_path_NM" >&5 -echo "${ECHO_T}$lt_cv_path_NM" >&6 +{ echo "$as_me:$LINENO: result: $lt_cv_path_NM" >&5 +echo "${ECHO_T}$lt_cv_path_NM" >&6; } if test "$lt_cv_path_NM" != "no"; then NM="$lt_cv_path_NM" else @@ -4544,8 +5432,8 @@ else do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_DUMPBIN+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -4558,25 +5446,27 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_DUMPBIN="$ac_tool_prefix$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done +IFS=$as_save_IFS fi fi DUMPBIN=$ac_cv_prog_DUMPBIN if test -n "$DUMPBIN"; then - echo "$as_me:$LINENO: result: $DUMPBIN" >&5 -echo "${ECHO_T}$DUMPBIN" >&6 + { echo "$as_me:$LINENO: result: $DUMPBIN" >&5 +echo "${ECHO_T}$DUMPBIN" >&6; } else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } fi + test -n "$DUMPBIN" && break done fi @@ -4586,8 +5476,8 @@ if test -z "$DUMPBIN"; then do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_ac_ct_DUMPBIN+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -4600,30 +5490,45 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_DUMPBIN="$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done +IFS=$as_save_IFS fi fi ac_ct_DUMPBIN=$ac_cv_prog_ac_ct_DUMPBIN if test -n "$ac_ct_DUMPBIN"; then - echo "$as_me:$LINENO: result: $ac_ct_DUMPBIN" >&5 -echo "${ECHO_T}$ac_ct_DUMPBIN" >&6 + { echo "$as_me:$LINENO: result: $ac_ct_DUMPBIN" >&5 +echo "${ECHO_T}$ac_ct_DUMPBIN" >&6; } else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } fi + test -n "$ac_ct_DUMPBIN" && break done -test -n "$ac_ct_DUMPBIN" || ac_ct_DUMPBIN=":" - DUMPBIN=$ac_ct_DUMPBIN + if test "x$ac_ct_DUMPBIN" = x; then + DUMPBIN=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&5 +echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&2;} +ac_tool_warned=yes ;; +esac + DUMPBIN=$ac_ct_DUMPBIN + fi fi @@ -4638,32 +5543,32 @@ test -z "$NM" && NM=nm -echo "$as_me:$LINENO: checking the name lister ($NM) interface" >&5 -echo $ECHO_N "checking the name lister ($NM) interface... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking the name lister ($NM) interface" >&5 +echo $ECHO_N "checking the name lister ($NM) interface... $ECHO_C" >&6; } if test "${lt_cv_nm_interface+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else lt_cv_nm_interface="BSD nm" echo "int some_variable = 0;" > conftest.$ac_ext - (eval echo "\"\$as_me:4648: $ac_compile\"" >&5) + (eval echo "\"\$as_me:5553: $ac_compile\"" >&5) (eval "$ac_compile" 2>conftest.err) cat conftest.err >&5 - (eval echo "\"\$as_me:4651: $NM \\\"conftest.$ac_objext\\\"\"" >&5) + (eval echo "\"\$as_me:5556: $NM \\\"conftest.$ac_objext\\\"\"" >&5) (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) cat conftest.err >&5 - (eval echo "\"\$as_me:4654: output\"" >&5) + (eval echo "\"\$as_me:5559: output\"" >&5) cat conftest.out >&5 if $GREP 'External.*some_variable' conftest.out > /dev/null; then lt_cv_nm_interface="MS dumpbin" fi rm -f conftest* fi -echo "$as_me:$LINENO: result: $lt_cv_nm_interface" >&5 -echo "${ECHO_T}$lt_cv_nm_interface" >&6 +{ echo "$as_me:$LINENO: result: $lt_cv_nm_interface" >&5 +echo "${ECHO_T}$lt_cv_nm_interface" >&6; } # find the maximum length of command line arguments -echo "$as_me:$LINENO: checking the maximum length of command line arguments" >&5 -echo $ECHO_N "checking the maximum length of command line arguments... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking the maximum length of command line arguments" >&5 +echo $ECHO_N "checking the maximum length of command line arguments... $ECHO_C" >&6; } if test "${lt_cv_sys_max_cmd_len+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -4782,11 +5687,11 @@ else fi if test -n $lt_cv_sys_max_cmd_len ; then - echo "$as_me:$LINENO: result: $lt_cv_sys_max_cmd_len" >&5 -echo "${ECHO_T}$lt_cv_sys_max_cmd_len" >&6 + { echo "$as_me:$LINENO: result: $lt_cv_sys_max_cmd_len" >&5 +echo "${ECHO_T}$lt_cv_sys_max_cmd_len" >&6; } else - echo "$as_me:$LINENO: result: none" >&5 -echo "${ECHO_T}none" >&6 + { echo "$as_me:$LINENO: result: none" >&5 +echo "${ECHO_T}none" >&6; } fi max_cmd_len=$lt_cv_sys_max_cmd_len @@ -4800,26 +5705,26 @@ max_cmd_len=$lt_cv_sys_max_cmd_len : ${MV="mv -f"} : ${RM="rm -f"} -echo "$as_me:$LINENO: checking whether the shell understands some XSI constructs" >&5 -echo $ECHO_N "checking whether the shell understands some XSI constructs... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking whether the shell understands some XSI constructs" >&5 +echo $ECHO_N "checking whether the shell understands some XSI constructs... $ECHO_C" >&6; } # Try some XSI features xsi_shell=no ( _lt_dummy="a/b/c" test "${_lt_dummy##*/},${_lt_dummy%/*},"${_lt_dummy%"$_lt_dummy"}, \ = c,a/b,, ) >/dev/null 2>&1 \ && xsi_shell=yes -echo "$as_me:$LINENO: result: $xsi_shell" >&5 -echo "${ECHO_T}$xsi_shell" >&6 +{ echo "$as_me:$LINENO: result: $xsi_shell" >&5 +echo "${ECHO_T}$xsi_shell" >&6; } -echo "$as_me:$LINENO: checking whether the shell understands \"+=\"" >&5 -echo $ECHO_N "checking whether the shell understands \"+=\"... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking whether the shell understands \"+=\"" >&5 +echo $ECHO_N "checking whether the shell understands \"+=\"... $ECHO_C" >&6; } lt_shell_append=no ( foo=bar; set foo baz; eval "$1+=\$2" && test "$foo" = barbaz ) \ >/dev/null 2>&1 \ && lt_shell_append=yes -echo "$as_me:$LINENO: result: $lt_shell_append" >&5 -echo "${ECHO_T}$lt_shell_append" >&6 +{ echo "$as_me:$LINENO: result: $lt_shell_append" >&5 +echo "${ECHO_T}$lt_shell_append" >&6; } if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then @@ -4853,15 +5758,15 @@ esac -echo "$as_me:$LINENO: checking for $LD option to reload object files" >&5 -echo $ECHO_N "checking for $LD option to reload object files... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking for $LD option to reload object files" >&5 +echo $ECHO_N "checking for $LD option to reload object files... $ECHO_C" >&6; } if test "${lt_cv_ld_reload_flag+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else lt_cv_ld_reload_flag='-r' fi -echo "$as_me:$LINENO: result: $lt_cv_ld_reload_flag" >&5 -echo "${ECHO_T}$lt_cv_ld_reload_flag" >&6 +{ echo "$as_me:$LINENO: result: $lt_cv_ld_reload_flag" >&5 +echo "${ECHO_T}$lt_cv_ld_reload_flag" >&6; } reload_flag=$lt_cv_ld_reload_flag case $reload_flag in "" | " "*) ;; @@ -4887,8 +5792,8 @@ esac -echo "$as_me:$LINENO: checking how to recognize dependent libraries" >&5 -echo $ECHO_N "checking how to recognize dependent libraries... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking how to recognize dependent libraries" >&5 +echo $ECHO_N "checking how to recognize dependent libraries... $ECHO_C" >&6; } if test "${lt_cv_deplibs_check_method+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -5077,8 +5982,8 @@ tpf*) esac fi -echo "$as_me:$LINENO: result: $lt_cv_deplibs_check_method" >&5 -echo "${ECHO_T}$lt_cv_deplibs_check_method" >&6 +{ echo "$as_me:$LINENO: result: $lt_cv_deplibs_check_method" >&5 +echo "${ECHO_T}$lt_cv_deplibs_check_method" >&6; } file_magic_cmd=$lt_cv_file_magic_cmd deplibs_check_method=$lt_cv_deplibs_check_method test -z "$deplibs_check_method" && deplibs_check_method=unknown @@ -5097,8 +6002,8 @@ test -z "$deplibs_check_method" && deplibs_check_method=unknown if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ar", so it can be a program name with args. set dummy ${ac_tool_prefix}ar; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_AR+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -5111,32 +6016,34 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_AR="${ac_tool_prefix}ar" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done +IFS=$as_save_IFS fi fi AR=$ac_cv_prog_AR if test -n "$AR"; then - echo "$as_me:$LINENO: result: $AR" >&5 -echo "${ECHO_T}$AR" >&6 + { echo "$as_me:$LINENO: result: $AR" >&5 +echo "${ECHO_T}$AR" >&6; } else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } fi + fi if test -z "$ac_cv_prog_AR"; then ac_ct_AR=$AR # Extract the first word of "ar", so it can be a program name with args. set dummy ar; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_ac_ct_AR+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -5149,27 +6056,41 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_AR="ar" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done +IFS=$as_save_IFS - test -z "$ac_cv_prog_ac_ct_AR" && ac_cv_prog_ac_ct_AR="false" fi fi ac_ct_AR=$ac_cv_prog_ac_ct_AR if test -n "$ac_ct_AR"; then - echo "$as_me:$LINENO: result: $ac_ct_AR" >&5 -echo "${ECHO_T}$ac_ct_AR" >&6 + { echo "$as_me:$LINENO: result: $ac_ct_AR" >&5 +echo "${ECHO_T}$ac_ct_AR" >&6; } else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } fi - AR=$ac_ct_AR + if test "x$ac_ct_AR" = x; then + AR="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&5 +echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&2;} +ac_tool_warned=yes ;; +esac + AR=$ac_ct_AR + fi else AR="$ac_cv_prog_AR" fi @@ -5190,8 +6111,8 @@ test -z "$AR_FLAGS" && AR_FLAGS=cru if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_STRIP+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -5204,32 +6125,34 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done +IFS=$as_save_IFS fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then - echo "$as_me:$LINENO: result: $STRIP" >&5 -echo "${ECHO_T}$STRIP" >&6 + { echo "$as_me:$LINENO: result: $STRIP" >&5 +echo "${ECHO_T}$STRIP" >&6; } else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } fi + fi if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -5242,27 +6165,41 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_STRIP="strip" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done +IFS=$as_save_IFS - test -z "$ac_cv_prog_ac_ct_STRIP" && ac_cv_prog_ac_ct_STRIP=":" fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then - echo "$as_me:$LINENO: result: $ac_ct_STRIP" >&5 -echo "${ECHO_T}$ac_ct_STRIP" >&6 + { echo "$as_me:$LINENO: result: $ac_ct_STRIP" >&5 +echo "${ECHO_T}$ac_ct_STRIP" >&6; } else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } fi - STRIP=$ac_ct_STRIP + if test "x$ac_ct_STRIP" = x; then + STRIP=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&5 +echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&2;} +ac_tool_warned=yes ;; +esac + STRIP=$ac_ct_STRIP + fi else STRIP="$ac_cv_prog_STRIP" fi @@ -5277,8 +6214,8 @@ test -z "$STRIP" && STRIP=: if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. set dummy ${ac_tool_prefix}ranlib; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_RANLIB+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -5291,32 +6228,34 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done +IFS=$as_save_IFS fi fi RANLIB=$ac_cv_prog_RANLIB if test -n "$RANLIB"; then - echo "$as_me:$LINENO: result: $RANLIB" >&5 -echo "${ECHO_T}$RANLIB" >&6 + { echo "$as_me:$LINENO: result: $RANLIB" >&5 +echo "${ECHO_T}$RANLIB" >&6; } else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } fi + fi if test -z "$ac_cv_prog_RANLIB"; then ac_ct_RANLIB=$RANLIB # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -5329,27 +6268,41 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_RANLIB="ranlib" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done +IFS=$as_save_IFS - test -z "$ac_cv_prog_ac_ct_RANLIB" && ac_cv_prog_ac_ct_RANLIB=":" fi fi ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB if test -n "$ac_ct_RANLIB"; then - echo "$as_me:$LINENO: result: $ac_ct_RANLIB" >&5 -echo "${ECHO_T}$ac_ct_RANLIB" >&6 + { echo "$as_me:$LINENO: result: $ac_ct_RANLIB" >&5 +echo "${ECHO_T}$ac_ct_RANLIB" >&6; } else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } fi - RANLIB=$ac_ct_RANLIB + if test "x$ac_ct_RANLIB" = x; then + RANLIB=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&5 +echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&2;} +ac_tool_warned=yes ;; +esac + RANLIB=$ac_ct_RANLIB + fi else RANLIB="$ac_cv_prog_RANLIB" fi @@ -5422,8 +6375,8 @@ compiler=$CC # Check for command to grab the raw symbol name followed by C symbol from nm. -echo "$as_me:$LINENO: checking command to parse $NM output from $compiler object" >&5 -echo $ECHO_N "checking command to parse $NM output from $compiler object... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking command to parse $NM output from $compiler object" >&5 +echo $ECHO_N "checking command to parse $NM output from $compiler object... $ECHO_C" >&6; } if test "${lt_cv_sys_global_symbol_pipe+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -5641,11 +6594,11 @@ if test -z "$lt_cv_sys_global_symbol_pipe"; then lt_cv_sys_global_symbol_to_cdecl= fi if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then - echo "$as_me:$LINENO: result: failed" >&5 -echo "${ECHO_T}failed" >&6 + { echo "$as_me:$LINENO: result: failed" >&5 +echo "${ECHO_T}failed" >&6; } else - echo "$as_me:$LINENO: result: ok" >&5 -echo "${ECHO_T}ok" >&6 + { echo "$as_me:$LINENO: result: ok" >&5 +echo "${ECHO_T}ok" >&6; } fi @@ -5664,11 +6617,11 @@ fi -# Check whether --enable-libtool-lock or --disable-libtool-lock was given. +# Check whether --enable-libtool-lock was given. if test "${enable_libtool_lock+set}" = set; then - enableval="$enable_libtool_lock" + enableval=$enable_libtool_lock; +fi -fi; test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes # Some flags need to be propagated to the compiler or linker for good @@ -5695,7 +6648,7 @@ ia64-*-hpux*) ;; *-*-irix6*) # Find out which ABI we are using. - echo '#line 5698 "configure"' > conftest.$ac_ext + echo '#line 6651 "configure"' > conftest.$ac_ext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? @@ -5787,8 +6740,8 @@ s390*-*linux*|s390*-*tpf*|sparc*-*linux*) # On SCO OpenServer 5, we need -belf to get full-featured binaries. SAVE_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -belf" - echo "$as_me:$LINENO: checking whether the C compiler needs -belf" >&5 -echo $ECHO_N "checking whether the C compiler needs -belf... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking whether the C compiler needs -belf" >&5 +echo $ECHO_N "checking whether the C compiler needs -belf... $ECHO_C" >&6; } if test "${lt_cv_cc_needs_belf+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -5819,35 +6772,32 @@ main () } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then lt_cv_cc_needs_belf=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -lt_cv_cc_needs_belf=no + lt_cv_cc_needs_belf=no fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' @@ -5856,8 +6806,8 @@ ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi -echo "$as_me:$LINENO: result: $lt_cv_cc_needs_belf" >&5 -echo "${ECHO_T}$lt_cv_cc_needs_belf" >&6 +{ echo "$as_me:$LINENO: result: $lt_cv_cc_needs_belf" >&5 +echo "${ECHO_T}$lt_cv_cc_needs_belf" >&6; } if test x"$lt_cv_cc_needs_belf" != x"yes"; then # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf CFLAGS="$SAVE_CFLAGS" @@ -5886,8 +6836,8 @@ esac need_locks="$enable_libtool_lock" -echo "$as_me:$LINENO: checking for ANSI C header files" >&5 -echo $ECHO_N "checking for ANSI C header files... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking for ANSI C header files" >&5 +echo $ECHO_N "checking for ANSI C header files... $ECHO_C" >&6; } if test "${ac_cv_header_stdc+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -5911,35 +6861,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then ac_cv_header_stdc=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -ac_cv_header_stdc=no + ac_cv_header_stdc=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. @@ -5995,6 +6941,7 @@ cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include +#include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) @@ -6014,18 +6961,27 @@ main () for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) - exit(2); - exit (0); + return 2; + return 0; } _ACEOF rm -f conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>&5 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='./conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then @@ -6038,12 +6994,14 @@ sed 's/^/| /' conftest.$ac_ext >&5 ( exit $ac_status ) ac_cv_header_stdc=no fi -rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext fi + + fi fi -echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5 -echo "${ECHO_T}$ac_cv_header_stdc" >&6 +{ echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5 +echo "${ECHO_T}$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then cat >>confdefs.h <<\_ACEOF @@ -6066,9 +7024,9 @@ for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ inttypes.h stdint.h unistd.h do as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF @@ -6082,38 +7040,35 @@ $ac_includes_default #include <$ac_header> _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then eval "$as_ac_Header=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_Header=no" + eval "$as_ac_Header=no" fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 +ac_res=`eval echo '${'$as_ac_Header'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_Header'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 @@ -6128,9 +7083,9 @@ done for ac_header in dlfcn.h do as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF @@ -6144,38 +7099,35 @@ $ac_includes_default #include <$ac_header> _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then eval "$as_ac_Header=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_Header=no" + eval "$as_ac_Header=no" fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 +ac_res=`eval echo '${'$as_ac_Header'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_Header'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 @@ -6187,18 +7139,22 @@ done -ac_ext=cc +ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu -if test -n "$ac_tool_prefix"; then - for ac_prog in $CCC g++ c++ gpp aCC CC cxx cc++ cl FCC KCC RCC xlC_r xlC +if test -z "$CXX"; then + if test -n "$CCC"; then + CXX=$CCC + else + if test -n "$ac_tool_prefix"; then + for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${glibcxx_cv_prog_CXX+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -6211,36 +7167,38 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then glibcxx_cv_prog_CXX="$ac_tool_prefix$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done +IFS=$as_save_IFS fi fi CXX=$glibcxx_cv_prog_CXX if test -n "$CXX"; then - echo "$as_me:$LINENO: result: $CXX" >&5 -echo "${ECHO_T}$CXX" >&6 + { echo "$as_me:$LINENO: result: $CXX" >&5 +echo "${ECHO_T}$CXX" >&6; } else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } fi + test -n "$CXX" && break done fi if test -z "$CXX"; then ac_ct_CXX=$CXX - for ac_prog in $CCC g++ c++ gpp aCC CC cxx cc++ cl FCC KCC RCC xlC_r xlC + for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_ac_ct_CXX+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -6253,55 +7211,85 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_CXX="$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done +IFS=$as_save_IFS fi fi ac_ct_CXX=$ac_cv_prog_ac_ct_CXX if test -n "$ac_ct_CXX"; then - echo "$as_me:$LINENO: result: $ac_ct_CXX" >&5 -echo "${ECHO_T}$ac_ct_CXX" >&6 + { echo "$as_me:$LINENO: result: $ac_ct_CXX" >&5 +echo "${ECHO_T}$ac_ct_CXX" >&6; } else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } fi + test -n "$ac_ct_CXX" && break done -test -n "$ac_ct_CXX" || ac_ct_CXX="g++" - CXX=$ac_ct_CXX + if test "x$ac_ct_CXX" = x; then + CXX="g++" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&5 +echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&2;} +ac_tool_warned=yes ;; +esac + CXX=$ac_ct_CXX + fi fi - + fi +fi # Provide some information about the compiler. -echo "$as_me:$LINENO:" \ - "checking for C++ compiler version" >&5 +echo "$as_me:$LINENO: checking for C++ compiler version" >&5 ac_compiler=`set X $ac_compile; echo $2` -{ (eval echo "$as_me:$LINENO: \"$ac_compiler --version &5\"") >&5 - (eval $ac_compiler --version &5) 2>&5 +{ (ac_try="$ac_compiler --version >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compiler --version >&5") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } -{ (eval echo "$as_me:$LINENO: \"$ac_compiler -v &5\"") >&5 - (eval $ac_compiler -v &5) 2>&5 +{ (ac_try="$ac_compiler -v >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compiler -v >&5") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } -{ (eval echo "$as_me:$LINENO: \"$ac_compiler -V &5\"") >&5 - (eval $ac_compiler -V &5) 2>&5 +{ (ac_try="$ac_compiler -V >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compiler -V >&5") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } -echo "$as_me:$LINENO: checking whether we are using the GNU C++ compiler" >&5 -echo $ECHO_N "checking whether we are using the GNU C++ compiler... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking whether we are using the GNU C++ compiler" >&5 +echo $ECHO_N "checking whether we are using the GNU C++ compiler... $ECHO_C" >&6; } if test "${ac_cv_cxx_compiler_gnu+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -6324,50 +7312,49 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then ac_compiler_gnu=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -ac_compiler_gnu=no + ac_compiler_gnu=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_cxx_compiler_gnu=$ac_compiler_gnu fi -echo "$as_me:$LINENO: result: $ac_cv_cxx_compiler_gnu" >&5 -echo "${ECHO_T}$ac_cv_cxx_compiler_gnu" >&6 +{ echo "$as_me:$LINENO: result: $ac_cv_cxx_compiler_gnu" >&5 +echo "${ECHO_T}$ac_cv_cxx_compiler_gnu" >&6; } GXX=`test $ac_compiler_gnu = yes && echo yes` ac_test_CXXFLAGS=${CXXFLAGS+set} ac_save_CXXFLAGS=$CXXFLAGS -CXXFLAGS="-g" -echo "$as_me:$LINENO: checking whether $CXX accepts -g" >&5 -echo $ECHO_N "checking whether $CXX accepts -g... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking whether $CXX accepts -g" >&5 +echo $ECHO_N "checking whether $CXX accepts -g... $ECHO_C" >&6; } if test "${ac_cv_prog_cxx_g+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - cat >conftest.$ac_ext <<_ACEOF + ac_save_cxx_werror_flag=$ac_cxx_werror_flag + ac_cxx_werror_flag=yes + ac_cv_prog_cxx_g=no + CXXFLAGS="-g" + cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext @@ -6383,159 +7370,133 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then ac_cv_prog_cxx_g=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -ac_cv_prog_cxx_g=no -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: $ac_cv_prog_cxx_g" >&5 -echo "${ECHO_T}$ac_cv_prog_cxx_g" >&6 -if test "$ac_test_CXXFLAGS" = set; then - CXXFLAGS=$ac_save_CXXFLAGS -elif test $ac_cv_prog_cxx_g = yes; then - if test "$GXX" = yes; then - CXXFLAGS="-g -O2" - else - CXXFLAGS="-g" - fi -else - if test "$GXX" = yes; then - CXXFLAGS="-O2" - else - CXXFLAGS= - fi -fi -for ac_declaration in \ - '' \ - 'extern "C" void std::exit (int) throw (); using std::exit;' \ - 'extern "C" void std::exit (int); using std::exit;' \ - 'extern "C" void exit (int) throw ();' \ - 'extern "C" void exit (int);' \ - 'void exit (int);' -do - cat >conftest.$ac_ext <<_ACEOF + CXXFLAGS="" + cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ -$ac_declaration -#include + int main () { -exit (42); + ; return 0; } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then : else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -continue -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext - cat >conftest.$ac_ext <<_ACEOF + ac_cxx_werror_flag=$ac_save_cxx_werror_flag + CXXFLAGS="-g" + cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ -$ac_declaration + int main () { -exit (42); + ; return 0; } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - break + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_prog_cxx_g=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 + fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -done -rm -f conftest* -if test -n "$ac_declaration"; then - echo '#ifdef __cplusplus' >>confdefs.h - echo $ac_declaration >>confdefs.h - echo '#endif' >>confdefs.h + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_cxx_werror_flag=$ac_save_cxx_werror_flag +fi +{ echo "$as_me:$LINENO: result: $ac_cv_prog_cxx_g" >&5 +echo "${ECHO_T}$ac_cv_prog_cxx_g" >&6; } +if test "$ac_test_CXXFLAGS" = set; then + CXXFLAGS=$ac_save_CXXFLAGS +elif test $ac_cv_prog_cxx_g = yes; then + if test "$GXX" = yes; then + CXXFLAGS="-g -O2" + else + CXXFLAGS="-g" + fi +else + if test "$GXX" = yes; then + CXXFLAGS="-O2" + else + CXXFLAGS= + fi +fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -6545,13 +7506,13 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$CXX" && ( test "X$CXX" != "Xno" && ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || (test "X$CXX" != "Xg++"))) ; then - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu -echo "$as_me:$LINENO: checking how to run the C++ preprocessor" >&5 -echo $ECHO_N "checking how to run the C++ preprocessor... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking how to run the C++ preprocessor" >&5 +echo $ECHO_N "checking how to run the C++ preprocessor... $ECHO_C" >&6; } if test -z "$CXXCPP"; then if test "${ac_cv_prog_CXXCPP+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 @@ -6581,24 +7542,22 @@ cat >>conftest.$ac_ext <<_ACEOF #endif Syntax error _ACEOF -if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 - (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 +if { (ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null; then - if test -s conftest.err; then - ac_cpp_err=$ac_cxx_preproc_warn_flag - ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag - else - ac_cpp_err= - fi -else - ac_cpp_err=yes -fi -if test -z "$ac_cpp_err"; then + (exit $ac_status); } >/dev/null && { + test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || + test ! -s conftest.err + }; then : else echo "$as_me: failed program was:" >&5 @@ -6607,9 +7566,10 @@ sed 's/^/| /' conftest.$ac_ext >&5 # Broken: fails on valid input. continue fi + rm -f conftest.err conftest.$ac_ext - # OK, works on sane cases. Now check whether non-existent headers + # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ @@ -6619,24 +7579,22 @@ cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF -if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 - (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 +if { (ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null; then - if test -s conftest.err; then - ac_cpp_err=$ac_cxx_preproc_warn_flag - ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag - else - ac_cpp_err= - fi -else - ac_cpp_err=yes -fi -if test -z "$ac_cpp_err"; then + (exit $ac_status); } >/dev/null && { + test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || + test ! -s conftest.err + }; then # Broken: success on invalid input. continue else @@ -6647,6 +7605,7 @@ sed 's/^/| /' conftest.$ac_ext >&5 ac_preproc_ok=: break fi + rm -f conftest.err conftest.$ac_ext done @@ -6664,8 +7623,8 @@ fi else ac_cv_prog_CXXCPP=$CXXCPP fi -echo "$as_me:$LINENO: result: $CXXCPP" >&5 -echo "${ECHO_T}$CXXCPP" >&6 +{ echo "$as_me:$LINENO: result: $CXXCPP" >&5 +echo "${ECHO_T}$CXXCPP" >&6; } ac_preproc_ok=false for ac_cxx_preproc_warn_flag in '' yes do @@ -6688,24 +7647,22 @@ cat >>conftest.$ac_ext <<_ACEOF #endif Syntax error _ACEOF -if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 - (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 +if { (ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null; then - if test -s conftest.err; then - ac_cpp_err=$ac_cxx_preproc_warn_flag - ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag - else - ac_cpp_err= - fi -else - ac_cpp_err=yes -fi -if test -z "$ac_cpp_err"; then + (exit $ac_status); } >/dev/null && { + test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || + test ! -s conftest.err + }; then : else echo "$as_me: failed program was:" >&5 @@ -6714,9 +7671,10 @@ sed 's/^/| /' conftest.$ac_ext >&5 # Broken: fails on valid input. continue fi + rm -f conftest.err conftest.$ac_ext - # OK, works on sane cases. Now check whether non-existent headers + # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ @@ -6726,24 +7684,22 @@ cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF -if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 - (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 +if { (ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null; then - if test -s conftest.err; then - ac_cpp_err=$ac_cxx_preproc_warn_flag - ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag - else - ac_cpp_err= - fi -else - ac_cpp_err=yes -fi -if test -z "$ac_cpp_err"; then + (exit $ac_status); } >/dev/null && { + test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || + test ! -s conftest.err + }; then # Broken: success on invalid input. continue else @@ -6754,6 +7710,7 @@ sed 's/^/| /' conftest.$ac_ext >&5 ac_preproc_ok=: break fi + rm -f conftest.err conftest.$ac_ext done @@ -6828,8 +7785,8 @@ if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi -echo "$as_me:$LINENO: checking for objdir" >&5 -echo $ECHO_N "checking for objdir... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking for objdir" >&5 +echo $ECHO_N "checking for objdir... $ECHO_C" >&6; } if test "${lt_cv_objdir+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -6843,8 +7800,8 @@ else fi rmdir .libs 2>/dev/null fi -echo "$as_me:$LINENO: result: $lt_cv_objdir" >&5 -echo "${ECHO_T}$lt_cv_objdir" >&6 +{ echo "$as_me:$LINENO: result: $lt_cv_objdir" >&5 +echo "${ECHO_T}$lt_cv_objdir" >&6; } objdir=$lt_cv_objdir @@ -6936,8 +7893,8 @@ test -z "$MAGIC_CMD" && MAGIC_CMD=file case $deplibs_check_method in file_magic*) if test "$file_magic_cmd" = '$MAGIC_CMD'; then - echo "$as_me:$LINENO: checking for ${ac_tool_prefix}file" >&5 -echo $ECHO_N "checking for ${ac_tool_prefix}file... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for ${ac_tool_prefix}file" >&5 +echo $ECHO_N "checking for ${ac_tool_prefix}file... $ECHO_C" >&6; } if test "${lt_cv_path_MAGIC_CMD+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -6989,11 +7946,11 @@ fi MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if test -n "$MAGIC_CMD"; then - echo "$as_me:$LINENO: result: $MAGIC_CMD" >&5 -echo "${ECHO_T}$MAGIC_CMD" >&6 + { echo "$as_me:$LINENO: result: $MAGIC_CMD" >&5 +echo "${ECHO_T}$MAGIC_CMD" >&6; } else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } fi @@ -7002,8 +7959,8 @@ fi if test -z "$lt_cv_path_MAGIC_CMD"; then if test -n "$ac_tool_prefix"; then - echo "$as_me:$LINENO: checking for file" >&5 -echo $ECHO_N "checking for file... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for file" >&5 +echo $ECHO_N "checking for file... $ECHO_C" >&6; } if test "${lt_cv_path_MAGIC_CMD+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -7055,11 +8012,11 @@ fi MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if test -n "$MAGIC_CMD"; then - echo "$as_me:$LINENO: result: $MAGIC_CMD" >&5 -echo "${ECHO_T}$MAGIC_CMD" >&6 + { echo "$as_me:$LINENO: result: $MAGIC_CMD" >&5 +echo "${ECHO_T}$MAGIC_CMD" >&6; } else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } fi @@ -7139,8 +8096,8 @@ lt_prog_compiler_no_builtin_flag= if test "$GCC" = yes; then lt_prog_compiler_no_builtin_flag=' -fno-builtin' - echo "$as_me:$LINENO: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 -echo $ECHO_N "checking if $compiler supports -fno-rtti -fno-exceptions... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 +echo $ECHO_N "checking if $compiler supports -fno-rtti -fno-exceptions... $ECHO_C" >&6; } if test "${lt_cv_prog_compiler_rtti_exceptions+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -7157,11 +8114,11 @@ else -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:7160: $lt_compile\"" >&5) + (eval echo "\"\$as_me:8117: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 - echo "$as_me:7164: \$? = $ac_status" >&5 + echo "$as_me:8121: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. @@ -7174,8 +8131,8 @@ else $RM conftest* fi -echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 -echo "${ECHO_T}$lt_cv_prog_compiler_rtti_exceptions" >&6 +{ echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 +echo "${ECHO_T}$lt_cv_prog_compiler_rtti_exceptions" >&6; } if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions" @@ -7194,8 +8151,8 @@ fi lt_prog_compiler_pic= lt_prog_compiler_static= -echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5 -echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5 +echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6; } if test "$GCC" = yes; then lt_prog_compiler_wl='-Wl,' @@ -7449,8 +8406,8 @@ case $host_os in lt_prog_compiler_pic="$lt_prog_compiler_pic -DPIC" ;; esac -echo "$as_me:$LINENO: result: $lt_prog_compiler_pic" >&5 -echo "${ECHO_T}$lt_prog_compiler_pic" >&6 +{ echo "$as_me:$LINENO: result: $lt_prog_compiler_pic" >&5 +echo "${ECHO_T}$lt_prog_compiler_pic" >&6; } @@ -7461,8 +8418,8 @@ echo "${ECHO_T}$lt_prog_compiler_pic" >&6 # Check to make sure the PIC flag actually works. # if test -n "$lt_prog_compiler_pic"; then - echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5 -echo $ECHO_N "checking if $compiler PIC flag $lt_prog_compiler_pic works... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5 +echo $ECHO_N "checking if $compiler PIC flag $lt_prog_compiler_pic works... $ECHO_C" >&6; } if test "${lt_prog_compiler_pic_works+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -7479,11 +8436,11 @@ else -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:7482: $lt_compile\"" >&5) + (eval echo "\"\$as_me:8439: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 - echo "$as_me:7486: \$? = $ac_status" >&5 + echo "$as_me:8443: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. @@ -7496,8 +8453,8 @@ else $RM conftest* fi -echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_works" >&5 -echo "${ECHO_T}$lt_prog_compiler_pic_works" >&6 +{ echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_works" >&5 +echo "${ECHO_T}$lt_prog_compiler_pic_works" >&6; } if test x"$lt_prog_compiler_pic_works" = xyes; then case $lt_prog_compiler_pic in @@ -7520,8 +8477,8 @@ fi # Check to make sure the static flag actually works. # wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\" -echo "$as_me:$LINENO: checking if $compiler static flag $lt_tmp_static_flag works" >&5 -echo $ECHO_N "checking if $compiler static flag $lt_tmp_static_flag works... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking if $compiler static flag $lt_tmp_static_flag works" >&5 +echo $ECHO_N "checking if $compiler static flag $lt_tmp_static_flag works... $ECHO_C" >&6; } if test "${lt_prog_compiler_static_works+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -7548,8 +8505,8 @@ else LDFLAGS="$save_LDFLAGS" fi -echo "$as_me:$LINENO: result: $lt_prog_compiler_static_works" >&5 -echo "${ECHO_T}$lt_prog_compiler_static_works" >&6 +{ echo "$as_me:$LINENO: result: $lt_prog_compiler_static_works" >&5 +echo "${ECHO_T}$lt_prog_compiler_static_works" >&6; } if test x"$lt_prog_compiler_static_works" = xyes; then : @@ -7563,8 +8520,8 @@ fi - echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5 -echo $ECHO_N "checking if $compiler supports -c -o file.$ac_objext... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5 +echo $ECHO_N "checking if $compiler supports -c -o file.$ac_objext... $ECHO_C" >&6; } if test "${lt_cv_prog_compiler_c_o+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -7584,11 +8541,11 @@ else -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:7587: $lt_compile\"" >&5) + (eval echo "\"\$as_me:8544: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 - echo "$as_me:7591: \$? = $ac_status" >&5 + echo "$as_me:8548: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized @@ -7610,16 +8567,16 @@ else $RM conftest* fi -echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o" >&5 -echo "${ECHO_T}$lt_cv_prog_compiler_c_o" >&6 +{ echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o" >&5 +echo "${ECHO_T}$lt_cv_prog_compiler_c_o" >&6; } - echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5 -echo $ECHO_N "checking if $compiler supports -c -o file.$ac_objext... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5 +echo $ECHO_N "checking if $compiler supports -c -o file.$ac_objext... $ECHO_C" >&6; } if test "${lt_cv_prog_compiler_c_o+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -7639,11 +8596,11 @@ else -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:7642: $lt_compile\"" >&5) + (eval echo "\"\$as_me:8599: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 - echo "$as_me:7646: \$? = $ac_status" >&5 + echo "$as_me:8603: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized @@ -7665,8 +8622,8 @@ else $RM conftest* fi -echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o" >&5 -echo "${ECHO_T}$lt_cv_prog_compiler_c_o" >&6 +{ echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o" >&5 +echo "${ECHO_T}$lt_cv_prog_compiler_c_o" >&6; } @@ -7674,16 +8631,16 @@ echo "${ECHO_T}$lt_cv_prog_compiler_c_o" >&6 hard_links="nottested" if test "$lt_cv_prog_compiler_c_o" = no && test "$need_locks" != no; then # do not overwrite the value of need_locks provided by the user - echo "$as_me:$LINENO: checking if we can lock with hard links" >&5 -echo $ECHO_N "checking if we can lock with hard links... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking if we can lock with hard links" >&5 +echo $ECHO_N "checking if we can lock with hard links... $ECHO_C" >&6; } hard_links=yes $RM conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no - echo "$as_me:$LINENO: result: $hard_links" >&5 -echo "${ECHO_T}$hard_links" >&6 + { echo "$as_me:$LINENO: result: $hard_links" >&5 +echo "${ECHO_T}$hard_links" >&6; } if test "$hard_links" = no; then { echo "$as_me:$LINENO: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} @@ -7698,8 +8655,8 @@ fi - echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5 -echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5 +echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6; } runpath_var= allow_undefined_flag= @@ -8139,27 +9096,23 @@ main () } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then lt_aix_libpath_sed=' /Import File Strings/,/^$/ { @@ -8177,8 +9130,10 @@ else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 + fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi @@ -8213,27 +9168,23 @@ main () } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then lt_aix_libpath_sed=' /Import File Strings/,/^$/ { @@ -8251,8 +9202,10 @@ else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 + fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi @@ -8512,35 +9465,33 @@ cat >conftest.$ac_ext <<_ACEOF int foo(void) {} _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib' else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 + fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext LDFLAGS="$save_LDFLAGS" else @@ -8793,8 +9744,8 @@ rm -f conftest.err conftest.$ac_objext \ fi fi -echo "$as_me:$LINENO: result: $ld_shlibs" >&5 -echo "${ECHO_T}$ld_shlibs" >&6 +{ echo "$as_me:$LINENO: result: $ld_shlibs" >&5 +echo "${ECHO_T}$ld_shlibs" >&6; } test "$ld_shlibs" = no && can_build_shared=no with_gnu_ld=$with_gnu_ld @@ -8830,8 +9781,8 @@ x|xyes) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. - echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5 -echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5 +echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >&6; } $RM conftest* echo "$lt_simple_compile_test_code" > conftest.$ac_ext @@ -8868,8 +9819,8 @@ echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >& cat conftest.err 1>&5 fi $RM conftest* - echo "$as_me:$LINENO: result: $archive_cmds_need_lc" >&5 -echo "${ECHO_T}$archive_cmds_need_lc" >&6 + { echo "$as_me:$LINENO: result: $archive_cmds_need_lc" >&5 +echo "${ECHO_T}$archive_cmds_need_lc" >&6; } ;; esac fi @@ -9032,8 +9983,8 @@ esac - echo "$as_me:$LINENO: checking dynamic linker characteristics" >&5 -echo $ECHO_N "checking dynamic linker characteristics... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking dynamic linker characteristics" >&5 +echo $ECHO_N "checking dynamic linker characteristics... $ECHO_C" >&6; } withGCC=$GCC if test "$withGCC" = yes; then case $host_os in @@ -9470,27 +10421,23 @@ main () } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir"; then shlibpath_overrides_runpath=yes fi @@ -9499,8 +10446,10 @@ else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 + fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext LDFLAGS=$save_LDFLAGS libdir=$save_libdir @@ -9713,8 +10662,8 @@ uts4*) dynamic_linker=no ;; esac -echo "$as_me:$LINENO: result: $dynamic_linker" >&5 -echo "${ECHO_T}$dynamic_linker" >&6 +{ echo "$as_me:$LINENO: result: $dynamic_linker" >&5 +echo "${ECHO_T}$dynamic_linker" >&6; } test "$dynamic_linker" = no && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" @@ -9808,8 +10757,8 @@ fi - echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5 -echo $ECHO_N "checking how to hardcode library paths into programs... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5 +echo $ECHO_N "checking how to hardcode library paths into programs... $ECHO_C" >&6; } hardcode_action= if test -n "$hardcode_libdir_flag_spec" || test -n "$runpath_var" || @@ -9833,8 +10782,8 @@ else # directories. hardcode_action=unsupported fi -echo "$as_me:$LINENO: result: $hardcode_action" >&5 -echo "${ECHO_T}$hardcode_action" >&6 +{ echo "$as_me:$LINENO: result: $hardcode_action" >&5 +echo "${ECHO_T}$hardcode_action" >&6; } if test "$hardcode_action" = relink || test "$inherit_rpath" = yes; then @@ -9878,8 +10827,8 @@ else darwin*) # if libdl is installed we need to link against it - echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5 -echo $ECHO_N "checking for dlopen in -ldl... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5 +echo $ECHO_N "checking for dlopen in -ldl... $ECHO_C" >&6; } if test "${ac_cv_lib_dl_dlopen+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -9897,56 +10846,53 @@ cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char dlopen (); int main () { -dlopen (); +return dlopen (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then ac_cv_lib_dl_dlopen=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -ac_cv_lib_dl_dlopen=no + ac_cv_lib_dl_dlopen=no fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5 -echo "${ECHO_T}$ac_cv_lib_dl_dlopen" >&6 +{ echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5 +echo "${ECHO_T}$ac_cv_lib_dl_dlopen" >&6; } if test $ac_cv_lib_dl_dlopen = yes; then lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" else @@ -9960,8 +10906,8 @@ fi ;; *) - echo "$as_me:$LINENO: checking for shl_load" >&5 -echo $ECHO_N "checking for shl_load... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for shl_load" >&5 +echo $ECHO_N "checking for shl_load... $ECHO_C" >&6; } if test "${ac_cv_func_shl_load+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -9993,73 +10939,64 @@ cat >>conftest.$ac_ext <<_ACEOF #undef shl_load -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char shl_load (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_shl_load) || defined (__stub___shl_load) +#if defined __stub_shl_load || defined __stub___shl_load choke me -#else -char (*f) () = shl_load; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != shl_load; +return shl_load (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then ac_cv_func_shl_load=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -ac_cv_func_shl_load=no + ac_cv_func_shl_load=no fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: $ac_cv_func_shl_load" >&5 -echo "${ECHO_T}$ac_cv_func_shl_load" >&6 +{ echo "$as_me:$LINENO: result: $ac_cv_func_shl_load" >&5 +echo "${ECHO_T}$ac_cv_func_shl_load" >&6; } if test $ac_cv_func_shl_load = yes; then lt_cv_dlopen="shl_load" else - echo "$as_me:$LINENO: checking for shl_load in -ldld" >&5 -echo $ECHO_N "checking for shl_load in -ldld... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for shl_load in -ldld" >&5 +echo $ECHO_N "checking for shl_load in -ldld... $ECHO_C" >&6; } if test "${ac_cv_lib_dld_shl_load+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -10077,61 +11014,58 @@ cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char shl_load (); int main () { -shl_load (); +return shl_load (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then ac_cv_lib_dld_shl_load=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -ac_cv_lib_dld_shl_load=no + ac_cv_lib_dld_shl_load=no fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -echo "$as_me:$LINENO: result: $ac_cv_lib_dld_shl_load" >&5 -echo "${ECHO_T}$ac_cv_lib_dld_shl_load" >&6 +{ echo "$as_me:$LINENO: result: $ac_cv_lib_dld_shl_load" >&5 +echo "${ECHO_T}$ac_cv_lib_dld_shl_load" >&6; } if test $ac_cv_lib_dld_shl_load = yes; then lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-dld" else - echo "$as_me:$LINENO: checking for dlopen" >&5 -echo $ECHO_N "checking for dlopen... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for dlopen" >&5 +echo $ECHO_N "checking for dlopen... $ECHO_C" >&6; } if test "${ac_cv_func_dlopen+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -10163,73 +11097,64 @@ cat >>conftest.$ac_ext <<_ACEOF #undef dlopen -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char dlopen (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_dlopen) || defined (__stub___dlopen) +#if defined __stub_dlopen || defined __stub___dlopen choke me -#else -char (*f) () = dlopen; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != dlopen; +return dlopen (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then ac_cv_func_dlopen=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -ac_cv_func_dlopen=no + ac_cv_func_dlopen=no fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: $ac_cv_func_dlopen" >&5 -echo "${ECHO_T}$ac_cv_func_dlopen" >&6 +{ echo "$as_me:$LINENO: result: $ac_cv_func_dlopen" >&5 +echo "${ECHO_T}$ac_cv_func_dlopen" >&6; } if test $ac_cv_func_dlopen = yes; then lt_cv_dlopen="dlopen" else - echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5 -echo $ECHO_N "checking for dlopen in -ldl... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5 +echo $ECHO_N "checking for dlopen in -ldl... $ECHO_C" >&6; } if test "${ac_cv_lib_dl_dlopen+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -10247,61 +11172,58 @@ cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char dlopen (); int main () { -dlopen (); +return dlopen (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then ac_cv_lib_dl_dlopen=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -ac_cv_lib_dl_dlopen=no + ac_cv_lib_dl_dlopen=no fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5 -echo "${ECHO_T}$ac_cv_lib_dl_dlopen" >&6 +{ echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5 +echo "${ECHO_T}$ac_cv_lib_dl_dlopen" >&6; } if test $ac_cv_lib_dl_dlopen = yes; then lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" else - echo "$as_me:$LINENO: checking for dlopen in -lsvld" >&5 -echo $ECHO_N "checking for dlopen in -lsvld... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for dlopen in -lsvld" >&5 +echo $ECHO_N "checking for dlopen in -lsvld... $ECHO_C" >&6; } if test "${ac_cv_lib_svld_dlopen+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -10319,61 +11241,58 @@ cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char dlopen (); int main () { -dlopen (); +return dlopen (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then ac_cv_lib_svld_dlopen=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -ac_cv_lib_svld_dlopen=no + ac_cv_lib_svld_dlopen=no fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -echo "$as_me:$LINENO: result: $ac_cv_lib_svld_dlopen" >&5 -echo "${ECHO_T}$ac_cv_lib_svld_dlopen" >&6 +{ echo "$as_me:$LINENO: result: $ac_cv_lib_svld_dlopen" >&5 +echo "${ECHO_T}$ac_cv_lib_svld_dlopen" >&6; } if test $ac_cv_lib_svld_dlopen = yes; then lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld" else - echo "$as_me:$LINENO: checking for dld_link in -ldld" >&5 -echo $ECHO_N "checking for dld_link in -ldld... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for dld_link in -ldld" >&5 +echo $ECHO_N "checking for dld_link in -ldld... $ECHO_C" >&6; } if test "${ac_cv_lib_dld_dld_link+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -10391,56 +11310,53 @@ cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char dld_link (); int main () { -dld_link (); +return dld_link (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then ac_cv_lib_dld_dld_link=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -ac_cv_lib_dld_dld_link=no + ac_cv_lib_dld_dld_link=no fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -echo "$as_me:$LINENO: result: $ac_cv_lib_dld_dld_link" >&5 -echo "${ECHO_T}$ac_cv_lib_dld_dld_link" >&6 +{ echo "$as_me:$LINENO: result: $ac_cv_lib_dld_dld_link" >&5 +echo "${ECHO_T}$ac_cv_lib_dld_dld_link" >&6; } if test $ac_cv_lib_dld_dld_link = yes; then lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-dld" fi @@ -10480,8 +11396,8 @@ fi save_LIBS="$LIBS" LIBS="$lt_cv_dlopen_libs $LIBS" - echo "$as_me:$LINENO: checking whether a program can dlopen itself" >&5 -echo $ECHO_N "checking whether a program can dlopen itself... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking whether a program can dlopen itself" >&5 +echo $ECHO_N "checking whether a program can dlopen itself... $ECHO_C" >&6; } if test "${lt_cv_dlopen_self+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -10491,7 +11407,7 @@ else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF -#line 10494 "configure" +#line 11410 "configure" #include "confdefs.h" #if HAVE_DLFCN_H @@ -10575,13 +11491,13 @@ rm -fr conftest* fi -echo "$as_me:$LINENO: result: $lt_cv_dlopen_self" >&5 -echo "${ECHO_T}$lt_cv_dlopen_self" >&6 +{ echo "$as_me:$LINENO: result: $lt_cv_dlopen_self" >&5 +echo "${ECHO_T}$lt_cv_dlopen_self" >&6; } if test "x$lt_cv_dlopen_self" = xyes; then wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" - echo "$as_me:$LINENO: checking whether a statically linked program can dlopen itself" >&5 -echo $ECHO_N "checking whether a statically linked program can dlopen itself... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking whether a statically linked program can dlopen itself" >&5 +echo $ECHO_N "checking whether a statically linked program can dlopen itself... $ECHO_C" >&6; } if test "${lt_cv_dlopen_self_static+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -10591,7 +11507,7 @@ else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF -#line 10594 "configure" +#line 11510 "configure" #include "confdefs.h" #if HAVE_DLFCN_H @@ -10675,8 +11591,8 @@ rm -fr conftest* fi -echo "$as_me:$LINENO: result: $lt_cv_dlopen_self_static" >&5 -echo "${ECHO_T}$lt_cv_dlopen_self_static" >&6 +{ echo "$as_me:$LINENO: result: $lt_cv_dlopen_self_static" >&5 +echo "${ECHO_T}$lt_cv_dlopen_self_static" >&6; } fi CPPFLAGS="$save_CPPFLAGS" @@ -10714,13 +11630,13 @@ fi striplib= old_striplib= -echo "$as_me:$LINENO: checking whether stripping libraries is possible" >&5 -echo $ECHO_N "checking whether stripping libraries is possible... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking whether stripping libraries is possible" >&5 +echo $ECHO_N "checking whether stripping libraries is possible... $ECHO_C" >&6; } if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" test -z "$striplib" && striplib="$STRIP --strip-unneeded" - echo "$as_me:$LINENO: result: yes" >&5 -echo "${ECHO_T}yes" >&6 + { echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6; } else # FIXME - insert some real tests, host_os isn't really good enough case $host_os in @@ -10728,16 +11644,16 @@ else if test -n "$STRIP" ; then striplib="$STRIP -x" old_striplib="$STRIP -S" - echo "$as_me:$LINENO: result: yes" >&5 -echo "${ECHO_T}yes" >&6 + { echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6; } else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } fi ;; *) - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } ;; esac fi @@ -10754,13 +11670,13 @@ fi # Report which library types will actually be built - echo "$as_me:$LINENO: checking if libtool supports shared libraries" >&5 -echo $ECHO_N "checking if libtool supports shared libraries... $ECHO_C" >&6 - echo "$as_me:$LINENO: result: $can_build_shared" >&5 -echo "${ECHO_T}$can_build_shared" >&6 + { echo "$as_me:$LINENO: checking if libtool supports shared libraries" >&5 +echo $ECHO_N "checking if libtool supports shared libraries... $ECHO_C" >&6; } + { echo "$as_me:$LINENO: result: $can_build_shared" >&5 +echo "${ECHO_T}$can_build_shared" >&6; } - echo "$as_me:$LINENO: checking whether to build shared libraries" >&5 -echo $ECHO_N "checking whether to build shared libraries... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking whether to build shared libraries" >&5 +echo $ECHO_N "checking whether to build shared libraries... $ECHO_C" >&6; } test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and @@ -10780,15 +11696,15 @@ echo $ECHO_N "checking whether to build shared libraries... $ECHO_C" >&6 fi ;; esac - echo "$as_me:$LINENO: result: $enable_shared" >&5 -echo "${ECHO_T}$enable_shared" >&6 + { echo "$as_me:$LINENO: result: $enable_shared" >&5 +echo "${ECHO_T}$enable_shared" >&6; } - echo "$as_me:$LINENO: checking whether to build static libraries" >&5 -echo $ECHO_N "checking whether to build static libraries... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking whether to build static libraries" >&5 +echo $ECHO_N "checking whether to build static libraries... $ECHO_C" >&6; } # Make sure either enable_shared or enable_static is yes. test "$enable_shared" = yes || enable_static=yes - echo "$as_me:$LINENO: result: $enable_static" >&5 -echo "${ECHO_T}$enable_static" >&6 + { echo "$as_me:$LINENO: result: $enable_static" >&5 +echo "${ECHO_T}$enable_static" >&6; } @@ -10803,7 +11719,7 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu CC="$lt_save_CC" -ac_ext=cc +ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -10927,18 +11843,18 @@ cc_basename=`$ECHO "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` -# Check whether --with-gnu-ld or --without-gnu-ld was given. +# Check whether --with-gnu-ld was given. if test "${with_gnu_ld+set}" = set; then - withval="$with_gnu_ld" - test "$withval" = no || with_gnu_ld=yes + withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes else with_gnu_ld=no -fi; +fi + ac_prog=ld if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. - echo "$as_me:$LINENO: checking for ld used by $CC" >&5 -echo $ECHO_N "checking for ld used by $CC... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for ld used by $CC" >&5 +echo $ECHO_N "checking for ld used by $CC... $ECHO_C" >&6; } case $host in *-*-mingw*) # gcc leaves a trailing carriage return which upsets mingw @@ -10967,11 +11883,11 @@ echo $ECHO_N "checking for ld used by $CC... $ECHO_C" >&6 ;; esac elif test "$with_gnu_ld" = yes; then - echo "$as_me:$LINENO: checking for GNU ld" >&5 -echo $ECHO_N "checking for GNU ld... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for GNU ld" >&5 +echo $ECHO_N "checking for GNU ld... $ECHO_C" >&6; } else - echo "$as_me:$LINENO: checking for non-GNU ld" >&5 -echo $ECHO_N "checking for non-GNU ld... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for non-GNU ld" >&5 +echo $ECHO_N "checking for non-GNU ld... $ECHO_C" >&6; } fi if test "${lt_cv_path_LD+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 @@ -11004,17 +11920,17 @@ fi LD="$lt_cv_path_LD" if test -n "$LD"; then - echo "$as_me:$LINENO: result: $LD" >&5 -echo "${ECHO_T}$LD" >&6 + { echo "$as_me:$LINENO: result: $LD" >&5 +echo "${ECHO_T}$LD" >&6; } else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } fi test -z "$LD" && { { echo "$as_me:$LINENO: error: no acceptable ld found in \$PATH" >&5 echo "$as_me: error: no acceptable ld found in \$PATH" >&2;} { (exit 1); exit 1; }; } -echo "$as_me:$LINENO: checking if the linker ($LD) is GNU ld" >&5 -echo $ECHO_N "checking if the linker ($LD) is GNU ld... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking if the linker ($LD) is GNU ld" >&5 +echo $ECHO_N "checking if the linker ($LD) is GNU ld... $ECHO_C" >&6; } if test "${lt_cv_prog_gnu_ld+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -11028,8 +11944,8 @@ case `$LD -v 2>&1 &5 -echo "${ECHO_T}$lt_cv_prog_gnu_ld" >&6 +{ echo "$as_me:$LINENO: result: $lt_cv_prog_gnu_ld" >&5 +echo "${ECHO_T}$lt_cv_prog_gnu_ld" >&6; } with_gnu_ld=$lt_cv_prog_gnu_ld @@ -11083,8 +11999,8 @@ with_gnu_ld=$lt_cv_prog_gnu_ld fi # PORTME: fill in a description of your system's C++ link characteristics - echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5 -echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5 +echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6; } ld_shlibs_CXX=yes case $host_os in aix3*) @@ -11204,27 +12120,23 @@ main () } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then lt_aix_libpath_sed=' /Import File Strings/,/^$/ { @@ -11242,8 +12154,10 @@ else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 + fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi @@ -11279,27 +12193,23 @@ main () } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then lt_aix_libpath_sed=' /Import File Strings/,/^$/ { @@ -11317,8 +12227,10 @@ else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 + fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi @@ -12088,8 +13000,8 @@ fi ;; esac - echo "$as_me:$LINENO: result: $ld_shlibs_CXX" >&5 -echo "${ECHO_T}$ld_shlibs_CXX" >&6 + { echo "$as_me:$LINENO: result: $ld_shlibs_CXX" >&5 +echo "${ECHO_T}$ld_shlibs_CXX" >&6; } test "$ld_shlibs_CXX" = no && can_build_shared=no GCC_CXX="$GXX" @@ -12297,8 +13209,8 @@ esac lt_prog_compiler_pic_CXX= lt_prog_compiler_static_CXX= -echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5 -echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5 +echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6; } # C++ specific cases for pic, static, wl, etc. if test "$GXX" = yes; then @@ -12602,8 +13514,8 @@ case $host_os in lt_prog_compiler_pic_CXX="$lt_prog_compiler_pic_CXX -DPIC" ;; esac -echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_CXX" >&5 -echo "${ECHO_T}$lt_prog_compiler_pic_CXX" >&6 +{ echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_CXX" >&5 +echo "${ECHO_T}$lt_prog_compiler_pic_CXX" >&6; } @@ -12611,8 +13523,8 @@ echo "${ECHO_T}$lt_prog_compiler_pic_CXX" >&6 # Check to make sure the PIC flag actually works. # if test -n "$lt_prog_compiler_pic_CXX"; then - echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works" >&5 -echo $ECHO_N "checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works" >&5 +echo $ECHO_N "checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works... $ECHO_C" >&6; } if test "${lt_prog_compiler_pic_works_CXX+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -12629,11 +13541,11 @@ else -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:12632: $lt_compile\"" >&5) + (eval echo "\"\$as_me:13544: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 - echo "$as_me:12636: \$? = $ac_status" >&5 + echo "$as_me:13548: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. @@ -12646,8 +13558,8 @@ else $RM conftest* fi -echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_works_CXX" >&5 -echo "${ECHO_T}$lt_prog_compiler_pic_works_CXX" >&6 +{ echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_works_CXX" >&5 +echo "${ECHO_T}$lt_prog_compiler_pic_works_CXX" >&6; } if test x"$lt_prog_compiler_pic_works_CXX" = xyes; then case $lt_prog_compiler_pic_CXX in @@ -12667,8 +13579,8 @@ fi # Check to make sure the static flag actually works. # wl=$lt_prog_compiler_wl_CXX eval lt_tmp_static_flag=\"$lt_prog_compiler_static_CXX\" -echo "$as_me:$LINENO: checking if $compiler static flag $lt_tmp_static_flag works" >&5 -echo $ECHO_N "checking if $compiler static flag $lt_tmp_static_flag works... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking if $compiler static flag $lt_tmp_static_flag works" >&5 +echo $ECHO_N "checking if $compiler static flag $lt_tmp_static_flag works... $ECHO_C" >&6; } if test "${lt_prog_compiler_static_works_CXX+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -12695,8 +13607,8 @@ else LDFLAGS="$save_LDFLAGS" fi -echo "$as_me:$LINENO: result: $lt_prog_compiler_static_works_CXX" >&5 -echo "${ECHO_T}$lt_prog_compiler_static_works_CXX" >&6 +{ echo "$as_me:$LINENO: result: $lt_prog_compiler_static_works_CXX" >&5 +echo "${ECHO_T}$lt_prog_compiler_static_works_CXX" >&6; } if test x"$lt_prog_compiler_static_works_CXX" = xyes; then : @@ -12707,8 +13619,8 @@ fi - echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5 -echo $ECHO_N "checking if $compiler supports -c -o file.$ac_objext... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5 +echo $ECHO_N "checking if $compiler supports -c -o file.$ac_objext... $ECHO_C" >&6; } if test "${lt_cv_prog_compiler_c_o_CXX+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -12728,11 +13640,11 @@ else -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:12731: $lt_compile\"" >&5) + (eval echo "\"\$as_me:13643: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 - echo "$as_me:12735: \$? = $ac_status" >&5 + echo "$as_me:13647: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized @@ -12754,13 +13666,13 @@ else $RM conftest* fi -echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o_CXX" >&5 -echo "${ECHO_T}$lt_cv_prog_compiler_c_o_CXX" >&6 +{ echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o_CXX" >&5 +echo "${ECHO_T}$lt_cv_prog_compiler_c_o_CXX" >&6; } - echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5 -echo $ECHO_N "checking if $compiler supports -c -o file.$ac_objext... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5 +echo $ECHO_N "checking if $compiler supports -c -o file.$ac_objext... $ECHO_C" >&6; } if test "${lt_cv_prog_compiler_c_o_CXX+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -12780,11 +13692,11 @@ else -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:12783: $lt_compile\"" >&5) + (eval echo "\"\$as_me:13695: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 - echo "$as_me:12787: \$? = $ac_status" >&5 + echo "$as_me:13699: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized @@ -12806,8 +13718,8 @@ else $RM conftest* fi -echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o_CXX" >&5 -echo "${ECHO_T}$lt_cv_prog_compiler_c_o_CXX" >&6 +{ echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o_CXX" >&5 +echo "${ECHO_T}$lt_cv_prog_compiler_c_o_CXX" >&6; } @@ -12815,16 +13727,16 @@ echo "${ECHO_T}$lt_cv_prog_compiler_c_o_CXX" >&6 hard_links="nottested" if test "$lt_cv_prog_compiler_c_o_CXX" = no && test "$need_locks" != no; then # do not overwrite the value of need_locks provided by the user - echo "$as_me:$LINENO: checking if we can lock with hard links" >&5 -echo $ECHO_N "checking if we can lock with hard links... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking if we can lock with hard links" >&5 +echo $ECHO_N "checking if we can lock with hard links... $ECHO_C" >&6; } hard_links=yes $RM conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no - echo "$as_me:$LINENO: result: $hard_links" >&5 -echo "${ECHO_T}$hard_links" >&6 + { echo "$as_me:$LINENO: result: $hard_links" >&5 +echo "${ECHO_T}$hard_links" >&6; } if test "$hard_links" = no; then { echo "$as_me:$LINENO: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} @@ -12836,8 +13748,8 @@ fi - echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5 -echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5 +echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6; } export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' case $host_os in @@ -12861,8 +13773,8 @@ echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared librar ;; esac -echo "$as_me:$LINENO: result: $ld_shlibs_CXX" >&5 -echo "${ECHO_T}$ld_shlibs_CXX" >&6 +{ echo "$as_me:$LINENO: result: $ld_shlibs_CXX" >&5 +echo "${ECHO_T}$ld_shlibs_CXX" >&6; } test "$ld_shlibs_CXX" = no && can_build_shared=no with_gnu_ld_CXX=$with_gnu_ld @@ -12889,8 +13801,8 @@ x|xyes) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. - echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5 -echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5 +echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >&6; } $RM conftest* echo "$lt_simple_compile_test_code" > conftest.$ac_ext @@ -12927,8 +13839,8 @@ echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >& cat conftest.err 1>&5 fi $RM conftest* - echo "$as_me:$LINENO: result: $archive_cmds_need_lc_CXX" >&5 -echo "${ECHO_T}$archive_cmds_need_lc_CXX" >&6 + { echo "$as_me:$LINENO: result: $archive_cmds_need_lc_CXX" >&5 +echo "${ECHO_T}$archive_cmds_need_lc_CXX" >&6; } ;; esac fi @@ -12998,8 +13910,8 @@ esac - echo "$as_me:$LINENO: checking dynamic linker characteristics" >&5 -echo $ECHO_N "checking dynamic linker characteristics... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking dynamic linker characteristics" >&5 +echo $ECHO_N "checking dynamic linker characteristics... $ECHO_C" >&6; } withGCC=$GXX library_names_spec= libname_spec='lib$name' @@ -13384,27 +14296,23 @@ main () } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir"; then shlibpath_overrides_runpath=yes fi @@ -13413,8 +14321,10 @@ else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 + fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext LDFLAGS=$save_LDFLAGS libdir=$save_libdir @@ -13627,8 +14537,8 @@ uts4*) dynamic_linker=no ;; esac -echo "$as_me:$LINENO: result: $dynamic_linker" >&5 -echo "${ECHO_T}$dynamic_linker" >&6 +{ echo "$as_me:$LINENO: result: $dynamic_linker" >&5 +echo "${ECHO_T}$dynamic_linker" >&6; } test "$dynamic_linker" = no && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" @@ -13671,8 +14581,8 @@ fi - echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5 -echo $ECHO_N "checking how to hardcode library paths into programs... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5 +echo $ECHO_N "checking how to hardcode library paths into programs... $ECHO_C" >&6; } hardcode_action_CXX= if test -n "$hardcode_libdir_flag_spec_CXX" || test -n "$runpath_var_CXX" || @@ -13696,8 +14606,8 @@ else # directories. hardcode_action_CXX=unsupported fi -echo "$as_me:$LINENO: result: $hardcode_action_CXX" >&5 -echo "${ECHO_T}$hardcode_action_CXX" >&6 +{ echo "$as_me:$LINENO: result: $hardcode_action_CXX" >&5 +echo "${ECHO_T}$hardcode_action_CXX" >&6; } if test "$hardcode_action_CXX" = relink || test "$inherit_rpath_CXX" = yes; then @@ -13746,7 +14656,7 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu - ac_config_commands="$ac_config_commands libtool" + ac_config_commands="$ac_config_commands libtool" @@ -13761,10 +14671,9 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu ## TODO: Consider skipping unncessary tests altogether in this case, rather ## than just ignoring the results. Faster /and/ more correct, win win. - # Check whether --enable-hosted-libstdcxx or --disable-hosted-libstdcxx was given. + # Check whether --enable-hosted-libstdcxx was given. if test "${enable_hosted_libstdcxx+set}" = set; then - enableval="$enable_hosted_libstdcxx" - + enableval=$enable_hosted_libstdcxx; else case "$host" in arm*-*-symbianelf*) @@ -13774,7 +14683,8 @@ else enable_hosted_libstdcxx=yes ;; esac -fi; +fi + if test "$enable_hosted_libstdcxx" = no; then { echo "$as_me:$LINENO: Only freestanding libraries will be built" >&5 echo "$as_me: Only freestanding libraries will be built" >&6;} @@ -13796,20 +14706,18 @@ _ACEOF # Enable compiler support that doesn't require linking. - echo "$as_me:$LINENO: checking for exception model to use" >&5 -echo $ECHO_N "checking for exception model to use... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for exception model to use" >&5 +echo $ECHO_N "checking for exception model to use... $ECHO_C" >&6; } - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu - # Check whether --enable-sjlj-exceptions or --disable-sjlj-exceptions was given. + # Check whether --enable-sjlj-exceptions was given. if test "${enable_sjlj_exceptions+set}" = set; then - enableval="$enable_sjlj_exceptions" - + enableval=$enable_sjlj_exceptions; case "$enableval" in yes|no|auto) ;; *) { { echo "$as_me:$LINENO: error: Unknown argument to enable/disable sjlj-exceptions" >&5 @@ -13819,7 +14727,8 @@ echo "$as_me: error: Unknown argument to enable/disable sjlj-exceptions" >&2;} else enable_sjlj_exceptions=auto -fi; +fi + if test $enable_sjlj_exceptions = auto; then @@ -13829,7 +14738,7 @@ fi; # # Fake what AC_TRY_COMPILE does. XXX Look at redoing this new-style. cat > conftest.$ac_ext << EOF -#line 13832 "configure" +#line 14741 "configure" struct S { ~S(); }; void bar(); void foo() @@ -13883,14 +14792,13 @@ ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu - echo "$as_me:$LINENO: result: $ac_exception_model_name" >&5 -echo "${ECHO_T}$ac_exception_model_name" >&6 + { echo "$as_me:$LINENO: result: $ac_exception_model_name" >&5 +echo "${ECHO_T}$ac_exception_model_name" >&6; } - # Check whether --enable-libstdcxx-pch or --disable-libstdcxx-pch was given. + # Check whether --enable-libstdcxx-pch was given. if test "${enable_libstdcxx_pch+set}" = set; then - enableval="$enable_libstdcxx_pch" - + enableval=$enable_libstdcxx_pch; case "$enableval" in yes|no) ;; *) { { echo "$as_me:$LINENO: error: Argument to enable/disable libstdcxx-pch must be yes or no" >&5 @@ -13900,19 +14808,19 @@ echo "$as_me: error: Argument to enable/disable libstdcxx-pch must be yes or no" else enable_libstdcxx_pch=$is_hosted -fi; +fi + if test $enable_libstdcxx_pch = yes; then - echo "$as_me:$LINENO: checking for compiler with PCH support" >&5 -echo $ECHO_N "checking for compiler with PCH support... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for compiler with PCH support" >&5 +echo $ECHO_N "checking for compiler with PCH support... $ECHO_C" >&6; } if test "${glibcxx_cv_prog_CXX_pch+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_save_CXXFLAGS="$CXXFLAGS" CXXFLAGS="$CXXFLAGS -Werror -Winvalid-pch -Wno-deprecated" - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -13939,15 +14847,15 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi -echo "$as_me:$LINENO: result: $glibcxx_cv_prog_CXX_pch" >&5 -echo "${ECHO_T}$glibcxx_cv_prog_CXX_pch" >&6 +{ echo "$as_me:$LINENO: result: $glibcxx_cv_prog_CXX_pch" >&5 +echo "${ECHO_T}$glibcxx_cv_prog_CXX_pch" >&6; } enable_libstdcxx_pch=$glibcxx_cv_prog_CXX_pch fi - echo "$as_me:$LINENO: checking for enabled PCH" >&5 -echo $ECHO_N "checking for enabled PCH... $ECHO_C" >&6 - echo "$as_me:$LINENO: result: $enable_libstdcxx_pch" >&5 -echo "${ECHO_T}$enable_libstdcxx_pch" >&6 + { echo "$as_me:$LINENO: checking for enabled PCH" >&5 +echo $ECHO_N "checking for enabled PCH... $ECHO_C" >&6; } + { echo "$as_me:$LINENO: result: $enable_libstdcxx_pch" >&5 +echo "${ECHO_T}$enable_libstdcxx_pch" >&6; } if test $enable_libstdcxx_pch = yes; then @@ -13960,12 +14868,11 @@ echo "${ECHO_T}$enable_libstdcxx_pch" >&6 # Enable all the variable C++ runtime options that doesn't require linking. - echo "$as_me:$LINENO: checking for underlying I/O to use" >&5 -echo $ECHO_N "checking for underlying I/O to use... $ECHO_C" >&6 - # Check whether --enable-cstdio or --disable-cstdio was given. + { echo "$as_me:$LINENO: checking for underlying I/O to use" >&5 +echo $ECHO_N "checking for underlying I/O to use... $ECHO_C" >&6; } + # Check whether --enable-cstdio was given. if test "${enable_cstdio+set}" = set; then - enableval="$enable_cstdio" - + enableval=$enable_cstdio; case "$enableval" in stdio) ;; *) { { echo "$as_me:$LINENO: error: Unknown argument to enable/disable cstdio" >&5 @@ -13975,7 +14882,8 @@ echo "$as_me: error: Unknown argument to enable/disable cstdio" >&2;} else enable_cstdio=stdio -fi; +fi + # Now that libio has been removed, you can have any color you want as long @@ -13986,8 +14894,8 @@ fi; CSTDIO_H=config/io/c_io_stdio.h BASIC_FILE_H=config/io/basic_file_stdio.h BASIC_FILE_CC=config/io/basic_file_stdio.cc - echo "$as_me:$LINENO: result: stdio" >&5 -echo "${ECHO_T}stdio" >&6 + { echo "$as_me:$LINENO: result: stdio" >&5 +echo "${ECHO_T}stdio" >&6; } ;; esac @@ -13996,10 +14904,9 @@ echo "${ECHO_T}stdio" >&6 - # Check whether --enable-clocale or --disable-clocale was given. + # Check whether --enable-clocale was given. if test "${enable_clocale+set}" = set; then - enableval="$enable_clocale" - + enableval=$enable_clocale; case "$enableval" in generic|gnu|ieee_1003.1-2001|yes|no|auto) ;; *) { { echo "$as_me:$LINENO: error: Unknown argument to enable/disable clocale" >&5 @@ -14009,20 +14916,21 @@ echo "$as_me: error: Unknown argument to enable/disable clocale" >&2;} else enable_clocale=auto -fi; +fi + # Deal with gettext issues. Default to not using it (=no) until we detect # support for it later. Let the user turn it off via --e/d, but let that # default to on for easier handling. USE_NLS=no - # Check whether --enable-nls or --disable-nls was given. + # Check whether --enable-nls was given. if test "${enable_nls+set}" = set; then - enableval="$enable_nls" - + enableval=$enable_nls; else enable_nls=yes -fi; +fi + # Either a known packaage, or "auto" if test $enable_clocale = no || test $enable_clocale = yes; then @@ -14107,13 +15015,22 @@ cat >>conftest.$ac_ext <<_ACEOF _ACEOF rm -f conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>&5 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='./conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then @@ -14126,8 +15043,10 @@ sed 's/^/| /' conftest.$ac_ext >&5 ( exit $ac_status ) enable_clocale_flag=generic fi -rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext fi + + fi # Set it to scream when it hurts. @@ -14153,27 +15072,22 @@ char s[128]; __locale_t loc; strxfrm_l(s, "C", 5, loc); } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then cat >>confdefs.h <<\_ACEOF #define HAVE_STRXFRM_L 1 @@ -14183,8 +15097,10 @@ else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 + fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext # Use strerror_l if available. cat >conftest.$ac_ext <<_ACEOF @@ -14205,27 +15121,22 @@ __locale_t loc; strerror_l(5, loc); } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then cat >>confdefs.h <<\_ACEOF #define HAVE_STRERROR_L 1 @@ -14235,8 +15146,10 @@ else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 + fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext CFLAGS="$ac_save_CFLAGS" fi @@ -14262,27 +15175,22 @@ char s[128]; strerror_r(5, s, 128); } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then cat >>confdefs.h <<\_ACEOF #define HAVE_STRERROR_R 1 @@ -14292,17 +15200,19 @@ else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 + fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext CFLAGS="$ac_save_CFLAGS" # Set configure bits for specified locale package - echo "$as_me:$LINENO: checking for C locale to use" >&5 -echo $ECHO_N "checking for C locale to use... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for C locale to use" >&5 +echo $ECHO_N "checking for C locale to use... $ECHO_C" >&6; } case ${enable_clocale_flag} in generic) - echo "$as_me:$LINENO: result: generic" >&5 -echo "${ECHO_T}generic" >&6 + { echo "$as_me:$LINENO: result: generic" >&5 +echo "${ECHO_T}generic" >&6; } CLOCALE_H=config/locale/generic/c_locale.h CLOCALE_CC=config/locale/generic/c_locale.cc @@ -14318,8 +15228,8 @@ echo "${ECHO_T}generic" >&6 CLOCALE_INTERNAL_H=config/locale/generic/c++locale_internal.h ;; darwin) - echo "$as_me:$LINENO: result: darwin or freebsd" >&5 -echo "${ECHO_T}darwin or freebsd" >&6 + { echo "$as_me:$LINENO: result: darwin or freebsd" >&5 +echo "${ECHO_T}darwin or freebsd" >&6; } CLOCALE_H=config/locale/generic/c_locale.h CLOCALE_CC=config/locale/generic/c_locale.cc @@ -14336,8 +15246,8 @@ echo "${ECHO_T}darwin or freebsd" >&6 ;; gnu) - echo "$as_me:$LINENO: result: gnu" >&5 -echo "${ECHO_T}gnu" >&6 + { echo "$as_me:$LINENO: result: gnu" >&5 +echo "${ECHO_T}gnu" >&6; } # Declare intention to use gettext, and add support for specific # languages. @@ -14347,8 +15257,8 @@ echo "${ECHO_T}gnu" >&6 # Don't call AM-GNU-GETTEXT here. Instead, assume glibc. # Extract the first word of "msgfmt", so it can be a program name with args. set dummy msgfmt; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_check_msgfmt+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -14361,26 +15271,28 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_check_msgfmt="yes" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done +IFS=$as_save_IFS test -z "$ac_cv_prog_check_msgfmt" && ac_cv_prog_check_msgfmt="no" fi fi check_msgfmt=$ac_cv_prog_check_msgfmt if test -n "$check_msgfmt"; then - echo "$as_me:$LINENO: result: $check_msgfmt" >&5 -echo "${ECHO_T}$check_msgfmt" >&6 + { echo "$as_me:$LINENO: result: $check_msgfmt" >&5 +echo "${ECHO_T}$check_msgfmt" >&6; } else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } fi + if test x"$check_msgfmt" = x"yes" && test x"$enable_nls" = x"yes"; then USE_NLS=yes fi @@ -14406,8 +15318,8 @@ fi CLOCALE_INTERNAL_H=config/locale/gnu/c++locale_internal.h ;; ieee_1003.1-2001) - echo "$as_me:$LINENO: result: IEEE 1003.1" >&5 -echo "${ECHO_T}IEEE 1003.1" >&6 + { echo "$as_me:$LINENO: result: IEEE 1003.1" >&5 +echo "${ECHO_T}IEEE 1003.1" >&6; } CLOCALE_H=config/locale/ieee_1003.1-2001/c_locale.h CLOCALE_CC=config/locale/ieee_1003.1-2001/c_locale.cc @@ -14435,18 +15347,19 @@ echo "${ECHO_T}IEEE 1003.1" >&6 for ac_header in libintl.h do as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + { echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 +ac_res=`eval echo '${'$as_ac_Header'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } else # Is the header compilable? -echo "$as_me:$LINENO: checking $ac_header usability" >&5 -echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking $ac_header usability" >&5 +echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6; } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF @@ -14457,41 +15370,37 @@ $ac_includes_default #include <$ac_header> _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then ac_header_compiler=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -ac_header_compiler=no + ac_header_compiler=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 -echo "${ECHO_T}$ac_header_compiler" >&6 + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +echo "${ECHO_T}$ac_header_compiler" >&6; } # Is the header present? -echo "$as_me:$LINENO: checking $ac_header presence" >&5 -echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking $ac_header presence" >&5 +echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6; } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF @@ -14500,24 +15409,22 @@ cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include <$ac_header> _ACEOF -if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 - (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 +if { (ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null; then - if test -s conftest.err; then - ac_cpp_err=$ac_c_preproc_warn_flag - ac_cpp_err=$ac_cpp_err$ac_c_werror_flag - else - ac_cpp_err= - fi -else - ac_cpp_err=yes -fi -if test -z "$ac_cpp_err"; then + (exit $ac_status); } >/dev/null && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then ac_header_preproc=yes else echo "$as_me: failed program was:" >&5 @@ -14525,9 +15432,10 @@ sed 's/^/| /' conftest.$ac_ext >&5 ac_header_preproc=no fi + rm -f conftest.err conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 -echo "${ECHO_T}$ac_header_preproc" >&6 +{ echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 +echo "${ECHO_T}$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in @@ -14551,25 +15459,19 @@ echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\ echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} - ( - cat <<\_ASBOX -## ----------------------------------------- ## -## Report this to the package-unused lists. ## -## ----------------------------------------- ## -_ASBOX - ) | - sed "s/^/$as_me: WARNING: /" >&2 + ;; esac -echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else eval "$as_ac_Header=\$ac_header_preproc" fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 +ac_res=`eval echo '${'$as_ac_Header'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } fi if test `eval echo '${'$as_ac_Header'}'` = yes; then @@ -14583,18 +15485,12 @@ fi done - echo "$as_me:$LINENO: checking for library containing gettext" >&5 -echo $ECHO_N "checking for library containing gettext... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for library containing gettext" >&5 +echo $ECHO_N "checking for library containing gettext... $ECHO_C" >&6; } if test "${ac_cv_search_gettext+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_func_search_save_LIBS=$LIBS -ac_cv_search_gettext=no -if test x$gcc_no_link = xyes; then - { { echo "$as_me:$LINENO: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&5 -echo "$as_me: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&2;} - { (exit 1); exit 1; }; } -fi cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF @@ -14602,120 +15498,78 @@ cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char gettext (); int main () { -gettext (); +return gettext (); ; return 0; } _ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_search_gettext="none required" -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -if test "$ac_cv_search_gettext" = no; then - for ac_lib in intl; do +for ac_lib in '' intl; do + if test -z "$ac_lib"; then + ac_res="none required" + else + ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" - if test x$gcc_no_link = xyes; then + fi + if test x$gcc_no_link = xyes; then { { echo "$as_me:$LINENO: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&5 echo "$as_me: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&2;} { (exit 1); exit 1; }; } fi -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -/* Override any gcc2 internal prototype to avoid an error. */ -#ifdef __cplusplus -extern "C" -#endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char gettext (); -int -main () -{ -gettext (); - ; - return 0; -} -_ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_search_gettext="-l$ac_lib" -break + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then + ac_cv_search_gettext=$ac_res else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 + fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - done + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext + if test "${ac_cv_search_gettext+set}" = set; then + break +fi +done +if test "${ac_cv_search_gettext+set}" = set; then + : +else + ac_cv_search_gettext=no fi +rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi -echo "$as_me:$LINENO: result: $ac_cv_search_gettext" >&5 -echo "${ECHO_T}$ac_cv_search_gettext" >&6 -if test "$ac_cv_search_gettext" != no; then - test "$ac_cv_search_gettext" = "none required" || LIBS="$ac_cv_search_gettext $LIBS" +{ echo "$as_me:$LINENO: result: $ac_cv_search_gettext" >&5 +echo "${ECHO_T}$ac_cv_search_gettext" >&6; } +ac_res=$ac_cv_search_gettext +if test "$ac_res" != no; then + test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" else USE_NLS=no @@ -14745,12 +15599,11 @@ _ACEOF - echo "$as_me:$LINENO: checking for std::allocator base class" >&5 -echo $ECHO_N "checking for std::allocator base class... $ECHO_C" >&6 - # Check whether --enable-libstdcxx-allocator or --disable-libstdcxx-allocator was given. + { echo "$as_me:$LINENO: checking for std::allocator base class" >&5 +echo $ECHO_N "checking for std::allocator base class... $ECHO_C" >&6; } + # Check whether --enable-libstdcxx-allocator was given. if test "${enable_libstdcxx_allocator+set}" = set; then - enableval="$enable_libstdcxx_allocator" - + enableval=$enable_libstdcxx_allocator; case "$enableval" in new|malloc|mt|bitmap|pool|yes|no|auto) ;; *) { { echo "$as_me:$LINENO: error: Unknown argument to enable/disable libstdcxx-allocator" >&5 @@ -14760,7 +15613,8 @@ echo "$as_me: error: Unknown argument to enable/disable libstdcxx-allocator" >&2 else enable_libstdcxx_allocator=auto -fi; +fi + # If they didn't use this option switch, or if they specified --enable @@ -14788,8 +15642,8 @@ fi; ;; esac fi - echo "$as_me:$LINENO: result: $enable_libstdcxx_allocator_flag" >&5 -echo "${ECHO_T}$enable_libstdcxx_allocator_flag" >&6 + { echo "$as_me:$LINENO: result: $enable_libstdcxx_allocator_flag" >&5 +echo "${ECHO_T}$enable_libstdcxx_allocator_flag" >&6; } # Set configure bits for specified locale package @@ -14820,10 +15674,9 @@ echo "${ECHO_T}$enable_libstdcxx_allocator_flag" >&6 - # Check whether --enable-cheaders or --disable-cheaders was given. + # Check whether --enable-cheaders was given. if test "${enable_cheaders+set}" = set; then - enableval="$enable_cheaders" - + enableval=$enable_cheaders; case "$enableval" in c|c_std|c_global) ;; *) { { echo "$as_me:$LINENO: error: Unknown argument to enable/disable cheaders" >&5 @@ -14833,7 +15686,8 @@ echo "$as_me: error: Unknown argument to enable/disable cheaders" >&2;} else enable_cheaders=$c_model -fi; +fi + { echo "$as_me:$LINENO: \"C\" header strategy set to $enable_cheaders" >&5 echo "$as_me: \"C\" header strategy set to $enable_cheaders" >&6;} @@ -14856,10 +15710,9 @@ echo "$as_me: \"C\" header strategy set to $enable_cheaders" >&6;} - # Check whether --enable-long-long or --disable-long-long was given. + # Check whether --enable-long-long was given. if test "${enable_long_long+set}" = set; then - enableval="$enable_long_long" - + enableval=$enable_long_long; case "$enableval" in yes|no) ;; *) { { echo "$as_me:$LINENO: error: Argument to enable/disable long-long must be yes or no" >&5 @@ -14869,7 +15722,8 @@ echo "$as_me: error: Argument to enable/disable long-long must be yes or no" >&2 else enable_long_long=yes -fi; +fi + if test $enable_long_long = yes; then @@ -14878,16 +15732,15 @@ cat >>confdefs.h <<\_ACEOF _ACEOF fi - echo "$as_me:$LINENO: checking for enabled long long specializations" >&5 -echo $ECHO_N "checking for enabled long long specializations... $ECHO_C" >&6 - echo "$as_me:$LINENO: result: $enable_long_long" >&5 -echo "${ECHO_T}$enable_long_long" >&6 + { echo "$as_me:$LINENO: checking for enabled long long specializations" >&5 +echo $ECHO_N "checking for enabled long long specializations... $ECHO_C" >&6; } + { echo "$as_me:$LINENO: result: $enable_long_long" >&5 +echo "${ECHO_T}$enable_long_long" >&6; } - # Check whether --enable-wchar_t or --disable-wchar_t was given. + # Check whether --enable-wchar_t was given. if test "${enable_wchar_t+set}" = set; then - enableval="$enable_wchar_t" - + enableval=$enable_wchar_t; case "$enableval" in yes|no) ;; *) { { echo "$as_me:$LINENO: error: Argument to enable/disable wchar_t must be yes or no" >&5 @@ -14897,7 +15750,8 @@ echo "$as_me: error: Argument to enable/disable wchar_t must be yes or no" >&2;} else enable_wchar_t=yes -fi; +fi + # Test wchar.h for mbstate_t, which is needed for char_traits and fpos. @@ -14905,18 +15759,19 @@ fi; for ac_header in wchar.h do as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + { echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 +ac_res=`eval echo '${'$as_ac_Header'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } else # Is the header compilable? -echo "$as_me:$LINENO: checking $ac_header usability" >&5 -echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking $ac_header usability" >&5 +echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6; } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF @@ -14927,41 +15782,37 @@ $ac_includes_default #include <$ac_header> _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then ac_header_compiler=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -ac_header_compiler=no + ac_header_compiler=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 -echo "${ECHO_T}$ac_header_compiler" >&6 + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +echo "${ECHO_T}$ac_header_compiler" >&6; } # Is the header present? -echo "$as_me:$LINENO: checking $ac_header presence" >&5 -echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking $ac_header presence" >&5 +echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6; } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF @@ -14970,24 +15821,22 @@ cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include <$ac_header> _ACEOF -if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 - (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 +if { (ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null; then - if test -s conftest.err; then - ac_cpp_err=$ac_c_preproc_warn_flag - ac_cpp_err=$ac_cpp_err$ac_c_werror_flag - else - ac_cpp_err= - fi -else - ac_cpp_err=yes -fi -if test -z "$ac_cpp_err"; then + (exit $ac_status); } >/dev/null && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then ac_header_preproc=yes else echo "$as_me: failed program was:" >&5 @@ -14995,9 +15844,10 @@ sed 's/^/| /' conftest.$ac_ext >&5 ac_header_preproc=no fi + rm -f conftest.err conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 -echo "${ECHO_T}$ac_header_preproc" >&6 +{ echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 +echo "${ECHO_T}$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in @@ -15021,25 +15871,19 @@ echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\ echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} - ( - cat <<\_ASBOX -## ----------------------------------------- ## -## Report this to the package-unused lists. ## -## ----------------------------------------- ## -_ASBOX - ) | - sed "s/^/$as_me: WARNING: /" >&2 + ;; esac -echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else eval "$as_ac_Header=\$ac_header_preproc" fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 +ac_res=`eval echo '${'$as_ac_Header'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } fi if test `eval echo '${'$as_ac_Header'}'` = yes; then @@ -15053,8 +15897,8 @@ fi done - echo "$as_me:$LINENO: checking for mbstate_t" >&5 -echo $ECHO_N "checking for mbstate_t... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for mbstate_t" >&5 +echo $ECHO_N "checking for mbstate_t... $ECHO_C" >&6; } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF @@ -15071,37 +15915,33 @@ mbstate_t teststate; } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then have_mbstate_t=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -have_mbstate_t=no + have_mbstate_t=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext - echo "$as_me:$LINENO: result: $have_mbstate_t" >&5 -echo "${ECHO_T}$have_mbstate_t" >&6 + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + { echo "$as_me:$LINENO: result: $have_mbstate_t" >&5 +echo "${ECHO_T}$have_mbstate_t" >&6; } if test x"$have_mbstate_t" = xyes; then cat >>confdefs.h <<\_ACEOF @@ -15116,18 +15956,19 @@ _ACEOF for ac_header in wctype.h do as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + { echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 +ac_res=`eval echo '${'$as_ac_Header'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } else # Is the header compilable? -echo "$as_me:$LINENO: checking $ac_header usability" >&5 -echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking $ac_header usability" >&5 +echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6; } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF @@ -15138,41 +15979,37 @@ $ac_includes_default #include <$ac_header> _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then ac_header_compiler=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -ac_header_compiler=no + ac_header_compiler=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 -echo "${ECHO_T}$ac_header_compiler" >&6 + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +echo "${ECHO_T}$ac_header_compiler" >&6; } # Is the header present? -echo "$as_me:$LINENO: checking $ac_header presence" >&5 -echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking $ac_header presence" >&5 +echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6; } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF @@ -15181,24 +16018,22 @@ cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include <$ac_header> _ACEOF -if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 - (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 +if { (ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null; then - if test -s conftest.err; then - ac_cpp_err=$ac_c_preproc_warn_flag - ac_cpp_err=$ac_cpp_err$ac_c_werror_flag - else - ac_cpp_err= - fi -else - ac_cpp_err=yes -fi -if test -z "$ac_cpp_err"; then + (exit $ac_status); } >/dev/null && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then ac_header_preproc=yes else echo "$as_me: failed program was:" >&5 @@ -15206,9 +16041,10 @@ sed 's/^/| /' conftest.$ac_ext >&5 ac_header_preproc=no fi + rm -f conftest.err conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 -echo "${ECHO_T}$ac_header_preproc" >&6 +{ echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 +echo "${ECHO_T}$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in @@ -15232,25 +16068,19 @@ echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\ echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} - ( - cat <<\_ASBOX -## ----------------------------------------- ## -## Report this to the package-unused lists. ## -## ----------------------------------------- ## -_ASBOX - ) | - sed "s/^/$as_me: WARNING: /" >&2 + ;; esac -echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else eval "$as_ac_Header=\$ac_header_preproc" fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 +ac_res=`eval echo '${'$as_ac_Header'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } fi if test `eval echo '${'$as_ac_Header'}'` = yes; then @@ -15268,8 +16098,7 @@ done if test x"$enable_wchar_t" = x"yes"; then - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -15355,35 +16184,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then : else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -enable_wchar_t=no + enable_wchar_t=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext else enable_wchar_t=no fi @@ -15404,17 +16229,16 @@ _ACEOF fi - echo "$as_me:$LINENO: checking for enabled wchar_t specializations" >&5 -echo $ECHO_N "checking for enabled wchar_t specializations... $ECHO_C" >&6 - echo "$as_me:$LINENO: result: $enable_wchar_t" >&5 -echo "${ECHO_T}$enable_wchar_t" >&6 + { echo "$as_me:$LINENO: checking for enabled wchar_t specializations" >&5 +echo $ECHO_N "checking for enabled wchar_t specializations... $ECHO_C" >&6; } + { echo "$as_me:$LINENO: result: $enable_wchar_t" >&5 +echo "${ECHO_T}$enable_wchar_t" >&6; } - # Check whether --enable-c99 or --disable-c99 was given. + # Check whether --enable-c99 was given. if test "${enable_c99+set}" = set; then - enableval="$enable_c99" - + enableval=$enable_c99; case "$enableval" in yes|no) ;; *) { { echo "$as_me:$LINENO: error: Argument to enable/disable c99 must be yes or no" >&5 @@ -15424,14 +16248,14 @@ echo "$as_me: error: Argument to enable/disable c99 must be yes or no" >&2;} else enable_c99=yes -fi; +fi - if test x"$enable_c99" = x"yes"; then + if test x"$enable_c99" = x"yes"; then - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -15452,8 +16276,8 @@ ac_compiler_gnu=$ac_cv_cxx_compiler_gnu # Use -fno-exceptions to that the C driver can link these tests without # hitting undefined references to personality routines. CXXFLAGS="$CXXFLAGS -fno-exceptions" - echo "$as_me:$LINENO: checking for sin in -lm" >&5 -echo $ECHO_N "checking for sin in -lm... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for sin in -lm" >&5 +echo $ECHO_N "checking for sin in -lm... $ECHO_C" >&6; } if test "${ac_cv_lib_m_sin+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -15471,56 +16295,53 @@ cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char sin (); int main () { -sin (); +return sin (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then ac_cv_lib_m_sin=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -ac_cv_lib_m_sin=no + ac_cv_lib_m_sin=no fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -echo "$as_me:$LINENO: result: $ac_cv_lib_m_sin" >&5 -echo "${ECHO_T}$ac_cv_lib_m_sin" >&6 +{ echo "$as_me:$LINENO: result: $ac_cv_lib_m_sin" >&5 +echo "${ECHO_T}$ac_cv_lib_m_sin" >&6; } if test $ac_cv_lib_m_sin = yes; then LIBS="$LIBS -lm" @@ -15535,8 +16356,8 @@ fi fi # Check for the existence of functions used if C99 is enabled. - echo "$as_me:$LINENO: checking for ISO C99 support in " >&5 -echo $ECHO_N "checking for ISO C99 support in ... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for ISO C99 support in " >&5 +echo $ECHO_N "checking for ISO C99 support in ... $ECHO_C" >&6; } if test "${ac_c99_math+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -15573,35 +16394,31 @@ i = fpclassify(d1); } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then ac_c99_math=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -ac_c99_math=no + ac_c99_math=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext else if test x$gcc_no_link = xyes; then { { echo "$as_me:$LINENO: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&5 @@ -15639,42 +16456,39 @@ i = fpclassify(d1); } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then ac_c99_math=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -ac_c99_math=no + ac_c99_math=no fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi fi - echo "$as_me:$LINENO: result: $ac_c99_math" >&5 -echo "${ECHO_T}$ac_c99_math" >&6 + { echo "$as_me:$LINENO: result: $ac_c99_math" >&5 +echo "${ECHO_T}$ac_c99_math" >&6; } if test x"$ac_c99_math" = x"yes"; then cat >>confdefs.h <<\_ACEOF @@ -15691,18 +16505,19 @@ _ACEOF for ac_header in tgmath.h do as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + { echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 +ac_res=`eval echo '${'$as_ac_Header'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } else # Is the header compilable? -echo "$as_me:$LINENO: checking $ac_header usability" >&5 -echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking $ac_header usability" >&5 +echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6; } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF @@ -15713,41 +16528,37 @@ $ac_includes_default #include <$ac_header> _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then ac_header_compiler=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -ac_header_compiler=no + ac_header_compiler=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 -echo "${ECHO_T}$ac_header_compiler" >&6 + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +echo "${ECHO_T}$ac_header_compiler" >&6; } # Is the header present? -echo "$as_me:$LINENO: checking $ac_header presence" >&5 -echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking $ac_header presence" >&5 +echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6; } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF @@ -15756,24 +16567,22 @@ cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include <$ac_header> _ACEOF -if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 - (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 +if { (ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null; then - if test -s conftest.err; then - ac_cpp_err=$ac_cxx_preproc_warn_flag - ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag - else - ac_cpp_err= - fi -else - ac_cpp_err=yes -fi -if test -z "$ac_cpp_err"; then + (exit $ac_status); } >/dev/null && { + test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || + test ! -s conftest.err + }; then ac_header_preproc=yes else echo "$as_me: failed program was:" >&5 @@ -15781,9 +16590,10 @@ sed 's/^/| /' conftest.$ac_ext >&5 ac_header_preproc=no fi + rm -f conftest.err conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 -echo "${ECHO_T}$ac_header_preproc" >&6 +{ echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 +echo "${ECHO_T}$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_cxx_preproc_warn_flag in @@ -15807,25 +16617,19 @@ echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\ echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} - ( - cat <<\_ASBOX -## ----------------------------------------- ## -## Report this to the package-unused lists. ## -## ----------------------------------------- ## -_ASBOX - ) | - sed "s/^/$as_me: WARNING: /" >&2 + ;; esac -echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else eval "$as_ac_Header=\$ac_header_preproc" fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 +ac_res=`eval echo '${'$as_ac_Header'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } fi if test `eval echo '${'$as_ac_Header'}'` = yes; then @@ -15843,18 +16647,19 @@ done for ac_header in complex.h do as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + { echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 +ac_res=`eval echo '${'$as_ac_Header'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } else # Is the header compilable? -echo "$as_me:$LINENO: checking $ac_header usability" >&5 -echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking $ac_header usability" >&5 +echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6; } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF @@ -15865,41 +16670,37 @@ $ac_includes_default #include <$ac_header> _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then ac_header_compiler=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -ac_header_compiler=no + ac_header_compiler=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 -echo "${ECHO_T}$ac_header_compiler" >&6 + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +echo "${ECHO_T}$ac_header_compiler" >&6; } # Is the header present? -echo "$as_me:$LINENO: checking $ac_header presence" >&5 -echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking $ac_header presence" >&5 +echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6; } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF @@ -15908,24 +16709,22 @@ cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include <$ac_header> _ACEOF -if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 - (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 +if { (ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null; then - if test -s conftest.err; then - ac_cpp_err=$ac_cxx_preproc_warn_flag - ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag - else - ac_cpp_err= - fi -else - ac_cpp_err=yes -fi -if test -z "$ac_cpp_err"; then + (exit $ac_status); } >/dev/null && { + test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || + test ! -s conftest.err + }; then ac_header_preproc=yes else echo "$as_me: failed program was:" >&5 @@ -15933,9 +16732,10 @@ sed 's/^/| /' conftest.$ac_ext >&5 ac_header_preproc=no fi + rm -f conftest.err conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 -echo "${ECHO_T}$ac_header_preproc" >&6 +{ echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 +echo "${ECHO_T}$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_cxx_preproc_warn_flag in @@ -15959,25 +16759,19 @@ echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\ echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} - ( - cat <<\_ASBOX -## ----------------------------------------- ## -## Report this to the package-unused lists. ## -## ----------------------------------------- ## -_ASBOX - ) | - sed "s/^/$as_me: WARNING: /" >&2 + ;; esac -echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else eval "$as_ac_Header=\$ac_header_preproc" fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 +ac_res=`eval echo '${'$as_ac_Header'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } fi if test `eval echo '${'$as_ac_Header'}'` = yes; then @@ -15993,8 +16787,8 @@ done ac_c99_complex=no; if test x"$ac_has_complex_h" = x"yes"; then - echo "$as_me:$LINENO: checking for ISO C99 support in " >&5 -echo $ECHO_N "checking for ISO C99 support in ... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for ISO C99 support in " >&5 +echo $ECHO_N "checking for ISO C99 support in ... $ECHO_C" >&6; } if test x$gcc_no_link = xyes; then cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ @@ -16057,35 +16851,31 @@ f = cabsf(tmpf); } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then ac_c99_complex=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -ac_c99_complex=no + ac_c99_complex=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext else if test x$gcc_no_link = xyes; then { { echo "$as_me:$LINENO: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&5 @@ -16153,40 +16943,37 @@ f = cabsf(tmpf); } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then ac_c99_complex=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -ac_c99_complex=no + ac_c99_complex=no fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi fi - echo "$as_me:$LINENO: result: $ac_c99_complex" >&5 -echo "${ECHO_T}$ac_c99_complex" >&6 + { echo "$as_me:$LINENO: result: $ac_c99_complex" >&5 +echo "${ECHO_T}$ac_c99_complex" >&6; } if test x"$ac_c99_complex" = x"yes"; then cat >>confdefs.h <<\_ACEOF @@ -16196,8 +16983,8 @@ _ACEOF fi # Check for the existence in of vscanf, et. al. - echo "$as_me:$LINENO: checking for ISO C99 support in " >&5 -echo $ECHO_N "checking for ISO C99 support in ... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for ISO C99 support in " >&5 +echo $ECHO_N "checking for ISO C99 support in ... $ECHO_C" >&6; } if test "${ac_c99_stdio+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -16228,35 +17015,31 @@ snprintf("12", 0, "%i"); } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then ac_c99_stdio=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -ac_c99_stdio=no + ac_c99_stdio=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext else if test x$gcc_no_link = xyes; then { { echo "$as_me:$LINENO: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&5 @@ -16288,46 +17071,43 @@ snprintf("12", 0, "%i"); } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then ac_c99_stdio=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -ac_c99_stdio=no + ac_c99_stdio=no fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi fi - echo "$as_me:$LINENO: result: $ac_c99_stdio" >&5 -echo "${ECHO_T}$ac_c99_stdio" >&6 + { echo "$as_me:$LINENO: result: $ac_c99_stdio" >&5 +echo "${ECHO_T}$ac_c99_stdio" >&6; } # Check for the existence in of lldiv_t, et. al. - echo "$as_me:$LINENO: checking for ISO C99 support in " >&5 -echo $ECHO_N "checking for ISO C99 support in ... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for ISO C99 support in " >&5 +echo $ECHO_N "checking for ISO C99 support in ... $ECHO_C" >&6; } if test "${ac_c99_stdlib+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -16364,35 +17144,31 @@ char* tmp; } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then ac_c99_stdlib=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -ac_c99_stdlib=no + ac_c99_stdlib=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext else if test x$gcc_no_link = xyes; then { { echo "$as_me:$LINENO: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&5 @@ -16430,49 +17206,46 @@ char* tmp; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then ac_c99_stdlib=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -ac_c99_stdlib=no + ac_c99_stdlib=no fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi fi - echo "$as_me:$LINENO: result: $ac_c99_stdlib" >&5 -echo "${ECHO_T}$ac_c99_stdlib" >&6 + { echo "$as_me:$LINENO: result: $ac_c99_stdlib" >&5 +echo "${ECHO_T}$ac_c99_stdlib" >&6; } # Check for the existence in of wcstold, etc. ac_c99_wchar=no; if test x"$ac_has_wchar_h" = xyes && test x"$ac_has_wctype_h" = xyes; then - echo "$as_me:$LINENO: checking for ISO C99 support in " >&5 -echo $ECHO_N "checking for ISO C99 support in ... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for ISO C99 support in " >&5 +echo $ECHO_N "checking for ISO C99 support in ... $ECHO_C" >&6; } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF @@ -16496,35 +17269,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then ac_c99_wchar=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -ac_c99_wchar=no + ac_c99_wchar=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext # Checks for wide character functions that may not be present. # Injection of these is wrapped with guard macros. @@ -16547,27 +17316,22 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then cat >>confdefs.h <<\_ACEOF #define HAVE_VFWSCANF 1 @@ -16577,8 +17341,10 @@ else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 + fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ @@ -16597,27 +17363,22 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then cat >>confdefs.h <<\_ACEOF #define HAVE_VSWSCANF 1 @@ -16627,8 +17388,10 @@ else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 + fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ @@ -16647,27 +17410,22 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then cat >>confdefs.h <<\_ACEOF #define HAVE_VWSCANF 1 @@ -16677,8 +17435,10 @@ else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 + fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ @@ -16697,27 +17457,22 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then cat >>confdefs.h <<\_ACEOF #define HAVE_WCSTOF 1 @@ -16727,8 +17482,10 @@ else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 + fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ @@ -16746,27 +17503,22 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then cat >>confdefs.h <<\_ACEOF #define HAVE_ISWBLANK 1 @@ -16776,11 +17528,13 @@ else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 + fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext - echo "$as_me:$LINENO: result: $ac_c99_wchar" >&5 -echo "${ECHO_T}$ac_c99_wchar" >&6 +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + + { echo "$as_me:$LINENO: result: $ac_c99_wchar" >&5 +echo "${ECHO_T}$ac_c99_wchar" >&6; } fi # Option parsed, now set things appropriately. @@ -16809,16 +17563,15 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi - echo "$as_me:$LINENO: checking for fully enabled ISO C99 support" >&5 -echo $ECHO_N "checking for fully enabled ISO C99 support... $ECHO_C" >&6 - echo "$as_me:$LINENO: result: $enable_c99" >&5 -echo "${ECHO_T}$enable_c99" >&6 + { echo "$as_me:$LINENO: checking for fully enabled ISO C99 support" >&5 +echo $ECHO_N "checking for fully enabled ISO C99 support... $ECHO_C" >&6; } + { echo "$as_me:$LINENO: result: $enable_c99" >&5 +echo "${ECHO_T}$enable_c99" >&6; } - # Check whether --enable-concept-checks or --disable-concept-checks was given. + # Check whether --enable-concept-checks was given. if test "${enable_concept_checks+set}" = set; then - enableval="$enable_concept_checks" - + enableval=$enable_concept_checks; case "$enableval" in yes|no) ;; *) { { echo "$as_me:$LINENO: error: Argument to enable/disable concept-checks must be yes or no" >&5 @@ -16828,7 +17581,8 @@ echo "$as_me: error: Argument to enable/disable concept-checks must be yes or no else enable_concept_checks=no -fi; +fi + if test $enable_concept_checks = yes; then @@ -16839,10 +17593,9 @@ _ACEOF fi - # Check whether --enable-libstdcxx-debug-flags or --disable-libstdcxx-debug-flags was given. + # Check whether --enable-libstdcxx-debug-flags was given. if test "${enable_libstdcxx_debug_flags+set}" = set; then - enableval="$enable_libstdcxx_debug_flags" - case "x$enable_libstdcxx_debug_flags" in + enableval=$enable_libstdcxx_debug_flags; case "x$enable_libstdcxx_debug_flags" in xno | x) enable_libstdcxx_debug_flags= ;; x-*) ;; *) { { echo "$as_me:$LINENO: error: --enable-libstdcxx-debug-flags needs compiler flags as arguments" >&5 @@ -16851,7 +17604,8 @@ echo "$as_me: error: --enable-libstdcxx-debug-flags needs compiler flags as argu esac else enable_libstdcxx_debug_flags="-g3 -O0" -fi; +fi + # Option parsed, now set things appropriately @@ -16862,12 +17616,11 @@ fi; echo "$as_me: Debug build flags set to $DEBUG_FLAGS" >&6;} - echo "$as_me:$LINENO: checking for additional debug build" >&5 -echo $ECHO_N "checking for additional debug build... $ECHO_C" >&6 - # Check whether --enable-libstdcxx-debug or --disable-libstdcxx-debug was given. + { echo "$as_me:$LINENO: checking for additional debug build" >&5 +echo $ECHO_N "checking for additional debug build... $ECHO_C" >&6; } + # Check whether --enable-libstdcxx-debug was given. if test "${enable_libstdcxx_debug+set}" = set; then - enableval="$enable_libstdcxx_debug" - + enableval=$enable_libstdcxx_debug; case "$enableval" in yes|no) ;; *) { { echo "$as_me:$LINENO: error: Argument to enable/disable libstdcxx-debug must be yes or no" >&5 @@ -16877,10 +17630,11 @@ echo "$as_me: error: Argument to enable/disable libstdcxx-debug must be yes or n else enable_libstdcxx_debug=no -fi; +fi - echo "$as_me:$LINENO: result: $enable_libstdcxx_debug" >&5 -echo "${ECHO_T}$enable_libstdcxx_debug" >&6 + + { echo "$as_me:$LINENO: result: $enable_libstdcxx_debug" >&5 +echo "${ECHO_T}$enable_libstdcxx_debug" >&6; } @@ -16903,18 +17657,17 @@ echo "$as_me: $glibcxx_builddir/../libgomp/omp.h not found" >&6;} # enable_parallel=no # fi - echo "$as_me:$LINENO: checking for parallel mode support" >&5 -echo $ECHO_N "checking for parallel mode support... $ECHO_C" >&6 - echo "$as_me:$LINENO: result: $enable_parallel" >&5 -echo "${ECHO_T}$enable_parallel" >&6 + { echo "$as_me:$LINENO: checking for parallel mode support" >&5 +echo $ECHO_N "checking for parallel mode support... $ECHO_C" >&6; } + { echo "$as_me:$LINENO: result: $enable_parallel" >&5 +echo "${ECHO_T}$enable_parallel" >&6; } - echo "$as_me:$LINENO: checking for extra compiler flags for building" >&5 -echo $ECHO_N "checking for extra compiler flags for building... $ECHO_C" >&6 - # Check whether --enable-cxx-flags or --disable-cxx-flags was given. + { echo "$as_me:$LINENO: checking for extra compiler flags for building" >&5 +echo $ECHO_N "checking for extra compiler flags for building... $ECHO_C" >&6; } + # Check whether --enable-cxx-flags was given. if test "${enable_cxx_flags+set}" = set; then - enableval="$enable_cxx_flags" - case "x$enable_cxx_flags" in + enableval=$enable_cxx_flags; case "x$enable_cxx_flags" in xno | x) enable_cxx_flags= ;; x-*) ;; *) { { echo "$as_me:$LINENO: error: --enable-cxx-flags needs compiler flags as arguments" >&5 @@ -16923,7 +17676,8 @@ echo "$as_me: error: --enable-cxx-flags needs compiler flags as arguments" >&2;} esac else enable_cxx_flags= -fi; +fi + # Run through flags (either default or command-line) and set anything @@ -16942,15 +17696,14 @@ echo "$as_me: error: compiler flags start with a -" >&2;} fi EXTRA_CXX_FLAGS="$enable_cxx_flags" - echo "$as_me:$LINENO: result: $EXTRA_CXX_FLAGS" >&5 -echo "${ECHO_T}$EXTRA_CXX_FLAGS" >&6 + { echo "$as_me:$LINENO: result: $EXTRA_CXX_FLAGS" >&5 +echo "${ECHO_T}$EXTRA_CXX_FLAGS" >&6; } - # Check whether --enable-fully-dynamic-string or --disable-fully-dynamic-string was given. + # Check whether --enable-fully-dynamic-string was given. if test "${enable_fully_dynamic_string+set}" = set; then - enableval="$enable_fully_dynamic_string" - + enableval=$enable_fully_dynamic_string; case "$enableval" in yes|no) ;; *) { { echo "$as_me:$LINENO: error: Argument to enable/disable fully-dynamic-string must be yes or no" >&5 @@ -16960,7 +17713,8 @@ echo "$as_me: error: Argument to enable/disable fully-dynamic-string must be yes else enable_fully_dynamic_string=no -fi; +fi + if test $enable_fully_dynamic_string = yes; then @@ -16974,8 +17728,8 @@ _ACEOF # Checks for operating systems support that don't require linking. - echo "$as_me:$LINENO: checking for EOWNERDEAD" >&5 -echo $ECHO_N "checking for EOWNERDEAD... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for EOWNERDEAD" >&5 +echo $ECHO_N "checking for EOWNERDEAD... $ECHO_C" >&6; } if test "${ac_system_error1+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -16996,40 +17750,36 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then ac_system_error1=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -ac_system_error1=no + ac_system_error1=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi - echo "$as_me:$LINENO: result: $ac_system_error1" >&5 -echo "${ECHO_T}$ac_system_error1" >&6 + { echo "$as_me:$LINENO: result: $ac_system_error1" >&5 +echo "${ECHO_T}$ac_system_error1" >&6; } if test x"$ac_system_error1" = x"yes"; then cat >>confdefs.h <<\_ACEOF @@ -17038,8 +17788,8 @@ _ACEOF fi - echo "$as_me:$LINENO: checking for ENOTRECOVERABLE" >&5 -echo $ECHO_N "checking for ENOTRECOVERABLE... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for ENOTRECOVERABLE" >&5 +echo $ECHO_N "checking for ENOTRECOVERABLE... $ECHO_C" >&6; } if test "${ac_system_error2+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -17060,40 +17810,36 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then ac_system_error2=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -ac_system_error2=no + ac_system_error2=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi - echo "$as_me:$LINENO: result: $ac_system_error2" >&5 -echo "${ECHO_T}$ac_system_error2" >&6 + { echo "$as_me:$LINENO: result: $ac_system_error2" >&5 +echo "${ECHO_T}$ac_system_error2" >&6; } if test x"$ac_system_error2" = x"yes"; then cat >>confdefs.h <<\_ACEOF @@ -17102,8 +17848,8 @@ _ACEOF fi - echo "$as_me:$LINENO: checking for ENOLINK" >&5 -echo $ECHO_N "checking for ENOLINK... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for ENOLINK" >&5 +echo $ECHO_N "checking for ENOLINK... $ECHO_C" >&6; } if test "${ac_system_error3+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -17124,40 +17870,36 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then ac_system_error3=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -ac_system_error3=no + ac_system_error3=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi - echo "$as_me:$LINENO: result: $ac_system_error3" >&5 -echo "${ECHO_T}$ac_system_error3" >&6 + { echo "$as_me:$LINENO: result: $ac_system_error3" >&5 +echo "${ECHO_T}$ac_system_error3" >&6; } if test x"$ac_system_error3" = x"yes"; then cat >>confdefs.h <<\_ACEOF @@ -17166,8 +17908,8 @@ _ACEOF fi - echo "$as_me:$LINENO: checking for EPROTO" >&5 -echo $ECHO_N "checking for EPROTO... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for EPROTO" >&5 +echo $ECHO_N "checking for EPROTO... $ECHO_C" >&6; } if test "${ac_system_error_4+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -17188,40 +17930,36 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then ac_system_error_4=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -ac_system_error_4=no + ac_system_error_4=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi - echo "$as_me:$LINENO: result: $ac_system_error_4" >&5 -echo "${ECHO_T}$ac_system_error_4" >&6 + { echo "$as_me:$LINENO: result: $ac_system_error_4" >&5 +echo "${ECHO_T}$ac_system_error_4" >&6; } if test x"$ac_system_error_4" = x"yes"; then cat >>confdefs.h <<\_ACEOF @@ -17230,8 +17968,8 @@ _ACEOF fi - echo "$as_me:$LINENO: checking for ENODATA" >&5 -echo $ECHO_N "checking for ENODATA... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for ENODATA" >&5 +echo $ECHO_N "checking for ENODATA... $ECHO_C" >&6; } if test "${ac_system_error_5+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -17252,40 +17990,36 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then ac_system_error_5=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -ac_system_error_5=no + ac_system_error_5=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi - echo "$as_me:$LINENO: result: $ac_system_error_5" >&5 -echo "${ECHO_T}$ac_system_error_5" >&6 + { echo "$as_me:$LINENO: result: $ac_system_error_5" >&5 +echo "${ECHO_T}$ac_system_error_5" >&6; } if test x"$ac_system_error_5" = x"yes"; then cat >>confdefs.h <<\_ACEOF @@ -17294,8 +18028,8 @@ _ACEOF fi - echo "$as_me:$LINENO: checking for ENOSR" >&5 -echo $ECHO_N "checking for ENOSR... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for ENOSR" >&5 +echo $ECHO_N "checking for ENOSR... $ECHO_C" >&6; } if test "${ac_system_error_6+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -17316,40 +18050,36 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then ac_system_error_6=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -ac_system_error_6=no + ac_system_error_6=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi - echo "$as_me:$LINENO: result: $ac_system_error_6" >&5 -echo "${ECHO_T}$ac_system_error_6" >&6 + { echo "$as_me:$LINENO: result: $ac_system_error_6" >&5 +echo "${ECHO_T}$ac_system_error_6" >&6; } if test x"$ac_system_error_6" = x"yes"; then cat >>confdefs.h <<\_ACEOF @@ -17358,8 +18088,8 @@ _ACEOF fi - echo "$as_me:$LINENO: checking for ENOSTR" >&5 -echo $ECHO_N "checking for ENOSTR... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for ENOSTR" >&5 +echo $ECHO_N "checking for ENOSTR... $ECHO_C" >&6; } if test "${ac_system_error_7+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -17380,40 +18110,36 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then ac_system_error_7=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -ac_system_error_7=no + ac_system_error_7=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi - echo "$as_me:$LINENO: result: $ac_system_error_7" >&5 -echo "${ECHO_T}$ac_system_error_7" >&6 + { echo "$as_me:$LINENO: result: $ac_system_error_7" >&5 +echo "${ECHO_T}$ac_system_error_7" >&6; } if test x"$ac_system_error_7" = x"yes"; then cat >>confdefs.h <<\_ACEOF @@ -17422,8 +18148,8 @@ _ACEOF fi - echo "$as_me:$LINENO: checking for ETIME" >&5 -echo $ECHO_N "checking for ETIME... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for ETIME" >&5 +echo $ECHO_N "checking for ETIME... $ECHO_C" >&6; } if test "${ac_system_error_8+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -17444,40 +18170,36 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then ac_system_error_8=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -ac_system_error_8=no + ac_system_error_8=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi - echo "$as_me:$LINENO: result: $ac_system_error_8" >&5 -echo "${ECHO_T}$ac_system_error_8" >&6 + { echo "$as_me:$LINENO: result: $ac_system_error_8" >&5 +echo "${ECHO_T}$ac_system_error_8" >&6; } if test x"$ac_system_error_8" = x"yes"; then cat >>confdefs.h <<\_ACEOF @@ -17486,8 +18208,8 @@ _ACEOF fi - echo "$as_me:$LINENO: checking for sys_nerr" >&5 -echo $ECHO_N "checking for sys_nerr... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for sys_nerr" >&5 +echo $ECHO_N "checking for sys_nerr... $ECHO_C" >&6; } if test "${ac_system_error9+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -17508,40 +18230,36 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then ac_system_error9=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -ac_system_error9=no + ac_system_error9=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi - echo "$as_me:$LINENO: result: $ac_system_error9" >&5 -echo "${ECHO_T}$ac_system_error9" >&6 + { echo "$as_me:$LINENO: result: $ac_system_error9" >&5 +echo "${ECHO_T}$ac_system_error9" >&6; } if test x"$ac_system_error9" = x"yes"; then cat >>confdefs.h <<\_ACEOF @@ -17550,8 +18268,8 @@ _ACEOF fi - echo "$as_me:$LINENO: checking for EBADMSG" >&5 -echo $ECHO_N "checking for EBADMSG... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for EBADMSG" >&5 +echo $ECHO_N "checking for EBADMSG... $ECHO_C" >&6; } if test "${ac_system_error_10+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -17572,40 +18290,36 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then ac_system_error_10=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -ac_system_error_10=no + ac_system_error_10=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi - echo "$as_me:$LINENO: result: $ac_system_error_10" >&5 -echo "${ECHO_T}$ac_system_error_10" >&6 + { echo "$as_me:$LINENO: result: $ac_system_error_10" >&5 +echo "${ECHO_T}$ac_system_error_10" >&6; } if test x"$ac_system_error_10" = x"yes"; then cat >>confdefs.h <<\_ACEOF @@ -17614,8 +18328,8 @@ _ACEOF fi - echo "$as_me:$LINENO: checking for ECANCELED" >&5 -echo $ECHO_N "checking for ECANCELED... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for ECANCELED" >&5 +echo $ECHO_N "checking for ECANCELED... $ECHO_C" >&6; } if test "${ac_system_error_11+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -17636,40 +18350,36 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then ac_system_error_11=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -ac_system_error_11=no + ac_system_error_11=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi - echo "$as_me:$LINENO: result: $ac_system_error_11" >&5 -echo "${ECHO_T}$ac_system_error_11" >&6 + { echo "$as_me:$LINENO: result: $ac_system_error_11" >&5 +echo "${ECHO_T}$ac_system_error_11" >&6; } if test x"$ac_system_error_11" = x"yes"; then cat >>confdefs.h <<\_ACEOF @@ -17678,8 +18388,8 @@ _ACEOF fi - echo "$as_me:$LINENO: checking for EOVERFLOW" >&5 -echo $ECHO_N "checking for EOVERFLOW... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for EOVERFLOW" >&5 +echo $ECHO_N "checking for EOVERFLOW... $ECHO_C" >&6; } if test "${ac_system_error_12+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -17700,40 +18410,36 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then ac_system_error_12=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -ac_system_error_12=no + ac_system_error_12=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi - echo "$as_me:$LINENO: result: $ac_system_error_12" >&5 -echo "${ECHO_T}$ac_system_error_12" >&6 + { echo "$as_me:$LINENO: result: $ac_system_error_12" >&5 +echo "${ECHO_T}$ac_system_error_12" >&6; } if test x"$ac_system_error_12" = x"yes"; then cat >>confdefs.h <<\_ACEOF @@ -17745,11 +18451,11 @@ _ACEOF # No surprises, no surprises... - echo "$as_me:$LINENO: checking for thread model used by GCC" >&5 -echo $ECHO_N "checking for thread model used by GCC... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for thread model used by GCC" >&5 +echo $ECHO_N "checking for thread model used by GCC... $ECHO_C" >&6; } target_thread_file=`$CXX -v 2>&1 | sed -n 's/^Thread model: //p'` - echo "$as_me:$LINENO: result: $target_thread_file" >&5 -echo "${ECHO_T}$target_thread_file" >&6 + { echo "$as_me:$LINENO: result: $target_thread_file" >&5 +echo "${ECHO_T}$target_thread_file" >&6; } if test $target_thread_file != single; then @@ -17771,11 +18477,10 @@ _ACEOF - echo "$as_me:$LINENO: checking for atomic builtins" >&5 -echo $ECHO_N "checking for atomic builtins... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for atomic builtins" >&5 +echo $ECHO_N "checking for atomic builtins... $ECHO_C" >&6; } - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -17784,7 +18489,7 @@ ac_compiler_gnu=$ac_cv_cxx_compiler_gnu # Fake what AC_TRY_COMPILE does. XXX Look at redoing this new-style. cat > conftest.$ac_ext << EOF -#line 17787 "configure" +#line 18492 "configure" int main() { // NB: _Atomic_word not necessarily int. @@ -17831,8 +18536,8 @@ ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu - echo "$as_me:$LINENO: result: $enable_atomic_builtins" >&5 -echo "${ECHO_T}$enable_atomic_builtins" >&6 + { echo "$as_me:$LINENO: result: $enable_atomic_builtins" >&5 +echo "${ECHO_T}$enable_atomic_builtins" >&6; } if test $atomicity_dir = cpu/generic/atomicity_mutex ; then { echo "$as_me:$LINENO: WARNING: No native atomic operations are provided for this platform." >&5 @@ -17855,8 +18560,7 @@ fi # The CXXFLAGS thing is suspicious, but based on similar bits previously # found in GLIBCXX_CONFIGURE. - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -17873,8 +18577,8 @@ ac_compiler_gnu=$ac_cv_cxx_compiler_gnu fi # Check for -ffunction-sections -fdata-sections - echo "$as_me:$LINENO: checking for g++ that supports -ffunction-sections -fdata-sections" >&5 -echo $ECHO_N "checking for g++ that supports -ffunction-sections -fdata-sections... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for g++ that supports -ffunction-sections -fdata-sections" >&5 +echo $ECHO_N "checking for g++ that supports -ffunction-sections -fdata-sections... $ECHO_C" >&6; } CXXFLAGS='-g -Werror -ffunction-sections -fdata-sections' cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ @@ -17892,35 +18596,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then ac_fdsections=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -ac_fdsections=no + ac_fdsections=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test "$ac_test_CXXFLAGS" = set; then CXXFLAGS="$ac_save_CXXFLAGS" else @@ -17930,8 +18630,8 @@ rm -f conftest.err conftest.$ac_objext conftest.$ac_ext if test x"$ac_fdsections" = x"yes"; then SECTION_FLAGS='-ffunction-sections -fdata-sections' fi - echo "$as_me:$LINENO: result: $ac_fdsections" >&5 -echo "${ECHO_T}$ac_fdsections" >&6 + { echo "$as_me:$LINENO: result: $ac_fdsections" >&5 +echo "${ECHO_T}$ac_fdsections" >&6; } ac_ext=c ac_cpp='$CPP $CPPFLAGS' @@ -17969,18 +18669,19 @@ for ac_header in nan.h ieeefp.h endian.h sys/isa_defs.h machine/endian.h \ sys/types.h sys/ipc.h sys/sem.h do as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + { echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 +ac_res=`eval echo '${'$as_ac_Header'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } else # Is the header compilable? -echo "$as_me:$LINENO: checking $ac_header usability" >&5 -echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking $ac_header usability" >&5 +echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6; } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF @@ -17991,41 +18692,37 @@ $ac_includes_default #include <$ac_header> _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then ac_header_compiler=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -ac_header_compiler=no + ac_header_compiler=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 -echo "${ECHO_T}$ac_header_compiler" >&6 + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +echo "${ECHO_T}$ac_header_compiler" >&6; } # Is the header present? -echo "$as_me:$LINENO: checking $ac_header presence" >&5 -echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking $ac_header presence" >&5 +echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6; } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF @@ -18034,24 +18731,22 @@ cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include <$ac_header> _ACEOF -if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 - (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 +if { (ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null; then - if test -s conftest.err; then - ac_cpp_err=$ac_c_preproc_warn_flag - ac_cpp_err=$ac_cpp_err$ac_c_werror_flag - else - ac_cpp_err= - fi -else - ac_cpp_err=yes -fi -if test -z "$ac_cpp_err"; then + (exit $ac_status); } >/dev/null && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then ac_header_preproc=yes else echo "$as_me: failed program was:" >&5 @@ -18059,9 +18754,10 @@ sed 's/^/| /' conftest.$ac_ext >&5 ac_header_preproc=no fi + rm -f conftest.err conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 -echo "${ECHO_T}$ac_header_preproc" >&6 +{ echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 +echo "${ECHO_T}$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in @@ -18085,25 +18781,19 @@ echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\ echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} - ( - cat <<\_ASBOX -## ----------------------------------------- ## -## Report this to the package-unused lists. ## -## ----------------------------------------- ## -_ASBOX - ) | - sed "s/^/$as_me: WARNING: /" >&2 + ;; esac -echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else eval "$as_ac_Header=\$ac_header_preproc" fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 +ac_res=`eval echo '${'$as_ac_Header'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } fi if test `eval echo '${'$as_ac_Header'}'` = yes; then @@ -18118,18 +18808,18 @@ done -# Check whether --with-gnu-ld or --without-gnu-ld was given. +# Check whether --with-gnu-ld was given. if test "${with_gnu_ld+set}" = set; then - withval="$with_gnu_ld" - test "$withval" = no || with_gnu_ld=yes + withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes else with_gnu_ld=no -fi; +fi + ac_prog=ld if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. - echo "$as_me:$LINENO: checking for ld used by $CC" >&5 -echo $ECHO_N "checking for ld used by $CC... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for ld used by $CC" >&5 +echo $ECHO_N "checking for ld used by $CC... $ECHO_C" >&6; } case $host in *-*-mingw*) # gcc leaves a trailing carriage return which upsets mingw @@ -18158,11 +18848,11 @@ echo $ECHO_N "checking for ld used by $CC... $ECHO_C" >&6 ;; esac elif test "$with_gnu_ld" = yes; then - echo "$as_me:$LINENO: checking for GNU ld" >&5 -echo $ECHO_N "checking for GNU ld... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for GNU ld" >&5 +echo $ECHO_N "checking for GNU ld... $ECHO_C" >&6; } else - echo "$as_me:$LINENO: checking for non-GNU ld" >&5 -echo $ECHO_N "checking for non-GNU ld... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for non-GNU ld" >&5 +echo $ECHO_N "checking for non-GNU ld... $ECHO_C" >&6; } fi if test "${lt_cv_path_LD+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 @@ -18195,17 +18885,17 @@ fi LD="$lt_cv_path_LD" if test -n "$LD"; then - echo "$as_me:$LINENO: result: $LD" >&5 -echo "${ECHO_T}$LD" >&6 + { echo "$as_me:$LINENO: result: $LD" >&5 +echo "${ECHO_T}$LD" >&6; } else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } fi test -z "$LD" && { { echo "$as_me:$LINENO: error: no acceptable ld found in \$PATH" >&5 echo "$as_me: error: no acceptable ld found in \$PATH" >&2;} { (exit 1); exit 1; }; } -echo "$as_me:$LINENO: checking if the linker ($LD) is GNU ld" >&5 -echo $ECHO_N "checking if the linker ($LD) is GNU ld... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking if the linker ($LD) is GNU ld" >&5 +echo $ECHO_N "checking if the linker ($LD) is GNU ld... $ECHO_C" >&6; } if test "${lt_cv_prog_gnu_ld+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -18219,8 +18909,8 @@ case `$LD -v 2>&1 &5 -echo "${ECHO_T}$lt_cv_prog_gnu_ld" >&6 +{ echo "$as_me:$LINENO: result: $lt_cv_prog_gnu_ld" >&5 +echo "${ECHO_T}$lt_cv_prog_gnu_ld" >&6; } with_gnu_ld=$lt_cv_prog_gnu_ld @@ -18255,16 +18945,16 @@ with_gnu_ld=$lt_cv_prog_gnu_ld # Start by getting the version number. I think the libtool test already # does some of this, but throws away the result. if test x"$with_gnu_ld" = x"yes"; then - echo "$as_me:$LINENO: checking for ld version" >&5 -echo $ECHO_N "checking for ld version... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for ld version" >&5 +echo $ECHO_N "checking for ld version... $ECHO_C" >&6; } ldver=`$LD --version 2>/dev/null | head -1 | \ sed -e 's/GNU ld \(version \)\{0,1\}\(([^)]*) \)\{0,1\}\([0-9.][0-9.]*\).*/\3/'` glibcxx_gnu_ld_version=`echo $ldver | \ $AWK -F. '{ if (NF<3) $3=0; print ($1*100+$2)*100+$3 }'` - echo "$as_me:$LINENO: result: $glibcxx_gnu_ld_version" >&5 -echo "${ECHO_T}$glibcxx_gnu_ld_version" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_gnu_ld_version" >&5 +echo "${ECHO_T}$glibcxx_gnu_ld_version" >&6; } fi # Set --gc-sections. @@ -18281,8 +18971,8 @@ echo "${ECHO_T}$glibcxx_gnu_ld_version" >&6 CFLAGS='-Wl,--gc-sections' # Check for -Wl,--gc-sections - echo "$as_me:$LINENO: checking for ld that supports -Wl,--gc-sections" >&5 -echo $ECHO_N "checking for ld that supports -Wl,--gc-sections... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for ld that supports -Wl,--gc-sections" >&5 +echo $ECHO_N "checking for ld that supports -Wl,--gc-sections... $ECHO_C" >&6; } if test x$gcc_no_link = xyes; then { { echo "$as_me:$LINENO: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&5 echo "$as_me: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&2;} @@ -18306,35 +18996,32 @@ main () } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then ac_gcsections=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -ac_gcsections=no + ac_gcsections=no fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext if test "$ac_gcsections" = "yes"; then rm -f conftest.c @@ -18350,8 +19037,8 @@ rm -f conftest.err conftest.$ac_objext \ if test "$ac_gcsections" = "yes"; then SECTION_LDFLAGS="-Wl,--gc-sections $SECTION_LDFLAGS" fi - echo "$as_me:$LINENO: result: $ac_gcsections" >&5 -echo "${ECHO_T}$ac_gcsections" >&6 + { echo "$as_me:$LINENO: result: $ac_gcsections" >&5 +echo "${ECHO_T}$ac_gcsections" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS="$ac_save_CFLAGS" @@ -18365,15 +19052,15 @@ echo "${ECHO_T}$ac_gcsections" >&6 # Note this is only for shared objects. ac_ld_relro=no if test x"$with_gnu_ld" = x"yes"; then - echo "$as_me:$LINENO: checking for ld that supports -Wl,-z,relro" >&5 -echo $ECHO_N "checking for ld that supports -Wl,-z,relro... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for ld that supports -Wl,-z,relro" >&5 +echo $ECHO_N "checking for ld that supports -Wl,-z,relro... $ECHO_C" >&6; } cxx_z_relo=`$LD -v --help 2>/dev/null | grep "z relro"` if test -n "$cxx_z_relo"; then OPT_LDFLAGS="-Wl,-z,relro" ac_ld_relro=yes fi - echo "$as_me:$LINENO: result: $ac_ld_relro" >&5 -echo "${ECHO_T}$ac_ld_relro" >&6 + { echo "$as_me:$LINENO: result: $ac_ld_relro" >&5 +echo "${ECHO_T}$ac_ld_relro" >&6; } fi # Set linker optimization flags. @@ -18389,8 +19076,8 @@ echo "${ECHO_T}$ac_ld_relro" >&6 ac_save_CXXFLAGS="$CXXFLAGS" CXXFLAGS='-fno-builtin -D_GNU_SOURCE' - echo "$as_me:$LINENO: checking for sin in -lm" >&5 -echo $ECHO_N "checking for sin in -lm... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for sin in -lm" >&5 +echo $ECHO_N "checking for sin in -lm... $ECHO_C" >&6; } if test "${ac_cv_lib_m_sin+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -18408,56 +19095,53 @@ cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char sin (); int main () { -sin (); +return sin (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then ac_cv_lib_m_sin=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -ac_cv_lib_m_sin=no + ac_cv_lib_m_sin=no fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -echo "$as_me:$LINENO: result: $ac_cv_lib_m_sin" >&5 -echo "${ECHO_T}$ac_cv_lib_m_sin" >&6 +{ echo "$as_me:$LINENO: result: $ac_cv_lib_m_sin" >&5 +echo "${ECHO_T}$ac_cv_lib_m_sin" >&6; } if test $ac_cv_lib_m_sin = yes; then libm="-lm" fi @@ -18467,16 +19151,15 @@ fi - echo "$as_me:$LINENO: checking for isinf declaration" >&5 -echo $ECHO_N "checking for isinf declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for isinf declaration" >&5 +echo $ECHO_N "checking for isinf declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func_isinf_use+set} != xset; then if test "${glibcxx_cv_func_isinf_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -18502,35 +19185,205 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + glibcxx_cv_func_isinf_use=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + glibcxx_cv_func_isinf_use=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +fi + + fi + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_isinf_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_isinf_use" >&6; } + + if test x$glibcxx_cv_func_isinf_use = x"yes"; then + +for ac_func in isinf +do +as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test x$gcc_no_link = xyes; then + { { echo "$as_me:$LINENO: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&5 +echo "$as_me: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&2;} + { (exit 1); exit 1; }; } +fi +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define $ac_func to an innocuous variant, in case declares $ac_func. + For example, HP-UX 11i declares gettimeofday. */ +#define $ac_func innocuous_$ac_func + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $ac_func (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $ac_func + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char $ac_func (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_$ac_func || defined __stub___$ac_func +choke me +#endif + +int +main () +{ +return $ac_func (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then + eval "$as_ac_var=yes" +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + eval "$as_ac_var=no" +fi + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +fi +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } +if test `eval echo '${'$as_ac_var'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +fi +done + + else + + { echo "$as_me:$LINENO: checking for _isinf declaration" >&5 +echo $ECHO_N "checking for _isinf declaration... $ECHO_C" >&6; } + if test x${glibcxx_cv_func__isinf_use+set} != xset; then + if test "${glibcxx_cv_func__isinf_use+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + + ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include + #ifdef HAVE_IEEEFP_H + #include + #endif + +int +main () +{ + _isinf(0); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - glibcxx_cv_func_isinf_use=yes + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + glibcxx_cv_func__isinf_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_isinf_use=no + glibcxx_cv_func__isinf_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -18541,17 +19394,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_isinf_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_isinf_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__isinf_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__isinf_use" >&6; } - if test x$glibcxx_cv_func_isinf_use = x"yes"; then + if test x$glibcxx_cv_func__isinf_use = x"yes"; then -for ac_func in isinf +for ac_func in _isinf do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -18582,255 +19435,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ -#ifdef __cplusplus -extern "C" -{ -#endif -/* We use char because int might match the return type of a gcc2 +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ -char $ac_func (); -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) -choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} -#endif - -int -main () -{ -return f != $ac_func; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - eval "$as_ac_var=yes" -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -eval "$as_ac_var=no" -fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 -if test `eval echo '${'$as_ac_var'}'` = yes; then - cat >>confdefs.h <<_ACEOF -#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 -_ACEOF - -fi -done - - else - - echo "$as_me:$LINENO: checking for _isinf declaration" >&5 -echo $ECHO_N "checking for _isinf declaration... $ECHO_C" >&6 - if test x${glibcxx_cv_func__isinf_use+set} != xset; then - if test "${glibcxx_cv_func__isinf_use+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - - - - ac_ext=cc -ac_cpp='$CXXCPP $CPPFLAGS' -ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_cxx_compiler_gnu - - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include - #ifdef HAVE_IEEEFP_H - #include - #endif - -int -main () -{ - _isinf(0); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - glibcxx_cv_func__isinf_use=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -glibcxx_cv_func__isinf_use=no -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext - ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - - -fi - - fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__isinf_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__isinf_use" >&6 - - if test x$glibcxx_cv_func__isinf_use = x"yes"; then - -for ac_func in _isinf -do -as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test x$gcc_no_link = xyes; then - { { echo "$as_me:$LINENO: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&5 -echo "$as_me: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&2;} - { (exit 1); exit 1; }; } -fi -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -/* Define $ac_func to an innocuous variant, in case declares $ac_func. - For example, HP-UX 11i declares gettimeofday. */ -#define $ac_func innocuous_$ac_func - -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char $ac_func (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ - -#ifdef __STDC__ -# include -#else -# include -#endif - -#undef $ac_func - -/* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -18847,16 +19505,15 @@ done - echo "$as_me:$LINENO: checking for isnan declaration" >&5 -echo $ECHO_N "checking for isnan declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for isnan declaration" >&5 +echo $ECHO_N "checking for isnan declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func_isnan_use+set} != xset; then if test "${glibcxx_cv_func_isnan_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -18882,35 +19539,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func_isnan_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_isnan_use=no + glibcxx_cv_func_isnan_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -18921,17 +19574,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_isnan_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_isnan_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_isnan_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_isnan_use" >&6; } if test x$glibcxx_cv_func_isnan_use = x"yes"; then for ac_func in isnan do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -18962,68 +19615,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -19034,16 +19679,15 @@ done else - echo "$as_me:$LINENO: checking for _isnan declaration" >&5 -echo $ECHO_N "checking for _isnan declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for _isnan declaration" >&5 +echo $ECHO_N "checking for _isnan declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func__isnan_use+set} != xset; then if test "${glibcxx_cv_func__isnan_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -19069,35 +19713,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func__isnan_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func__isnan_use=no + glibcxx_cv_func__isnan_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -19108,17 +19748,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__isnan_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__isnan_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__isnan_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__isnan_use" >&6; } if test x$glibcxx_cv_func__isnan_use = x"yes"; then for ac_func in _isnan do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -19149,68 +19789,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -19227,16 +19859,15 @@ done - echo "$as_me:$LINENO: checking for finite declaration" >&5 -echo $ECHO_N "checking for finite declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for finite declaration" >&5 +echo $ECHO_N "checking for finite declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func_finite_use+set} != xset; then if test "${glibcxx_cv_func_finite_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -19262,35 +19893,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func_finite_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_finite_use=no + glibcxx_cv_func_finite_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -19301,17 +19928,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_finite_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_finite_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_finite_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_finite_use" >&6; } if test x$glibcxx_cv_func_finite_use = x"yes"; then for ac_func in finite do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -19342,68 +19969,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -19414,16 +20033,15 @@ done else - echo "$as_me:$LINENO: checking for _finite declaration" >&5 -echo $ECHO_N "checking for _finite declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for _finite declaration" >&5 +echo $ECHO_N "checking for _finite declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func__finite_use+set} != xset; then if test "${glibcxx_cv_func__finite_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -19449,35 +20067,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func__finite_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func__finite_use=no + glibcxx_cv_func__finite_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -19488,17 +20102,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__finite_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__finite_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__finite_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__finite_use" >&6; } if test x$glibcxx_cv_func__finite_use = x"yes"; then for ac_func in _finite do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -19529,68 +20143,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -19607,16 +20213,15 @@ done - echo "$as_me:$LINENO: checking for copysign declaration" >&5 -echo $ECHO_N "checking for copysign declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for copysign declaration" >&5 +echo $ECHO_N "checking for copysign declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func_copysign_use+set} != xset; then if test "${glibcxx_cv_func_copysign_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -19638,35 +20243,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func_copysign_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_copysign_use=no + glibcxx_cv_func_copysign_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -19677,17 +20278,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_copysign_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_copysign_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_copysign_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_copysign_use" >&6; } if test x$glibcxx_cv_func_copysign_use = x"yes"; then for ac_func in copysign do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -19718,68 +20319,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -19790,16 +20383,15 @@ done else - echo "$as_me:$LINENO: checking for _copysign declaration" >&5 -echo $ECHO_N "checking for _copysign declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for _copysign declaration" >&5 +echo $ECHO_N "checking for _copysign declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func__copysign_use+set} != xset; then if test "${glibcxx_cv_func__copysign_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -19821,35 +20413,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func__copysign_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func__copysign_use=no + glibcxx_cv_func__copysign_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -19860,17 +20448,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__copysign_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__copysign_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__copysign_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__copysign_use" >&6; } if test x$glibcxx_cv_func__copysign_use = x"yes"; then for ac_func in _copysign do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -19901,68 +20489,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -19979,16 +20559,15 @@ done - echo "$as_me:$LINENO: checking for sincos declaration" >&5 -echo $ECHO_N "checking for sincos declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for sincos declaration" >&5 +echo $ECHO_N "checking for sincos declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func_sincos_use+set} != xset; then if test "${glibcxx_cv_func_sincos_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -20010,35 +20589,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func_sincos_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_sincos_use=no + glibcxx_cv_func_sincos_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -20049,17 +20624,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_sincos_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_sincos_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_sincos_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_sincos_use" >&6; } if test x$glibcxx_cv_func_sincos_use = x"yes"; then for ac_func in sincos do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -20090,68 +20665,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -20162,16 +20729,15 @@ done else - echo "$as_me:$LINENO: checking for _sincos declaration" >&5 -echo $ECHO_N "checking for _sincos declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for _sincos declaration" >&5 +echo $ECHO_N "checking for _sincos declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func__sincos_use+set} != xset; then if test "${glibcxx_cv_func__sincos_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -20193,35 +20759,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func__sincos_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func__sincos_use=no + glibcxx_cv_func__sincos_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -20232,17 +20794,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__sincos_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__sincos_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__sincos_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__sincos_use" >&6; } if test x$glibcxx_cv_func__sincos_use = x"yes"; then for ac_func in _sincos do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -20273,68 +20835,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -20351,16 +20905,15 @@ done - echo "$as_me:$LINENO: checking for fpclass declaration" >&5 -echo $ECHO_N "checking for fpclass declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for fpclass declaration" >&5 +echo $ECHO_N "checking for fpclass declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func_fpclass_use+set} != xset; then if test "${glibcxx_cv_func_fpclass_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -20386,35 +20939,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func_fpclass_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_fpclass_use=no + glibcxx_cv_func_fpclass_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -20425,17 +20974,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_fpclass_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_fpclass_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_fpclass_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_fpclass_use" >&6; } if test x$glibcxx_cv_func_fpclass_use = x"yes"; then for ac_func in fpclass do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -20466,68 +21015,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -20538,16 +21079,15 @@ done else - echo "$as_me:$LINENO: checking for _fpclass declaration" >&5 -echo $ECHO_N "checking for _fpclass declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for _fpclass declaration" >&5 +echo $ECHO_N "checking for _fpclass declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func__fpclass_use+set} != xset; then if test "${glibcxx_cv_func__fpclass_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -20573,35 +21113,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func__fpclass_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func__fpclass_use=no + glibcxx_cv_func__fpclass_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -20612,17 +21148,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__fpclass_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__fpclass_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__fpclass_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__fpclass_use" >&6; } if test x$glibcxx_cv_func__fpclass_use = x"yes"; then for ac_func in _fpclass do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -20653,68 +21189,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -20731,16 +21259,15 @@ done - echo "$as_me:$LINENO: checking for qfpclass declaration" >&5 -echo $ECHO_N "checking for qfpclass declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for qfpclass declaration" >&5 +echo $ECHO_N "checking for qfpclass declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func_qfpclass_use+set} != xset; then if test "${glibcxx_cv_func_qfpclass_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -20766,35 +21293,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func_qfpclass_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_qfpclass_use=no + glibcxx_cv_func_qfpclass_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -20805,17 +21328,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_qfpclass_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_qfpclass_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_qfpclass_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_qfpclass_use" >&6; } if test x$glibcxx_cv_func_qfpclass_use = x"yes"; then for ac_func in qfpclass do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -20846,68 +21369,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -20918,16 +21433,15 @@ done else - echo "$as_me:$LINENO: checking for _qfpclass declaration" >&5 -echo $ECHO_N "checking for _qfpclass declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for _qfpclass declaration" >&5 +echo $ECHO_N "checking for _qfpclass declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func__qfpclass_use+set} != xset; then if test "${glibcxx_cv_func__qfpclass_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -20953,35 +21467,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func__qfpclass_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func__qfpclass_use=no + glibcxx_cv_func__qfpclass_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -20992,17 +21502,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__qfpclass_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__qfpclass_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__qfpclass_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__qfpclass_use" >&6; } if test x$glibcxx_cv_func__qfpclass_use = x"yes"; then for ac_func in _qfpclass do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -21033,68 +21543,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -21111,16 +21613,15 @@ done - echo "$as_me:$LINENO: checking for hypot declaration" >&5 -echo $ECHO_N "checking for hypot declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for hypot declaration" >&5 +echo $ECHO_N "checking for hypot declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func_hypot_use+set} != xset; then if test "${glibcxx_cv_func_hypot_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -21142,35 +21643,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func_hypot_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_hypot_use=no + glibcxx_cv_func_hypot_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -21181,17 +21678,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_hypot_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_hypot_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_hypot_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_hypot_use" >&6; } if test x$glibcxx_cv_func_hypot_use = x"yes"; then for ac_func in hypot do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -21222,68 +21719,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -21294,16 +21783,15 @@ done else - echo "$as_me:$LINENO: checking for _hypot declaration" >&5 -echo $ECHO_N "checking for _hypot declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for _hypot declaration" >&5 +echo $ECHO_N "checking for _hypot declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func__hypot_use+set} != xset; then if test "${glibcxx_cv_func__hypot_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -21325,35 +21813,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func__hypot_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func__hypot_use=no + glibcxx_cv_func__hypot_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -21364,17 +21848,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__hypot_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__hypot_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__hypot_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__hypot_use" >&6; } if test x$glibcxx_cv_func__hypot_use = x"yes"; then for ac_func in _hypot do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -21405,68 +21889,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -21483,15 +21959,14 @@ done - echo "$as_me:$LINENO: checking for float trig functions" >&5 -echo $ECHO_N "checking for float trig functions... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for float trig functions" >&5 +echo $ECHO_N "checking for float trig functions... $ECHO_C" >&6; } if test "${glibcxx_cv_func_float_trig_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -21513,35 +21988,31 @@ acosf (0); asinf (0); atanf (0); cosf (0); sinf (0); tanf (0); coshf (0); sinhf } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func_float_trig_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_float_trig_use=no + glibcxx_cv_func_float_trig_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -21550,8 +22021,8 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_float_trig_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_float_trig_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_float_trig_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_float_trig_use" >&6; } if test x$glibcxx_cv_func_float_trig_use = x"yes"; then @@ -21565,9 +22036,9 @@ echo "${ECHO_T}$glibcxx_cv_func_float_trig_use" >&6 for ac_func in acosf asinf atanf cosf sinf tanf coshf sinhf tanhf do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -21598,68 +22069,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -21669,15 +22132,14 @@ fi done else - echo "$as_me:$LINENO: checking for _float trig functions" >&5 -echo $ECHO_N "checking for _float trig functions... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for _float trig functions" >&5 +echo $ECHO_N "checking for _float trig functions... $ECHO_C" >&6; } if test "${glibcxx_cv_func__float_trig_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -21699,35 +22161,31 @@ _acosf (0); _asinf (0); _atanf (0); _cosf (0); _sinf (0); _tanf (0); _coshf (0); } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func__float_trig_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func__float_trig_use=no + glibcxx_cv_func__float_trig_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -21736,8 +22194,8 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__float_trig_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__float_trig_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__float_trig_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__float_trig_use" >&6; } if test x$glibcxx_cv_func__float_trig_use = x"yes"; then @@ -21751,9 +22209,9 @@ echo "${ECHO_T}$glibcxx_cv_func__float_trig_use" >&6 for ac_func in _acosf _asinf _atanf _cosf _sinf _tanf _coshf _sinhf _tanhf do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -21784,68 +22242,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -21870,15 +22320,14 @@ done - echo "$as_me:$LINENO: checking for float round functions" >&5 -echo $ECHO_N "checking for float round functions... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for float round functions" >&5 +echo $ECHO_N "checking for float round functions... $ECHO_C" >&6; } if test "${glibcxx_cv_func_float_round_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -21900,35 +22349,31 @@ ceilf (0); floorf (0); } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func_float_round_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_float_round_use=no + glibcxx_cv_func_float_round_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -21937,17 +22382,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_float_round_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_float_round_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_float_round_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_float_round_use" >&6; } if test x$glibcxx_cv_func_float_round_use = x"yes"; then for ac_func in ceilf floorf do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -21978,68 +22423,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -22049,15 +22486,14 @@ fi done else - echo "$as_me:$LINENO: checking for _float round functions" >&5 -echo $ECHO_N "checking for _float round functions... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for _float round functions" >&5 +echo $ECHO_N "checking for _float round functions... $ECHO_C" >&6; } if test "${glibcxx_cv_func__float_round_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -22079,35 +22515,31 @@ _ceilf (0); _floorf (0); } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func__float_round_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func__float_round_use=no + glibcxx_cv_func__float_round_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -22116,17 +22548,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__float_round_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__float_round_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__float_round_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__float_round_use" >&6; } if test x$glibcxx_cv_func__float_round_use = x"yes"; then for ac_func in _ceilf _floorf do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -22157,68 +22589,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -22237,16 +22661,15 @@ done - echo "$as_me:$LINENO: checking for expf declaration" >&5 -echo $ECHO_N "checking for expf declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for expf declaration" >&5 +echo $ECHO_N "checking for expf declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func_expf_use+set} != xset; then if test "${glibcxx_cv_func_expf_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -22272,35 +22695,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func_expf_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_expf_use=no + glibcxx_cv_func_expf_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -22311,17 +22730,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_expf_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_expf_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_expf_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_expf_use" >&6; } if test x$glibcxx_cv_func_expf_use = x"yes"; then for ac_func in expf do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -22352,68 +22771,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -22424,16 +22835,15 @@ done else - echo "$as_me:$LINENO: checking for _expf declaration" >&5 -echo $ECHO_N "checking for _expf declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for _expf declaration" >&5 +echo $ECHO_N "checking for _expf declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func__expf_use+set} != xset; then if test "${glibcxx_cv_func__expf_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -22459,35 +22869,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func__expf_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func__expf_use=no + glibcxx_cv_func__expf_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -22498,17 +22904,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__expf_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__expf_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__expf_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__expf_use" >&6; } if test x$glibcxx_cv_func__expf_use = x"yes"; then for ac_func in _expf do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -22539,68 +22945,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -22617,16 +23015,15 @@ done - echo "$as_me:$LINENO: checking for isnanf declaration" >&5 -echo $ECHO_N "checking for isnanf declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for isnanf declaration" >&5 +echo $ECHO_N "checking for isnanf declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func_isnanf_use+set} != xset; then if test "${glibcxx_cv_func_isnanf_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -22652,35 +23049,205 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + glibcxx_cv_func_isnanf_use=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + glibcxx_cv_func_isnanf_use=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +fi + + fi + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_isnanf_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_isnanf_use" >&6; } + + if test x$glibcxx_cv_func_isnanf_use = x"yes"; then + +for ac_func in isnanf +do +as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test x$gcc_no_link = xyes; then + { { echo "$as_me:$LINENO: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&5 +echo "$as_me: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&2;} + { (exit 1); exit 1; }; } +fi +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define $ac_func to an innocuous variant, in case declares $ac_func. + For example, HP-UX 11i declares gettimeofday. */ +#define $ac_func innocuous_$ac_func + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $ac_func (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $ac_func + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char $ac_func (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_$ac_func || defined __stub___$ac_func +choke me +#endif + +int +main () +{ +return $ac_func (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then + eval "$as_ac_var=yes" +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + eval "$as_ac_var=no" +fi + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +fi +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } +if test `eval echo '${'$as_ac_var'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +fi +done + + else + + { echo "$as_me:$LINENO: checking for _isnanf declaration" >&5 +echo $ECHO_N "checking for _isnanf declaration... $ECHO_C" >&6; } + if test x${glibcxx_cv_func__isnanf_use+set} != xset; then + if test "${glibcxx_cv_func__isnanf_use+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + + ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include + #ifdef HAVE_IEEEFP_H + #include + #endif + +int +main () +{ + _isnanf(0); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - glibcxx_cv_func_isnanf_use=yes + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + glibcxx_cv_func__isnanf_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_isnanf_use=no + glibcxx_cv_func__isnanf_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -22691,17 +23258,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_isnanf_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_isnanf_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__isnanf_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__isnanf_use" >&6; } - if test x$glibcxx_cv_func_isnanf_use = x"yes"; then + if test x$glibcxx_cv_func__isnanf_use = x"yes"; then -for ac_func in isnanf +for ac_func in _isnanf do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -22732,255 +23299,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ -#ifdef __cplusplus -extern "C" -{ -#endif -/* We use char because int might match the return type of a gcc2 +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ -char $ac_func (); -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) -choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} -#endif - -int -main () -{ -return f != $ac_func; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - eval "$as_ac_var=yes" -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -eval "$as_ac_var=no" -fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 -if test `eval echo '${'$as_ac_var'}'` = yes; then - cat >>confdefs.h <<_ACEOF -#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 -_ACEOF - -fi -done - - else - - echo "$as_me:$LINENO: checking for _isnanf declaration" >&5 -echo $ECHO_N "checking for _isnanf declaration... $ECHO_C" >&6 - if test x${glibcxx_cv_func__isnanf_use+set} != xset; then - if test "${glibcxx_cv_func__isnanf_use+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - - - - ac_ext=cc -ac_cpp='$CXXCPP $CPPFLAGS' -ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_cxx_compiler_gnu - - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include - #ifdef HAVE_IEEEFP_H - #include - #endif - -int -main () -{ - _isnanf(0); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - glibcxx_cv_func__isnanf_use=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -glibcxx_cv_func__isnanf_use=no -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext - ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - - -fi - - fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__isnanf_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__isnanf_use" >&6 - - if test x$glibcxx_cv_func__isnanf_use = x"yes"; then - -for ac_func in _isnanf -do -as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test x$gcc_no_link = xyes; then - { { echo "$as_me:$LINENO: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&5 -echo "$as_me: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&2;} - { (exit 1); exit 1; }; } -fi -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -/* Define $ac_func to an innocuous variant, in case declares $ac_func. - For example, HP-UX 11i declares gettimeofday. */ -#define $ac_func innocuous_$ac_func - -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char $ac_func (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ - -#ifdef __STDC__ -# include -#else -# include -#endif - -#undef $ac_func - -/* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -22997,16 +23369,15 @@ done - echo "$as_me:$LINENO: checking for isinff declaration" >&5 -echo $ECHO_N "checking for isinff declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for isinff declaration" >&5 +echo $ECHO_N "checking for isinff declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func_isinff_use+set} != xset; then if test "${glibcxx_cv_func_isinff_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -23032,35 +23403,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func_isinff_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_isinff_use=no + glibcxx_cv_func_isinff_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -23071,17 +23438,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_isinff_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_isinff_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_isinff_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_isinff_use" >&6; } if test x$glibcxx_cv_func_isinff_use = x"yes"; then for ac_func in isinff do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -23112,68 +23479,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -23184,16 +23543,15 @@ done else - echo "$as_me:$LINENO: checking for _isinff declaration" >&5 -echo $ECHO_N "checking for _isinff declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for _isinff declaration" >&5 +echo $ECHO_N "checking for _isinff declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func__isinff_use+set} != xset; then if test "${glibcxx_cv_func__isinff_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -23219,35 +23577,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func__isinff_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func__isinff_use=no + glibcxx_cv_func__isinff_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -23258,17 +23612,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__isinff_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__isinff_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__isinff_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__isinff_use" >&6; } if test x$glibcxx_cv_func__isinff_use = x"yes"; then for ac_func in _isinff do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -23299,68 +23653,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -23377,16 +23723,15 @@ done - echo "$as_me:$LINENO: checking for atan2f declaration" >&5 -echo $ECHO_N "checking for atan2f declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for atan2f declaration" >&5 +echo $ECHO_N "checking for atan2f declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func_atan2f_use+set} != xset; then if test "${glibcxx_cv_func_atan2f_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -23408,35 +23753,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func_atan2f_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_atan2f_use=no + glibcxx_cv_func_atan2f_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -23447,17 +23788,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_atan2f_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_atan2f_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_atan2f_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_atan2f_use" >&6; } if test x$glibcxx_cv_func_atan2f_use = x"yes"; then for ac_func in atan2f do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -23488,68 +23829,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -23560,16 +23893,15 @@ done else - echo "$as_me:$LINENO: checking for _atan2f declaration" >&5 -echo $ECHO_N "checking for _atan2f declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for _atan2f declaration" >&5 +echo $ECHO_N "checking for _atan2f declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func__atan2f_use+set} != xset; then if test "${glibcxx_cv_func__atan2f_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -23591,35 +23923,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func__atan2f_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func__atan2f_use=no + glibcxx_cv_func__atan2f_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -23630,17 +23958,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__atan2f_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__atan2f_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__atan2f_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__atan2f_use" >&6; } if test x$glibcxx_cv_func__atan2f_use = x"yes"; then for ac_func in _atan2f do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -23671,68 +23999,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -23749,16 +24069,15 @@ done - echo "$as_me:$LINENO: checking for fabsf declaration" >&5 -echo $ECHO_N "checking for fabsf declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for fabsf declaration" >&5 +echo $ECHO_N "checking for fabsf declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func_fabsf_use+set} != xset; then if test "${glibcxx_cv_func_fabsf_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -23784,35 +24103,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func_fabsf_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_fabsf_use=no + glibcxx_cv_func_fabsf_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -23823,17 +24138,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_fabsf_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_fabsf_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_fabsf_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_fabsf_use" >&6; } if test x$glibcxx_cv_func_fabsf_use = x"yes"; then for ac_func in fabsf do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -23864,68 +24179,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -23936,16 +24243,15 @@ done else - echo "$as_me:$LINENO: checking for _fabsf declaration" >&5 -echo $ECHO_N "checking for _fabsf declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for _fabsf declaration" >&5 +echo $ECHO_N "checking for _fabsf declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func__fabsf_use+set} != xset; then if test "${glibcxx_cv_func__fabsf_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -23971,35 +24277,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func__fabsf_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func__fabsf_use=no + glibcxx_cv_func__fabsf_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -24010,17 +24312,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__fabsf_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__fabsf_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__fabsf_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__fabsf_use" >&6; } if test x$glibcxx_cv_func__fabsf_use = x"yes"; then for ac_func in _fabsf do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -24051,68 +24353,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -24129,16 +24423,15 @@ done - echo "$as_me:$LINENO: checking for fmodf declaration" >&5 -echo $ECHO_N "checking for fmodf declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for fmodf declaration" >&5 +echo $ECHO_N "checking for fmodf declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func_fmodf_use+set} != xset; then if test "${glibcxx_cv_func_fmodf_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -24160,35 +24453,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func_fmodf_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_fmodf_use=no + glibcxx_cv_func_fmodf_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -24199,17 +24488,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_fmodf_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_fmodf_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_fmodf_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_fmodf_use" >&6; } if test x$glibcxx_cv_func_fmodf_use = x"yes"; then for ac_func in fmodf do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -24240,68 +24529,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -24312,16 +24593,15 @@ done else - echo "$as_me:$LINENO: checking for _fmodf declaration" >&5 -echo $ECHO_N "checking for _fmodf declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for _fmodf declaration" >&5 +echo $ECHO_N "checking for _fmodf declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func__fmodf_use+set} != xset; then if test "${glibcxx_cv_func__fmodf_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -24343,35 +24623,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func__fmodf_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func__fmodf_use=no + glibcxx_cv_func__fmodf_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -24382,17 +24658,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__fmodf_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__fmodf_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__fmodf_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__fmodf_use" >&6; } if test x$glibcxx_cv_func__fmodf_use = x"yes"; then for ac_func in _fmodf do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -24423,68 +24699,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -24501,16 +24769,15 @@ done - echo "$as_me:$LINENO: checking for frexpf declaration" >&5 -echo $ECHO_N "checking for frexpf declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for frexpf declaration" >&5 +echo $ECHO_N "checking for frexpf declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func_frexpf_use+set} != xset; then if test "${glibcxx_cv_func_frexpf_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -24532,35 +24799,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func_frexpf_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_frexpf_use=no + glibcxx_cv_func_frexpf_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -24571,17 +24834,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_frexpf_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_frexpf_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_frexpf_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_frexpf_use" >&6; } if test x$glibcxx_cv_func_frexpf_use = x"yes"; then for ac_func in frexpf do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -24612,68 +24875,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -24684,16 +24939,15 @@ done else - echo "$as_me:$LINENO: checking for _frexpf declaration" >&5 -echo $ECHO_N "checking for _frexpf declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for _frexpf declaration" >&5 +echo $ECHO_N "checking for _frexpf declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func__frexpf_use+set} != xset; then if test "${glibcxx_cv_func__frexpf_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -24715,35 +24969,207 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + glibcxx_cv_func__frexpf_use=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + glibcxx_cv_func__frexpf_use=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +fi + + fi + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__frexpf_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__frexpf_use" >&6; } + + if test x$glibcxx_cv_func__frexpf_use = x"yes"; then + +for ac_func in _frexpf +do +as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test x$gcc_no_link = xyes; then + { { echo "$as_me:$LINENO: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&5 +echo "$as_me: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&2;} + { (exit 1); exit 1; }; } +fi +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define $ac_func to an innocuous variant, in case declares $ac_func. + For example, HP-UX 11i declares gettimeofday. */ +#define $ac_func innocuous_$ac_func + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $ac_func (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $ac_func + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char $ac_func (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_$ac_func || defined __stub___$ac_func +choke me +#endif + +int +main () +{ +return $ac_func (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then + eval "$as_ac_var=yes" +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + eval "$as_ac_var=no" +fi + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +fi +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } +if test `eval echo '${'$as_ac_var'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +fi +done + + fi + fi + + + + + + + { echo "$as_me:$LINENO: checking for hypotf declaration" >&5 +echo $ECHO_N "checking for hypotf declaration... $ECHO_C" >&6; } + if test x${glibcxx_cv_func_hypotf_use+set} != xset; then + if test "${glibcxx_cv_func_hypotf_use+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + + ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +int +main () +{ + hypotf(0, 0); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - glibcxx_cv_func__frexpf_use=yes + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + glibcxx_cv_func_hypotf_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func__frexpf_use=no + glibcxx_cv_func_hypotf_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -24754,17 +25180,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__frexpf_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__frexpf_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_hypotf_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_hypotf_use" >&6; } - if test x$glibcxx_cv_func__frexpf_use = x"yes"; then + if test x$glibcxx_cv_func_hypotf_use = x"yes"; then -for ac_func in _frexpf +for ac_func in hypotf do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -24795,257 +25221,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ -#ifdef __cplusplus -extern "C" -{ -#endif -/* We use char because int might match the return type of a gcc2 +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ -char $ac_func (); -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) -choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} -#endif - -int -main () -{ -return f != $ac_func; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - eval "$as_ac_var=yes" -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -eval "$as_ac_var=no" -fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 -if test `eval echo '${'$as_ac_var'}'` = yes; then - cat >>confdefs.h <<_ACEOF -#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 -_ACEOF - -fi -done - - fi - fi - - - - - - - echo "$as_me:$LINENO: checking for hypotf declaration" >&5 -echo $ECHO_N "checking for hypotf declaration... $ECHO_C" >&6 - if test x${glibcxx_cv_func_hypotf_use+set} != xset; then - if test "${glibcxx_cv_func_hypotf_use+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - - - - ac_ext=cc -ac_cpp='$CXXCPP $CPPFLAGS' -ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_cxx_compiler_gnu - - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include -int -main () -{ - hypotf(0, 0); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - glibcxx_cv_func_hypotf_use=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -glibcxx_cv_func_hypotf_use=no -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext - ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - - -fi - - fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_hypotf_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_hypotf_use" >&6 - - if test x$glibcxx_cv_func_hypotf_use = x"yes"; then - -for ac_func in hypotf -do -as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test x$gcc_no_link = xyes; then - { { echo "$as_me:$LINENO: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&5 -echo "$as_me: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&2;} - { (exit 1); exit 1; }; } -fi -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -/* Define $ac_func to an innocuous variant, in case declares $ac_func. - For example, HP-UX 11i declares gettimeofday. */ -#define $ac_func innocuous_$ac_func - -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char $ac_func (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ - -#ifdef __STDC__ -# include -#else -# include -#endif - -#undef $ac_func - -/* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -25056,16 +25285,15 @@ done else - echo "$as_me:$LINENO: checking for _hypotf declaration" >&5 -echo $ECHO_N "checking for _hypotf declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for _hypotf declaration" >&5 +echo $ECHO_N "checking for _hypotf declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func__hypotf_use+set} != xset; then if test "${glibcxx_cv_func__hypotf_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -25087,35 +25315,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func__hypotf_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func__hypotf_use=no + glibcxx_cv_func__hypotf_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -25126,17 +25350,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__hypotf_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__hypotf_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__hypotf_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__hypotf_use" >&6; } if test x$glibcxx_cv_func__hypotf_use = x"yes"; then for ac_func in _hypotf do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -25167,68 +25391,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -25245,16 +25461,15 @@ done - echo "$as_me:$LINENO: checking for ldexpf declaration" >&5 -echo $ECHO_N "checking for ldexpf declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for ldexpf declaration" >&5 +echo $ECHO_N "checking for ldexpf declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func_ldexpf_use+set} != xset; then if test "${glibcxx_cv_func_ldexpf_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -25276,35 +25491,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func_ldexpf_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_ldexpf_use=no + glibcxx_cv_func_ldexpf_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -25315,17 +25526,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_ldexpf_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_ldexpf_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_ldexpf_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_ldexpf_use" >&6; } if test x$glibcxx_cv_func_ldexpf_use = x"yes"; then for ac_func in ldexpf do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -25356,68 +25567,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -25428,16 +25631,15 @@ done else - echo "$as_me:$LINENO: checking for _ldexpf declaration" >&5 -echo $ECHO_N "checking for _ldexpf declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for _ldexpf declaration" >&5 +echo $ECHO_N "checking for _ldexpf declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func__ldexpf_use+set} != xset; then if test "${glibcxx_cv_func__ldexpf_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -25459,35 +25661,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func__ldexpf_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func__ldexpf_use=no + glibcxx_cv_func__ldexpf_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -25498,17 +25696,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__ldexpf_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__ldexpf_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__ldexpf_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__ldexpf_use" >&6; } if test x$glibcxx_cv_func__ldexpf_use = x"yes"; then for ac_func in _ldexpf do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -25539,68 +25737,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -25617,16 +25807,15 @@ done - echo "$as_me:$LINENO: checking for logf declaration" >&5 -echo $ECHO_N "checking for logf declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for logf declaration" >&5 +echo $ECHO_N "checking for logf declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func_logf_use+set} != xset; then if test "${glibcxx_cv_func_logf_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -25652,35 +25841,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func_logf_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_logf_use=no + glibcxx_cv_func_logf_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -25691,17 +25876,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_logf_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_logf_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_logf_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_logf_use" >&6; } if test x$glibcxx_cv_func_logf_use = x"yes"; then for ac_func in logf do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -25732,68 +25917,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -25804,16 +25981,15 @@ done else - echo "$as_me:$LINENO: checking for _logf declaration" >&5 -echo $ECHO_N "checking for _logf declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for _logf declaration" >&5 +echo $ECHO_N "checking for _logf declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func__logf_use+set} != xset; then if test "${glibcxx_cv_func__logf_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -25839,35 +26015,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func__logf_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func__logf_use=no + glibcxx_cv_func__logf_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -25878,17 +26050,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__logf_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__logf_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__logf_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__logf_use" >&6; } if test x$glibcxx_cv_func__logf_use = x"yes"; then for ac_func in _logf do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -25919,68 +26091,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -25997,16 +26161,15 @@ done - echo "$as_me:$LINENO: checking for log10f declaration" >&5 -echo $ECHO_N "checking for log10f declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for log10f declaration" >&5 +echo $ECHO_N "checking for log10f declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func_log10f_use+set} != xset; then if test "${glibcxx_cv_func_log10f_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -26032,35 +26195,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func_log10f_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_log10f_use=no + glibcxx_cv_func_log10f_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -26071,17 +26230,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_log10f_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_log10f_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_log10f_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_log10f_use" >&6; } if test x$glibcxx_cv_func_log10f_use = x"yes"; then for ac_func in log10f do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -26112,68 +26271,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -26184,16 +26335,15 @@ done else - echo "$as_me:$LINENO: checking for _log10f declaration" >&5 -echo $ECHO_N "checking for _log10f declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for _log10f declaration" >&5 +echo $ECHO_N "checking for _log10f declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func__log10f_use+set} != xset; then if test "${glibcxx_cv_func__log10f_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -26219,35 +26369,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func__log10f_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func__log10f_use=no + glibcxx_cv_func__log10f_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -26258,17 +26404,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__log10f_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__log10f_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__log10f_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__log10f_use" >&6; } if test x$glibcxx_cv_func__log10f_use = x"yes"; then for ac_func in _log10f do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -26299,68 +26445,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -26377,16 +26515,15 @@ done - echo "$as_me:$LINENO: checking for modff declaration" >&5 -echo $ECHO_N "checking for modff declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for modff declaration" >&5 +echo $ECHO_N "checking for modff declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func_modff_use+set} != xset; then if test "${glibcxx_cv_func_modff_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -26408,35 +26545,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func_modff_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_modff_use=no + glibcxx_cv_func_modff_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -26447,17 +26580,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_modff_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_modff_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_modff_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_modff_use" >&6; } if test x$glibcxx_cv_func_modff_use = x"yes"; then for ac_func in modff do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -26488,68 +26621,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -26560,16 +26685,15 @@ done else - echo "$as_me:$LINENO: checking for _modff declaration" >&5 -echo $ECHO_N "checking for _modff declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for _modff declaration" >&5 +echo $ECHO_N "checking for _modff declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func__modff_use+set} != xset; then if test "${glibcxx_cv_func__modff_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -26591,35 +26715,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func__modff_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func__modff_use=no + glibcxx_cv_func__modff_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -26630,17 +26750,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__modff_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__modff_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__modff_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__modff_use" >&6; } if test x$glibcxx_cv_func__modff_use = x"yes"; then for ac_func in _modff do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -26671,68 +26791,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -26749,16 +26861,15 @@ done - echo "$as_me:$LINENO: checking for modf declaration" >&5 -echo $ECHO_N "checking for modf declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for modf declaration" >&5 +echo $ECHO_N "checking for modf declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func_modf_use+set} != xset; then if test "${glibcxx_cv_func_modf_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -26780,35 +26891,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func_modf_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_modf_use=no + glibcxx_cv_func_modf_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -26819,17 +26926,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_modf_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_modf_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_modf_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_modf_use" >&6; } if test x$glibcxx_cv_func_modf_use = x"yes"; then for ac_func in modf do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -26860,68 +26967,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -26932,16 +27031,15 @@ done else - echo "$as_me:$LINENO: checking for _modf declaration" >&5 -echo $ECHO_N "checking for _modf declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for _modf declaration" >&5 +echo $ECHO_N "checking for _modf declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func__modf_use+set} != xset; then if test "${glibcxx_cv_func__modf_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -26963,35 +27061,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func__modf_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func__modf_use=no + glibcxx_cv_func__modf_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -27002,17 +27096,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__modf_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__modf_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__modf_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__modf_use" >&6; } if test x$glibcxx_cv_func__modf_use = x"yes"; then for ac_func in _modf do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -27043,68 +27137,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -27121,16 +27207,15 @@ done - echo "$as_me:$LINENO: checking for powf declaration" >&5 -echo $ECHO_N "checking for powf declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for powf declaration" >&5 +echo $ECHO_N "checking for powf declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func_powf_use+set} != xset; then if test "${glibcxx_cv_func_powf_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -27152,35 +27237,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func_powf_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_powf_use=no + glibcxx_cv_func_powf_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -27191,17 +27272,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_powf_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_powf_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_powf_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_powf_use" >&6; } if test x$glibcxx_cv_func_powf_use = x"yes"; then for ac_func in powf do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -27232,68 +27313,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -27304,16 +27377,15 @@ done else - echo "$as_me:$LINENO: checking for _powf declaration" >&5 -echo $ECHO_N "checking for _powf declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for _powf declaration" >&5 +echo $ECHO_N "checking for _powf declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func__powf_use+set} != xset; then if test "${glibcxx_cv_func__powf_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -27335,35 +27407,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func__powf_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func__powf_use=no + glibcxx_cv_func__powf_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -27374,17 +27442,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__powf_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__powf_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__powf_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__powf_use" >&6; } if test x$glibcxx_cv_func__powf_use = x"yes"; then for ac_func in _powf do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -27415,68 +27483,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -27493,16 +27553,15 @@ done - echo "$as_me:$LINENO: checking for sqrtf declaration" >&5 -echo $ECHO_N "checking for sqrtf declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for sqrtf declaration" >&5 +echo $ECHO_N "checking for sqrtf declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func_sqrtf_use+set} != xset; then if test "${glibcxx_cv_func_sqrtf_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -27528,35 +27587,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func_sqrtf_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_sqrtf_use=no + glibcxx_cv_func_sqrtf_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -27567,17 +27622,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_sqrtf_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_sqrtf_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_sqrtf_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_sqrtf_use" >&6; } if test x$glibcxx_cv_func_sqrtf_use = x"yes"; then for ac_func in sqrtf do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -27608,68 +27663,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -27680,16 +27727,15 @@ done else - echo "$as_me:$LINENO: checking for _sqrtf declaration" >&5 -echo $ECHO_N "checking for _sqrtf declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for _sqrtf declaration" >&5 +echo $ECHO_N "checking for _sqrtf declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func__sqrtf_use+set} != xset; then if test "${glibcxx_cv_func__sqrtf_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -27715,35 +27761,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func__sqrtf_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func__sqrtf_use=no + glibcxx_cv_func__sqrtf_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -27754,17 +27796,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__sqrtf_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__sqrtf_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__sqrtf_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__sqrtf_use" >&6; } if test x$glibcxx_cv_func__sqrtf_use = x"yes"; then for ac_func in _sqrtf do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -27795,68 +27837,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -27873,16 +27907,15 @@ done - echo "$as_me:$LINENO: checking for sincosf declaration" >&5 -echo $ECHO_N "checking for sincosf declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for sincosf declaration" >&5 +echo $ECHO_N "checking for sincosf declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func_sincosf_use+set} != xset; then if test "${glibcxx_cv_func_sincosf_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -27904,35 +27937,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func_sincosf_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_sincosf_use=no + glibcxx_cv_func_sincosf_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -27943,17 +27972,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_sincosf_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_sincosf_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_sincosf_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_sincosf_use" >&6; } if test x$glibcxx_cv_func_sincosf_use = x"yes"; then for ac_func in sincosf do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -27984,68 +28013,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -28056,16 +28077,15 @@ done else - echo "$as_me:$LINENO: checking for _sincosf declaration" >&5 -echo $ECHO_N "checking for _sincosf declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for _sincosf declaration" >&5 +echo $ECHO_N "checking for _sincosf declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func__sincosf_use+set} != xset; then if test "${glibcxx_cv_func__sincosf_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -28087,35 +28107,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func__sincosf_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func__sincosf_use=no + glibcxx_cv_func__sincosf_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -28126,17 +28142,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__sincosf_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__sincosf_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__sincosf_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__sincosf_use" >&6; } if test x$glibcxx_cv_func__sincosf_use = x"yes"; then for ac_func in _sincosf do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -28167,68 +28183,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -28245,16 +28253,15 @@ done - echo "$as_me:$LINENO: checking for finitef declaration" >&5 -echo $ECHO_N "checking for finitef declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for finitef declaration" >&5 +echo $ECHO_N "checking for finitef declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func_finitef_use+set} != xset; then if test "${glibcxx_cv_func_finitef_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -28280,35 +28287,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func_finitef_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_finitef_use=no + glibcxx_cv_func_finitef_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -28319,17 +28322,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_finitef_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_finitef_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_finitef_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_finitef_use" >&6; } if test x$glibcxx_cv_func_finitef_use = x"yes"; then for ac_func in finitef do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -28360,68 +28363,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -28432,16 +28427,15 @@ done else - echo "$as_me:$LINENO: checking for _finitef declaration" >&5 -echo $ECHO_N "checking for _finitef declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for _finitef declaration" >&5 +echo $ECHO_N "checking for _finitef declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func__finitef_use+set} != xset; then if test "${glibcxx_cv_func__finitef_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -28467,35 +28461,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func__finitef_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func__finitef_use=no + glibcxx_cv_func__finitef_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -28506,17 +28496,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__finitef_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__finitef_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__finitef_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__finitef_use" >&6; } if test x$glibcxx_cv_func__finitef_use = x"yes"; then for ac_func in _finitef do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -28547,68 +28537,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -28625,15 +28607,14 @@ done - echo "$as_me:$LINENO: checking for long double trig functions" >&5 -echo $ECHO_N "checking for long double trig functions... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for long double trig functions" >&5 +echo $ECHO_N "checking for long double trig functions... $ECHO_C" >&6; } if test "${glibcxx_cv_func_long_double_trig_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -28655,35 +28636,31 @@ acosl (0); asinl (0); atanl (0); cosl (0); sinl (0); tanl (0); coshl (0); sinhl } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func_long_double_trig_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_long_double_trig_use=no + glibcxx_cv_func_long_double_trig_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -28692,8 +28669,8 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_long_double_trig_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_long_double_trig_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_long_double_trig_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_long_double_trig_use" >&6; } if test x$glibcxx_cv_func_long_double_trig_use = x"yes"; then @@ -28707,9 +28684,9 @@ echo "${ECHO_T}$glibcxx_cv_func_long_double_trig_use" >&6 for ac_func in acosl asinl atanl cosl sinl tanl coshl sinhl tanhl do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -28740,68 +28717,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -28811,15 +28780,14 @@ fi done else - echo "$as_me:$LINENO: checking for _long double trig functions" >&5 -echo $ECHO_N "checking for _long double trig functions... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for _long double trig functions" >&5 +echo $ECHO_N "checking for _long double trig functions... $ECHO_C" >&6; } if test "${glibcxx_cv_func__long_double_trig_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -28841,35 +28809,31 @@ _acosl (0); _asinl (0); _atanl (0); _cosl (0); _sinl (0); _tanl (0); _coshl (0); } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func__long_double_trig_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func__long_double_trig_use=no + glibcxx_cv_func__long_double_trig_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -28878,8 +28842,8 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__long_double_trig_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__long_double_trig_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__long_double_trig_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__long_double_trig_use" >&6; } if test x$glibcxx_cv_func__long_double_trig_use = x"yes"; then @@ -28893,9 +28857,9 @@ echo "${ECHO_T}$glibcxx_cv_func__long_double_trig_use" >&6 for ac_func in _acosl _asinl _atanl _cosl _sinl _tanl _coshl _sinhl _tanhl do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -28926,68 +28890,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -29012,15 +28968,14 @@ done - echo "$as_me:$LINENO: checking for long double round functions" >&5 -echo $ECHO_N "checking for long double round functions... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for long double round functions" >&5 +echo $ECHO_N "checking for long double round functions... $ECHO_C" >&6; } if test "${glibcxx_cv_func_long_double_round_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -29042,35 +28997,31 @@ ceill (0); floorl (0); } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func_long_double_round_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_long_double_round_use=no + glibcxx_cv_func_long_double_round_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -29079,17 +29030,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_long_double_round_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_long_double_round_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_long_double_round_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_long_double_round_use" >&6; } if test x$glibcxx_cv_func_long_double_round_use = x"yes"; then for ac_func in ceill floorl do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -29120,68 +29071,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -29191,15 +29134,14 @@ fi done else - echo "$as_me:$LINENO: checking for _long double round functions" >&5 -echo $ECHO_N "checking for _long double round functions... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for _long double round functions" >&5 +echo $ECHO_N "checking for _long double round functions... $ECHO_C" >&6; } if test "${glibcxx_cv_func__long_double_round_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -29221,35 +29163,31 @@ _ceill (0); _floorl (0); } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func__long_double_round_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func__long_double_round_use=no + glibcxx_cv_func__long_double_round_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -29258,17 +29196,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__long_double_round_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__long_double_round_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__long_double_round_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__long_double_round_use" >&6; } if test x$glibcxx_cv_func__long_double_round_use = x"yes"; then for ac_func in _ceill _floorl do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -29299,68 +29237,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -29379,16 +29309,15 @@ done - echo "$as_me:$LINENO: checking for isnanl declaration" >&5 -echo $ECHO_N "checking for isnanl declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for isnanl declaration" >&5 +echo $ECHO_N "checking for isnanl declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func_isnanl_use+set} != xset; then if test "${glibcxx_cv_func_isnanl_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -29414,35 +29343,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func_isnanl_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_isnanl_use=no + glibcxx_cv_func_isnanl_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -29453,17 +29378,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_isnanl_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_isnanl_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_isnanl_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_isnanl_use" >&6; } if test x$glibcxx_cv_func_isnanl_use = x"yes"; then for ac_func in isnanl do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -29494,68 +29419,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -29566,16 +29483,15 @@ done else - echo "$as_me:$LINENO: checking for _isnanl declaration" >&5 -echo $ECHO_N "checking for _isnanl declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for _isnanl declaration" >&5 +echo $ECHO_N "checking for _isnanl declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func__isnanl_use+set} != xset; then if test "${glibcxx_cv_func__isnanl_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -29601,35 +29517,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func__isnanl_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func__isnanl_use=no + glibcxx_cv_func__isnanl_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -29640,17 +29552,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__isnanl_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__isnanl_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__isnanl_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__isnanl_use" >&6; } if test x$glibcxx_cv_func__isnanl_use = x"yes"; then for ac_func in _isnanl do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -29681,68 +29593,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -29759,16 +29663,15 @@ done - echo "$as_me:$LINENO: checking for isinfl declaration" >&5 -echo $ECHO_N "checking for isinfl declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for isinfl declaration" >&5 +echo $ECHO_N "checking for isinfl declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func_isinfl_use+set} != xset; then if test "${glibcxx_cv_func_isinfl_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -29794,35 +29697,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func_isinfl_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_isinfl_use=no + glibcxx_cv_func_isinfl_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -29833,17 +29732,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_isinfl_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_isinfl_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_isinfl_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_isinfl_use" >&6; } if test x$glibcxx_cv_func_isinfl_use = x"yes"; then for ac_func in isinfl do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -29874,68 +29773,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -29946,16 +29837,15 @@ done else - echo "$as_me:$LINENO: checking for _isinfl declaration" >&5 -echo $ECHO_N "checking for _isinfl declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for _isinfl declaration" >&5 +echo $ECHO_N "checking for _isinfl declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func__isinfl_use+set} != xset; then if test "${glibcxx_cv_func__isinfl_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -29981,35 +29871,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func__isinfl_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func__isinfl_use=no + glibcxx_cv_func__isinfl_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -30020,17 +29906,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__isinfl_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__isinfl_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__isinfl_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__isinfl_use" >&6; } if test x$glibcxx_cv_func__isinfl_use = x"yes"; then for ac_func in _isinfl do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -30061,68 +29947,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -30139,16 +30017,15 @@ done - echo "$as_me:$LINENO: checking for copysignl declaration" >&5 -echo $ECHO_N "checking for copysignl declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for copysignl declaration" >&5 +echo $ECHO_N "checking for copysignl declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func_copysignl_use+set} != xset; then if test "${glibcxx_cv_func_copysignl_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -30170,35 +30047,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func_copysignl_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_copysignl_use=no + glibcxx_cv_func_copysignl_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -30209,17 +30082,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_copysignl_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_copysignl_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_copysignl_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_copysignl_use" >&6; } if test x$glibcxx_cv_func_copysignl_use = x"yes"; then for ac_func in copysignl do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -30250,68 +30123,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -30322,16 +30187,15 @@ done else - echo "$as_me:$LINENO: checking for _copysignl declaration" >&5 -echo $ECHO_N "checking for _copysignl declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for _copysignl declaration" >&5 +echo $ECHO_N "checking for _copysignl declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func__copysignl_use+set} != xset; then if test "${glibcxx_cv_func__copysignl_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -30353,35 +30217,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func__copysignl_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func__copysignl_use=no + glibcxx_cv_func__copysignl_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -30392,17 +30252,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__copysignl_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__copysignl_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__copysignl_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__copysignl_use" >&6; } if test x$glibcxx_cv_func__copysignl_use = x"yes"; then for ac_func in _copysignl do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -30433,68 +30293,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -30511,16 +30363,15 @@ done - echo "$as_me:$LINENO: checking for atan2l declaration" >&5 -echo $ECHO_N "checking for atan2l declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for atan2l declaration" >&5 +echo $ECHO_N "checking for atan2l declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func_atan2l_use+set} != xset; then if test "${glibcxx_cv_func_atan2l_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -30542,35 +30393,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func_atan2l_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_atan2l_use=no + glibcxx_cv_func_atan2l_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -30581,17 +30428,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_atan2l_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_atan2l_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_atan2l_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_atan2l_use" >&6; } if test x$glibcxx_cv_func_atan2l_use = x"yes"; then for ac_func in atan2l do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -30622,68 +30469,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -30694,16 +30533,15 @@ done else - echo "$as_me:$LINENO: checking for _atan2l declaration" >&5 -echo $ECHO_N "checking for _atan2l declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for _atan2l declaration" >&5 +echo $ECHO_N "checking for _atan2l declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func__atan2l_use+set} != xset; then if test "${glibcxx_cv_func__atan2l_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -30725,35 +30563,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func__atan2l_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func__atan2l_use=no + glibcxx_cv_func__atan2l_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -30764,17 +30598,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__atan2l_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__atan2l_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__atan2l_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__atan2l_use" >&6; } if test x$glibcxx_cv_func__atan2l_use = x"yes"; then for ac_func in _atan2l do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -30805,68 +30639,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -30883,16 +30709,15 @@ done - echo "$as_me:$LINENO: checking for expl declaration" >&5 -echo $ECHO_N "checking for expl declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for expl declaration" >&5 +echo $ECHO_N "checking for expl declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func_expl_use+set} != xset; then if test "${glibcxx_cv_func_expl_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -30918,35 +30743,205 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + glibcxx_cv_func_expl_use=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + glibcxx_cv_func_expl_use=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +fi + + fi + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_expl_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_expl_use" >&6; } + + if test x$glibcxx_cv_func_expl_use = x"yes"; then + +for ac_func in expl +do +as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test x$gcc_no_link = xyes; then + { { echo "$as_me:$LINENO: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&5 +echo "$as_me: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&2;} + { (exit 1); exit 1; }; } +fi +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define $ac_func to an innocuous variant, in case declares $ac_func. + For example, HP-UX 11i declares gettimeofday. */ +#define $ac_func innocuous_$ac_func + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $ac_func (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $ac_func + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char $ac_func (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_$ac_func || defined __stub___$ac_func +choke me +#endif + +int +main () +{ +return $ac_func (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then + eval "$as_ac_var=yes" +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + eval "$as_ac_var=no" +fi + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +fi +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } +if test `eval echo '${'$as_ac_var'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +fi +done + + else + + { echo "$as_me:$LINENO: checking for _expl declaration" >&5 +echo $ECHO_N "checking for _expl declaration... $ECHO_C" >&6; } + if test x${glibcxx_cv_func__expl_use+set} != xset; then + if test "${glibcxx_cv_func__expl_use+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + + ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include + #ifdef HAVE_IEEEFP_H + #include + #endif + +int +main () +{ + _expl(0); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - glibcxx_cv_func_expl_use=yes + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + glibcxx_cv_func__expl_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_expl_use=no + glibcxx_cv_func__expl_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -30957,17 +30952,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_expl_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_expl_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__expl_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__expl_use" >&6; } - if test x$glibcxx_cv_func_expl_use = x"yes"; then + if test x$glibcxx_cv_func__expl_use = x"yes"; then -for ac_func in expl +for ac_func in _expl do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -30998,255 +30993,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ -#ifdef __cplusplus -extern "C" -{ -#endif -/* We use char because int might match the return type of a gcc2 +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ -char $ac_func (); -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) -choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} -#endif - -int -main () -{ -return f != $ac_func; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - eval "$as_ac_var=yes" -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -eval "$as_ac_var=no" -fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 -if test `eval echo '${'$as_ac_var'}'` = yes; then - cat >>confdefs.h <<_ACEOF -#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 -_ACEOF - -fi -done - - else - - echo "$as_me:$LINENO: checking for _expl declaration" >&5 -echo $ECHO_N "checking for _expl declaration... $ECHO_C" >&6 - if test x${glibcxx_cv_func__expl_use+set} != xset; then - if test "${glibcxx_cv_func__expl_use+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - - - - ac_ext=cc -ac_cpp='$CXXCPP $CPPFLAGS' -ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_cxx_compiler_gnu - - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include - #ifdef HAVE_IEEEFP_H - #include - #endif - -int -main () -{ - _expl(0); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - glibcxx_cv_func__expl_use=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -glibcxx_cv_func__expl_use=no -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext - ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - - -fi - - fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__expl_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__expl_use" >&6 - - if test x$glibcxx_cv_func__expl_use = x"yes"; then - -for ac_func in _expl -do -as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test x$gcc_no_link = xyes; then - { { echo "$as_me:$LINENO: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&5 -echo "$as_me: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&2;} - { (exit 1); exit 1; }; } -fi -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -/* Define $ac_func to an innocuous variant, in case declares $ac_func. - For example, HP-UX 11i declares gettimeofday. */ -#define $ac_func innocuous_$ac_func - -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char $ac_func (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ - -#ifdef __STDC__ -# include -#else -# include -#endif - -#undef $ac_func - -/* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -31263,16 +31063,15 @@ done - echo "$as_me:$LINENO: checking for fabsl declaration" >&5 -echo $ECHO_N "checking for fabsl declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for fabsl declaration" >&5 +echo $ECHO_N "checking for fabsl declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func_fabsl_use+set} != xset; then if test "${glibcxx_cv_func_fabsl_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -31298,35 +31097,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func_fabsl_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_fabsl_use=no + glibcxx_cv_func_fabsl_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -31337,17 +31132,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_fabsl_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_fabsl_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_fabsl_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_fabsl_use" >&6; } if test x$glibcxx_cv_func_fabsl_use = x"yes"; then for ac_func in fabsl do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -31378,68 +31173,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -31450,16 +31237,15 @@ done else - echo "$as_me:$LINENO: checking for _fabsl declaration" >&5 -echo $ECHO_N "checking for _fabsl declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for _fabsl declaration" >&5 +echo $ECHO_N "checking for _fabsl declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func__fabsl_use+set} != xset; then if test "${glibcxx_cv_func__fabsl_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -31485,35 +31271,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func__fabsl_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func__fabsl_use=no + glibcxx_cv_func__fabsl_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -31524,17 +31306,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__fabsl_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__fabsl_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__fabsl_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__fabsl_use" >&6; } if test x$glibcxx_cv_func__fabsl_use = x"yes"; then for ac_func in _fabsl do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -31565,68 +31347,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -31643,16 +31417,15 @@ done - echo "$as_me:$LINENO: checking for fmodl declaration" >&5 -echo $ECHO_N "checking for fmodl declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for fmodl declaration" >&5 +echo $ECHO_N "checking for fmodl declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func_fmodl_use+set} != xset; then if test "${glibcxx_cv_func_fmodl_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -31674,35 +31447,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func_fmodl_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_fmodl_use=no + glibcxx_cv_func_fmodl_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -31713,17 +31482,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_fmodl_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_fmodl_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_fmodl_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_fmodl_use" >&6; } if test x$glibcxx_cv_func_fmodl_use = x"yes"; then for ac_func in fmodl do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -31754,68 +31523,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -31826,16 +31587,15 @@ done else - echo "$as_me:$LINENO: checking for _fmodl declaration" >&5 -echo $ECHO_N "checking for _fmodl declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for _fmodl declaration" >&5 +echo $ECHO_N "checking for _fmodl declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func__fmodl_use+set} != xset; then if test "${glibcxx_cv_func__fmodl_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -31857,35 +31617,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func__fmodl_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func__fmodl_use=no + glibcxx_cv_func__fmodl_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -31896,17 +31652,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__fmodl_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__fmodl_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__fmodl_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__fmodl_use" >&6; } if test x$glibcxx_cv_func__fmodl_use = x"yes"; then for ac_func in _fmodl do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -31937,68 +31693,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -32015,16 +31763,15 @@ done - echo "$as_me:$LINENO: checking for frexpl declaration" >&5 -echo $ECHO_N "checking for frexpl declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for frexpl declaration" >&5 +echo $ECHO_N "checking for frexpl declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func_frexpl_use+set} != xset; then if test "${glibcxx_cv_func_frexpl_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -32046,35 +31793,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func_frexpl_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_frexpl_use=no + glibcxx_cv_func_frexpl_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -32085,17 +31828,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_frexpl_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_frexpl_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_frexpl_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_frexpl_use" >&6; } if test x$glibcxx_cv_func_frexpl_use = x"yes"; then for ac_func in frexpl do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -32126,68 +31869,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -32198,16 +31933,15 @@ done else - echo "$as_me:$LINENO: checking for _frexpl declaration" >&5 -echo $ECHO_N "checking for _frexpl declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for _frexpl declaration" >&5 +echo $ECHO_N "checking for _frexpl declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func__frexpl_use+set} != xset; then if test "${glibcxx_cv_func__frexpl_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -32229,35 +31963,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func__frexpl_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func__frexpl_use=no + glibcxx_cv_func__frexpl_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -32268,17 +31998,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__frexpl_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__frexpl_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__frexpl_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__frexpl_use" >&6; } if test x$glibcxx_cv_func__frexpl_use = x"yes"; then for ac_func in _frexpl do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -32309,68 +32039,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -32387,16 +32109,15 @@ done - echo "$as_me:$LINENO: checking for hypotl declaration" >&5 -echo $ECHO_N "checking for hypotl declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for hypotl declaration" >&5 +echo $ECHO_N "checking for hypotl declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func_hypotl_use+set} != xset; then if test "${glibcxx_cv_func_hypotl_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -32418,35 +32139,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func_hypotl_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_hypotl_use=no + glibcxx_cv_func_hypotl_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -32457,17 +32174,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_hypotl_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_hypotl_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_hypotl_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_hypotl_use" >&6; } if test x$glibcxx_cv_func_hypotl_use = x"yes"; then for ac_func in hypotl do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -32498,68 +32215,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -32570,16 +32279,15 @@ done else - echo "$as_me:$LINENO: checking for _hypotl declaration" >&5 -echo $ECHO_N "checking for _hypotl declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for _hypotl declaration" >&5 +echo $ECHO_N "checking for _hypotl declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func__hypotl_use+set} != xset; then if test "${glibcxx_cv_func__hypotl_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -32601,35 +32309,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func__hypotl_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func__hypotl_use=no + glibcxx_cv_func__hypotl_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -32640,17 +32344,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__hypotl_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__hypotl_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__hypotl_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__hypotl_use" >&6; } if test x$glibcxx_cv_func__hypotl_use = x"yes"; then for ac_func in _hypotl do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -32681,68 +32385,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -32759,16 +32455,15 @@ done - echo "$as_me:$LINENO: checking for ldexpl declaration" >&5 -echo $ECHO_N "checking for ldexpl declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for ldexpl declaration" >&5 +echo $ECHO_N "checking for ldexpl declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func_ldexpl_use+set} != xset; then if test "${glibcxx_cv_func_ldexpl_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -32790,35 +32485,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func_ldexpl_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_ldexpl_use=no + glibcxx_cv_func_ldexpl_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -32829,17 +32520,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_ldexpl_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_ldexpl_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_ldexpl_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_ldexpl_use" >&6; } if test x$glibcxx_cv_func_ldexpl_use = x"yes"; then for ac_func in ldexpl do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -32870,68 +32561,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -32942,16 +32625,15 @@ done else - echo "$as_me:$LINENO: checking for _ldexpl declaration" >&5 -echo $ECHO_N "checking for _ldexpl declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for _ldexpl declaration" >&5 +echo $ECHO_N "checking for _ldexpl declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func__ldexpl_use+set} != xset; then if test "${glibcxx_cv_func__ldexpl_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -32973,35 +32655,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func__ldexpl_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func__ldexpl_use=no + glibcxx_cv_func__ldexpl_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -33012,17 +32690,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__ldexpl_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__ldexpl_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__ldexpl_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__ldexpl_use" >&6; } if test x$glibcxx_cv_func__ldexpl_use = x"yes"; then for ac_func in _ldexpl do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -33053,68 +32731,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -33131,16 +32801,15 @@ done - echo "$as_me:$LINENO: checking for logl declaration" >&5 -echo $ECHO_N "checking for logl declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for logl declaration" >&5 +echo $ECHO_N "checking for logl declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func_logl_use+set} != xset; then if test "${glibcxx_cv_func_logl_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -33166,35 +32835,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func_logl_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_logl_use=no + glibcxx_cv_func_logl_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -33205,17 +32870,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_logl_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_logl_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_logl_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_logl_use" >&6; } if test x$glibcxx_cv_func_logl_use = x"yes"; then for ac_func in logl do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -33246,68 +32911,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -33318,16 +32975,15 @@ done else - echo "$as_me:$LINENO: checking for _logl declaration" >&5 -echo $ECHO_N "checking for _logl declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for _logl declaration" >&5 +echo $ECHO_N "checking for _logl declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func__logl_use+set} != xset; then if test "${glibcxx_cv_func__logl_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -33353,35 +33009,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func__logl_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func__logl_use=no + glibcxx_cv_func__logl_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -33392,17 +33044,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__logl_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__logl_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__logl_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__logl_use" >&6; } if test x$glibcxx_cv_func__logl_use = x"yes"; then for ac_func in _logl do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -33433,68 +33085,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -33511,16 +33155,15 @@ done - echo "$as_me:$LINENO: checking for log10l declaration" >&5 -echo $ECHO_N "checking for log10l declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for log10l declaration" >&5 +echo $ECHO_N "checking for log10l declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func_log10l_use+set} != xset; then if test "${glibcxx_cv_func_log10l_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -33546,35 +33189,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func_log10l_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_log10l_use=no + glibcxx_cv_func_log10l_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -33585,17 +33224,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_log10l_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_log10l_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_log10l_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_log10l_use" >&6; } if test x$glibcxx_cv_func_log10l_use = x"yes"; then for ac_func in log10l do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -33626,68 +33265,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -33698,16 +33329,15 @@ done else - echo "$as_me:$LINENO: checking for _log10l declaration" >&5 -echo $ECHO_N "checking for _log10l declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for _log10l declaration" >&5 +echo $ECHO_N "checking for _log10l declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func__log10l_use+set} != xset; then if test "${glibcxx_cv_func__log10l_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -33733,35 +33363,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func__log10l_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func__log10l_use=no + glibcxx_cv_func__log10l_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -33772,17 +33398,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__log10l_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__log10l_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__log10l_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__log10l_use" >&6; } if test x$glibcxx_cv_func__log10l_use = x"yes"; then for ac_func in _log10l do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -33813,68 +33439,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -33891,16 +33509,15 @@ done - echo "$as_me:$LINENO: checking for modfl declaration" >&5 -echo $ECHO_N "checking for modfl declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for modfl declaration" >&5 +echo $ECHO_N "checking for modfl declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func_modfl_use+set} != xset; then if test "${glibcxx_cv_func_modfl_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -33922,35 +33539,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func_modfl_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_modfl_use=no + glibcxx_cv_func_modfl_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -33961,17 +33574,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_modfl_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_modfl_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_modfl_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_modfl_use" >&6; } if test x$glibcxx_cv_func_modfl_use = x"yes"; then for ac_func in modfl do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -34002,68 +33615,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -34074,16 +33679,15 @@ done else - echo "$as_me:$LINENO: checking for _modfl declaration" >&5 -echo $ECHO_N "checking for _modfl declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for _modfl declaration" >&5 +echo $ECHO_N "checking for _modfl declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func__modfl_use+set} != xset; then if test "${glibcxx_cv_func__modfl_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -34105,35 +33709,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func__modfl_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func__modfl_use=no + glibcxx_cv_func__modfl_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -34144,17 +33744,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__modfl_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__modfl_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__modfl_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__modfl_use" >&6; } if test x$glibcxx_cv_func__modfl_use = x"yes"; then for ac_func in _modfl do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -34185,68 +33785,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -34263,16 +33855,15 @@ done - echo "$as_me:$LINENO: checking for powl declaration" >&5 -echo $ECHO_N "checking for powl declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for powl declaration" >&5 +echo $ECHO_N "checking for powl declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func_powl_use+set} != xset; then if test "${glibcxx_cv_func_powl_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -34294,35 +33885,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func_powl_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_powl_use=no + glibcxx_cv_func_powl_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -34333,17 +33920,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_powl_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_powl_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_powl_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_powl_use" >&6; } if test x$glibcxx_cv_func_powl_use = x"yes"; then for ac_func in powl do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -34374,68 +33961,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -34446,16 +34025,15 @@ done else - echo "$as_me:$LINENO: checking for _powl declaration" >&5 -echo $ECHO_N "checking for _powl declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for _powl declaration" >&5 +echo $ECHO_N "checking for _powl declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func__powl_use+set} != xset; then if test "${glibcxx_cv_func__powl_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -34477,35 +34055,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func__powl_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func__powl_use=no + glibcxx_cv_func__powl_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -34516,17 +34090,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__powl_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__powl_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__powl_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__powl_use" >&6; } if test x$glibcxx_cv_func__powl_use = x"yes"; then for ac_func in _powl do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -34557,68 +34131,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -34635,16 +34201,15 @@ done - echo "$as_me:$LINENO: checking for sqrtl declaration" >&5 -echo $ECHO_N "checking for sqrtl declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for sqrtl declaration" >&5 +echo $ECHO_N "checking for sqrtl declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func_sqrtl_use+set} != xset; then if test "${glibcxx_cv_func_sqrtl_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -34670,35 +34235,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func_sqrtl_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_sqrtl_use=no + glibcxx_cv_func_sqrtl_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -34709,17 +34270,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_sqrtl_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_sqrtl_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_sqrtl_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_sqrtl_use" >&6; } if test x$glibcxx_cv_func_sqrtl_use = x"yes"; then for ac_func in sqrtl do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -34750,68 +34311,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -34822,16 +34375,15 @@ done else - echo "$as_me:$LINENO: checking for _sqrtl declaration" >&5 -echo $ECHO_N "checking for _sqrtl declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for _sqrtl declaration" >&5 +echo $ECHO_N "checking for _sqrtl declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func__sqrtl_use+set} != xset; then if test "${glibcxx_cv_func__sqrtl_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -34857,35 +34409,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func__sqrtl_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func__sqrtl_use=no + glibcxx_cv_func__sqrtl_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -34896,17 +34444,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__sqrtl_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__sqrtl_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__sqrtl_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__sqrtl_use" >&6; } if test x$glibcxx_cv_func__sqrtl_use = x"yes"; then for ac_func in _sqrtl do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -34937,68 +34485,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -35015,16 +34555,15 @@ done - echo "$as_me:$LINENO: checking for sincosl declaration" >&5 -echo $ECHO_N "checking for sincosl declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for sincosl declaration" >&5 +echo $ECHO_N "checking for sincosl declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func_sincosl_use+set} != xset; then if test "${glibcxx_cv_func_sincosl_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -35046,35 +34585,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func_sincosl_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_sincosl_use=no + glibcxx_cv_func_sincosl_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -35085,17 +34620,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_sincosl_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_sincosl_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_sincosl_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_sincosl_use" >&6; } if test x$glibcxx_cv_func_sincosl_use = x"yes"; then for ac_func in sincosl do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -35126,68 +34661,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -35198,16 +34725,15 @@ done else - echo "$as_me:$LINENO: checking for _sincosl declaration" >&5 -echo $ECHO_N "checking for _sincosl declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for _sincosl declaration" >&5 +echo $ECHO_N "checking for _sincosl declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func__sincosl_use+set} != xset; then if test "${glibcxx_cv_func__sincosl_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -35229,35 +34755,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func__sincosl_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func__sincosl_use=no + glibcxx_cv_func__sincosl_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -35268,17 +34790,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__sincosl_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__sincosl_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__sincosl_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__sincosl_use" >&6; } if test x$glibcxx_cv_func__sincosl_use = x"yes"; then for ac_func in _sincosl do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -35309,68 +34831,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -35387,16 +34901,15 @@ done - echo "$as_me:$LINENO: checking for finitel declaration" >&5 -echo $ECHO_N "checking for finitel declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for finitel declaration" >&5 +echo $ECHO_N "checking for finitel declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func_finitel_use+set} != xset; then if test "${glibcxx_cv_func_finitel_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -35422,35 +34935,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func_finitel_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_finitel_use=no + glibcxx_cv_func_finitel_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -35461,17 +34970,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_finitel_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_finitel_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_finitel_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_finitel_use" >&6; } if test x$glibcxx_cv_func_finitel_use = x"yes"; then for ac_func in finitel do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -35502,68 +35011,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -35574,16 +35075,15 @@ done else - echo "$as_me:$LINENO: checking for _finitel declaration" >&5 -echo $ECHO_N "checking for _finitel declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for _finitel declaration" >&5 +echo $ECHO_N "checking for _finitel declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func__finitel_use+set} != xset; then if test "${glibcxx_cv_func__finitel_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -35609,35 +35109,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func__finitel_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func__finitel_use=no + glibcxx_cv_func__finitel_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -35648,17 +35144,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__finitel_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__finitel_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__finitel_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__finitel_use" >&6; } if test x$glibcxx_cv_func__finitel_use = x"yes"; then for ac_func in _finitel do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -35689,68 +35185,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -35771,16 +35259,15 @@ done - echo "$as_me:$LINENO: checking for __builtin_abs declaration" >&5 -echo $ECHO_N "checking for __builtin_abs declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for __builtin_abs declaration" >&5 +echo $ECHO_N "checking for __builtin_abs declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func___builtin_abs_use+set} != xset; then if test "${glibcxx_cv_func___builtin_abs_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -35802,35 +35289,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func___builtin_abs_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func___builtin_abs_use=no + glibcxx_cv_func___builtin_abs_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -35841,11 +35324,11 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_abs_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func___builtin_abs_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_abs_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func___builtin_abs_use" >&6; } if test x$glibcxx_cv_func___builtin_abs_use = x"yes"; then - echo "$as_me:$LINENO: checking for __builtin_abs linkage" >&5 -echo $ECHO_N "checking for __builtin_abs linkage... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for __builtin_abs linkage" >&5 +echo $ECHO_N "checking for __builtin_abs linkage... $ECHO_C" >&6; } if test x${glibcxx_cv_func___builtin_abs_link+set} != xset; then if test "${glibcxx_cv_func___builtin_abs_link+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 @@ -35872,42 +35355,39 @@ main () } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then glibcxx_cv_func___builtin_abs_link=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func___builtin_abs_link=no + glibcxx_cv_func___builtin_abs_link=no fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_abs_link" >&5 -echo "${ECHO_T}$glibcxx_cv_func___builtin_abs_link" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_abs_link" >&5 +echo "${ECHO_T}$glibcxx_cv_func___builtin_abs_link" >&6; } if test x$glibcxx_cv_func___builtin_abs_link = x"yes"; then @@ -35920,16 +35400,15 @@ _ACEOF fi - echo "$as_me:$LINENO: checking for __builtin_fabsf declaration" >&5 -echo $ECHO_N "checking for __builtin_fabsf declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for __builtin_fabsf declaration" >&5 +echo $ECHO_N "checking for __builtin_fabsf declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func___builtin_fabsf_use+set} != xset; then if test "${glibcxx_cv_func___builtin_fabsf_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -35951,35 +35430,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func___builtin_fabsf_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func___builtin_fabsf_use=no + glibcxx_cv_func___builtin_fabsf_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -35990,11 +35465,11 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_fabsf_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func___builtin_fabsf_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_fabsf_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func___builtin_fabsf_use" >&6; } if test x$glibcxx_cv_func___builtin_fabsf_use = x"yes"; then - echo "$as_me:$LINENO: checking for __builtin_fabsf linkage" >&5 -echo $ECHO_N "checking for __builtin_fabsf linkage... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for __builtin_fabsf linkage" >&5 +echo $ECHO_N "checking for __builtin_fabsf linkage... $ECHO_C" >&6; } if test x${glibcxx_cv_func___builtin_fabsf_link+set} != xset; then if test "${glibcxx_cv_func___builtin_fabsf_link+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 @@ -36021,42 +35496,39 @@ main () } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then glibcxx_cv_func___builtin_fabsf_link=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func___builtin_fabsf_link=no + glibcxx_cv_func___builtin_fabsf_link=no fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_fabsf_link" >&5 -echo "${ECHO_T}$glibcxx_cv_func___builtin_fabsf_link" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_fabsf_link" >&5 +echo "${ECHO_T}$glibcxx_cv_func___builtin_fabsf_link" >&6; } if test x$glibcxx_cv_func___builtin_fabsf_link = x"yes"; then @@ -36069,16 +35541,15 @@ _ACEOF fi - echo "$as_me:$LINENO: checking for __builtin_fabs declaration" >&5 -echo $ECHO_N "checking for __builtin_fabs declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for __builtin_fabs declaration" >&5 +echo $ECHO_N "checking for __builtin_fabs declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func___builtin_fabs_use+set} != xset; then if test "${glibcxx_cv_func___builtin_fabs_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -36100,35 +35571,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func___builtin_fabs_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func___builtin_fabs_use=no + glibcxx_cv_func___builtin_fabs_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -36139,11 +35606,11 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_fabs_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func___builtin_fabs_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_fabs_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func___builtin_fabs_use" >&6; } if test x$glibcxx_cv_func___builtin_fabs_use = x"yes"; then - echo "$as_me:$LINENO: checking for __builtin_fabs linkage" >&5 -echo $ECHO_N "checking for __builtin_fabs linkage... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for __builtin_fabs linkage" >&5 +echo $ECHO_N "checking for __builtin_fabs linkage... $ECHO_C" >&6; } if test x${glibcxx_cv_func___builtin_fabs_link+set} != xset; then if test "${glibcxx_cv_func___builtin_fabs_link+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 @@ -36170,42 +35637,39 @@ main () } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then glibcxx_cv_func___builtin_fabs_link=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func___builtin_fabs_link=no + glibcxx_cv_func___builtin_fabs_link=no fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_fabs_link" >&5 -echo "${ECHO_T}$glibcxx_cv_func___builtin_fabs_link" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_fabs_link" >&5 +echo "${ECHO_T}$glibcxx_cv_func___builtin_fabs_link" >&6; } if test x$glibcxx_cv_func___builtin_fabs_link = x"yes"; then @@ -36218,16 +35682,15 @@ _ACEOF fi - echo "$as_me:$LINENO: checking for __builtin_fabsl declaration" >&5 -echo $ECHO_N "checking for __builtin_fabsl declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for __builtin_fabsl declaration" >&5 +echo $ECHO_N "checking for __builtin_fabsl declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func___builtin_fabsl_use+set} != xset; then if test "${glibcxx_cv_func___builtin_fabsl_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -36249,35 +35712,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func___builtin_fabsl_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func___builtin_fabsl_use=no + glibcxx_cv_func___builtin_fabsl_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -36288,11 +35747,11 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_fabsl_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func___builtin_fabsl_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_fabsl_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func___builtin_fabsl_use" >&6; } if test x$glibcxx_cv_func___builtin_fabsl_use = x"yes"; then - echo "$as_me:$LINENO: checking for __builtin_fabsl linkage" >&5 -echo $ECHO_N "checking for __builtin_fabsl linkage... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for __builtin_fabsl linkage" >&5 +echo $ECHO_N "checking for __builtin_fabsl linkage... $ECHO_C" >&6; } if test x${glibcxx_cv_func___builtin_fabsl_link+set} != xset; then if test "${glibcxx_cv_func___builtin_fabsl_link+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 @@ -36319,42 +35778,39 @@ main () } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then glibcxx_cv_func___builtin_fabsl_link=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func___builtin_fabsl_link=no + glibcxx_cv_func___builtin_fabsl_link=no fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_fabsl_link" >&5 -echo "${ECHO_T}$glibcxx_cv_func___builtin_fabsl_link" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_fabsl_link" >&5 +echo "${ECHO_T}$glibcxx_cv_func___builtin_fabsl_link" >&6; } if test x$glibcxx_cv_func___builtin_fabsl_link = x"yes"; then @@ -36367,16 +35823,15 @@ _ACEOF fi - echo "$as_me:$LINENO: checking for __builtin_labs declaration" >&5 -echo $ECHO_N "checking for __builtin_labs declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for __builtin_labs declaration" >&5 +echo $ECHO_N "checking for __builtin_labs declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func___builtin_labs_use+set} != xset; then if test "${glibcxx_cv_func___builtin_labs_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -36398,35 +35853,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func___builtin_labs_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func___builtin_labs_use=no + glibcxx_cv_func___builtin_labs_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -36437,11 +35888,11 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_labs_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func___builtin_labs_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_labs_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func___builtin_labs_use" >&6; } if test x$glibcxx_cv_func___builtin_labs_use = x"yes"; then - echo "$as_me:$LINENO: checking for __builtin_labs linkage" >&5 -echo $ECHO_N "checking for __builtin_labs linkage... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for __builtin_labs linkage" >&5 +echo $ECHO_N "checking for __builtin_labs linkage... $ECHO_C" >&6; } if test x${glibcxx_cv_func___builtin_labs_link+set} != xset; then if test "${glibcxx_cv_func___builtin_labs_link+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 @@ -36468,42 +35919,39 @@ main () } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then glibcxx_cv_func___builtin_labs_link=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func___builtin_labs_link=no + glibcxx_cv_func___builtin_labs_link=no fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_labs_link" >&5 -echo "${ECHO_T}$glibcxx_cv_func___builtin_labs_link" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_labs_link" >&5 +echo "${ECHO_T}$glibcxx_cv_func___builtin_labs_link" >&6; } if test x$glibcxx_cv_func___builtin_labs_link = x"yes"; then @@ -36517,16 +35965,15 @@ _ACEOF - echo "$as_me:$LINENO: checking for __builtin_sqrtf declaration" >&5 -echo $ECHO_N "checking for __builtin_sqrtf declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for __builtin_sqrtf declaration" >&5 +echo $ECHO_N "checking for __builtin_sqrtf declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func___builtin_sqrtf_use+set} != xset; then if test "${glibcxx_cv_func___builtin_sqrtf_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -36548,35 +35995,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func___builtin_sqrtf_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func___builtin_sqrtf_use=no + glibcxx_cv_func___builtin_sqrtf_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -36587,11 +36030,11 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_sqrtf_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func___builtin_sqrtf_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_sqrtf_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func___builtin_sqrtf_use" >&6; } if test x$glibcxx_cv_func___builtin_sqrtf_use = x"yes"; then - echo "$as_me:$LINENO: checking for __builtin_sqrtf linkage" >&5 -echo $ECHO_N "checking for __builtin_sqrtf linkage... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for __builtin_sqrtf linkage" >&5 +echo $ECHO_N "checking for __builtin_sqrtf linkage... $ECHO_C" >&6; } if test x${glibcxx_cv_func___builtin_sqrtf_link+set} != xset; then if test "${glibcxx_cv_func___builtin_sqrtf_link+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 @@ -36618,42 +36061,39 @@ main () } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then glibcxx_cv_func___builtin_sqrtf_link=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func___builtin_sqrtf_link=no + glibcxx_cv_func___builtin_sqrtf_link=no fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_sqrtf_link" >&5 -echo "${ECHO_T}$glibcxx_cv_func___builtin_sqrtf_link" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_sqrtf_link" >&5 +echo "${ECHO_T}$glibcxx_cv_func___builtin_sqrtf_link" >&6; } if test x$glibcxx_cv_func___builtin_sqrtf_link = x"yes"; then @@ -36666,16 +36106,15 @@ _ACEOF fi - echo "$as_me:$LINENO: checking for __builtin_sqrt declaration" >&5 -echo $ECHO_N "checking for __builtin_sqrt declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for __builtin_sqrt declaration" >&5 +echo $ECHO_N "checking for __builtin_sqrt declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func___builtin_sqrt_use+set} != xset; then if test "${glibcxx_cv_func___builtin_sqrt_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -36697,35 +36136,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func___builtin_sqrt_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func___builtin_sqrt_use=no + glibcxx_cv_func___builtin_sqrt_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -36736,11 +36171,11 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_sqrt_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func___builtin_sqrt_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_sqrt_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func___builtin_sqrt_use" >&6; } if test x$glibcxx_cv_func___builtin_sqrt_use = x"yes"; then - echo "$as_me:$LINENO: checking for __builtin_sqrt linkage" >&5 -echo $ECHO_N "checking for __builtin_sqrt linkage... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for __builtin_sqrt linkage" >&5 +echo $ECHO_N "checking for __builtin_sqrt linkage... $ECHO_C" >&6; } if test x${glibcxx_cv_func___builtin_sqrt_link+set} != xset; then if test "${glibcxx_cv_func___builtin_sqrt_link+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 @@ -36767,42 +36202,39 @@ main () } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then glibcxx_cv_func___builtin_sqrt_link=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func___builtin_sqrt_link=no + glibcxx_cv_func___builtin_sqrt_link=no fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_sqrt_link" >&5 -echo "${ECHO_T}$glibcxx_cv_func___builtin_sqrt_link" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_sqrt_link" >&5 +echo "${ECHO_T}$glibcxx_cv_func___builtin_sqrt_link" >&6; } if test x$glibcxx_cv_func___builtin_sqrt_link = x"yes"; then @@ -36815,16 +36247,15 @@ _ACEOF fi - echo "$as_me:$LINENO: checking for __builtin_sqrtl declaration" >&5 -echo $ECHO_N "checking for __builtin_sqrtl declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for __builtin_sqrtl declaration" >&5 +echo $ECHO_N "checking for __builtin_sqrtl declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func___builtin_sqrtl_use+set} != xset; then if test "${glibcxx_cv_func___builtin_sqrtl_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -36846,35 +36277,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func___builtin_sqrtl_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func___builtin_sqrtl_use=no + glibcxx_cv_func___builtin_sqrtl_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -36885,11 +36312,11 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_sqrtl_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func___builtin_sqrtl_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_sqrtl_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func___builtin_sqrtl_use" >&6; } if test x$glibcxx_cv_func___builtin_sqrtl_use = x"yes"; then - echo "$as_me:$LINENO: checking for __builtin_sqrtl linkage" >&5 -echo $ECHO_N "checking for __builtin_sqrtl linkage... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for __builtin_sqrtl linkage" >&5 +echo $ECHO_N "checking for __builtin_sqrtl linkage... $ECHO_C" >&6; } if test x${glibcxx_cv_func___builtin_sqrtl_link+set} != xset; then if test "${glibcxx_cv_func___builtin_sqrtl_link+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 @@ -36916,42 +36343,39 @@ main () } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then glibcxx_cv_func___builtin_sqrtl_link=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func___builtin_sqrtl_link=no + glibcxx_cv_func___builtin_sqrtl_link=no fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_sqrtl_link" >&5 -echo "${ECHO_T}$glibcxx_cv_func___builtin_sqrtl_link" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_sqrtl_link" >&5 +echo "${ECHO_T}$glibcxx_cv_func___builtin_sqrtl_link" >&6; } if test x$glibcxx_cv_func___builtin_sqrtl_link = x"yes"; then @@ -36965,16 +36389,15 @@ _ACEOF - echo "$as_me:$LINENO: checking for __builtin_sinf declaration" >&5 -echo $ECHO_N "checking for __builtin_sinf declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for __builtin_sinf declaration" >&5 +echo $ECHO_N "checking for __builtin_sinf declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func___builtin_sinf_use+set} != xset; then if test "${glibcxx_cv_func___builtin_sinf_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -36996,35 +36419,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func___builtin_sinf_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func___builtin_sinf_use=no + glibcxx_cv_func___builtin_sinf_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -37035,11 +36454,11 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_sinf_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func___builtin_sinf_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_sinf_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func___builtin_sinf_use" >&6; } if test x$glibcxx_cv_func___builtin_sinf_use = x"yes"; then - echo "$as_me:$LINENO: checking for __builtin_sinf linkage" >&5 -echo $ECHO_N "checking for __builtin_sinf linkage... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for __builtin_sinf linkage" >&5 +echo $ECHO_N "checking for __builtin_sinf linkage... $ECHO_C" >&6; } if test x${glibcxx_cv_func___builtin_sinf_link+set} != xset; then if test "${glibcxx_cv_func___builtin_sinf_link+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 @@ -37066,42 +36485,39 @@ main () } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then glibcxx_cv_func___builtin_sinf_link=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func___builtin_sinf_link=no + glibcxx_cv_func___builtin_sinf_link=no fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_sinf_link" >&5 -echo "${ECHO_T}$glibcxx_cv_func___builtin_sinf_link" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_sinf_link" >&5 +echo "${ECHO_T}$glibcxx_cv_func___builtin_sinf_link" >&6; } if test x$glibcxx_cv_func___builtin_sinf_link = x"yes"; then @@ -37114,16 +36530,15 @@ _ACEOF fi - echo "$as_me:$LINENO: checking for __builtin_sin declaration" >&5 -echo $ECHO_N "checking for __builtin_sin declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for __builtin_sin declaration" >&5 +echo $ECHO_N "checking for __builtin_sin declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func___builtin_sin_use+set} != xset; then if test "${glibcxx_cv_func___builtin_sin_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -37145,35 +36560,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func___builtin_sin_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func___builtin_sin_use=no + glibcxx_cv_func___builtin_sin_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -37184,11 +36595,11 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_sin_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func___builtin_sin_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_sin_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func___builtin_sin_use" >&6; } if test x$glibcxx_cv_func___builtin_sin_use = x"yes"; then - echo "$as_me:$LINENO: checking for __builtin_sin linkage" >&5 -echo $ECHO_N "checking for __builtin_sin linkage... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for __builtin_sin linkage" >&5 +echo $ECHO_N "checking for __builtin_sin linkage... $ECHO_C" >&6; } if test x${glibcxx_cv_func___builtin_sin_link+set} != xset; then if test "${glibcxx_cv_func___builtin_sin_link+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 @@ -37215,42 +36626,39 @@ main () } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then glibcxx_cv_func___builtin_sin_link=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func___builtin_sin_link=no + glibcxx_cv_func___builtin_sin_link=no fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_sin_link" >&5 -echo "${ECHO_T}$glibcxx_cv_func___builtin_sin_link" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_sin_link" >&5 +echo "${ECHO_T}$glibcxx_cv_func___builtin_sin_link" >&6; } if test x$glibcxx_cv_func___builtin_sin_link = x"yes"; then @@ -37263,16 +36671,15 @@ _ACEOF fi - echo "$as_me:$LINENO: checking for __builtin_sinl declaration" >&5 -echo $ECHO_N "checking for __builtin_sinl declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for __builtin_sinl declaration" >&5 +echo $ECHO_N "checking for __builtin_sinl declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func___builtin_sinl_use+set} != xset; then if test "${glibcxx_cv_func___builtin_sinl_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -37294,35 +36701,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func___builtin_sinl_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func___builtin_sinl_use=no + glibcxx_cv_func___builtin_sinl_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -37333,11 +36736,11 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_sinl_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func___builtin_sinl_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_sinl_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func___builtin_sinl_use" >&6; } if test x$glibcxx_cv_func___builtin_sinl_use = x"yes"; then - echo "$as_me:$LINENO: checking for __builtin_sinl linkage" >&5 -echo $ECHO_N "checking for __builtin_sinl linkage... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for __builtin_sinl linkage" >&5 +echo $ECHO_N "checking for __builtin_sinl linkage... $ECHO_C" >&6; } if test x${glibcxx_cv_func___builtin_sinl_link+set} != xset; then if test "${glibcxx_cv_func___builtin_sinl_link+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 @@ -37364,42 +36767,39 @@ main () } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then glibcxx_cv_func___builtin_sinl_link=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func___builtin_sinl_link=no + glibcxx_cv_func___builtin_sinl_link=no fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_sinl_link" >&5 -echo "${ECHO_T}$glibcxx_cv_func___builtin_sinl_link" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_sinl_link" >&5 +echo "${ECHO_T}$glibcxx_cv_func___builtin_sinl_link" >&6; } if test x$glibcxx_cv_func___builtin_sinl_link = x"yes"; then @@ -37413,16 +36813,15 @@ _ACEOF - echo "$as_me:$LINENO: checking for __builtin_cosf declaration" >&5 -echo $ECHO_N "checking for __builtin_cosf declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for __builtin_cosf declaration" >&5 +echo $ECHO_N "checking for __builtin_cosf declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func___builtin_cosf_use+set} != xset; then if test "${glibcxx_cv_func___builtin_cosf_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -37444,35 +36843,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func___builtin_cosf_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func___builtin_cosf_use=no + glibcxx_cv_func___builtin_cosf_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -37483,11 +36878,11 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_cosf_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func___builtin_cosf_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_cosf_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func___builtin_cosf_use" >&6; } if test x$glibcxx_cv_func___builtin_cosf_use = x"yes"; then - echo "$as_me:$LINENO: checking for __builtin_cosf linkage" >&5 -echo $ECHO_N "checking for __builtin_cosf linkage... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for __builtin_cosf linkage" >&5 +echo $ECHO_N "checking for __builtin_cosf linkage... $ECHO_C" >&6; } if test x${glibcxx_cv_func___builtin_cosf_link+set} != xset; then if test "${glibcxx_cv_func___builtin_cosf_link+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 @@ -37514,42 +36909,39 @@ main () } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then glibcxx_cv_func___builtin_cosf_link=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func___builtin_cosf_link=no + glibcxx_cv_func___builtin_cosf_link=no fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_cosf_link" >&5 -echo "${ECHO_T}$glibcxx_cv_func___builtin_cosf_link" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_cosf_link" >&5 +echo "${ECHO_T}$glibcxx_cv_func___builtin_cosf_link" >&6; } if test x$glibcxx_cv_func___builtin_cosf_link = x"yes"; then @@ -37562,16 +36954,15 @@ _ACEOF fi - echo "$as_me:$LINENO: checking for __builtin_cos declaration" >&5 -echo $ECHO_N "checking for __builtin_cos declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for __builtin_cos declaration" >&5 +echo $ECHO_N "checking for __builtin_cos declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func___builtin_cos_use+set} != xset; then if test "${glibcxx_cv_func___builtin_cos_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -37593,35 +36984,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func___builtin_cos_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func___builtin_cos_use=no + glibcxx_cv_func___builtin_cos_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -37632,11 +37019,11 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_cos_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func___builtin_cos_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_cos_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func___builtin_cos_use" >&6; } if test x$glibcxx_cv_func___builtin_cos_use = x"yes"; then - echo "$as_me:$LINENO: checking for __builtin_cos linkage" >&5 -echo $ECHO_N "checking for __builtin_cos linkage... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for __builtin_cos linkage" >&5 +echo $ECHO_N "checking for __builtin_cos linkage... $ECHO_C" >&6; } if test x${glibcxx_cv_func___builtin_cos_link+set} != xset; then if test "${glibcxx_cv_func___builtin_cos_link+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 @@ -37663,42 +37050,39 @@ main () } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then glibcxx_cv_func___builtin_cos_link=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func___builtin_cos_link=no + glibcxx_cv_func___builtin_cos_link=no fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_cos_link" >&5 -echo "${ECHO_T}$glibcxx_cv_func___builtin_cos_link" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_cos_link" >&5 +echo "${ECHO_T}$glibcxx_cv_func___builtin_cos_link" >&6; } if test x$glibcxx_cv_func___builtin_cos_link = x"yes"; then @@ -37711,16 +37095,15 @@ _ACEOF fi - echo "$as_me:$LINENO: checking for __builtin_cosl declaration" >&5 -echo $ECHO_N "checking for __builtin_cosl declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for __builtin_cosl declaration" >&5 +echo $ECHO_N "checking for __builtin_cosl declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func___builtin_cosl_use+set} != xset; then if test "${glibcxx_cv_func___builtin_cosl_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -37742,35 +37125,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func___builtin_cosl_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func___builtin_cosl_use=no + glibcxx_cv_func___builtin_cosl_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -37781,11 +37160,11 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_cosl_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func___builtin_cosl_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_cosl_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func___builtin_cosl_use" >&6; } if test x$glibcxx_cv_func___builtin_cosl_use = x"yes"; then - echo "$as_me:$LINENO: checking for __builtin_cosl linkage" >&5 -echo $ECHO_N "checking for __builtin_cosl linkage... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for __builtin_cosl linkage" >&5 +echo $ECHO_N "checking for __builtin_cosl linkage... $ECHO_C" >&6; } if test x${glibcxx_cv_func___builtin_cosl_link+set} != xset; then if test "${glibcxx_cv_func___builtin_cosl_link+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 @@ -37812,42 +37191,39 @@ main () } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then glibcxx_cv_func___builtin_cosl_link=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func___builtin_cosl_link=no + glibcxx_cv_func___builtin_cosl_link=no fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_cosl_link" >&5 -echo "${ECHO_T}$glibcxx_cv_func___builtin_cosl_link" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_cosl_link" >&5 +echo "${ECHO_T}$glibcxx_cv_func___builtin_cosl_link" >&6; } if test x$glibcxx_cv_func___builtin_cosl_link = x"yes"; then @@ -37862,8 +37238,8 @@ _ACEOF -echo "$as_me:$LINENO: checking for main in -lm" >&5 -echo $ECHO_N "checking for main in -lm... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking for main in -lm" >&5 +echo $ECHO_N "checking for main in -lm... $ECHO_C" >&6; } if test "${ac_cv_lib_m_main+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -37885,46 +37261,43 @@ cat >>conftest.$ac_ext <<_ACEOF int main () { -main (); +return main (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then ac_cv_lib_m_main=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -ac_cv_lib_m_main=no + ac_cv_lib_m_main=no fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -echo "$as_me:$LINENO: result: $ac_cv_lib_m_main" >&5 -echo "${ECHO_T}$ac_cv_lib_m_main" >&6 +{ echo "$as_me:$LINENO: result: $ac_cv_lib_m_main" >&5 +echo "${ECHO_T}$ac_cv_lib_m_main" >&6; } if test $ac_cv_lib_m_main = yes; then cat >>confdefs.h <<_ACEOF #define HAVE_LIBM 1 @@ -37938,9 +37311,9 @@ fi for ac_func in copysignf do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -37971,68 +37344,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -38048,9 +37413,9 @@ done for ac_func in __signbit do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -38081,68 +37446,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -38158,9 +37515,9 @@ done for ac_func in __signbitf do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -38191,68 +37548,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -38269,9 +37618,9 @@ done for ac_func in __signbitl do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -38302,68 +37651,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -38388,16 +37729,15 @@ done CXXFLAGS='-fno-builtin -D_GNU_SOURCE' - echo "$as_me:$LINENO: checking for strtold declaration" >&5 -echo $ECHO_N "checking for strtold declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for strtold declaration" >&5 +echo $ECHO_N "checking for strtold declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func_strtold_use+set} != xset; then if test "${glibcxx_cv_func_strtold_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -38419,35 +37759,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func_strtold_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_strtold_use=no + glibcxx_cv_func_strtold_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -38458,16 +37794,16 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_strtold_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_strtold_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_strtold_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_strtold_use" >&6; } if test x$glibcxx_cv_func_strtold_use = x"yes"; then for ac_func in strtold do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -38498,68 +37834,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -38574,16 +37902,15 @@ done - echo "$as_me:$LINENO: checking for strtof declaration" >&5 -echo $ECHO_N "checking for strtof declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for strtof declaration" >&5 +echo $ECHO_N "checking for strtof declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func_strtof_use+set} != xset; then if test "${glibcxx_cv_func_strtof_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -38605,35 +37932,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func_strtof_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_strtof_use=no + glibcxx_cv_func_strtof_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -38644,16 +37967,16 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_strtof_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_strtof_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_strtof_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_strtof_use" >&6; } if test x$glibcxx_cv_func_strtof_use = x"yes"; then for ac_func in strtof do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -38684,68 +38007,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -38769,18 +38084,19 @@ done for ac_header in sys/ioctl.h sys/filio.h do as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + { echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 +ac_res=`eval echo '${'$as_ac_Header'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } else # Is the header compilable? -echo "$as_me:$LINENO: checking $ac_header usability" >&5 -echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking $ac_header usability" >&5 +echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6; } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF @@ -38791,41 +38107,37 @@ $ac_includes_default #include <$ac_header> _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then ac_header_compiler=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -ac_header_compiler=no + ac_header_compiler=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 -echo "${ECHO_T}$ac_header_compiler" >&6 + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +echo "${ECHO_T}$ac_header_compiler" >&6; } # Is the header present? -echo "$as_me:$LINENO: checking $ac_header presence" >&5 -echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking $ac_header presence" >&5 +echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6; } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF @@ -38834,24 +38146,22 @@ cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include <$ac_header> _ACEOF -if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 - (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 +if { (ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null; then - if test -s conftest.err; then - ac_cpp_err=$ac_c_preproc_warn_flag - ac_cpp_err=$ac_cpp_err$ac_c_werror_flag - else - ac_cpp_err= - fi -else - ac_cpp_err=yes -fi -if test -z "$ac_cpp_err"; then + (exit $ac_status); } >/dev/null && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then ac_header_preproc=yes else echo "$as_me: failed program was:" >&5 @@ -38859,9 +38169,10 @@ sed 's/^/| /' conftest.$ac_ext >&5 ac_header_preproc=no fi + rm -f conftest.err conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 -echo "${ECHO_T}$ac_header_preproc" >&6 +{ echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 +echo "${ECHO_T}$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in @@ -38885,25 +38196,19 @@ echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\ echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} - ( - cat <<\_ASBOX -## ----------------------------------------- ## -## Report this to the package-unused lists. ## -## ----------------------------------------- ## -_ASBOX - ) | - sed "s/^/$as_me: WARNING: /" >&2 + ;; esac -echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else eval "$as_ac_Header=\$ac_header_preproc" fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 +ac_res=`eval echo '${'$as_ac_Header'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } fi if test `eval echo '${'$as_ac_Header'}'` = yes; then @@ -38916,8 +38221,8 @@ fi done - echo "$as_me:$LINENO: checking for poll" >&5 -echo $ECHO_N "checking for poll... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for poll" >&5 +echo $ECHO_N "checking for poll... $ECHO_C" >&6; } if test "${glibcxx_cv_POLL+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -38945,35 +38250,32 @@ struct pollfd pfd[1]; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then glibcxx_cv_POLL=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_POLL=no + glibcxx_cv_POLL=no fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi @@ -38985,12 +38287,12 @@ cat >>confdefs.h <<\_ACEOF _ACEOF fi - echo "$as_me:$LINENO: result: $glibcxx_cv_POLL" >&5 -echo "${ECHO_T}$glibcxx_cv_POLL" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_POLL" >&5 +echo "${ECHO_T}$glibcxx_cv_POLL" >&6; } - echo "$as_me:$LINENO: checking for S_ISREG or S_IFREG" >&5 -echo $ECHO_N "checking for S_ISREG or S_IFREG... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for S_ISREG or S_IFREG" >&5 +echo $ECHO_N "checking for S_ISREG or S_IFREG... $ECHO_C" >&6; } if test "${glibcxx_cv_S_ISREG+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -39018,35 +38320,32 @@ struct stat buffer; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then glibcxx_cv_S_ISREG=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_S_ISREG=no + glibcxx_cv_S_ISREG=no fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi @@ -39078,35 +38377,32 @@ struct stat buffer; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then glibcxx_cv_S_IFREG=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_S_IFREG=no + glibcxx_cv_S_IFREG=no fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi @@ -39127,8 +38423,8 @@ _ACEOF res=S_IFREG fi - echo "$as_me:$LINENO: result: $res" >&5 -echo "${ECHO_T}$res" >&6 + { echo "$as_me:$LINENO: result: $res" >&5 +echo "${ECHO_T}$res" >&6; } # For xsputn_2(). @@ -39136,18 +38432,19 @@ echo "${ECHO_T}$res" >&6 for ac_header in sys/uio.h do as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + { echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 +ac_res=`eval echo '${'$as_ac_Header'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } else # Is the header compilable? -echo "$as_me:$LINENO: checking $ac_header usability" >&5 -echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking $ac_header usability" >&5 +echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6; } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF @@ -39158,41 +38455,37 @@ $ac_includes_default #include <$ac_header> _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then ac_header_compiler=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -ac_header_compiler=no + ac_header_compiler=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 -echo "${ECHO_T}$ac_header_compiler" >&6 + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +echo "${ECHO_T}$ac_header_compiler" >&6; } # Is the header present? -echo "$as_me:$LINENO: checking $ac_header presence" >&5 -echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking $ac_header presence" >&5 +echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6; } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF @@ -39201,24 +38494,22 @@ cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include <$ac_header> _ACEOF -if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 - (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 +if { (ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null; then - if test -s conftest.err; then - ac_cpp_err=$ac_c_preproc_warn_flag - ac_cpp_err=$ac_cpp_err$ac_c_werror_flag - else - ac_cpp_err= - fi -else - ac_cpp_err=yes -fi -if test -z "$ac_cpp_err"; then + (exit $ac_status); } >/dev/null && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then ac_header_preproc=yes else echo "$as_me: failed program was:" >&5 @@ -39226,9 +38517,10 @@ sed 's/^/| /' conftest.$ac_ext >&5 ac_header_preproc=no fi + rm -f conftest.err conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 -echo "${ECHO_T}$ac_header_preproc" >&6 +{ echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 +echo "${ECHO_T}$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in @@ -39252,25 +38544,19 @@ echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\ echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} - ( - cat <<\_ASBOX -## ----------------------------------------- ## -## Report this to the package-unused lists. ## -## ----------------------------------------- ## -_ASBOX - ) | - sed "s/^/$as_me: WARNING: /" >&2 + ;; esac -echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else eval "$as_ac_Header=\$ac_header_preproc" fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 +ac_res=`eval echo '${'$as_ac_Header'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } fi if test `eval echo '${'$as_ac_Header'}'` = yes; then @@ -39283,8 +38569,8 @@ fi done - echo "$as_me:$LINENO: checking for writev" >&5 -echo $ECHO_N "checking for writev... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for writev" >&5 +echo $ECHO_N "checking for writev... $ECHO_C" >&6; } if test "${glibcxx_cv_WRITEV+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -39311,35 +38597,32 @@ struct iovec iov[2]; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then glibcxx_cv_WRITEV=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_WRITEV=no + glibcxx_cv_WRITEV=no fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi @@ -39351,14 +38634,14 @@ cat >>confdefs.h <<\_ACEOF _ACEOF fi - echo "$as_me:$LINENO: result: $glibcxx_cv_WRITEV" >&5 -echo "${ECHO_T}$glibcxx_cv_WRITEV" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_WRITEV" >&5 +echo "${ECHO_T}$glibcxx_cv_WRITEV" >&6; } # For the __streamoff_base_type typedef. - echo "$as_me:$LINENO: checking for int64_t" >&5 -echo $ECHO_N "checking for int64_t... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for int64_t" >&5 +echo $ECHO_N "checking for int64_t... $ECHO_C" >&6; } if test "${glibcxx_cv_INT64_T+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -39379,35 +38662,31 @@ int64_t var; } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_INT64_T=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_INT64_T=no + glibcxx_cv_INT64_T=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi @@ -39418,15 +38697,14 @@ cat >>confdefs.h <<\_ACEOF _ACEOF fi - echo "$as_me:$LINENO: result: $glibcxx_cv_INT64_T" >&5 -echo "${ECHO_T}$glibcxx_cv_INT64_T" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_INT64_T" >&5 +echo "${ECHO_T}$glibcxx_cv_INT64_T" >&6; } # For LFS support. - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -39434,8 +38712,8 @@ ac_compiler_gnu=$ac_cv_cxx_compiler_gnu ac_save_CXXFLAGS="$CXXFLAGS" CXXFLAGS="$CXXFLAGS -fno-exceptions" - echo "$as_me:$LINENO: checking for LFS support" >&5 -echo $ECHO_N "checking for LFS support... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for LFS support" >&5 +echo $ECHO_N "checking for LFS support... $ECHO_C" >&6; } if test "${glibcxx_cv_LFS+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -39470,35 +38748,32 @@ FILE* fp; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then glibcxx_cv_LFS=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_LFS=no + glibcxx_cv_LFS=no fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi @@ -39510,8 +38785,8 @@ cat >>confdefs.h <<\_ACEOF _ACEOF fi - echo "$as_me:$LINENO: result: $glibcxx_cv_LFS" >&5 -echo "${ECHO_T}$glibcxx_cv_LFS" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_LFS" >&5 +echo "${ECHO_T}$glibcxx_cv_LFS" >&6; } CXXFLAGS="$ac_save_CXXFLAGS" ac_ext=c ac_cpp='$CPP $CPPFLAGS' @@ -39525,8 +38800,7 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -39544,18 +38818,19 @@ ac_compiler_gnu=$ac_cv_cxx_compiler_gnu for ac_header in complex.h do as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + { echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 +ac_res=`eval echo '${'$as_ac_Header'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } else # Is the header compilable? -echo "$as_me:$LINENO: checking $ac_header usability" >&5 -echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking $ac_header usability" >&5 +echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6; } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF @@ -39566,41 +38841,37 @@ $ac_includes_default #include <$ac_header> _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then ac_header_compiler=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -ac_header_compiler=no + ac_header_compiler=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 -echo "${ECHO_T}$ac_header_compiler" >&6 + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +echo "${ECHO_T}$ac_header_compiler" >&6; } # Is the header present? -echo "$as_me:$LINENO: checking $ac_header presence" >&5 -echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking $ac_header presence" >&5 +echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6; } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF @@ -39609,24 +38880,22 @@ cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include <$ac_header> _ACEOF -if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 - (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 +if { (ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null; then - if test -s conftest.err; then - ac_cpp_err=$ac_cxx_preproc_warn_flag - ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag - else - ac_cpp_err= - fi -else - ac_cpp_err=yes -fi -if test -z "$ac_cpp_err"; then + (exit $ac_status); } >/dev/null && { + test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || + test ! -s conftest.err + }; then ac_header_preproc=yes else echo "$as_me: failed program was:" >&5 @@ -39634,9 +38903,10 @@ sed 's/^/| /' conftest.$ac_ext >&5 ac_header_preproc=no fi + rm -f conftest.err conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 -echo "${ECHO_T}$ac_header_preproc" >&6 +{ echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 +echo "${ECHO_T}$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_cxx_preproc_warn_flag in @@ -39660,25 +38930,19 @@ echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\ echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} - ( - cat <<\_ASBOX -## ----------------------------------------- ## -## Report this to the package-unused lists. ## -## ----------------------------------------- ## -_ASBOX - ) | - sed "s/^/$as_me: WARNING: /" >&2 + ;; esac -echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else eval "$as_ac_Header=\$ac_header_preproc" fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 +ac_res=`eval echo '${'$as_ac_Header'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } fi if test `eval echo '${'$as_ac_Header'}'` = yes; then @@ -39694,8 +38958,8 @@ done ac_c99_complex_tr1=no; if test x"$ac_has_complex_h" = x"yes"; then - echo "$as_me:$LINENO: checking for ISO C99 support to TR1 in " >&5 -echo $ECHO_N "checking for ISO C99 support to TR1 in ... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for ISO C99 support to TR1 in " >&5 +echo $ECHO_N "checking for ISO C99 support to TR1 in ... $ECHO_C" >&6; } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF @@ -39733,38 +38997,34 @@ typedef __complex__ float float_type; float_type tmpf; } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then ac_c99_complex_tr1=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -ac_c99_complex_tr1=no + ac_c99_complex_tr1=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi - echo "$as_me:$LINENO: result: $ac_c99_complex_tr1" >&5 -echo "${ECHO_T}$ac_c99_complex_tr1" >&6 + { echo "$as_me:$LINENO: result: $ac_c99_complex_tr1" >&5 +echo "${ECHO_T}$ac_c99_complex_tr1" >&6; } if test x"$ac_c99_complex_tr1" = x"yes"; then cat >>confdefs.h <<\_ACEOF @@ -39774,8 +39034,8 @@ _ACEOF fi # Check for the existence of functions. - echo "$as_me:$LINENO: checking for ISO C99 support to TR1 in " >&5 -echo $ECHO_N "checking for ISO C99 support to TR1 in ... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for ISO C99 support to TR1 in " >&5 +echo $ECHO_N "checking for ISO C99 support to TR1 in ... $ECHO_C" >&6; } if test "${ac_c99_ctype_tr1+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -39799,40 +39059,36 @@ int ch; } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then ac_c99_ctype_tr1=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -ac_c99_ctype_tr1=no + ac_c99_ctype_tr1=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi - echo "$as_me:$LINENO: result: $ac_c99_ctype_tr1" >&5 -echo "${ECHO_T}$ac_c99_ctype_tr1" >&6 + { echo "$as_me:$LINENO: result: $ac_c99_ctype_tr1" >&5 +echo "${ECHO_T}$ac_c99_ctype_tr1" >&6; } if test x"$ac_c99_ctype_tr1" = x"yes"; then cat >>confdefs.h <<\_ACEOF @@ -39846,18 +39102,19 @@ _ACEOF for ac_header in fenv.h do as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + { echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 +ac_res=`eval echo '${'$as_ac_Header'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } else # Is the header compilable? -echo "$as_me:$LINENO: checking $ac_header usability" >&5 -echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking $ac_header usability" >&5 +echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6; } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF @@ -39868,41 +39125,37 @@ $ac_includes_default #include <$ac_header> _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then ac_header_compiler=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -ac_header_compiler=no + ac_header_compiler=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 -echo "${ECHO_T}$ac_header_compiler" >&6 + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +echo "${ECHO_T}$ac_header_compiler" >&6; } # Is the header present? -echo "$as_me:$LINENO: checking $ac_header presence" >&5 -echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking $ac_header presence" >&5 +echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6; } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF @@ -39911,24 +39164,22 @@ cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include <$ac_header> _ACEOF -if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 - (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 +if { (ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null; then - if test -s conftest.err; then - ac_cpp_err=$ac_cxx_preproc_warn_flag - ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag - else - ac_cpp_err= - fi -else - ac_cpp_err=yes -fi -if test -z "$ac_cpp_err"; then + (exit $ac_status); } >/dev/null && { + test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || + test ! -s conftest.err + }; then ac_header_preproc=yes else echo "$as_me: failed program was:" >&5 @@ -39936,9 +39187,10 @@ sed 's/^/| /' conftest.$ac_ext >&5 ac_header_preproc=no fi + rm -f conftest.err conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 -echo "${ECHO_T}$ac_header_preproc" >&6 +{ echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 +echo "${ECHO_T}$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_cxx_preproc_warn_flag in @@ -39962,25 +39214,19 @@ echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\ echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} - ( - cat <<\_ASBOX -## ----------------------------------------- ## -## Report this to the package-unused lists. ## -## ----------------------------------------- ## -_ASBOX - ) | - sed "s/^/$as_me: WARNING: /" >&2 + ;; esac -echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else eval "$as_ac_Header=\$ac_header_preproc" fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 +ac_res=`eval echo '${'$as_ac_Header'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } fi if test `eval echo '${'$as_ac_Header'}'` = yes; then @@ -39996,8 +39242,8 @@ done ac_c99_fenv_tr1=no; if test x"$ac_has_fenv_h" = x"yes"; then - echo "$as_me:$LINENO: checking for ISO C99 support to TR1 in " >&5 -echo $ECHO_N "checking for ISO C99 support to TR1 in ... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for ISO C99 support to TR1 in " >&5 +echo $ECHO_N "checking for ISO C99 support to TR1 in ... $ECHO_C" >&6; } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF @@ -40029,38 +39275,34 @@ int except, mode; } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then ac_c99_fenv_tr1=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -ac_c99_fenv_tr1=no + ac_c99_fenv_tr1=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi - echo "$as_me:$LINENO: result: $ac_c99_fenv_tr1" >&5 -echo "${ECHO_T}$ac_c99_fenv_tr1" >&6 + { echo "$as_me:$LINENO: result: $ac_c99_fenv_tr1" >&5 +echo "${ECHO_T}$ac_c99_fenv_tr1" >&6; } if test x"$ac_c99_fenv_tr1" = x"yes"; then cat >>confdefs.h <<\_ACEOF @@ -40070,8 +39312,8 @@ _ACEOF fi # Check for the existence of types. - echo "$as_me:$LINENO: checking for ISO C99 support to TR1 in " >&5 -echo $ECHO_N "checking for ISO C99 support to TR1 in ... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for ISO C99 support to TR1 in " >&5 +echo $ECHO_N "checking for ISO C99 support to TR1 in ... $ECHO_C" >&6; } if test "${ac_c99_stdint_tr1+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -40120,40 +39362,36 @@ typedef int8_t my_int8_t; } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then ac_c99_stdint_tr1=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -ac_c99_stdint_tr1=no + ac_c99_stdint_tr1=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi - echo "$as_me:$LINENO: result: $ac_c99_stdint_tr1" >&5 -echo "${ECHO_T}$ac_c99_stdint_tr1" >&6 + { echo "$as_me:$LINENO: result: $ac_c99_stdint_tr1" >&5 +echo "${ECHO_T}$ac_c99_stdint_tr1" >&6; } if test x"$ac_c99_stdint_tr1" = x"yes"; then cat >>confdefs.h <<\_ACEOF @@ -40163,8 +39401,8 @@ _ACEOF fi # Check for the existence of functions. - echo "$as_me:$LINENO: checking for ISO C99 support to TR1 in " >&5 -echo $ECHO_N "checking for ISO C99 support to TR1 in ... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for ISO C99 support to TR1 in " >&5 +echo $ECHO_N "checking for ISO C99 support to TR1 in ... $ECHO_C" >&6; } if test "${ac_c99_math_tr1+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -40292,40 +39530,36 @@ typedef double_t my_double_t; } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then ac_c99_math_tr1=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -ac_c99_math_tr1=no + ac_c99_math_tr1=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi - echo "$as_me:$LINENO: result: $ac_c99_math_tr1" >&5 -echo "${ECHO_T}$ac_c99_math_tr1" >&6 + { echo "$as_me:$LINENO: result: $ac_c99_math_tr1" >&5 +echo "${ECHO_T}$ac_c99_math_tr1" >&6; } if test x"$ac_c99_math_tr1" = x"yes"; then cat >>confdefs.h <<\_ACEOF @@ -40338,8 +39572,8 @@ _ACEOF # sense if the previous check fails, per C99, 7.8/1). ac_c99_inttypes_tr1=no; if test x"$ac_c99_stdint_tr1" = x"yes"; then - echo "$as_me:$LINENO: checking for ISO C99 support to TR1 in " >&5 -echo $ECHO_N "checking for ISO C99 support to TR1 in ... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for ISO C99 support to TR1 in " >&5 +echo $ECHO_N "checking for ISO C99 support to TR1 in ... $ECHO_C" >&6; } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF @@ -40363,38 +39597,34 @@ intmax_t i, numer, denom, base; } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then ac_c99_inttypes_tr1=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -ac_c99_inttypes_tr1=no + ac_c99_inttypes_tr1=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi - echo "$as_me:$LINENO: result: $ac_c99_inttypes_tr1" >&5 -echo "${ECHO_T}$ac_c99_inttypes_tr1" >&6 + { echo "$as_me:$LINENO: result: $ac_c99_inttypes_tr1" >&5 +echo "${ECHO_T}$ac_c99_inttypes_tr1" >&6; } if test x"$ac_c99_inttypes_tr1" = x"yes"; then cat >>confdefs.h <<\_ACEOF @@ -40408,18 +39638,19 @@ _ACEOF for ac_header in stdbool.h do as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + { echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 +ac_res=`eval echo '${'$as_ac_Header'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } else # Is the header compilable? -echo "$as_me:$LINENO: checking $ac_header usability" >&5 -echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking $ac_header usability" >&5 +echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6; } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF @@ -40430,41 +39661,37 @@ $ac_includes_default #include <$ac_header> _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then ac_header_compiler=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -ac_header_compiler=no + ac_header_compiler=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 -echo "${ECHO_T}$ac_header_compiler" >&6 + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +echo "${ECHO_T}$ac_header_compiler" >&6; } # Is the header present? -echo "$as_me:$LINENO: checking $ac_header presence" >&5 -echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking $ac_header presence" >&5 +echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6; } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF @@ -40473,24 +39700,22 @@ cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include <$ac_header> _ACEOF -if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 - (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 +if { (ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null; then - if test -s conftest.err; then - ac_cpp_err=$ac_cxx_preproc_warn_flag - ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag - else - ac_cpp_err= - fi -else - ac_cpp_err=yes -fi -if test -z "$ac_cpp_err"; then + (exit $ac_status); } >/dev/null && { + test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || + test ! -s conftest.err + }; then ac_header_preproc=yes else echo "$as_me: failed program was:" >&5 @@ -40498,9 +39723,10 @@ sed 's/^/| /' conftest.$ac_ext >&5 ac_header_preproc=no fi + rm -f conftest.err conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 -echo "${ECHO_T}$ac_header_preproc" >&6 +{ echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 +echo "${ECHO_T}$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_cxx_preproc_warn_flag in @@ -40524,25 +39750,19 @@ echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\ echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} - ( - cat <<\_ASBOX -## ----------------------------------------- ## -## Report this to the package-unused lists. ## -## ----------------------------------------- ## -_ASBOX - ) | - sed "s/^/$as_me: WARNING: /" >&2 + ;; esac -echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else eval "$as_ac_Header=\$ac_header_preproc" fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 +ac_res=`eval echo '${'$as_ac_Header'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } fi if test `eval echo '${'$as_ac_Header'}'` = yes; then @@ -40567,8 +39787,8 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu # For dev/random and dev/urandom for TR1. - echo "$as_me:$LINENO: checking for \"dev/random\" and \"dev/urandom\" for TR1 random_device" >&5 -echo $ECHO_N "checking for \"dev/random\" and \"dev/urandom\" for TR1 random_device... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for \"dev/random\" and \"dev/urandom\" for TR1 random_device" >&5 +echo $ECHO_N "checking for \"dev/random\" and \"dev/urandom\" for TR1 random_device... $ECHO_C" >&6; } if test "${ac_random_tr1+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -40591,13 +39811,22 @@ cat >>conftest.$ac_ext <<_ACEOF _ACEOF rm -f conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>&5 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='./conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then @@ -40610,13 +39839,15 @@ sed 's/^/| /' conftest.$ac_ext >&5 ( exit $ac_status ) ac_random_tr1=no fi -rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext fi + + fi - echo "$as_me:$LINENO: result: $ac_random_tr1" >&5 -echo "${ECHO_T}$ac_random_tr1" >&6 + { echo "$as_me:$LINENO: result: $ac_random_tr1" >&5 +echo "${ECHO_T}$ac_random_tr1" >&6; } if test x"$ac_random_tr1" = x"yes"; then cat >>confdefs.h <<\_ACEOF @@ -40629,10 +39860,9 @@ _ACEOF # For TLS support. - # Check whether --enable-tls or --disable-tls was given. + # Check whether --enable-tls was given. if test "${enable_tls+set}" = set; then - enableval="$enable_tls" - + enableval=$enable_tls; case "$enableval" in yes|no) ;; *) { { echo "$as_me:$LINENO: error: Argument to enable/disable tls must be yes or no" >&5 @@ -40642,10 +39872,11 @@ echo "$as_me: error: Argument to enable/disable tls must be yes or no" >&2;} else enable_tls=yes -fi; +fi - echo "$as_me:$LINENO: checking whether the target supports thread-local storage" >&5 -echo $ECHO_N "checking whether the target supports thread-local storage... $ECHO_C" >&6 + + { echo "$as_me:$LINENO: checking whether the target supports thread-local storage" >&5 +echo $ECHO_N "checking whether the target supports thread-local storage... $ECHO_C" >&6; } if test "${gcc_cv_have_tls+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -40660,35 +39891,32 @@ cat >conftest.$ac_ext <<_ACEOF __thread int a; int b; int main() { return a = b; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then gcc_cv_have_tls=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -gcc_cv_have_tls=no + gcc_cv_have_tls=no fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext @@ -40697,13 +39925,22 @@ else __thread int a; int b; int main() { return a = b; } _ACEOF rm -f conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>&5 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='./conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then @@ -40718,27 +39955,23 @@ cat >conftest.$ac_ext <<_ACEOF int main() { return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then if test "$cross_compiling" = yes; then { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling See \`config.log' for more details." >&5 @@ -40750,13 +39983,22 @@ else __thread int a; int b; int main() { return a = b; } _ACEOF rm -f conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>&5 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='./conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then @@ -40769,15 +40011,18 @@ sed 's/^/| /' conftest.$ac_ext >&5 ( exit $ac_status ) gcc_cv_have_tls=no fi -rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext fi + + else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -gcc_cv_have_tls=yes + gcc_cv_have_tls=yes fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext LDFLAGS="$chktls_save_LDFLAGS" if test $gcc_cv_have_tls = yes; then @@ -40807,34 +40052,32 @@ pthread_t t; pthread_create(&t,NULL,g,NULL); } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then thread_CFLAGS="$flag" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 + fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext if test "X$thread_CFLAGS" != Xfailed; then break @@ -40883,13 +40126,22 @@ pthread_t thread; } _ACEOF rm -f conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>&5 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='./conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then @@ -40902,8 +40154,10 @@ sed 's/^/| /' conftest.$ac_ext >&5 ( exit $ac_status ) gcc_cv_have_tls=no fi -rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext fi + + CFLAGS="$chktls_save_CFLAGS" fi fi @@ -40915,11 +40169,13 @@ sed 's/^/| /' conftest.$ac_ext >&5 ( exit $ac_status ) gcc_cv_have_tls=no fi -rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext fi + + fi -echo "$as_me:$LINENO: result: $gcc_cv_have_tls" >&5 -echo "${ECHO_T}$gcc_cv_have_tls" >&6 +{ echo "$as_me:$LINENO: result: $gcc_cv_have_tls" >&5 +echo "${ECHO_T}$gcc_cv_have_tls" >&6; } if test "$enable_tls $gcc_cv_have_tls" = "yes yes"; then cat >>confdefs.h <<\_ACEOF @@ -40931,8 +40187,7 @@ _ACEOF # For _Unwind_GetIPInfo. - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -40940,8 +40195,8 @@ ac_compiler_gnu=$ac_cv_cxx_compiler_gnu ac_save_CXXFLAGS="$CXXFLAGS" CXXFLAGS="$CXXFLAGS -fno-exceptions" - echo "$as_me:$LINENO: checking for _Unwind_GetIPInfo" >&5 -echo $ECHO_N "checking for _Unwind_GetIPInfo... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for _Unwind_GetIPInfo" >&5 +echo $ECHO_N "checking for _Unwind_GetIPInfo... $ECHO_C" >&6; } if test "${gcc_cv_getipinfo+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -40967,35 +40222,32 @@ _Unwind_GetIPInfo(); } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then gcc_cv_getipinfo=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -gcc_cv_getipinfo=no + gcc_cv_getipinfo=no fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi @@ -41007,8 +40259,8 @@ cat >>confdefs.h <<\_ACEOF _ACEOF fi - echo "$as_me:$LINENO: result: $gcc_cv_getipinfo" >&5 -echo "${ECHO_T}$gcc_cv_getipinfo" >&6 + { echo "$as_me:$LINENO: result: $gcc_cv_getipinfo" >&5 +echo "${ECHO_T}$gcc_cv_getipinfo" >&6; } CXXFLAGS="$ac_save_CXXFLAGS" ac_ext=c ac_cpp='$CPP $CPPFLAGS' @@ -41020,17 +40272,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu if test "${ac_cv_header_locale_h+set}" = set; then - echo "$as_me:$LINENO: checking for locale.h" >&5 -echo $ECHO_N "checking for locale.h... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for locale.h" >&5 +echo $ECHO_N "checking for locale.h... $ECHO_C" >&6; } if test "${ac_cv_header_locale_h+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 fi -echo "$as_me:$LINENO: result: $ac_cv_header_locale_h" >&5 -echo "${ECHO_T}$ac_cv_header_locale_h" >&6 +{ echo "$as_me:$LINENO: result: $ac_cv_header_locale_h" >&5 +echo "${ECHO_T}$ac_cv_header_locale_h" >&6; } else # Is the header compilable? -echo "$as_me:$LINENO: checking locale.h usability" >&5 -echo $ECHO_N "checking locale.h usability... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking locale.h usability" >&5 +echo $ECHO_N "checking locale.h usability... $ECHO_C" >&6; } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF @@ -41041,41 +40293,37 @@ $ac_includes_default #include _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then ac_header_compiler=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -ac_header_compiler=no + ac_header_compiler=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 -echo "${ECHO_T}$ac_header_compiler" >&6 + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +echo "${ECHO_T}$ac_header_compiler" >&6; } # Is the header present? -echo "$as_me:$LINENO: checking locale.h presence" >&5 -echo $ECHO_N "checking locale.h presence... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking locale.h presence" >&5 +echo $ECHO_N "checking locale.h presence... $ECHO_C" >&6; } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF @@ -41084,24 +40332,22 @@ cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF -if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 - (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 +if { (ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null; then - if test -s conftest.err; then - ac_cpp_err=$ac_c_preproc_warn_flag - ac_cpp_err=$ac_cpp_err$ac_c_werror_flag - else - ac_cpp_err= - fi -else - ac_cpp_err=yes -fi -if test -z "$ac_cpp_err"; then + (exit $ac_status); } >/dev/null && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then ac_header_preproc=yes else echo "$as_me: failed program was:" >&5 @@ -41109,9 +40355,10 @@ sed 's/^/| /' conftest.$ac_ext >&5 ac_header_preproc=no fi + rm -f conftest.err conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 -echo "${ECHO_T}$ac_header_preproc" >&6 +{ echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 +echo "${ECHO_T}$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in @@ -41135,31 +40382,24 @@ echo "$as_me: WARNING: locale.h: section \"Present But Cannot Be Compiled\"" echo "$as_me: WARNING: locale.h: proceeding with the preprocessor's result" >&2;} { echo "$as_me:$LINENO: WARNING: locale.h: in the future, the compiler will take precedence" >&5 echo "$as_me: WARNING: locale.h: in the future, the compiler will take precedence" >&2;} - ( - cat <<\_ASBOX -## ----------------------------------------- ## -## Report this to the package-unused lists. ## -## ----------------------------------------- ## -_ASBOX - ) | - sed "s/^/$as_me: WARNING: /" >&2 + ;; esac -echo "$as_me:$LINENO: checking for locale.h" >&5 -echo $ECHO_N "checking for locale.h... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking for locale.h" >&5 +echo $ECHO_N "checking for locale.h... $ECHO_C" >&6; } if test "${ac_cv_header_locale_h+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_cv_header_locale_h=$ac_header_preproc fi -echo "$as_me:$LINENO: result: $ac_cv_header_locale_h" >&5 -echo "${ECHO_T}$ac_cv_header_locale_h" >&6 +{ echo "$as_me:$LINENO: result: $ac_cv_header_locale_h" >&5 +echo "${ECHO_T}$ac_cv_header_locale_h" >&6; } fi if test $ac_cv_header_locale_h = yes; then - echo "$as_me:$LINENO: checking for LC_MESSAGES" >&5 -echo $ECHO_N "checking for LC_MESSAGES... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for LC_MESSAGES" >&5 +echo $ECHO_N "checking for LC_MESSAGES... $ECHO_C" >&6; } if test "${ac_cv_val_LC_MESSAGES+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -41184,39 +40424,36 @@ return LC_MESSAGES } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then ac_cv_val_LC_MESSAGES=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -ac_cv_val_LC_MESSAGES=no + ac_cv_val_LC_MESSAGES=no fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: $ac_cv_val_LC_MESSAGES" >&5 -echo "${ECHO_T}$ac_cv_val_LC_MESSAGES" >&6 +{ echo "$as_me:$LINENO: result: $ac_cv_val_LC_MESSAGES" >&5 +echo "${ECHO_T}$ac_cv_val_LC_MESSAGES" >&6; } if test $ac_cv_val_LC_MESSAGES = yes; then cat >>confdefs.h <<\_ACEOF @@ -41249,27 +40486,22 @@ sigjmp_buf env; } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then cat >>confdefs.h <<\_ACEOF #define HAVE_SIGSETJMP 1 @@ -41279,8 +40511,10 @@ else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 + fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test x$gcc_no_link = xyes; then if test "x${ac_cv_func_mmap_fixed_mapped+set}" != xset; then @@ -41293,18 +40527,19 @@ if test "x${ac_cv_func_mmap_fixed_mapped}" != xno; then for ac_header in stdlib.h unistd.h do as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + { echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 +ac_res=`eval echo '${'$as_ac_Header'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } else # Is the header compilable? -echo "$as_me:$LINENO: checking $ac_header usability" >&5 -echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking $ac_header usability" >&5 +echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6; } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF @@ -41315,41 +40550,37 @@ $ac_includes_default #include <$ac_header> _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then ac_header_compiler=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -ac_header_compiler=no + ac_header_compiler=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 -echo "${ECHO_T}$ac_header_compiler" >&6 + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +echo "${ECHO_T}$ac_header_compiler" >&6; } # Is the header present? -echo "$as_me:$LINENO: checking $ac_header presence" >&5 -echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking $ac_header presence" >&5 +echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6; } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF @@ -41358,24 +40589,22 @@ cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include <$ac_header> _ACEOF -if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 - (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 +if { (ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null; then - if test -s conftest.err; then - ac_cpp_err=$ac_c_preproc_warn_flag - ac_cpp_err=$ac_cpp_err$ac_c_werror_flag - else - ac_cpp_err= - fi -else - ac_cpp_err=yes -fi -if test -z "$ac_cpp_err"; then + (exit $ac_status); } >/dev/null && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then ac_header_preproc=yes else echo "$as_me: failed program was:" >&5 @@ -41383,9 +40612,10 @@ sed 's/^/| /' conftest.$ac_ext >&5 ac_header_preproc=no fi + rm -f conftest.err conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 -echo "${ECHO_T}$ac_header_preproc" >&6 +{ echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 +echo "${ECHO_T}$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in @@ -41409,25 +40639,19 @@ echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\ echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} - ( - cat <<\_ASBOX -## ----------------------------------------- ## -## Report this to the package-unused lists. ## -## ----------------------------------------- ## -_ASBOX - ) | - sed "s/^/$as_me: WARNING: /" >&2 + ;; esac -echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else eval "$as_ac_Header=\$ac_header_preproc" fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 +ac_res=`eval echo '${'$as_ac_Header'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } fi if test `eval echo '${'$as_ac_Header'}'` = yes; then @@ -41443,9 +40667,9 @@ done for ac_func in getpagesize do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -41476,68 +40700,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -41546,8 +40762,8 @@ _ACEOF fi done -echo "$as_me:$LINENO: checking for working mmap" >&5 -echo $ECHO_N "checking for working mmap... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking for working mmap" >&5 +echo $ECHO_N "checking for working mmap... $ECHO_C" >&6; } if test "${ac_cv_func_mmap_fixed_mapped+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -41589,21 +40805,21 @@ $ac_includes_default #include #include -#if !STDC_HEADERS && !HAVE_STDLIB_H +#if !defined STDC_HEADERS && !defined HAVE_STDLIB_H char *malloc (); #endif /* This mess was copied from the GNU getpagesize.h. */ -#if !HAVE_GETPAGESIZE +#ifndef HAVE_GETPAGESIZE /* Assume that all systems that can run configure have sys/param.h. */ -# if !HAVE_SYS_PARAM_H +# ifndef HAVE_SYS_PARAM_H # define HAVE_SYS_PARAM_H 1 # endif # ifdef _SC_PAGESIZE # define getpagesize() sysconf(_SC_PAGESIZE) # else /* no _SC_PAGESIZE */ -# if HAVE_SYS_PARAM_H +# ifdef HAVE_SYS_PARAM_H # include # ifdef EXEC_PAGESIZE # define getpagesize() EXEC_PAGESIZE @@ -41642,15 +40858,15 @@ main () /* First, make a file with some known garbage in it. */ data = (char *) malloc (pagesize); if (!data) - exit (1); + return 1; for (i = 0; i < pagesize; ++i) *(data + i) = rand (); umask (0); fd = creat ("conftest.mmap", 0600); if (fd < 0) - exit (1); + return 1; if (write (fd, data, pagesize) != pagesize) - exit (1); + return 1; close (fd); /* Next, try to mmap the file at a fixed address which already has @@ -41658,17 +40874,17 @@ main () we see the same garbage. */ fd = open ("conftest.mmap", O_RDWR); if (fd < 0) - exit (1); + return 1; data2 = (char *) malloc (2 * pagesize); if (!data2) - exit (1); - data2 += (pagesize - ((long) data2 & (pagesize - 1))) & (pagesize - 1); + return 1; + data2 += (pagesize - ((long int) data2 & (pagesize - 1))) & (pagesize - 1); if (data2 != mmap (data2, pagesize, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_FIXED, fd, 0L)) - exit (1); + return 1; for (i = 0; i < pagesize; ++i) if (*(data + i) != *(data2 + i)) - exit (1); + return 1; /* Finally, make sure that changes to the mapped area do not percolate back to the file as seen by read(). (This is a bug on @@ -41677,24 +40893,33 @@ main () *(data2 + i) = *(data2 + i) + 1; data3 = (char *) malloc (pagesize); if (!data3) - exit (1); + return 1; if (read (fd, data3, pagesize) != pagesize) - exit (1); + return 1; for (i = 0; i < pagesize; ++i) if (*(data + i) != *(data3 + i)) - exit (1); + return 1; close (fd); - exit (0); + return 0; } _ACEOF rm -f conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>&5 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='./conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then @@ -41707,11 +40932,13 @@ sed 's/^/| /' conftest.$ac_ext >&5 ( exit $ac_status ) ac_cv_func_mmap_fixed_mapped=no fi -rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext fi + + fi -echo "$as_me:$LINENO: result: $ac_cv_func_mmap_fixed_mapped" >&5 -echo "${ECHO_T}$ac_cv_func_mmap_fixed_mapped" >&6 +{ echo "$as_me:$LINENO: result: $ac_cv_func_mmap_fixed_mapped" >&5 +echo "${ECHO_T}$ac_cv_func_mmap_fixed_mapped" >&6; } if test $ac_cv_func_mmap_fixed_mapped = yes; then cat >>confdefs.h <<\_ACEOF @@ -41741,13 +40968,13 @@ fi prefix="$acl_save_prefix" -# Check whether --with-gnu-ld or --without-gnu-ld was given. +# Check whether --with-gnu-ld was given. if test "${with_gnu_ld+set}" = set; then - withval="$with_gnu_ld" - test "$withval" = no || with_gnu_ld=yes + withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes else with_gnu_ld=no -fi; +fi + # Prepare PATH_SEPARATOR. # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then @@ -41764,8 +40991,8 @@ fi ac_prog=ld if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. - echo "$as_me:$LINENO: checking for ld used by GCC" >&5 -echo $ECHO_N "checking for ld used by GCC... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for ld used by GCC" >&5 +echo $ECHO_N "checking for ld used by GCC... $ECHO_C" >&6; } case $host in *-*-mingw*) # gcc leaves a trailing carriage return which upsets mingw @@ -41794,11 +41021,11 @@ echo $ECHO_N "checking for ld used by GCC... $ECHO_C" >&6 ;; esac elif test "$with_gnu_ld" = yes; then - echo "$as_me:$LINENO: checking for GNU ld" >&5 -echo $ECHO_N "checking for GNU ld... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for GNU ld" >&5 +echo $ECHO_N "checking for GNU ld... $ECHO_C" >&6; } else - echo "$as_me:$LINENO: checking for non-GNU ld" >&5 -echo $ECHO_N "checking for non-GNU ld... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for non-GNU ld" >&5 +echo $ECHO_N "checking for non-GNU ld... $ECHO_C" >&6; } fi if test "${acl_cv_path_LD+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 @@ -41827,17 +41054,17 @@ fi LD="$acl_cv_path_LD" if test -n "$LD"; then - echo "$as_me:$LINENO: result: $LD" >&5 -echo "${ECHO_T}$LD" >&6 + { echo "$as_me:$LINENO: result: $LD" >&5 +echo "${ECHO_T}$LD" >&6; } else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } fi test -z "$LD" && { { echo "$as_me:$LINENO: error: no acceptable ld found in \$PATH" >&5 echo "$as_me: error: no acceptable ld found in \$PATH" >&2;} { (exit 1); exit 1; }; } -echo "$as_me:$LINENO: checking if the linker ($LD) is GNU ld" >&5 -echo $ECHO_N "checking if the linker ($LD) is GNU ld... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking if the linker ($LD) is GNU ld" >&5 +echo $ECHO_N "checking if the linker ($LD) is GNU ld... $ECHO_C" >&6; } if test "${acl_cv_prog_gnu_ld+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -41848,14 +41075,14 @@ else acl_cv_prog_gnu_ld=no fi fi -echo "$as_me:$LINENO: result: $acl_cv_prog_gnu_ld" >&5 -echo "${ECHO_T}$acl_cv_prog_gnu_ld" >&6 +{ echo "$as_me:$LINENO: result: $acl_cv_prog_gnu_ld" >&5 +echo "${ECHO_T}$acl_cv_prog_gnu_ld" >&6; } with_gnu_ld=$acl_cv_prog_gnu_ld - echo "$as_me:$LINENO: checking for shared library run path origin" >&5 -echo $ECHO_N "checking for shared library run path origin... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for shared library run path origin" >&5 +echo $ECHO_N "checking for shared library run path origin... $ECHO_C" >&6; } if test "${acl_cv_rpath+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -41867,8 +41094,8 @@ else acl_cv_rpath=done fi -echo "$as_me:$LINENO: result: $acl_cv_rpath" >&5 -echo "${ECHO_T}$acl_cv_rpath" >&6 +{ echo "$as_me:$LINENO: result: $acl_cv_rpath" >&5 +echo "${ECHO_T}$acl_cv_rpath" >&6; } wl="$acl_cv_wl" libext="$acl_cv_libext" shlibext="$acl_cv_shlibext" @@ -41876,13 +41103,13 @@ echo "${ECHO_T}$acl_cv_rpath" >&6 hardcode_libdir_separator="$acl_cv_hardcode_libdir_separator" hardcode_direct="$acl_cv_hardcode_direct" hardcode_minus_L="$acl_cv_hardcode_minus_L" - # Check whether --enable-rpath or --disable-rpath was given. + # Check whether --enable-rpath was given. if test "${enable_rpath+set}" = set; then - enableval="$enable_rpath" - : + enableval=$enable_rpath; : else enable_rpath=yes -fi; +fi + @@ -41904,10 +41131,9 @@ fi; prefix="$acl_save_prefix" -# Check whether --with-libiconv-prefix or --without-libiconv-prefix was given. +# Check whether --with-libiconv-prefix was given. if test "${with_libiconv_prefix+set}" = set; then - withval="$with_libiconv_prefix" - + withval=$with_libiconv_prefix; if test "X$withval" = "Xno"; then use_additional=no else @@ -41930,7 +41156,8 @@ if test "${with_libiconv_prefix+set}" = set; then fi fi -fi; +fi + LIBICONV= LTLIBICONV= INCICONV= @@ -42297,8 +41524,8 @@ fi; done - echo "$as_me:$LINENO: checking for iconv" >&5 -echo $ECHO_N "checking for iconv... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for iconv" >&5 +echo $ECHO_N "checking for iconv... $ECHO_C" >&6; } if test "${am_cv_func_iconv+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -42329,34 +41556,32 @@ iconv_t cd = iconv_open("",""); } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then am_cv_func_iconv=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 + fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext if test "$am_cv_func_iconv" != yes; then am_save_LIBS="$LIBS" @@ -42385,42 +41610,40 @@ iconv_t cd = iconv_open("",""); } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then am_cv_lib_iconv=yes am_cv_func_iconv=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 + fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext LIBS="$am_save_LIBS" fi fi -echo "$as_me:$LINENO: result: $am_cv_func_iconv" >&5 -echo "${ECHO_T}$am_cv_func_iconv" >&6 +{ echo "$as_me:$LINENO: result: $am_cv_func_iconv" >&5 +echo "${ECHO_T}$am_cv_func_iconv" >&6; } if test "$am_cv_func_iconv" = yes; then cat >>confdefs.h <<\_ACEOF @@ -42429,10 +41652,10 @@ _ACEOF fi if test "$am_cv_lib_iconv" = yes; then - echo "$as_me:$LINENO: checking how to link with libiconv" >&5 -echo $ECHO_N "checking how to link with libiconv... $ECHO_C" >&6 - echo "$as_me:$LINENO: result: $LIBICONV" >&5 -echo "${ECHO_T}$LIBICONV" >&6 + { echo "$as_me:$LINENO: checking how to link with libiconv" >&5 +echo $ECHO_N "checking how to link with libiconv... $ECHO_C" >&6; } + { echo "$as_me:$LINENO: result: $LIBICONV" >&5 +echo "${ECHO_T}$LIBICONV" >&6; } else CPPFLAGS="$am_save_CPPFLAGS" LIBICONV= @@ -42442,8 +41665,8 @@ echo "${ECHO_T}$LIBICONV" >&6 if test "$am_cv_func_iconv" = yes; then - echo "$as_me:$LINENO: checking for iconv declaration" >&5 -echo $ECHO_N "checking for iconv declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for iconv declaration" >&5 +echo $ECHO_N "checking for iconv declaration... $ECHO_C" >&6; } if test "${am_cv_proto_iconv+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -42476,43 +41699,39 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then am_cv_proto_iconv_arg1="" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -am_cv_proto_iconv_arg1="const" + am_cv_proto_iconv_arg1="const" fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext am_cv_proto_iconv="extern size_t iconv (iconv_t cd, $am_cv_proto_iconv_arg1 char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft);" fi am_cv_proto_iconv=`echo "$am_cv_proto_iconv" | tr -s ' ' | sed -e 's/( /(/'` - echo "$as_me:$LINENO: result: ${ac_t:- + { echo "$as_me:$LINENO: result: ${ac_t:- }$am_cv_proto_iconv" >&5 echo "${ECHO_T}${ac_t:- - }$am_cv_proto_iconv" >&6 + }$am_cv_proto_iconv" >&6; } cat >>confdefs.h <<_ACEOF #define ICONV_CONST $am_cv_proto_iconv_arg1 @@ -42713,18 +41932,19 @@ for ac_header in float.h inttypes.h locale.h \ sys/stat.h sys/time.h sys/types.h sys/uio.h do as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + { echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 +ac_res=`eval echo '${'$as_ac_Header'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } else # Is the header compilable? -echo "$as_me:$LINENO: checking $ac_header usability" >&5 -echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking $ac_header usability" >&5 +echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6; } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF @@ -42735,41 +41955,37 @@ $ac_includes_default #include <$ac_header> _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then ac_header_compiler=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -ac_header_compiler=no + ac_header_compiler=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 -echo "${ECHO_T}$ac_header_compiler" >&6 + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +echo "${ECHO_T}$ac_header_compiler" >&6; } # Is the header present? -echo "$as_me:$LINENO: checking $ac_header presence" >&5 -echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking $ac_header presence" >&5 +echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6; } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF @@ -42778,24 +41994,22 @@ cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include <$ac_header> _ACEOF -if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 - (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 +if { (ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null; then - if test -s conftest.err; then - ac_cpp_err=$ac_c_preproc_warn_flag - ac_cpp_err=$ac_cpp_err$ac_c_werror_flag - else - ac_cpp_err= - fi -else - ac_cpp_err=yes -fi -if test -z "$ac_cpp_err"; then + (exit $ac_status); } >/dev/null && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then ac_header_preproc=yes else echo "$as_me: failed program was:" >&5 @@ -42803,9 +42017,10 @@ sed 's/^/| /' conftest.$ac_ext >&5 ac_header_preproc=no fi + rm -f conftest.err conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 -echo "${ECHO_T}$ac_header_preproc" >&6 +{ echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 +echo "${ECHO_T}$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in @@ -42829,25 +42044,19 @@ echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\ echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} - ( - cat <<\_ASBOX -## ----------------------------------------- ## -## Report this to the package-unused lists. ## -## ----------------------------------------- ## -_ASBOX - ) | - sed "s/^/$as_me: WARNING: /" >&2 + ;; esac -echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else eval "$as_ac_Header=\$ac_header_preproc" fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 +ac_res=`eval echo '${'$as_ac_Header'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } fi if test `eval echo '${'$as_ac_Header'}'` = yes; then @@ -42866,8 +42075,7 @@ done # The CXXFLAGS thing is suspicious, but based on similar bits previously # found in GLIBCXX_CONFIGURE. - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -42884,8 +42092,8 @@ ac_compiler_gnu=$ac_cv_cxx_compiler_gnu fi # Check for -ffunction-sections -fdata-sections - echo "$as_me:$LINENO: checking for g++ that supports -ffunction-sections -fdata-sections" >&5 -echo $ECHO_N "checking for g++ that supports -ffunction-sections -fdata-sections... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for g++ that supports -ffunction-sections -fdata-sections" >&5 +echo $ECHO_N "checking for g++ that supports -ffunction-sections -fdata-sections... $ECHO_C" >&6; } CXXFLAGS='-g -Werror -ffunction-sections -fdata-sections' cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ @@ -42903,35 +42111,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then ac_fdsections=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -ac_fdsections=no + ac_fdsections=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test "$ac_test_CXXFLAGS" = set; then CXXFLAGS="$ac_save_CXXFLAGS" else @@ -42941,8 +42145,8 @@ rm -f conftest.err conftest.$ac_objext conftest.$ac_ext if test x"$ac_fdsections" = x"yes"; then SECTION_FLAGS='-ffunction-sections -fdata-sections' fi - echo "$as_me:$LINENO: result: $ac_fdsections" >&5 -echo "${ECHO_T}$ac_fdsections" >&6 + { echo "$as_me:$LINENO: result: $ac_fdsections" >&5 +echo "${ECHO_T}$ac_fdsections" >&6; } ac_ext=c ac_cpp='$CPP $CPPFLAGS' @@ -42980,16 +42184,16 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu # Start by getting the version number. I think the libtool test already # does some of this, but throws away the result. if test x"$with_gnu_ld" = x"yes"; then - echo "$as_me:$LINENO: checking for ld version" >&5 -echo $ECHO_N "checking for ld version... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for ld version" >&5 +echo $ECHO_N "checking for ld version... $ECHO_C" >&6; } ldver=`$LD --version 2>/dev/null | head -1 | \ sed -e 's/GNU ld \(version \)\{0,1\}\(([^)]*) \)\{0,1\}\([0-9.][0-9.]*\).*/\3/'` glibcxx_gnu_ld_version=`echo $ldver | \ $AWK -F. '{ if (NF<3) $3=0; print ($1*100+$2)*100+$3 }'` - echo "$as_me:$LINENO: result: $glibcxx_gnu_ld_version" >&5 -echo "${ECHO_T}$glibcxx_gnu_ld_version" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_gnu_ld_version" >&5 +echo "${ECHO_T}$glibcxx_gnu_ld_version" >&6; } fi # Set --gc-sections. @@ -43006,8 +42210,8 @@ echo "${ECHO_T}$glibcxx_gnu_ld_version" >&6 CFLAGS='-Wl,--gc-sections' # Check for -Wl,--gc-sections - echo "$as_me:$LINENO: checking for ld that supports -Wl,--gc-sections" >&5 -echo $ECHO_N "checking for ld that supports -Wl,--gc-sections... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for ld that supports -Wl,--gc-sections" >&5 +echo $ECHO_N "checking for ld that supports -Wl,--gc-sections... $ECHO_C" >&6; } if test x$gcc_no_link = xyes; then { { echo "$as_me:$LINENO: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&5 echo "$as_me: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&2;} @@ -43031,35 +42235,32 @@ main () } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then ac_gcsections=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -ac_gcsections=no + ac_gcsections=no fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext if test "$ac_gcsections" = "yes"; then rm -f conftest.c @@ -43075,8 +42276,8 @@ rm -f conftest.err conftest.$ac_objext \ if test "$ac_gcsections" = "yes"; then SECTION_LDFLAGS="-Wl,--gc-sections $SECTION_LDFLAGS" fi - echo "$as_me:$LINENO: result: $ac_gcsections" >&5 -echo "${ECHO_T}$ac_gcsections" >&6 + { echo "$as_me:$LINENO: result: $ac_gcsections" >&5 +echo "${ECHO_T}$ac_gcsections" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS="$ac_save_CFLAGS" @@ -43090,15 +42291,15 @@ echo "${ECHO_T}$ac_gcsections" >&6 # Note this is only for shared objects. ac_ld_relro=no if test x"$with_gnu_ld" = x"yes"; then - echo "$as_me:$LINENO: checking for ld that supports -Wl,-z,relro" >&5 -echo $ECHO_N "checking for ld that supports -Wl,-z,relro... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for ld that supports -Wl,-z,relro" >&5 +echo $ECHO_N "checking for ld that supports -Wl,-z,relro... $ECHO_C" >&6; } cxx_z_relo=`$LD -v --help 2>/dev/null | grep "z relro"` if test -n "$cxx_z_relo"; then OPT_LDFLAGS="-Wl,-z,relro" ac_ld_relro=yes fi - echo "$as_me:$LINENO: result: $ac_ld_relro" >&5 -echo "${ECHO_T}$ac_ld_relro" >&6 + { echo "$as_me:$LINENO: result: $ac_ld_relro" >&5 +echo "${ECHO_T}$ac_ld_relro" >&6; } fi # Set linker optimization flags. @@ -43114,8 +42315,8 @@ echo "${ECHO_T}$ac_ld_relro" >&6 ac_save_CXXFLAGS="$CXXFLAGS" CXXFLAGS='-fno-builtin -D_GNU_SOURCE' - echo "$as_me:$LINENO: checking for sin in -lm" >&5 -echo $ECHO_N "checking for sin in -lm... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for sin in -lm" >&5 +echo $ECHO_N "checking for sin in -lm... $ECHO_C" >&6; } if test "${ac_cv_lib_m_sin+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -43133,56 +42334,53 @@ cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char sin (); int main () { -sin (); +return sin (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then ac_cv_lib_m_sin=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -ac_cv_lib_m_sin=no + ac_cv_lib_m_sin=no fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -echo "$as_me:$LINENO: result: $ac_cv_lib_m_sin" >&5 -echo "${ECHO_T}$ac_cv_lib_m_sin" >&6 +{ echo "$as_me:$LINENO: result: $ac_cv_lib_m_sin" >&5 +echo "${ECHO_T}$ac_cv_lib_m_sin" >&6; } if test $ac_cv_lib_m_sin = yes; then libm="-lm" fi @@ -43192,16 +42390,15 @@ fi - echo "$as_me:$LINENO: checking for isinf declaration" >&5 -echo $ECHO_N "checking for isinf declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for isinf declaration" >&5 +echo $ECHO_N "checking for isinf declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func_isinf_use+set} != xset; then if test "${glibcxx_cv_func_isinf_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -43227,35 +42424,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func_isinf_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_isinf_use=no + glibcxx_cv_func_isinf_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -43266,17 +42459,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_isinf_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_isinf_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_isinf_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_isinf_use" >&6; } if test x$glibcxx_cv_func_isinf_use = x"yes"; then for ac_func in isinf do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -43307,68 +42500,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -43379,16 +42564,15 @@ done else - echo "$as_me:$LINENO: checking for _isinf declaration" >&5 -echo $ECHO_N "checking for _isinf declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for _isinf declaration" >&5 +echo $ECHO_N "checking for _isinf declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func__isinf_use+set} != xset; then if test "${glibcxx_cv_func__isinf_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -43414,35 +42598,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func__isinf_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func__isinf_use=no + glibcxx_cv_func__isinf_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -43453,17 +42633,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__isinf_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__isinf_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__isinf_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__isinf_use" >&6; } if test x$glibcxx_cv_func__isinf_use = x"yes"; then for ac_func in _isinf do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -43494,68 +42674,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -43572,16 +42744,15 @@ done - echo "$as_me:$LINENO: checking for isnan declaration" >&5 -echo $ECHO_N "checking for isnan declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for isnan declaration" >&5 +echo $ECHO_N "checking for isnan declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func_isnan_use+set} != xset; then if test "${glibcxx_cv_func_isnan_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -43607,35 +42778,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func_isnan_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_isnan_use=no + glibcxx_cv_func_isnan_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -43646,17 +42813,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_isnan_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_isnan_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_isnan_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_isnan_use" >&6; } if test x$glibcxx_cv_func_isnan_use = x"yes"; then for ac_func in isnan do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -43687,68 +42854,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -43759,16 +42918,15 @@ done else - echo "$as_me:$LINENO: checking for _isnan declaration" >&5 -echo $ECHO_N "checking for _isnan declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for _isnan declaration" >&5 +echo $ECHO_N "checking for _isnan declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func__isnan_use+set} != xset; then if test "${glibcxx_cv_func__isnan_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -43794,35 +42952,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func__isnan_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func__isnan_use=no + glibcxx_cv_func__isnan_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -43833,17 +42987,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__isnan_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__isnan_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__isnan_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__isnan_use" >&6; } if test x$glibcxx_cv_func__isnan_use = x"yes"; then for ac_func in _isnan do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -43874,68 +43028,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -43952,16 +43098,15 @@ done - echo "$as_me:$LINENO: checking for finite declaration" >&5 -echo $ECHO_N "checking for finite declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for finite declaration" >&5 +echo $ECHO_N "checking for finite declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func_finite_use+set} != xset; then if test "${glibcxx_cv_func_finite_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -43987,35 +43132,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func_finite_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_finite_use=no + glibcxx_cv_func_finite_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -44026,17 +43167,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_finite_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_finite_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_finite_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_finite_use" >&6; } if test x$glibcxx_cv_func_finite_use = x"yes"; then for ac_func in finite do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -44067,68 +43208,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -44139,16 +43272,15 @@ done else - echo "$as_me:$LINENO: checking for _finite declaration" >&5 -echo $ECHO_N "checking for _finite declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for _finite declaration" >&5 +echo $ECHO_N "checking for _finite declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func__finite_use+set} != xset; then if test "${glibcxx_cv_func__finite_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -44174,35 +43306,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func__finite_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func__finite_use=no + glibcxx_cv_func__finite_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -44213,17 +43341,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__finite_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__finite_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__finite_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__finite_use" >&6; } if test x$glibcxx_cv_func__finite_use = x"yes"; then for ac_func in _finite do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -44254,68 +43382,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -44332,16 +43452,15 @@ done - echo "$as_me:$LINENO: checking for copysign declaration" >&5 -echo $ECHO_N "checking for copysign declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for copysign declaration" >&5 +echo $ECHO_N "checking for copysign declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func_copysign_use+set} != xset; then if test "${glibcxx_cv_func_copysign_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -44363,35 +43482,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func_copysign_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_copysign_use=no + glibcxx_cv_func_copysign_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -44402,17 +43517,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_copysign_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_copysign_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_copysign_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_copysign_use" >&6; } if test x$glibcxx_cv_func_copysign_use = x"yes"; then for ac_func in copysign do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -44443,68 +43558,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -44515,16 +43622,15 @@ done else - echo "$as_me:$LINENO: checking for _copysign declaration" >&5 -echo $ECHO_N "checking for _copysign declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for _copysign declaration" >&5 +echo $ECHO_N "checking for _copysign declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func__copysign_use+set} != xset; then if test "${glibcxx_cv_func__copysign_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -44546,35 +43652,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func__copysign_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func__copysign_use=no + glibcxx_cv_func__copysign_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -44585,17 +43687,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__copysign_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__copysign_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__copysign_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__copysign_use" >&6; } if test x$glibcxx_cv_func__copysign_use = x"yes"; then for ac_func in _copysign do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -44626,68 +43728,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -44704,16 +43798,15 @@ done - echo "$as_me:$LINENO: checking for sincos declaration" >&5 -echo $ECHO_N "checking for sincos declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for sincos declaration" >&5 +echo $ECHO_N "checking for sincos declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func_sincos_use+set} != xset; then if test "${glibcxx_cv_func_sincos_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -44735,35 +43828,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func_sincos_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_sincos_use=no + glibcxx_cv_func_sincos_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -44774,17 +43863,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_sincos_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_sincos_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_sincos_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_sincos_use" >&6; } if test x$glibcxx_cv_func_sincos_use = x"yes"; then for ac_func in sincos do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -44815,68 +43904,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -44887,16 +43968,15 @@ done else - echo "$as_me:$LINENO: checking for _sincos declaration" >&5 -echo $ECHO_N "checking for _sincos declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for _sincos declaration" >&5 +echo $ECHO_N "checking for _sincos declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func__sincos_use+set} != xset; then if test "${glibcxx_cv_func__sincos_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -44918,35 +43998,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func__sincos_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func__sincos_use=no + glibcxx_cv_func__sincos_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -44957,17 +44033,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__sincos_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__sincos_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__sincos_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__sincos_use" >&6; } if test x$glibcxx_cv_func__sincos_use = x"yes"; then for ac_func in _sincos do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -44998,68 +44074,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -45076,16 +44144,15 @@ done - echo "$as_me:$LINENO: checking for fpclass declaration" >&5 -echo $ECHO_N "checking for fpclass declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for fpclass declaration" >&5 +echo $ECHO_N "checking for fpclass declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func_fpclass_use+set} != xset; then if test "${glibcxx_cv_func_fpclass_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -45111,35 +44178,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func_fpclass_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_fpclass_use=no + glibcxx_cv_func_fpclass_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -45150,17 +44213,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_fpclass_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_fpclass_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_fpclass_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_fpclass_use" >&6; } if test x$glibcxx_cv_func_fpclass_use = x"yes"; then for ac_func in fpclass do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -45191,68 +44254,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -45263,16 +44318,15 @@ done else - echo "$as_me:$LINENO: checking for _fpclass declaration" >&5 -echo $ECHO_N "checking for _fpclass declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for _fpclass declaration" >&5 +echo $ECHO_N "checking for _fpclass declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func__fpclass_use+set} != xset; then if test "${glibcxx_cv_func__fpclass_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -45298,35 +44352,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func__fpclass_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func__fpclass_use=no + glibcxx_cv_func__fpclass_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -45337,17 +44387,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__fpclass_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__fpclass_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__fpclass_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__fpclass_use" >&6; } if test x$glibcxx_cv_func__fpclass_use = x"yes"; then for ac_func in _fpclass do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -45378,68 +44428,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -45456,16 +44498,15 @@ done - echo "$as_me:$LINENO: checking for qfpclass declaration" >&5 -echo $ECHO_N "checking for qfpclass declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for qfpclass declaration" >&5 +echo $ECHO_N "checking for qfpclass declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func_qfpclass_use+set} != xset; then if test "${glibcxx_cv_func_qfpclass_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -45491,35 +44532,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func_qfpclass_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_qfpclass_use=no + glibcxx_cv_func_qfpclass_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -45530,17 +44567,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_qfpclass_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_qfpclass_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_qfpclass_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_qfpclass_use" >&6; } if test x$glibcxx_cv_func_qfpclass_use = x"yes"; then for ac_func in qfpclass do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -45571,68 +44608,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -45643,16 +44672,15 @@ done else - echo "$as_me:$LINENO: checking for _qfpclass declaration" >&5 -echo $ECHO_N "checking for _qfpclass declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for _qfpclass declaration" >&5 +echo $ECHO_N "checking for _qfpclass declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func__qfpclass_use+set} != xset; then if test "${glibcxx_cv_func__qfpclass_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -45678,35 +44706,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func__qfpclass_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func__qfpclass_use=no + glibcxx_cv_func__qfpclass_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -45717,17 +44741,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__qfpclass_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__qfpclass_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__qfpclass_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__qfpclass_use" >&6; } if test x$glibcxx_cv_func__qfpclass_use = x"yes"; then for ac_func in _qfpclass do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -45758,68 +44782,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -45836,16 +44852,15 @@ done - echo "$as_me:$LINENO: checking for hypot declaration" >&5 -echo $ECHO_N "checking for hypot declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for hypot declaration" >&5 +echo $ECHO_N "checking for hypot declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func_hypot_use+set} != xset; then if test "${glibcxx_cv_func_hypot_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -45867,35 +44882,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func_hypot_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_hypot_use=no + glibcxx_cv_func_hypot_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -45906,17 +44917,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_hypot_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_hypot_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_hypot_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_hypot_use" >&6; } if test x$glibcxx_cv_func_hypot_use = x"yes"; then for ac_func in hypot do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -45947,68 +44958,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -46019,16 +45022,15 @@ done else - echo "$as_me:$LINENO: checking for _hypot declaration" >&5 -echo $ECHO_N "checking for _hypot declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for _hypot declaration" >&5 +echo $ECHO_N "checking for _hypot declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func__hypot_use+set} != xset; then if test "${glibcxx_cv_func__hypot_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -46050,35 +45052,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func__hypot_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func__hypot_use=no + glibcxx_cv_func__hypot_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -46089,17 +45087,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__hypot_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__hypot_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__hypot_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__hypot_use" >&6; } if test x$glibcxx_cv_func__hypot_use = x"yes"; then for ac_func in _hypot do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -46130,68 +45128,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -46208,15 +45198,14 @@ done - echo "$as_me:$LINENO: checking for float trig functions" >&5 -echo $ECHO_N "checking for float trig functions... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for float trig functions" >&5 +echo $ECHO_N "checking for float trig functions... $ECHO_C" >&6; } if test "${glibcxx_cv_func_float_trig_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -46238,35 +45227,31 @@ acosf (0); asinf (0); atanf (0); cosf (0); sinf (0); tanf (0); coshf (0); sinhf } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func_float_trig_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_float_trig_use=no + glibcxx_cv_func_float_trig_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -46275,8 +45260,8 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_float_trig_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_float_trig_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_float_trig_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_float_trig_use" >&6; } if test x$glibcxx_cv_func_float_trig_use = x"yes"; then @@ -46290,9 +45275,9 @@ echo "${ECHO_T}$glibcxx_cv_func_float_trig_use" >&6 for ac_func in acosf asinf atanf cosf sinf tanf coshf sinhf tanhf do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -46323,68 +45308,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -46394,15 +45371,14 @@ fi done else - echo "$as_me:$LINENO: checking for _float trig functions" >&5 -echo $ECHO_N "checking for _float trig functions... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for _float trig functions" >&5 +echo $ECHO_N "checking for _float trig functions... $ECHO_C" >&6; } if test "${glibcxx_cv_func__float_trig_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -46424,35 +45400,31 @@ _acosf (0); _asinf (0); _atanf (0); _cosf (0); _sinf (0); _tanf (0); _coshf (0); } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func__float_trig_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func__float_trig_use=no + glibcxx_cv_func__float_trig_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -46461,8 +45433,8 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__float_trig_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__float_trig_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__float_trig_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__float_trig_use" >&6; } if test x$glibcxx_cv_func__float_trig_use = x"yes"; then @@ -46476,9 +45448,9 @@ echo "${ECHO_T}$glibcxx_cv_func__float_trig_use" >&6 for ac_func in _acosf _asinf _atanf _cosf _sinf _tanf _coshf _sinhf _tanhf do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -46509,68 +45481,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -46595,15 +45559,14 @@ done - echo "$as_me:$LINENO: checking for float round functions" >&5 -echo $ECHO_N "checking for float round functions... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for float round functions" >&5 +echo $ECHO_N "checking for float round functions... $ECHO_C" >&6; } if test "${glibcxx_cv_func_float_round_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -46625,35 +45588,31 @@ ceilf (0); floorf (0); } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func_float_round_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_float_round_use=no + glibcxx_cv_func_float_round_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -46662,17 +45621,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_float_round_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_float_round_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_float_round_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_float_round_use" >&6; } if test x$glibcxx_cv_func_float_round_use = x"yes"; then for ac_func in ceilf floorf do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -46703,68 +45662,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -46774,15 +45725,14 @@ fi done else - echo "$as_me:$LINENO: checking for _float round functions" >&5 -echo $ECHO_N "checking for _float round functions... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for _float round functions" >&5 +echo $ECHO_N "checking for _float round functions... $ECHO_C" >&6; } if test "${glibcxx_cv_func__float_round_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -46804,54 +45754,232 @@ _ceilf (0); _floorf (0); } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + glibcxx_cv_func__float_round_use=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + glibcxx_cv_func__float_round_use=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +fi + + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__float_round_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__float_round_use" >&6; } + if test x$glibcxx_cv_func__float_round_use = x"yes"; then + + +for ac_func in _ceilf _floorf +do +as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test x$gcc_no_link = xyes; then + { { echo "$as_me:$LINENO: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&5 +echo "$as_me: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&2;} + { (exit 1); exit 1; }; } +fi +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define $ac_func to an innocuous variant, in case declares $ac_func. + For example, HP-UX 11i declares gettimeofday. */ +#define $ac_func innocuous_$ac_func + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $ac_func (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $ac_func + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char $ac_func (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_$ac_func || defined __stub___$ac_func +choke me +#endif + +int +main () +{ +return $ac_func (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then + eval "$as_ac_var=yes" +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + eval "$as_ac_var=no" +fi + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +fi +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } +if test `eval echo '${'$as_ac_var'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +fi +done + + fi + fi + + + + + + + + + { echo "$as_me:$LINENO: checking for expf declaration" >&5 +echo $ECHO_N "checking for expf declaration... $ECHO_C" >&6; } + if test x${glibcxx_cv_func_expf_use+set} != xset; then + if test "${glibcxx_cv_func_expf_use+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + + ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include + #ifdef HAVE_IEEEFP_H + #include + #endif + +int +main () +{ + expf(0); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - glibcxx_cv_func__float_round_use=yes + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + glibcxx_cv_func_expf_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func__float_round_use=no + glibcxx_cv_func_expf_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu + fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__float_round_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__float_round_use" >&6 - if test x$glibcxx_cv_func__float_round_use = x"yes"; then + fi + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_expf_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_expf_use" >&6; } + if test x$glibcxx_cv_func_expf_use = x"yes"; then -for ac_func in _ceilf _floorf +for ac_func in expf do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -46882,263 +46010,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ -#ifdef __cplusplus -extern "C" -{ -#endif -/* We use char because int might match the return type of a gcc2 +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ -char $ac_func (); -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) -choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} -#endif - -int -main () -{ -return f != $ac_func; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - eval "$as_ac_var=yes" -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -eval "$as_ac_var=no" -fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 -if test `eval echo '${'$as_ac_var'}'` = yes; then - cat >>confdefs.h <<_ACEOF -#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 -_ACEOF - -fi -done - - fi - fi - - - - - - - - - echo "$as_me:$LINENO: checking for expf declaration" >&5 -echo $ECHO_N "checking for expf declaration... $ECHO_C" >&6 - if test x${glibcxx_cv_func_expf_use+set} != xset; then - if test "${glibcxx_cv_func_expf_use+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - - - - ac_ext=cc -ac_cpp='$CXXCPP $CPPFLAGS' -ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_cxx_compiler_gnu - - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include - #ifdef HAVE_IEEEFP_H - #include - #endif - -int -main () -{ - expf(0); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - glibcxx_cv_func_expf_use=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -glibcxx_cv_func_expf_use=no -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext - ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - - -fi - - fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_expf_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_expf_use" >&6 - - if test x$glibcxx_cv_func_expf_use = x"yes"; then - -for ac_func in expf -do -as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test x$gcc_no_link = xyes; then - { { echo "$as_me:$LINENO: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&5 -echo "$as_me: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&2;} - { (exit 1); exit 1; }; } -fi -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -/* Define $ac_func to an innocuous variant, in case declares $ac_func. - For example, HP-UX 11i declares gettimeofday. */ -#define $ac_func innocuous_$ac_func - -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char $ac_func (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ - -#ifdef __STDC__ -# include -#else -# include -#endif - -#undef $ac_func - -/* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -47149,16 +46074,15 @@ done else - echo "$as_me:$LINENO: checking for _expf declaration" >&5 -echo $ECHO_N "checking for _expf declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for _expf declaration" >&5 +echo $ECHO_N "checking for _expf declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func__expf_use+set} != xset; then if test "${glibcxx_cv_func__expf_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -47184,35 +46108,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func__expf_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func__expf_use=no + glibcxx_cv_func__expf_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -47223,17 +46143,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__expf_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__expf_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__expf_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__expf_use" >&6; } if test x$glibcxx_cv_func__expf_use = x"yes"; then for ac_func in _expf do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -47264,68 +46184,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -47342,16 +46254,15 @@ done - echo "$as_me:$LINENO: checking for isnanf declaration" >&5 -echo $ECHO_N "checking for isnanf declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for isnanf declaration" >&5 +echo $ECHO_N "checking for isnanf declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func_isnanf_use+set} != xset; then if test "${glibcxx_cv_func_isnanf_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -47377,35 +46288,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func_isnanf_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_isnanf_use=no + glibcxx_cv_func_isnanf_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -47416,17 +46323,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_isnanf_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_isnanf_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_isnanf_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_isnanf_use" >&6; } if test x$glibcxx_cv_func_isnanf_use = x"yes"; then for ac_func in isnanf do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -47457,68 +46364,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -47529,16 +46428,15 @@ done else - echo "$as_me:$LINENO: checking for _isnanf declaration" >&5 -echo $ECHO_N "checking for _isnanf declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for _isnanf declaration" >&5 +echo $ECHO_N "checking for _isnanf declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func__isnanf_use+set} != xset; then if test "${glibcxx_cv_func__isnanf_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -47564,35 +46462,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func__isnanf_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func__isnanf_use=no + glibcxx_cv_func__isnanf_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -47603,17 +46497,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__isnanf_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__isnanf_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__isnanf_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__isnanf_use" >&6; } if test x$glibcxx_cv_func__isnanf_use = x"yes"; then for ac_func in _isnanf do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -47644,68 +46538,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -47722,16 +46608,15 @@ done - echo "$as_me:$LINENO: checking for isinff declaration" >&5 -echo $ECHO_N "checking for isinff declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for isinff declaration" >&5 +echo $ECHO_N "checking for isinff declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func_isinff_use+set} != xset; then if test "${glibcxx_cv_func_isinff_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -47757,35 +46642,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func_isinff_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_isinff_use=no + glibcxx_cv_func_isinff_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -47796,17 +46677,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_isinff_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_isinff_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_isinff_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_isinff_use" >&6; } if test x$glibcxx_cv_func_isinff_use = x"yes"; then for ac_func in isinff do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -47837,68 +46718,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -47909,16 +46782,15 @@ done else - echo "$as_me:$LINENO: checking for _isinff declaration" >&5 -echo $ECHO_N "checking for _isinff declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for _isinff declaration" >&5 +echo $ECHO_N "checking for _isinff declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func__isinff_use+set} != xset; then if test "${glibcxx_cv_func__isinff_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -47944,35 +46816,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func__isinff_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func__isinff_use=no + glibcxx_cv_func__isinff_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -47983,17 +46851,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__isinff_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__isinff_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__isinff_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__isinff_use" >&6; } if test x$glibcxx_cv_func__isinff_use = x"yes"; then for ac_func in _isinff do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -48024,68 +46892,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -48102,16 +46962,15 @@ done - echo "$as_me:$LINENO: checking for atan2f declaration" >&5 -echo $ECHO_N "checking for atan2f declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for atan2f declaration" >&5 +echo $ECHO_N "checking for atan2f declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func_atan2f_use+set} != xset; then if test "${glibcxx_cv_func_atan2f_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -48133,35 +46992,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func_atan2f_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_atan2f_use=no + glibcxx_cv_func_atan2f_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -48172,17 +47027,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_atan2f_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_atan2f_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_atan2f_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_atan2f_use" >&6; } if test x$glibcxx_cv_func_atan2f_use = x"yes"; then for ac_func in atan2f do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -48213,68 +47068,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -48285,16 +47132,15 @@ done else - echo "$as_me:$LINENO: checking for _atan2f declaration" >&5 -echo $ECHO_N "checking for _atan2f declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for _atan2f declaration" >&5 +echo $ECHO_N "checking for _atan2f declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func__atan2f_use+set} != xset; then if test "${glibcxx_cv_func__atan2f_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -48316,35 +47162,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func__atan2f_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func__atan2f_use=no + glibcxx_cv_func__atan2f_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -48355,17 +47197,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__atan2f_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__atan2f_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__atan2f_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__atan2f_use" >&6; } if test x$glibcxx_cv_func__atan2f_use = x"yes"; then for ac_func in _atan2f do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -48396,68 +47238,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -48474,16 +47308,15 @@ done - echo "$as_me:$LINENO: checking for fabsf declaration" >&5 -echo $ECHO_N "checking for fabsf declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for fabsf declaration" >&5 +echo $ECHO_N "checking for fabsf declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func_fabsf_use+set} != xset; then if test "${glibcxx_cv_func_fabsf_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -48509,35 +47342,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func_fabsf_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_fabsf_use=no + glibcxx_cv_func_fabsf_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -48548,17 +47377,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_fabsf_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_fabsf_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_fabsf_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_fabsf_use" >&6; } if test x$glibcxx_cv_func_fabsf_use = x"yes"; then for ac_func in fabsf do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -48589,68 +47418,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -48661,16 +47482,15 @@ done else - echo "$as_me:$LINENO: checking for _fabsf declaration" >&5 -echo $ECHO_N "checking for _fabsf declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for _fabsf declaration" >&5 +echo $ECHO_N "checking for _fabsf declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func__fabsf_use+set} != xset; then if test "${glibcxx_cv_func__fabsf_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -48696,35 +47516,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func__fabsf_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func__fabsf_use=no + glibcxx_cv_func__fabsf_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -48735,17 +47551,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__fabsf_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__fabsf_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__fabsf_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__fabsf_use" >&6; } if test x$glibcxx_cv_func__fabsf_use = x"yes"; then for ac_func in _fabsf do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -48776,68 +47592,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -48854,16 +47662,15 @@ done - echo "$as_me:$LINENO: checking for fmodf declaration" >&5 -echo $ECHO_N "checking for fmodf declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for fmodf declaration" >&5 +echo $ECHO_N "checking for fmodf declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func_fmodf_use+set} != xset; then if test "${glibcxx_cv_func_fmodf_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -48885,35 +47692,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func_fmodf_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_fmodf_use=no + glibcxx_cv_func_fmodf_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -48924,17 +47727,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_fmodf_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_fmodf_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_fmodf_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_fmodf_use" >&6; } if test x$glibcxx_cv_func_fmodf_use = x"yes"; then for ac_func in fmodf do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -48965,68 +47768,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -49037,16 +47832,15 @@ done else - echo "$as_me:$LINENO: checking for _fmodf declaration" >&5 -echo $ECHO_N "checking for _fmodf declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for _fmodf declaration" >&5 +echo $ECHO_N "checking for _fmodf declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func__fmodf_use+set} != xset; then if test "${glibcxx_cv_func__fmodf_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -49068,35 +47862,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func__fmodf_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func__fmodf_use=no + glibcxx_cv_func__fmodf_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -49107,17 +47897,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__fmodf_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__fmodf_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__fmodf_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__fmodf_use" >&6; } if test x$glibcxx_cv_func__fmodf_use = x"yes"; then for ac_func in _fmodf do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -49148,68 +47938,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -49226,16 +48008,15 @@ done - echo "$as_me:$LINENO: checking for frexpf declaration" >&5 -echo $ECHO_N "checking for frexpf declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for frexpf declaration" >&5 +echo $ECHO_N "checking for frexpf declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func_frexpf_use+set} != xset; then if test "${glibcxx_cv_func_frexpf_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -49257,35 +48038,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func_frexpf_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_frexpf_use=no + glibcxx_cv_func_frexpf_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -49296,17 +48073,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_frexpf_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_frexpf_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_frexpf_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_frexpf_use" >&6; } if test x$glibcxx_cv_func_frexpf_use = x"yes"; then for ac_func in frexpf do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -49337,68 +48114,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -49409,16 +48178,15 @@ done else - echo "$as_me:$LINENO: checking for _frexpf declaration" >&5 -echo $ECHO_N "checking for _frexpf declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for _frexpf declaration" >&5 +echo $ECHO_N "checking for _frexpf declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func__frexpf_use+set} != xset; then if test "${glibcxx_cv_func__frexpf_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -49440,35 +48208,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func__frexpf_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func__frexpf_use=no + glibcxx_cv_func__frexpf_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -49479,17 +48243,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__frexpf_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__frexpf_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__frexpf_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__frexpf_use" >&6; } if test x$glibcxx_cv_func__frexpf_use = x"yes"; then for ac_func in _frexpf do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -49520,68 +48284,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -49598,16 +48354,15 @@ done - echo "$as_me:$LINENO: checking for hypotf declaration" >&5 -echo $ECHO_N "checking for hypotf declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for hypotf declaration" >&5 +echo $ECHO_N "checking for hypotf declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func_hypotf_use+set} != xset; then if test "${glibcxx_cv_func_hypotf_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -49629,35 +48384,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func_hypotf_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_hypotf_use=no + glibcxx_cv_func_hypotf_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -49668,17 +48419,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_hypotf_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_hypotf_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_hypotf_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_hypotf_use" >&6; } if test x$glibcxx_cv_func_hypotf_use = x"yes"; then for ac_func in hypotf do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -49709,68 +48460,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -49781,16 +48524,15 @@ done else - echo "$as_me:$LINENO: checking for _hypotf declaration" >&5 -echo $ECHO_N "checking for _hypotf declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for _hypotf declaration" >&5 +echo $ECHO_N "checking for _hypotf declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func__hypotf_use+set} != xset; then if test "${glibcxx_cv_func__hypotf_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -49812,35 +48554,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func__hypotf_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func__hypotf_use=no + glibcxx_cv_func__hypotf_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -49851,17 +48589,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__hypotf_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__hypotf_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__hypotf_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__hypotf_use" >&6; } if test x$glibcxx_cv_func__hypotf_use = x"yes"; then for ac_func in _hypotf do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -49892,68 +48630,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -49970,16 +48700,15 @@ done - echo "$as_me:$LINENO: checking for ldexpf declaration" >&5 -echo $ECHO_N "checking for ldexpf declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for ldexpf declaration" >&5 +echo $ECHO_N "checking for ldexpf declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func_ldexpf_use+set} != xset; then if test "${glibcxx_cv_func_ldexpf_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -50001,35 +48730,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func_ldexpf_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_ldexpf_use=no + glibcxx_cv_func_ldexpf_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -50040,17 +48765,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_ldexpf_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_ldexpf_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_ldexpf_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_ldexpf_use" >&6; } if test x$glibcxx_cv_func_ldexpf_use = x"yes"; then for ac_func in ldexpf do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -50081,68 +48806,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -50153,16 +48870,15 @@ done else - echo "$as_me:$LINENO: checking for _ldexpf declaration" >&5 -echo $ECHO_N "checking for _ldexpf declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for _ldexpf declaration" >&5 +echo $ECHO_N "checking for _ldexpf declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func__ldexpf_use+set} != xset; then if test "${glibcxx_cv_func__ldexpf_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -50184,35 +48900,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func__ldexpf_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func__ldexpf_use=no + glibcxx_cv_func__ldexpf_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -50223,17 +48935,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__ldexpf_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__ldexpf_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__ldexpf_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__ldexpf_use" >&6; } if test x$glibcxx_cv_func__ldexpf_use = x"yes"; then for ac_func in _ldexpf do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -50264,68 +48976,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -50342,16 +49046,15 @@ done - echo "$as_me:$LINENO: checking for logf declaration" >&5 -echo $ECHO_N "checking for logf declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for logf declaration" >&5 +echo $ECHO_N "checking for logf declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func_logf_use+set} != xset; then if test "${glibcxx_cv_func_logf_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -50377,35 +49080,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func_logf_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_logf_use=no + glibcxx_cv_func_logf_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -50416,17 +49115,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_logf_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_logf_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_logf_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_logf_use" >&6; } if test x$glibcxx_cv_func_logf_use = x"yes"; then for ac_func in logf do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -50457,68 +49156,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -50529,16 +49220,15 @@ done else - echo "$as_me:$LINENO: checking for _logf declaration" >&5 -echo $ECHO_N "checking for _logf declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for _logf declaration" >&5 +echo $ECHO_N "checking for _logf declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func__logf_use+set} != xset; then if test "${glibcxx_cv_func__logf_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -50564,35 +49254,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func__logf_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func__logf_use=no + glibcxx_cv_func__logf_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -50603,17 +49289,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__logf_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__logf_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__logf_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__logf_use" >&6; } if test x$glibcxx_cv_func__logf_use = x"yes"; then for ac_func in _logf do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -50644,68 +49330,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -50722,16 +49400,15 @@ done - echo "$as_me:$LINENO: checking for log10f declaration" >&5 -echo $ECHO_N "checking for log10f declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for log10f declaration" >&5 +echo $ECHO_N "checking for log10f declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func_log10f_use+set} != xset; then if test "${glibcxx_cv_func_log10f_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -50757,35 +49434,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func_log10f_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_log10f_use=no + glibcxx_cv_func_log10f_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -50796,17 +49469,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_log10f_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_log10f_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_log10f_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_log10f_use" >&6; } if test x$glibcxx_cv_func_log10f_use = x"yes"; then for ac_func in log10f do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -50837,68 +49510,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -50909,16 +49574,15 @@ done else - echo "$as_me:$LINENO: checking for _log10f declaration" >&5 -echo $ECHO_N "checking for _log10f declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for _log10f declaration" >&5 +echo $ECHO_N "checking for _log10f declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func__log10f_use+set} != xset; then if test "${glibcxx_cv_func__log10f_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -50944,35 +49608,207 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + glibcxx_cv_func__log10f_use=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + glibcxx_cv_func__log10f_use=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +fi + + fi + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__log10f_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__log10f_use" >&6; } + + if test x$glibcxx_cv_func__log10f_use = x"yes"; then + +for ac_func in _log10f +do +as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test x$gcc_no_link = xyes; then + { { echo "$as_me:$LINENO: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&5 +echo "$as_me: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&2;} + { (exit 1); exit 1; }; } +fi +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define $ac_func to an innocuous variant, in case declares $ac_func. + For example, HP-UX 11i declares gettimeofday. */ +#define $ac_func innocuous_$ac_func + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $ac_func (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $ac_func + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char $ac_func (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_$ac_func || defined __stub___$ac_func +choke me +#endif + +int +main () +{ +return $ac_func (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then + eval "$as_ac_var=yes" +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + eval "$as_ac_var=no" +fi + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +fi +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } +if test `eval echo '${'$as_ac_var'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +fi +done + + fi + fi + + + + + + + { echo "$as_me:$LINENO: checking for modff declaration" >&5 +echo $ECHO_N "checking for modff declaration... $ECHO_C" >&6; } + if test x${glibcxx_cv_func_modff_use+set} != xset; then + if test "${glibcxx_cv_func_modff_use+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + + ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +int +main () +{ + modff(0, 0); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - glibcxx_cv_func__log10f_use=yes + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + glibcxx_cv_func_modff_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func__log10f_use=no + glibcxx_cv_func_modff_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -50983,17 +49819,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__log10f_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__log10f_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_modff_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_modff_use" >&6; } - if test x$glibcxx_cv_func__log10f_use = x"yes"; then + if test x$glibcxx_cv_func_modff_use = x"yes"; then -for ac_func in _log10f +for ac_func in modff do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -51024,257 +49860,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ -#ifdef __cplusplus -extern "C" -{ -#endif -/* We use char because int might match the return type of a gcc2 +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ -char $ac_func (); -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) -choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} -#endif - -int -main () -{ -return f != $ac_func; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - eval "$as_ac_var=yes" -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -eval "$as_ac_var=no" -fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 -if test `eval echo '${'$as_ac_var'}'` = yes; then - cat >>confdefs.h <<_ACEOF -#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 -_ACEOF - -fi -done - - fi - fi - - - - - - - echo "$as_me:$LINENO: checking for modff declaration" >&5 -echo $ECHO_N "checking for modff declaration... $ECHO_C" >&6 - if test x${glibcxx_cv_func_modff_use+set} != xset; then - if test "${glibcxx_cv_func_modff_use+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - - - - ac_ext=cc -ac_cpp='$CXXCPP $CPPFLAGS' -ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_cxx_compiler_gnu - - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include -int -main () -{ - modff(0, 0); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - glibcxx_cv_func_modff_use=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -glibcxx_cv_func_modff_use=no -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext - ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - - -fi - - fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_modff_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_modff_use" >&6 - - if test x$glibcxx_cv_func_modff_use = x"yes"; then - -for ac_func in modff -do -as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test x$gcc_no_link = xyes; then - { { echo "$as_me:$LINENO: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&5 -echo "$as_me: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&2;} - { (exit 1); exit 1; }; } -fi -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -/* Define $ac_func to an innocuous variant, in case declares $ac_func. - For example, HP-UX 11i declares gettimeofday. */ -#define $ac_func innocuous_$ac_func - -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char $ac_func (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ - -#ifdef __STDC__ -# include -#else -# include -#endif - -#undef $ac_func - -/* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -51285,16 +49924,15 @@ done else - echo "$as_me:$LINENO: checking for _modff declaration" >&5 -echo $ECHO_N "checking for _modff declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for _modff declaration" >&5 +echo $ECHO_N "checking for _modff declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func__modff_use+set} != xset; then if test "${glibcxx_cv_func__modff_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -51316,35 +49954,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func__modff_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func__modff_use=no + glibcxx_cv_func__modff_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -51355,17 +49989,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__modff_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__modff_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__modff_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__modff_use" >&6; } if test x$glibcxx_cv_func__modff_use = x"yes"; then for ac_func in _modff do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -51396,68 +50030,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -51474,16 +50100,15 @@ done - echo "$as_me:$LINENO: checking for modf declaration" >&5 -echo $ECHO_N "checking for modf declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for modf declaration" >&5 +echo $ECHO_N "checking for modf declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func_modf_use+set} != xset; then if test "${glibcxx_cv_func_modf_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -51505,35 +50130,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func_modf_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_modf_use=no + glibcxx_cv_func_modf_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -51544,17 +50165,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_modf_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_modf_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_modf_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_modf_use" >&6; } if test x$glibcxx_cv_func_modf_use = x"yes"; then for ac_func in modf do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -51585,68 +50206,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -51657,16 +50270,15 @@ done else - echo "$as_me:$LINENO: checking for _modf declaration" >&5 -echo $ECHO_N "checking for _modf declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for _modf declaration" >&5 +echo $ECHO_N "checking for _modf declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func__modf_use+set} != xset; then if test "${glibcxx_cv_func__modf_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -51688,35 +50300,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func__modf_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func__modf_use=no + glibcxx_cv_func__modf_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -51727,17 +50335,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__modf_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__modf_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__modf_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__modf_use" >&6; } if test x$glibcxx_cv_func__modf_use = x"yes"; then for ac_func in _modf do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -51768,68 +50376,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -51846,16 +50446,15 @@ done - echo "$as_me:$LINENO: checking for powf declaration" >&5 -echo $ECHO_N "checking for powf declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for powf declaration" >&5 +echo $ECHO_N "checking for powf declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func_powf_use+set} != xset; then if test "${glibcxx_cv_func_powf_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -51877,35 +50476,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func_powf_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_powf_use=no + glibcxx_cv_func_powf_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -51916,17 +50511,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_powf_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_powf_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_powf_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_powf_use" >&6; } if test x$glibcxx_cv_func_powf_use = x"yes"; then for ac_func in powf do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -51957,68 +50552,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -52029,16 +50616,15 @@ done else - echo "$as_me:$LINENO: checking for _powf declaration" >&5 -echo $ECHO_N "checking for _powf declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for _powf declaration" >&5 +echo $ECHO_N "checking for _powf declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func__powf_use+set} != xset; then if test "${glibcxx_cv_func__powf_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -52060,35 +50646,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func__powf_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func__powf_use=no + glibcxx_cv_func__powf_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -52099,17 +50681,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__powf_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__powf_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__powf_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__powf_use" >&6; } if test x$glibcxx_cv_func__powf_use = x"yes"; then for ac_func in _powf do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -52140,68 +50722,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -52218,16 +50792,15 @@ done - echo "$as_me:$LINENO: checking for sqrtf declaration" >&5 -echo $ECHO_N "checking for sqrtf declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for sqrtf declaration" >&5 +echo $ECHO_N "checking for sqrtf declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func_sqrtf_use+set} != xset; then if test "${glibcxx_cv_func_sqrtf_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -52253,35 +50826,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func_sqrtf_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_sqrtf_use=no + glibcxx_cv_func_sqrtf_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -52292,17 +50861,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_sqrtf_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_sqrtf_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_sqrtf_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_sqrtf_use" >&6; } if test x$glibcxx_cv_func_sqrtf_use = x"yes"; then for ac_func in sqrtf do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -52333,68 +50902,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -52405,16 +50966,15 @@ done else - echo "$as_me:$LINENO: checking for _sqrtf declaration" >&5 -echo $ECHO_N "checking for _sqrtf declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for _sqrtf declaration" >&5 +echo $ECHO_N "checking for _sqrtf declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func__sqrtf_use+set} != xset; then if test "${glibcxx_cv_func__sqrtf_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -52440,35 +51000,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func__sqrtf_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func__sqrtf_use=no + glibcxx_cv_func__sqrtf_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -52479,17 +51035,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__sqrtf_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__sqrtf_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__sqrtf_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__sqrtf_use" >&6; } if test x$glibcxx_cv_func__sqrtf_use = x"yes"; then for ac_func in _sqrtf do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -52520,68 +51076,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -52598,16 +51146,15 @@ done - echo "$as_me:$LINENO: checking for sincosf declaration" >&5 -echo $ECHO_N "checking for sincosf declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for sincosf declaration" >&5 +echo $ECHO_N "checking for sincosf declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func_sincosf_use+set} != xset; then if test "${glibcxx_cv_func_sincosf_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -52629,35 +51176,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func_sincosf_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_sincosf_use=no + glibcxx_cv_func_sincosf_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -52668,17 +51211,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_sincosf_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_sincosf_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_sincosf_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_sincosf_use" >&6; } if test x$glibcxx_cv_func_sincosf_use = x"yes"; then for ac_func in sincosf do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -52709,68 +51252,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -52781,16 +51316,15 @@ done else - echo "$as_me:$LINENO: checking for _sincosf declaration" >&5 -echo $ECHO_N "checking for _sincosf declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for _sincosf declaration" >&5 +echo $ECHO_N "checking for _sincosf declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func__sincosf_use+set} != xset; then if test "${glibcxx_cv_func__sincosf_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -52812,35 +51346,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func__sincosf_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func__sincosf_use=no + glibcxx_cv_func__sincosf_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -52851,17 +51381,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__sincosf_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__sincosf_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__sincosf_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__sincosf_use" >&6; } if test x$glibcxx_cv_func__sincosf_use = x"yes"; then for ac_func in _sincosf do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -52892,68 +51422,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -52970,16 +51492,15 @@ done - echo "$as_me:$LINENO: checking for finitef declaration" >&5 -echo $ECHO_N "checking for finitef declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for finitef declaration" >&5 +echo $ECHO_N "checking for finitef declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func_finitef_use+set} != xset; then if test "${glibcxx_cv_func_finitef_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -53005,35 +51526,205 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + glibcxx_cv_func_finitef_use=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + glibcxx_cv_func_finitef_use=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +fi + + fi + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_finitef_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_finitef_use" >&6; } + + if test x$glibcxx_cv_func_finitef_use = x"yes"; then + +for ac_func in finitef +do +as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test x$gcc_no_link = xyes; then + { { echo "$as_me:$LINENO: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&5 +echo "$as_me: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&2;} + { (exit 1); exit 1; }; } +fi +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define $ac_func to an innocuous variant, in case declares $ac_func. + For example, HP-UX 11i declares gettimeofday. */ +#define $ac_func innocuous_$ac_func + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $ac_func (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $ac_func + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char $ac_func (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_$ac_func || defined __stub___$ac_func +choke me +#endif + +int +main () +{ +return $ac_func (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then + eval "$as_ac_var=yes" +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + eval "$as_ac_var=no" +fi + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +fi +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } +if test `eval echo '${'$as_ac_var'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +fi +done + + else + + { echo "$as_me:$LINENO: checking for _finitef declaration" >&5 +echo $ECHO_N "checking for _finitef declaration... $ECHO_C" >&6; } + if test x${glibcxx_cv_func__finitef_use+set} != xset; then + if test "${glibcxx_cv_func__finitef_use+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + + ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include + #ifdef HAVE_IEEEFP_H + #include + #endif + +int +main () +{ + _finitef(0); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - glibcxx_cv_func_finitef_use=yes + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + glibcxx_cv_func__finitef_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_finitef_use=no + glibcxx_cv_func__finitef_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -53044,17 +51735,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_finitef_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_finitef_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__finitef_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__finitef_use" >&6; } - if test x$glibcxx_cv_func_finitef_use = x"yes"; then + if test x$glibcxx_cv_func__finitef_use = x"yes"; then -for ac_func in finitef +for ac_func in _finitef do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -53085,255 +51776,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ -#ifdef __cplusplus -extern "C" -{ -#endif -/* We use char because int might match the return type of a gcc2 +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ -char $ac_func (); -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) -choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} -#endif - -int -main () -{ -return f != $ac_func; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - eval "$as_ac_var=yes" -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -eval "$as_ac_var=no" -fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 -if test `eval echo '${'$as_ac_var'}'` = yes; then - cat >>confdefs.h <<_ACEOF -#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 -_ACEOF - -fi -done - - else - - echo "$as_me:$LINENO: checking for _finitef declaration" >&5 -echo $ECHO_N "checking for _finitef declaration... $ECHO_C" >&6 - if test x${glibcxx_cv_func__finitef_use+set} != xset; then - if test "${glibcxx_cv_func__finitef_use+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - - - - ac_ext=cc -ac_cpp='$CXXCPP $CPPFLAGS' -ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_cxx_compiler_gnu - - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include - #ifdef HAVE_IEEEFP_H - #include - #endif - -int -main () -{ - _finitef(0); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - glibcxx_cv_func__finitef_use=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -glibcxx_cv_func__finitef_use=no -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext - ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - - -fi - - fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__finitef_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__finitef_use" >&6 - - if test x$glibcxx_cv_func__finitef_use = x"yes"; then - -for ac_func in _finitef -do -as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test x$gcc_no_link = xyes; then - { { echo "$as_me:$LINENO: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&5 -echo "$as_me: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&2;} - { (exit 1); exit 1; }; } -fi -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -/* Define $ac_func to an innocuous variant, in case declares $ac_func. - For example, HP-UX 11i declares gettimeofday. */ -#define $ac_func innocuous_$ac_func - -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char $ac_func (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ - -#ifdef __STDC__ -# include -#else -# include -#endif - -#undef $ac_func - -/* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -53350,15 +51846,14 @@ done - echo "$as_me:$LINENO: checking for long double trig functions" >&5 -echo $ECHO_N "checking for long double trig functions... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for long double trig functions" >&5 +echo $ECHO_N "checking for long double trig functions... $ECHO_C" >&6; } if test "${glibcxx_cv_func_long_double_trig_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -53380,35 +51875,31 @@ acosl (0); asinl (0); atanl (0); cosl (0); sinl (0); tanl (0); coshl (0); sinhl } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func_long_double_trig_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_long_double_trig_use=no + glibcxx_cv_func_long_double_trig_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -53417,8 +51908,8 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_long_double_trig_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_long_double_trig_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_long_double_trig_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_long_double_trig_use" >&6; } if test x$glibcxx_cv_func_long_double_trig_use = x"yes"; then @@ -53432,9 +51923,9 @@ echo "${ECHO_T}$glibcxx_cv_func_long_double_trig_use" >&6 for ac_func in acosl asinl atanl cosl sinl tanl coshl sinhl tanhl do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -53465,68 +51956,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -53536,15 +52019,14 @@ fi done else - echo "$as_me:$LINENO: checking for _long double trig functions" >&5 -echo $ECHO_N "checking for _long double trig functions... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for _long double trig functions" >&5 +echo $ECHO_N "checking for _long double trig functions... $ECHO_C" >&6; } if test "${glibcxx_cv_func__long_double_trig_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -53566,35 +52048,31 @@ _acosl (0); _asinl (0); _atanl (0); _cosl (0); _sinl (0); _tanl (0); _coshl (0); } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func__long_double_trig_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func__long_double_trig_use=no + glibcxx_cv_func__long_double_trig_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -53603,8 +52081,8 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__long_double_trig_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__long_double_trig_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__long_double_trig_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__long_double_trig_use" >&6; } if test x$glibcxx_cv_func__long_double_trig_use = x"yes"; then @@ -53618,9 +52096,9 @@ echo "${ECHO_T}$glibcxx_cv_func__long_double_trig_use" >&6 for ac_func in _acosl _asinl _atanl _cosl _sinl _tanl _coshl _sinhl _tanhl do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -53651,68 +52129,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -53737,15 +52207,14 @@ done - echo "$as_me:$LINENO: checking for long double round functions" >&5 -echo $ECHO_N "checking for long double round functions... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for long double round functions" >&5 +echo $ECHO_N "checking for long double round functions... $ECHO_C" >&6; } if test "${glibcxx_cv_func_long_double_round_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -53767,35 +52236,31 @@ ceill (0); floorl (0); } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func_long_double_round_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_long_double_round_use=no + glibcxx_cv_func_long_double_round_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -53804,17 +52269,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_long_double_round_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_long_double_round_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_long_double_round_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_long_double_round_use" >&6; } if test x$glibcxx_cv_func_long_double_round_use = x"yes"; then for ac_func in ceill floorl do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -53845,68 +52310,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -53916,15 +52373,14 @@ fi done else - echo "$as_me:$LINENO: checking for _long double round functions" >&5 -echo $ECHO_N "checking for _long double round functions... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for _long double round functions" >&5 +echo $ECHO_N "checking for _long double round functions... $ECHO_C" >&6; } if test "${glibcxx_cv_func__long_double_round_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -53946,35 +52402,31 @@ _ceill (0); _floorl (0); } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func__long_double_round_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func__long_double_round_use=no + glibcxx_cv_func__long_double_round_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -53983,17 +52435,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__long_double_round_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__long_double_round_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__long_double_round_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__long_double_round_use" >&6; } if test x$glibcxx_cv_func__long_double_round_use = x"yes"; then for ac_func in _ceill _floorl do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -54024,68 +52476,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -54104,16 +52548,15 @@ done - echo "$as_me:$LINENO: checking for isnanl declaration" >&5 -echo $ECHO_N "checking for isnanl declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for isnanl declaration" >&5 +echo $ECHO_N "checking for isnanl declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func_isnanl_use+set} != xset; then if test "${glibcxx_cv_func_isnanl_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -54139,35 +52582,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func_isnanl_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_isnanl_use=no + glibcxx_cv_func_isnanl_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -54178,17 +52617,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_isnanl_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_isnanl_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_isnanl_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_isnanl_use" >&6; } if test x$glibcxx_cv_func_isnanl_use = x"yes"; then for ac_func in isnanl do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -54219,68 +52658,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -54291,16 +52722,15 @@ done else - echo "$as_me:$LINENO: checking for _isnanl declaration" >&5 -echo $ECHO_N "checking for _isnanl declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for _isnanl declaration" >&5 +echo $ECHO_N "checking for _isnanl declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func__isnanl_use+set} != xset; then if test "${glibcxx_cv_func__isnanl_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -54326,35 +52756,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func__isnanl_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func__isnanl_use=no + glibcxx_cv_func__isnanl_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -54365,17 +52791,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__isnanl_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__isnanl_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__isnanl_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__isnanl_use" >&6; } if test x$glibcxx_cv_func__isnanl_use = x"yes"; then for ac_func in _isnanl do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -54406,68 +52832,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -54484,16 +52902,15 @@ done - echo "$as_me:$LINENO: checking for isinfl declaration" >&5 -echo $ECHO_N "checking for isinfl declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for isinfl declaration" >&5 +echo $ECHO_N "checking for isinfl declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func_isinfl_use+set} != xset; then if test "${glibcxx_cv_func_isinfl_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -54519,35 +52936,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func_isinfl_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_isinfl_use=no + glibcxx_cv_func_isinfl_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -54558,17 +52971,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_isinfl_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_isinfl_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_isinfl_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_isinfl_use" >&6; } if test x$glibcxx_cv_func_isinfl_use = x"yes"; then for ac_func in isinfl do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -54599,68 +53012,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -54671,16 +53076,15 @@ done else - echo "$as_me:$LINENO: checking for _isinfl declaration" >&5 -echo $ECHO_N "checking for _isinfl declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for _isinfl declaration" >&5 +echo $ECHO_N "checking for _isinfl declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func__isinfl_use+set} != xset; then if test "${glibcxx_cv_func__isinfl_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -54706,35 +53110,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func__isinfl_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func__isinfl_use=no + glibcxx_cv_func__isinfl_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -54745,17 +53145,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__isinfl_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__isinfl_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__isinfl_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__isinfl_use" >&6; } if test x$glibcxx_cv_func__isinfl_use = x"yes"; then for ac_func in _isinfl do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -54786,68 +53186,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -54864,16 +53256,15 @@ done - echo "$as_me:$LINENO: checking for copysignl declaration" >&5 -echo $ECHO_N "checking for copysignl declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for copysignl declaration" >&5 +echo $ECHO_N "checking for copysignl declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func_copysignl_use+set} != xset; then if test "${glibcxx_cv_func_copysignl_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -54895,35 +53286,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func_copysignl_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_copysignl_use=no + glibcxx_cv_func_copysignl_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -54934,17 +53321,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_copysignl_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_copysignl_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_copysignl_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_copysignl_use" >&6; } if test x$glibcxx_cv_func_copysignl_use = x"yes"; then for ac_func in copysignl do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -54975,68 +53362,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -55047,16 +53426,15 @@ done else - echo "$as_me:$LINENO: checking for _copysignl declaration" >&5 -echo $ECHO_N "checking for _copysignl declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for _copysignl declaration" >&5 +echo $ECHO_N "checking for _copysignl declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func__copysignl_use+set} != xset; then if test "${glibcxx_cv_func__copysignl_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -55078,35 +53456,207 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + glibcxx_cv_func__copysignl_use=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + glibcxx_cv_func__copysignl_use=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +fi + + fi + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__copysignl_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__copysignl_use" >&6; } + + if test x$glibcxx_cv_func__copysignl_use = x"yes"; then + +for ac_func in _copysignl +do +as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test x$gcc_no_link = xyes; then + { { echo "$as_me:$LINENO: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&5 +echo "$as_me: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&2;} + { (exit 1); exit 1; }; } +fi +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define $ac_func to an innocuous variant, in case declares $ac_func. + For example, HP-UX 11i declares gettimeofday. */ +#define $ac_func innocuous_$ac_func + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $ac_func (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $ac_func + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char $ac_func (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_$ac_func || defined __stub___$ac_func +choke me +#endif + +int +main () +{ +return $ac_func (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then + eval "$as_ac_var=yes" +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + eval "$as_ac_var=no" +fi + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +fi +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } +if test `eval echo '${'$as_ac_var'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +fi +done + + fi + fi + + + + + + + { echo "$as_me:$LINENO: checking for atan2l declaration" >&5 +echo $ECHO_N "checking for atan2l declaration... $ECHO_C" >&6; } + if test x${glibcxx_cv_func_atan2l_use+set} != xset; then + if test "${glibcxx_cv_func_atan2l_use+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + + ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +int +main () +{ + atan2l(0, 0); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - glibcxx_cv_func__copysignl_use=yes + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + glibcxx_cv_func_atan2l_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func__copysignl_use=no + glibcxx_cv_func_atan2l_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -55117,17 +53667,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__copysignl_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__copysignl_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_atan2l_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_atan2l_use" >&6; } - if test x$glibcxx_cv_func__copysignl_use = x"yes"; then + if test x$glibcxx_cv_func_atan2l_use = x"yes"; then -for ac_func in _copysignl +for ac_func in atan2l do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -55158,257 +53708,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ -#ifdef __cplusplus -extern "C" -{ -#endif -/* We use char because int might match the return type of a gcc2 +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ -char $ac_func (); -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) -choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} -#endif - -int -main () -{ -return f != $ac_func; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - eval "$as_ac_var=yes" -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -eval "$as_ac_var=no" -fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 -if test `eval echo '${'$as_ac_var'}'` = yes; then - cat >>confdefs.h <<_ACEOF -#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 -_ACEOF - -fi -done - - fi - fi - - - - - - - echo "$as_me:$LINENO: checking for atan2l declaration" >&5 -echo $ECHO_N "checking for atan2l declaration... $ECHO_C" >&6 - if test x${glibcxx_cv_func_atan2l_use+set} != xset; then - if test "${glibcxx_cv_func_atan2l_use+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - - - - ac_ext=cc -ac_cpp='$CXXCPP $CPPFLAGS' -ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_cxx_compiler_gnu - - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include -int -main () -{ - atan2l(0, 0); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - glibcxx_cv_func_atan2l_use=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -glibcxx_cv_func_atan2l_use=no -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext - ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - - -fi - - fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_atan2l_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_atan2l_use" >&6 - - if test x$glibcxx_cv_func_atan2l_use = x"yes"; then - -for ac_func in atan2l -do -as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test x$gcc_no_link = xyes; then - { { echo "$as_me:$LINENO: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&5 -echo "$as_me: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&2;} - { (exit 1); exit 1; }; } -fi -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -/* Define $ac_func to an innocuous variant, in case declares $ac_func. - For example, HP-UX 11i declares gettimeofday. */ -#define $ac_func innocuous_$ac_func - -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char $ac_func (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ - -#ifdef __STDC__ -# include -#else -# include -#endif - -#undef $ac_func - -/* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -55419,16 +53772,15 @@ done else - echo "$as_me:$LINENO: checking for _atan2l declaration" >&5 -echo $ECHO_N "checking for _atan2l declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for _atan2l declaration" >&5 +echo $ECHO_N "checking for _atan2l declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func__atan2l_use+set} != xset; then if test "${glibcxx_cv_func__atan2l_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -55450,35 +53802,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func__atan2l_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func__atan2l_use=no + glibcxx_cv_func__atan2l_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -55489,17 +53837,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__atan2l_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__atan2l_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__atan2l_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__atan2l_use" >&6; } if test x$glibcxx_cv_func__atan2l_use = x"yes"; then for ac_func in _atan2l do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -55530,68 +53878,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -55608,16 +53948,15 @@ done - echo "$as_me:$LINENO: checking for expl declaration" >&5 -echo $ECHO_N "checking for expl declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for expl declaration" >&5 +echo $ECHO_N "checking for expl declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func_expl_use+set} != xset; then if test "${glibcxx_cv_func_expl_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -55643,35 +53982,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func_expl_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_expl_use=no + glibcxx_cv_func_expl_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -55682,17 +54017,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_expl_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_expl_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_expl_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_expl_use" >&6; } if test x$glibcxx_cv_func_expl_use = x"yes"; then for ac_func in expl do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -55723,68 +54058,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -55795,16 +54122,15 @@ done else - echo "$as_me:$LINENO: checking for _expl declaration" >&5 -echo $ECHO_N "checking for _expl declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for _expl declaration" >&5 +echo $ECHO_N "checking for _expl declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func__expl_use+set} != xset; then if test "${glibcxx_cv_func__expl_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -55830,35 +54156,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func__expl_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func__expl_use=no + glibcxx_cv_func__expl_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -55869,17 +54191,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__expl_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__expl_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__expl_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__expl_use" >&6; } if test x$glibcxx_cv_func__expl_use = x"yes"; then for ac_func in _expl do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -55910,68 +54232,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -55988,16 +54302,15 @@ done - echo "$as_me:$LINENO: checking for fabsl declaration" >&5 -echo $ECHO_N "checking for fabsl declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for fabsl declaration" >&5 +echo $ECHO_N "checking for fabsl declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func_fabsl_use+set} != xset; then if test "${glibcxx_cv_func_fabsl_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -56023,35 +54336,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func_fabsl_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_fabsl_use=no + glibcxx_cv_func_fabsl_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -56062,17 +54371,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_fabsl_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_fabsl_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_fabsl_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_fabsl_use" >&6; } if test x$glibcxx_cv_func_fabsl_use = x"yes"; then for ac_func in fabsl do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -56103,68 +54412,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -56175,16 +54476,15 @@ done else - echo "$as_me:$LINENO: checking for _fabsl declaration" >&5 -echo $ECHO_N "checking for _fabsl declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for _fabsl declaration" >&5 +echo $ECHO_N "checking for _fabsl declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func__fabsl_use+set} != xset; then if test "${glibcxx_cv_func__fabsl_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -56210,35 +54510,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func__fabsl_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func__fabsl_use=no + glibcxx_cv_func__fabsl_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -56249,17 +54545,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__fabsl_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__fabsl_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__fabsl_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__fabsl_use" >&6; } if test x$glibcxx_cv_func__fabsl_use = x"yes"; then for ac_func in _fabsl do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -56290,68 +54586,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -56368,16 +54656,15 @@ done - echo "$as_me:$LINENO: checking for fmodl declaration" >&5 -echo $ECHO_N "checking for fmodl declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for fmodl declaration" >&5 +echo $ECHO_N "checking for fmodl declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func_fmodl_use+set} != xset; then if test "${glibcxx_cv_func_fmodl_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -56399,35 +54686,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func_fmodl_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_fmodl_use=no + glibcxx_cv_func_fmodl_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -56438,17 +54721,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_fmodl_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_fmodl_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_fmodl_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_fmodl_use" >&6; } if test x$glibcxx_cv_func_fmodl_use = x"yes"; then for ac_func in fmodl do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -56479,68 +54762,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -56551,16 +54826,15 @@ done else - echo "$as_me:$LINENO: checking for _fmodl declaration" >&5 -echo $ECHO_N "checking for _fmodl declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for _fmodl declaration" >&5 +echo $ECHO_N "checking for _fmodl declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func__fmodl_use+set} != xset; then if test "${glibcxx_cv_func__fmodl_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -56582,35 +54856,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func__fmodl_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func__fmodl_use=no + glibcxx_cv_func__fmodl_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -56621,17 +54891,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__fmodl_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__fmodl_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__fmodl_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__fmodl_use" >&6; } if test x$glibcxx_cv_func__fmodl_use = x"yes"; then for ac_func in _fmodl do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -56662,68 +54932,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -56740,16 +55002,15 @@ done - echo "$as_me:$LINENO: checking for frexpl declaration" >&5 -echo $ECHO_N "checking for frexpl declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for frexpl declaration" >&5 +echo $ECHO_N "checking for frexpl declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func_frexpl_use+set} != xset; then if test "${glibcxx_cv_func_frexpl_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -56771,35 +55032,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func_frexpl_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_frexpl_use=no + glibcxx_cv_func_frexpl_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -56810,17 +55067,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_frexpl_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_frexpl_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_frexpl_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_frexpl_use" >&6; } if test x$glibcxx_cv_func_frexpl_use = x"yes"; then for ac_func in frexpl do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -56851,68 +55108,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -56923,16 +55172,15 @@ done else - echo "$as_me:$LINENO: checking for _frexpl declaration" >&5 -echo $ECHO_N "checking for _frexpl declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for _frexpl declaration" >&5 +echo $ECHO_N "checking for _frexpl declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func__frexpl_use+set} != xset; then if test "${glibcxx_cv_func__frexpl_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -56954,35 +55202,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func__frexpl_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func__frexpl_use=no + glibcxx_cv_func__frexpl_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -56993,17 +55237,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__frexpl_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__frexpl_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__frexpl_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__frexpl_use" >&6; } if test x$glibcxx_cv_func__frexpl_use = x"yes"; then for ac_func in _frexpl do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -57034,68 +55278,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -57112,16 +55348,15 @@ done - echo "$as_me:$LINENO: checking for hypotl declaration" >&5 -echo $ECHO_N "checking for hypotl declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for hypotl declaration" >&5 +echo $ECHO_N "checking for hypotl declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func_hypotl_use+set} != xset; then if test "${glibcxx_cv_func_hypotl_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -57143,35 +55378,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func_hypotl_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_hypotl_use=no + glibcxx_cv_func_hypotl_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -57182,17 +55413,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_hypotl_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_hypotl_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_hypotl_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_hypotl_use" >&6; } if test x$glibcxx_cv_func_hypotl_use = x"yes"; then for ac_func in hypotl do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -57223,68 +55454,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -57295,16 +55518,15 @@ done else - echo "$as_me:$LINENO: checking for _hypotl declaration" >&5 -echo $ECHO_N "checking for _hypotl declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for _hypotl declaration" >&5 +echo $ECHO_N "checking for _hypotl declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func__hypotl_use+set} != xset; then if test "${glibcxx_cv_func__hypotl_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -57326,35 +55548,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func__hypotl_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func__hypotl_use=no + glibcxx_cv_func__hypotl_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -57365,17 +55583,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__hypotl_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__hypotl_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__hypotl_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__hypotl_use" >&6; } if test x$glibcxx_cv_func__hypotl_use = x"yes"; then for ac_func in _hypotl do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -57406,68 +55624,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -57484,16 +55694,15 @@ done - echo "$as_me:$LINENO: checking for ldexpl declaration" >&5 -echo $ECHO_N "checking for ldexpl declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for ldexpl declaration" >&5 +echo $ECHO_N "checking for ldexpl declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func_ldexpl_use+set} != xset; then if test "${glibcxx_cv_func_ldexpl_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -57515,35 +55724,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func_ldexpl_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_ldexpl_use=no + glibcxx_cv_func_ldexpl_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -57554,17 +55759,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_ldexpl_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_ldexpl_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_ldexpl_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_ldexpl_use" >&6; } if test x$glibcxx_cv_func_ldexpl_use = x"yes"; then for ac_func in ldexpl do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -57595,68 +55800,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -57667,16 +55864,15 @@ done else - echo "$as_me:$LINENO: checking for _ldexpl declaration" >&5 -echo $ECHO_N "checking for _ldexpl declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for _ldexpl declaration" >&5 +echo $ECHO_N "checking for _ldexpl declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func__ldexpl_use+set} != xset; then if test "${glibcxx_cv_func__ldexpl_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -57698,35 +55894,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func__ldexpl_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func__ldexpl_use=no + glibcxx_cv_func__ldexpl_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -57737,17 +55929,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__ldexpl_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__ldexpl_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__ldexpl_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__ldexpl_use" >&6; } if test x$glibcxx_cv_func__ldexpl_use = x"yes"; then for ac_func in _ldexpl do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -57778,68 +55970,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -57856,16 +56040,15 @@ done - echo "$as_me:$LINENO: checking for logl declaration" >&5 -echo $ECHO_N "checking for logl declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for logl declaration" >&5 +echo $ECHO_N "checking for logl declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func_logl_use+set} != xset; then if test "${glibcxx_cv_func_logl_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -57891,35 +56074,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func_logl_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_logl_use=no + glibcxx_cv_func_logl_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -57930,17 +56109,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_logl_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_logl_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_logl_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_logl_use" >&6; } if test x$glibcxx_cv_func_logl_use = x"yes"; then for ac_func in logl do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -57971,68 +56150,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -58043,16 +56214,15 @@ done else - echo "$as_me:$LINENO: checking for _logl declaration" >&5 -echo $ECHO_N "checking for _logl declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for _logl declaration" >&5 +echo $ECHO_N "checking for _logl declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func__logl_use+set} != xset; then if test "${glibcxx_cv_func__logl_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -58078,35 +56248,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func__logl_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func__logl_use=no + glibcxx_cv_func__logl_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -58117,17 +56283,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__logl_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__logl_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__logl_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__logl_use" >&6; } if test x$glibcxx_cv_func__logl_use = x"yes"; then for ac_func in _logl do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -58158,68 +56324,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -58236,16 +56394,15 @@ done - echo "$as_me:$LINENO: checking for log10l declaration" >&5 -echo $ECHO_N "checking for log10l declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for log10l declaration" >&5 +echo $ECHO_N "checking for log10l declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func_log10l_use+set} != xset; then if test "${glibcxx_cv_func_log10l_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -58271,35 +56428,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func_log10l_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_log10l_use=no + glibcxx_cv_func_log10l_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -58310,17 +56463,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_log10l_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_log10l_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_log10l_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_log10l_use" >&6; } if test x$glibcxx_cv_func_log10l_use = x"yes"; then for ac_func in log10l do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -58351,68 +56504,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -58423,16 +56568,15 @@ done else - echo "$as_me:$LINENO: checking for _log10l declaration" >&5 -echo $ECHO_N "checking for _log10l declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for _log10l declaration" >&5 +echo $ECHO_N "checking for _log10l declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func__log10l_use+set} != xset; then if test "${glibcxx_cv_func__log10l_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -58458,35 +56602,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func__log10l_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func__log10l_use=no + glibcxx_cv_func__log10l_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -58497,17 +56637,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__log10l_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__log10l_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__log10l_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__log10l_use" >&6; } if test x$glibcxx_cv_func__log10l_use = x"yes"; then for ac_func in _log10l do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -58538,68 +56678,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -58616,16 +56748,15 @@ done - echo "$as_me:$LINENO: checking for modfl declaration" >&5 -echo $ECHO_N "checking for modfl declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for modfl declaration" >&5 +echo $ECHO_N "checking for modfl declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func_modfl_use+set} != xset; then if test "${glibcxx_cv_func_modfl_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -58647,35 +56778,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func_modfl_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_modfl_use=no + glibcxx_cv_func_modfl_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -58686,17 +56813,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_modfl_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_modfl_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_modfl_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_modfl_use" >&6; } if test x$glibcxx_cv_func_modfl_use = x"yes"; then for ac_func in modfl do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -58727,68 +56854,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -58799,16 +56918,15 @@ done else - echo "$as_me:$LINENO: checking for _modfl declaration" >&5 -echo $ECHO_N "checking for _modfl declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for _modfl declaration" >&5 +echo $ECHO_N "checking for _modfl declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func__modfl_use+set} != xset; then if test "${glibcxx_cv_func__modfl_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -58830,35 +56948,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func__modfl_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func__modfl_use=no + glibcxx_cv_func__modfl_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -58869,17 +56983,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__modfl_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__modfl_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__modfl_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__modfl_use" >&6; } if test x$glibcxx_cv_func__modfl_use = x"yes"; then for ac_func in _modfl do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -58910,68 +57024,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -58988,16 +57094,15 @@ done - echo "$as_me:$LINENO: checking for powl declaration" >&5 -echo $ECHO_N "checking for powl declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for powl declaration" >&5 +echo $ECHO_N "checking for powl declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func_powl_use+set} != xset; then if test "${glibcxx_cv_func_powl_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -59019,35 +57124,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func_powl_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_powl_use=no + glibcxx_cv_func_powl_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -59058,17 +57159,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_powl_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_powl_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_powl_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_powl_use" >&6; } if test x$glibcxx_cv_func_powl_use = x"yes"; then for ac_func in powl do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -59099,68 +57200,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -59171,16 +57264,15 @@ done else - echo "$as_me:$LINENO: checking for _powl declaration" >&5 -echo $ECHO_N "checking for _powl declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for _powl declaration" >&5 +echo $ECHO_N "checking for _powl declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func__powl_use+set} != xset; then if test "${glibcxx_cv_func__powl_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -59202,35 +57294,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func__powl_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func__powl_use=no + glibcxx_cv_func__powl_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -59241,17 +57329,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__powl_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__powl_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__powl_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__powl_use" >&6; } if test x$glibcxx_cv_func__powl_use = x"yes"; then for ac_func in _powl do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -59282,68 +57370,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -59360,16 +57440,15 @@ done - echo "$as_me:$LINENO: checking for sqrtl declaration" >&5 -echo $ECHO_N "checking for sqrtl declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for sqrtl declaration" >&5 +echo $ECHO_N "checking for sqrtl declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func_sqrtl_use+set} != xset; then if test "${glibcxx_cv_func_sqrtl_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -59395,35 +57474,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func_sqrtl_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_sqrtl_use=no + glibcxx_cv_func_sqrtl_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -59434,17 +57509,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_sqrtl_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_sqrtl_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_sqrtl_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_sqrtl_use" >&6; } if test x$glibcxx_cv_func_sqrtl_use = x"yes"; then for ac_func in sqrtl do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -59475,68 +57550,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -59547,16 +57614,15 @@ done else - echo "$as_me:$LINENO: checking for _sqrtl declaration" >&5 -echo $ECHO_N "checking for _sqrtl declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for _sqrtl declaration" >&5 +echo $ECHO_N "checking for _sqrtl declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func__sqrtl_use+set} != xset; then if test "${glibcxx_cv_func__sqrtl_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -59582,35 +57648,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func__sqrtl_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func__sqrtl_use=no + glibcxx_cv_func__sqrtl_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -59621,17 +57683,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__sqrtl_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__sqrtl_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__sqrtl_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__sqrtl_use" >&6; } if test x$glibcxx_cv_func__sqrtl_use = x"yes"; then for ac_func in _sqrtl do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -59662,68 +57724,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -59740,16 +57794,15 @@ done - echo "$as_me:$LINENO: checking for sincosl declaration" >&5 -echo $ECHO_N "checking for sincosl declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for sincosl declaration" >&5 +echo $ECHO_N "checking for sincosl declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func_sincosl_use+set} != xset; then if test "${glibcxx_cv_func_sincosl_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -59771,35 +57824,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func_sincosl_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_sincosl_use=no + glibcxx_cv_func_sincosl_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -59810,17 +57859,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_sincosl_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_sincosl_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_sincosl_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_sincosl_use" >&6; } if test x$glibcxx_cv_func_sincosl_use = x"yes"; then for ac_func in sincosl do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -59851,68 +57900,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -59923,16 +57964,15 @@ done else - echo "$as_me:$LINENO: checking for _sincosl declaration" >&5 -echo $ECHO_N "checking for _sincosl declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for _sincosl declaration" >&5 +echo $ECHO_N "checking for _sincosl declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func__sincosl_use+set} != xset; then if test "${glibcxx_cv_func__sincosl_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -59954,35 +57994,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func__sincosl_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func__sincosl_use=no + glibcxx_cv_func__sincosl_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -59993,17 +58029,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__sincosl_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__sincosl_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__sincosl_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__sincosl_use" >&6; } if test x$glibcxx_cv_func__sincosl_use = x"yes"; then for ac_func in _sincosl do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -60034,68 +58070,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -60112,16 +58140,15 @@ done - echo "$as_me:$LINENO: checking for finitel declaration" >&5 -echo $ECHO_N "checking for finitel declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for finitel declaration" >&5 +echo $ECHO_N "checking for finitel declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func_finitel_use+set} != xset; then if test "${glibcxx_cv_func_finitel_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -60147,35 +58174,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func_finitel_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_finitel_use=no + glibcxx_cv_func_finitel_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -60186,17 +58209,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_finitel_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_finitel_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_finitel_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_finitel_use" >&6; } if test x$glibcxx_cv_func_finitel_use = x"yes"; then for ac_func in finitel do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -60227,68 +58250,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -60299,16 +58314,15 @@ done else - echo "$as_me:$LINENO: checking for _finitel declaration" >&5 -echo $ECHO_N "checking for _finitel declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for _finitel declaration" >&5 +echo $ECHO_N "checking for _finitel declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func__finitel_use+set} != xset; then if test "${glibcxx_cv_func__finitel_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -60334,35 +58348,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func__finitel_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func__finitel_use=no + glibcxx_cv_func__finitel_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -60373,17 +58383,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__finitel_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__finitel_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__finitel_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__finitel_use" >&6; } if test x$glibcxx_cv_func__finitel_use = x"yes"; then for ac_func in _finitel do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -60414,68 +58424,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -60496,16 +58498,15 @@ done - echo "$as_me:$LINENO: checking for __builtin_abs declaration" >&5 -echo $ECHO_N "checking for __builtin_abs declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for __builtin_abs declaration" >&5 +echo $ECHO_N "checking for __builtin_abs declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func___builtin_abs_use+set} != xset; then if test "${glibcxx_cv_func___builtin_abs_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -60527,35 +58528,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func___builtin_abs_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func___builtin_abs_use=no + glibcxx_cv_func___builtin_abs_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -60566,11 +58563,11 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_abs_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func___builtin_abs_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_abs_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func___builtin_abs_use" >&6; } if test x$glibcxx_cv_func___builtin_abs_use = x"yes"; then - echo "$as_me:$LINENO: checking for __builtin_abs linkage" >&5 -echo $ECHO_N "checking for __builtin_abs linkage... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for __builtin_abs linkage" >&5 +echo $ECHO_N "checking for __builtin_abs linkage... $ECHO_C" >&6; } if test x${glibcxx_cv_func___builtin_abs_link+set} != xset; then if test "${glibcxx_cv_func___builtin_abs_link+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 @@ -60597,42 +58594,39 @@ main () } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then glibcxx_cv_func___builtin_abs_link=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func___builtin_abs_link=no + glibcxx_cv_func___builtin_abs_link=no fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_abs_link" >&5 -echo "${ECHO_T}$glibcxx_cv_func___builtin_abs_link" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_abs_link" >&5 +echo "${ECHO_T}$glibcxx_cv_func___builtin_abs_link" >&6; } if test x$glibcxx_cv_func___builtin_abs_link = x"yes"; then @@ -60645,16 +58639,15 @@ _ACEOF fi - echo "$as_me:$LINENO: checking for __builtin_fabsf declaration" >&5 -echo $ECHO_N "checking for __builtin_fabsf declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for __builtin_fabsf declaration" >&5 +echo $ECHO_N "checking for __builtin_fabsf declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func___builtin_fabsf_use+set} != xset; then if test "${glibcxx_cv_func___builtin_fabsf_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -60676,35 +58669,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func___builtin_fabsf_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func___builtin_fabsf_use=no + glibcxx_cv_func___builtin_fabsf_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -60715,11 +58704,11 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_fabsf_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func___builtin_fabsf_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_fabsf_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func___builtin_fabsf_use" >&6; } if test x$glibcxx_cv_func___builtin_fabsf_use = x"yes"; then - echo "$as_me:$LINENO: checking for __builtin_fabsf linkage" >&5 -echo $ECHO_N "checking for __builtin_fabsf linkage... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for __builtin_fabsf linkage" >&5 +echo $ECHO_N "checking for __builtin_fabsf linkage... $ECHO_C" >&6; } if test x${glibcxx_cv_func___builtin_fabsf_link+set} != xset; then if test "${glibcxx_cv_func___builtin_fabsf_link+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 @@ -60746,42 +58735,39 @@ main () } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then glibcxx_cv_func___builtin_fabsf_link=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func___builtin_fabsf_link=no + glibcxx_cv_func___builtin_fabsf_link=no fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_fabsf_link" >&5 -echo "${ECHO_T}$glibcxx_cv_func___builtin_fabsf_link" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_fabsf_link" >&5 +echo "${ECHO_T}$glibcxx_cv_func___builtin_fabsf_link" >&6; } if test x$glibcxx_cv_func___builtin_fabsf_link = x"yes"; then @@ -60794,16 +58780,15 @@ _ACEOF fi - echo "$as_me:$LINENO: checking for __builtin_fabs declaration" >&5 -echo $ECHO_N "checking for __builtin_fabs declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for __builtin_fabs declaration" >&5 +echo $ECHO_N "checking for __builtin_fabs declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func___builtin_fabs_use+set} != xset; then if test "${glibcxx_cv_func___builtin_fabs_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -60825,35 +58810,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func___builtin_fabs_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func___builtin_fabs_use=no + glibcxx_cv_func___builtin_fabs_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -60864,11 +58845,11 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_fabs_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func___builtin_fabs_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_fabs_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func___builtin_fabs_use" >&6; } if test x$glibcxx_cv_func___builtin_fabs_use = x"yes"; then - echo "$as_me:$LINENO: checking for __builtin_fabs linkage" >&5 -echo $ECHO_N "checking for __builtin_fabs linkage... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for __builtin_fabs linkage" >&5 +echo $ECHO_N "checking for __builtin_fabs linkage... $ECHO_C" >&6; } if test x${glibcxx_cv_func___builtin_fabs_link+set} != xset; then if test "${glibcxx_cv_func___builtin_fabs_link+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 @@ -60895,42 +58876,39 @@ main () } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then glibcxx_cv_func___builtin_fabs_link=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func___builtin_fabs_link=no + glibcxx_cv_func___builtin_fabs_link=no fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_fabs_link" >&5 -echo "${ECHO_T}$glibcxx_cv_func___builtin_fabs_link" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_fabs_link" >&5 +echo "${ECHO_T}$glibcxx_cv_func___builtin_fabs_link" >&6; } if test x$glibcxx_cv_func___builtin_fabs_link = x"yes"; then @@ -60943,16 +58921,15 @@ _ACEOF fi - echo "$as_me:$LINENO: checking for __builtin_fabsl declaration" >&5 -echo $ECHO_N "checking for __builtin_fabsl declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for __builtin_fabsl declaration" >&5 +echo $ECHO_N "checking for __builtin_fabsl declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func___builtin_fabsl_use+set} != xset; then if test "${glibcxx_cv_func___builtin_fabsl_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -60974,35 +58951,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func___builtin_fabsl_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func___builtin_fabsl_use=no + glibcxx_cv_func___builtin_fabsl_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -61013,11 +58986,11 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_fabsl_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func___builtin_fabsl_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_fabsl_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func___builtin_fabsl_use" >&6; } if test x$glibcxx_cv_func___builtin_fabsl_use = x"yes"; then - echo "$as_me:$LINENO: checking for __builtin_fabsl linkage" >&5 -echo $ECHO_N "checking for __builtin_fabsl linkage... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for __builtin_fabsl linkage" >&5 +echo $ECHO_N "checking for __builtin_fabsl linkage... $ECHO_C" >&6; } if test x${glibcxx_cv_func___builtin_fabsl_link+set} != xset; then if test "${glibcxx_cv_func___builtin_fabsl_link+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 @@ -61044,42 +59017,39 @@ main () } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then glibcxx_cv_func___builtin_fabsl_link=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func___builtin_fabsl_link=no + glibcxx_cv_func___builtin_fabsl_link=no fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_fabsl_link" >&5 -echo "${ECHO_T}$glibcxx_cv_func___builtin_fabsl_link" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_fabsl_link" >&5 +echo "${ECHO_T}$glibcxx_cv_func___builtin_fabsl_link" >&6; } if test x$glibcxx_cv_func___builtin_fabsl_link = x"yes"; then @@ -61092,16 +59062,15 @@ _ACEOF fi - echo "$as_me:$LINENO: checking for __builtin_labs declaration" >&5 -echo $ECHO_N "checking for __builtin_labs declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for __builtin_labs declaration" >&5 +echo $ECHO_N "checking for __builtin_labs declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func___builtin_labs_use+set} != xset; then if test "${glibcxx_cv_func___builtin_labs_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -61123,35 +59092,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func___builtin_labs_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func___builtin_labs_use=no + glibcxx_cv_func___builtin_labs_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -61162,11 +59127,11 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_labs_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func___builtin_labs_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_labs_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func___builtin_labs_use" >&6; } if test x$glibcxx_cv_func___builtin_labs_use = x"yes"; then - echo "$as_me:$LINENO: checking for __builtin_labs linkage" >&5 -echo $ECHO_N "checking for __builtin_labs linkage... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for __builtin_labs linkage" >&5 +echo $ECHO_N "checking for __builtin_labs linkage... $ECHO_C" >&6; } if test x${glibcxx_cv_func___builtin_labs_link+set} != xset; then if test "${glibcxx_cv_func___builtin_labs_link+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 @@ -61193,42 +59158,39 @@ main () } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then glibcxx_cv_func___builtin_labs_link=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func___builtin_labs_link=no + glibcxx_cv_func___builtin_labs_link=no fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_labs_link" >&5 -echo "${ECHO_T}$glibcxx_cv_func___builtin_labs_link" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_labs_link" >&5 +echo "${ECHO_T}$glibcxx_cv_func___builtin_labs_link" >&6; } if test x$glibcxx_cv_func___builtin_labs_link = x"yes"; then @@ -61242,16 +59204,15 @@ _ACEOF - echo "$as_me:$LINENO: checking for __builtin_sqrtf declaration" >&5 -echo $ECHO_N "checking for __builtin_sqrtf declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for __builtin_sqrtf declaration" >&5 +echo $ECHO_N "checking for __builtin_sqrtf declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func___builtin_sqrtf_use+set} != xset; then if test "${glibcxx_cv_func___builtin_sqrtf_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -61273,35 +59234,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func___builtin_sqrtf_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func___builtin_sqrtf_use=no + glibcxx_cv_func___builtin_sqrtf_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -61312,11 +59269,11 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_sqrtf_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func___builtin_sqrtf_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_sqrtf_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func___builtin_sqrtf_use" >&6; } if test x$glibcxx_cv_func___builtin_sqrtf_use = x"yes"; then - echo "$as_me:$LINENO: checking for __builtin_sqrtf linkage" >&5 -echo $ECHO_N "checking for __builtin_sqrtf linkage... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for __builtin_sqrtf linkage" >&5 +echo $ECHO_N "checking for __builtin_sqrtf linkage... $ECHO_C" >&6; } if test x${glibcxx_cv_func___builtin_sqrtf_link+set} != xset; then if test "${glibcxx_cv_func___builtin_sqrtf_link+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 @@ -61343,42 +59300,39 @@ main () } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then glibcxx_cv_func___builtin_sqrtf_link=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func___builtin_sqrtf_link=no + glibcxx_cv_func___builtin_sqrtf_link=no fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_sqrtf_link" >&5 -echo "${ECHO_T}$glibcxx_cv_func___builtin_sqrtf_link" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_sqrtf_link" >&5 +echo "${ECHO_T}$glibcxx_cv_func___builtin_sqrtf_link" >&6; } if test x$glibcxx_cv_func___builtin_sqrtf_link = x"yes"; then @@ -61391,16 +59345,15 @@ _ACEOF fi - echo "$as_me:$LINENO: checking for __builtin_sqrt declaration" >&5 -echo $ECHO_N "checking for __builtin_sqrt declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for __builtin_sqrt declaration" >&5 +echo $ECHO_N "checking for __builtin_sqrt declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func___builtin_sqrt_use+set} != xset; then if test "${glibcxx_cv_func___builtin_sqrt_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -61422,35 +59375,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func___builtin_sqrt_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func___builtin_sqrt_use=no + glibcxx_cv_func___builtin_sqrt_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -61461,11 +59410,11 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_sqrt_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func___builtin_sqrt_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_sqrt_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func___builtin_sqrt_use" >&6; } if test x$glibcxx_cv_func___builtin_sqrt_use = x"yes"; then - echo "$as_me:$LINENO: checking for __builtin_sqrt linkage" >&5 -echo $ECHO_N "checking for __builtin_sqrt linkage... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for __builtin_sqrt linkage" >&5 +echo $ECHO_N "checking for __builtin_sqrt linkage... $ECHO_C" >&6; } if test x${glibcxx_cv_func___builtin_sqrt_link+set} != xset; then if test "${glibcxx_cv_func___builtin_sqrt_link+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 @@ -61492,42 +59441,39 @@ main () } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then glibcxx_cv_func___builtin_sqrt_link=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func___builtin_sqrt_link=no + glibcxx_cv_func___builtin_sqrt_link=no fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_sqrt_link" >&5 -echo "${ECHO_T}$glibcxx_cv_func___builtin_sqrt_link" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_sqrt_link" >&5 +echo "${ECHO_T}$glibcxx_cv_func___builtin_sqrt_link" >&6; } if test x$glibcxx_cv_func___builtin_sqrt_link = x"yes"; then @@ -61540,16 +59486,15 @@ _ACEOF fi - echo "$as_me:$LINENO: checking for __builtin_sqrtl declaration" >&5 -echo $ECHO_N "checking for __builtin_sqrtl declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for __builtin_sqrtl declaration" >&5 +echo $ECHO_N "checking for __builtin_sqrtl declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func___builtin_sqrtl_use+set} != xset; then if test "${glibcxx_cv_func___builtin_sqrtl_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -61571,35 +59516,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func___builtin_sqrtl_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func___builtin_sqrtl_use=no + glibcxx_cv_func___builtin_sqrtl_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -61610,11 +59551,11 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_sqrtl_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func___builtin_sqrtl_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_sqrtl_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func___builtin_sqrtl_use" >&6; } if test x$glibcxx_cv_func___builtin_sqrtl_use = x"yes"; then - echo "$as_me:$LINENO: checking for __builtin_sqrtl linkage" >&5 -echo $ECHO_N "checking for __builtin_sqrtl linkage... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for __builtin_sqrtl linkage" >&5 +echo $ECHO_N "checking for __builtin_sqrtl linkage... $ECHO_C" >&6; } if test x${glibcxx_cv_func___builtin_sqrtl_link+set} != xset; then if test "${glibcxx_cv_func___builtin_sqrtl_link+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 @@ -61641,42 +59582,39 @@ main () } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then glibcxx_cv_func___builtin_sqrtl_link=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func___builtin_sqrtl_link=no + glibcxx_cv_func___builtin_sqrtl_link=no fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_sqrtl_link" >&5 -echo "${ECHO_T}$glibcxx_cv_func___builtin_sqrtl_link" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_sqrtl_link" >&5 +echo "${ECHO_T}$glibcxx_cv_func___builtin_sqrtl_link" >&6; } if test x$glibcxx_cv_func___builtin_sqrtl_link = x"yes"; then @@ -61690,16 +59628,15 @@ _ACEOF - echo "$as_me:$LINENO: checking for __builtin_sinf declaration" >&5 -echo $ECHO_N "checking for __builtin_sinf declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for __builtin_sinf declaration" >&5 +echo $ECHO_N "checking for __builtin_sinf declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func___builtin_sinf_use+set} != xset; then if test "${glibcxx_cv_func___builtin_sinf_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -61721,35 +59658,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func___builtin_sinf_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func___builtin_sinf_use=no + glibcxx_cv_func___builtin_sinf_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -61760,11 +59693,11 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_sinf_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func___builtin_sinf_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_sinf_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func___builtin_sinf_use" >&6; } if test x$glibcxx_cv_func___builtin_sinf_use = x"yes"; then - echo "$as_me:$LINENO: checking for __builtin_sinf linkage" >&5 -echo $ECHO_N "checking for __builtin_sinf linkage... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for __builtin_sinf linkage" >&5 +echo $ECHO_N "checking for __builtin_sinf linkage... $ECHO_C" >&6; } if test x${glibcxx_cv_func___builtin_sinf_link+set} != xset; then if test "${glibcxx_cv_func___builtin_sinf_link+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 @@ -61791,42 +59724,39 @@ main () } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then glibcxx_cv_func___builtin_sinf_link=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func___builtin_sinf_link=no + glibcxx_cv_func___builtin_sinf_link=no fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_sinf_link" >&5 -echo "${ECHO_T}$glibcxx_cv_func___builtin_sinf_link" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_sinf_link" >&5 +echo "${ECHO_T}$glibcxx_cv_func___builtin_sinf_link" >&6; } if test x$glibcxx_cv_func___builtin_sinf_link = x"yes"; then @@ -61839,16 +59769,15 @@ _ACEOF fi - echo "$as_me:$LINENO: checking for __builtin_sin declaration" >&5 -echo $ECHO_N "checking for __builtin_sin declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for __builtin_sin declaration" >&5 +echo $ECHO_N "checking for __builtin_sin declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func___builtin_sin_use+set} != xset; then if test "${glibcxx_cv_func___builtin_sin_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -61870,35 +59799,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func___builtin_sin_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func___builtin_sin_use=no + glibcxx_cv_func___builtin_sin_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -61909,11 +59834,11 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_sin_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func___builtin_sin_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_sin_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func___builtin_sin_use" >&6; } if test x$glibcxx_cv_func___builtin_sin_use = x"yes"; then - echo "$as_me:$LINENO: checking for __builtin_sin linkage" >&5 -echo $ECHO_N "checking for __builtin_sin linkage... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for __builtin_sin linkage" >&5 +echo $ECHO_N "checking for __builtin_sin linkage... $ECHO_C" >&6; } if test x${glibcxx_cv_func___builtin_sin_link+set} != xset; then if test "${glibcxx_cv_func___builtin_sin_link+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 @@ -61940,42 +59865,39 @@ main () } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then glibcxx_cv_func___builtin_sin_link=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func___builtin_sin_link=no + glibcxx_cv_func___builtin_sin_link=no fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_sin_link" >&5 -echo "${ECHO_T}$glibcxx_cv_func___builtin_sin_link" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_sin_link" >&5 +echo "${ECHO_T}$glibcxx_cv_func___builtin_sin_link" >&6; } if test x$glibcxx_cv_func___builtin_sin_link = x"yes"; then @@ -61988,16 +59910,15 @@ _ACEOF fi - echo "$as_me:$LINENO: checking for __builtin_sinl declaration" >&5 -echo $ECHO_N "checking for __builtin_sinl declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for __builtin_sinl declaration" >&5 +echo $ECHO_N "checking for __builtin_sinl declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func___builtin_sinl_use+set} != xset; then if test "${glibcxx_cv_func___builtin_sinl_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -62019,35 +59940,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func___builtin_sinl_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func___builtin_sinl_use=no + glibcxx_cv_func___builtin_sinl_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -62058,11 +59975,11 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_sinl_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func___builtin_sinl_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_sinl_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func___builtin_sinl_use" >&6; } if test x$glibcxx_cv_func___builtin_sinl_use = x"yes"; then - echo "$as_me:$LINENO: checking for __builtin_sinl linkage" >&5 -echo $ECHO_N "checking for __builtin_sinl linkage... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for __builtin_sinl linkage" >&5 +echo $ECHO_N "checking for __builtin_sinl linkage... $ECHO_C" >&6; } if test x${glibcxx_cv_func___builtin_sinl_link+set} != xset; then if test "${glibcxx_cv_func___builtin_sinl_link+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 @@ -62089,42 +60006,39 @@ main () } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then glibcxx_cv_func___builtin_sinl_link=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func___builtin_sinl_link=no + glibcxx_cv_func___builtin_sinl_link=no fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_sinl_link" >&5 -echo "${ECHO_T}$glibcxx_cv_func___builtin_sinl_link" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_sinl_link" >&5 +echo "${ECHO_T}$glibcxx_cv_func___builtin_sinl_link" >&6; } if test x$glibcxx_cv_func___builtin_sinl_link = x"yes"; then @@ -62138,16 +60052,15 @@ _ACEOF - echo "$as_me:$LINENO: checking for __builtin_cosf declaration" >&5 -echo $ECHO_N "checking for __builtin_cosf declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for __builtin_cosf declaration" >&5 +echo $ECHO_N "checking for __builtin_cosf declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func___builtin_cosf_use+set} != xset; then if test "${glibcxx_cv_func___builtin_cosf_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -62169,35 +60082,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func___builtin_cosf_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func___builtin_cosf_use=no + glibcxx_cv_func___builtin_cosf_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -62208,11 +60117,11 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_cosf_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func___builtin_cosf_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_cosf_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func___builtin_cosf_use" >&6; } if test x$glibcxx_cv_func___builtin_cosf_use = x"yes"; then - echo "$as_me:$LINENO: checking for __builtin_cosf linkage" >&5 -echo $ECHO_N "checking for __builtin_cosf linkage... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for __builtin_cosf linkage" >&5 +echo $ECHO_N "checking for __builtin_cosf linkage... $ECHO_C" >&6; } if test x${glibcxx_cv_func___builtin_cosf_link+set} != xset; then if test "${glibcxx_cv_func___builtin_cosf_link+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 @@ -62239,42 +60148,39 @@ main () } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then glibcxx_cv_func___builtin_cosf_link=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func___builtin_cosf_link=no + glibcxx_cv_func___builtin_cosf_link=no fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_cosf_link" >&5 -echo "${ECHO_T}$glibcxx_cv_func___builtin_cosf_link" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_cosf_link" >&5 +echo "${ECHO_T}$glibcxx_cv_func___builtin_cosf_link" >&6; } if test x$glibcxx_cv_func___builtin_cosf_link = x"yes"; then @@ -62287,16 +60193,15 @@ _ACEOF fi - echo "$as_me:$LINENO: checking for __builtin_cos declaration" >&5 -echo $ECHO_N "checking for __builtin_cos declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for __builtin_cos declaration" >&5 +echo $ECHO_N "checking for __builtin_cos declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func___builtin_cos_use+set} != xset; then if test "${glibcxx_cv_func___builtin_cos_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -62318,35 +60223,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func___builtin_cos_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func___builtin_cos_use=no + glibcxx_cv_func___builtin_cos_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -62357,11 +60258,11 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_cos_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func___builtin_cos_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_cos_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func___builtin_cos_use" >&6; } if test x$glibcxx_cv_func___builtin_cos_use = x"yes"; then - echo "$as_me:$LINENO: checking for __builtin_cos linkage" >&5 -echo $ECHO_N "checking for __builtin_cos linkage... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for __builtin_cos linkage" >&5 +echo $ECHO_N "checking for __builtin_cos linkage... $ECHO_C" >&6; } if test x${glibcxx_cv_func___builtin_cos_link+set} != xset; then if test "${glibcxx_cv_func___builtin_cos_link+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 @@ -62388,42 +60289,39 @@ main () } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then glibcxx_cv_func___builtin_cos_link=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func___builtin_cos_link=no + glibcxx_cv_func___builtin_cos_link=no fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_cos_link" >&5 -echo "${ECHO_T}$glibcxx_cv_func___builtin_cos_link" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_cos_link" >&5 +echo "${ECHO_T}$glibcxx_cv_func___builtin_cos_link" >&6; } if test x$glibcxx_cv_func___builtin_cos_link = x"yes"; then @@ -62436,16 +60334,15 @@ _ACEOF fi - echo "$as_me:$LINENO: checking for __builtin_cosl declaration" >&5 -echo $ECHO_N "checking for __builtin_cosl declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for __builtin_cosl declaration" >&5 +echo $ECHO_N "checking for __builtin_cosl declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func___builtin_cosl_use+set} != xset; then if test "${glibcxx_cv_func___builtin_cosl_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -62467,35 +60364,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func___builtin_cosl_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func___builtin_cosl_use=no + glibcxx_cv_func___builtin_cosl_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -62506,11 +60399,11 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_cosl_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func___builtin_cosl_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_cosl_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func___builtin_cosl_use" >&6; } if test x$glibcxx_cv_func___builtin_cosl_use = x"yes"; then - echo "$as_me:$LINENO: checking for __builtin_cosl linkage" >&5 -echo $ECHO_N "checking for __builtin_cosl linkage... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for __builtin_cosl linkage" >&5 +echo $ECHO_N "checking for __builtin_cosl linkage... $ECHO_C" >&6; } if test x${glibcxx_cv_func___builtin_cosl_link+set} != xset; then if test "${glibcxx_cv_func___builtin_cosl_link+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 @@ -62537,42 +60430,39 @@ main () } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then glibcxx_cv_func___builtin_cosl_link=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func___builtin_cosl_link=no + glibcxx_cv_func___builtin_cosl_link=no fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_cosl_link" >&5 -echo "${ECHO_T}$glibcxx_cv_func___builtin_cosl_link" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_cosl_link" >&5 +echo "${ECHO_T}$glibcxx_cv_func___builtin_cosl_link" >&6; } if test x$glibcxx_cv_func___builtin_cosl_link = x"yes"; then @@ -62587,8 +60477,8 @@ _ACEOF -echo "$as_me:$LINENO: checking for main in -lm" >&5 -echo $ECHO_N "checking for main in -lm... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking for main in -lm" >&5 +echo $ECHO_N "checking for main in -lm... $ECHO_C" >&6; } if test "${ac_cv_lib_m_main+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -62610,46 +60500,43 @@ cat >>conftest.$ac_ext <<_ACEOF int main () { -main (); +return main (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then ac_cv_lib_m_main=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -ac_cv_lib_m_main=no + ac_cv_lib_m_main=no fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -echo "$as_me:$LINENO: result: $ac_cv_lib_m_main" >&5 -echo "${ECHO_T}$ac_cv_lib_m_main" >&6 +{ echo "$as_me:$LINENO: result: $ac_cv_lib_m_main" >&5 +echo "${ECHO_T}$ac_cv_lib_m_main" >&6; } if test $ac_cv_lib_m_main = yes; then cat >>confdefs.h <<_ACEOF #define HAVE_LIBM 1 @@ -62663,9 +60550,9 @@ fi for ac_func in copysignf do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -62696,68 +60583,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -62773,9 +60652,9 @@ done for ac_func in __signbit do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -62806,68 +60685,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -62883,9 +60754,9 @@ done for ac_func in __signbitf do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -62916,68 +60787,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -62994,9 +60857,9 @@ done for ac_func in __signbitl do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -63027,68 +60890,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -63113,16 +60968,15 @@ done CXXFLAGS='-fno-builtin -D_GNU_SOURCE' - echo "$as_me:$LINENO: checking for strtold declaration" >&5 -echo $ECHO_N "checking for strtold declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for strtold declaration" >&5 +echo $ECHO_N "checking for strtold declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func_strtold_use+set} != xset; then if test "${glibcxx_cv_func_strtold_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -63144,35 +60998,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func_strtold_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_strtold_use=no + glibcxx_cv_func_strtold_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -63183,16 +61033,16 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_strtold_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_strtold_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_strtold_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_strtold_use" >&6; } if test x$glibcxx_cv_func_strtold_use = x"yes"; then for ac_func in strtold do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -63223,68 +61073,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -63299,16 +61141,15 @@ done - echo "$as_me:$LINENO: checking for strtof declaration" >&5 -echo $ECHO_N "checking for strtof declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for strtof declaration" >&5 +echo $ECHO_N "checking for strtof declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func_strtof_use+set} != xset; then if test "${glibcxx_cv_func_strtof_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -63330,35 +61171,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func_strtof_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_strtof_use=no + glibcxx_cv_func_strtof_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -63369,16 +61206,16 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_strtof_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_strtof_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_strtof_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_strtof_use" >&6; } if test x$glibcxx_cv_func_strtof_use = x"yes"; then for ac_func in strtof do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -63409,68 +61246,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -63488,8 +61317,8 @@ done CXXFLAGS="$ac_save_CXXFLAGS" - echo "$as_me:$LINENO: checking for S_ISREG or S_IFREG" >&5 -echo $ECHO_N "checking for S_ISREG or S_IFREG... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for S_ISREG or S_IFREG" >&5 +echo $ECHO_N "checking for S_ISREG or S_IFREG... $ECHO_C" >&6; } if test "${glibcxx_cv_S_ISREG+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -63517,35 +61346,32 @@ struct stat buffer; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then glibcxx_cv_S_ISREG=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_S_ISREG=no + glibcxx_cv_S_ISREG=no fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi @@ -63577,35 +61403,32 @@ struct stat buffer; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then glibcxx_cv_S_IFREG=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_S_IFREG=no + glibcxx_cv_S_IFREG=no fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi @@ -63626,8 +61449,8 @@ _ACEOF res=S_IFREG fi - echo "$as_me:$LINENO: result: $res" >&5 -echo "${ECHO_T}$res" >&6 + { echo "$as_me:$LINENO: result: $res" >&5 +echo "${ECHO_T}$res" >&6; } cat >>confdefs.h <<\_ACEOF #define HAVE_SIGSETJMP 1 @@ -63707,18 +61530,19 @@ for ac_header in nan.h ieeefp.h endian.h sys/isa_defs.h machine/endian.h \ sys/types.h do as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + { echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 +ac_res=`eval echo '${'$as_ac_Header'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } else # Is the header compilable? -echo "$as_me:$LINENO: checking $ac_header usability" >&5 -echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking $ac_header usability" >&5 +echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6; } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF @@ -63729,41 +61553,37 @@ $ac_includes_default #include <$ac_header> _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then ac_header_compiler=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -ac_header_compiler=no + ac_header_compiler=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 -echo "${ECHO_T}$ac_header_compiler" >&6 + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +echo "${ECHO_T}$ac_header_compiler" >&6; } # Is the header present? -echo "$as_me:$LINENO: checking $ac_header presence" >&5 -echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking $ac_header presence" >&5 +echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6; } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF @@ -63772,24 +61592,22 @@ cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include <$ac_header> _ACEOF -if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 - (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 +if { (ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null; then - if test -s conftest.err; then - ac_cpp_err=$ac_c_preproc_warn_flag - ac_cpp_err=$ac_cpp_err$ac_c_werror_flag - else - ac_cpp_err= - fi -else - ac_cpp_err=yes -fi -if test -z "$ac_cpp_err"; then + (exit $ac_status); } >/dev/null && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then ac_header_preproc=yes else echo "$as_me: failed program was:" >&5 @@ -63797,9 +61615,10 @@ sed 's/^/| /' conftest.$ac_ext >&5 ac_header_preproc=no fi + rm -f conftest.err conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 -echo "${ECHO_T}$ac_header_preproc" >&6 +{ echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 +echo "${ECHO_T}$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in @@ -63823,25 +61642,19 @@ echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\ echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} - ( - cat <<\_ASBOX -## ----------------------------------------- ## -## Report this to the package-unused lists. ## -## ----------------------------------------- ## -_ASBOX - ) | - sed "s/^/$as_me: WARNING: /" >&2 + ;; esac -echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else eval "$as_ac_Header=\$ac_header_preproc" fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 +ac_res=`eval echo '${'$as_ac_Header'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } fi if test `eval echo '${'$as_ac_Header'}'` = yes; then @@ -63860,8 +61673,8 @@ done ac_save_CXXFLAGS="$CXXFLAGS" CXXFLAGS='-fno-builtin -D_GNU_SOURCE' - echo "$as_me:$LINENO: checking for sin in -lm" >&5 -echo $ECHO_N "checking for sin in -lm... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for sin in -lm" >&5 +echo $ECHO_N "checking for sin in -lm... $ECHO_C" >&6; } if test "${ac_cv_lib_m_sin+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -63879,56 +61692,53 @@ cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char sin (); int main () { -sin (); +return sin (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then ac_cv_lib_m_sin=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -ac_cv_lib_m_sin=no + ac_cv_lib_m_sin=no fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -echo "$as_me:$LINENO: result: $ac_cv_lib_m_sin" >&5 -echo "${ECHO_T}$ac_cv_lib_m_sin" >&6 +{ echo "$as_me:$LINENO: result: $ac_cv_lib_m_sin" >&5 +echo "${ECHO_T}$ac_cv_lib_m_sin" >&6; } if test $ac_cv_lib_m_sin = yes; then libm="-lm" fi @@ -63938,16 +61748,15 @@ fi - echo "$as_me:$LINENO: checking for isinf declaration" >&5 -echo $ECHO_N "checking for isinf declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for isinf declaration" >&5 +echo $ECHO_N "checking for isinf declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func_isinf_use+set} != xset; then if test "${glibcxx_cv_func_isinf_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -63973,35 +61782,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func_isinf_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_isinf_use=no + glibcxx_cv_func_isinf_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -64012,17 +61817,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_isinf_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_isinf_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_isinf_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_isinf_use" >&6; } if test x$glibcxx_cv_func_isinf_use = x"yes"; then for ac_func in isinf do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -64053,68 +61858,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -64125,16 +61922,15 @@ done else - echo "$as_me:$LINENO: checking for _isinf declaration" >&5 -echo $ECHO_N "checking for _isinf declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for _isinf declaration" >&5 +echo $ECHO_N "checking for _isinf declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func__isinf_use+set} != xset; then if test "${glibcxx_cv_func__isinf_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -64160,35 +61956,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func__isinf_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func__isinf_use=no + glibcxx_cv_func__isinf_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -64199,17 +61991,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__isinf_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__isinf_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__isinf_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__isinf_use" >&6; } if test x$glibcxx_cv_func__isinf_use = x"yes"; then for ac_func in _isinf do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -64240,68 +62032,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -64318,16 +62102,15 @@ done - echo "$as_me:$LINENO: checking for isnan declaration" >&5 -echo $ECHO_N "checking for isnan declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for isnan declaration" >&5 +echo $ECHO_N "checking for isnan declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func_isnan_use+set} != xset; then if test "${glibcxx_cv_func_isnan_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -64353,35 +62136,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func_isnan_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_isnan_use=no + glibcxx_cv_func_isnan_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -64392,17 +62171,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_isnan_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_isnan_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_isnan_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_isnan_use" >&6; } if test x$glibcxx_cv_func_isnan_use = x"yes"; then for ac_func in isnan do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -64433,68 +62212,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -64505,16 +62276,15 @@ done else - echo "$as_me:$LINENO: checking for _isnan declaration" >&5 -echo $ECHO_N "checking for _isnan declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for _isnan declaration" >&5 +echo $ECHO_N "checking for _isnan declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func__isnan_use+set} != xset; then if test "${glibcxx_cv_func__isnan_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -64540,35 +62310,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func__isnan_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func__isnan_use=no + glibcxx_cv_func__isnan_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -64579,17 +62345,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__isnan_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__isnan_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__isnan_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__isnan_use" >&6; } if test x$glibcxx_cv_func__isnan_use = x"yes"; then for ac_func in _isnan do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -64620,68 +62386,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -64698,16 +62456,15 @@ done - echo "$as_me:$LINENO: checking for finite declaration" >&5 -echo $ECHO_N "checking for finite declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for finite declaration" >&5 +echo $ECHO_N "checking for finite declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func_finite_use+set} != xset; then if test "${glibcxx_cv_func_finite_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -64733,35 +62490,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func_finite_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_finite_use=no + glibcxx_cv_func_finite_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -64772,17 +62525,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_finite_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_finite_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_finite_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_finite_use" >&6; } if test x$glibcxx_cv_func_finite_use = x"yes"; then for ac_func in finite do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -64813,68 +62566,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -64885,16 +62630,15 @@ done else - echo "$as_me:$LINENO: checking for _finite declaration" >&5 -echo $ECHO_N "checking for _finite declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for _finite declaration" >&5 +echo $ECHO_N "checking for _finite declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func__finite_use+set} != xset; then if test "${glibcxx_cv_func__finite_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -64920,35 +62664,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func__finite_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func__finite_use=no + glibcxx_cv_func__finite_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -64959,17 +62699,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__finite_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__finite_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__finite_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__finite_use" >&6; } if test x$glibcxx_cv_func__finite_use = x"yes"; then for ac_func in _finite do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -65000,68 +62740,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -65078,16 +62810,15 @@ done - echo "$as_me:$LINENO: checking for copysign declaration" >&5 -echo $ECHO_N "checking for copysign declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for copysign declaration" >&5 +echo $ECHO_N "checking for copysign declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func_copysign_use+set} != xset; then if test "${glibcxx_cv_func_copysign_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -65109,35 +62840,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func_copysign_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_copysign_use=no + glibcxx_cv_func_copysign_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -65148,17 +62875,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_copysign_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_copysign_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_copysign_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_copysign_use" >&6; } if test x$glibcxx_cv_func_copysign_use = x"yes"; then for ac_func in copysign do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -65189,68 +62916,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -65261,16 +62980,15 @@ done else - echo "$as_me:$LINENO: checking for _copysign declaration" >&5 -echo $ECHO_N "checking for _copysign declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for _copysign declaration" >&5 +echo $ECHO_N "checking for _copysign declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func__copysign_use+set} != xset; then if test "${glibcxx_cv_func__copysign_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -65292,35 +63010,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func__copysign_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func__copysign_use=no + glibcxx_cv_func__copysign_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -65331,17 +63045,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__copysign_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__copysign_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__copysign_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__copysign_use" >&6; } if test x$glibcxx_cv_func__copysign_use = x"yes"; then for ac_func in _copysign do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -65372,68 +63086,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -65450,16 +63156,15 @@ done - echo "$as_me:$LINENO: checking for sincos declaration" >&5 -echo $ECHO_N "checking for sincos declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for sincos declaration" >&5 +echo $ECHO_N "checking for sincos declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func_sincos_use+set} != xset; then if test "${glibcxx_cv_func_sincos_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -65481,35 +63186,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func_sincos_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_sincos_use=no + glibcxx_cv_func_sincos_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -65520,17 +63221,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_sincos_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_sincos_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_sincos_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_sincos_use" >&6; } if test x$glibcxx_cv_func_sincos_use = x"yes"; then for ac_func in sincos do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -65561,68 +63262,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -65633,16 +63326,15 @@ done else - echo "$as_me:$LINENO: checking for _sincos declaration" >&5 -echo $ECHO_N "checking for _sincos declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for _sincos declaration" >&5 +echo $ECHO_N "checking for _sincos declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func__sincos_use+set} != xset; then if test "${glibcxx_cv_func__sincos_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -65664,35 +63356,211 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + glibcxx_cv_func__sincos_use=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + glibcxx_cv_func__sincos_use=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +fi + + fi + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__sincos_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__sincos_use" >&6; } + + if test x$glibcxx_cv_func__sincos_use = x"yes"; then + +for ac_func in _sincos +do +as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test x$gcc_no_link = xyes; then + { { echo "$as_me:$LINENO: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&5 +echo "$as_me: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&2;} + { (exit 1); exit 1; }; } +fi +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define $ac_func to an innocuous variant, in case declares $ac_func. + For example, HP-UX 11i declares gettimeofday. */ +#define $ac_func innocuous_$ac_func + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $ac_func (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $ac_func + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char $ac_func (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_$ac_func || defined __stub___$ac_func +choke me +#endif + +int +main () +{ +return $ac_func (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then + eval "$as_ac_var=yes" +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + eval "$as_ac_var=no" +fi + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +fi +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } +if test `eval echo '${'$as_ac_var'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +fi +done + + fi + fi + + + + + + + { echo "$as_me:$LINENO: checking for fpclass declaration" >&5 +echo $ECHO_N "checking for fpclass declaration... $ECHO_C" >&6; } + if test x${glibcxx_cv_func_fpclass_use+set} != xset; then + if test "${glibcxx_cv_func_fpclass_use+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + + ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include + #ifdef HAVE_IEEEFP_H + #include + #endif + +int +main () +{ + fpclass(0); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - glibcxx_cv_func__sincos_use=yes + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + glibcxx_cv_func_fpclass_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func__sincos_use=no + glibcxx_cv_func_fpclass_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -65703,17 +63571,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__sincos_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__sincos_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_fpclass_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_fpclass_use" >&6; } - if test x$glibcxx_cv_func__sincos_use = x"yes"; then + if test x$glibcxx_cv_func_fpclass_use = x"yes"; then -for ac_func in _sincos +for ac_func in fpclass do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -65744,261 +63612,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ -#ifdef __cplusplus -extern "C" -{ -#endif -/* We use char because int might match the return type of a gcc2 +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ -char $ac_func (); -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) -choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} -#endif - -int -main () -{ -return f != $ac_func; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - eval "$as_ac_var=yes" -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -eval "$as_ac_var=no" -fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 -if test `eval echo '${'$as_ac_var'}'` = yes; then - cat >>confdefs.h <<_ACEOF -#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 -_ACEOF - -fi -done - - fi - fi - - - - - - - echo "$as_me:$LINENO: checking for fpclass declaration" >&5 -echo $ECHO_N "checking for fpclass declaration... $ECHO_C" >&6 - if test x${glibcxx_cv_func_fpclass_use+set} != xset; then - if test "${glibcxx_cv_func_fpclass_use+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - - - - ac_ext=cc -ac_cpp='$CXXCPP $CPPFLAGS' -ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_cxx_compiler_gnu - - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include - #ifdef HAVE_IEEEFP_H - #include - #endif - -int -main () -{ - fpclass(0); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - glibcxx_cv_func_fpclass_use=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -glibcxx_cv_func_fpclass_use=no -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext - ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - - -fi - - fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_fpclass_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_fpclass_use" >&6 - - if test x$glibcxx_cv_func_fpclass_use = x"yes"; then - -for ac_func in fpclass -do -as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test x$gcc_no_link = xyes; then - { { echo "$as_me:$LINENO: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&5 -echo "$as_me: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&2;} - { (exit 1); exit 1; }; } -fi -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -/* Define $ac_func to an innocuous variant, in case declares $ac_func. - For example, HP-UX 11i declares gettimeofday. */ -#define $ac_func innocuous_$ac_func - -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char $ac_func (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ - -#ifdef __STDC__ -# include -#else -# include -#endif - -#undef $ac_func - -/* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -66009,16 +63676,15 @@ done else - echo "$as_me:$LINENO: checking for _fpclass declaration" >&5 -echo $ECHO_N "checking for _fpclass declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for _fpclass declaration" >&5 +echo $ECHO_N "checking for _fpclass declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func__fpclass_use+set} != xset; then if test "${glibcxx_cv_func__fpclass_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -66044,35 +63710,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func__fpclass_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func__fpclass_use=no + glibcxx_cv_func__fpclass_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -66083,17 +63745,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__fpclass_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__fpclass_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__fpclass_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__fpclass_use" >&6; } if test x$glibcxx_cv_func__fpclass_use = x"yes"; then for ac_func in _fpclass do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -66124,68 +63786,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -66202,16 +63856,15 @@ done - echo "$as_me:$LINENO: checking for qfpclass declaration" >&5 -echo $ECHO_N "checking for qfpclass declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for qfpclass declaration" >&5 +echo $ECHO_N "checking for qfpclass declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func_qfpclass_use+set} != xset; then if test "${glibcxx_cv_func_qfpclass_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -66237,35 +63890,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func_qfpclass_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_qfpclass_use=no + glibcxx_cv_func_qfpclass_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -66276,17 +63925,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_qfpclass_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_qfpclass_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_qfpclass_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_qfpclass_use" >&6; } if test x$glibcxx_cv_func_qfpclass_use = x"yes"; then for ac_func in qfpclass do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -66317,68 +63966,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -66389,16 +64030,15 @@ done else - echo "$as_me:$LINENO: checking for _qfpclass declaration" >&5 -echo $ECHO_N "checking for _qfpclass declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for _qfpclass declaration" >&5 +echo $ECHO_N "checking for _qfpclass declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func__qfpclass_use+set} != xset; then if test "${glibcxx_cv_func__qfpclass_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -66424,35 +64064,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func__qfpclass_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func__qfpclass_use=no + glibcxx_cv_func__qfpclass_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -66463,17 +64099,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__qfpclass_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__qfpclass_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__qfpclass_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__qfpclass_use" >&6; } if test x$glibcxx_cv_func__qfpclass_use = x"yes"; then for ac_func in _qfpclass do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -66504,68 +64140,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -66582,16 +64210,15 @@ done - echo "$as_me:$LINENO: checking for hypot declaration" >&5 -echo $ECHO_N "checking for hypot declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for hypot declaration" >&5 +echo $ECHO_N "checking for hypot declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func_hypot_use+set} != xset; then if test "${glibcxx_cv_func_hypot_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -66613,35 +64240,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func_hypot_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_hypot_use=no + glibcxx_cv_func_hypot_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -66652,17 +64275,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_hypot_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_hypot_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_hypot_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_hypot_use" >&6; } if test x$glibcxx_cv_func_hypot_use = x"yes"; then for ac_func in hypot do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -66693,68 +64316,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -66765,16 +64380,15 @@ done else - echo "$as_me:$LINENO: checking for _hypot declaration" >&5 -echo $ECHO_N "checking for _hypot declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for _hypot declaration" >&5 +echo $ECHO_N "checking for _hypot declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func__hypot_use+set} != xset; then if test "${glibcxx_cv_func__hypot_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -66796,35 +64410,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func__hypot_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func__hypot_use=no + glibcxx_cv_func__hypot_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -66835,17 +64445,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__hypot_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__hypot_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__hypot_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__hypot_use" >&6; } if test x$glibcxx_cv_func__hypot_use = x"yes"; then for ac_func in _hypot do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -66876,68 +64486,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -66954,15 +64556,14 @@ done - echo "$as_me:$LINENO: checking for float trig functions" >&5 -echo $ECHO_N "checking for float trig functions... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for float trig functions" >&5 +echo $ECHO_N "checking for float trig functions... $ECHO_C" >&6; } if test "${glibcxx_cv_func_float_trig_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -66984,35 +64585,31 @@ acosf (0); asinf (0); atanf (0); cosf (0); sinf (0); tanf (0); coshf (0); sinhf } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func_float_trig_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_float_trig_use=no + glibcxx_cv_func_float_trig_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -67021,8 +64618,8 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_float_trig_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_float_trig_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_float_trig_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_float_trig_use" >&6; } if test x$glibcxx_cv_func_float_trig_use = x"yes"; then @@ -67036,9 +64633,9 @@ echo "${ECHO_T}$glibcxx_cv_func_float_trig_use" >&6 for ac_func in acosf asinf atanf cosf sinf tanf coshf sinhf tanhf do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -67069,68 +64666,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -67140,15 +64729,14 @@ fi done else - echo "$as_me:$LINENO: checking for _float trig functions" >&5 -echo $ECHO_N "checking for _float trig functions... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for _float trig functions" >&5 +echo $ECHO_N "checking for _float trig functions... $ECHO_C" >&6; } if test "${glibcxx_cv_func__float_trig_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -67170,35 +64758,31 @@ _acosf (0); _asinf (0); _atanf (0); _cosf (0); _sinf (0); _tanf (0); _coshf (0); } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func__float_trig_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func__float_trig_use=no + glibcxx_cv_func__float_trig_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -67207,8 +64791,8 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__float_trig_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__float_trig_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__float_trig_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__float_trig_use" >&6; } if test x$glibcxx_cv_func__float_trig_use = x"yes"; then @@ -67222,9 +64806,9 @@ echo "${ECHO_T}$glibcxx_cv_func__float_trig_use" >&6 for ac_func in _acosf _asinf _atanf _cosf _sinf _tanf _coshf _sinhf _tanhf do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -67255,68 +64839,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -67341,15 +64917,14 @@ done - echo "$as_me:$LINENO: checking for float round functions" >&5 -echo $ECHO_N "checking for float round functions... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for float round functions" >&5 +echo $ECHO_N "checking for float round functions... $ECHO_C" >&6; } if test "${glibcxx_cv_func_float_round_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -67371,35 +64946,31 @@ ceilf (0); floorf (0); } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func_float_round_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_float_round_use=no + glibcxx_cv_func_float_round_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -67408,17 +64979,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_float_round_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_float_round_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_float_round_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_float_round_use" >&6; } if test x$glibcxx_cv_func_float_round_use = x"yes"; then for ac_func in ceilf floorf do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -67449,68 +65020,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -67520,15 +65083,14 @@ fi done else - echo "$as_me:$LINENO: checking for _float round functions" >&5 -echo $ECHO_N "checking for _float round functions... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for _float round functions" >&5 +echo $ECHO_N "checking for _float round functions... $ECHO_C" >&6; } if test "${glibcxx_cv_func__float_round_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -67550,35 +65112,31 @@ _ceilf (0); _floorf (0); } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func__float_round_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func__float_round_use=no + glibcxx_cv_func__float_round_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -67587,17 +65145,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__float_round_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__float_round_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__float_round_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__float_round_use" >&6; } if test x$glibcxx_cv_func__float_round_use = x"yes"; then for ac_func in _ceilf _floorf do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -67628,68 +65186,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -67708,16 +65258,15 @@ done - echo "$as_me:$LINENO: checking for expf declaration" >&5 -echo $ECHO_N "checking for expf declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for expf declaration" >&5 +echo $ECHO_N "checking for expf declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func_expf_use+set} != xset; then if test "${glibcxx_cv_func_expf_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -67743,35 +65292,205 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + glibcxx_cv_func_expf_use=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + glibcxx_cv_func_expf_use=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +fi + + fi + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_expf_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_expf_use" >&6; } + + if test x$glibcxx_cv_func_expf_use = x"yes"; then + +for ac_func in expf +do +as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test x$gcc_no_link = xyes; then + { { echo "$as_me:$LINENO: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&5 +echo "$as_me: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&2;} + { (exit 1); exit 1; }; } +fi +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define $ac_func to an innocuous variant, in case declares $ac_func. + For example, HP-UX 11i declares gettimeofday. */ +#define $ac_func innocuous_$ac_func + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $ac_func (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $ac_func + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char $ac_func (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_$ac_func || defined __stub___$ac_func +choke me +#endif + +int +main () +{ +return $ac_func (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then + eval "$as_ac_var=yes" +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + eval "$as_ac_var=no" +fi + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +fi +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } +if test `eval echo '${'$as_ac_var'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +fi +done + + else + + { echo "$as_me:$LINENO: checking for _expf declaration" >&5 +echo $ECHO_N "checking for _expf declaration... $ECHO_C" >&6; } + if test x${glibcxx_cv_func__expf_use+set} != xset; then + if test "${glibcxx_cv_func__expf_use+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + + ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include + #ifdef HAVE_IEEEFP_H + #include + #endif + +int +main () +{ + _expf(0); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - glibcxx_cv_func_expf_use=yes + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + glibcxx_cv_func__expf_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_expf_use=no + glibcxx_cv_func__expf_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -67782,17 +65501,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_expf_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_expf_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__expf_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__expf_use" >&6; } - if test x$glibcxx_cv_func_expf_use = x"yes"; then + if test x$glibcxx_cv_func__expf_use = x"yes"; then -for ac_func in expf +for ac_func in _expf do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -67823,255 +65542,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ -#ifdef __cplusplus -extern "C" -{ -#endif -/* We use char because int might match the return type of a gcc2 +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ -char $ac_func (); -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) -choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} -#endif - -int -main () -{ -return f != $ac_func; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - eval "$as_ac_var=yes" -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -eval "$as_ac_var=no" -fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 -if test `eval echo '${'$as_ac_var'}'` = yes; then - cat >>confdefs.h <<_ACEOF -#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 -_ACEOF - -fi -done - - else - - echo "$as_me:$LINENO: checking for _expf declaration" >&5 -echo $ECHO_N "checking for _expf declaration... $ECHO_C" >&6 - if test x${glibcxx_cv_func__expf_use+set} != xset; then - if test "${glibcxx_cv_func__expf_use+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - - - - ac_ext=cc -ac_cpp='$CXXCPP $CPPFLAGS' -ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_cxx_compiler_gnu - - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include - #ifdef HAVE_IEEEFP_H - #include - #endif - -int -main () -{ - _expf(0); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - glibcxx_cv_func__expf_use=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -glibcxx_cv_func__expf_use=no -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext - ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - - -fi - - fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__expf_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__expf_use" >&6 - - if test x$glibcxx_cv_func__expf_use = x"yes"; then - -for ac_func in _expf -do -as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test x$gcc_no_link = xyes; then - { { echo "$as_me:$LINENO: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&5 -echo "$as_me: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&2;} - { (exit 1); exit 1; }; } -fi -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -/* Define $ac_func to an innocuous variant, in case declares $ac_func. - For example, HP-UX 11i declares gettimeofday. */ -#define $ac_func innocuous_$ac_func - -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char $ac_func (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ - -#ifdef __STDC__ -# include -#else -# include -#endif - -#undef $ac_func - -/* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -68088,16 +65612,15 @@ done - echo "$as_me:$LINENO: checking for isnanf declaration" >&5 -echo $ECHO_N "checking for isnanf declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for isnanf declaration" >&5 +echo $ECHO_N "checking for isnanf declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func_isnanf_use+set} != xset; then if test "${glibcxx_cv_func_isnanf_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -68123,35 +65646,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func_isnanf_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_isnanf_use=no + glibcxx_cv_func_isnanf_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -68162,17 +65681,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_isnanf_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_isnanf_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_isnanf_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_isnanf_use" >&6; } if test x$glibcxx_cv_func_isnanf_use = x"yes"; then for ac_func in isnanf do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -68203,68 +65722,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -68275,16 +65786,15 @@ done else - echo "$as_me:$LINENO: checking for _isnanf declaration" >&5 -echo $ECHO_N "checking for _isnanf declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for _isnanf declaration" >&5 +echo $ECHO_N "checking for _isnanf declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func__isnanf_use+set} != xset; then if test "${glibcxx_cv_func__isnanf_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -68310,35 +65820,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func__isnanf_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func__isnanf_use=no + glibcxx_cv_func__isnanf_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -68349,17 +65855,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__isnanf_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__isnanf_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__isnanf_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__isnanf_use" >&6; } if test x$glibcxx_cv_func__isnanf_use = x"yes"; then for ac_func in _isnanf do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -68390,68 +65896,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -68468,16 +65966,15 @@ done - echo "$as_me:$LINENO: checking for isinff declaration" >&5 -echo $ECHO_N "checking for isinff declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for isinff declaration" >&5 +echo $ECHO_N "checking for isinff declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func_isinff_use+set} != xset; then if test "${glibcxx_cv_func_isinff_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -68503,35 +66000,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func_isinff_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_isinff_use=no + glibcxx_cv_func_isinff_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -68542,17 +66035,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_isinff_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_isinff_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_isinff_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_isinff_use" >&6; } if test x$glibcxx_cv_func_isinff_use = x"yes"; then for ac_func in isinff do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -68583,68 +66076,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -68655,16 +66140,15 @@ done else - echo "$as_me:$LINENO: checking for _isinff declaration" >&5 -echo $ECHO_N "checking for _isinff declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for _isinff declaration" >&5 +echo $ECHO_N "checking for _isinff declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func__isinff_use+set} != xset; then if test "${glibcxx_cv_func__isinff_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -68690,35 +66174,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func__isinff_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func__isinff_use=no + glibcxx_cv_func__isinff_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -68729,17 +66209,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__isinff_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__isinff_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__isinff_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__isinff_use" >&6; } if test x$glibcxx_cv_func__isinff_use = x"yes"; then for ac_func in _isinff do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -68770,68 +66250,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -68848,16 +66320,15 @@ done - echo "$as_me:$LINENO: checking for atan2f declaration" >&5 -echo $ECHO_N "checking for atan2f declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for atan2f declaration" >&5 +echo $ECHO_N "checking for atan2f declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func_atan2f_use+set} != xset; then if test "${glibcxx_cv_func_atan2f_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -68879,35 +66350,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func_atan2f_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_atan2f_use=no + glibcxx_cv_func_atan2f_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -68918,17 +66385,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_atan2f_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_atan2f_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_atan2f_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_atan2f_use" >&6; } if test x$glibcxx_cv_func_atan2f_use = x"yes"; then for ac_func in atan2f do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -68959,68 +66426,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -69031,16 +66490,15 @@ done else - echo "$as_me:$LINENO: checking for _atan2f declaration" >&5 -echo $ECHO_N "checking for _atan2f declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for _atan2f declaration" >&5 +echo $ECHO_N "checking for _atan2f declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func__atan2f_use+set} != xset; then if test "${glibcxx_cv_func__atan2f_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -69062,35 +66520,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func__atan2f_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func__atan2f_use=no + glibcxx_cv_func__atan2f_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -69101,17 +66555,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__atan2f_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__atan2f_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__atan2f_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__atan2f_use" >&6; } if test x$glibcxx_cv_func__atan2f_use = x"yes"; then for ac_func in _atan2f do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -69142,68 +66596,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -69220,16 +66666,15 @@ done - echo "$as_me:$LINENO: checking for fabsf declaration" >&5 -echo $ECHO_N "checking for fabsf declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for fabsf declaration" >&5 +echo $ECHO_N "checking for fabsf declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func_fabsf_use+set} != xset; then if test "${glibcxx_cv_func_fabsf_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -69255,35 +66700,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func_fabsf_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_fabsf_use=no + glibcxx_cv_func_fabsf_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -69294,17 +66735,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_fabsf_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_fabsf_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_fabsf_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_fabsf_use" >&6; } if test x$glibcxx_cv_func_fabsf_use = x"yes"; then for ac_func in fabsf do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -69335,68 +66776,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -69407,16 +66840,15 @@ done else - echo "$as_me:$LINENO: checking for _fabsf declaration" >&5 -echo $ECHO_N "checking for _fabsf declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for _fabsf declaration" >&5 +echo $ECHO_N "checking for _fabsf declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func__fabsf_use+set} != xset; then if test "${glibcxx_cv_func__fabsf_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -69442,35 +66874,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func__fabsf_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func__fabsf_use=no + glibcxx_cv_func__fabsf_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -69481,17 +66909,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__fabsf_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__fabsf_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__fabsf_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__fabsf_use" >&6; } if test x$glibcxx_cv_func__fabsf_use = x"yes"; then for ac_func in _fabsf do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -69522,68 +66950,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -69600,16 +67020,15 @@ done - echo "$as_me:$LINENO: checking for fmodf declaration" >&5 -echo $ECHO_N "checking for fmodf declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for fmodf declaration" >&5 +echo $ECHO_N "checking for fmodf declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func_fmodf_use+set} != xset; then if test "${glibcxx_cv_func_fmodf_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -69631,35 +67050,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func_fmodf_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_fmodf_use=no + glibcxx_cv_func_fmodf_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -69670,17 +67085,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_fmodf_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_fmodf_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_fmodf_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_fmodf_use" >&6; } if test x$glibcxx_cv_func_fmodf_use = x"yes"; then for ac_func in fmodf do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -69711,68 +67126,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -69783,16 +67190,15 @@ done else - echo "$as_me:$LINENO: checking for _fmodf declaration" >&5 -echo $ECHO_N "checking for _fmodf declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for _fmodf declaration" >&5 +echo $ECHO_N "checking for _fmodf declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func__fmodf_use+set} != xset; then if test "${glibcxx_cv_func__fmodf_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -69814,35 +67220,207 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + glibcxx_cv_func__fmodf_use=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + glibcxx_cv_func__fmodf_use=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +fi + + fi + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__fmodf_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__fmodf_use" >&6; } + + if test x$glibcxx_cv_func__fmodf_use = x"yes"; then + +for ac_func in _fmodf +do +as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test x$gcc_no_link = xyes; then + { { echo "$as_me:$LINENO: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&5 +echo "$as_me: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&2;} + { (exit 1); exit 1; }; } +fi +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define $ac_func to an innocuous variant, in case declares $ac_func. + For example, HP-UX 11i declares gettimeofday. */ +#define $ac_func innocuous_$ac_func + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $ac_func (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $ac_func + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char $ac_func (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_$ac_func || defined __stub___$ac_func +choke me +#endif + +int +main () +{ +return $ac_func (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then + eval "$as_ac_var=yes" +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + eval "$as_ac_var=no" +fi + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +fi +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } +if test `eval echo '${'$as_ac_var'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +fi +done + + fi + fi + + + + + + + { echo "$as_me:$LINENO: checking for frexpf declaration" >&5 +echo $ECHO_N "checking for frexpf declaration... $ECHO_C" >&6; } + if test x${glibcxx_cv_func_frexpf_use+set} != xset; then + if test "${glibcxx_cv_func_frexpf_use+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + + ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +int +main () +{ + frexpf(0, 0); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - glibcxx_cv_func__fmodf_use=yes + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + glibcxx_cv_func_frexpf_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func__fmodf_use=no + glibcxx_cv_func_frexpf_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -69853,17 +67431,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__fmodf_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__fmodf_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_frexpf_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_frexpf_use" >&6; } - if test x$glibcxx_cv_func__fmodf_use = x"yes"; then + if test x$glibcxx_cv_func_frexpf_use = x"yes"; then -for ac_func in _fmodf +for ac_func in frexpf do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -69894,257 +67472,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ -#ifdef __cplusplus -extern "C" -{ -#endif -/* We use char because int might match the return type of a gcc2 +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ -char $ac_func (); -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) -choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} -#endif - -int -main () -{ -return f != $ac_func; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - eval "$as_ac_var=yes" -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -eval "$as_ac_var=no" -fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 -if test `eval echo '${'$as_ac_var'}'` = yes; then - cat >>confdefs.h <<_ACEOF -#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 -_ACEOF - -fi -done - - fi - fi - - - - - - - echo "$as_me:$LINENO: checking for frexpf declaration" >&5 -echo $ECHO_N "checking for frexpf declaration... $ECHO_C" >&6 - if test x${glibcxx_cv_func_frexpf_use+set} != xset; then - if test "${glibcxx_cv_func_frexpf_use+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - - - - ac_ext=cc -ac_cpp='$CXXCPP $CPPFLAGS' -ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_cxx_compiler_gnu - - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include -int -main () -{ - frexpf(0, 0); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - glibcxx_cv_func_frexpf_use=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -glibcxx_cv_func_frexpf_use=no -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext - ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - - -fi - - fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_frexpf_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_frexpf_use" >&6 - - if test x$glibcxx_cv_func_frexpf_use = x"yes"; then - -for ac_func in frexpf -do -as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test x$gcc_no_link = xyes; then - { { echo "$as_me:$LINENO: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&5 -echo "$as_me: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&2;} - { (exit 1); exit 1; }; } -fi -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -/* Define $ac_func to an innocuous variant, in case declares $ac_func. - For example, HP-UX 11i declares gettimeofday. */ -#define $ac_func innocuous_$ac_func - -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char $ac_func (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ - -#ifdef __STDC__ -# include -#else -# include -#endif - -#undef $ac_func - -/* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -70155,16 +67536,15 @@ done else - echo "$as_me:$LINENO: checking for _frexpf declaration" >&5 -echo $ECHO_N "checking for _frexpf declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for _frexpf declaration" >&5 +echo $ECHO_N "checking for _frexpf declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func__frexpf_use+set} != xset; then if test "${glibcxx_cv_func__frexpf_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -70186,35 +67566,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func__frexpf_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func__frexpf_use=no + glibcxx_cv_func__frexpf_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -70225,17 +67601,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__frexpf_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__frexpf_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__frexpf_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__frexpf_use" >&6; } if test x$glibcxx_cv_func__frexpf_use = x"yes"; then for ac_func in _frexpf do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -70266,68 +67642,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -70344,16 +67712,15 @@ done - echo "$as_me:$LINENO: checking for hypotf declaration" >&5 -echo $ECHO_N "checking for hypotf declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for hypotf declaration" >&5 +echo $ECHO_N "checking for hypotf declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func_hypotf_use+set} != xset; then if test "${glibcxx_cv_func_hypotf_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -70375,35 +67742,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func_hypotf_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_hypotf_use=no + glibcxx_cv_func_hypotf_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -70414,17 +67777,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_hypotf_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_hypotf_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_hypotf_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_hypotf_use" >&6; } if test x$glibcxx_cv_func_hypotf_use = x"yes"; then for ac_func in hypotf do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -70455,68 +67818,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -70527,16 +67882,15 @@ done else - echo "$as_me:$LINENO: checking for _hypotf declaration" >&5 -echo $ECHO_N "checking for _hypotf declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for _hypotf declaration" >&5 +echo $ECHO_N "checking for _hypotf declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func__hypotf_use+set} != xset; then if test "${glibcxx_cv_func__hypotf_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -70558,35 +67912,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func__hypotf_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func__hypotf_use=no + glibcxx_cv_func__hypotf_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -70597,17 +67947,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__hypotf_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__hypotf_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__hypotf_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__hypotf_use" >&6; } if test x$glibcxx_cv_func__hypotf_use = x"yes"; then for ac_func in _hypotf do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -70638,68 +67988,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -70716,16 +68058,15 @@ done - echo "$as_me:$LINENO: checking for ldexpf declaration" >&5 -echo $ECHO_N "checking for ldexpf declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for ldexpf declaration" >&5 +echo $ECHO_N "checking for ldexpf declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func_ldexpf_use+set} != xset; then if test "${glibcxx_cv_func_ldexpf_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -70747,35 +68088,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func_ldexpf_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_ldexpf_use=no + glibcxx_cv_func_ldexpf_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -70786,17 +68123,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_ldexpf_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_ldexpf_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_ldexpf_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_ldexpf_use" >&6; } if test x$glibcxx_cv_func_ldexpf_use = x"yes"; then for ac_func in ldexpf do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -70827,68 +68164,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -70899,16 +68228,15 @@ done else - echo "$as_me:$LINENO: checking for _ldexpf declaration" >&5 -echo $ECHO_N "checking for _ldexpf declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for _ldexpf declaration" >&5 +echo $ECHO_N "checking for _ldexpf declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func__ldexpf_use+set} != xset; then if test "${glibcxx_cv_func__ldexpf_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -70930,35 +68258,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func__ldexpf_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func__ldexpf_use=no + glibcxx_cv_func__ldexpf_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -70969,17 +68293,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__ldexpf_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__ldexpf_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__ldexpf_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__ldexpf_use" >&6; } if test x$glibcxx_cv_func__ldexpf_use = x"yes"; then for ac_func in _ldexpf do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -71010,68 +68334,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -71088,16 +68404,15 @@ done - echo "$as_me:$LINENO: checking for logf declaration" >&5 -echo $ECHO_N "checking for logf declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for logf declaration" >&5 +echo $ECHO_N "checking for logf declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func_logf_use+set} != xset; then if test "${glibcxx_cv_func_logf_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -71123,35 +68438,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func_logf_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_logf_use=no + glibcxx_cv_func_logf_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -71162,17 +68473,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_logf_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_logf_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_logf_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_logf_use" >&6; } if test x$glibcxx_cv_func_logf_use = x"yes"; then for ac_func in logf do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -71203,68 +68514,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -71275,16 +68578,15 @@ done else - echo "$as_me:$LINENO: checking for _logf declaration" >&5 -echo $ECHO_N "checking for _logf declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for _logf declaration" >&5 +echo $ECHO_N "checking for _logf declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func__logf_use+set} != xset; then if test "${glibcxx_cv_func__logf_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -71310,35 +68612,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func__logf_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func__logf_use=no + glibcxx_cv_func__logf_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -71349,17 +68647,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__logf_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__logf_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__logf_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__logf_use" >&6; } if test x$glibcxx_cv_func__logf_use = x"yes"; then for ac_func in _logf do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -71390,68 +68688,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -71468,16 +68758,15 @@ done - echo "$as_me:$LINENO: checking for log10f declaration" >&5 -echo $ECHO_N "checking for log10f declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for log10f declaration" >&5 +echo $ECHO_N "checking for log10f declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func_log10f_use+set} != xset; then if test "${glibcxx_cv_func_log10f_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -71503,35 +68792,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func_log10f_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_log10f_use=no + glibcxx_cv_func_log10f_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -71542,17 +68827,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_log10f_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_log10f_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_log10f_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_log10f_use" >&6; } if test x$glibcxx_cv_func_log10f_use = x"yes"; then for ac_func in log10f do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -71583,68 +68868,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -71655,16 +68932,15 @@ done else - echo "$as_me:$LINENO: checking for _log10f declaration" >&5 -echo $ECHO_N "checking for _log10f declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for _log10f declaration" >&5 +echo $ECHO_N "checking for _log10f declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func__log10f_use+set} != xset; then if test "${glibcxx_cv_func__log10f_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -71690,35 +68966,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func__log10f_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func__log10f_use=no + glibcxx_cv_func__log10f_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -71729,17 +69001,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__log10f_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__log10f_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__log10f_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__log10f_use" >&6; } if test x$glibcxx_cv_func__log10f_use = x"yes"; then for ac_func in _log10f do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -71770,68 +69042,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -71848,16 +69112,15 @@ done - echo "$as_me:$LINENO: checking for modff declaration" >&5 -echo $ECHO_N "checking for modff declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for modff declaration" >&5 +echo $ECHO_N "checking for modff declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func_modff_use+set} != xset; then if test "${glibcxx_cv_func_modff_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -71879,35 +69142,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func_modff_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_modff_use=no + glibcxx_cv_func_modff_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -71918,17 +69177,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_modff_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_modff_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_modff_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_modff_use" >&6; } if test x$glibcxx_cv_func_modff_use = x"yes"; then for ac_func in modff do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -71959,68 +69218,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -72031,16 +69282,15 @@ done else - echo "$as_me:$LINENO: checking for _modff declaration" >&5 -echo $ECHO_N "checking for _modff declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for _modff declaration" >&5 +echo $ECHO_N "checking for _modff declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func__modff_use+set} != xset; then if test "${glibcxx_cv_func__modff_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -72062,35 +69312,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func__modff_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func__modff_use=no + glibcxx_cv_func__modff_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -72101,17 +69347,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__modff_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__modff_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__modff_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__modff_use" >&6; } if test x$glibcxx_cv_func__modff_use = x"yes"; then for ac_func in _modff do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -72142,68 +69388,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -72220,16 +69458,15 @@ done - echo "$as_me:$LINENO: checking for modf declaration" >&5 -echo $ECHO_N "checking for modf declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for modf declaration" >&5 +echo $ECHO_N "checking for modf declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func_modf_use+set} != xset; then if test "${glibcxx_cv_func_modf_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -72251,35 +69488,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func_modf_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_modf_use=no + glibcxx_cv_func_modf_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -72290,17 +69523,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_modf_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_modf_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_modf_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_modf_use" >&6; } if test x$glibcxx_cv_func_modf_use = x"yes"; then for ac_func in modf do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -72331,68 +69564,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -72403,16 +69628,15 @@ done else - echo "$as_me:$LINENO: checking for _modf declaration" >&5 -echo $ECHO_N "checking for _modf declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for _modf declaration" >&5 +echo $ECHO_N "checking for _modf declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func__modf_use+set} != xset; then if test "${glibcxx_cv_func__modf_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -72434,35 +69658,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func__modf_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func__modf_use=no + glibcxx_cv_func__modf_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -72473,17 +69693,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__modf_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__modf_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__modf_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__modf_use" >&6; } if test x$glibcxx_cv_func__modf_use = x"yes"; then for ac_func in _modf do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -72514,68 +69734,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -72592,16 +69804,15 @@ done - echo "$as_me:$LINENO: checking for powf declaration" >&5 -echo $ECHO_N "checking for powf declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for powf declaration" >&5 +echo $ECHO_N "checking for powf declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func_powf_use+set} != xset; then if test "${glibcxx_cv_func_powf_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -72623,35 +69834,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func_powf_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_powf_use=no + glibcxx_cv_func_powf_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -72662,17 +69869,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_powf_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_powf_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_powf_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_powf_use" >&6; } if test x$glibcxx_cv_func_powf_use = x"yes"; then for ac_func in powf do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -72703,68 +69910,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -72775,16 +69974,15 @@ done else - echo "$as_me:$LINENO: checking for _powf declaration" >&5 -echo $ECHO_N "checking for _powf declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for _powf declaration" >&5 +echo $ECHO_N "checking for _powf declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func__powf_use+set} != xset; then if test "${glibcxx_cv_func__powf_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -72806,35 +70004,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func__powf_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func__powf_use=no + glibcxx_cv_func__powf_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -72845,17 +70039,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__powf_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__powf_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__powf_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__powf_use" >&6; } if test x$glibcxx_cv_func__powf_use = x"yes"; then for ac_func in _powf do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -72886,68 +70080,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -72964,16 +70150,15 @@ done - echo "$as_me:$LINENO: checking for sqrtf declaration" >&5 -echo $ECHO_N "checking for sqrtf declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for sqrtf declaration" >&5 +echo $ECHO_N "checking for sqrtf declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func_sqrtf_use+set} != xset; then if test "${glibcxx_cv_func_sqrtf_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -72999,35 +70184,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func_sqrtf_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_sqrtf_use=no + glibcxx_cv_func_sqrtf_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -73038,17 +70219,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_sqrtf_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_sqrtf_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_sqrtf_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_sqrtf_use" >&6; } if test x$glibcxx_cv_func_sqrtf_use = x"yes"; then for ac_func in sqrtf do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -73079,68 +70260,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -73151,16 +70324,15 @@ done else - echo "$as_me:$LINENO: checking for _sqrtf declaration" >&5 -echo $ECHO_N "checking for _sqrtf declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for _sqrtf declaration" >&5 +echo $ECHO_N "checking for _sqrtf declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func__sqrtf_use+set} != xset; then if test "${glibcxx_cv_func__sqrtf_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -73186,35 +70358,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func__sqrtf_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func__sqrtf_use=no + glibcxx_cv_func__sqrtf_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -73225,17 +70393,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__sqrtf_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__sqrtf_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__sqrtf_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__sqrtf_use" >&6; } if test x$glibcxx_cv_func__sqrtf_use = x"yes"; then for ac_func in _sqrtf do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -73266,68 +70434,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -73344,16 +70504,15 @@ done - echo "$as_me:$LINENO: checking for sincosf declaration" >&5 -echo $ECHO_N "checking for sincosf declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for sincosf declaration" >&5 +echo $ECHO_N "checking for sincosf declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func_sincosf_use+set} != xset; then if test "${glibcxx_cv_func_sincosf_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -73375,35 +70534,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func_sincosf_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_sincosf_use=no + glibcxx_cv_func_sincosf_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -73414,17 +70569,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_sincosf_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_sincosf_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_sincosf_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_sincosf_use" >&6; } if test x$glibcxx_cv_func_sincosf_use = x"yes"; then for ac_func in sincosf do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -73455,68 +70610,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -73527,16 +70674,15 @@ done else - echo "$as_me:$LINENO: checking for _sincosf declaration" >&5 -echo $ECHO_N "checking for _sincosf declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for _sincosf declaration" >&5 +echo $ECHO_N "checking for _sincosf declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func__sincosf_use+set} != xset; then if test "${glibcxx_cv_func__sincosf_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -73558,35 +70704,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func__sincosf_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func__sincosf_use=no + glibcxx_cv_func__sincosf_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -73597,17 +70739,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__sincosf_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__sincosf_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__sincosf_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__sincosf_use" >&6; } if test x$glibcxx_cv_func__sincosf_use = x"yes"; then for ac_func in _sincosf do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -73638,68 +70780,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -73716,16 +70850,15 @@ done - echo "$as_me:$LINENO: checking for finitef declaration" >&5 -echo $ECHO_N "checking for finitef declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for finitef declaration" >&5 +echo $ECHO_N "checking for finitef declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func_finitef_use+set} != xset; then if test "${glibcxx_cv_func_finitef_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -73751,35 +70884,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func_finitef_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_finitef_use=no + glibcxx_cv_func_finitef_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -73790,17 +70919,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_finitef_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_finitef_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_finitef_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_finitef_use" >&6; } if test x$glibcxx_cv_func_finitef_use = x"yes"; then for ac_func in finitef do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -73831,68 +70960,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -73903,16 +71024,15 @@ done else - echo "$as_me:$LINENO: checking for _finitef declaration" >&5 -echo $ECHO_N "checking for _finitef declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for _finitef declaration" >&5 +echo $ECHO_N "checking for _finitef declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func__finitef_use+set} != xset; then if test "${glibcxx_cv_func__finitef_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -73938,35 +71058,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func__finitef_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func__finitef_use=no + glibcxx_cv_func__finitef_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -73977,17 +71093,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__finitef_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__finitef_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__finitef_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__finitef_use" >&6; } if test x$glibcxx_cv_func__finitef_use = x"yes"; then for ac_func in _finitef do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -74018,68 +71134,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -74096,15 +71204,14 @@ done - echo "$as_me:$LINENO: checking for long double trig functions" >&5 -echo $ECHO_N "checking for long double trig functions... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for long double trig functions" >&5 +echo $ECHO_N "checking for long double trig functions... $ECHO_C" >&6; } if test "${glibcxx_cv_func_long_double_trig_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -74126,35 +71233,31 @@ acosl (0); asinl (0); atanl (0); cosl (0); sinl (0); tanl (0); coshl (0); sinhl } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func_long_double_trig_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_long_double_trig_use=no + glibcxx_cv_func_long_double_trig_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -74163,8 +71266,8 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_long_double_trig_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_long_double_trig_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_long_double_trig_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_long_double_trig_use" >&6; } if test x$glibcxx_cv_func_long_double_trig_use = x"yes"; then @@ -74178,9 +71281,9 @@ echo "${ECHO_T}$glibcxx_cv_func_long_double_trig_use" >&6 for ac_func in acosl asinl atanl cosl sinl tanl coshl sinhl tanhl do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -74211,68 +71314,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -74282,15 +71377,14 @@ fi done else - echo "$as_me:$LINENO: checking for _long double trig functions" >&5 -echo $ECHO_N "checking for _long double trig functions... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for _long double trig functions" >&5 +echo $ECHO_N "checking for _long double trig functions... $ECHO_C" >&6; } if test "${glibcxx_cv_func__long_double_trig_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -74312,35 +71406,31 @@ _acosl (0); _asinl (0); _atanl (0); _cosl (0); _sinl (0); _tanl (0); _coshl (0); } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func__long_double_trig_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func__long_double_trig_use=no + glibcxx_cv_func__long_double_trig_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -74349,8 +71439,8 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__long_double_trig_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__long_double_trig_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__long_double_trig_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__long_double_trig_use" >&6; } if test x$glibcxx_cv_func__long_double_trig_use = x"yes"; then @@ -74364,9 +71454,9 @@ echo "${ECHO_T}$glibcxx_cv_func__long_double_trig_use" >&6 for ac_func in _acosl _asinl _atanl _cosl _sinl _tanl _coshl _sinhl _tanhl do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -74397,68 +71487,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -74483,15 +71565,14 @@ done - echo "$as_me:$LINENO: checking for long double round functions" >&5 -echo $ECHO_N "checking for long double round functions... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for long double round functions" >&5 +echo $ECHO_N "checking for long double round functions... $ECHO_C" >&6; } if test "${glibcxx_cv_func_long_double_round_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -74513,35 +71594,31 @@ ceill (0); floorl (0); } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func_long_double_round_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_long_double_round_use=no + glibcxx_cv_func_long_double_round_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -74550,17 +71627,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_long_double_round_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_long_double_round_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_long_double_round_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_long_double_round_use" >&6; } if test x$glibcxx_cv_func_long_double_round_use = x"yes"; then for ac_func in ceill floorl do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -74591,68 +71668,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -74662,15 +71731,14 @@ fi done else - echo "$as_me:$LINENO: checking for _long double round functions" >&5 -echo $ECHO_N "checking for _long double round functions... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for _long double round functions" >&5 +echo $ECHO_N "checking for _long double round functions... $ECHO_C" >&6; } if test "${glibcxx_cv_func__long_double_round_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -74692,35 +71760,31 @@ _ceill (0); _floorl (0); } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func__long_double_round_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func__long_double_round_use=no + glibcxx_cv_func__long_double_round_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -74729,17 +71793,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__long_double_round_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__long_double_round_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__long_double_round_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__long_double_round_use" >&6; } if test x$glibcxx_cv_func__long_double_round_use = x"yes"; then for ac_func in _ceill _floorl do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -74770,68 +71834,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -74850,16 +71906,15 @@ done - echo "$as_me:$LINENO: checking for isnanl declaration" >&5 -echo $ECHO_N "checking for isnanl declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for isnanl declaration" >&5 +echo $ECHO_N "checking for isnanl declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func_isnanl_use+set} != xset; then if test "${glibcxx_cv_func_isnanl_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -74885,35 +71940,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func_isnanl_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_isnanl_use=no + glibcxx_cv_func_isnanl_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -74924,17 +71975,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_isnanl_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_isnanl_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_isnanl_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_isnanl_use" >&6; } if test x$glibcxx_cv_func_isnanl_use = x"yes"; then for ac_func in isnanl do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -74965,68 +72016,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -75037,16 +72080,15 @@ done else - echo "$as_me:$LINENO: checking for _isnanl declaration" >&5 -echo $ECHO_N "checking for _isnanl declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for _isnanl declaration" >&5 +echo $ECHO_N "checking for _isnanl declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func__isnanl_use+set} != xset; then if test "${glibcxx_cv_func__isnanl_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -75072,35 +72114,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func__isnanl_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func__isnanl_use=no + glibcxx_cv_func__isnanl_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -75111,17 +72149,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__isnanl_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__isnanl_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__isnanl_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__isnanl_use" >&6; } if test x$glibcxx_cv_func__isnanl_use = x"yes"; then for ac_func in _isnanl do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -75152,68 +72190,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -75230,16 +72260,15 @@ done - echo "$as_me:$LINENO: checking for isinfl declaration" >&5 -echo $ECHO_N "checking for isinfl declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for isinfl declaration" >&5 +echo $ECHO_N "checking for isinfl declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func_isinfl_use+set} != xset; then if test "${glibcxx_cv_func_isinfl_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -75265,35 +72294,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func_isinfl_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_isinfl_use=no + glibcxx_cv_func_isinfl_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -75304,17 +72329,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_isinfl_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_isinfl_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_isinfl_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_isinfl_use" >&6; } if test x$glibcxx_cv_func_isinfl_use = x"yes"; then for ac_func in isinfl do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -75345,68 +72370,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -75417,16 +72434,15 @@ done else - echo "$as_me:$LINENO: checking for _isinfl declaration" >&5 -echo $ECHO_N "checking for _isinfl declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for _isinfl declaration" >&5 +echo $ECHO_N "checking for _isinfl declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func__isinfl_use+set} != xset; then if test "${glibcxx_cv_func__isinfl_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -75452,35 +72468,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func__isinfl_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func__isinfl_use=no + glibcxx_cv_func__isinfl_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -75491,17 +72503,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__isinfl_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__isinfl_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__isinfl_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__isinfl_use" >&6; } if test x$glibcxx_cv_func__isinfl_use = x"yes"; then for ac_func in _isinfl do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -75532,68 +72544,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -75610,16 +72614,15 @@ done - echo "$as_me:$LINENO: checking for copysignl declaration" >&5 -echo $ECHO_N "checking for copysignl declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for copysignl declaration" >&5 +echo $ECHO_N "checking for copysignl declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func_copysignl_use+set} != xset; then if test "${glibcxx_cv_func_copysignl_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -75641,35 +72644,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func_copysignl_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_copysignl_use=no + glibcxx_cv_func_copysignl_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -75680,17 +72679,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_copysignl_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_copysignl_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_copysignl_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_copysignl_use" >&6; } if test x$glibcxx_cv_func_copysignl_use = x"yes"; then for ac_func in copysignl do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -75721,68 +72720,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -75793,16 +72784,15 @@ done else - echo "$as_me:$LINENO: checking for _copysignl declaration" >&5 -echo $ECHO_N "checking for _copysignl declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for _copysignl declaration" >&5 +echo $ECHO_N "checking for _copysignl declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func__copysignl_use+set} != xset; then if test "${glibcxx_cv_func__copysignl_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -75824,35 +72814,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func__copysignl_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func__copysignl_use=no + glibcxx_cv_func__copysignl_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -75863,17 +72849,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__copysignl_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__copysignl_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__copysignl_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__copysignl_use" >&6; } if test x$glibcxx_cv_func__copysignl_use = x"yes"; then for ac_func in _copysignl do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -75904,68 +72890,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -75982,16 +72960,15 @@ done - echo "$as_me:$LINENO: checking for atan2l declaration" >&5 -echo $ECHO_N "checking for atan2l declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for atan2l declaration" >&5 +echo $ECHO_N "checking for atan2l declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func_atan2l_use+set} != xset; then if test "${glibcxx_cv_func_atan2l_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -76013,35 +72990,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func_atan2l_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_atan2l_use=no + glibcxx_cv_func_atan2l_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -76052,17 +73025,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_atan2l_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_atan2l_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_atan2l_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_atan2l_use" >&6; } if test x$glibcxx_cv_func_atan2l_use = x"yes"; then for ac_func in atan2l do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -76093,68 +73066,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -76165,16 +73130,15 @@ done else - echo "$as_me:$LINENO: checking for _atan2l declaration" >&5 -echo $ECHO_N "checking for _atan2l declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for _atan2l declaration" >&5 +echo $ECHO_N "checking for _atan2l declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func__atan2l_use+set} != xset; then if test "${glibcxx_cv_func__atan2l_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -76196,35 +73160,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func__atan2l_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func__atan2l_use=no + glibcxx_cv_func__atan2l_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -76235,17 +73195,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__atan2l_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__atan2l_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__atan2l_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__atan2l_use" >&6; } if test x$glibcxx_cv_func__atan2l_use = x"yes"; then for ac_func in _atan2l do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -76276,68 +73236,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -76354,16 +73306,15 @@ done - echo "$as_me:$LINENO: checking for expl declaration" >&5 -echo $ECHO_N "checking for expl declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for expl declaration" >&5 +echo $ECHO_N "checking for expl declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func_expl_use+set} != xset; then if test "${glibcxx_cv_func_expl_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -76389,35 +73340,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func_expl_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_expl_use=no + glibcxx_cv_func_expl_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -76428,17 +73375,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_expl_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_expl_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_expl_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_expl_use" >&6; } if test x$glibcxx_cv_func_expl_use = x"yes"; then for ac_func in expl do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -76469,68 +73416,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -76541,16 +73480,15 @@ done else - echo "$as_me:$LINENO: checking for _expl declaration" >&5 -echo $ECHO_N "checking for _expl declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for _expl declaration" >&5 +echo $ECHO_N "checking for _expl declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func__expl_use+set} != xset; then if test "${glibcxx_cv_func__expl_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -76576,35 +73514,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func__expl_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func__expl_use=no + glibcxx_cv_func__expl_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -76615,17 +73549,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__expl_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__expl_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__expl_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__expl_use" >&6; } if test x$glibcxx_cv_func__expl_use = x"yes"; then for ac_func in _expl do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -76656,68 +73590,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -76734,16 +73660,15 @@ done - echo "$as_me:$LINENO: checking for fabsl declaration" >&5 -echo $ECHO_N "checking for fabsl declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for fabsl declaration" >&5 +echo $ECHO_N "checking for fabsl declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func_fabsl_use+set} != xset; then if test "${glibcxx_cv_func_fabsl_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -76769,35 +73694,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func_fabsl_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_fabsl_use=no + glibcxx_cv_func_fabsl_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -76808,17 +73729,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_fabsl_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_fabsl_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_fabsl_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_fabsl_use" >&6; } if test x$glibcxx_cv_func_fabsl_use = x"yes"; then for ac_func in fabsl do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -76849,68 +73770,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -76921,16 +73834,15 @@ done else - echo "$as_me:$LINENO: checking for _fabsl declaration" >&5 -echo $ECHO_N "checking for _fabsl declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for _fabsl declaration" >&5 +echo $ECHO_N "checking for _fabsl declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func__fabsl_use+set} != xset; then if test "${glibcxx_cv_func__fabsl_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -76956,35 +73868,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func__fabsl_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func__fabsl_use=no + glibcxx_cv_func__fabsl_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -76995,17 +73903,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__fabsl_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__fabsl_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__fabsl_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__fabsl_use" >&6; } if test x$glibcxx_cv_func__fabsl_use = x"yes"; then for ac_func in _fabsl do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -77036,68 +73944,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -77114,16 +74014,15 @@ done - echo "$as_me:$LINENO: checking for fmodl declaration" >&5 -echo $ECHO_N "checking for fmodl declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for fmodl declaration" >&5 +echo $ECHO_N "checking for fmodl declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func_fmodl_use+set} != xset; then if test "${glibcxx_cv_func_fmodl_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -77145,35 +74044,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func_fmodl_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_fmodl_use=no + glibcxx_cv_func_fmodl_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -77184,17 +74079,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_fmodl_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_fmodl_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_fmodl_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_fmodl_use" >&6; } if test x$glibcxx_cv_func_fmodl_use = x"yes"; then for ac_func in fmodl do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -77225,68 +74120,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -77297,16 +74184,15 @@ done else - echo "$as_me:$LINENO: checking for _fmodl declaration" >&5 -echo $ECHO_N "checking for _fmodl declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for _fmodl declaration" >&5 +echo $ECHO_N "checking for _fmodl declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func__fmodl_use+set} != xset; then if test "${glibcxx_cv_func__fmodl_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -77328,35 +74214,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func__fmodl_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func__fmodl_use=no + glibcxx_cv_func__fmodl_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -77367,17 +74249,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__fmodl_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__fmodl_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__fmodl_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__fmodl_use" >&6; } if test x$glibcxx_cv_func__fmodl_use = x"yes"; then for ac_func in _fmodl do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -77408,68 +74290,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -77486,16 +74360,15 @@ done - echo "$as_me:$LINENO: checking for frexpl declaration" >&5 -echo $ECHO_N "checking for frexpl declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for frexpl declaration" >&5 +echo $ECHO_N "checking for frexpl declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func_frexpl_use+set} != xset; then if test "${glibcxx_cv_func_frexpl_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -77517,35 +74390,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func_frexpl_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_frexpl_use=no + glibcxx_cv_func_frexpl_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -77556,17 +74425,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_frexpl_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_frexpl_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_frexpl_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_frexpl_use" >&6; } if test x$glibcxx_cv_func_frexpl_use = x"yes"; then for ac_func in frexpl do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -77597,68 +74466,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -77669,16 +74530,15 @@ done else - echo "$as_me:$LINENO: checking for _frexpl declaration" >&5 -echo $ECHO_N "checking for _frexpl declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for _frexpl declaration" >&5 +echo $ECHO_N "checking for _frexpl declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func__frexpl_use+set} != xset; then if test "${glibcxx_cv_func__frexpl_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -77700,35 +74560,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func__frexpl_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func__frexpl_use=no + glibcxx_cv_func__frexpl_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -77739,17 +74595,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__frexpl_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__frexpl_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__frexpl_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__frexpl_use" >&6; } if test x$glibcxx_cv_func__frexpl_use = x"yes"; then for ac_func in _frexpl do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -77780,68 +74636,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -77858,16 +74706,15 @@ done - echo "$as_me:$LINENO: checking for hypotl declaration" >&5 -echo $ECHO_N "checking for hypotl declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for hypotl declaration" >&5 +echo $ECHO_N "checking for hypotl declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func_hypotl_use+set} != xset; then if test "${glibcxx_cv_func_hypotl_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -77889,35 +74736,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func_hypotl_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_hypotl_use=no + glibcxx_cv_func_hypotl_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -77928,17 +74771,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_hypotl_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_hypotl_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_hypotl_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_hypotl_use" >&6; } if test x$glibcxx_cv_func_hypotl_use = x"yes"; then for ac_func in hypotl do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -77969,68 +74812,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -78041,16 +74876,15 @@ done else - echo "$as_me:$LINENO: checking for _hypotl declaration" >&5 -echo $ECHO_N "checking for _hypotl declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for _hypotl declaration" >&5 +echo $ECHO_N "checking for _hypotl declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func__hypotl_use+set} != xset; then if test "${glibcxx_cv_func__hypotl_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -78072,35 +74906,207 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + glibcxx_cv_func__hypotl_use=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + glibcxx_cv_func__hypotl_use=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +fi + + fi + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__hypotl_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__hypotl_use" >&6; } + + if test x$glibcxx_cv_func__hypotl_use = x"yes"; then + +for ac_func in _hypotl +do +as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test x$gcc_no_link = xyes; then + { { echo "$as_me:$LINENO: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&5 +echo "$as_me: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&2;} + { (exit 1); exit 1; }; } +fi +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define $ac_func to an innocuous variant, in case declares $ac_func. + For example, HP-UX 11i declares gettimeofday. */ +#define $ac_func innocuous_$ac_func + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $ac_func (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $ac_func + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char $ac_func (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_$ac_func || defined __stub___$ac_func +choke me +#endif + +int +main () +{ +return $ac_func (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then + eval "$as_ac_var=yes" +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + eval "$as_ac_var=no" +fi + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +fi +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } +if test `eval echo '${'$as_ac_var'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +fi +done + + fi + fi + + + + + + + { echo "$as_me:$LINENO: checking for ldexpl declaration" >&5 +echo $ECHO_N "checking for ldexpl declaration... $ECHO_C" >&6; } + if test x${glibcxx_cv_func_ldexpl_use+set} != xset; then + if test "${glibcxx_cv_func_ldexpl_use+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + + ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +int +main () +{ + ldexpl(0, 0); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - glibcxx_cv_func__hypotl_use=yes + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + glibcxx_cv_func_ldexpl_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func__hypotl_use=no + glibcxx_cv_func_ldexpl_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -78111,17 +75117,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__hypotl_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__hypotl_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_ldexpl_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_ldexpl_use" >&6; } - if test x$glibcxx_cv_func__hypotl_use = x"yes"; then + if test x$glibcxx_cv_func_ldexpl_use = x"yes"; then -for ac_func in _hypotl +for ac_func in ldexpl do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -78152,257 +75158,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ -#ifdef __cplusplus -extern "C" -{ -#endif -/* We use char because int might match the return type of a gcc2 +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ -char $ac_func (); -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) -choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} -#endif - -int -main () -{ -return f != $ac_func; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - eval "$as_ac_var=yes" -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -eval "$as_ac_var=no" -fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 -if test `eval echo '${'$as_ac_var'}'` = yes; then - cat >>confdefs.h <<_ACEOF -#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 -_ACEOF - -fi -done - - fi - fi - - - - - - - echo "$as_me:$LINENO: checking for ldexpl declaration" >&5 -echo $ECHO_N "checking for ldexpl declaration... $ECHO_C" >&6 - if test x${glibcxx_cv_func_ldexpl_use+set} != xset; then - if test "${glibcxx_cv_func_ldexpl_use+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - - - - ac_ext=cc -ac_cpp='$CXXCPP $CPPFLAGS' -ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_cxx_compiler_gnu - - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include -int -main () -{ - ldexpl(0, 0); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - glibcxx_cv_func_ldexpl_use=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -glibcxx_cv_func_ldexpl_use=no -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext - ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - - -fi - - fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_ldexpl_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_ldexpl_use" >&6 - - if test x$glibcxx_cv_func_ldexpl_use = x"yes"; then - -for ac_func in ldexpl -do -as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test x$gcc_no_link = xyes; then - { { echo "$as_me:$LINENO: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&5 -echo "$as_me: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&2;} - { (exit 1); exit 1; }; } -fi -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -/* Define $ac_func to an innocuous variant, in case declares $ac_func. - For example, HP-UX 11i declares gettimeofday. */ -#define $ac_func innocuous_$ac_func - -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char $ac_func (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ - -#ifdef __STDC__ -# include -#else -# include -#endif - -#undef $ac_func - -/* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -78413,16 +75222,15 @@ done else - echo "$as_me:$LINENO: checking for _ldexpl declaration" >&5 -echo $ECHO_N "checking for _ldexpl declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for _ldexpl declaration" >&5 +echo $ECHO_N "checking for _ldexpl declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func__ldexpl_use+set} != xset; then if test "${glibcxx_cv_func__ldexpl_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -78444,35 +75252,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func__ldexpl_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func__ldexpl_use=no + glibcxx_cv_func__ldexpl_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -78483,17 +75287,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__ldexpl_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__ldexpl_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__ldexpl_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__ldexpl_use" >&6; } if test x$glibcxx_cv_func__ldexpl_use = x"yes"; then for ac_func in _ldexpl do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -78524,68 +75328,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -78602,16 +75398,15 @@ done - echo "$as_me:$LINENO: checking for logl declaration" >&5 -echo $ECHO_N "checking for logl declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for logl declaration" >&5 +echo $ECHO_N "checking for logl declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func_logl_use+set} != xset; then if test "${glibcxx_cv_func_logl_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -78637,35 +75432,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func_logl_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_logl_use=no + glibcxx_cv_func_logl_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -78676,17 +75467,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_logl_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_logl_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_logl_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_logl_use" >&6; } if test x$glibcxx_cv_func_logl_use = x"yes"; then for ac_func in logl do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -78717,68 +75508,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -78789,16 +75572,15 @@ done else - echo "$as_me:$LINENO: checking for _logl declaration" >&5 -echo $ECHO_N "checking for _logl declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for _logl declaration" >&5 +echo $ECHO_N "checking for _logl declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func__logl_use+set} != xset; then if test "${glibcxx_cv_func__logl_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -78824,35 +75606,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func__logl_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func__logl_use=no + glibcxx_cv_func__logl_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -78863,17 +75641,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__logl_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__logl_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__logl_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__logl_use" >&6; } if test x$glibcxx_cv_func__logl_use = x"yes"; then for ac_func in _logl do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -78904,68 +75682,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -78982,16 +75752,15 @@ done - echo "$as_me:$LINENO: checking for log10l declaration" >&5 -echo $ECHO_N "checking for log10l declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for log10l declaration" >&5 +echo $ECHO_N "checking for log10l declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func_log10l_use+set} != xset; then if test "${glibcxx_cv_func_log10l_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -79017,35 +75786,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func_log10l_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_log10l_use=no + glibcxx_cv_func_log10l_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -79056,17 +75821,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_log10l_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_log10l_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_log10l_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_log10l_use" >&6; } if test x$glibcxx_cv_func_log10l_use = x"yes"; then for ac_func in log10l do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -79097,68 +75862,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -79169,16 +75926,15 @@ done else - echo "$as_me:$LINENO: checking for _log10l declaration" >&5 -echo $ECHO_N "checking for _log10l declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for _log10l declaration" >&5 +echo $ECHO_N "checking for _log10l declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func__log10l_use+set} != xset; then if test "${glibcxx_cv_func__log10l_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -79204,35 +75960,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func__log10l_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func__log10l_use=no + glibcxx_cv_func__log10l_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -79243,17 +75995,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__log10l_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__log10l_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__log10l_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__log10l_use" >&6; } if test x$glibcxx_cv_func__log10l_use = x"yes"; then for ac_func in _log10l do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -79284,68 +76036,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -79362,16 +76106,15 @@ done - echo "$as_me:$LINENO: checking for modfl declaration" >&5 -echo $ECHO_N "checking for modfl declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for modfl declaration" >&5 +echo $ECHO_N "checking for modfl declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func_modfl_use+set} != xset; then if test "${glibcxx_cv_func_modfl_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -79393,35 +76136,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func_modfl_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_modfl_use=no + glibcxx_cv_func_modfl_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -79432,17 +76171,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_modfl_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_modfl_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_modfl_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_modfl_use" >&6; } if test x$glibcxx_cv_func_modfl_use = x"yes"; then for ac_func in modfl do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -79473,68 +76212,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -79545,16 +76276,15 @@ done else - echo "$as_me:$LINENO: checking for _modfl declaration" >&5 -echo $ECHO_N "checking for _modfl declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for _modfl declaration" >&5 +echo $ECHO_N "checking for _modfl declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func__modfl_use+set} != xset; then if test "${glibcxx_cv_func__modfl_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -79576,35 +76306,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func__modfl_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func__modfl_use=no + glibcxx_cv_func__modfl_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -79615,17 +76341,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__modfl_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__modfl_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__modfl_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__modfl_use" >&6; } if test x$glibcxx_cv_func__modfl_use = x"yes"; then for ac_func in _modfl do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -79656,68 +76382,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -79734,16 +76452,15 @@ done - echo "$as_me:$LINENO: checking for powl declaration" >&5 -echo $ECHO_N "checking for powl declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for powl declaration" >&5 +echo $ECHO_N "checking for powl declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func_powl_use+set} != xset; then if test "${glibcxx_cv_func_powl_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -79765,35 +76482,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func_powl_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_powl_use=no + glibcxx_cv_func_powl_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -79804,17 +76517,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_powl_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_powl_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_powl_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_powl_use" >&6; } if test x$glibcxx_cv_func_powl_use = x"yes"; then for ac_func in powl do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -79845,68 +76558,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -79917,16 +76622,15 @@ done else - echo "$as_me:$LINENO: checking for _powl declaration" >&5 -echo $ECHO_N "checking for _powl declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for _powl declaration" >&5 +echo $ECHO_N "checking for _powl declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func__powl_use+set} != xset; then if test "${glibcxx_cv_func__powl_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -79948,35 +76652,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func__powl_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func__powl_use=no + glibcxx_cv_func__powl_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -79987,17 +76687,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__powl_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__powl_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__powl_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__powl_use" >&6; } if test x$glibcxx_cv_func__powl_use = x"yes"; then for ac_func in _powl do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -80028,68 +76728,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -80106,16 +76798,15 @@ done - echo "$as_me:$LINENO: checking for sqrtl declaration" >&5 -echo $ECHO_N "checking for sqrtl declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for sqrtl declaration" >&5 +echo $ECHO_N "checking for sqrtl declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func_sqrtl_use+set} != xset; then if test "${glibcxx_cv_func_sqrtl_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -80141,35 +76832,205 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + glibcxx_cv_func_sqrtl_use=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + glibcxx_cv_func_sqrtl_use=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +fi + + fi + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_sqrtl_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_sqrtl_use" >&6; } + + if test x$glibcxx_cv_func_sqrtl_use = x"yes"; then + +for ac_func in sqrtl +do +as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test x$gcc_no_link = xyes; then + { { echo "$as_me:$LINENO: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&5 +echo "$as_me: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&2;} + { (exit 1); exit 1; }; } +fi +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define $ac_func to an innocuous variant, in case declares $ac_func. + For example, HP-UX 11i declares gettimeofday. */ +#define $ac_func innocuous_$ac_func + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $ac_func (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $ac_func + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char $ac_func (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_$ac_func || defined __stub___$ac_func +choke me +#endif + +int +main () +{ +return $ac_func (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then + eval "$as_ac_var=yes" +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + eval "$as_ac_var=no" +fi + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +fi +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } +if test `eval echo '${'$as_ac_var'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +fi +done + + else + + { echo "$as_me:$LINENO: checking for _sqrtl declaration" >&5 +echo $ECHO_N "checking for _sqrtl declaration... $ECHO_C" >&6; } + if test x${glibcxx_cv_func__sqrtl_use+set} != xset; then + if test "${glibcxx_cv_func__sqrtl_use+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + + ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include + #ifdef HAVE_IEEEFP_H + #include + #endif + +int +main () +{ + _sqrtl(0); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - glibcxx_cv_func_sqrtl_use=yes + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + glibcxx_cv_func__sqrtl_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_sqrtl_use=no + glibcxx_cv_func__sqrtl_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -80180,17 +77041,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_sqrtl_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_sqrtl_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__sqrtl_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__sqrtl_use" >&6; } - if test x$glibcxx_cv_func_sqrtl_use = x"yes"; then + if test x$glibcxx_cv_func__sqrtl_use = x"yes"; then -for ac_func in sqrtl +for ac_func in _sqrtl do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -80221,255 +77082,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ -#ifdef __cplusplus -extern "C" -{ -#endif -/* We use char because int might match the return type of a gcc2 +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ -char $ac_func (); -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) -choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} -#endif - -int -main () -{ -return f != $ac_func; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - eval "$as_ac_var=yes" -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -eval "$as_ac_var=no" -fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 -if test `eval echo '${'$as_ac_var'}'` = yes; then - cat >>confdefs.h <<_ACEOF -#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 -_ACEOF - -fi -done - - else - - echo "$as_me:$LINENO: checking for _sqrtl declaration" >&5 -echo $ECHO_N "checking for _sqrtl declaration... $ECHO_C" >&6 - if test x${glibcxx_cv_func__sqrtl_use+set} != xset; then - if test "${glibcxx_cv_func__sqrtl_use+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - - - - ac_ext=cc -ac_cpp='$CXXCPP $CPPFLAGS' -ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_cxx_compiler_gnu - - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include - #ifdef HAVE_IEEEFP_H - #include - #endif - -int -main () -{ - _sqrtl(0); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - glibcxx_cv_func__sqrtl_use=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -glibcxx_cv_func__sqrtl_use=no -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext - ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - - -fi - - fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__sqrtl_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__sqrtl_use" >&6 - - if test x$glibcxx_cv_func__sqrtl_use = x"yes"; then - -for ac_func in _sqrtl -do -as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test x$gcc_no_link = xyes; then - { { echo "$as_me:$LINENO: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&5 -echo "$as_me: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&2;} - { (exit 1); exit 1; }; } -fi -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -/* Define $ac_func to an innocuous variant, in case declares $ac_func. - For example, HP-UX 11i declares gettimeofday. */ -#define $ac_func innocuous_$ac_func - -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char $ac_func (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ - -#ifdef __STDC__ -# include -#else -# include -#endif - -#undef $ac_func - -/* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -80486,16 +77152,15 @@ done - echo "$as_me:$LINENO: checking for sincosl declaration" >&5 -echo $ECHO_N "checking for sincosl declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for sincosl declaration" >&5 +echo $ECHO_N "checking for sincosl declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func_sincosl_use+set} != xset; then if test "${glibcxx_cv_func_sincosl_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -80517,35 +77182,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func_sincosl_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_sincosl_use=no + glibcxx_cv_func_sincosl_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -80556,17 +77217,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_sincosl_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_sincosl_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_sincosl_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_sincosl_use" >&6; } if test x$glibcxx_cv_func_sincosl_use = x"yes"; then for ac_func in sincosl do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -80597,68 +77258,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -80669,16 +77322,15 @@ done else - echo "$as_me:$LINENO: checking for _sincosl declaration" >&5 -echo $ECHO_N "checking for _sincosl declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for _sincosl declaration" >&5 +echo $ECHO_N "checking for _sincosl declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func__sincosl_use+set} != xset; then if test "${glibcxx_cv_func__sincosl_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -80700,35 +77352,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func__sincosl_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func__sincosl_use=no + glibcxx_cv_func__sincosl_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -80739,17 +77387,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__sincosl_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__sincosl_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__sincosl_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__sincosl_use" >&6; } if test x$glibcxx_cv_func__sincosl_use = x"yes"; then for ac_func in _sincosl do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -80780,68 +77428,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -80858,16 +77498,15 @@ done - echo "$as_me:$LINENO: checking for finitel declaration" >&5 -echo $ECHO_N "checking for finitel declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for finitel declaration" >&5 +echo $ECHO_N "checking for finitel declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func_finitel_use+set} != xset; then if test "${glibcxx_cv_func_finitel_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -80893,35 +77532,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func_finitel_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_finitel_use=no + glibcxx_cv_func_finitel_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -80932,17 +77567,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_finitel_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_finitel_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_finitel_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_finitel_use" >&6; } if test x$glibcxx_cv_func_finitel_use = x"yes"; then for ac_func in finitel do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -80973,68 +77608,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -81045,16 +77672,15 @@ done else - echo "$as_me:$LINENO: checking for _finitel declaration" >&5 -echo $ECHO_N "checking for _finitel declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for _finitel declaration" >&5 +echo $ECHO_N "checking for _finitel declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func__finitel_use+set} != xset; then if test "${glibcxx_cv_func__finitel_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -81080,35 +77706,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func__finitel_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func__finitel_use=no + glibcxx_cv_func__finitel_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -81119,17 +77741,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__finitel_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__finitel_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__finitel_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__finitel_use" >&6; } if test x$glibcxx_cv_func__finitel_use = x"yes"; then for ac_func in _finitel do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -81160,68 +77782,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -81242,16 +77856,15 @@ done - echo "$as_me:$LINENO: checking for __builtin_abs declaration" >&5 -echo $ECHO_N "checking for __builtin_abs declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for __builtin_abs declaration" >&5 +echo $ECHO_N "checking for __builtin_abs declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func___builtin_abs_use+set} != xset; then if test "${glibcxx_cv_func___builtin_abs_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -81273,35 +77886,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func___builtin_abs_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func___builtin_abs_use=no + glibcxx_cv_func___builtin_abs_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -81312,11 +77921,11 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_abs_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func___builtin_abs_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_abs_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func___builtin_abs_use" >&6; } if test x$glibcxx_cv_func___builtin_abs_use = x"yes"; then - echo "$as_me:$LINENO: checking for __builtin_abs linkage" >&5 -echo $ECHO_N "checking for __builtin_abs linkage... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for __builtin_abs linkage" >&5 +echo $ECHO_N "checking for __builtin_abs linkage... $ECHO_C" >&6; } if test x${glibcxx_cv_func___builtin_abs_link+set} != xset; then if test "${glibcxx_cv_func___builtin_abs_link+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 @@ -81343,42 +77952,39 @@ main () } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then glibcxx_cv_func___builtin_abs_link=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func___builtin_abs_link=no + glibcxx_cv_func___builtin_abs_link=no fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_abs_link" >&5 -echo "${ECHO_T}$glibcxx_cv_func___builtin_abs_link" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_abs_link" >&5 +echo "${ECHO_T}$glibcxx_cv_func___builtin_abs_link" >&6; } if test x$glibcxx_cv_func___builtin_abs_link = x"yes"; then @@ -81391,16 +77997,15 @@ _ACEOF fi - echo "$as_me:$LINENO: checking for __builtin_fabsf declaration" >&5 -echo $ECHO_N "checking for __builtin_fabsf declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for __builtin_fabsf declaration" >&5 +echo $ECHO_N "checking for __builtin_fabsf declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func___builtin_fabsf_use+set} != xset; then if test "${glibcxx_cv_func___builtin_fabsf_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -81422,35 +78027,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func___builtin_fabsf_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func___builtin_fabsf_use=no + glibcxx_cv_func___builtin_fabsf_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -81461,11 +78062,11 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_fabsf_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func___builtin_fabsf_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_fabsf_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func___builtin_fabsf_use" >&6; } if test x$glibcxx_cv_func___builtin_fabsf_use = x"yes"; then - echo "$as_me:$LINENO: checking for __builtin_fabsf linkage" >&5 -echo $ECHO_N "checking for __builtin_fabsf linkage... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for __builtin_fabsf linkage" >&5 +echo $ECHO_N "checking for __builtin_fabsf linkage... $ECHO_C" >&6; } if test x${glibcxx_cv_func___builtin_fabsf_link+set} != xset; then if test "${glibcxx_cv_func___builtin_fabsf_link+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 @@ -81492,42 +78093,39 @@ main () } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then glibcxx_cv_func___builtin_fabsf_link=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func___builtin_fabsf_link=no + glibcxx_cv_func___builtin_fabsf_link=no fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_fabsf_link" >&5 -echo "${ECHO_T}$glibcxx_cv_func___builtin_fabsf_link" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_fabsf_link" >&5 +echo "${ECHO_T}$glibcxx_cv_func___builtin_fabsf_link" >&6; } if test x$glibcxx_cv_func___builtin_fabsf_link = x"yes"; then @@ -81540,16 +78138,15 @@ _ACEOF fi - echo "$as_me:$LINENO: checking for __builtin_fabs declaration" >&5 -echo $ECHO_N "checking for __builtin_fabs declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for __builtin_fabs declaration" >&5 +echo $ECHO_N "checking for __builtin_fabs declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func___builtin_fabs_use+set} != xset; then if test "${glibcxx_cv_func___builtin_fabs_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -81571,35 +78168,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func___builtin_fabs_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func___builtin_fabs_use=no + glibcxx_cv_func___builtin_fabs_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -81610,11 +78203,11 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_fabs_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func___builtin_fabs_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_fabs_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func___builtin_fabs_use" >&6; } if test x$glibcxx_cv_func___builtin_fabs_use = x"yes"; then - echo "$as_me:$LINENO: checking for __builtin_fabs linkage" >&5 -echo $ECHO_N "checking for __builtin_fabs linkage... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for __builtin_fabs linkage" >&5 +echo $ECHO_N "checking for __builtin_fabs linkage... $ECHO_C" >&6; } if test x${glibcxx_cv_func___builtin_fabs_link+set} != xset; then if test "${glibcxx_cv_func___builtin_fabs_link+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 @@ -81641,42 +78234,39 @@ main () } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then glibcxx_cv_func___builtin_fabs_link=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func___builtin_fabs_link=no + glibcxx_cv_func___builtin_fabs_link=no fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_fabs_link" >&5 -echo "${ECHO_T}$glibcxx_cv_func___builtin_fabs_link" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_fabs_link" >&5 +echo "${ECHO_T}$glibcxx_cv_func___builtin_fabs_link" >&6; } if test x$glibcxx_cv_func___builtin_fabs_link = x"yes"; then @@ -81689,16 +78279,15 @@ _ACEOF fi - echo "$as_me:$LINENO: checking for __builtin_fabsl declaration" >&5 -echo $ECHO_N "checking for __builtin_fabsl declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for __builtin_fabsl declaration" >&5 +echo $ECHO_N "checking for __builtin_fabsl declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func___builtin_fabsl_use+set} != xset; then if test "${glibcxx_cv_func___builtin_fabsl_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -81720,35 +78309,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func___builtin_fabsl_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func___builtin_fabsl_use=no + glibcxx_cv_func___builtin_fabsl_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -81759,11 +78344,11 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_fabsl_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func___builtin_fabsl_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_fabsl_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func___builtin_fabsl_use" >&6; } if test x$glibcxx_cv_func___builtin_fabsl_use = x"yes"; then - echo "$as_me:$LINENO: checking for __builtin_fabsl linkage" >&5 -echo $ECHO_N "checking for __builtin_fabsl linkage... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for __builtin_fabsl linkage" >&5 +echo $ECHO_N "checking for __builtin_fabsl linkage... $ECHO_C" >&6; } if test x${glibcxx_cv_func___builtin_fabsl_link+set} != xset; then if test "${glibcxx_cv_func___builtin_fabsl_link+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 @@ -81790,42 +78375,39 @@ main () } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then glibcxx_cv_func___builtin_fabsl_link=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func___builtin_fabsl_link=no + glibcxx_cv_func___builtin_fabsl_link=no fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_fabsl_link" >&5 -echo "${ECHO_T}$glibcxx_cv_func___builtin_fabsl_link" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_fabsl_link" >&5 +echo "${ECHO_T}$glibcxx_cv_func___builtin_fabsl_link" >&6; } if test x$glibcxx_cv_func___builtin_fabsl_link = x"yes"; then @@ -81838,16 +78420,15 @@ _ACEOF fi - echo "$as_me:$LINENO: checking for __builtin_labs declaration" >&5 -echo $ECHO_N "checking for __builtin_labs declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for __builtin_labs declaration" >&5 +echo $ECHO_N "checking for __builtin_labs declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func___builtin_labs_use+set} != xset; then if test "${glibcxx_cv_func___builtin_labs_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -81869,35 +78450,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func___builtin_labs_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func___builtin_labs_use=no + glibcxx_cv_func___builtin_labs_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -81908,11 +78485,11 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_labs_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func___builtin_labs_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_labs_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func___builtin_labs_use" >&6; } if test x$glibcxx_cv_func___builtin_labs_use = x"yes"; then - echo "$as_me:$LINENO: checking for __builtin_labs linkage" >&5 -echo $ECHO_N "checking for __builtin_labs linkage... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for __builtin_labs linkage" >&5 +echo $ECHO_N "checking for __builtin_labs linkage... $ECHO_C" >&6; } if test x${glibcxx_cv_func___builtin_labs_link+set} != xset; then if test "${glibcxx_cv_func___builtin_labs_link+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 @@ -81939,42 +78516,39 @@ main () } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then glibcxx_cv_func___builtin_labs_link=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func___builtin_labs_link=no + glibcxx_cv_func___builtin_labs_link=no fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_labs_link" >&5 -echo "${ECHO_T}$glibcxx_cv_func___builtin_labs_link" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_labs_link" >&5 +echo "${ECHO_T}$glibcxx_cv_func___builtin_labs_link" >&6; } if test x$glibcxx_cv_func___builtin_labs_link = x"yes"; then @@ -81988,16 +78562,15 @@ _ACEOF - echo "$as_me:$LINENO: checking for __builtin_sqrtf declaration" >&5 -echo $ECHO_N "checking for __builtin_sqrtf declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for __builtin_sqrtf declaration" >&5 +echo $ECHO_N "checking for __builtin_sqrtf declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func___builtin_sqrtf_use+set} != xset; then if test "${glibcxx_cv_func___builtin_sqrtf_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -82019,35 +78592,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func___builtin_sqrtf_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func___builtin_sqrtf_use=no + glibcxx_cv_func___builtin_sqrtf_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -82058,11 +78627,11 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_sqrtf_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func___builtin_sqrtf_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_sqrtf_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func___builtin_sqrtf_use" >&6; } if test x$glibcxx_cv_func___builtin_sqrtf_use = x"yes"; then - echo "$as_me:$LINENO: checking for __builtin_sqrtf linkage" >&5 -echo $ECHO_N "checking for __builtin_sqrtf linkage... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for __builtin_sqrtf linkage" >&5 +echo $ECHO_N "checking for __builtin_sqrtf linkage... $ECHO_C" >&6; } if test x${glibcxx_cv_func___builtin_sqrtf_link+set} != xset; then if test "${glibcxx_cv_func___builtin_sqrtf_link+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 @@ -82089,42 +78658,39 @@ main () } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then glibcxx_cv_func___builtin_sqrtf_link=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func___builtin_sqrtf_link=no + glibcxx_cv_func___builtin_sqrtf_link=no fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_sqrtf_link" >&5 -echo "${ECHO_T}$glibcxx_cv_func___builtin_sqrtf_link" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_sqrtf_link" >&5 +echo "${ECHO_T}$glibcxx_cv_func___builtin_sqrtf_link" >&6; } if test x$glibcxx_cv_func___builtin_sqrtf_link = x"yes"; then @@ -82137,16 +78703,15 @@ _ACEOF fi - echo "$as_me:$LINENO: checking for __builtin_sqrt declaration" >&5 -echo $ECHO_N "checking for __builtin_sqrt declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for __builtin_sqrt declaration" >&5 +echo $ECHO_N "checking for __builtin_sqrt declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func___builtin_sqrt_use+set} != xset; then if test "${glibcxx_cv_func___builtin_sqrt_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -82168,35 +78733,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func___builtin_sqrt_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func___builtin_sqrt_use=no + glibcxx_cv_func___builtin_sqrt_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -82207,11 +78768,11 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_sqrt_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func___builtin_sqrt_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_sqrt_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func___builtin_sqrt_use" >&6; } if test x$glibcxx_cv_func___builtin_sqrt_use = x"yes"; then - echo "$as_me:$LINENO: checking for __builtin_sqrt linkage" >&5 -echo $ECHO_N "checking for __builtin_sqrt linkage... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for __builtin_sqrt linkage" >&5 +echo $ECHO_N "checking for __builtin_sqrt linkage... $ECHO_C" >&6; } if test x${glibcxx_cv_func___builtin_sqrt_link+set} != xset; then if test "${glibcxx_cv_func___builtin_sqrt_link+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 @@ -82238,42 +78799,39 @@ main () } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then glibcxx_cv_func___builtin_sqrt_link=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func___builtin_sqrt_link=no + glibcxx_cv_func___builtin_sqrt_link=no fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_sqrt_link" >&5 -echo "${ECHO_T}$glibcxx_cv_func___builtin_sqrt_link" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_sqrt_link" >&5 +echo "${ECHO_T}$glibcxx_cv_func___builtin_sqrt_link" >&6; } if test x$glibcxx_cv_func___builtin_sqrt_link = x"yes"; then @@ -82286,16 +78844,15 @@ _ACEOF fi - echo "$as_me:$LINENO: checking for __builtin_sqrtl declaration" >&5 -echo $ECHO_N "checking for __builtin_sqrtl declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for __builtin_sqrtl declaration" >&5 +echo $ECHO_N "checking for __builtin_sqrtl declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func___builtin_sqrtl_use+set} != xset; then if test "${glibcxx_cv_func___builtin_sqrtl_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -82317,35 +78874,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func___builtin_sqrtl_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func___builtin_sqrtl_use=no + glibcxx_cv_func___builtin_sqrtl_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -82356,11 +78909,11 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_sqrtl_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func___builtin_sqrtl_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_sqrtl_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func___builtin_sqrtl_use" >&6; } if test x$glibcxx_cv_func___builtin_sqrtl_use = x"yes"; then - echo "$as_me:$LINENO: checking for __builtin_sqrtl linkage" >&5 -echo $ECHO_N "checking for __builtin_sqrtl linkage... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for __builtin_sqrtl linkage" >&5 +echo $ECHO_N "checking for __builtin_sqrtl linkage... $ECHO_C" >&6; } if test x${glibcxx_cv_func___builtin_sqrtl_link+set} != xset; then if test "${glibcxx_cv_func___builtin_sqrtl_link+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 @@ -82387,42 +78940,39 @@ main () } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then glibcxx_cv_func___builtin_sqrtl_link=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func___builtin_sqrtl_link=no + glibcxx_cv_func___builtin_sqrtl_link=no fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_sqrtl_link" >&5 -echo "${ECHO_T}$glibcxx_cv_func___builtin_sqrtl_link" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_sqrtl_link" >&5 +echo "${ECHO_T}$glibcxx_cv_func___builtin_sqrtl_link" >&6; } if test x$glibcxx_cv_func___builtin_sqrtl_link = x"yes"; then @@ -82436,16 +78986,15 @@ _ACEOF - echo "$as_me:$LINENO: checking for __builtin_sinf declaration" >&5 -echo $ECHO_N "checking for __builtin_sinf declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for __builtin_sinf declaration" >&5 +echo $ECHO_N "checking for __builtin_sinf declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func___builtin_sinf_use+set} != xset; then if test "${glibcxx_cv_func___builtin_sinf_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -82467,35 +79016,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func___builtin_sinf_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func___builtin_sinf_use=no + glibcxx_cv_func___builtin_sinf_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -82506,11 +79051,11 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_sinf_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func___builtin_sinf_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_sinf_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func___builtin_sinf_use" >&6; } if test x$glibcxx_cv_func___builtin_sinf_use = x"yes"; then - echo "$as_me:$LINENO: checking for __builtin_sinf linkage" >&5 -echo $ECHO_N "checking for __builtin_sinf linkage... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for __builtin_sinf linkage" >&5 +echo $ECHO_N "checking for __builtin_sinf linkage... $ECHO_C" >&6; } if test x${glibcxx_cv_func___builtin_sinf_link+set} != xset; then if test "${glibcxx_cv_func___builtin_sinf_link+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 @@ -82537,42 +79082,39 @@ main () } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then glibcxx_cv_func___builtin_sinf_link=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func___builtin_sinf_link=no + glibcxx_cv_func___builtin_sinf_link=no fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_sinf_link" >&5 -echo "${ECHO_T}$glibcxx_cv_func___builtin_sinf_link" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_sinf_link" >&5 +echo "${ECHO_T}$glibcxx_cv_func___builtin_sinf_link" >&6; } if test x$glibcxx_cv_func___builtin_sinf_link = x"yes"; then @@ -82585,16 +79127,15 @@ _ACEOF fi - echo "$as_me:$LINENO: checking for __builtin_sin declaration" >&5 -echo $ECHO_N "checking for __builtin_sin declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for __builtin_sin declaration" >&5 +echo $ECHO_N "checking for __builtin_sin declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func___builtin_sin_use+set} != xset; then if test "${glibcxx_cv_func___builtin_sin_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -82616,35 +79157,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func___builtin_sin_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func___builtin_sin_use=no + glibcxx_cv_func___builtin_sin_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -82655,11 +79192,11 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_sin_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func___builtin_sin_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_sin_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func___builtin_sin_use" >&6; } if test x$glibcxx_cv_func___builtin_sin_use = x"yes"; then - echo "$as_me:$LINENO: checking for __builtin_sin linkage" >&5 -echo $ECHO_N "checking for __builtin_sin linkage... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for __builtin_sin linkage" >&5 +echo $ECHO_N "checking for __builtin_sin linkage... $ECHO_C" >&6; } if test x${glibcxx_cv_func___builtin_sin_link+set} != xset; then if test "${glibcxx_cv_func___builtin_sin_link+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 @@ -82686,42 +79223,39 @@ main () } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then glibcxx_cv_func___builtin_sin_link=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func___builtin_sin_link=no + glibcxx_cv_func___builtin_sin_link=no fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_sin_link" >&5 -echo "${ECHO_T}$glibcxx_cv_func___builtin_sin_link" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_sin_link" >&5 +echo "${ECHO_T}$glibcxx_cv_func___builtin_sin_link" >&6; } if test x$glibcxx_cv_func___builtin_sin_link = x"yes"; then @@ -82734,16 +79268,15 @@ _ACEOF fi - echo "$as_me:$LINENO: checking for __builtin_sinl declaration" >&5 -echo $ECHO_N "checking for __builtin_sinl declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for __builtin_sinl declaration" >&5 +echo $ECHO_N "checking for __builtin_sinl declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func___builtin_sinl_use+set} != xset; then if test "${glibcxx_cv_func___builtin_sinl_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -82765,35 +79298,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func___builtin_sinl_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func___builtin_sinl_use=no + glibcxx_cv_func___builtin_sinl_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -82804,11 +79333,11 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_sinl_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func___builtin_sinl_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_sinl_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func___builtin_sinl_use" >&6; } if test x$glibcxx_cv_func___builtin_sinl_use = x"yes"; then - echo "$as_me:$LINENO: checking for __builtin_sinl linkage" >&5 -echo $ECHO_N "checking for __builtin_sinl linkage... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for __builtin_sinl linkage" >&5 +echo $ECHO_N "checking for __builtin_sinl linkage... $ECHO_C" >&6; } if test x${glibcxx_cv_func___builtin_sinl_link+set} != xset; then if test "${glibcxx_cv_func___builtin_sinl_link+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 @@ -82835,42 +79364,39 @@ main () } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then glibcxx_cv_func___builtin_sinl_link=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func___builtin_sinl_link=no + glibcxx_cv_func___builtin_sinl_link=no fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_sinl_link" >&5 -echo "${ECHO_T}$glibcxx_cv_func___builtin_sinl_link" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_sinl_link" >&5 +echo "${ECHO_T}$glibcxx_cv_func___builtin_sinl_link" >&6; } if test x$glibcxx_cv_func___builtin_sinl_link = x"yes"; then @@ -82884,16 +79410,15 @@ _ACEOF - echo "$as_me:$LINENO: checking for __builtin_cosf declaration" >&5 -echo $ECHO_N "checking for __builtin_cosf declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for __builtin_cosf declaration" >&5 +echo $ECHO_N "checking for __builtin_cosf declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func___builtin_cosf_use+set} != xset; then if test "${glibcxx_cv_func___builtin_cosf_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -82915,35 +79440,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func___builtin_cosf_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func___builtin_cosf_use=no + glibcxx_cv_func___builtin_cosf_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -82954,11 +79475,11 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_cosf_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func___builtin_cosf_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_cosf_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func___builtin_cosf_use" >&6; } if test x$glibcxx_cv_func___builtin_cosf_use = x"yes"; then - echo "$as_me:$LINENO: checking for __builtin_cosf linkage" >&5 -echo $ECHO_N "checking for __builtin_cosf linkage... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for __builtin_cosf linkage" >&5 +echo $ECHO_N "checking for __builtin_cosf linkage... $ECHO_C" >&6; } if test x${glibcxx_cv_func___builtin_cosf_link+set} != xset; then if test "${glibcxx_cv_func___builtin_cosf_link+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 @@ -82985,42 +79506,39 @@ main () } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then glibcxx_cv_func___builtin_cosf_link=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func___builtin_cosf_link=no + glibcxx_cv_func___builtin_cosf_link=no fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_cosf_link" >&5 -echo "${ECHO_T}$glibcxx_cv_func___builtin_cosf_link" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_cosf_link" >&5 +echo "${ECHO_T}$glibcxx_cv_func___builtin_cosf_link" >&6; } if test x$glibcxx_cv_func___builtin_cosf_link = x"yes"; then @@ -83033,16 +79551,15 @@ _ACEOF fi - echo "$as_me:$LINENO: checking for __builtin_cos declaration" >&5 -echo $ECHO_N "checking for __builtin_cos declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for __builtin_cos declaration" >&5 +echo $ECHO_N "checking for __builtin_cos declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func___builtin_cos_use+set} != xset; then if test "${glibcxx_cv_func___builtin_cos_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -83064,35 +79581,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func___builtin_cos_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func___builtin_cos_use=no + glibcxx_cv_func___builtin_cos_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -83103,11 +79616,11 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_cos_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func___builtin_cos_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_cos_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func___builtin_cos_use" >&6; } if test x$glibcxx_cv_func___builtin_cos_use = x"yes"; then - echo "$as_me:$LINENO: checking for __builtin_cos linkage" >&5 -echo $ECHO_N "checking for __builtin_cos linkage... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for __builtin_cos linkage" >&5 +echo $ECHO_N "checking for __builtin_cos linkage... $ECHO_C" >&6; } if test x${glibcxx_cv_func___builtin_cos_link+set} != xset; then if test "${glibcxx_cv_func___builtin_cos_link+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 @@ -83134,42 +79647,39 @@ main () } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then glibcxx_cv_func___builtin_cos_link=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func___builtin_cos_link=no + glibcxx_cv_func___builtin_cos_link=no fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_cos_link" >&5 -echo "${ECHO_T}$glibcxx_cv_func___builtin_cos_link" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_cos_link" >&5 +echo "${ECHO_T}$glibcxx_cv_func___builtin_cos_link" >&6; } if test x$glibcxx_cv_func___builtin_cos_link = x"yes"; then @@ -83182,16 +79692,15 @@ _ACEOF fi - echo "$as_me:$LINENO: checking for __builtin_cosl declaration" >&5 -echo $ECHO_N "checking for __builtin_cosl declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for __builtin_cosl declaration" >&5 +echo $ECHO_N "checking for __builtin_cosl declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func___builtin_cosl_use+set} != xset; then if test "${glibcxx_cv_func___builtin_cosl_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -83213,35 +79722,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func___builtin_cosl_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func___builtin_cosl_use=no + glibcxx_cv_func___builtin_cosl_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -83252,11 +79757,11 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_cosl_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func___builtin_cosl_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_cosl_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func___builtin_cosl_use" >&6; } if test x$glibcxx_cv_func___builtin_cosl_use = x"yes"; then - echo "$as_me:$LINENO: checking for __builtin_cosl linkage" >&5 -echo $ECHO_N "checking for __builtin_cosl linkage... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for __builtin_cosl linkage" >&5 +echo $ECHO_N "checking for __builtin_cosl linkage... $ECHO_C" >&6; } if test x${glibcxx_cv_func___builtin_cosl_link+set} != xset; then if test "${glibcxx_cv_func___builtin_cosl_link+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 @@ -83283,42 +79788,39 @@ main () } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then glibcxx_cv_func___builtin_cosl_link=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func___builtin_cosl_link=no + glibcxx_cv_func___builtin_cosl_link=no fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_cosl_link" >&5 -echo "${ECHO_T}$glibcxx_cv_func___builtin_cosl_link" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_cosl_link" >&5 +echo "${ECHO_T}$glibcxx_cv_func___builtin_cosl_link" >&6; } if test x$glibcxx_cv_func___builtin_cosl_link = x"yes"; then @@ -83333,8 +79835,8 @@ _ACEOF -echo "$as_me:$LINENO: checking for main in -lm" >&5 -echo $ECHO_N "checking for main in -lm... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking for main in -lm" >&5 +echo $ECHO_N "checking for main in -lm... $ECHO_C" >&6; } if test "${ac_cv_lib_m_main+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -83356,46 +79858,43 @@ cat >>conftest.$ac_ext <<_ACEOF int main () { -main (); +return main (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then ac_cv_lib_m_main=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -ac_cv_lib_m_main=no + ac_cv_lib_m_main=no fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -echo "$as_me:$LINENO: result: $ac_cv_lib_m_main" >&5 -echo "${ECHO_T}$ac_cv_lib_m_main" >&6 +{ echo "$as_me:$LINENO: result: $ac_cv_lib_m_main" >&5 +echo "${ECHO_T}$ac_cv_lib_m_main" >&6; } if test $ac_cv_lib_m_main = yes; then cat >>confdefs.h <<_ACEOF #define HAVE_LIBM 1 @@ -83409,9 +79908,9 @@ fi for ac_func in copysignf do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -83442,68 +79941,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -83519,9 +80010,9 @@ done for ac_func in __signbit do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -83552,68 +80043,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -83629,9 +80112,9 @@ done for ac_func in __signbitf do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -83662,68 +80145,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -83740,9 +80215,9 @@ done for ac_func in __signbitl do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -83773,68 +80248,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -83859,16 +80326,15 @@ done CXXFLAGS='-fno-builtin -D_GNU_SOURCE' - echo "$as_me:$LINENO: checking for strtold declaration" >&5 -echo $ECHO_N "checking for strtold declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for strtold declaration" >&5 +echo $ECHO_N "checking for strtold declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func_strtold_use+set} != xset; then if test "${glibcxx_cv_func_strtold_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -83890,35 +80356,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func_strtold_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_strtold_use=no + glibcxx_cv_func_strtold_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -83929,16 +80391,16 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_strtold_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_strtold_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_strtold_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_strtold_use" >&6; } if test x$glibcxx_cv_func_strtold_use = x"yes"; then for ac_func in strtold do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -83969,68 +80431,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -84045,16 +80499,15 @@ done - echo "$as_me:$LINENO: checking for strtof declaration" >&5 -echo $ECHO_N "checking for strtof declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for strtof declaration" >&5 +echo $ECHO_N "checking for strtof declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func_strtof_use+set} != xset; then if test "${glibcxx_cv_func_strtof_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -84076,35 +80529,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func_strtof_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_strtof_use=no + glibcxx_cv_func_strtof_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -84115,16 +80564,16 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_strtof_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_strtof_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_strtof_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_strtof_use" >&6; } if test x$glibcxx_cv_func_strtof_use = x"yes"; then for ac_func in strtof do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -84155,68 +80604,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -84240,18 +80681,19 @@ done for ac_header in sys/ioctl.h sys/filio.h do as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + { echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 +ac_res=`eval echo '${'$as_ac_Header'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } else # Is the header compilable? -echo "$as_me:$LINENO: checking $ac_header usability" >&5 -echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking $ac_header usability" >&5 +echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6; } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF @@ -84262,41 +80704,37 @@ $ac_includes_default #include <$ac_header> _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then ac_header_compiler=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -ac_header_compiler=no + ac_header_compiler=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 -echo "${ECHO_T}$ac_header_compiler" >&6 + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +echo "${ECHO_T}$ac_header_compiler" >&6; } # Is the header present? -echo "$as_me:$LINENO: checking $ac_header presence" >&5 -echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking $ac_header presence" >&5 +echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6; } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF @@ -84305,24 +80743,22 @@ cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include <$ac_header> _ACEOF -if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 - (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 +if { (ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null; then - if test -s conftest.err; then - ac_cpp_err=$ac_c_preproc_warn_flag - ac_cpp_err=$ac_cpp_err$ac_c_werror_flag - else - ac_cpp_err= - fi -else - ac_cpp_err=yes -fi -if test -z "$ac_cpp_err"; then + (exit $ac_status); } >/dev/null && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then ac_header_preproc=yes else echo "$as_me: failed program was:" >&5 @@ -84330,9 +80766,10 @@ sed 's/^/| /' conftest.$ac_ext >&5 ac_header_preproc=no fi + rm -f conftest.err conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 -echo "${ECHO_T}$ac_header_preproc" >&6 +{ echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 +echo "${ECHO_T}$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in @@ -84356,25 +80793,19 @@ echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\ echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} - ( - cat <<\_ASBOX -## ----------------------------------------- ## -## Report this to the package-unused lists. ## -## ----------------------------------------- ## -_ASBOX - ) | - sed "s/^/$as_me: WARNING: /" >&2 + ;; esac -echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else eval "$as_ac_Header=\$ac_header_preproc" fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 +ac_res=`eval echo '${'$as_ac_Header'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } fi if test `eval echo '${'$as_ac_Header'}'` = yes; then @@ -84387,8 +80818,8 @@ fi done - echo "$as_me:$LINENO: checking for poll" >&5 -echo $ECHO_N "checking for poll... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for poll" >&5 +echo $ECHO_N "checking for poll... $ECHO_C" >&6; } if test "${glibcxx_cv_POLL+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -84416,35 +80847,32 @@ struct pollfd pfd[1]; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then glibcxx_cv_POLL=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_POLL=no + glibcxx_cv_POLL=no fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi @@ -84456,12 +80884,12 @@ cat >>confdefs.h <<\_ACEOF _ACEOF fi - echo "$as_me:$LINENO: result: $glibcxx_cv_POLL" >&5 -echo "${ECHO_T}$glibcxx_cv_POLL" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_POLL" >&5 +echo "${ECHO_T}$glibcxx_cv_POLL" >&6; } - echo "$as_me:$LINENO: checking for S_ISREG or S_IFREG" >&5 -echo $ECHO_N "checking for S_ISREG or S_IFREG... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for S_ISREG or S_IFREG" >&5 +echo $ECHO_N "checking for S_ISREG or S_IFREG... $ECHO_C" >&6; } if test "${glibcxx_cv_S_ISREG+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -84489,35 +80917,32 @@ struct stat buffer; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then glibcxx_cv_S_ISREG=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_S_ISREG=no + glibcxx_cv_S_ISREG=no fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi @@ -84549,35 +80974,32 @@ struct stat buffer; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then glibcxx_cv_S_IFREG=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_S_IFREG=no + glibcxx_cv_S_IFREG=no fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi @@ -84598,8 +81020,8 @@ _ACEOF res=S_IFREG fi - echo "$as_me:$LINENO: result: $res" >&5 -echo "${ECHO_T}$res" >&6 + { echo "$as_me:$LINENO: result: $res" >&5 +echo "${ECHO_T}$res" >&6; } # For xsputn_2(). @@ -84607,18 +81029,19 @@ echo "${ECHO_T}$res" >&6 for ac_header in sys/uio.h do as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + { echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 +ac_res=`eval echo '${'$as_ac_Header'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } else # Is the header compilable? -echo "$as_me:$LINENO: checking $ac_header usability" >&5 -echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking $ac_header usability" >&5 +echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6; } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF @@ -84629,41 +81052,37 @@ $ac_includes_default #include <$ac_header> _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then ac_header_compiler=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -ac_header_compiler=no + ac_header_compiler=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 -echo "${ECHO_T}$ac_header_compiler" >&6 + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +echo "${ECHO_T}$ac_header_compiler" >&6; } # Is the header present? -echo "$as_me:$LINENO: checking $ac_header presence" >&5 -echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking $ac_header presence" >&5 +echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6; } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF @@ -84672,24 +81091,22 @@ cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include <$ac_header> _ACEOF -if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 - (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 +if { (ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null; then - if test -s conftest.err; then - ac_cpp_err=$ac_c_preproc_warn_flag - ac_cpp_err=$ac_cpp_err$ac_c_werror_flag - else - ac_cpp_err= - fi -else - ac_cpp_err=yes -fi -if test -z "$ac_cpp_err"; then + (exit $ac_status); } >/dev/null && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then ac_header_preproc=yes else echo "$as_me: failed program was:" >&5 @@ -84697,9 +81114,10 @@ sed 's/^/| /' conftest.$ac_ext >&5 ac_header_preproc=no fi + rm -f conftest.err conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 -echo "${ECHO_T}$ac_header_preproc" >&6 +{ echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 +echo "${ECHO_T}$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in @@ -84723,25 +81141,19 @@ echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\ echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} - ( - cat <<\_ASBOX -## ----------------------------------------- ## -## Report this to the package-unused lists. ## -## ----------------------------------------- ## -_ASBOX - ) | - sed "s/^/$as_me: WARNING: /" >&2 + ;; esac -echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else eval "$as_ac_Header=\$ac_header_preproc" fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 +ac_res=`eval echo '${'$as_ac_Header'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } fi if test `eval echo '${'$as_ac_Header'}'` = yes; then @@ -84754,8 +81166,8 @@ fi done - echo "$as_me:$LINENO: checking for writev" >&5 -echo $ECHO_N "checking for writev... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for writev" >&5 +echo $ECHO_N "checking for writev... $ECHO_C" >&6; } if test "${glibcxx_cv_WRITEV+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -84782,35 +81194,32 @@ struct iovec iov[2]; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then glibcxx_cv_WRITEV=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_WRITEV=no + glibcxx_cv_WRITEV=no fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi @@ -84822,8 +81231,8 @@ cat >>confdefs.h <<\_ACEOF _ACEOF fi - echo "$as_me:$LINENO: result: $glibcxx_cv_WRITEV" >&5 -echo "${ECHO_T}$glibcxx_cv_WRITEV" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_WRITEV" >&5 +echo "${ECHO_T}$glibcxx_cv_WRITEV" >&6; } cat >>confdefs.h <<\_ACEOF @@ -84850,27 +81259,22 @@ sigjmp_buf env; } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then cat >>confdefs.h <<\_ACEOF #define HAVE_SIGSETJMP 1 @@ -84880,8 +81284,10 @@ else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 + fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext cat >>confdefs.h <<\_ACEOF #define HAVE_MMAP 1 @@ -84916,18 +81322,19 @@ for ac_header in float.h ieeefp.h inttypes.h locale.h \ sys/resource.h sys/stat.h sys/time.h sys/types.h sys/uio.h do as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + { echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 +ac_res=`eval echo '${'$as_ac_Header'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } else # Is the header compilable? -echo "$as_me:$LINENO: checking $ac_header usability" >&5 -echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking $ac_header usability" >&5 +echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6; } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF @@ -84938,41 +81345,37 @@ $ac_includes_default #include <$ac_header> _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then ac_header_compiler=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -ac_header_compiler=no + ac_header_compiler=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 -echo "${ECHO_T}$ac_header_compiler" >&6 + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +echo "${ECHO_T}$ac_header_compiler" >&6; } # Is the header present? -echo "$as_me:$LINENO: checking $ac_header presence" >&5 -echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking $ac_header presence" >&5 +echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6; } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF @@ -84981,24 +81384,22 @@ cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include <$ac_header> _ACEOF -if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 - (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 +if { (ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null; then - if test -s conftest.err; then - ac_cpp_err=$ac_c_preproc_warn_flag - ac_cpp_err=$ac_cpp_err$ac_c_werror_flag - else - ac_cpp_err= - fi -else - ac_cpp_err=yes -fi -if test -z "$ac_cpp_err"; then + (exit $ac_status); } >/dev/null && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then ac_header_preproc=yes else echo "$as_me: failed program was:" >&5 @@ -85006,9 +81407,10 @@ sed 's/^/| /' conftest.$ac_ext >&5 ac_header_preproc=no fi + rm -f conftest.err conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 -echo "${ECHO_T}$ac_header_preproc" >&6 +{ echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 +echo "${ECHO_T}$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in @@ -85032,25 +81434,19 @@ echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\ echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} - ( - cat <<\_ASBOX -## ----------------------------------------- ## -## Report this to the package-unused lists. ## -## ----------------------------------------- ## -_ASBOX - ) | - sed "s/^/$as_me: WARNING: /" >&2 + ;; esac -echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else eval "$as_ac_Header=\$ac_header_preproc" fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 +ac_res=`eval echo '${'$as_ac_Header'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } fi if test `eval echo '${'$as_ac_Header'}'` = yes; then @@ -85196,18 +81592,19 @@ for ac_header in nan.h ieeefp.h endian.h sys/isa_defs.h \ sys/time.h unistd.h do as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + { echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 +ac_res=`eval echo '${'$as_ac_Header'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } else # Is the header compilable? -echo "$as_me:$LINENO: checking $ac_header usability" >&5 -echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking $ac_header usability" >&5 +echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6; } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF @@ -85218,41 +81615,37 @@ $ac_includes_default #include <$ac_header> _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then ac_header_compiler=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -ac_header_compiler=no + ac_header_compiler=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 -echo "${ECHO_T}$ac_header_compiler" >&6 + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +echo "${ECHO_T}$ac_header_compiler" >&6; } # Is the header present? -echo "$as_me:$LINENO: checking $ac_header presence" >&5 -echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking $ac_header presence" >&5 +echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6; } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF @@ -85261,24 +81654,22 @@ cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include <$ac_header> _ACEOF -if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 - (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 +if { (ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null; then - if test -s conftest.err; then - ac_cpp_err=$ac_c_preproc_warn_flag - ac_cpp_err=$ac_cpp_err$ac_c_werror_flag - else - ac_cpp_err= - fi -else - ac_cpp_err=yes -fi -if test -z "$ac_cpp_err"; then + (exit $ac_status); } >/dev/null && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then ac_header_preproc=yes else echo "$as_me: failed program was:" >&5 @@ -85286,9 +81677,10 @@ sed 's/^/| /' conftest.$ac_ext >&5 ac_header_preproc=no fi + rm -f conftest.err conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 -echo "${ECHO_T}$ac_header_preproc" >&6 +{ echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 +echo "${ECHO_T}$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in @@ -85312,25 +81704,19 @@ echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\ echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} - ( - cat <<\_ASBOX -## ----------------------------------------- ## -## Report this to the package-unused lists. ## -## ----------------------------------------- ## -_ASBOX - ) | - sed "s/^/$as_me: WARNING: /" >&2 + ;; esac -echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else eval "$as_ac_Header=\$ac_header_preproc" fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 +ac_res=`eval echo '${'$as_ac_Header'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } fi if test `eval echo '${'$as_ac_Header'}'` = yes; then @@ -85371,16 +81757,16 @@ done # Start by getting the version number. I think the libtool test already # does some of this, but throws away the result. if test x"$with_gnu_ld" = x"yes"; then - echo "$as_me:$LINENO: checking for ld version" >&5 -echo $ECHO_N "checking for ld version... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for ld version" >&5 +echo $ECHO_N "checking for ld version... $ECHO_C" >&6; } ldver=`$LD --version 2>/dev/null | head -1 | \ sed -e 's/GNU ld \(version \)\{0,1\}\(([^)]*) \)\{0,1\}\([0-9.][0-9.]*\).*/\3/'` glibcxx_gnu_ld_version=`echo $ldver | \ $AWK -F. '{ if (NF<3) $3=0; print ($1*100+$2)*100+$3 }'` - echo "$as_me:$LINENO: result: $glibcxx_gnu_ld_version" >&5 -echo "${ECHO_T}$glibcxx_gnu_ld_version" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_gnu_ld_version" >&5 +echo "${ECHO_T}$glibcxx_gnu_ld_version" >&6; } fi # Set --gc-sections. @@ -85397,8 +81783,8 @@ echo "${ECHO_T}$glibcxx_gnu_ld_version" >&6 CFLAGS='-Wl,--gc-sections' # Check for -Wl,--gc-sections - echo "$as_me:$LINENO: checking for ld that supports -Wl,--gc-sections" >&5 -echo $ECHO_N "checking for ld that supports -Wl,--gc-sections... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for ld that supports -Wl,--gc-sections" >&5 +echo $ECHO_N "checking for ld that supports -Wl,--gc-sections... $ECHO_C" >&6; } if test x$gcc_no_link = xyes; then { { echo "$as_me:$LINENO: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&5 echo "$as_me: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&2;} @@ -85422,35 +81808,32 @@ main () } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then ac_gcsections=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -ac_gcsections=no + ac_gcsections=no fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext if test "$ac_gcsections" = "yes"; then rm -f conftest.c @@ -85466,8 +81849,8 @@ rm -f conftest.err conftest.$ac_objext \ if test "$ac_gcsections" = "yes"; then SECTION_LDFLAGS="-Wl,--gc-sections $SECTION_LDFLAGS" fi - echo "$as_me:$LINENO: result: $ac_gcsections" >&5 -echo "${ECHO_T}$ac_gcsections" >&6 + { echo "$as_me:$LINENO: result: $ac_gcsections" >&5 +echo "${ECHO_T}$ac_gcsections" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS="$ac_save_CFLAGS" @@ -85481,15 +81864,15 @@ echo "${ECHO_T}$ac_gcsections" >&6 # Note this is only for shared objects. ac_ld_relro=no if test x"$with_gnu_ld" = x"yes"; then - echo "$as_me:$LINENO: checking for ld that supports -Wl,-z,relro" >&5 -echo $ECHO_N "checking for ld that supports -Wl,-z,relro... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for ld that supports -Wl,-z,relro" >&5 +echo $ECHO_N "checking for ld that supports -Wl,-z,relro... $ECHO_C" >&6; } cxx_z_relo=`$LD -v --help 2>/dev/null | grep "z relro"` if test -n "$cxx_z_relo"; then OPT_LDFLAGS="-Wl,-z,relro" ac_ld_relro=yes fi - echo "$as_me:$LINENO: result: $ac_ld_relro" >&5 -echo "${ECHO_T}$ac_ld_relro" >&6 + { echo "$as_me:$LINENO: result: $ac_ld_relro" >&5 +echo "${ECHO_T}$ac_ld_relro" >&6; } fi # Set linker optimization flags. @@ -85502,8 +81885,8 @@ echo "${ECHO_T}$ac_ld_relro" >&6 -echo "$as_me:$LINENO: checking for main in -lm" >&5 -echo $ECHO_N "checking for main in -lm... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking for main in -lm" >&5 +echo $ECHO_N "checking for main in -lm... $ECHO_C" >&6; } if test "${ac_cv_lib_m_main+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -85525,46 +81908,43 @@ cat >>conftest.$ac_ext <<_ACEOF int main () { -main (); +return main (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then ac_cv_lib_m_main=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -ac_cv_lib_m_main=no + ac_cv_lib_m_main=no fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -echo "$as_me:$LINENO: result: $ac_cv_lib_m_main" >&5 -echo "${ECHO_T}$ac_cv_lib_m_main" >&6 +{ echo "$as_me:$LINENO: result: $ac_cv_lib_m_main" >&5 +echo "${ECHO_T}$ac_cv_lib_m_main" >&6; } if test $ac_cv_lib_m_main = yes; then cat >>confdefs.h <<_ACEOF #define HAVE_LIBM 1 @@ -85578,9 +81958,9 @@ fi for ac_func in copysignf do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -85611,68 +81991,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -85688,9 +82060,9 @@ done for ac_func in __signbit do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -85721,68 +82093,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -85798,9 +82162,9 @@ done for ac_func in __signbitf do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -85831,68 +82195,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -85909,9 +82265,9 @@ done for ac_func in __signbitl do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -85942,68 +82298,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -86212,18 +82560,19 @@ for ac_header in nan.h ieeefp.h endian.h sys/isa_defs.h \ fp.h locale.h float.h inttypes.h do as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + { echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 +ac_res=`eval echo '${'$as_ac_Header'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } else # Is the header compilable? -echo "$as_me:$LINENO: checking $ac_header usability" >&5 -echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking $ac_header usability" >&5 +echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6; } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF @@ -86234,41 +82583,37 @@ $ac_includes_default #include <$ac_header> _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then ac_header_compiler=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -ac_header_compiler=no + ac_header_compiler=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 -echo "${ECHO_T}$ac_header_compiler" >&6 + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +echo "${ECHO_T}$ac_header_compiler" >&6; } # Is the header present? -echo "$as_me:$LINENO: checking $ac_header presence" >&5 -echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking $ac_header presence" >&5 +echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6; } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF @@ -86277,24 +82622,22 @@ cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include <$ac_header> _ACEOF -if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 - (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 +if { (ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null; then - if test -s conftest.err; then - ac_cpp_err=$ac_c_preproc_warn_flag - ac_cpp_err=$ac_cpp_err$ac_c_werror_flag - else - ac_cpp_err= - fi -else - ac_cpp_err=yes -fi -if test -z "$ac_cpp_err"; then + (exit $ac_status); } >/dev/null && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then ac_header_preproc=yes else echo "$as_me: failed program was:" >&5 @@ -86302,9 +82645,10 @@ sed 's/^/| /' conftest.$ac_ext >&5 ac_header_preproc=no fi + rm -f conftest.err conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 -echo "${ECHO_T}$ac_header_preproc" >&6 +{ echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 +echo "${ECHO_T}$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in @@ -86328,25 +82672,19 @@ echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\ echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} - ( - cat <<\_ASBOX -## ----------------------------------------- ## -## Report this to the package-unused lists. ## -## ----------------------------------------- ## -_ASBOX - ) | - sed "s/^/$as_me: WARNING: /" >&2 + ;; esac -echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else eval "$as_ac_Header=\$ac_header_preproc" fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 +ac_res=`eval echo '${'$as_ac_Header'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } fi if test `eval echo '${'$as_ac_Header'}'` = yes; then @@ -86387,16 +82725,16 @@ done # Start by getting the version number. I think the libtool test already # does some of this, but throws away the result. if test x"$with_gnu_ld" = x"yes"; then - echo "$as_me:$LINENO: checking for ld version" >&5 -echo $ECHO_N "checking for ld version... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for ld version" >&5 +echo $ECHO_N "checking for ld version... $ECHO_C" >&6; } ldver=`$LD --version 2>/dev/null | head -1 | \ sed -e 's/GNU ld \(version \)\{0,1\}\(([^)]*) \)\{0,1\}\([0-9.][0-9.]*\).*/\3/'` glibcxx_gnu_ld_version=`echo $ldver | \ $AWK -F. '{ if (NF<3) $3=0; print ($1*100+$2)*100+$3 }'` - echo "$as_me:$LINENO: result: $glibcxx_gnu_ld_version" >&5 -echo "${ECHO_T}$glibcxx_gnu_ld_version" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_gnu_ld_version" >&5 +echo "${ECHO_T}$glibcxx_gnu_ld_version" >&6; } fi # Set --gc-sections. @@ -86413,8 +82751,8 @@ echo "${ECHO_T}$glibcxx_gnu_ld_version" >&6 CFLAGS='-Wl,--gc-sections' # Check for -Wl,--gc-sections - echo "$as_me:$LINENO: checking for ld that supports -Wl,--gc-sections" >&5 -echo $ECHO_N "checking for ld that supports -Wl,--gc-sections... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for ld that supports -Wl,--gc-sections" >&5 +echo $ECHO_N "checking for ld that supports -Wl,--gc-sections... $ECHO_C" >&6; } if test x$gcc_no_link = xyes; then { { echo "$as_me:$LINENO: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&5 echo "$as_me: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&2;} @@ -86438,35 +82776,32 @@ main () } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then ac_gcsections=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -ac_gcsections=no + ac_gcsections=no fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext if test "$ac_gcsections" = "yes"; then rm -f conftest.c @@ -86482,8 +82817,8 @@ rm -f conftest.err conftest.$ac_objext \ if test "$ac_gcsections" = "yes"; then SECTION_LDFLAGS="-Wl,--gc-sections $SECTION_LDFLAGS" fi - echo "$as_me:$LINENO: result: $ac_gcsections" >&5 -echo "${ECHO_T}$ac_gcsections" >&6 + { echo "$as_me:$LINENO: result: $ac_gcsections" >&5 +echo "${ECHO_T}$ac_gcsections" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS="$ac_save_CFLAGS" @@ -86497,15 +82832,15 @@ echo "${ECHO_T}$ac_gcsections" >&6 # Note this is only for shared objects. ac_ld_relro=no if test x"$with_gnu_ld" = x"yes"; then - echo "$as_me:$LINENO: checking for ld that supports -Wl,-z,relro" >&5 -echo $ECHO_N "checking for ld that supports -Wl,-z,relro... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for ld that supports -Wl,-z,relro" >&5 +echo $ECHO_N "checking for ld that supports -Wl,-z,relro... $ECHO_C" >&6; } cxx_z_relo=`$LD -v --help 2>/dev/null | grep "z relro"` if test -n "$cxx_z_relo"; then OPT_LDFLAGS="-Wl,-z,relro" ac_ld_relro=yes fi - echo "$as_me:$LINENO: result: $ac_ld_relro" >&5 -echo "${ECHO_T}$ac_ld_relro" >&6 + { echo "$as_me:$LINENO: result: $ac_ld_relro" >&5 +echo "${ECHO_T}$ac_ld_relro" >&6; } fi # Set linker optimization flags. @@ -86518,8 +82853,8 @@ echo "${ECHO_T}$ac_ld_relro" >&6 -echo "$as_me:$LINENO: checking for main in -lm" >&5 -echo $ECHO_N "checking for main in -lm... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking for main in -lm" >&5 +echo $ECHO_N "checking for main in -lm... $ECHO_C" >&6; } if test "${ac_cv_lib_m_main+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -86541,46 +82876,43 @@ cat >>conftest.$ac_ext <<_ACEOF int main () { -main (); +return main (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then ac_cv_lib_m_main=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -ac_cv_lib_m_main=no + ac_cv_lib_m_main=no fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -echo "$as_me:$LINENO: result: $ac_cv_lib_m_main" >&5 -echo "${ECHO_T}$ac_cv_lib_m_main" >&6 +{ echo "$as_me:$LINENO: result: $ac_cv_lib_m_main" >&5 +echo "${ECHO_T}$ac_cv_lib_m_main" >&6; } if test $ac_cv_lib_m_main = yes; then cat >>confdefs.h <<_ACEOF #define HAVE_LIBM 1 @@ -86594,9 +82926,9 @@ fi for ac_func in copysignf do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -86627,68 +82959,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -86704,9 +83028,9 @@ done for ac_func in __signbit do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -86737,68 +83061,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -86814,9 +83130,9 @@ done for ac_func in __signbitf do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -86847,68 +83163,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -86925,9 +83233,9 @@ done for ac_func in __signbitl do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -86958,68 +83266,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -87099,23 +83399,28 @@ _ACEOF + + + for ac_header in nan.h ieeefp.h endian.h sys/isa_defs.h \ machine/endian.h machine/param.h sys/machine.h sys/types.h \ - fp.h float.h endian.h inttypes.h locale.h float.h stdint.h + fp.h float.h endian.h inttypes.h locale.h float.h stdint.h \ + sys/ipc.h sys/sem.h gconf.h do as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + { echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 +ac_res=`eval echo '${'$as_ac_Header'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } else # Is the header compilable? -echo "$as_me:$LINENO: checking $ac_header usability" >&5 -echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking $ac_header usability" >&5 +echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6; } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF @@ -87126,41 +83431,37 @@ $ac_includes_default #include <$ac_header> _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then ac_header_compiler=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -ac_header_compiler=no + ac_header_compiler=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 -echo "${ECHO_T}$ac_header_compiler" >&6 + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +echo "${ECHO_T}$ac_header_compiler" >&6; } # Is the header present? -echo "$as_me:$LINENO: checking $ac_header presence" >&5 -echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking $ac_header presence" >&5 +echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6; } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF @@ -87169,24 +83470,22 @@ cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include <$ac_header> _ACEOF -if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 - (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 +if { (ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null; then - if test -s conftest.err; then - ac_cpp_err=$ac_c_preproc_warn_flag - ac_cpp_err=$ac_cpp_err$ac_c_werror_flag - else - ac_cpp_err= - fi -else - ac_cpp_err=yes -fi -if test -z "$ac_cpp_err"; then + (exit $ac_status); } >/dev/null && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then ac_header_preproc=yes else echo "$as_me: failed program was:" >&5 @@ -87194,9 +83493,10 @@ sed 's/^/| /' conftest.$ac_ext >&5 ac_header_preproc=no fi + rm -f conftest.err conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 -echo "${ECHO_T}$ac_header_preproc" >&6 +{ echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 +echo "${ECHO_T}$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in @@ -87220,25 +83520,19 @@ echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\ echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} - ( - cat <<\_ASBOX -## ----------------------------------------- ## -## Report this to the package-unused lists. ## -## ----------------------------------------- ## -_ASBOX - ) | - sed "s/^/$as_me: WARNING: /" >&2 + ;; esac -echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else eval "$as_ac_Header=\$ac_header_preproc" fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 +ac_res=`eval echo '${'$as_ac_Header'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } fi if test `eval echo '${'$as_ac_Header'}'` = yes; then @@ -87257,8 +83551,7 @@ done # The CXXFLAGS thing is suspicious, but based on similar bits previously # found in GLIBCXX_CONFIGURE. - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -87275,8 +83568,8 @@ ac_compiler_gnu=$ac_cv_cxx_compiler_gnu fi # Check for -ffunction-sections -fdata-sections - echo "$as_me:$LINENO: checking for g++ that supports -ffunction-sections -fdata-sections" >&5 -echo $ECHO_N "checking for g++ that supports -ffunction-sections -fdata-sections... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for g++ that supports -ffunction-sections -fdata-sections" >&5 +echo $ECHO_N "checking for g++ that supports -ffunction-sections -fdata-sections... $ECHO_C" >&6; } CXXFLAGS='-g -Werror -ffunction-sections -fdata-sections' cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ @@ -87294,35 +83587,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then ac_fdsections=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -ac_fdsections=no + ac_fdsections=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test "$ac_test_CXXFLAGS" = set; then CXXFLAGS="$ac_save_CXXFLAGS" else @@ -87332,8 +83621,8 @@ rm -f conftest.err conftest.$ac_objext conftest.$ac_ext if test x"$ac_fdsections" = x"yes"; then SECTION_FLAGS='-ffunction-sections -fdata-sections' fi - echo "$as_me:$LINENO: result: $ac_fdsections" >&5 -echo "${ECHO_T}$ac_fdsections" >&6 + { echo "$as_me:$LINENO: result: $ac_fdsections" >&5 +echo "${ECHO_T}$ac_fdsections" >&6; } ac_ext=c ac_cpp='$CPP $CPPFLAGS' @@ -87371,16 +83660,16 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu # Start by getting the version number. I think the libtool test already # does some of this, but throws away the result. if test x"$with_gnu_ld" = x"yes"; then - echo "$as_me:$LINENO: checking for ld version" >&5 -echo $ECHO_N "checking for ld version... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for ld version" >&5 +echo $ECHO_N "checking for ld version... $ECHO_C" >&6; } ldver=`$LD --version 2>/dev/null | head -1 | \ sed -e 's/GNU ld \(version \)\{0,1\}\(([^)]*) \)\{0,1\}\([0-9.][0-9.]*\).*/\3/'` glibcxx_gnu_ld_version=`echo $ldver | \ $AWK -F. '{ if (NF<3) $3=0; print ($1*100+$2)*100+$3 }'` - echo "$as_me:$LINENO: result: $glibcxx_gnu_ld_version" >&5 -echo "${ECHO_T}$glibcxx_gnu_ld_version" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_gnu_ld_version" >&5 +echo "${ECHO_T}$glibcxx_gnu_ld_version" >&6; } fi # Set --gc-sections. @@ -87397,8 +83686,8 @@ echo "${ECHO_T}$glibcxx_gnu_ld_version" >&6 CFLAGS='-Wl,--gc-sections' # Check for -Wl,--gc-sections - echo "$as_me:$LINENO: checking for ld that supports -Wl,--gc-sections" >&5 -echo $ECHO_N "checking for ld that supports -Wl,--gc-sections... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for ld that supports -Wl,--gc-sections" >&5 +echo $ECHO_N "checking for ld that supports -Wl,--gc-sections... $ECHO_C" >&6; } if test x$gcc_no_link = xyes; then { { echo "$as_me:$LINENO: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&5 echo "$as_me: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&2;} @@ -87422,35 +83711,32 @@ main () } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then ac_gcsections=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -ac_gcsections=no + ac_gcsections=no fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext if test "$ac_gcsections" = "yes"; then rm -f conftest.c @@ -87466,8 +83752,8 @@ rm -f conftest.err conftest.$ac_objext \ if test "$ac_gcsections" = "yes"; then SECTION_LDFLAGS="-Wl,--gc-sections $SECTION_LDFLAGS" fi - echo "$as_me:$LINENO: result: $ac_gcsections" >&5 -echo "${ECHO_T}$ac_gcsections" >&6 + { echo "$as_me:$LINENO: result: $ac_gcsections" >&5 +echo "${ECHO_T}$ac_gcsections" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS="$ac_save_CFLAGS" @@ -87481,15 +83767,15 @@ echo "${ECHO_T}$ac_gcsections" >&6 # Note this is only for shared objects. ac_ld_relro=no if test x"$with_gnu_ld" = x"yes"; then - echo "$as_me:$LINENO: checking for ld that supports -Wl,-z,relro" >&5 -echo $ECHO_N "checking for ld that supports -Wl,-z,relro... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for ld that supports -Wl,-z,relro" >&5 +echo $ECHO_N "checking for ld that supports -Wl,-z,relro... $ECHO_C" >&6; } cxx_z_relo=`$LD -v --help 2>/dev/null | grep "z relro"` if test -n "$cxx_z_relo"; then OPT_LDFLAGS="-Wl,-z,relro" ac_ld_relro=yes fi - echo "$as_me:$LINENO: result: $ac_ld_relro" >&5 -echo "${ECHO_T}$ac_ld_relro" >&6 + { echo "$as_me:$LINENO: result: $ac_ld_relro" >&5 +echo "${ECHO_T}$ac_ld_relro" >&6; } fi # Set linker optimization flags. @@ -87505,8 +83791,8 @@ echo "${ECHO_T}$ac_ld_relro" >&6 ac_save_CXXFLAGS="$CXXFLAGS" CXXFLAGS='-fno-builtin -D_GNU_SOURCE' - echo "$as_me:$LINENO: checking for sin in -lm" >&5 -echo $ECHO_N "checking for sin in -lm... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for sin in -lm" >&5 +echo $ECHO_N "checking for sin in -lm... $ECHO_C" >&6; } if test "${ac_cv_lib_m_sin+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -87524,56 +83810,53 @@ cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char sin (); int main () { -sin (); +return sin (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then ac_cv_lib_m_sin=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -ac_cv_lib_m_sin=no + ac_cv_lib_m_sin=no fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -echo "$as_me:$LINENO: result: $ac_cv_lib_m_sin" >&5 -echo "${ECHO_T}$ac_cv_lib_m_sin" >&6 +{ echo "$as_me:$LINENO: result: $ac_cv_lib_m_sin" >&5 +echo "${ECHO_T}$ac_cv_lib_m_sin" >&6; } if test $ac_cv_lib_m_sin = yes; then libm="-lm" fi @@ -87583,16 +83866,15 @@ fi - echo "$as_me:$LINENO: checking for isinf declaration" >&5 -echo $ECHO_N "checking for isinf declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for isinf declaration" >&5 +echo $ECHO_N "checking for isinf declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func_isinf_use+set} != xset; then if test "${glibcxx_cv_func_isinf_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -87618,35 +83900,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func_isinf_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_isinf_use=no + glibcxx_cv_func_isinf_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -87657,17 +83935,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_isinf_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_isinf_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_isinf_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_isinf_use" >&6; } if test x$glibcxx_cv_func_isinf_use = x"yes"; then for ac_func in isinf do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -87698,68 +83976,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -87770,16 +84040,15 @@ done else - echo "$as_me:$LINENO: checking for _isinf declaration" >&5 -echo $ECHO_N "checking for _isinf declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for _isinf declaration" >&5 +echo $ECHO_N "checking for _isinf declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func__isinf_use+set} != xset; then if test "${glibcxx_cv_func__isinf_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -87805,35 +84074,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func__isinf_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func__isinf_use=no + glibcxx_cv_func__isinf_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -87844,17 +84109,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__isinf_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__isinf_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__isinf_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__isinf_use" >&6; } if test x$glibcxx_cv_func__isinf_use = x"yes"; then for ac_func in _isinf do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -87885,68 +84150,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -87963,16 +84220,15 @@ done - echo "$as_me:$LINENO: checking for isnan declaration" >&5 -echo $ECHO_N "checking for isnan declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for isnan declaration" >&5 +echo $ECHO_N "checking for isnan declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func_isnan_use+set} != xset; then if test "${glibcxx_cv_func_isnan_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -87998,35 +84254,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func_isnan_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_isnan_use=no + glibcxx_cv_func_isnan_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -88037,17 +84289,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_isnan_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_isnan_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_isnan_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_isnan_use" >&6; } if test x$glibcxx_cv_func_isnan_use = x"yes"; then for ac_func in isnan do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -88078,68 +84330,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -88150,16 +84394,15 @@ done else - echo "$as_me:$LINENO: checking for _isnan declaration" >&5 -echo $ECHO_N "checking for _isnan declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for _isnan declaration" >&5 +echo $ECHO_N "checking for _isnan declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func__isnan_use+set} != xset; then if test "${glibcxx_cv_func__isnan_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -88185,35 +84428,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func__isnan_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func__isnan_use=no + glibcxx_cv_func__isnan_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -88224,17 +84463,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__isnan_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__isnan_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__isnan_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__isnan_use" >&6; } if test x$glibcxx_cv_func__isnan_use = x"yes"; then for ac_func in _isnan do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -88265,68 +84504,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -88343,16 +84574,15 @@ done - echo "$as_me:$LINENO: checking for finite declaration" >&5 -echo $ECHO_N "checking for finite declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for finite declaration" >&5 +echo $ECHO_N "checking for finite declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func_finite_use+set} != xset; then if test "${glibcxx_cv_func_finite_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -88378,35 +84608,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func_finite_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_finite_use=no + glibcxx_cv_func_finite_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -88417,17 +84643,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_finite_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_finite_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_finite_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_finite_use" >&6; } if test x$glibcxx_cv_func_finite_use = x"yes"; then for ac_func in finite do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -88458,68 +84684,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -88530,16 +84748,15 @@ done else - echo "$as_me:$LINENO: checking for _finite declaration" >&5 -echo $ECHO_N "checking for _finite declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for _finite declaration" >&5 +echo $ECHO_N "checking for _finite declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func__finite_use+set} != xset; then if test "${glibcxx_cv_func__finite_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -88565,35 +84782,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func__finite_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func__finite_use=no + glibcxx_cv_func__finite_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -88604,17 +84817,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__finite_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__finite_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__finite_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__finite_use" >&6; } if test x$glibcxx_cv_func__finite_use = x"yes"; then for ac_func in _finite do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -88645,68 +84858,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -88723,16 +84928,15 @@ done - echo "$as_me:$LINENO: checking for copysign declaration" >&5 -echo $ECHO_N "checking for copysign declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for copysign declaration" >&5 +echo $ECHO_N "checking for copysign declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func_copysign_use+set} != xset; then if test "${glibcxx_cv_func_copysign_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -88754,35 +84958,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func_copysign_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_copysign_use=no + glibcxx_cv_func_copysign_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -88793,17 +84993,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_copysign_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_copysign_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_copysign_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_copysign_use" >&6; } if test x$glibcxx_cv_func_copysign_use = x"yes"; then for ac_func in copysign do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -88834,68 +85034,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -88906,16 +85098,15 @@ done else - echo "$as_me:$LINENO: checking for _copysign declaration" >&5 -echo $ECHO_N "checking for _copysign declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for _copysign declaration" >&5 +echo $ECHO_N "checking for _copysign declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func__copysign_use+set} != xset; then if test "${glibcxx_cv_func__copysign_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -88937,35 +85128,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func__copysign_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func__copysign_use=no + glibcxx_cv_func__copysign_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -88976,17 +85163,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__copysign_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__copysign_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__copysign_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__copysign_use" >&6; } if test x$glibcxx_cv_func__copysign_use = x"yes"; then for ac_func in _copysign do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -89017,68 +85204,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -89095,16 +85274,15 @@ done - echo "$as_me:$LINENO: checking for sincos declaration" >&5 -echo $ECHO_N "checking for sincos declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for sincos declaration" >&5 +echo $ECHO_N "checking for sincos declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func_sincos_use+set} != xset; then if test "${glibcxx_cv_func_sincos_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -89126,35 +85304,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func_sincos_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_sincos_use=no + glibcxx_cv_func_sincos_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -89165,17 +85339,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_sincos_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_sincos_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_sincos_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_sincos_use" >&6; } if test x$glibcxx_cv_func_sincos_use = x"yes"; then for ac_func in sincos do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -89206,68 +85380,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -89278,16 +85444,15 @@ done else - echo "$as_me:$LINENO: checking for _sincos declaration" >&5 -echo $ECHO_N "checking for _sincos declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for _sincos declaration" >&5 +echo $ECHO_N "checking for _sincos declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func__sincos_use+set} != xset; then if test "${glibcxx_cv_func__sincos_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -89309,35 +85474,211 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + glibcxx_cv_func__sincos_use=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + glibcxx_cv_func__sincos_use=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +fi + + fi + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__sincos_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__sincos_use" >&6; } + + if test x$glibcxx_cv_func__sincos_use = x"yes"; then + +for ac_func in _sincos +do +as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test x$gcc_no_link = xyes; then + { { echo "$as_me:$LINENO: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&5 +echo "$as_me: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&2;} + { (exit 1); exit 1; }; } +fi +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define $ac_func to an innocuous variant, in case declares $ac_func. + For example, HP-UX 11i declares gettimeofday. */ +#define $ac_func innocuous_$ac_func + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $ac_func (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $ac_func + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char $ac_func (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_$ac_func || defined __stub___$ac_func +choke me +#endif + +int +main () +{ +return $ac_func (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then + eval "$as_ac_var=yes" +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + eval "$as_ac_var=no" +fi + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +fi +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } +if test `eval echo '${'$as_ac_var'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +fi +done + + fi + fi + + + + + + + { echo "$as_me:$LINENO: checking for fpclass declaration" >&5 +echo $ECHO_N "checking for fpclass declaration... $ECHO_C" >&6; } + if test x${glibcxx_cv_func_fpclass_use+set} != xset; then + if test "${glibcxx_cv_func_fpclass_use+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + + ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include + #ifdef HAVE_IEEEFP_H + #include + #endif + +int +main () +{ + fpclass(0); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - glibcxx_cv_func__sincos_use=yes + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + glibcxx_cv_func_fpclass_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func__sincos_use=no + glibcxx_cv_func_fpclass_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -89348,17 +85689,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__sincos_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__sincos_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_fpclass_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_fpclass_use" >&6; } - if test x$glibcxx_cv_func__sincos_use = x"yes"; then + if test x$glibcxx_cv_func_fpclass_use = x"yes"; then -for ac_func in _sincos +for ac_func in fpclass do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -89389,261 +85730,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ -#ifdef __cplusplus -extern "C" -{ -#endif -/* We use char because int might match the return type of a gcc2 +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ -char $ac_func (); -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) -choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} -#endif - -int -main () -{ -return f != $ac_func; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - eval "$as_ac_var=yes" -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -eval "$as_ac_var=no" -fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 -if test `eval echo '${'$as_ac_var'}'` = yes; then - cat >>confdefs.h <<_ACEOF -#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 -_ACEOF - -fi -done - - fi - fi - - - - - - - echo "$as_me:$LINENO: checking for fpclass declaration" >&5 -echo $ECHO_N "checking for fpclass declaration... $ECHO_C" >&6 - if test x${glibcxx_cv_func_fpclass_use+set} != xset; then - if test "${glibcxx_cv_func_fpclass_use+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - - - - ac_ext=cc -ac_cpp='$CXXCPP $CPPFLAGS' -ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_cxx_compiler_gnu - - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include - #ifdef HAVE_IEEEFP_H - #include - #endif - -int -main () -{ - fpclass(0); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - glibcxx_cv_func_fpclass_use=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -glibcxx_cv_func_fpclass_use=no -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext - ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - - -fi - - fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_fpclass_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_fpclass_use" >&6 - - if test x$glibcxx_cv_func_fpclass_use = x"yes"; then - -for ac_func in fpclass -do -as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test x$gcc_no_link = xyes; then - { { echo "$as_me:$LINENO: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&5 -echo "$as_me: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&2;} - { (exit 1); exit 1; }; } -fi -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -/* Define $ac_func to an innocuous variant, in case declares $ac_func. - For example, HP-UX 11i declares gettimeofday. */ -#define $ac_func innocuous_$ac_func - -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char $ac_func (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ - -#ifdef __STDC__ -# include -#else -# include -#endif - -#undef $ac_func - -/* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -89654,16 +85794,15 @@ done else - echo "$as_me:$LINENO: checking for _fpclass declaration" >&5 -echo $ECHO_N "checking for _fpclass declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for _fpclass declaration" >&5 +echo $ECHO_N "checking for _fpclass declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func__fpclass_use+set} != xset; then if test "${glibcxx_cv_func__fpclass_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -89689,35 +85828,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func__fpclass_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func__fpclass_use=no + glibcxx_cv_func__fpclass_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -89728,17 +85863,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__fpclass_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__fpclass_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__fpclass_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__fpclass_use" >&6; } if test x$glibcxx_cv_func__fpclass_use = x"yes"; then for ac_func in _fpclass do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -89769,68 +85904,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -89847,16 +85974,15 @@ done - echo "$as_me:$LINENO: checking for qfpclass declaration" >&5 -echo $ECHO_N "checking for qfpclass declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for qfpclass declaration" >&5 +echo $ECHO_N "checking for qfpclass declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func_qfpclass_use+set} != xset; then if test "${glibcxx_cv_func_qfpclass_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -89882,35 +86008,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func_qfpclass_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_qfpclass_use=no + glibcxx_cv_func_qfpclass_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -89921,17 +86043,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_qfpclass_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_qfpclass_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_qfpclass_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_qfpclass_use" >&6; } if test x$glibcxx_cv_func_qfpclass_use = x"yes"; then for ac_func in qfpclass do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -89962,68 +86084,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -90034,16 +86148,15 @@ done else - echo "$as_me:$LINENO: checking for _qfpclass declaration" >&5 -echo $ECHO_N "checking for _qfpclass declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for _qfpclass declaration" >&5 +echo $ECHO_N "checking for _qfpclass declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func__qfpclass_use+set} != xset; then if test "${glibcxx_cv_func__qfpclass_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -90069,35 +86182,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func__qfpclass_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func__qfpclass_use=no + glibcxx_cv_func__qfpclass_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -90108,17 +86217,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__qfpclass_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__qfpclass_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__qfpclass_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__qfpclass_use" >&6; } if test x$glibcxx_cv_func__qfpclass_use = x"yes"; then for ac_func in _qfpclass do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -90149,68 +86258,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -90227,16 +86328,15 @@ done - echo "$as_me:$LINENO: checking for hypot declaration" >&5 -echo $ECHO_N "checking for hypot declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for hypot declaration" >&5 +echo $ECHO_N "checking for hypot declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func_hypot_use+set} != xset; then if test "${glibcxx_cv_func_hypot_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -90258,35 +86358,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func_hypot_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_hypot_use=no + glibcxx_cv_func_hypot_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -90297,17 +86393,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_hypot_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_hypot_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_hypot_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_hypot_use" >&6; } if test x$glibcxx_cv_func_hypot_use = x"yes"; then for ac_func in hypot do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -90338,68 +86434,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -90410,16 +86498,15 @@ done else - echo "$as_me:$LINENO: checking for _hypot declaration" >&5 -echo $ECHO_N "checking for _hypot declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for _hypot declaration" >&5 +echo $ECHO_N "checking for _hypot declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func__hypot_use+set} != xset; then if test "${glibcxx_cv_func__hypot_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -90441,35 +86528,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func__hypot_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func__hypot_use=no + glibcxx_cv_func__hypot_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -90480,17 +86563,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__hypot_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__hypot_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__hypot_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__hypot_use" >&6; } if test x$glibcxx_cv_func__hypot_use = x"yes"; then for ac_func in _hypot do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -90521,68 +86604,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -90599,15 +86674,14 @@ done - echo "$as_me:$LINENO: checking for float trig functions" >&5 -echo $ECHO_N "checking for float trig functions... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for float trig functions" >&5 +echo $ECHO_N "checking for float trig functions... $ECHO_C" >&6; } if test "${glibcxx_cv_func_float_trig_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -90629,35 +86703,31 @@ acosf (0); asinf (0); atanf (0); cosf (0); sinf (0); tanf (0); coshf (0); sinhf } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func_float_trig_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_float_trig_use=no + glibcxx_cv_func_float_trig_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -90666,8 +86736,8 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_float_trig_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_float_trig_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_float_trig_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_float_trig_use" >&6; } if test x$glibcxx_cv_func_float_trig_use = x"yes"; then @@ -90681,9 +86751,9 @@ echo "${ECHO_T}$glibcxx_cv_func_float_trig_use" >&6 for ac_func in acosf asinf atanf cosf sinf tanf coshf sinhf tanhf do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -90714,68 +86784,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -90785,15 +86847,14 @@ fi done else - echo "$as_me:$LINENO: checking for _float trig functions" >&5 -echo $ECHO_N "checking for _float trig functions... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for _float trig functions" >&5 +echo $ECHO_N "checking for _float trig functions... $ECHO_C" >&6; } if test "${glibcxx_cv_func__float_trig_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -90815,35 +86876,31 @@ _acosf (0); _asinf (0); _atanf (0); _cosf (0); _sinf (0); _tanf (0); _coshf (0); } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func__float_trig_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func__float_trig_use=no + glibcxx_cv_func__float_trig_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -90852,8 +86909,8 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__float_trig_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__float_trig_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__float_trig_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__float_trig_use" >&6; } if test x$glibcxx_cv_func__float_trig_use = x"yes"; then @@ -90867,9 +86924,9 @@ echo "${ECHO_T}$glibcxx_cv_func__float_trig_use" >&6 for ac_func in _acosf _asinf _atanf _cosf _sinf _tanf _coshf _sinhf _tanhf do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -90900,68 +86957,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -90986,15 +87035,14 @@ done - echo "$as_me:$LINENO: checking for float round functions" >&5 -echo $ECHO_N "checking for float round functions... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for float round functions" >&5 +echo $ECHO_N "checking for float round functions... $ECHO_C" >&6; } if test "${glibcxx_cv_func_float_round_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -91016,35 +87064,31 @@ ceilf (0); floorf (0); } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func_float_round_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_float_round_use=no + glibcxx_cv_func_float_round_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -91053,17 +87097,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_float_round_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_float_round_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_float_round_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_float_round_use" >&6; } if test x$glibcxx_cv_func_float_round_use = x"yes"; then for ac_func in ceilf floorf do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -91094,68 +87138,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -91165,15 +87201,14 @@ fi done else - echo "$as_me:$LINENO: checking for _float round functions" >&5 -echo $ECHO_N "checking for _float round functions... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for _float round functions" >&5 +echo $ECHO_N "checking for _float round functions... $ECHO_C" >&6; } if test "${glibcxx_cv_func__float_round_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -91195,35 +87230,31 @@ _ceilf (0); _floorf (0); } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func__float_round_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func__float_round_use=no + glibcxx_cv_func__float_round_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -91232,17 +87263,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__float_round_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__float_round_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__float_round_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__float_round_use" >&6; } if test x$glibcxx_cv_func__float_round_use = x"yes"; then for ac_func in _ceilf _floorf do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -91273,68 +87304,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -91353,16 +87376,15 @@ done - echo "$as_me:$LINENO: checking for expf declaration" >&5 -echo $ECHO_N "checking for expf declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for expf declaration" >&5 +echo $ECHO_N "checking for expf declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func_expf_use+set} != xset; then if test "${glibcxx_cv_func_expf_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -91388,35 +87410,205 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + glibcxx_cv_func_expf_use=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + glibcxx_cv_func_expf_use=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +fi + + fi + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_expf_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_expf_use" >&6; } + + if test x$glibcxx_cv_func_expf_use = x"yes"; then + +for ac_func in expf +do +as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test x$gcc_no_link = xyes; then + { { echo "$as_me:$LINENO: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&5 +echo "$as_me: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&2;} + { (exit 1); exit 1; }; } +fi +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define $ac_func to an innocuous variant, in case declares $ac_func. + For example, HP-UX 11i declares gettimeofday. */ +#define $ac_func innocuous_$ac_func + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $ac_func (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $ac_func + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char $ac_func (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_$ac_func || defined __stub___$ac_func +choke me +#endif + +int +main () +{ +return $ac_func (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then + eval "$as_ac_var=yes" +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + eval "$as_ac_var=no" +fi + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +fi +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } +if test `eval echo '${'$as_ac_var'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +fi +done + + else + + { echo "$as_me:$LINENO: checking for _expf declaration" >&5 +echo $ECHO_N "checking for _expf declaration... $ECHO_C" >&6; } + if test x${glibcxx_cv_func__expf_use+set} != xset; then + if test "${glibcxx_cv_func__expf_use+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + + ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include + #ifdef HAVE_IEEEFP_H + #include + #endif + +int +main () +{ + _expf(0); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - glibcxx_cv_func_expf_use=yes + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + glibcxx_cv_func__expf_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_expf_use=no + glibcxx_cv_func__expf_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -91427,17 +87619,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_expf_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_expf_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__expf_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__expf_use" >&6; } - if test x$glibcxx_cv_func_expf_use = x"yes"; then + if test x$glibcxx_cv_func__expf_use = x"yes"; then -for ac_func in expf +for ac_func in _expf do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -91468,255 +87660,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ -#ifdef __cplusplus -extern "C" -{ -#endif -/* We use char because int might match the return type of a gcc2 +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ -char $ac_func (); -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) -choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} -#endif - -int -main () -{ -return f != $ac_func; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - eval "$as_ac_var=yes" -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -eval "$as_ac_var=no" -fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 -if test `eval echo '${'$as_ac_var'}'` = yes; then - cat >>confdefs.h <<_ACEOF -#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 -_ACEOF - -fi -done - - else - - echo "$as_me:$LINENO: checking for _expf declaration" >&5 -echo $ECHO_N "checking for _expf declaration... $ECHO_C" >&6 - if test x${glibcxx_cv_func__expf_use+set} != xset; then - if test "${glibcxx_cv_func__expf_use+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - - - - ac_ext=cc -ac_cpp='$CXXCPP $CPPFLAGS' -ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_cxx_compiler_gnu - - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include - #ifdef HAVE_IEEEFP_H - #include - #endif - -int -main () -{ - _expf(0); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - glibcxx_cv_func__expf_use=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -glibcxx_cv_func__expf_use=no -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext - ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - - -fi - - fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__expf_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__expf_use" >&6 - - if test x$glibcxx_cv_func__expf_use = x"yes"; then - -for ac_func in _expf -do -as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test x$gcc_no_link = xyes; then - { { echo "$as_me:$LINENO: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&5 -echo "$as_me: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&2;} - { (exit 1); exit 1; }; } -fi -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -/* Define $ac_func to an innocuous variant, in case declares $ac_func. - For example, HP-UX 11i declares gettimeofday. */ -#define $ac_func innocuous_$ac_func - -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char $ac_func (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ - -#ifdef __STDC__ -# include -#else -# include -#endif - -#undef $ac_func - -/* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -91733,16 +87730,15 @@ done - echo "$as_me:$LINENO: checking for isnanf declaration" >&5 -echo $ECHO_N "checking for isnanf declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for isnanf declaration" >&5 +echo $ECHO_N "checking for isnanf declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func_isnanf_use+set} != xset; then if test "${glibcxx_cv_func_isnanf_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -91768,35 +87764,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func_isnanf_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_isnanf_use=no + glibcxx_cv_func_isnanf_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -91807,17 +87799,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_isnanf_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_isnanf_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_isnanf_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_isnanf_use" >&6; } if test x$glibcxx_cv_func_isnanf_use = x"yes"; then for ac_func in isnanf do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -91848,68 +87840,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -91920,16 +87904,15 @@ done else - echo "$as_me:$LINENO: checking for _isnanf declaration" >&5 -echo $ECHO_N "checking for _isnanf declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for _isnanf declaration" >&5 +echo $ECHO_N "checking for _isnanf declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func__isnanf_use+set} != xset; then if test "${glibcxx_cv_func__isnanf_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -91955,35 +87938,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func__isnanf_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func__isnanf_use=no + glibcxx_cv_func__isnanf_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -91994,17 +87973,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__isnanf_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__isnanf_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__isnanf_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__isnanf_use" >&6; } if test x$glibcxx_cv_func__isnanf_use = x"yes"; then for ac_func in _isnanf do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -92035,68 +88014,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -92113,16 +88084,15 @@ done - echo "$as_me:$LINENO: checking for isinff declaration" >&5 -echo $ECHO_N "checking for isinff declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for isinff declaration" >&5 +echo $ECHO_N "checking for isinff declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func_isinff_use+set} != xset; then if test "${glibcxx_cv_func_isinff_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -92148,35 +88118,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func_isinff_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_isinff_use=no + glibcxx_cv_func_isinff_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -92187,17 +88153,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_isinff_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_isinff_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_isinff_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_isinff_use" >&6; } if test x$glibcxx_cv_func_isinff_use = x"yes"; then for ac_func in isinff do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -92228,68 +88194,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -92300,16 +88258,15 @@ done else - echo "$as_me:$LINENO: checking for _isinff declaration" >&5 -echo $ECHO_N "checking for _isinff declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for _isinff declaration" >&5 +echo $ECHO_N "checking for _isinff declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func__isinff_use+set} != xset; then if test "${glibcxx_cv_func__isinff_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -92335,35 +88292,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func__isinff_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func__isinff_use=no + glibcxx_cv_func__isinff_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -92374,17 +88327,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__isinff_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__isinff_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__isinff_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__isinff_use" >&6; } if test x$glibcxx_cv_func__isinff_use = x"yes"; then for ac_func in _isinff do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -92415,68 +88368,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -92493,16 +88438,15 @@ done - echo "$as_me:$LINENO: checking for atan2f declaration" >&5 -echo $ECHO_N "checking for atan2f declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for atan2f declaration" >&5 +echo $ECHO_N "checking for atan2f declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func_atan2f_use+set} != xset; then if test "${glibcxx_cv_func_atan2f_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -92524,35 +88468,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func_atan2f_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_atan2f_use=no + glibcxx_cv_func_atan2f_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -92563,17 +88503,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_atan2f_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_atan2f_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_atan2f_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_atan2f_use" >&6; } if test x$glibcxx_cv_func_atan2f_use = x"yes"; then for ac_func in atan2f do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -92604,68 +88544,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -92676,16 +88608,15 @@ done else - echo "$as_me:$LINENO: checking for _atan2f declaration" >&5 -echo $ECHO_N "checking for _atan2f declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for _atan2f declaration" >&5 +echo $ECHO_N "checking for _atan2f declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func__atan2f_use+set} != xset; then if test "${glibcxx_cv_func__atan2f_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -92707,35 +88638,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func__atan2f_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func__atan2f_use=no + glibcxx_cv_func__atan2f_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -92746,17 +88673,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__atan2f_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__atan2f_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__atan2f_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__atan2f_use" >&6; } if test x$glibcxx_cv_func__atan2f_use = x"yes"; then for ac_func in _atan2f do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -92787,68 +88714,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -92865,16 +88784,15 @@ done - echo "$as_me:$LINENO: checking for fabsf declaration" >&5 -echo $ECHO_N "checking for fabsf declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for fabsf declaration" >&5 +echo $ECHO_N "checking for fabsf declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func_fabsf_use+set} != xset; then if test "${glibcxx_cv_func_fabsf_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -92900,35 +88818,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func_fabsf_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_fabsf_use=no + glibcxx_cv_func_fabsf_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -92939,17 +88853,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_fabsf_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_fabsf_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_fabsf_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_fabsf_use" >&6; } if test x$glibcxx_cv_func_fabsf_use = x"yes"; then for ac_func in fabsf do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -92980,68 +88894,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -93052,16 +88958,15 @@ done else - echo "$as_me:$LINENO: checking for _fabsf declaration" >&5 -echo $ECHO_N "checking for _fabsf declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for _fabsf declaration" >&5 +echo $ECHO_N "checking for _fabsf declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func__fabsf_use+set} != xset; then if test "${glibcxx_cv_func__fabsf_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -93087,35 +88992,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func__fabsf_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func__fabsf_use=no + glibcxx_cv_func__fabsf_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -93126,17 +89027,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__fabsf_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__fabsf_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__fabsf_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__fabsf_use" >&6; } if test x$glibcxx_cv_func__fabsf_use = x"yes"; then for ac_func in _fabsf do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -93167,68 +89068,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -93245,16 +89138,15 @@ done - echo "$as_me:$LINENO: checking for fmodf declaration" >&5 -echo $ECHO_N "checking for fmodf declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for fmodf declaration" >&5 +echo $ECHO_N "checking for fmodf declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func_fmodf_use+set} != xset; then if test "${glibcxx_cv_func_fmodf_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -93276,35 +89168,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func_fmodf_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_fmodf_use=no + glibcxx_cv_func_fmodf_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -93315,17 +89203,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_fmodf_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_fmodf_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_fmodf_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_fmodf_use" >&6; } if test x$glibcxx_cv_func_fmodf_use = x"yes"; then for ac_func in fmodf do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -93356,68 +89244,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -93428,16 +89308,15 @@ done else - echo "$as_me:$LINENO: checking for _fmodf declaration" >&5 -echo $ECHO_N "checking for _fmodf declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for _fmodf declaration" >&5 +echo $ECHO_N "checking for _fmodf declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func__fmodf_use+set} != xset; then if test "${glibcxx_cv_func__fmodf_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -93459,35 +89338,207 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + glibcxx_cv_func__fmodf_use=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + glibcxx_cv_func__fmodf_use=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +fi + + fi + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__fmodf_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__fmodf_use" >&6; } + + if test x$glibcxx_cv_func__fmodf_use = x"yes"; then + +for ac_func in _fmodf +do +as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test x$gcc_no_link = xyes; then + { { echo "$as_me:$LINENO: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&5 +echo "$as_me: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&2;} + { (exit 1); exit 1; }; } +fi +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define $ac_func to an innocuous variant, in case declares $ac_func. + For example, HP-UX 11i declares gettimeofday. */ +#define $ac_func innocuous_$ac_func + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $ac_func (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $ac_func + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char $ac_func (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_$ac_func || defined __stub___$ac_func +choke me +#endif + +int +main () +{ +return $ac_func (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then + eval "$as_ac_var=yes" +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + eval "$as_ac_var=no" +fi + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +fi +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } +if test `eval echo '${'$as_ac_var'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +fi +done + + fi + fi + + + + + + + { echo "$as_me:$LINENO: checking for frexpf declaration" >&5 +echo $ECHO_N "checking for frexpf declaration... $ECHO_C" >&6; } + if test x${glibcxx_cv_func_frexpf_use+set} != xset; then + if test "${glibcxx_cv_func_frexpf_use+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + + ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +int +main () +{ + frexpf(0, 0); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - glibcxx_cv_func__fmodf_use=yes + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + glibcxx_cv_func_frexpf_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func__fmodf_use=no + glibcxx_cv_func_frexpf_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -93498,17 +89549,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__fmodf_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__fmodf_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_frexpf_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_frexpf_use" >&6; } - if test x$glibcxx_cv_func__fmodf_use = x"yes"; then + if test x$glibcxx_cv_func_frexpf_use = x"yes"; then -for ac_func in _fmodf +for ac_func in frexpf do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -93539,257 +89590,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ -#ifdef __cplusplus -extern "C" -{ -#endif -/* We use char because int might match the return type of a gcc2 +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ -char $ac_func (); -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) -choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} -#endif - -int -main () -{ -return f != $ac_func; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - eval "$as_ac_var=yes" -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -eval "$as_ac_var=no" -fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 -if test `eval echo '${'$as_ac_var'}'` = yes; then - cat >>confdefs.h <<_ACEOF -#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 -_ACEOF - -fi -done - - fi - fi - - - - - - - echo "$as_me:$LINENO: checking for frexpf declaration" >&5 -echo $ECHO_N "checking for frexpf declaration... $ECHO_C" >&6 - if test x${glibcxx_cv_func_frexpf_use+set} != xset; then - if test "${glibcxx_cv_func_frexpf_use+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - - - - ac_ext=cc -ac_cpp='$CXXCPP $CPPFLAGS' -ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_cxx_compiler_gnu - - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include -int -main () -{ - frexpf(0, 0); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - glibcxx_cv_func_frexpf_use=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -glibcxx_cv_func_frexpf_use=no -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext - ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - - -fi - - fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_frexpf_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_frexpf_use" >&6 - - if test x$glibcxx_cv_func_frexpf_use = x"yes"; then - -for ac_func in frexpf -do -as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test x$gcc_no_link = xyes; then - { { echo "$as_me:$LINENO: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&5 -echo "$as_me: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&2;} - { (exit 1); exit 1; }; } -fi -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -/* Define $ac_func to an innocuous variant, in case declares $ac_func. - For example, HP-UX 11i declares gettimeofday. */ -#define $ac_func innocuous_$ac_func - -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char $ac_func (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ - -#ifdef __STDC__ -# include -#else -# include -#endif - -#undef $ac_func - -/* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -93800,16 +89654,15 @@ done else - echo "$as_me:$LINENO: checking for _frexpf declaration" >&5 -echo $ECHO_N "checking for _frexpf declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for _frexpf declaration" >&5 +echo $ECHO_N "checking for _frexpf declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func__frexpf_use+set} != xset; then if test "${glibcxx_cv_func__frexpf_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -93831,35 +89684,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func__frexpf_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func__frexpf_use=no + glibcxx_cv_func__frexpf_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -93870,17 +89719,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__frexpf_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__frexpf_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__frexpf_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__frexpf_use" >&6; } if test x$glibcxx_cv_func__frexpf_use = x"yes"; then for ac_func in _frexpf do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -93911,68 +89760,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -93989,16 +89830,15 @@ done - echo "$as_me:$LINENO: checking for hypotf declaration" >&5 -echo $ECHO_N "checking for hypotf declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for hypotf declaration" >&5 +echo $ECHO_N "checking for hypotf declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func_hypotf_use+set} != xset; then if test "${glibcxx_cv_func_hypotf_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -94020,35 +89860,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func_hypotf_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_hypotf_use=no + glibcxx_cv_func_hypotf_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -94059,17 +89895,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_hypotf_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_hypotf_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_hypotf_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_hypotf_use" >&6; } if test x$glibcxx_cv_func_hypotf_use = x"yes"; then for ac_func in hypotf do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -94100,68 +89936,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -94172,16 +90000,15 @@ done else - echo "$as_me:$LINENO: checking for _hypotf declaration" >&5 -echo $ECHO_N "checking for _hypotf declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for _hypotf declaration" >&5 +echo $ECHO_N "checking for _hypotf declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func__hypotf_use+set} != xset; then if test "${glibcxx_cv_func__hypotf_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -94203,35 +90030,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func__hypotf_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func__hypotf_use=no + glibcxx_cv_func__hypotf_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -94242,17 +90065,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__hypotf_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__hypotf_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__hypotf_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__hypotf_use" >&6; } if test x$glibcxx_cv_func__hypotf_use = x"yes"; then for ac_func in _hypotf do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -94283,68 +90106,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -94361,16 +90176,15 @@ done - echo "$as_me:$LINENO: checking for ldexpf declaration" >&5 -echo $ECHO_N "checking for ldexpf declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for ldexpf declaration" >&5 +echo $ECHO_N "checking for ldexpf declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func_ldexpf_use+set} != xset; then if test "${glibcxx_cv_func_ldexpf_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -94392,35 +90206,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func_ldexpf_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_ldexpf_use=no + glibcxx_cv_func_ldexpf_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -94431,17 +90241,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_ldexpf_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_ldexpf_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_ldexpf_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_ldexpf_use" >&6; } if test x$glibcxx_cv_func_ldexpf_use = x"yes"; then for ac_func in ldexpf do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -94472,68 +90282,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -94544,16 +90346,15 @@ done else - echo "$as_me:$LINENO: checking for _ldexpf declaration" >&5 -echo $ECHO_N "checking for _ldexpf declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for _ldexpf declaration" >&5 +echo $ECHO_N "checking for _ldexpf declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func__ldexpf_use+set} != xset; then if test "${glibcxx_cv_func__ldexpf_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -94575,35 +90376,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func__ldexpf_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func__ldexpf_use=no + glibcxx_cv_func__ldexpf_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -94614,17 +90411,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__ldexpf_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__ldexpf_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__ldexpf_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__ldexpf_use" >&6; } if test x$glibcxx_cv_func__ldexpf_use = x"yes"; then for ac_func in _ldexpf do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -94655,68 +90452,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -94733,16 +90522,15 @@ done - echo "$as_me:$LINENO: checking for logf declaration" >&5 -echo $ECHO_N "checking for logf declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for logf declaration" >&5 +echo $ECHO_N "checking for logf declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func_logf_use+set} != xset; then if test "${glibcxx_cv_func_logf_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -94768,35 +90556,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func_logf_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_logf_use=no + glibcxx_cv_func_logf_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -94807,17 +90591,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_logf_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_logf_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_logf_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_logf_use" >&6; } if test x$glibcxx_cv_func_logf_use = x"yes"; then for ac_func in logf do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -94848,68 +90632,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -94920,16 +90696,15 @@ done else - echo "$as_me:$LINENO: checking for _logf declaration" >&5 -echo $ECHO_N "checking for _logf declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for _logf declaration" >&5 +echo $ECHO_N "checking for _logf declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func__logf_use+set} != xset; then if test "${glibcxx_cv_func__logf_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -94955,35 +90730,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func__logf_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func__logf_use=no + glibcxx_cv_func__logf_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -94994,17 +90765,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__logf_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__logf_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__logf_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__logf_use" >&6; } if test x$glibcxx_cv_func__logf_use = x"yes"; then for ac_func in _logf do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -95035,68 +90806,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -95113,16 +90876,15 @@ done - echo "$as_me:$LINENO: checking for log10f declaration" >&5 -echo $ECHO_N "checking for log10f declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for log10f declaration" >&5 +echo $ECHO_N "checking for log10f declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func_log10f_use+set} != xset; then if test "${glibcxx_cv_func_log10f_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -95148,35 +90910,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func_log10f_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_log10f_use=no + glibcxx_cv_func_log10f_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -95187,17 +90945,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_log10f_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_log10f_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_log10f_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_log10f_use" >&6; } if test x$glibcxx_cv_func_log10f_use = x"yes"; then for ac_func in log10f do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -95228,68 +90986,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -95300,16 +91050,15 @@ done else - echo "$as_me:$LINENO: checking for _log10f declaration" >&5 -echo $ECHO_N "checking for _log10f declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for _log10f declaration" >&5 +echo $ECHO_N "checking for _log10f declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func__log10f_use+set} != xset; then if test "${glibcxx_cv_func__log10f_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -95335,35 +91084,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func__log10f_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func__log10f_use=no + glibcxx_cv_func__log10f_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -95374,17 +91119,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__log10f_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__log10f_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__log10f_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__log10f_use" >&6; } if test x$glibcxx_cv_func__log10f_use = x"yes"; then for ac_func in _log10f do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -95415,68 +91160,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -95493,16 +91230,15 @@ done - echo "$as_me:$LINENO: checking for modff declaration" >&5 -echo $ECHO_N "checking for modff declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for modff declaration" >&5 +echo $ECHO_N "checking for modff declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func_modff_use+set} != xset; then if test "${glibcxx_cv_func_modff_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -95524,35 +91260,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func_modff_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_modff_use=no + glibcxx_cv_func_modff_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -95563,17 +91295,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_modff_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_modff_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_modff_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_modff_use" >&6; } if test x$glibcxx_cv_func_modff_use = x"yes"; then for ac_func in modff do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -95604,68 +91336,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -95676,16 +91400,15 @@ done else - echo "$as_me:$LINENO: checking for _modff declaration" >&5 -echo $ECHO_N "checking for _modff declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for _modff declaration" >&5 +echo $ECHO_N "checking for _modff declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func__modff_use+set} != xset; then if test "${glibcxx_cv_func__modff_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -95707,35 +91430,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func__modff_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func__modff_use=no + glibcxx_cv_func__modff_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -95746,17 +91465,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__modff_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__modff_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__modff_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__modff_use" >&6; } if test x$glibcxx_cv_func__modff_use = x"yes"; then for ac_func in _modff do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -95787,68 +91506,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -95865,16 +91576,15 @@ done - echo "$as_me:$LINENO: checking for modf declaration" >&5 -echo $ECHO_N "checking for modf declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for modf declaration" >&5 +echo $ECHO_N "checking for modf declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func_modf_use+set} != xset; then if test "${glibcxx_cv_func_modf_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -95896,35 +91606,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func_modf_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_modf_use=no + glibcxx_cv_func_modf_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -95935,17 +91641,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_modf_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_modf_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_modf_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_modf_use" >&6; } if test x$glibcxx_cv_func_modf_use = x"yes"; then for ac_func in modf do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -95976,68 +91682,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -96048,16 +91746,15 @@ done else - echo "$as_me:$LINENO: checking for _modf declaration" >&5 -echo $ECHO_N "checking for _modf declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for _modf declaration" >&5 +echo $ECHO_N "checking for _modf declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func__modf_use+set} != xset; then if test "${glibcxx_cv_func__modf_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -96079,35 +91776,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func__modf_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func__modf_use=no + glibcxx_cv_func__modf_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -96118,17 +91811,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__modf_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__modf_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__modf_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__modf_use" >&6; } if test x$glibcxx_cv_func__modf_use = x"yes"; then for ac_func in _modf do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -96159,68 +91852,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -96237,16 +91922,15 @@ done - echo "$as_me:$LINENO: checking for powf declaration" >&5 -echo $ECHO_N "checking for powf declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for powf declaration" >&5 +echo $ECHO_N "checking for powf declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func_powf_use+set} != xset; then if test "${glibcxx_cv_func_powf_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -96268,35 +91952,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func_powf_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_powf_use=no + glibcxx_cv_func_powf_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -96307,17 +91987,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_powf_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_powf_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_powf_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_powf_use" >&6; } if test x$glibcxx_cv_func_powf_use = x"yes"; then for ac_func in powf do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -96348,68 +92028,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -96420,16 +92092,15 @@ done else - echo "$as_me:$LINENO: checking for _powf declaration" >&5 -echo $ECHO_N "checking for _powf declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for _powf declaration" >&5 +echo $ECHO_N "checking for _powf declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func__powf_use+set} != xset; then if test "${glibcxx_cv_func__powf_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -96451,35 +92122,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func__powf_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func__powf_use=no + glibcxx_cv_func__powf_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -96490,17 +92157,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__powf_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__powf_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__powf_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__powf_use" >&6; } if test x$glibcxx_cv_func__powf_use = x"yes"; then for ac_func in _powf do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -96531,68 +92198,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -96609,16 +92268,15 @@ done - echo "$as_me:$LINENO: checking for sqrtf declaration" >&5 -echo $ECHO_N "checking for sqrtf declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for sqrtf declaration" >&5 +echo $ECHO_N "checking for sqrtf declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func_sqrtf_use+set} != xset; then if test "${glibcxx_cv_func_sqrtf_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -96644,35 +92302,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func_sqrtf_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_sqrtf_use=no + glibcxx_cv_func_sqrtf_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -96683,17 +92337,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_sqrtf_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_sqrtf_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_sqrtf_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_sqrtf_use" >&6; } if test x$glibcxx_cv_func_sqrtf_use = x"yes"; then for ac_func in sqrtf do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -96724,68 +92378,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -96796,16 +92442,15 @@ done else - echo "$as_me:$LINENO: checking for _sqrtf declaration" >&5 -echo $ECHO_N "checking for _sqrtf declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for _sqrtf declaration" >&5 +echo $ECHO_N "checking for _sqrtf declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func__sqrtf_use+set} != xset; then if test "${glibcxx_cv_func__sqrtf_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -96831,35 +92476,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func__sqrtf_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func__sqrtf_use=no + glibcxx_cv_func__sqrtf_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -96870,17 +92511,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__sqrtf_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__sqrtf_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__sqrtf_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__sqrtf_use" >&6; } if test x$glibcxx_cv_func__sqrtf_use = x"yes"; then for ac_func in _sqrtf do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -96911,68 +92552,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -96989,16 +92622,15 @@ done - echo "$as_me:$LINENO: checking for sincosf declaration" >&5 -echo $ECHO_N "checking for sincosf declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for sincosf declaration" >&5 +echo $ECHO_N "checking for sincosf declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func_sincosf_use+set} != xset; then if test "${glibcxx_cv_func_sincosf_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -97020,35 +92652,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func_sincosf_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_sincosf_use=no + glibcxx_cv_func_sincosf_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -97059,17 +92687,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_sincosf_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_sincosf_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_sincosf_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_sincosf_use" >&6; } if test x$glibcxx_cv_func_sincosf_use = x"yes"; then for ac_func in sincosf do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -97100,68 +92728,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -97172,16 +92792,15 @@ done else - echo "$as_me:$LINENO: checking for _sincosf declaration" >&5 -echo $ECHO_N "checking for _sincosf declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for _sincosf declaration" >&5 +echo $ECHO_N "checking for _sincosf declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func__sincosf_use+set} != xset; then if test "${glibcxx_cv_func__sincosf_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -97203,35 +92822,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func__sincosf_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func__sincosf_use=no + glibcxx_cv_func__sincosf_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -97242,17 +92857,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__sincosf_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__sincosf_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__sincosf_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__sincosf_use" >&6; } if test x$glibcxx_cv_func__sincosf_use = x"yes"; then for ac_func in _sincosf do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -97283,68 +92898,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -97361,16 +92968,15 @@ done - echo "$as_me:$LINENO: checking for finitef declaration" >&5 -echo $ECHO_N "checking for finitef declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for finitef declaration" >&5 +echo $ECHO_N "checking for finitef declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func_finitef_use+set} != xset; then if test "${glibcxx_cv_func_finitef_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -97396,35 +93002,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func_finitef_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_finitef_use=no + glibcxx_cv_func_finitef_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -97435,17 +93037,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_finitef_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_finitef_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_finitef_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_finitef_use" >&6; } if test x$glibcxx_cv_func_finitef_use = x"yes"; then for ac_func in finitef do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -97476,68 +93078,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -97548,16 +93142,15 @@ done else - echo "$as_me:$LINENO: checking for _finitef declaration" >&5 -echo $ECHO_N "checking for _finitef declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for _finitef declaration" >&5 +echo $ECHO_N "checking for _finitef declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func__finitef_use+set} != xset; then if test "${glibcxx_cv_func__finitef_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -97583,35 +93176,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func__finitef_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func__finitef_use=no + glibcxx_cv_func__finitef_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -97622,17 +93211,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__finitef_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__finitef_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__finitef_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__finitef_use" >&6; } if test x$glibcxx_cv_func__finitef_use = x"yes"; then for ac_func in _finitef do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -97663,68 +93252,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -97741,15 +93322,14 @@ done - echo "$as_me:$LINENO: checking for long double trig functions" >&5 -echo $ECHO_N "checking for long double trig functions... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for long double trig functions" >&5 +echo $ECHO_N "checking for long double trig functions... $ECHO_C" >&6; } if test "${glibcxx_cv_func_long_double_trig_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -97771,35 +93351,31 @@ acosl (0); asinl (0); atanl (0); cosl (0); sinl (0); tanl (0); coshl (0); sinhl } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func_long_double_trig_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_long_double_trig_use=no + glibcxx_cv_func_long_double_trig_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -97808,8 +93384,8 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_long_double_trig_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_long_double_trig_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_long_double_trig_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_long_double_trig_use" >&6; } if test x$glibcxx_cv_func_long_double_trig_use = x"yes"; then @@ -97823,9 +93399,9 @@ echo "${ECHO_T}$glibcxx_cv_func_long_double_trig_use" >&6 for ac_func in acosl asinl atanl cosl sinl tanl coshl sinhl tanhl do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -97856,68 +93432,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -97927,15 +93495,14 @@ fi done else - echo "$as_me:$LINENO: checking for _long double trig functions" >&5 -echo $ECHO_N "checking for _long double trig functions... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for _long double trig functions" >&5 +echo $ECHO_N "checking for _long double trig functions... $ECHO_C" >&6; } if test "${glibcxx_cv_func__long_double_trig_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -97957,35 +93524,31 @@ _acosl (0); _asinl (0); _atanl (0); _cosl (0); _sinl (0); _tanl (0); _coshl (0); } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func__long_double_trig_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func__long_double_trig_use=no + glibcxx_cv_func__long_double_trig_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -97994,8 +93557,8 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__long_double_trig_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__long_double_trig_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__long_double_trig_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__long_double_trig_use" >&6; } if test x$glibcxx_cv_func__long_double_trig_use = x"yes"; then @@ -98009,9 +93572,9 @@ echo "${ECHO_T}$glibcxx_cv_func__long_double_trig_use" >&6 for ac_func in _acosl _asinl _atanl _cosl _sinl _tanl _coshl _sinhl _tanhl do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -98042,68 +93605,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -98128,15 +93683,14 @@ done - echo "$as_me:$LINENO: checking for long double round functions" >&5 -echo $ECHO_N "checking for long double round functions... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for long double round functions" >&5 +echo $ECHO_N "checking for long double round functions... $ECHO_C" >&6; } if test "${glibcxx_cv_func_long_double_round_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -98158,35 +93712,31 @@ ceill (0); floorl (0); } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func_long_double_round_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_long_double_round_use=no + glibcxx_cv_func_long_double_round_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -98195,17 +93745,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_long_double_round_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_long_double_round_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_long_double_round_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_long_double_round_use" >&6; } if test x$glibcxx_cv_func_long_double_round_use = x"yes"; then for ac_func in ceill floorl do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -98236,68 +93786,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -98307,15 +93849,14 @@ fi done else - echo "$as_me:$LINENO: checking for _long double round functions" >&5 -echo $ECHO_N "checking for _long double round functions... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for _long double round functions" >&5 +echo $ECHO_N "checking for _long double round functions... $ECHO_C" >&6; } if test "${glibcxx_cv_func__long_double_round_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -98337,35 +93878,31 @@ _ceill (0); _floorl (0); } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func__long_double_round_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func__long_double_round_use=no + glibcxx_cv_func__long_double_round_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -98374,17 +93911,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__long_double_round_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__long_double_round_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__long_double_round_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__long_double_round_use" >&6; } if test x$glibcxx_cv_func__long_double_round_use = x"yes"; then for ac_func in _ceill _floorl do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -98415,68 +93952,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -98495,16 +94024,15 @@ done - echo "$as_me:$LINENO: checking for isnanl declaration" >&5 -echo $ECHO_N "checking for isnanl declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for isnanl declaration" >&5 +echo $ECHO_N "checking for isnanl declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func_isnanl_use+set} != xset; then if test "${glibcxx_cv_func_isnanl_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -98530,35 +94058,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func_isnanl_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_isnanl_use=no + glibcxx_cv_func_isnanl_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -98569,17 +94093,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_isnanl_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_isnanl_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_isnanl_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_isnanl_use" >&6; } if test x$glibcxx_cv_func_isnanl_use = x"yes"; then for ac_func in isnanl do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -98610,68 +94134,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -98682,16 +94198,15 @@ done else - echo "$as_me:$LINENO: checking for _isnanl declaration" >&5 -echo $ECHO_N "checking for _isnanl declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for _isnanl declaration" >&5 +echo $ECHO_N "checking for _isnanl declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func__isnanl_use+set} != xset; then if test "${glibcxx_cv_func__isnanl_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -98717,35 +94232,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func__isnanl_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func__isnanl_use=no + glibcxx_cv_func__isnanl_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -98756,17 +94267,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__isnanl_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__isnanl_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__isnanl_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__isnanl_use" >&6; } if test x$glibcxx_cv_func__isnanl_use = x"yes"; then for ac_func in _isnanl do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -98797,68 +94308,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -98875,16 +94378,15 @@ done - echo "$as_me:$LINENO: checking for isinfl declaration" >&5 -echo $ECHO_N "checking for isinfl declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for isinfl declaration" >&5 +echo $ECHO_N "checking for isinfl declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func_isinfl_use+set} != xset; then if test "${glibcxx_cv_func_isinfl_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -98910,35 +94412,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func_isinfl_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_isinfl_use=no + glibcxx_cv_func_isinfl_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -98949,17 +94447,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_isinfl_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_isinfl_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_isinfl_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_isinfl_use" >&6; } if test x$glibcxx_cv_func_isinfl_use = x"yes"; then for ac_func in isinfl do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -98990,68 +94488,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -99062,16 +94552,15 @@ done else - echo "$as_me:$LINENO: checking for _isinfl declaration" >&5 -echo $ECHO_N "checking for _isinfl declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for _isinfl declaration" >&5 +echo $ECHO_N "checking for _isinfl declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func__isinfl_use+set} != xset; then if test "${glibcxx_cv_func__isinfl_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -99097,35 +94586,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func__isinfl_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func__isinfl_use=no + glibcxx_cv_func__isinfl_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -99136,17 +94621,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__isinfl_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__isinfl_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__isinfl_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__isinfl_use" >&6; } if test x$glibcxx_cv_func__isinfl_use = x"yes"; then for ac_func in _isinfl do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -99177,68 +94662,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -99255,16 +94732,15 @@ done - echo "$as_me:$LINENO: checking for copysignl declaration" >&5 -echo $ECHO_N "checking for copysignl declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for copysignl declaration" >&5 +echo $ECHO_N "checking for copysignl declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func_copysignl_use+set} != xset; then if test "${glibcxx_cv_func_copysignl_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -99286,35 +94762,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func_copysignl_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_copysignl_use=no + glibcxx_cv_func_copysignl_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -99325,17 +94797,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_copysignl_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_copysignl_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_copysignl_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_copysignl_use" >&6; } if test x$glibcxx_cv_func_copysignl_use = x"yes"; then for ac_func in copysignl do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -99366,68 +94838,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -99438,16 +94902,15 @@ done else - echo "$as_me:$LINENO: checking for _copysignl declaration" >&5 -echo $ECHO_N "checking for _copysignl declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for _copysignl declaration" >&5 +echo $ECHO_N "checking for _copysignl declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func__copysignl_use+set} != xset; then if test "${glibcxx_cv_func__copysignl_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -99469,35 +94932,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func__copysignl_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func__copysignl_use=no + glibcxx_cv_func__copysignl_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -99508,17 +94967,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__copysignl_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__copysignl_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__copysignl_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__copysignl_use" >&6; } if test x$glibcxx_cv_func__copysignl_use = x"yes"; then for ac_func in _copysignl do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -99549,68 +95008,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -99627,16 +95078,15 @@ done - echo "$as_me:$LINENO: checking for atan2l declaration" >&5 -echo $ECHO_N "checking for atan2l declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for atan2l declaration" >&5 +echo $ECHO_N "checking for atan2l declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func_atan2l_use+set} != xset; then if test "${glibcxx_cv_func_atan2l_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -99658,35 +95108,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func_atan2l_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_atan2l_use=no + glibcxx_cv_func_atan2l_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -99697,17 +95143,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_atan2l_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_atan2l_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_atan2l_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_atan2l_use" >&6; } if test x$glibcxx_cv_func_atan2l_use = x"yes"; then for ac_func in atan2l do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -99738,68 +95184,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -99810,16 +95248,15 @@ done else - echo "$as_me:$LINENO: checking for _atan2l declaration" >&5 -echo $ECHO_N "checking for _atan2l declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for _atan2l declaration" >&5 +echo $ECHO_N "checking for _atan2l declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func__atan2l_use+set} != xset; then if test "${glibcxx_cv_func__atan2l_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -99841,35 +95278,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func__atan2l_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func__atan2l_use=no + glibcxx_cv_func__atan2l_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -99880,17 +95313,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__atan2l_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__atan2l_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__atan2l_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__atan2l_use" >&6; } if test x$glibcxx_cv_func__atan2l_use = x"yes"; then for ac_func in _atan2l do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -99921,68 +95354,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -99999,16 +95424,15 @@ done - echo "$as_me:$LINENO: checking for expl declaration" >&5 -echo $ECHO_N "checking for expl declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for expl declaration" >&5 +echo $ECHO_N "checking for expl declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func_expl_use+set} != xset; then if test "${glibcxx_cv_func_expl_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -100034,35 +95458,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func_expl_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_expl_use=no + glibcxx_cv_func_expl_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -100073,17 +95493,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_expl_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_expl_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_expl_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_expl_use" >&6; } if test x$glibcxx_cv_func_expl_use = x"yes"; then for ac_func in expl do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -100114,68 +95534,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -100186,16 +95598,15 @@ done else - echo "$as_me:$LINENO: checking for _expl declaration" >&5 -echo $ECHO_N "checking for _expl declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for _expl declaration" >&5 +echo $ECHO_N "checking for _expl declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func__expl_use+set} != xset; then if test "${glibcxx_cv_func__expl_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -100221,35 +95632,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func__expl_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func__expl_use=no + glibcxx_cv_func__expl_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -100260,17 +95667,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__expl_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__expl_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__expl_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__expl_use" >&6; } if test x$glibcxx_cv_func__expl_use = x"yes"; then for ac_func in _expl do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -100301,68 +95708,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -100379,16 +95778,15 @@ done - echo "$as_me:$LINENO: checking for fabsl declaration" >&5 -echo $ECHO_N "checking for fabsl declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for fabsl declaration" >&5 +echo $ECHO_N "checking for fabsl declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func_fabsl_use+set} != xset; then if test "${glibcxx_cv_func_fabsl_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -100414,35 +95812,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func_fabsl_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_fabsl_use=no + glibcxx_cv_func_fabsl_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -100453,17 +95847,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_fabsl_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_fabsl_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_fabsl_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_fabsl_use" >&6; } if test x$glibcxx_cv_func_fabsl_use = x"yes"; then for ac_func in fabsl do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -100494,68 +95888,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -100566,16 +95952,15 @@ done else - echo "$as_me:$LINENO: checking for _fabsl declaration" >&5 -echo $ECHO_N "checking for _fabsl declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for _fabsl declaration" >&5 +echo $ECHO_N "checking for _fabsl declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func__fabsl_use+set} != xset; then if test "${glibcxx_cv_func__fabsl_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -100601,35 +95986,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func__fabsl_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func__fabsl_use=no + glibcxx_cv_func__fabsl_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -100640,17 +96021,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__fabsl_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__fabsl_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__fabsl_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__fabsl_use" >&6; } if test x$glibcxx_cv_func__fabsl_use = x"yes"; then for ac_func in _fabsl do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -100681,68 +96062,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -100759,16 +96132,15 @@ done - echo "$as_me:$LINENO: checking for fmodl declaration" >&5 -echo $ECHO_N "checking for fmodl declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for fmodl declaration" >&5 +echo $ECHO_N "checking for fmodl declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func_fmodl_use+set} != xset; then if test "${glibcxx_cv_func_fmodl_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -100790,35 +96162,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func_fmodl_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_fmodl_use=no + glibcxx_cv_func_fmodl_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -100829,17 +96197,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_fmodl_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_fmodl_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_fmodl_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_fmodl_use" >&6; } if test x$glibcxx_cv_func_fmodl_use = x"yes"; then for ac_func in fmodl do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -100870,68 +96238,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -100942,16 +96302,15 @@ done else - echo "$as_me:$LINENO: checking for _fmodl declaration" >&5 -echo $ECHO_N "checking for _fmodl declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for _fmodl declaration" >&5 +echo $ECHO_N "checking for _fmodl declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func__fmodl_use+set} != xset; then if test "${glibcxx_cv_func__fmodl_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -100973,35 +96332,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func__fmodl_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func__fmodl_use=no + glibcxx_cv_func__fmodl_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -101012,17 +96367,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__fmodl_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__fmodl_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__fmodl_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__fmodl_use" >&6; } if test x$glibcxx_cv_func__fmodl_use = x"yes"; then for ac_func in _fmodl do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -101053,68 +96408,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -101131,16 +96478,15 @@ done - echo "$as_me:$LINENO: checking for frexpl declaration" >&5 -echo $ECHO_N "checking for frexpl declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for frexpl declaration" >&5 +echo $ECHO_N "checking for frexpl declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func_frexpl_use+set} != xset; then if test "${glibcxx_cv_func_frexpl_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -101162,35 +96508,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func_frexpl_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_frexpl_use=no + glibcxx_cv_func_frexpl_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -101201,17 +96543,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_frexpl_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_frexpl_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_frexpl_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_frexpl_use" >&6; } if test x$glibcxx_cv_func_frexpl_use = x"yes"; then for ac_func in frexpl do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -101242,68 +96584,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -101314,16 +96648,15 @@ done else - echo "$as_me:$LINENO: checking for _frexpl declaration" >&5 -echo $ECHO_N "checking for _frexpl declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for _frexpl declaration" >&5 +echo $ECHO_N "checking for _frexpl declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func__frexpl_use+set} != xset; then if test "${glibcxx_cv_func__frexpl_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -101345,35 +96678,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func__frexpl_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func__frexpl_use=no + glibcxx_cv_func__frexpl_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -101384,17 +96713,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__frexpl_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__frexpl_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__frexpl_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__frexpl_use" >&6; } if test x$glibcxx_cv_func__frexpl_use = x"yes"; then for ac_func in _frexpl do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -101425,68 +96754,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -101503,16 +96824,15 @@ done - echo "$as_me:$LINENO: checking for hypotl declaration" >&5 -echo $ECHO_N "checking for hypotl declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for hypotl declaration" >&5 +echo $ECHO_N "checking for hypotl declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func_hypotl_use+set} != xset; then if test "${glibcxx_cv_func_hypotl_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -101534,35 +96854,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func_hypotl_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_hypotl_use=no + glibcxx_cv_func_hypotl_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -101573,17 +96889,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_hypotl_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_hypotl_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_hypotl_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_hypotl_use" >&6; } if test x$glibcxx_cv_func_hypotl_use = x"yes"; then for ac_func in hypotl do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -101614,68 +96930,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -101686,16 +96994,15 @@ done else - echo "$as_me:$LINENO: checking for _hypotl declaration" >&5 -echo $ECHO_N "checking for _hypotl declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for _hypotl declaration" >&5 +echo $ECHO_N "checking for _hypotl declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func__hypotl_use+set} != xset; then if test "${glibcxx_cv_func__hypotl_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -101717,35 +97024,207 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + glibcxx_cv_func__hypotl_use=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + glibcxx_cv_func__hypotl_use=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +fi + + fi + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__hypotl_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__hypotl_use" >&6; } + + if test x$glibcxx_cv_func__hypotl_use = x"yes"; then + +for ac_func in _hypotl +do +as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test x$gcc_no_link = xyes; then + { { echo "$as_me:$LINENO: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&5 +echo "$as_me: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&2;} + { (exit 1); exit 1; }; } +fi +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define $ac_func to an innocuous variant, in case declares $ac_func. + For example, HP-UX 11i declares gettimeofday. */ +#define $ac_func innocuous_$ac_func + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $ac_func (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $ac_func + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char $ac_func (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_$ac_func || defined __stub___$ac_func +choke me +#endif + +int +main () +{ +return $ac_func (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then + eval "$as_ac_var=yes" +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + eval "$as_ac_var=no" +fi + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +fi +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } +if test `eval echo '${'$as_ac_var'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +fi +done + + fi + fi + + + + + + + { echo "$as_me:$LINENO: checking for ldexpl declaration" >&5 +echo $ECHO_N "checking for ldexpl declaration... $ECHO_C" >&6; } + if test x${glibcxx_cv_func_ldexpl_use+set} != xset; then + if test "${glibcxx_cv_func_ldexpl_use+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + + ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +int +main () +{ + ldexpl(0, 0); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - glibcxx_cv_func__hypotl_use=yes + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + glibcxx_cv_func_ldexpl_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func__hypotl_use=no + glibcxx_cv_func_ldexpl_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -101756,17 +97235,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__hypotl_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__hypotl_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_ldexpl_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_ldexpl_use" >&6; } - if test x$glibcxx_cv_func__hypotl_use = x"yes"; then + if test x$glibcxx_cv_func_ldexpl_use = x"yes"; then -for ac_func in _hypotl +for ac_func in ldexpl do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -101797,257 +97276,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ -#ifdef __cplusplus -extern "C" -{ -#endif -/* We use char because int might match the return type of a gcc2 +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ -char $ac_func (); -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) -choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} -#endif - -int -main () -{ -return f != $ac_func; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - eval "$as_ac_var=yes" -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -eval "$as_ac_var=no" -fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 -if test `eval echo '${'$as_ac_var'}'` = yes; then - cat >>confdefs.h <<_ACEOF -#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 -_ACEOF - -fi -done - - fi - fi - - - - - - - echo "$as_me:$LINENO: checking for ldexpl declaration" >&5 -echo $ECHO_N "checking for ldexpl declaration... $ECHO_C" >&6 - if test x${glibcxx_cv_func_ldexpl_use+set} != xset; then - if test "${glibcxx_cv_func_ldexpl_use+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - - - - ac_ext=cc -ac_cpp='$CXXCPP $CPPFLAGS' -ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_cxx_compiler_gnu - - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include -int -main () -{ - ldexpl(0, 0); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - glibcxx_cv_func_ldexpl_use=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -glibcxx_cv_func_ldexpl_use=no -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext - ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - - -fi - - fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_ldexpl_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_ldexpl_use" >&6 - - if test x$glibcxx_cv_func_ldexpl_use = x"yes"; then - -for ac_func in ldexpl -do -as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test x$gcc_no_link = xyes; then - { { echo "$as_me:$LINENO: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&5 -echo "$as_me: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&2;} - { (exit 1); exit 1; }; } -fi -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -/* Define $ac_func to an innocuous variant, in case declares $ac_func. - For example, HP-UX 11i declares gettimeofday. */ -#define $ac_func innocuous_$ac_func - -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char $ac_func (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ - -#ifdef __STDC__ -# include -#else -# include -#endif - -#undef $ac_func - -/* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -102058,16 +97340,15 @@ done else - echo "$as_me:$LINENO: checking for _ldexpl declaration" >&5 -echo $ECHO_N "checking for _ldexpl declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for _ldexpl declaration" >&5 +echo $ECHO_N "checking for _ldexpl declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func__ldexpl_use+set} != xset; then if test "${glibcxx_cv_func__ldexpl_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -102089,35 +97370,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func__ldexpl_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func__ldexpl_use=no + glibcxx_cv_func__ldexpl_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -102128,17 +97405,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__ldexpl_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__ldexpl_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__ldexpl_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__ldexpl_use" >&6; } if test x$glibcxx_cv_func__ldexpl_use = x"yes"; then for ac_func in _ldexpl do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -102169,68 +97446,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -102247,16 +97516,15 @@ done - echo "$as_me:$LINENO: checking for logl declaration" >&5 -echo $ECHO_N "checking for logl declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for logl declaration" >&5 +echo $ECHO_N "checking for logl declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func_logl_use+set} != xset; then if test "${glibcxx_cv_func_logl_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -102282,35 +97550,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func_logl_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_logl_use=no + glibcxx_cv_func_logl_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -102321,17 +97585,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_logl_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_logl_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_logl_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_logl_use" >&6; } if test x$glibcxx_cv_func_logl_use = x"yes"; then for ac_func in logl do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -102362,68 +97626,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -102434,16 +97690,15 @@ done else - echo "$as_me:$LINENO: checking for _logl declaration" >&5 -echo $ECHO_N "checking for _logl declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for _logl declaration" >&5 +echo $ECHO_N "checking for _logl declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func__logl_use+set} != xset; then if test "${glibcxx_cv_func__logl_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -102469,35 +97724,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func__logl_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func__logl_use=no + glibcxx_cv_func__logl_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -102508,17 +97759,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__logl_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__logl_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__logl_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__logl_use" >&6; } if test x$glibcxx_cv_func__logl_use = x"yes"; then for ac_func in _logl do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -102549,68 +97800,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -102627,16 +97870,15 @@ done - echo "$as_me:$LINENO: checking for log10l declaration" >&5 -echo $ECHO_N "checking for log10l declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for log10l declaration" >&5 +echo $ECHO_N "checking for log10l declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func_log10l_use+set} != xset; then if test "${glibcxx_cv_func_log10l_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -102662,35 +97904,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func_log10l_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_log10l_use=no + glibcxx_cv_func_log10l_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -102701,17 +97939,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_log10l_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_log10l_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_log10l_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_log10l_use" >&6; } if test x$glibcxx_cv_func_log10l_use = x"yes"; then for ac_func in log10l do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -102742,68 +97980,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -102814,16 +98044,15 @@ done else - echo "$as_me:$LINENO: checking for _log10l declaration" >&5 -echo $ECHO_N "checking for _log10l declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for _log10l declaration" >&5 +echo $ECHO_N "checking for _log10l declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func__log10l_use+set} != xset; then if test "${glibcxx_cv_func__log10l_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -102849,35 +98078,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func__log10l_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func__log10l_use=no + glibcxx_cv_func__log10l_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -102888,17 +98113,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__log10l_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__log10l_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__log10l_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__log10l_use" >&6; } if test x$glibcxx_cv_func__log10l_use = x"yes"; then for ac_func in _log10l do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -102929,68 +98154,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -103007,16 +98224,15 @@ done - echo "$as_me:$LINENO: checking for modfl declaration" >&5 -echo $ECHO_N "checking for modfl declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for modfl declaration" >&5 +echo $ECHO_N "checking for modfl declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func_modfl_use+set} != xset; then if test "${glibcxx_cv_func_modfl_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -103038,35 +98254,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func_modfl_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_modfl_use=no + glibcxx_cv_func_modfl_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -103077,17 +98289,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_modfl_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_modfl_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_modfl_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_modfl_use" >&6; } if test x$glibcxx_cv_func_modfl_use = x"yes"; then for ac_func in modfl do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -103118,68 +98330,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -103190,16 +98394,15 @@ done else - echo "$as_me:$LINENO: checking for _modfl declaration" >&5 -echo $ECHO_N "checking for _modfl declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for _modfl declaration" >&5 +echo $ECHO_N "checking for _modfl declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func__modfl_use+set} != xset; then if test "${glibcxx_cv_func__modfl_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -103221,35 +98424,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func__modfl_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func__modfl_use=no + glibcxx_cv_func__modfl_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -103260,17 +98459,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__modfl_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__modfl_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__modfl_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__modfl_use" >&6; } if test x$glibcxx_cv_func__modfl_use = x"yes"; then for ac_func in _modfl do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -103301,68 +98500,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -103379,16 +98570,15 @@ done - echo "$as_me:$LINENO: checking for powl declaration" >&5 -echo $ECHO_N "checking for powl declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for powl declaration" >&5 +echo $ECHO_N "checking for powl declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func_powl_use+set} != xset; then if test "${glibcxx_cv_func_powl_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -103410,35 +98600,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func_powl_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_powl_use=no + glibcxx_cv_func_powl_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -103449,17 +98635,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_powl_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_powl_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_powl_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_powl_use" >&6; } if test x$glibcxx_cv_func_powl_use = x"yes"; then for ac_func in powl do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -103490,68 +98676,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -103562,16 +98740,15 @@ done else - echo "$as_me:$LINENO: checking for _powl declaration" >&5 -echo $ECHO_N "checking for _powl declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for _powl declaration" >&5 +echo $ECHO_N "checking for _powl declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func__powl_use+set} != xset; then if test "${glibcxx_cv_func__powl_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -103593,35 +98770,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func__powl_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func__powl_use=no + glibcxx_cv_func__powl_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -103632,17 +98805,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__powl_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__powl_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__powl_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__powl_use" >&6; } if test x$glibcxx_cv_func__powl_use = x"yes"; then for ac_func in _powl do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -103673,68 +98846,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -103751,16 +98916,15 @@ done - echo "$as_me:$LINENO: checking for sqrtl declaration" >&5 -echo $ECHO_N "checking for sqrtl declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for sqrtl declaration" >&5 +echo $ECHO_N "checking for sqrtl declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func_sqrtl_use+set} != xset; then if test "${glibcxx_cv_func_sqrtl_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -103786,35 +98950,205 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + glibcxx_cv_func_sqrtl_use=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + glibcxx_cv_func_sqrtl_use=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +fi + + fi + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_sqrtl_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_sqrtl_use" >&6; } + + if test x$glibcxx_cv_func_sqrtl_use = x"yes"; then + +for ac_func in sqrtl +do +as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test x$gcc_no_link = xyes; then + { { echo "$as_me:$LINENO: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&5 +echo "$as_me: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&2;} + { (exit 1); exit 1; }; } +fi +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define $ac_func to an innocuous variant, in case declares $ac_func. + For example, HP-UX 11i declares gettimeofday. */ +#define $ac_func innocuous_$ac_func + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $ac_func (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $ac_func + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char $ac_func (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_$ac_func || defined __stub___$ac_func +choke me +#endif + +int +main () +{ +return $ac_func (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then + eval "$as_ac_var=yes" +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + eval "$as_ac_var=no" +fi + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +fi +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } +if test `eval echo '${'$as_ac_var'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +fi +done + + else + + { echo "$as_me:$LINENO: checking for _sqrtl declaration" >&5 +echo $ECHO_N "checking for _sqrtl declaration... $ECHO_C" >&6; } + if test x${glibcxx_cv_func__sqrtl_use+set} != xset; then + if test "${glibcxx_cv_func__sqrtl_use+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + + ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include + #ifdef HAVE_IEEEFP_H + #include + #endif + +int +main () +{ + _sqrtl(0); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - glibcxx_cv_func_sqrtl_use=yes + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + glibcxx_cv_func__sqrtl_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_sqrtl_use=no + glibcxx_cv_func__sqrtl_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -103825,17 +99159,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_sqrtl_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_sqrtl_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__sqrtl_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__sqrtl_use" >&6; } - if test x$glibcxx_cv_func_sqrtl_use = x"yes"; then + if test x$glibcxx_cv_func__sqrtl_use = x"yes"; then -for ac_func in sqrtl +for ac_func in _sqrtl do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -103866,255 +99200,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ -#ifdef __cplusplus -extern "C" -{ -#endif -/* We use char because int might match the return type of a gcc2 +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ -char $ac_func (); -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) -choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} -#endif - -int -main () -{ -return f != $ac_func; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - eval "$as_ac_var=yes" -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -eval "$as_ac_var=no" -fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 -if test `eval echo '${'$as_ac_var'}'` = yes; then - cat >>confdefs.h <<_ACEOF -#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 -_ACEOF - -fi -done - - else - - echo "$as_me:$LINENO: checking for _sqrtl declaration" >&5 -echo $ECHO_N "checking for _sqrtl declaration... $ECHO_C" >&6 - if test x${glibcxx_cv_func__sqrtl_use+set} != xset; then - if test "${glibcxx_cv_func__sqrtl_use+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - - - - ac_ext=cc -ac_cpp='$CXXCPP $CPPFLAGS' -ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_cxx_compiler_gnu - - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include - #ifdef HAVE_IEEEFP_H - #include - #endif - -int -main () -{ - _sqrtl(0); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - glibcxx_cv_func__sqrtl_use=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -glibcxx_cv_func__sqrtl_use=no -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext - ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - - -fi - - fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__sqrtl_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__sqrtl_use" >&6 - - if test x$glibcxx_cv_func__sqrtl_use = x"yes"; then - -for ac_func in _sqrtl -do -as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test x$gcc_no_link = xyes; then - { { echo "$as_me:$LINENO: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&5 -echo "$as_me: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&2;} - { (exit 1); exit 1; }; } -fi -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -/* Define $ac_func to an innocuous variant, in case declares $ac_func. - For example, HP-UX 11i declares gettimeofday. */ -#define $ac_func innocuous_$ac_func - -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char $ac_func (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ - -#ifdef __STDC__ -# include -#else -# include -#endif - -#undef $ac_func - -/* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -104131,16 +99270,15 @@ done - echo "$as_me:$LINENO: checking for sincosl declaration" >&5 -echo $ECHO_N "checking for sincosl declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for sincosl declaration" >&5 +echo $ECHO_N "checking for sincosl declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func_sincosl_use+set} != xset; then if test "${glibcxx_cv_func_sincosl_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -104162,35 +99300,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func_sincosl_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_sincosl_use=no + glibcxx_cv_func_sincosl_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -104201,17 +99335,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_sincosl_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_sincosl_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_sincosl_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_sincosl_use" >&6; } if test x$glibcxx_cv_func_sincosl_use = x"yes"; then for ac_func in sincosl do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -104242,68 +99376,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -104314,16 +99440,15 @@ done else - echo "$as_me:$LINENO: checking for _sincosl declaration" >&5 -echo $ECHO_N "checking for _sincosl declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for _sincosl declaration" >&5 +echo $ECHO_N "checking for _sincosl declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func__sincosl_use+set} != xset; then if test "${glibcxx_cv_func__sincosl_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -104345,35 +99470,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func__sincosl_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func__sincosl_use=no + glibcxx_cv_func__sincosl_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -104384,17 +99505,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__sincosl_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__sincosl_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__sincosl_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__sincosl_use" >&6; } if test x$glibcxx_cv_func__sincosl_use = x"yes"; then for ac_func in _sincosl do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -104425,68 +99546,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -104503,16 +99616,15 @@ done - echo "$as_me:$LINENO: checking for finitel declaration" >&5 -echo $ECHO_N "checking for finitel declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for finitel declaration" >&5 +echo $ECHO_N "checking for finitel declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func_finitel_use+set} != xset; then if test "${glibcxx_cv_func_finitel_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -104538,35 +99650,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func_finitel_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_finitel_use=no + glibcxx_cv_func_finitel_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -104577,17 +99685,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_finitel_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_finitel_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_finitel_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_finitel_use" >&6; } if test x$glibcxx_cv_func_finitel_use = x"yes"; then for ac_func in finitel do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -104618,68 +99726,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -104690,16 +99790,15 @@ done else - echo "$as_me:$LINENO: checking for _finitel declaration" >&5 -echo $ECHO_N "checking for _finitel declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for _finitel declaration" >&5 +echo $ECHO_N "checking for _finitel declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func__finitel_use+set} != xset; then if test "${glibcxx_cv_func__finitel_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -104725,35 +99824,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func__finitel_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func__finitel_use=no + glibcxx_cv_func__finitel_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -104764,17 +99859,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func__finitel_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func__finitel_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func__finitel_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func__finitel_use" >&6; } if test x$glibcxx_cv_func__finitel_use = x"yes"; then for ac_func in _finitel do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -104805,68 +99900,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -104887,16 +99974,15 @@ done - echo "$as_me:$LINENO: checking for __builtin_abs declaration" >&5 -echo $ECHO_N "checking for __builtin_abs declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for __builtin_abs declaration" >&5 +echo $ECHO_N "checking for __builtin_abs declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func___builtin_abs_use+set} != xset; then if test "${glibcxx_cv_func___builtin_abs_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -104918,35 +100004,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func___builtin_abs_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func___builtin_abs_use=no + glibcxx_cv_func___builtin_abs_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -104957,11 +100039,11 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_abs_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func___builtin_abs_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_abs_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func___builtin_abs_use" >&6; } if test x$glibcxx_cv_func___builtin_abs_use = x"yes"; then - echo "$as_me:$LINENO: checking for __builtin_abs linkage" >&5 -echo $ECHO_N "checking for __builtin_abs linkage... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for __builtin_abs linkage" >&5 +echo $ECHO_N "checking for __builtin_abs linkage... $ECHO_C" >&6; } if test x${glibcxx_cv_func___builtin_abs_link+set} != xset; then if test "${glibcxx_cv_func___builtin_abs_link+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 @@ -104988,42 +100070,39 @@ main () } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then glibcxx_cv_func___builtin_abs_link=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func___builtin_abs_link=no + glibcxx_cv_func___builtin_abs_link=no fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_abs_link" >&5 -echo "${ECHO_T}$glibcxx_cv_func___builtin_abs_link" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_abs_link" >&5 +echo "${ECHO_T}$glibcxx_cv_func___builtin_abs_link" >&6; } if test x$glibcxx_cv_func___builtin_abs_link = x"yes"; then @@ -105036,16 +100115,15 @@ _ACEOF fi - echo "$as_me:$LINENO: checking for __builtin_fabsf declaration" >&5 -echo $ECHO_N "checking for __builtin_fabsf declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for __builtin_fabsf declaration" >&5 +echo $ECHO_N "checking for __builtin_fabsf declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func___builtin_fabsf_use+set} != xset; then if test "${glibcxx_cv_func___builtin_fabsf_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -105067,35 +100145,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func___builtin_fabsf_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func___builtin_fabsf_use=no + glibcxx_cv_func___builtin_fabsf_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -105106,11 +100180,11 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_fabsf_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func___builtin_fabsf_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_fabsf_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func___builtin_fabsf_use" >&6; } if test x$glibcxx_cv_func___builtin_fabsf_use = x"yes"; then - echo "$as_me:$LINENO: checking for __builtin_fabsf linkage" >&5 -echo $ECHO_N "checking for __builtin_fabsf linkage... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for __builtin_fabsf linkage" >&5 +echo $ECHO_N "checking for __builtin_fabsf linkage... $ECHO_C" >&6; } if test x${glibcxx_cv_func___builtin_fabsf_link+set} != xset; then if test "${glibcxx_cv_func___builtin_fabsf_link+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 @@ -105137,42 +100211,39 @@ main () } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then glibcxx_cv_func___builtin_fabsf_link=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func___builtin_fabsf_link=no + glibcxx_cv_func___builtin_fabsf_link=no fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_fabsf_link" >&5 -echo "${ECHO_T}$glibcxx_cv_func___builtin_fabsf_link" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_fabsf_link" >&5 +echo "${ECHO_T}$glibcxx_cv_func___builtin_fabsf_link" >&6; } if test x$glibcxx_cv_func___builtin_fabsf_link = x"yes"; then @@ -105185,16 +100256,15 @@ _ACEOF fi - echo "$as_me:$LINENO: checking for __builtin_fabs declaration" >&5 -echo $ECHO_N "checking for __builtin_fabs declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for __builtin_fabs declaration" >&5 +echo $ECHO_N "checking for __builtin_fabs declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func___builtin_fabs_use+set} != xset; then if test "${glibcxx_cv_func___builtin_fabs_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -105216,35 +100286,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func___builtin_fabs_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func___builtin_fabs_use=no + glibcxx_cv_func___builtin_fabs_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -105255,11 +100321,11 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_fabs_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func___builtin_fabs_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_fabs_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func___builtin_fabs_use" >&6; } if test x$glibcxx_cv_func___builtin_fabs_use = x"yes"; then - echo "$as_me:$LINENO: checking for __builtin_fabs linkage" >&5 -echo $ECHO_N "checking for __builtin_fabs linkage... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for __builtin_fabs linkage" >&5 +echo $ECHO_N "checking for __builtin_fabs linkage... $ECHO_C" >&6; } if test x${glibcxx_cv_func___builtin_fabs_link+set} != xset; then if test "${glibcxx_cv_func___builtin_fabs_link+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 @@ -105286,42 +100352,39 @@ main () } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then glibcxx_cv_func___builtin_fabs_link=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func___builtin_fabs_link=no + glibcxx_cv_func___builtin_fabs_link=no fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_fabs_link" >&5 -echo "${ECHO_T}$glibcxx_cv_func___builtin_fabs_link" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_fabs_link" >&5 +echo "${ECHO_T}$glibcxx_cv_func___builtin_fabs_link" >&6; } if test x$glibcxx_cv_func___builtin_fabs_link = x"yes"; then @@ -105334,16 +100397,15 @@ _ACEOF fi - echo "$as_me:$LINENO: checking for __builtin_fabsl declaration" >&5 -echo $ECHO_N "checking for __builtin_fabsl declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for __builtin_fabsl declaration" >&5 +echo $ECHO_N "checking for __builtin_fabsl declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func___builtin_fabsl_use+set} != xset; then if test "${glibcxx_cv_func___builtin_fabsl_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -105365,35 +100427,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func___builtin_fabsl_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func___builtin_fabsl_use=no + glibcxx_cv_func___builtin_fabsl_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -105404,11 +100462,11 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_fabsl_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func___builtin_fabsl_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_fabsl_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func___builtin_fabsl_use" >&6; } if test x$glibcxx_cv_func___builtin_fabsl_use = x"yes"; then - echo "$as_me:$LINENO: checking for __builtin_fabsl linkage" >&5 -echo $ECHO_N "checking for __builtin_fabsl linkage... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for __builtin_fabsl linkage" >&5 +echo $ECHO_N "checking for __builtin_fabsl linkage... $ECHO_C" >&6; } if test x${glibcxx_cv_func___builtin_fabsl_link+set} != xset; then if test "${glibcxx_cv_func___builtin_fabsl_link+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 @@ -105435,42 +100493,39 @@ main () } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then glibcxx_cv_func___builtin_fabsl_link=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func___builtin_fabsl_link=no + glibcxx_cv_func___builtin_fabsl_link=no fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_fabsl_link" >&5 -echo "${ECHO_T}$glibcxx_cv_func___builtin_fabsl_link" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_fabsl_link" >&5 +echo "${ECHO_T}$glibcxx_cv_func___builtin_fabsl_link" >&6; } if test x$glibcxx_cv_func___builtin_fabsl_link = x"yes"; then @@ -105483,16 +100538,15 @@ _ACEOF fi - echo "$as_me:$LINENO: checking for __builtin_labs declaration" >&5 -echo $ECHO_N "checking for __builtin_labs declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for __builtin_labs declaration" >&5 +echo $ECHO_N "checking for __builtin_labs declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func___builtin_labs_use+set} != xset; then if test "${glibcxx_cv_func___builtin_labs_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -105514,35 +100568,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func___builtin_labs_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func___builtin_labs_use=no + glibcxx_cv_func___builtin_labs_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -105553,11 +100603,11 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_labs_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func___builtin_labs_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_labs_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func___builtin_labs_use" >&6; } if test x$glibcxx_cv_func___builtin_labs_use = x"yes"; then - echo "$as_me:$LINENO: checking for __builtin_labs linkage" >&5 -echo $ECHO_N "checking for __builtin_labs linkage... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for __builtin_labs linkage" >&5 +echo $ECHO_N "checking for __builtin_labs linkage... $ECHO_C" >&6; } if test x${glibcxx_cv_func___builtin_labs_link+set} != xset; then if test "${glibcxx_cv_func___builtin_labs_link+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 @@ -105584,42 +100634,39 @@ main () } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then glibcxx_cv_func___builtin_labs_link=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func___builtin_labs_link=no + glibcxx_cv_func___builtin_labs_link=no fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_labs_link" >&5 -echo "${ECHO_T}$glibcxx_cv_func___builtin_labs_link" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_labs_link" >&5 +echo "${ECHO_T}$glibcxx_cv_func___builtin_labs_link" >&6; } if test x$glibcxx_cv_func___builtin_labs_link = x"yes"; then @@ -105633,16 +100680,15 @@ _ACEOF - echo "$as_me:$LINENO: checking for __builtin_sqrtf declaration" >&5 -echo $ECHO_N "checking for __builtin_sqrtf declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for __builtin_sqrtf declaration" >&5 +echo $ECHO_N "checking for __builtin_sqrtf declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func___builtin_sqrtf_use+set} != xset; then if test "${glibcxx_cv_func___builtin_sqrtf_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -105664,35 +100710,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func___builtin_sqrtf_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func___builtin_sqrtf_use=no + glibcxx_cv_func___builtin_sqrtf_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -105703,11 +100745,11 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_sqrtf_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func___builtin_sqrtf_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_sqrtf_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func___builtin_sqrtf_use" >&6; } if test x$glibcxx_cv_func___builtin_sqrtf_use = x"yes"; then - echo "$as_me:$LINENO: checking for __builtin_sqrtf linkage" >&5 -echo $ECHO_N "checking for __builtin_sqrtf linkage... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for __builtin_sqrtf linkage" >&5 +echo $ECHO_N "checking for __builtin_sqrtf linkage... $ECHO_C" >&6; } if test x${glibcxx_cv_func___builtin_sqrtf_link+set} != xset; then if test "${glibcxx_cv_func___builtin_sqrtf_link+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 @@ -105734,42 +100776,39 @@ main () } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then glibcxx_cv_func___builtin_sqrtf_link=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func___builtin_sqrtf_link=no + glibcxx_cv_func___builtin_sqrtf_link=no fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_sqrtf_link" >&5 -echo "${ECHO_T}$glibcxx_cv_func___builtin_sqrtf_link" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_sqrtf_link" >&5 +echo "${ECHO_T}$glibcxx_cv_func___builtin_sqrtf_link" >&6; } if test x$glibcxx_cv_func___builtin_sqrtf_link = x"yes"; then @@ -105782,16 +100821,15 @@ _ACEOF fi - echo "$as_me:$LINENO: checking for __builtin_sqrt declaration" >&5 -echo $ECHO_N "checking for __builtin_sqrt declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for __builtin_sqrt declaration" >&5 +echo $ECHO_N "checking for __builtin_sqrt declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func___builtin_sqrt_use+set} != xset; then if test "${glibcxx_cv_func___builtin_sqrt_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -105813,35 +100851,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func___builtin_sqrt_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func___builtin_sqrt_use=no + glibcxx_cv_func___builtin_sqrt_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -105852,11 +100886,11 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_sqrt_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func___builtin_sqrt_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_sqrt_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func___builtin_sqrt_use" >&6; } if test x$glibcxx_cv_func___builtin_sqrt_use = x"yes"; then - echo "$as_me:$LINENO: checking for __builtin_sqrt linkage" >&5 -echo $ECHO_N "checking for __builtin_sqrt linkage... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for __builtin_sqrt linkage" >&5 +echo $ECHO_N "checking for __builtin_sqrt linkage... $ECHO_C" >&6; } if test x${glibcxx_cv_func___builtin_sqrt_link+set} != xset; then if test "${glibcxx_cv_func___builtin_sqrt_link+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 @@ -105883,42 +100917,39 @@ main () } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then glibcxx_cv_func___builtin_sqrt_link=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func___builtin_sqrt_link=no + glibcxx_cv_func___builtin_sqrt_link=no fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_sqrt_link" >&5 -echo "${ECHO_T}$glibcxx_cv_func___builtin_sqrt_link" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_sqrt_link" >&5 +echo "${ECHO_T}$glibcxx_cv_func___builtin_sqrt_link" >&6; } if test x$glibcxx_cv_func___builtin_sqrt_link = x"yes"; then @@ -105931,16 +100962,15 @@ _ACEOF fi - echo "$as_me:$LINENO: checking for __builtin_sqrtl declaration" >&5 -echo $ECHO_N "checking for __builtin_sqrtl declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for __builtin_sqrtl declaration" >&5 +echo $ECHO_N "checking for __builtin_sqrtl declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func___builtin_sqrtl_use+set} != xset; then if test "${glibcxx_cv_func___builtin_sqrtl_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -105962,35 +100992,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func___builtin_sqrtl_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func___builtin_sqrtl_use=no + glibcxx_cv_func___builtin_sqrtl_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -106001,11 +101027,11 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_sqrtl_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func___builtin_sqrtl_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_sqrtl_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func___builtin_sqrtl_use" >&6; } if test x$glibcxx_cv_func___builtin_sqrtl_use = x"yes"; then - echo "$as_me:$LINENO: checking for __builtin_sqrtl linkage" >&5 -echo $ECHO_N "checking for __builtin_sqrtl linkage... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for __builtin_sqrtl linkage" >&5 +echo $ECHO_N "checking for __builtin_sqrtl linkage... $ECHO_C" >&6; } if test x${glibcxx_cv_func___builtin_sqrtl_link+set} != xset; then if test "${glibcxx_cv_func___builtin_sqrtl_link+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 @@ -106032,42 +101058,39 @@ main () } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then glibcxx_cv_func___builtin_sqrtl_link=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func___builtin_sqrtl_link=no + glibcxx_cv_func___builtin_sqrtl_link=no fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_sqrtl_link" >&5 -echo "${ECHO_T}$glibcxx_cv_func___builtin_sqrtl_link" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_sqrtl_link" >&5 +echo "${ECHO_T}$glibcxx_cv_func___builtin_sqrtl_link" >&6; } if test x$glibcxx_cv_func___builtin_sqrtl_link = x"yes"; then @@ -106081,16 +101104,15 @@ _ACEOF - echo "$as_me:$LINENO: checking for __builtin_sinf declaration" >&5 -echo $ECHO_N "checking for __builtin_sinf declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for __builtin_sinf declaration" >&5 +echo $ECHO_N "checking for __builtin_sinf declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func___builtin_sinf_use+set} != xset; then if test "${glibcxx_cv_func___builtin_sinf_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -106112,35 +101134,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func___builtin_sinf_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func___builtin_sinf_use=no + glibcxx_cv_func___builtin_sinf_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -106151,11 +101169,11 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_sinf_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func___builtin_sinf_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_sinf_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func___builtin_sinf_use" >&6; } if test x$glibcxx_cv_func___builtin_sinf_use = x"yes"; then - echo "$as_me:$LINENO: checking for __builtin_sinf linkage" >&5 -echo $ECHO_N "checking for __builtin_sinf linkage... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for __builtin_sinf linkage" >&5 +echo $ECHO_N "checking for __builtin_sinf linkage... $ECHO_C" >&6; } if test x${glibcxx_cv_func___builtin_sinf_link+set} != xset; then if test "${glibcxx_cv_func___builtin_sinf_link+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 @@ -106182,42 +101200,39 @@ main () } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then glibcxx_cv_func___builtin_sinf_link=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func___builtin_sinf_link=no + glibcxx_cv_func___builtin_sinf_link=no fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_sinf_link" >&5 -echo "${ECHO_T}$glibcxx_cv_func___builtin_sinf_link" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_sinf_link" >&5 +echo "${ECHO_T}$glibcxx_cv_func___builtin_sinf_link" >&6; } if test x$glibcxx_cv_func___builtin_sinf_link = x"yes"; then @@ -106230,16 +101245,15 @@ _ACEOF fi - echo "$as_me:$LINENO: checking for __builtin_sin declaration" >&5 -echo $ECHO_N "checking for __builtin_sin declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for __builtin_sin declaration" >&5 +echo $ECHO_N "checking for __builtin_sin declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func___builtin_sin_use+set} != xset; then if test "${glibcxx_cv_func___builtin_sin_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -106261,35 +101275,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func___builtin_sin_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func___builtin_sin_use=no + glibcxx_cv_func___builtin_sin_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -106300,11 +101310,11 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_sin_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func___builtin_sin_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_sin_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func___builtin_sin_use" >&6; } if test x$glibcxx_cv_func___builtin_sin_use = x"yes"; then - echo "$as_me:$LINENO: checking for __builtin_sin linkage" >&5 -echo $ECHO_N "checking for __builtin_sin linkage... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for __builtin_sin linkage" >&5 +echo $ECHO_N "checking for __builtin_sin linkage... $ECHO_C" >&6; } if test x${glibcxx_cv_func___builtin_sin_link+set} != xset; then if test "${glibcxx_cv_func___builtin_sin_link+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 @@ -106331,42 +101341,39 @@ main () } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then glibcxx_cv_func___builtin_sin_link=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func___builtin_sin_link=no + glibcxx_cv_func___builtin_sin_link=no fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_sin_link" >&5 -echo "${ECHO_T}$glibcxx_cv_func___builtin_sin_link" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_sin_link" >&5 +echo "${ECHO_T}$glibcxx_cv_func___builtin_sin_link" >&6; } if test x$glibcxx_cv_func___builtin_sin_link = x"yes"; then @@ -106379,16 +101386,15 @@ _ACEOF fi - echo "$as_me:$LINENO: checking for __builtin_sinl declaration" >&5 -echo $ECHO_N "checking for __builtin_sinl declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for __builtin_sinl declaration" >&5 +echo $ECHO_N "checking for __builtin_sinl declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func___builtin_sinl_use+set} != xset; then if test "${glibcxx_cv_func___builtin_sinl_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -106410,35 +101416,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func___builtin_sinl_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func___builtin_sinl_use=no + glibcxx_cv_func___builtin_sinl_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -106449,11 +101451,11 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_sinl_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func___builtin_sinl_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_sinl_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func___builtin_sinl_use" >&6; } if test x$glibcxx_cv_func___builtin_sinl_use = x"yes"; then - echo "$as_me:$LINENO: checking for __builtin_sinl linkage" >&5 -echo $ECHO_N "checking for __builtin_sinl linkage... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for __builtin_sinl linkage" >&5 +echo $ECHO_N "checking for __builtin_sinl linkage... $ECHO_C" >&6; } if test x${glibcxx_cv_func___builtin_sinl_link+set} != xset; then if test "${glibcxx_cv_func___builtin_sinl_link+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 @@ -106480,42 +101482,39 @@ main () } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then glibcxx_cv_func___builtin_sinl_link=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func___builtin_sinl_link=no + glibcxx_cv_func___builtin_sinl_link=no fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_sinl_link" >&5 -echo "${ECHO_T}$glibcxx_cv_func___builtin_sinl_link" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_sinl_link" >&5 +echo "${ECHO_T}$glibcxx_cv_func___builtin_sinl_link" >&6; } if test x$glibcxx_cv_func___builtin_sinl_link = x"yes"; then @@ -106529,16 +101528,15 @@ _ACEOF - echo "$as_me:$LINENO: checking for __builtin_cosf declaration" >&5 -echo $ECHO_N "checking for __builtin_cosf declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for __builtin_cosf declaration" >&5 +echo $ECHO_N "checking for __builtin_cosf declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func___builtin_cosf_use+set} != xset; then if test "${glibcxx_cv_func___builtin_cosf_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -106560,35 +101558,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func___builtin_cosf_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func___builtin_cosf_use=no + glibcxx_cv_func___builtin_cosf_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -106599,11 +101593,11 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_cosf_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func___builtin_cosf_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_cosf_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func___builtin_cosf_use" >&6; } if test x$glibcxx_cv_func___builtin_cosf_use = x"yes"; then - echo "$as_me:$LINENO: checking for __builtin_cosf linkage" >&5 -echo $ECHO_N "checking for __builtin_cosf linkage... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for __builtin_cosf linkage" >&5 +echo $ECHO_N "checking for __builtin_cosf linkage... $ECHO_C" >&6; } if test x${glibcxx_cv_func___builtin_cosf_link+set} != xset; then if test "${glibcxx_cv_func___builtin_cosf_link+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 @@ -106630,42 +101624,39 @@ main () } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then glibcxx_cv_func___builtin_cosf_link=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func___builtin_cosf_link=no + glibcxx_cv_func___builtin_cosf_link=no fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_cosf_link" >&5 -echo "${ECHO_T}$glibcxx_cv_func___builtin_cosf_link" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_cosf_link" >&5 +echo "${ECHO_T}$glibcxx_cv_func___builtin_cosf_link" >&6; } if test x$glibcxx_cv_func___builtin_cosf_link = x"yes"; then @@ -106678,16 +101669,15 @@ _ACEOF fi - echo "$as_me:$LINENO: checking for __builtin_cos declaration" >&5 -echo $ECHO_N "checking for __builtin_cos declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for __builtin_cos declaration" >&5 +echo $ECHO_N "checking for __builtin_cos declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func___builtin_cos_use+set} != xset; then if test "${glibcxx_cv_func___builtin_cos_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -106709,35 +101699,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func___builtin_cos_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func___builtin_cos_use=no + glibcxx_cv_func___builtin_cos_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -106748,11 +101734,11 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_cos_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func___builtin_cos_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_cos_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func___builtin_cos_use" >&6; } if test x$glibcxx_cv_func___builtin_cos_use = x"yes"; then - echo "$as_me:$LINENO: checking for __builtin_cos linkage" >&5 -echo $ECHO_N "checking for __builtin_cos linkage... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for __builtin_cos linkage" >&5 +echo $ECHO_N "checking for __builtin_cos linkage... $ECHO_C" >&6; } if test x${glibcxx_cv_func___builtin_cos_link+set} != xset; then if test "${glibcxx_cv_func___builtin_cos_link+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 @@ -106779,42 +101765,39 @@ main () } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then glibcxx_cv_func___builtin_cos_link=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func___builtin_cos_link=no + glibcxx_cv_func___builtin_cos_link=no fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_cos_link" >&5 -echo "${ECHO_T}$glibcxx_cv_func___builtin_cos_link" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_cos_link" >&5 +echo "${ECHO_T}$glibcxx_cv_func___builtin_cos_link" >&6; } if test x$glibcxx_cv_func___builtin_cos_link = x"yes"; then @@ -106827,16 +101810,15 @@ _ACEOF fi - echo "$as_me:$LINENO: checking for __builtin_cosl declaration" >&5 -echo $ECHO_N "checking for __builtin_cosl declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for __builtin_cosl declaration" >&5 +echo $ECHO_N "checking for __builtin_cosl declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func___builtin_cosl_use+set} != xset; then if test "${glibcxx_cv_func___builtin_cosl_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -106858,35 +101840,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func___builtin_cosl_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func___builtin_cosl_use=no + glibcxx_cv_func___builtin_cosl_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -106897,11 +101875,11 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_cosl_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func___builtin_cosl_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_cosl_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func___builtin_cosl_use" >&6; } if test x$glibcxx_cv_func___builtin_cosl_use = x"yes"; then - echo "$as_me:$LINENO: checking for __builtin_cosl linkage" >&5 -echo $ECHO_N "checking for __builtin_cosl linkage... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for __builtin_cosl linkage" >&5 +echo $ECHO_N "checking for __builtin_cosl linkage... $ECHO_C" >&6; } if test x${glibcxx_cv_func___builtin_cosl_link+set} != xset; then if test "${glibcxx_cv_func___builtin_cosl_link+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 @@ -106928,42 +101906,39 @@ main () } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then glibcxx_cv_func___builtin_cosl_link=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func___builtin_cosl_link=no + glibcxx_cv_func___builtin_cosl_link=no fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_cosl_link" >&5 -echo "${ECHO_T}$glibcxx_cv_func___builtin_cosl_link" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func___builtin_cosl_link" >&5 +echo "${ECHO_T}$glibcxx_cv_func___builtin_cosl_link" >&6; } if test x$glibcxx_cv_func___builtin_cosl_link = x"yes"; then @@ -106978,8 +101953,8 @@ _ACEOF -echo "$as_me:$LINENO: checking for main in -lm" >&5 -echo $ECHO_N "checking for main in -lm... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking for main in -lm" >&5 +echo $ECHO_N "checking for main in -lm... $ECHO_C" >&6; } if test "${ac_cv_lib_m_main+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -107001,46 +101976,43 @@ cat >>conftest.$ac_ext <<_ACEOF int main () { -main (); +return main (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then ac_cv_lib_m_main=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -ac_cv_lib_m_main=no + ac_cv_lib_m_main=no fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -echo "$as_me:$LINENO: result: $ac_cv_lib_m_main" >&5 -echo "${ECHO_T}$ac_cv_lib_m_main" >&6 +{ echo "$as_me:$LINENO: result: $ac_cv_lib_m_main" >&5 +echo "${ECHO_T}$ac_cv_lib_m_main" >&6; } if test $ac_cv_lib_m_main = yes; then cat >>confdefs.h <<_ACEOF #define HAVE_LIBM 1 @@ -107054,9 +102026,9 @@ fi for ac_func in copysignf do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -107087,68 +102059,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -107164,9 +102128,9 @@ done for ac_func in __signbit do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -107197,68 +102161,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -107274,9 +102230,9 @@ done for ac_func in __signbitf do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -107307,68 +102263,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -107385,9 +102333,9 @@ done for ac_func in __signbitl do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -107418,68 +102366,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -107504,16 +102444,15 @@ done CXXFLAGS='-fno-builtin -D_GNU_SOURCE' - echo "$as_me:$LINENO: checking for strtold declaration" >&5 -echo $ECHO_N "checking for strtold declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for strtold declaration" >&5 +echo $ECHO_N "checking for strtold declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func_strtold_use+set} != xset; then if test "${glibcxx_cv_func_strtold_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -107535,35 +102474,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func_strtold_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_strtold_use=no + glibcxx_cv_func_strtold_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -107574,16 +102509,16 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_strtold_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_strtold_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_strtold_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_strtold_use" >&6; } if test x$glibcxx_cv_func_strtold_use = x"yes"; then for ac_func in strtold do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -107614,68 +102549,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -107690,16 +102617,15 @@ done - echo "$as_me:$LINENO: checking for strtof declaration" >&5 -echo $ECHO_N "checking for strtof declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for strtof declaration" >&5 +echo $ECHO_N "checking for strtof declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func_strtof_use+set} != xset; then if test "${glibcxx_cv_func_strtof_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -107721,35 +102647,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func_strtof_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_strtof_use=no + glibcxx_cv_func_strtof_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -107760,16 +102682,16 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_strtof_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_strtof_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_strtof_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_strtof_use" >&6; } if test x$glibcxx_cv_func_strtof_use = x"yes"; then for ac_func in strtof do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -107800,68 +102722,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -107886,8 +102800,7 @@ _ACEOF - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -107895,8 +102808,8 @@ ac_compiler_gnu=$ac_cv_cxx_compiler_gnu ac_save_CXXFLAGS="$CXXFLAGS" CXXFLAGS="$CXXFLAGS -fno-exceptions" - echo "$as_me:$LINENO: checking for LFS support" >&5 -echo $ECHO_N "checking for LFS support... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for LFS support" >&5 +echo $ECHO_N "checking for LFS support... $ECHO_C" >&6; } if test "${glibcxx_cv_LFS+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -107931,35 +102844,32 @@ FILE* fp; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then glibcxx_cv_LFS=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_LFS=no + glibcxx_cv_LFS=no fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi @@ -107971,8 +102881,8 @@ cat >>confdefs.h <<\_ACEOF _ACEOF fi - echo "$as_me:$LINENO: result: $glibcxx_cv_LFS" >&5 -echo "${ECHO_T}$glibcxx_cv_LFS" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_LFS" >&5 +echo "${ECHO_T}$glibcxx_cv_LFS" >&6; } CXXFLAGS="$ac_save_CXXFLAGS" ac_ext=c ac_cpp='$CPP $CPPFLAGS' @@ -107988,18 +102898,19 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu for ac_header in sys/ioctl.h sys/filio.h do as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + { echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 +ac_res=`eval echo '${'$as_ac_Header'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } else # Is the header compilable? -echo "$as_me:$LINENO: checking $ac_header usability" >&5 -echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking $ac_header usability" >&5 +echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6; } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF @@ -108010,41 +102921,37 @@ $ac_includes_default #include <$ac_header> _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then ac_header_compiler=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -ac_header_compiler=no + ac_header_compiler=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 -echo "${ECHO_T}$ac_header_compiler" >&6 + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +echo "${ECHO_T}$ac_header_compiler" >&6; } # Is the header present? -echo "$as_me:$LINENO: checking $ac_header presence" >&5 -echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking $ac_header presence" >&5 +echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6; } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF @@ -108053,24 +102960,22 @@ cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include <$ac_header> _ACEOF -if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 - (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 +if { (ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null; then - if test -s conftest.err; then - ac_cpp_err=$ac_c_preproc_warn_flag - ac_cpp_err=$ac_cpp_err$ac_c_werror_flag - else - ac_cpp_err= - fi -else - ac_cpp_err=yes -fi -if test -z "$ac_cpp_err"; then + (exit $ac_status); } >/dev/null && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then ac_header_preproc=yes else echo "$as_me: failed program was:" >&5 @@ -108078,9 +102983,10 @@ sed 's/^/| /' conftest.$ac_ext >&5 ac_header_preproc=no fi + rm -f conftest.err conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 -echo "${ECHO_T}$ac_header_preproc" >&6 +{ echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 +echo "${ECHO_T}$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in @@ -108104,25 +103010,19 @@ echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\ echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} - ( - cat <<\_ASBOX -## ----------------------------------------- ## -## Report this to the package-unused lists. ## -## ----------------------------------------- ## -_ASBOX - ) | - sed "s/^/$as_me: WARNING: /" >&2 + ;; esac -echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else eval "$as_ac_Header=\$ac_header_preproc" fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 +ac_res=`eval echo '${'$as_ac_Header'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } fi if test `eval echo '${'$as_ac_Header'}'` = yes; then @@ -108135,8 +103035,8 @@ fi done - echo "$as_me:$LINENO: checking for poll" >&5 -echo $ECHO_N "checking for poll... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for poll" >&5 +echo $ECHO_N "checking for poll... $ECHO_C" >&6; } if test "${glibcxx_cv_POLL+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -108164,35 +103064,32 @@ struct pollfd pfd[1]; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then glibcxx_cv_POLL=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_POLL=no + glibcxx_cv_POLL=no fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi @@ -108204,12 +103101,12 @@ cat >>confdefs.h <<\_ACEOF _ACEOF fi - echo "$as_me:$LINENO: result: $glibcxx_cv_POLL" >&5 -echo "${ECHO_T}$glibcxx_cv_POLL" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_POLL" >&5 +echo "${ECHO_T}$glibcxx_cv_POLL" >&6; } - echo "$as_me:$LINENO: checking for S_ISREG or S_IFREG" >&5 -echo $ECHO_N "checking for S_ISREG or S_IFREG... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for S_ISREG or S_IFREG" >&5 +echo $ECHO_N "checking for S_ISREG or S_IFREG... $ECHO_C" >&6; } if test "${glibcxx_cv_S_ISREG+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -108237,35 +103134,32 @@ struct stat buffer; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then glibcxx_cv_S_ISREG=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_S_ISREG=no + glibcxx_cv_S_ISREG=no fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi @@ -108297,35 +103191,32 @@ struct stat buffer; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then glibcxx_cv_S_IFREG=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_S_IFREG=no + glibcxx_cv_S_IFREG=no fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi @@ -108346,8 +103237,8 @@ _ACEOF res=S_IFREG fi - echo "$as_me:$LINENO: result: $res" >&5 -echo "${ECHO_T}$res" >&6 + { echo "$as_me:$LINENO: result: $res" >&5 +echo "${ECHO_T}$res" >&6; } # For xsputn_2(). @@ -108355,18 +103246,19 @@ echo "${ECHO_T}$res" >&6 for ac_header in sys/uio.h do as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + { echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 +ac_res=`eval echo '${'$as_ac_Header'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } else # Is the header compilable? -echo "$as_me:$LINENO: checking $ac_header usability" >&5 -echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking $ac_header usability" >&5 +echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6; } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF @@ -108377,267 +103269,37 @@ $ac_includes_default #include <$ac_header> _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_header_compiler=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_header_compiler=no -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 -echo "${ECHO_T}$ac_header_compiler" >&6 - -# Is the header present? -echo "$as_me:$LINENO: checking $ac_header presence" >&5 -echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include <$ac_header> -_ACEOF -if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 - (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null; then - if test -s conftest.err; then - ac_cpp_err=$ac_c_preproc_warn_flag - ac_cpp_err=$ac_cpp_err$ac_c_werror_flag - else - ac_cpp_err= - fi -else - ac_cpp_err=yes -fi -if test -z "$ac_cpp_err"; then - ac_header_preproc=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_preproc=no -fi -rm -f conftest.err conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 -echo "${ECHO_T}$ac_header_preproc" >&6 - -# So? What about this header? -case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in - yes:no: ) - { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 -echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} - ac_header_preproc=yes - ;; - no:yes:* ) - { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 -echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 -echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 -echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 -echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 -echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} - ( - cat <<\_ASBOX -## ----------------------------------------- ## -## Report this to the package-unused lists. ## -## ----------------------------------------- ## -_ASBOX - ) | - sed "s/^/$as_me: WARNING: /" >&2 - ;; +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; esac -echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - eval "$as_ac_Header=\$ac_header_preproc" -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 - -fi -if test `eval echo '${'$as_ac_Header'}'` = yes; then - cat >>confdefs.h <<_ACEOF -#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 -_ACEOF - -fi - -done - - - echo "$as_me:$LINENO: checking for writev" >&5 -echo $ECHO_N "checking for writev... $ECHO_C" >&6 - if test "${glibcxx_cv_WRITEV+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - - if test x$gcc_no_link = xyes; then - { { echo "$as_me:$LINENO: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&5 -echo "$as_me: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&2;} - { (exit 1); exit 1; }; } -fi -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include -int -main () -{ -struct iovec iov[2]; - writev(0, iov, 0); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - glibcxx_cv_WRITEV=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -glibcxx_cv_WRITEV=no -fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - -fi - - if test $glibcxx_cv_WRITEV = yes; then - -cat >>confdefs.h <<\_ACEOF -#define HAVE_WRITEV 1 -_ACEOF - - fi - echo "$as_me:$LINENO: result: $glibcxx_cv_WRITEV" >&5 -echo "${ECHO_T}$glibcxx_cv_WRITEV" >&6 - - ;; - *-mingw32*) - - - -for ac_header in sys/types.h locale.h float.h -do -as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 -else - # Is the header compilable? -echo "$as_me:$LINENO: checking $ac_header usability" >&5 -echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -#include <$ac_header> -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then ac_header_compiler=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -ac_header_compiler=no + ac_header_compiler=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 -echo "${ECHO_T}$ac_header_compiler" >&6 + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +echo "${ECHO_T}$ac_header_compiler" >&6; } # Is the header present? -echo "$as_me:$LINENO: checking $ac_header presence" >&5 -echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking $ac_header presence" >&5 +echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6; } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF @@ -108646,24 +103308,22 @@ cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include <$ac_header> _ACEOF -if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 - (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 +if { (ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null; then - if test -s conftest.err; then - ac_cpp_err=$ac_c_preproc_warn_flag - ac_cpp_err=$ac_cpp_err$ac_c_werror_flag - else - ac_cpp_err= - fi -else - ac_cpp_err=yes -fi -if test -z "$ac_cpp_err"; then + (exit $ac_status); } >/dev/null && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then ac_header_preproc=yes else echo "$as_me: failed program was:" >&5 @@ -108671,9 +103331,10 @@ sed 's/^/| /' conftest.$ac_ext >&5 ac_header_preproc=no fi + rm -f conftest.err conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 -echo "${ECHO_T}$ac_header_preproc" >&6 +{ echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 +echo "${ECHO_T}$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in @@ -108697,25 +103358,1270 @@ echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\ echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} - ( - cat <<\_ASBOX -## ----------------------------------------- ## -## Report this to the package-unused lists. ## -## ----------------------------------------- ## -_ASBOX - ) | - sed "s/^/$as_me: WARNING: /" >&2 + + ;; +esac +{ echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + eval "$as_ac_Header=\$ac_header_preproc" +fi +ac_res=`eval echo '${'$as_ac_Header'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } + +fi +if test `eval echo '${'$as_ac_Header'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + + { echo "$as_me:$LINENO: checking for writev" >&5 +echo $ECHO_N "checking for writev... $ECHO_C" >&6; } + if test "${glibcxx_cv_WRITEV+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + if test x$gcc_no_link = xyes; then + { { echo "$as_me:$LINENO: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&5 +echo "$as_me: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&2;} + { (exit 1); exit 1; }; } +fi +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +int +main () +{ +struct iovec iov[2]; + writev(0, iov, 0); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then + glibcxx_cv_WRITEV=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + glibcxx_cv_WRITEV=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext + +fi + + if test $glibcxx_cv_WRITEV = yes; then + +cat >>confdefs.h <<\_ACEOF +#define HAVE_WRITEV 1 +_ACEOF + + fi + { echo "$as_me:$LINENO: result: $glibcxx_cv_WRITEV" >&5 +echo "${ECHO_T}$glibcxx_cv_WRITEV" >&6; } + + + # For C99 support to TR1. + + + + ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + + + # Use -std=c++98 because the default (-std=gnu++98) leaves __STRICT_ANSI__ + # undefined and fake C99 facilities may be spuriously enabled. + ac_save_CXXFLAGS="$CXXFLAGS" + CXXFLAGS="$CXXFLAGS -std=c++98" + + # Check for the existence of complex math functions used + # by tr1/complex. + +for ac_header in complex.h +do +as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + { echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +fi +ac_res=`eval echo '${'$as_ac_Header'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } +else + # Is the header compilable? +{ echo "$as_me:$LINENO: checking $ac_header usability" >&5 +echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6; } +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +#include <$ac_header> +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_header_compiler=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_compiler=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +echo "${ECHO_T}$ac_header_compiler" >&6; } + +# Is the header present? +{ echo "$as_me:$LINENO: checking $ac_header presence" >&5 +echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6; } +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include <$ac_header> +_ACEOF +if { (ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || + test ! -s conftest.err + }; then + ac_header_preproc=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_preproc=no +fi + +rm -f conftest.err conftest.$ac_ext +{ echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 +echo "${ECHO_T}$ac_header_preproc" >&6; } + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc:$ac_cxx_preproc_warn_flag in + yes:no: ) + { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 +echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 +echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} + ac_header_preproc=yes + ;; + no:yes:* ) + { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 +echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 +echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 +echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 +echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 +echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 +echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} + + ;; +esac +{ echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + eval "$as_ac_Header=\$ac_header_preproc" +fi +ac_res=`eval echo '${'$as_ac_Header'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } + +fi +if test `eval echo '${'$as_ac_Header'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + ac_has_complex_h=yes +else + ac_has_complex_h=no +fi + +done + + ac_c99_complex_tr1=no; + if test x"$ac_has_complex_h" = x"yes"; then + { echo "$as_me:$LINENO: checking for ISO C99 support to TR1 in " >&5 +echo $ECHO_N "checking for ISO C99 support to TR1 in ... $ECHO_C" >&6; } + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +int +main () +{ +typedef __complex__ float float_type; float_type tmpf; + cacosf(tmpf); + casinf(tmpf); + catanf(tmpf); + cacoshf(tmpf); + casinhf(tmpf); + catanhf(tmpf); + typedef __complex__ double double_type; double_type tmpd; + cacos(tmpd); + casin(tmpd); + catan(tmpd); + cacosh(tmpd); + casinh(tmpd); + catanh(tmpd); + typedef __complex__ long double ld_type; ld_type tmpld; + cacosl(tmpld); + casinl(tmpld); + catanl(tmpld); + cacoshl(tmpld); + casinhl(tmpld); + catanhl(tmpld); + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_c99_complex_tr1=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_c99_complex_tr1=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + fi + { echo "$as_me:$LINENO: result: $ac_c99_complex_tr1" >&5 +echo "${ECHO_T}$ac_c99_complex_tr1" >&6; } + if test x"$ac_c99_complex_tr1" = x"yes"; then + +cat >>confdefs.h <<\_ACEOF +#define _GLIBCXX_USE_C99_COMPLEX_TR1 1 +_ACEOF + + fi + + # Check for the existence of functions. + { echo "$as_me:$LINENO: checking for ISO C99 support to TR1 in " >&5 +echo $ECHO_N "checking for ISO C99 support to TR1 in ... $ECHO_C" >&6; } + if test "${ac_c99_ctype_tr1+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +int +main () +{ +int ch; + int ret; + ret = isblank(ch); + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_c99_ctype_tr1=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_c99_ctype_tr1=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +fi + + { echo "$as_me:$LINENO: result: $ac_c99_ctype_tr1" >&5 +echo "${ECHO_T}$ac_c99_ctype_tr1" >&6; } + if test x"$ac_c99_ctype_tr1" = x"yes"; then + +cat >>confdefs.h <<\_ACEOF +#define _GLIBCXX_USE_C99_CTYPE_TR1 1 +_ACEOF + + fi + + # Check for the existence of functions. + +for ac_header in fenv.h +do +as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + { echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +fi +ac_res=`eval echo '${'$as_ac_Header'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } +else + # Is the header compilable? +{ echo "$as_me:$LINENO: checking $ac_header usability" >&5 +echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6; } +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +#include <$ac_header> +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_header_compiler=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_compiler=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +echo "${ECHO_T}$ac_header_compiler" >&6; } + +# Is the header present? +{ echo "$as_me:$LINENO: checking $ac_header presence" >&5 +echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6; } +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include <$ac_header> +_ACEOF +if { (ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || + test ! -s conftest.err + }; then + ac_header_preproc=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_preproc=no +fi + +rm -f conftest.err conftest.$ac_ext +{ echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 +echo "${ECHO_T}$ac_header_preproc" >&6; } + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc:$ac_cxx_preproc_warn_flag in + yes:no: ) + { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 +echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 +echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} + ac_header_preproc=yes + ;; + no:yes:* ) + { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 +echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 +echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 +echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 +echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 +echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 +echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} + + ;; +esac +{ echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + eval "$as_ac_Header=\$ac_header_preproc" +fi +ac_res=`eval echo '${'$as_ac_Header'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } + +fi +if test `eval echo '${'$as_ac_Header'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + ac_has_fenv_h=yes +else + ac_has_fenv_h=no +fi + +done + + ac_c99_fenv_tr1=no; + if test x"$ac_has_fenv_h" = x"yes"; then + { echo "$as_me:$LINENO: checking for ISO C99 support to TR1 in " >&5 +echo $ECHO_N "checking for ISO C99 support to TR1 in ... $ECHO_C" >&6; } + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +int +main () +{ +int except, mode; + fexcept_t* pflag; + fenv_t* penv; + int ret; + ret = feclearexcept(except); + ret = fegetexceptflag(pflag, except); + ret = feraiseexcept(except); + ret = fesetexceptflag(pflag, except); + ret = fetestexcept(except); + ret = fegetround(); + ret = fesetround(mode); + ret = fegetenv(penv); + ret = feholdexcept(penv); + ret = fesetenv(penv); + ret = feupdateenv(penv); + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_c99_fenv_tr1=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_c99_fenv_tr1=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + fi + { echo "$as_me:$LINENO: result: $ac_c99_fenv_tr1" >&5 +echo "${ECHO_T}$ac_c99_fenv_tr1" >&6; } + if test x"$ac_c99_fenv_tr1" = x"yes"; then + +cat >>confdefs.h <<\_ACEOF +#define _GLIBCXX_USE_C99_FENV_TR1 1 +_ACEOF + + fi + + # Check for the existence of types. + { echo "$as_me:$LINENO: checking for ISO C99 support to TR1 in " >&5 +echo $ECHO_N "checking for ISO C99 support to TR1 in ... $ECHO_C" >&6; } + if test "${ac_c99_stdint_tr1+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +int +main () +{ +typedef int8_t my_int8_t; + typedef int16_t my_int16_t; + typedef int32_t my_int32_t; + typedef int64_t my_int64_t; + typedef int_fast8_t my_int_fast8_t; + typedef int_fast16_t my_int_fast16_t; + typedef int_fast32_t my_int_fast32_t; + typedef int_fast64_t my_int_fast64_t; + typedef int_least8_t my_int_least8_t; + typedef int_least16_t my_int_least16_t; + typedef int_least32_t my_int_least32_t; + typedef int_least64_t my_int_least64_t; + typedef intmax_t my_intmax_t; + typedef intptr_t my_intptr_t; + typedef uint8_t my_uint8_t; + typedef uint16_t my_uint16_t; + typedef uint32_t my_uint32_t; + typedef uint64_t my_uint64_t; + typedef uint_fast8_t my_uint_fast8_t; + typedef uint_fast16_t my_uint_fast16_t; + typedef uint_fast32_t my_uint_fast32_t; + typedef uint_fast64_t my_uint_fast64_t; + typedef uint_least8_t my_uint_least8_t; + typedef uint_least16_t my_uint_least16_t; + typedef uint_least32_t my_uint_least32_t; + typedef uint_least64_t my_uint_least64_t; + typedef uintmax_t my_uintmax_t; + typedef uintptr_t my_uintptr_t; + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_c99_stdint_tr1=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_c99_stdint_tr1=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +fi + + { echo "$as_me:$LINENO: result: $ac_c99_stdint_tr1" >&5 +echo "${ECHO_T}$ac_c99_stdint_tr1" >&6; } + if test x"$ac_c99_stdint_tr1" = x"yes"; then + +cat >>confdefs.h <<\_ACEOF +#define _GLIBCXX_USE_C99_STDINT_TR1 1 +_ACEOF + + fi + + # Check for the existence of functions. + { echo "$as_me:$LINENO: checking for ISO C99 support to TR1 in " >&5 +echo $ECHO_N "checking for ISO C99 support to TR1 in ... $ECHO_C" >&6; } + if test "${ac_c99_math_tr1+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +int +main () +{ +typedef double_t my_double_t; + typedef float_t my_float_t; + acosh(0.0); + acoshf(0.0f); + acoshl(0.0l); + asinh(0.0); + asinhf(0.0f); + asinhl(0.0l); + atanh(0.0); + atanhf(0.0f); + atanhl(0.0l); + cbrt(0.0); + cbrtf(0.0f); + cbrtl(0.0l); + copysign(0.0, 0.0); + copysignf(0.0f, 0.0f); + copysignl(0.0l, 0.0l); + erf(0.0); + erff(0.0f); + erfl(0.0l); + erfc(0.0); + erfcf(0.0f); + erfcl(0.0l); + exp2(0.0); + exp2f(0.0f); + exp2l(0.0l); + expm1(0.0); + expm1f(0.0f); + expm1l(0.0l); + fdim(0.0, 0.0); + fdimf(0.0f, 0.0f); + fdiml(0.0l, 0.0l); + fma(0.0, 0.0, 0.0); + fmaf(0.0f, 0.0f, 0.0f); + fmal(0.0l, 0.0l, 0.0l); + fmax(0.0, 0.0); + fmaxf(0.0f, 0.0f); + fmaxl(0.0l, 0.0l); + fmin(0.0, 0.0); + fminf(0.0f, 0.0f); + fminl(0.0l, 0.0l); + hypot(0.0, 0.0); + hypotf(0.0f, 0.0f); + hypotl(0.0l, 0.0l); + ilogb(0.0); + ilogbf(0.0f); + ilogbl(0.0l); + lgamma(0.0); + lgammaf(0.0f); + lgammal(0.0l); + llrint(0.0); + llrintf(0.0f); + llrintl(0.0l); + llround(0.0); + llroundf(0.0f); + llroundl(0.0l); + log1p(0.0); + log1pf(0.0f); + log1pl(0.0l); + log2(0.0); + log2f(0.0f); + log2l(0.0l); + logb(0.0); + logbf(0.0f); + logbl(0.0l); + lrint(0.0); + lrintf(0.0f); + lrintl(0.0l); + lround(0.0); + lroundf(0.0f); + lroundl(0.0l); + nan(0); + nanf(0); + nanl(0); + nearbyint(0.0); + nearbyintf(0.0f); + nearbyintl(0.0l); + nextafter(0.0, 0.0); + nextafterf(0.0f, 0.0f); + nextafterl(0.0l, 0.0l); + nexttoward(0.0, 0.0); + nexttowardf(0.0f, 0.0f); + nexttowardl(0.0l, 0.0l); + remainder(0.0, 0.0); + remainderf(0.0f, 0.0f); + remainderl(0.0l, 0.0l); + remquo(0.0, 0.0, 0); + remquo(0.0f, 0.0f, 0); + remquo(0.0l, 0.0l, 0); + rint(0.0); + rintf(0.0f); + rintl(0.0l); + round(0.0); + roundf(0.0f); + roundl(0.0l); + scalbln(0.0, 0l); + scalblnf(0.0f, 0l); + scalblnl(0.0l, 0l); + scalbn(0.0, 0); + scalbnf(0.0f, 0); + scalbnl(0.0l, 0); + tgamma(0.0); + tgammaf(0.0f); + tgammal(0.0l); + trunc(0.0); + truncf(0.0f); + truncl(0.0l); + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_c99_math_tr1=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_c99_math_tr1=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +fi + + { echo "$as_me:$LINENO: result: $ac_c99_math_tr1" >&5 +echo "${ECHO_T}$ac_c99_math_tr1" >&6; } + if test x"$ac_c99_math_tr1" = x"yes"; then + +cat >>confdefs.h <<\_ACEOF +#define _GLIBCXX_USE_C99_MATH_TR1 1 +_ACEOF + + fi + + # Check for the existence of functions (NB: doesn't make + # sense if the previous check fails, per C99, 7.8/1). + ac_c99_inttypes_tr1=no; + if test x"$ac_c99_stdint_tr1" = x"yes"; then + { echo "$as_me:$LINENO: checking for ISO C99 support to TR1 in " >&5 +echo $ECHO_N "checking for ISO C99 support to TR1 in ... $ECHO_C" >&6; } + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +int +main () +{ +intmax_t i, numer, denom, base; + const char* s; + char** endptr; + intmax_t ret = imaxabs(i); + imaxdiv_t dret = imaxdiv(numer, denom); + ret = strtoimax(s, endptr, base); + uintmax_t uret = strtoumax(s, endptr, base); + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_c99_inttypes_tr1=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_c99_inttypes_tr1=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + fi + { echo "$as_me:$LINENO: result: $ac_c99_inttypes_tr1" >&5 +echo "${ECHO_T}$ac_c99_inttypes_tr1" >&6; } + if test x"$ac_c99_inttypes_tr1" = x"yes"; then + +cat >>confdefs.h <<\_ACEOF +#define _GLIBCXX_USE_C99_INTTYPES_TR1 1 +_ACEOF + + fi + + # Check for the existence of the header. + +for ac_header in stdbool.h +do +as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + { echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +fi +ac_res=`eval echo '${'$as_ac_Header'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } +else + # Is the header compilable? +{ echo "$as_me:$LINENO: checking $ac_header usability" >&5 +echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6; } +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +#include <$ac_header> +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_header_compiler=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_compiler=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +echo "${ECHO_T}$ac_header_compiler" >&6; } + +# Is the header present? +{ echo "$as_me:$LINENO: checking $ac_header presence" >&5 +echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6; } +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include <$ac_header> +_ACEOF +if { (ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || + test ! -s conftest.err + }; then + ac_header_preproc=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_preproc=no +fi + +rm -f conftest.err conftest.$ac_ext +{ echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 +echo "${ECHO_T}$ac_header_preproc" >&6; } + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc:$ac_cxx_preproc_warn_flag in + yes:no: ) + { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 +echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 +echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} + ac_header_preproc=yes + ;; + no:yes:* ) + { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 +echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 +echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 +echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 +echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 +echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 +echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} + + ;; +esac +{ echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + eval "$as_ac_Header=\$ac_header_preproc" +fi +ac_res=`eval echo '${'$as_ac_Header'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } + +fi +if test `eval echo '${'$as_ac_Header'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + + CXXFLAGS="$ac_save_CXXFLAGS" + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + + # Check for sigsetjmp + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +int +main () +{ +sigjmp_buf env; + while (! sigsetjmp (env, 1)) + siglongjmp (env, 1); + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + +cat >>confdefs.h <<\_ACEOF +#define HAVE_SIGSETJMP 1 +_ACEOF + +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ;; + *-mingw32*) + + + +for ac_header in sys/types.h locale.h float.h +do +as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + { echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +fi +ac_res=`eval echo '${'$as_ac_Header'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } +else + # Is the header compilable? +{ echo "$as_me:$LINENO: checking $ac_header usability" >&5 +echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6; } +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +#include <$ac_header> +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_header_compiler=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_compiler=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +echo "${ECHO_T}$ac_header_compiler" >&6; } + +# Is the header present? +{ echo "$as_me:$LINENO: checking $ac_header presence" >&5 +echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6; } +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include <$ac_header> +_ACEOF +if { (ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then + ac_header_preproc=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_preproc=no +fi + +rm -f conftest.err conftest.$ac_ext +{ echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 +echo "${ECHO_T}$ac_header_preproc" >&6; } + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in + yes:no: ) + { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 +echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 +echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} + ac_header_preproc=yes + ;; + no:yes:* ) + { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 +echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 +echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 +echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 +echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 +echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 +echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} + ;; esac -echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else eval "$as_ac_Header=\$ac_header_preproc" fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 +ac_res=`eval echo '${'$as_ac_Header'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } fi if test `eval echo '${'$as_ac_Header'}'` = yes; then @@ -108754,16 +104660,16 @@ done # Start by getting the version number. I think the libtool test already # does some of this, but throws away the result. if test x"$with_gnu_ld" = x"yes"; then - echo "$as_me:$LINENO: checking for ld version" >&5 -echo $ECHO_N "checking for ld version... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for ld version" >&5 +echo $ECHO_N "checking for ld version... $ECHO_C" >&6; } ldver=`$LD --version 2>/dev/null | head -1 | \ sed -e 's/GNU ld \(version \)\{0,1\}\(([^)]*) \)\{0,1\}\([0-9.][0-9.]*\).*/\3/'` glibcxx_gnu_ld_version=`echo $ldver | \ $AWK -F. '{ if (NF<3) $3=0; print ($1*100+$2)*100+$3 }'` - echo "$as_me:$LINENO: result: $glibcxx_gnu_ld_version" >&5 -echo "${ECHO_T}$glibcxx_gnu_ld_version" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_gnu_ld_version" >&5 +echo "${ECHO_T}$glibcxx_gnu_ld_version" >&6; } fi # Set --gc-sections. @@ -108780,8 +104686,8 @@ echo "${ECHO_T}$glibcxx_gnu_ld_version" >&6 CFLAGS='-Wl,--gc-sections' # Check for -Wl,--gc-sections - echo "$as_me:$LINENO: checking for ld that supports -Wl,--gc-sections" >&5 -echo $ECHO_N "checking for ld that supports -Wl,--gc-sections... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for ld that supports -Wl,--gc-sections" >&5 +echo $ECHO_N "checking for ld that supports -Wl,--gc-sections... $ECHO_C" >&6; } if test x$gcc_no_link = xyes; then { { echo "$as_me:$LINENO: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&5 echo "$as_me: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&2;} @@ -108805,35 +104711,32 @@ main () } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then ac_gcsections=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -ac_gcsections=no + ac_gcsections=no fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext if test "$ac_gcsections" = "yes"; then rm -f conftest.c @@ -108849,8 +104752,8 @@ rm -f conftest.err conftest.$ac_objext \ if test "$ac_gcsections" = "yes"; then SECTION_LDFLAGS="-Wl,--gc-sections $SECTION_LDFLAGS" fi - echo "$as_me:$LINENO: result: $ac_gcsections" >&5 -echo "${ECHO_T}$ac_gcsections" >&6 + { echo "$as_me:$LINENO: result: $ac_gcsections" >&5 +echo "${ECHO_T}$ac_gcsections" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS="$ac_save_CFLAGS" @@ -108864,15 +104767,15 @@ echo "${ECHO_T}$ac_gcsections" >&6 # Note this is only for shared objects. ac_ld_relro=no if test x"$with_gnu_ld" = x"yes"; then - echo "$as_me:$LINENO: checking for ld that supports -Wl,-z,relro" >&5 -echo $ECHO_N "checking for ld that supports -Wl,-z,relro... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for ld that supports -Wl,-z,relro" >&5 +echo $ECHO_N "checking for ld that supports -Wl,-z,relro... $ECHO_C" >&6; } cxx_z_relo=`$LD -v --help 2>/dev/null | grep "z relro"` if test -n "$cxx_z_relo"; then OPT_LDFLAGS="-Wl,-z,relro" ac_ld_relro=yes fi - echo "$as_me:$LINENO: result: $ac_ld_relro" >&5 -echo "${ECHO_T}$ac_ld_relro" >&6 + { echo "$as_me:$LINENO: result: $ac_ld_relro" >&5 +echo "${ECHO_T}$ac_ld_relro" >&6; } fi # Set linker optimization flags. @@ -108885,8 +104788,8 @@ echo "${ECHO_T}$ac_ld_relro" >&6 -echo "$as_me:$LINENO: checking for main in -lm" >&5 -echo $ECHO_N "checking for main in -lm... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking for main in -lm" >&5 +echo $ECHO_N "checking for main in -lm... $ECHO_C" >&6; } if test "${ac_cv_lib_m_main+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -108908,46 +104811,43 @@ cat >>conftest.$ac_ext <<_ACEOF int main () { -main (); +return main (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then ac_cv_lib_m_main=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -ac_cv_lib_m_main=no + ac_cv_lib_m_main=no fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -echo "$as_me:$LINENO: result: $ac_cv_lib_m_main" >&5 -echo "${ECHO_T}$ac_cv_lib_m_main" >&6 +{ echo "$as_me:$LINENO: result: $ac_cv_lib_m_main" >&5 +echo "${ECHO_T}$ac_cv_lib_m_main" >&6; } if test $ac_cv_lib_m_main = yes; then cat >>confdefs.h <<_ACEOF #define HAVE_LIBM 1 @@ -108961,9 +104861,9 @@ fi for ac_func in copysignf do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -108994,68 +104894,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -109071,9 +104963,9 @@ done for ac_func in __signbit do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -109104,68 +104996,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -109181,120 +105065,9 @@ done for ac_func in __signbitf do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test x$gcc_no_link = xyes; then - { { echo "$as_me:$LINENO: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&5 -echo "$as_me: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&2;} - { (exit 1); exit 1; }; } -fi -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -/* Define $ac_func to an innocuous variant, in case declares $ac_func. - For example, HP-UX 11i declares gettimeofday. */ -#define $ac_func innocuous_$ac_func - -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char $ac_func (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ - -#ifdef __STDC__ -# include -#else -# include -#endif - -#undef $ac_func - -/* Override any gcc2 internal prototype to avoid an error. */ -#ifdef __cplusplus -extern "C" -{ -#endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char $ac_func (); -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) -choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} -#endif - -int -main () -{ -return f != $ac_func; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - eval "$as_ac_var=yes" -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -eval "$as_ac_var=no" -fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 -if test `eval echo '${'$as_ac_var'}'` = yes; then - cat >>confdefs.h <<_ACEOF -#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 -_ACEOF - -else - LIBMATHOBJS="$LIBMATHOBJS signbitf.lo" -fi -done - - - if test x$ac_cv_func_copysignl = x"yes"; then - -for ac_func in __signbitl -do -as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -109325,68 +105098,163 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me +#endif + +int +main () +{ +return $ac_func (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then + eval "$as_ac_var=yes" +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + eval "$as_ac_var=no" +fi + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +fi +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } +if test `eval echo '${'$as_ac_var'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +else + LIBMATHOBJS="$LIBMATHOBJS signbitf.lo" +fi +done + + + if test x$ac_cv_func_copysignl = x"yes"; then + +for ac_func in __signbitl +do +as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test x$gcc_no_link = xyes; then + { { echo "$as_me:$LINENO: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&5 +echo "$as_me: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&2;} + { (exit 1); exit 1; }; } +fi +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define $ac_func to an innocuous variant, in case declares $ac_func. + For example, HP-UX 11i declares gettimeofday. */ +#define $ac_func innocuous_$ac_func + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $ac_func (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include #else -char (*f) () = $ac_func; +# include #endif + +#undef $ac_func + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus -} +extern "C" +#endif +char $ac_func (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_$ac_func || defined __stub___$ac_func +choke me #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -109424,18 +105292,19 @@ for ac_header in nan.h ieeefp.h endian.h sys/isa_defs.h \ fp.h locale.h float.h inttypes.h do as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + { echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 +ac_res=`eval echo '${'$as_ac_Header'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } else # Is the header compilable? -echo "$as_me:$LINENO: checking $ac_header usability" >&5 -echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking $ac_header usability" >&5 +echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6; } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF @@ -109446,41 +105315,37 @@ $ac_includes_default #include <$ac_header> _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then ac_header_compiler=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -ac_header_compiler=no + ac_header_compiler=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 -echo "${ECHO_T}$ac_header_compiler" >&6 + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +echo "${ECHO_T}$ac_header_compiler" >&6; } # Is the header present? -echo "$as_me:$LINENO: checking $ac_header presence" >&5 -echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking $ac_header presence" >&5 +echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6; } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF @@ -109489,24 +105354,22 @@ cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include <$ac_header> _ACEOF -if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 - (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 +if { (ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null; then - if test -s conftest.err; then - ac_cpp_err=$ac_c_preproc_warn_flag - ac_cpp_err=$ac_cpp_err$ac_c_werror_flag - else - ac_cpp_err= - fi -else - ac_cpp_err=yes -fi -if test -z "$ac_cpp_err"; then + (exit $ac_status); } >/dev/null && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then ac_header_preproc=yes else echo "$as_me: failed program was:" >&5 @@ -109514,9 +105377,10 @@ sed 's/^/| /' conftest.$ac_ext >&5 ac_header_preproc=no fi + rm -f conftest.err conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 -echo "${ECHO_T}$ac_header_preproc" >&6 +{ echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 +echo "${ECHO_T}$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in @@ -109540,25 +105404,19 @@ echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\ echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} - ( - cat <<\_ASBOX -## ----------------------------------------- ## -## Report this to the package-unused lists. ## -## ----------------------------------------- ## -_ASBOX - ) | - sed "s/^/$as_me: WARNING: /" >&2 + ;; esac -echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else eval "$as_ac_Header=\$ac_header_preproc" fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 +ac_res=`eval echo '${'$as_ac_Header'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } fi if test `eval echo '${'$as_ac_Header'}'` = yes; then @@ -109599,16 +105457,16 @@ done # Start by getting the version number. I think the libtool test already # does some of this, but throws away the result. if test x"$with_gnu_ld" = x"yes"; then - echo "$as_me:$LINENO: checking for ld version" >&5 -echo $ECHO_N "checking for ld version... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for ld version" >&5 +echo $ECHO_N "checking for ld version... $ECHO_C" >&6; } ldver=`$LD --version 2>/dev/null | head -1 | \ sed -e 's/GNU ld \(version \)\{0,1\}\(([^)]*) \)\{0,1\}\([0-9.][0-9.]*\).*/\3/'` glibcxx_gnu_ld_version=`echo $ldver | \ $AWK -F. '{ if (NF<3) $3=0; print ($1*100+$2)*100+$3 }'` - echo "$as_me:$LINENO: result: $glibcxx_gnu_ld_version" >&5 -echo "${ECHO_T}$glibcxx_gnu_ld_version" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_gnu_ld_version" >&5 +echo "${ECHO_T}$glibcxx_gnu_ld_version" >&6; } fi # Set --gc-sections. @@ -109625,8 +105483,8 @@ echo "${ECHO_T}$glibcxx_gnu_ld_version" >&6 CFLAGS='-Wl,--gc-sections' # Check for -Wl,--gc-sections - echo "$as_me:$LINENO: checking for ld that supports -Wl,--gc-sections" >&5 -echo $ECHO_N "checking for ld that supports -Wl,--gc-sections... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for ld that supports -Wl,--gc-sections" >&5 +echo $ECHO_N "checking for ld that supports -Wl,--gc-sections... $ECHO_C" >&6; } if test x$gcc_no_link = xyes; then { { echo "$as_me:$LINENO: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&5 echo "$as_me: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&2;} @@ -109650,35 +105508,32 @@ main () } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then ac_gcsections=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -ac_gcsections=no + ac_gcsections=no fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext if test "$ac_gcsections" = "yes"; then rm -f conftest.c @@ -109694,8 +105549,8 @@ rm -f conftest.err conftest.$ac_objext \ if test "$ac_gcsections" = "yes"; then SECTION_LDFLAGS="-Wl,--gc-sections $SECTION_LDFLAGS" fi - echo "$as_me:$LINENO: result: $ac_gcsections" >&5 -echo "${ECHO_T}$ac_gcsections" >&6 + { echo "$as_me:$LINENO: result: $ac_gcsections" >&5 +echo "${ECHO_T}$ac_gcsections" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS="$ac_save_CFLAGS" @@ -109709,15 +105564,15 @@ echo "${ECHO_T}$ac_gcsections" >&6 # Note this is only for shared objects. ac_ld_relro=no if test x"$with_gnu_ld" = x"yes"; then - echo "$as_me:$LINENO: checking for ld that supports -Wl,-z,relro" >&5 -echo $ECHO_N "checking for ld that supports -Wl,-z,relro... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for ld that supports -Wl,-z,relro" >&5 +echo $ECHO_N "checking for ld that supports -Wl,-z,relro... $ECHO_C" >&6; } cxx_z_relo=`$LD -v --help 2>/dev/null | grep "z relro"` if test -n "$cxx_z_relo"; then OPT_LDFLAGS="-Wl,-z,relro" ac_ld_relro=yes fi - echo "$as_me:$LINENO: result: $ac_ld_relro" >&5 -echo "${ECHO_T}$ac_ld_relro" >&6 + { echo "$as_me:$LINENO: result: $ac_ld_relro" >&5 +echo "${ECHO_T}$ac_ld_relro" >&6; } fi # Set linker optimization flags. @@ -109730,8 +105585,8 @@ echo "${ECHO_T}$ac_ld_relro" >&6 -echo "$as_me:$LINENO: checking for main in -lm" >&5 -echo $ECHO_N "checking for main in -lm... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking for main in -lm" >&5 +echo $ECHO_N "checking for main in -lm... $ECHO_C" >&6; } if test "${ac_cv_lib_m_main+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -109753,46 +105608,43 @@ cat >>conftest.$ac_ext <<_ACEOF int main () { -main (); +return main (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then ac_cv_lib_m_main=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -ac_cv_lib_m_main=no + ac_cv_lib_m_main=no fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -echo "$as_me:$LINENO: result: $ac_cv_lib_m_main" >&5 -echo "${ECHO_T}$ac_cv_lib_m_main" >&6 +{ echo "$as_me:$LINENO: result: $ac_cv_lib_m_main" >&5 +echo "${ECHO_T}$ac_cv_lib_m_main" >&6; } if test $ac_cv_lib_m_main = yes; then cat >>confdefs.h <<_ACEOF #define HAVE_LIBM 1 @@ -109806,9 +105658,9 @@ fi for ac_func in copysignf do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -109839,68 +105691,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -109916,9 +105760,9 @@ done for ac_func in __signbit do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -109949,68 +105793,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -110026,9 +105862,9 @@ done for ac_func in __signbitf do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -110059,68 +105895,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -110137,9 +105965,9 @@ done for ac_func in __signbitl do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -110170,68 +105998,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -110318,18 +106138,19 @@ for ac_header in nan.h ieeefp.h sys/isa_defs.h sys/machine.h \ sys/types.h locale.h float.h inttypes.h do as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + { echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 +ac_res=`eval echo '${'$as_ac_Header'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } else # Is the header compilable? -echo "$as_me:$LINENO: checking $ac_header usability" >&5 -echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking $ac_header usability" >&5 +echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6; } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF @@ -110340,41 +106161,37 @@ $ac_includes_default #include <$ac_header> _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then ac_header_compiler=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -ac_header_compiler=no + ac_header_compiler=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 -echo "${ECHO_T}$ac_header_compiler" >&6 + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +echo "${ECHO_T}$ac_header_compiler" >&6; } # Is the header present? -echo "$as_me:$LINENO: checking $ac_header presence" >&5 -echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking $ac_header presence" >&5 +echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6; } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF @@ -110383,24 +106200,22 @@ cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include <$ac_header> _ACEOF -if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 - (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 +if { (ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null; then - if test -s conftest.err; then - ac_cpp_err=$ac_c_preproc_warn_flag - ac_cpp_err=$ac_cpp_err$ac_c_werror_flag - else - ac_cpp_err= - fi -else - ac_cpp_err=yes -fi -if test -z "$ac_cpp_err"; then + (exit $ac_status); } >/dev/null && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then ac_header_preproc=yes else echo "$as_me: failed program was:" >&5 @@ -110408,9 +106223,10 @@ sed 's/^/| /' conftest.$ac_ext >&5 ac_header_preproc=no fi + rm -f conftest.err conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 -echo "${ECHO_T}$ac_header_preproc" >&6 +{ echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 +echo "${ECHO_T}$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in @@ -110434,25 +106250,19 @@ echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\ echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} - ( - cat <<\_ASBOX -## ----------------------------------------- ## -## Report this to the package-unused lists. ## -## ----------------------------------------- ## -_ASBOX - ) | - sed "s/^/$as_me: WARNING: /" >&2 + ;; esac -echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else eval "$as_ac_Header=\$ac_header_preproc" fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 +ac_res=`eval echo '${'$as_ac_Header'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } fi if test `eval echo '${'$as_ac_Header'}'` = yes; then @@ -110493,16 +106303,16 @@ done # Start by getting the version number. I think the libtool test already # does some of this, but throws away the result. if test x"$with_gnu_ld" = x"yes"; then - echo "$as_me:$LINENO: checking for ld version" >&5 -echo $ECHO_N "checking for ld version... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for ld version" >&5 +echo $ECHO_N "checking for ld version... $ECHO_C" >&6; } ldver=`$LD --version 2>/dev/null | head -1 | \ sed -e 's/GNU ld \(version \)\{0,1\}\(([^)]*) \)\{0,1\}\([0-9.][0-9.]*\).*/\3/'` glibcxx_gnu_ld_version=`echo $ldver | \ $AWK -F. '{ if (NF<3) $3=0; print ($1*100+$2)*100+$3 }'` - echo "$as_me:$LINENO: result: $glibcxx_gnu_ld_version" >&5 -echo "${ECHO_T}$glibcxx_gnu_ld_version" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_gnu_ld_version" >&5 +echo "${ECHO_T}$glibcxx_gnu_ld_version" >&6; } fi # Set --gc-sections. @@ -110519,8 +106329,8 @@ echo "${ECHO_T}$glibcxx_gnu_ld_version" >&6 CFLAGS='-Wl,--gc-sections' # Check for -Wl,--gc-sections - echo "$as_me:$LINENO: checking for ld that supports -Wl,--gc-sections" >&5 -echo $ECHO_N "checking for ld that supports -Wl,--gc-sections... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for ld that supports -Wl,--gc-sections" >&5 +echo $ECHO_N "checking for ld that supports -Wl,--gc-sections... $ECHO_C" >&6; } if test x$gcc_no_link = xyes; then { { echo "$as_me:$LINENO: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&5 echo "$as_me: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&2;} @@ -110544,35 +106354,32 @@ main () } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then ac_gcsections=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -ac_gcsections=no + ac_gcsections=no fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext if test "$ac_gcsections" = "yes"; then rm -f conftest.c @@ -110588,8 +106395,8 @@ rm -f conftest.err conftest.$ac_objext \ if test "$ac_gcsections" = "yes"; then SECTION_LDFLAGS="-Wl,--gc-sections $SECTION_LDFLAGS" fi - echo "$as_me:$LINENO: result: $ac_gcsections" >&5 -echo "${ECHO_T}$ac_gcsections" >&6 + { echo "$as_me:$LINENO: result: $ac_gcsections" >&5 +echo "${ECHO_T}$ac_gcsections" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS="$ac_save_CFLAGS" @@ -110603,15 +106410,15 @@ echo "${ECHO_T}$ac_gcsections" >&6 # Note this is only for shared objects. ac_ld_relro=no if test x"$with_gnu_ld" = x"yes"; then - echo "$as_me:$LINENO: checking for ld that supports -Wl,-z,relro" >&5 -echo $ECHO_N "checking for ld that supports -Wl,-z,relro... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for ld that supports -Wl,-z,relro" >&5 +echo $ECHO_N "checking for ld that supports -Wl,-z,relro... $ECHO_C" >&6; } cxx_z_relo=`$LD -v --help 2>/dev/null | grep "z relro"` if test -n "$cxx_z_relo"; then OPT_LDFLAGS="-Wl,-z,relro" ac_ld_relro=yes fi - echo "$as_me:$LINENO: result: $ac_ld_relro" >&5 -echo "${ECHO_T}$ac_ld_relro" >&6 + { echo "$as_me:$LINENO: result: $ac_ld_relro" >&5 +echo "${ECHO_T}$ac_ld_relro" >&6; } fi # Set linker optimization flags. @@ -110624,8 +106431,8 @@ echo "${ECHO_T}$ac_ld_relro" >&6 -echo "$as_me:$LINENO: checking for main in -lm" >&5 -echo $ECHO_N "checking for main in -lm... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking for main in -lm" >&5 +echo $ECHO_N "checking for main in -lm... $ECHO_C" >&6; } if test "${ac_cv_lib_m_main+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -110647,46 +106454,43 @@ cat >>conftest.$ac_ext <<_ACEOF int main () { -main (); +return main (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then ac_cv_lib_m_main=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -ac_cv_lib_m_main=no + ac_cv_lib_m_main=no fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -echo "$as_me:$LINENO: result: $ac_cv_lib_m_main" >&5 -echo "${ECHO_T}$ac_cv_lib_m_main" >&6 +{ echo "$as_me:$LINENO: result: $ac_cv_lib_m_main" >&5 +echo "${ECHO_T}$ac_cv_lib_m_main" >&6; } if test $ac_cv_lib_m_main = yes; then cat >>confdefs.h <<_ACEOF #define HAVE_LIBM 1 @@ -110700,9 +106504,9 @@ fi for ac_func in copysignf do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -110733,68 +106537,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -110810,9 +106606,9 @@ done for ac_func in __signbit do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -110843,68 +106639,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -110920,9 +106708,9 @@ done for ac_func in __signbitf do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -110953,68 +106741,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -111031,9 +106811,9 @@ done for ac_func in __signbitl do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -111064,68 +106844,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -111163,18 +106935,19 @@ _ACEOF for ac_header in sys/ioctl.h sys/filio.h do as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + { echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 +ac_res=`eval echo '${'$as_ac_Header'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } else # Is the header compilable? -echo "$as_me:$LINENO: checking $ac_header usability" >&5 -echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking $ac_header usability" >&5 +echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6; } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF @@ -111185,41 +106958,37 @@ $ac_includes_default #include <$ac_header> _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then ac_header_compiler=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -ac_header_compiler=no + ac_header_compiler=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 -echo "${ECHO_T}$ac_header_compiler" >&6 + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +echo "${ECHO_T}$ac_header_compiler" >&6; } # Is the header present? -echo "$as_me:$LINENO: checking $ac_header presence" >&5 -echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking $ac_header presence" >&5 +echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6; } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF @@ -111228,24 +106997,22 @@ cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include <$ac_header> _ACEOF -if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 - (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 +if { (ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null; then - if test -s conftest.err; then - ac_cpp_err=$ac_c_preproc_warn_flag - ac_cpp_err=$ac_cpp_err$ac_c_werror_flag - else - ac_cpp_err= - fi -else - ac_cpp_err=yes -fi -if test -z "$ac_cpp_err"; then + (exit $ac_status); } >/dev/null && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then ac_header_preproc=yes else echo "$as_me: failed program was:" >&5 @@ -111253,9 +107020,10 @@ sed 's/^/| /' conftest.$ac_ext >&5 ac_header_preproc=no fi + rm -f conftest.err conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 -echo "${ECHO_T}$ac_header_preproc" >&6 +{ echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 +echo "${ECHO_T}$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in @@ -111279,25 +107047,19 @@ echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\ echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} - ( - cat <<\_ASBOX -## ----------------------------------------- ## -## Report this to the package-unused lists. ## -## ----------------------------------------- ## -_ASBOX - ) | - sed "s/^/$as_me: WARNING: /" >&2 + ;; esac -echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else eval "$as_ac_Header=\$ac_header_preproc" fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 +ac_res=`eval echo '${'$as_ac_Header'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } fi if test `eval echo '${'$as_ac_Header'}'` = yes; then @@ -111310,8 +107072,8 @@ fi done - echo "$as_me:$LINENO: checking for poll" >&5 -echo $ECHO_N "checking for poll... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for poll" >&5 +echo $ECHO_N "checking for poll... $ECHO_C" >&6; } if test "${glibcxx_cv_POLL+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -111339,35 +107101,32 @@ struct pollfd pfd[1]; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then glibcxx_cv_POLL=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_POLL=no + glibcxx_cv_POLL=no fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi @@ -111379,12 +107138,12 @@ cat >>confdefs.h <<\_ACEOF _ACEOF fi - echo "$as_me:$LINENO: result: $glibcxx_cv_POLL" >&5 -echo "${ECHO_T}$glibcxx_cv_POLL" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_POLL" >&5 +echo "${ECHO_T}$glibcxx_cv_POLL" >&6; } - echo "$as_me:$LINENO: checking for S_ISREG or S_IFREG" >&5 -echo $ECHO_N "checking for S_ISREG or S_IFREG... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for S_ISREG or S_IFREG" >&5 +echo $ECHO_N "checking for S_ISREG or S_IFREG... $ECHO_C" >&6; } if test "${glibcxx_cv_S_ISREG+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -111412,35 +107171,32 @@ struct stat buffer; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then glibcxx_cv_S_ISREG=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_S_ISREG=no + glibcxx_cv_S_ISREG=no fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi @@ -111472,35 +107228,32 @@ struct stat buffer; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then glibcxx_cv_S_IFREG=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_S_IFREG=no + glibcxx_cv_S_IFREG=no fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi @@ -111521,8 +107274,8 @@ _ACEOF res=S_IFREG fi - echo "$as_me:$LINENO: result: $res" >&5 -echo "${ECHO_T}$res" >&6 + { echo "$as_me:$LINENO: result: $res" >&5 +echo "${ECHO_T}$res" >&6; } # For xsputn_2(). @@ -111530,18 +107283,19 @@ echo "${ECHO_T}$res" >&6 for ac_header in sys/uio.h do as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + { echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 +ac_res=`eval echo '${'$as_ac_Header'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } else # Is the header compilable? -echo "$as_me:$LINENO: checking $ac_header usability" >&5 -echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking $ac_header usability" >&5 +echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6; } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF @@ -111552,41 +107306,37 @@ $ac_includes_default #include <$ac_header> _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then ac_header_compiler=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -ac_header_compiler=no + ac_header_compiler=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 -echo "${ECHO_T}$ac_header_compiler" >&6 + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +echo "${ECHO_T}$ac_header_compiler" >&6; } # Is the header present? -echo "$as_me:$LINENO: checking $ac_header presence" >&5 -echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking $ac_header presence" >&5 +echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6; } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF @@ -111595,24 +107345,22 @@ cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include <$ac_header> _ACEOF -if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 - (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 +if { (ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null; then - if test -s conftest.err; then - ac_cpp_err=$ac_c_preproc_warn_flag - ac_cpp_err=$ac_cpp_err$ac_c_werror_flag - else - ac_cpp_err= - fi -else - ac_cpp_err=yes -fi -if test -z "$ac_cpp_err"; then + (exit $ac_status); } >/dev/null && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then ac_header_preproc=yes else echo "$as_me: failed program was:" >&5 @@ -111620,9 +107368,10 @@ sed 's/^/| /' conftest.$ac_ext >&5 ac_header_preproc=no fi + rm -f conftest.err conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 -echo "${ECHO_T}$ac_header_preproc" >&6 +{ echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 +echo "${ECHO_T}$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in @@ -111646,25 +107395,19 @@ echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\ echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} - ( - cat <<\_ASBOX -## ----------------------------------------- ## -## Report this to the package-unused lists. ## -## ----------------------------------------- ## -_ASBOX - ) | - sed "s/^/$as_me: WARNING: /" >&2 + ;; esac -echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else eval "$as_ac_Header=\$ac_header_preproc" fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 +ac_res=`eval echo '${'$as_ac_Header'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } fi if test `eval echo '${'$as_ac_Header'}'` = yes; then @@ -111677,8 +107420,8 @@ fi done - echo "$as_me:$LINENO: checking for writev" >&5 -echo $ECHO_N "checking for writev... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for writev" >&5 +echo $ECHO_N "checking for writev... $ECHO_C" >&6; } if test "${glibcxx_cv_WRITEV+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -111705,35 +107448,32 @@ struct iovec iov[2]; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then glibcxx_cv_WRITEV=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_WRITEV=no + glibcxx_cv_WRITEV=no fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi @@ -111745,8 +107485,8 @@ cat >>confdefs.h <<\_ACEOF _ACEOF fi - echo "$as_me:$LINENO: result: $glibcxx_cv_WRITEV" >&5 -echo "${ECHO_T}$glibcxx_cv_WRITEV" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_WRITEV" >&5 +echo "${ECHO_T}$glibcxx_cv_WRITEV" >&6; } ;; *-qnx6.1* | *-qnx6.2*) @@ -111779,16 +107519,16 @@ echo "${ECHO_T}$glibcxx_cv_WRITEV" >&6 # Start by getting the version number. I think the libtool test already # does some of this, but throws away the result. if test x"$with_gnu_ld" = x"yes"; then - echo "$as_me:$LINENO: checking for ld version" >&5 -echo $ECHO_N "checking for ld version... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for ld version" >&5 +echo $ECHO_N "checking for ld version... $ECHO_C" >&6; } ldver=`$LD --version 2>/dev/null | head -1 | \ sed -e 's/GNU ld \(version \)\{0,1\}\(([^)]*) \)\{0,1\}\([0-9.][0-9.]*\).*/\3/'` glibcxx_gnu_ld_version=`echo $ldver | \ $AWK -F. '{ if (NF<3) $3=0; print ($1*100+$2)*100+$3 }'` - echo "$as_me:$LINENO: result: $glibcxx_gnu_ld_version" >&5 -echo "${ECHO_T}$glibcxx_gnu_ld_version" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_gnu_ld_version" >&5 +echo "${ECHO_T}$glibcxx_gnu_ld_version" >&6; } fi # Set --gc-sections. @@ -111805,8 +107545,8 @@ echo "${ECHO_T}$glibcxx_gnu_ld_version" >&6 CFLAGS='-Wl,--gc-sections' # Check for -Wl,--gc-sections - echo "$as_me:$LINENO: checking for ld that supports -Wl,--gc-sections" >&5 -echo $ECHO_N "checking for ld that supports -Wl,--gc-sections... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for ld that supports -Wl,--gc-sections" >&5 +echo $ECHO_N "checking for ld that supports -Wl,--gc-sections... $ECHO_C" >&6; } if test x$gcc_no_link = xyes; then { { echo "$as_me:$LINENO: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&5 echo "$as_me: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&2;} @@ -111830,35 +107570,32 @@ main () } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then ac_gcsections=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -ac_gcsections=no + ac_gcsections=no fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext if test "$ac_gcsections" = "yes"; then rm -f conftest.c @@ -111874,8 +107611,8 @@ rm -f conftest.err conftest.$ac_objext \ if test "$ac_gcsections" = "yes"; then SECTION_LDFLAGS="-Wl,--gc-sections $SECTION_LDFLAGS" fi - echo "$as_me:$LINENO: result: $ac_gcsections" >&5 -echo "${ECHO_T}$ac_gcsections" >&6 + { echo "$as_me:$LINENO: result: $ac_gcsections" >&5 +echo "${ECHO_T}$ac_gcsections" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS="$ac_save_CFLAGS" @@ -111889,15 +107626,15 @@ echo "${ECHO_T}$ac_gcsections" >&6 # Note this is only for shared objects. ac_ld_relro=no if test x"$with_gnu_ld" = x"yes"; then - echo "$as_me:$LINENO: checking for ld that supports -Wl,-z,relro" >&5 -echo $ECHO_N "checking for ld that supports -Wl,-z,relro... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for ld that supports -Wl,-z,relro" >&5 +echo $ECHO_N "checking for ld that supports -Wl,-z,relro... $ECHO_C" >&6; } cxx_z_relo=`$LD -v --help 2>/dev/null | grep "z relro"` if test -n "$cxx_z_relo"; then OPT_LDFLAGS="-Wl,-z,relro" ac_ld_relro=yes fi - echo "$as_me:$LINENO: result: $ac_ld_relro" >&5 -echo "${ECHO_T}$ac_ld_relro" >&6 + { echo "$as_me:$LINENO: result: $ac_ld_relro" >&5 +echo "${ECHO_T}$ac_ld_relro" >&6; } fi # Set linker optimization flags. @@ -111910,8 +107647,8 @@ echo "${ECHO_T}$ac_ld_relro" >&6 -echo "$as_me:$LINENO: checking for main in -lm" >&5 -echo $ECHO_N "checking for main in -lm... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking for main in -lm" >&5 +echo $ECHO_N "checking for main in -lm... $ECHO_C" >&6; } if test "${ac_cv_lib_m_main+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -111933,46 +107670,43 @@ cat >>conftest.$ac_ext <<_ACEOF int main () { -main (); +return main (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then ac_cv_lib_m_main=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -ac_cv_lib_m_main=no + ac_cv_lib_m_main=no fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -echo "$as_me:$LINENO: result: $ac_cv_lib_m_main" >&5 -echo "${ECHO_T}$ac_cv_lib_m_main" >&6 +{ echo "$as_me:$LINENO: result: $ac_cv_lib_m_main" >&5 +echo "${ECHO_T}$ac_cv_lib_m_main" >&6; } if test $ac_cv_lib_m_main = yes; then cat >>confdefs.h <<_ACEOF #define HAVE_LIBM 1 @@ -111986,9 +107720,9 @@ fi for ac_func in copysignf do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -112019,68 +107753,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -112096,9 +107822,9 @@ done for ac_func in __signbit do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -112129,68 +107855,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -112206,9 +107924,9 @@ done for ac_func in __signbitf do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -112239,68 +107957,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -112317,9 +108027,9 @@ done for ac_func in __signbitl do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -112350,68 +108060,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -112515,16 +108217,16 @@ _ACEOF # Start by getting the version number. I think the libtool test already # does some of this, but throws away the result. if test x"$with_gnu_ld" = x"yes"; then - echo "$as_me:$LINENO: checking for ld version" >&5 -echo $ECHO_N "checking for ld version... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for ld version" >&5 +echo $ECHO_N "checking for ld version... $ECHO_C" >&6; } ldver=`$LD --version 2>/dev/null | head -1 | \ sed -e 's/GNU ld \(version \)\{0,1\}\(([^)]*) \)\{0,1\}\([0-9.][0-9.]*\).*/\3/'` glibcxx_gnu_ld_version=`echo $ldver | \ $AWK -F. '{ if (NF<3) $3=0; print ($1*100+$2)*100+$3 }'` - echo "$as_me:$LINENO: result: $glibcxx_gnu_ld_version" >&5 -echo "${ECHO_T}$glibcxx_gnu_ld_version" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_gnu_ld_version" >&5 +echo "${ECHO_T}$glibcxx_gnu_ld_version" >&6; } fi # Set --gc-sections. @@ -112541,8 +108243,8 @@ echo "${ECHO_T}$glibcxx_gnu_ld_version" >&6 CFLAGS='-Wl,--gc-sections' # Check for -Wl,--gc-sections - echo "$as_me:$LINENO: checking for ld that supports -Wl,--gc-sections" >&5 -echo $ECHO_N "checking for ld that supports -Wl,--gc-sections... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for ld that supports -Wl,--gc-sections" >&5 +echo $ECHO_N "checking for ld that supports -Wl,--gc-sections... $ECHO_C" >&6; } if test x$gcc_no_link = xyes; then { { echo "$as_me:$LINENO: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&5 echo "$as_me: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&2;} @@ -112566,35 +108268,32 @@ main () } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then ac_gcsections=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -ac_gcsections=no + ac_gcsections=no fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext if test "$ac_gcsections" = "yes"; then rm -f conftest.c @@ -112610,8 +108309,8 @@ rm -f conftest.err conftest.$ac_objext \ if test "$ac_gcsections" = "yes"; then SECTION_LDFLAGS="-Wl,--gc-sections $SECTION_LDFLAGS" fi - echo "$as_me:$LINENO: result: $ac_gcsections" >&5 -echo "${ECHO_T}$ac_gcsections" >&6 + { echo "$as_me:$LINENO: result: $ac_gcsections" >&5 +echo "${ECHO_T}$ac_gcsections" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS="$ac_save_CFLAGS" @@ -112625,15 +108324,15 @@ echo "${ECHO_T}$ac_gcsections" >&6 # Note this is only for shared objects. ac_ld_relro=no if test x"$with_gnu_ld" = x"yes"; then - echo "$as_me:$LINENO: checking for ld that supports -Wl,-z,relro" >&5 -echo $ECHO_N "checking for ld that supports -Wl,-z,relro... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for ld that supports -Wl,-z,relro" >&5 +echo $ECHO_N "checking for ld that supports -Wl,-z,relro... $ECHO_C" >&6; } cxx_z_relo=`$LD -v --help 2>/dev/null | grep "z relro"` if test -n "$cxx_z_relo"; then OPT_LDFLAGS="-Wl,-z,relro" ac_ld_relro=yes fi - echo "$as_me:$LINENO: result: $ac_ld_relro" >&5 -echo "${ECHO_T}$ac_ld_relro" >&6 + { echo "$as_me:$LINENO: result: $ac_ld_relro" >&5 +echo "${ECHO_T}$ac_ld_relro" >&6; } fi # Set linker optimization flags. @@ -112841,18 +108540,19 @@ for ac_header in nan.h endian.h machine/endian.h \ sys/param.h sys/types.h locale.h float.h inttypes.h do as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + { echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 +ac_res=`eval echo '${'$as_ac_Header'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } else # Is the header compilable? -echo "$as_me:$LINENO: checking $ac_header usability" >&5 -echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking $ac_header usability" >&5 +echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6; } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF @@ -112863,41 +108563,37 @@ $ac_includes_default #include <$ac_header> _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then ac_header_compiler=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -ac_header_compiler=no + ac_header_compiler=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 -echo "${ECHO_T}$ac_header_compiler" >&6 + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +echo "${ECHO_T}$ac_header_compiler" >&6; } # Is the header present? -echo "$as_me:$LINENO: checking $ac_header presence" >&5 -echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking $ac_header presence" >&5 +echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6; } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF @@ -112906,24 +108602,22 @@ cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include <$ac_header> _ACEOF -if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 - (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 +if { (ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null; then - if test -s conftest.err; then - ac_cpp_err=$ac_c_preproc_warn_flag - ac_cpp_err=$ac_cpp_err$ac_c_werror_flag - else - ac_cpp_err= - fi -else - ac_cpp_err=yes -fi -if test -z "$ac_cpp_err"; then + (exit $ac_status); } >/dev/null && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then ac_header_preproc=yes else echo "$as_me: failed program was:" >&5 @@ -112931,9 +108625,10 @@ sed 's/^/| /' conftest.$ac_ext >&5 ac_header_preproc=no fi + rm -f conftest.err conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 -echo "${ECHO_T}$ac_header_preproc" >&6 +{ echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 +echo "${ECHO_T}$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in @@ -112957,25 +108652,19 @@ echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\ echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} - ( - cat <<\_ASBOX -## ----------------------------------------- ## -## Report this to the package-unused lists. ## -## ----------------------------------------- ## -_ASBOX - ) | - sed "s/^/$as_me: WARNING: /" >&2 + ;; esac -echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else eval "$as_ac_Header=\$ac_header_preproc" fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 +ac_res=`eval echo '${'$as_ac_Header'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } fi if test `eval echo '${'$as_ac_Header'}'` = yes; then @@ -113016,16 +108705,16 @@ done # Start by getting the version number. I think the libtool test already # does some of this, but throws away the result. if test x"$with_gnu_ld" = x"yes"; then - echo "$as_me:$LINENO: checking for ld version" >&5 -echo $ECHO_N "checking for ld version... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for ld version" >&5 +echo $ECHO_N "checking for ld version... $ECHO_C" >&6; } ldver=`$LD --version 2>/dev/null | head -1 | \ sed -e 's/GNU ld \(version \)\{0,1\}\(([^)]*) \)\{0,1\}\([0-9.][0-9.]*\).*/\3/'` glibcxx_gnu_ld_version=`echo $ldver | \ $AWK -F. '{ if (NF<3) $3=0; print ($1*100+$2)*100+$3 }'` - echo "$as_me:$LINENO: result: $glibcxx_gnu_ld_version" >&5 -echo "${ECHO_T}$glibcxx_gnu_ld_version" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_gnu_ld_version" >&5 +echo "${ECHO_T}$glibcxx_gnu_ld_version" >&6; } fi # Set --gc-sections. @@ -113042,8 +108731,8 @@ echo "${ECHO_T}$glibcxx_gnu_ld_version" >&6 CFLAGS='-Wl,--gc-sections' # Check for -Wl,--gc-sections - echo "$as_me:$LINENO: checking for ld that supports -Wl,--gc-sections" >&5 -echo $ECHO_N "checking for ld that supports -Wl,--gc-sections... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for ld that supports -Wl,--gc-sections" >&5 +echo $ECHO_N "checking for ld that supports -Wl,--gc-sections... $ECHO_C" >&6; } if test x$gcc_no_link = xyes; then { { echo "$as_me:$LINENO: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&5 echo "$as_me: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&2;} @@ -113067,35 +108756,32 @@ main () } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then ac_gcsections=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -ac_gcsections=no + ac_gcsections=no fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext if test "$ac_gcsections" = "yes"; then rm -f conftest.c @@ -113111,8 +108797,8 @@ rm -f conftest.err conftest.$ac_objext \ if test "$ac_gcsections" = "yes"; then SECTION_LDFLAGS="-Wl,--gc-sections $SECTION_LDFLAGS" fi - echo "$as_me:$LINENO: result: $ac_gcsections" >&5 -echo "${ECHO_T}$ac_gcsections" >&6 + { echo "$as_me:$LINENO: result: $ac_gcsections" >&5 +echo "${ECHO_T}$ac_gcsections" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS="$ac_save_CFLAGS" @@ -113126,15 +108812,15 @@ echo "${ECHO_T}$ac_gcsections" >&6 # Note this is only for shared objects. ac_ld_relro=no if test x"$with_gnu_ld" = x"yes"; then - echo "$as_me:$LINENO: checking for ld that supports -Wl,-z,relro" >&5 -echo $ECHO_N "checking for ld that supports -Wl,-z,relro... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for ld that supports -Wl,-z,relro" >&5 +echo $ECHO_N "checking for ld that supports -Wl,-z,relro... $ECHO_C" >&6; } cxx_z_relo=`$LD -v --help 2>/dev/null | grep "z relro"` if test -n "$cxx_z_relo"; then OPT_LDFLAGS="-Wl,-z,relro" ac_ld_relro=yes fi - echo "$as_me:$LINENO: result: $ac_ld_relro" >&5 -echo "${ECHO_T}$ac_ld_relro" >&6 + { echo "$as_me:$LINENO: result: $ac_ld_relro" >&5 +echo "${ECHO_T}$ac_ld_relro" >&6; } fi # Set linker optimization flags. @@ -113147,8 +108833,8 @@ echo "${ECHO_T}$ac_ld_relro" >&6 -echo "$as_me:$LINENO: checking for main in -lm" >&5 -echo $ECHO_N "checking for main in -lm... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking for main in -lm" >&5 +echo $ECHO_N "checking for main in -lm... $ECHO_C" >&6; } if test "${ac_cv_lib_m_main+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -113170,46 +108856,43 @@ cat >>conftest.$ac_ext <<_ACEOF int main () { -main (); +return main (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then ac_cv_lib_m_main=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -ac_cv_lib_m_main=no + ac_cv_lib_m_main=no fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -echo "$as_me:$LINENO: result: $ac_cv_lib_m_main" >&5 -echo "${ECHO_T}$ac_cv_lib_m_main" >&6 +{ echo "$as_me:$LINENO: result: $ac_cv_lib_m_main" >&5 +echo "${ECHO_T}$ac_cv_lib_m_main" >&6; } if test $ac_cv_lib_m_main = yes; then cat >>confdefs.h <<_ACEOF #define HAVE_LIBM 1 @@ -113223,9 +108906,9 @@ fi for ac_func in copysignf do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -113256,68 +108939,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -113333,9 +109008,9 @@ done for ac_func in __signbit do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -113366,68 +109041,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -113443,9 +109110,9 @@ done for ac_func in __signbitf do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -113476,68 +109143,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -113554,9 +109213,9 @@ done for ac_func in __signbitl do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -113587,68 +109246,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -114120,10 +109771,9 @@ _ACEOF fi - # Check whether --enable-linux-futex or --disable-linux-futex was given. + # Check whether --enable-linux-futex was given. if test "${enable_linux_futex+set}" = set; then - enableval="$enable_linux_futex" - + enableval=$enable_linux_futex; case "$enableval" in yes|no|default) ;; *) { { echo "$as_me:$LINENO: error: Unknown argument to enable/disable linux-futex" >&5 @@ -114133,7 +109783,8 @@ echo "$as_me: error: Unknown argument to enable/disable linux-futex" >&2;} else enable_linux_futex=default -fi; +fi + case "$target" in *-linux*) @@ -114168,27 +109819,23 @@ syscall (SYS_gettid); syscall (SYS_futex, &lk, 0, 0, 0); } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then save_LIBS="$LIBS" LIBS="-lpthread $LIBS" if test x$gcc_no_link = xyes; then @@ -114216,33 +109863,29 @@ pthread_tryjoin_np (th, &status); } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then enable_linux_futex=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -if test x$cross_compiling = xno; then + if test x$cross_compiling = xno; then if getconf GNU_LIBPTHREAD_VERSION 2>/dev/null \ | LC_ALL=C grep -i NPTL > /dev/null 2>/dev/null; then :; else { echo "$as_me:$LINENO: WARNING: The kernel might not support futex or gettid syscalls. @@ -114253,15 +109896,18 @@ If so, please configure with --disable-linux-futex" >&2;} fi enable_linux_futex=yes fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext LIBS="$save_LIBS" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 + fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext ;; yes) @@ -114287,37 +109933,34 @@ syscall (SYS_gettid); syscall (SYS_futex, &lk, 0, 0, 0); } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then : else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -{ { echo "$as_me:$LINENO: error: SYS_gettid and SYS_futex required for --enable-linux-futex" >&5 + { { echo "$as_me:$LINENO: error: SYS_gettid and SYS_futex required for --enable-linux-futex" >&5 echo "$as_me: error: SYS_gettid and SYS_futex required for --enable-linux-futex" >&2;} { (exit 1); exit 1; }; } fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext ;; esac @@ -114338,10 +109981,9 @@ fi # This depends on GLIBCXX CHECK_LINKER_FEATURES, but without it assumes no. - # Check whether --enable-symvers or --disable-symvers was given. + # Check whether --enable-symvers was given. if test "${enable_symvers+set}" = set; then - enableval="$enable_symvers" - + enableval=$enable_symvers; case "$enableval" in yes|no|gnu|gnu-versioned-namespace|darwin|darwin-export) ;; *) { { echo "$as_me:$LINENO: error: Unknown argument to enable/disable symvers" >&5 @@ -114351,7 +109993,8 @@ echo "$as_me: error: Unknown argument to enable/disable symvers" >&2;} else enable_symvers=yes -fi; +fi + # If we never went through the GLIBCXX_CHECK_LINKER_FEATURES macro, then we @@ -114384,8 +110027,8 @@ fi # Check to see if 'gnu' can win. if test $enable_symvers = gnu || test $enable_symvers = gnu-versioned-namespace; then # Check to see if libgcc_s exists, indicating that shared libgcc is possible. - echo "$as_me:$LINENO: checking for shared libgcc" >&5 -echo $ECHO_N "checking for shared libgcc... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for shared libgcc" >&5 +echo $ECHO_N "checking for shared libgcc... $ECHO_C" >&6; } ac_save_CFLAGS="$CFLAGS" CFLAGS=' -lgcc_s' if test x$gcc_no_link = xyes; then @@ -114409,35 +110052,32 @@ return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then glibcxx_shared_libgcc=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_shared_libgcc=no + glibcxx_shared_libgcc=no fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext CFLAGS="$ac_save_CFLAGS" if test $glibcxx_shared_libgcc = no; then @@ -114472,40 +110112,38 @@ return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then glibcxx_shared_libgcc=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 + fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext CFLAGS="$ac_save_CFLAGS" fi fi - echo "$as_me:$LINENO: result: $glibcxx_shared_libgcc" >&5 -echo "${ECHO_T}$glibcxx_shared_libgcc" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_shared_libgcc" >&5 +echo "${ECHO_T}$glibcxx_shared_libgcc" >&6; } # For GNU ld, we need at least this version. The format is described in # GLIBCXX_CHECK_LINKER_FEATURES above. @@ -114597,8 +110235,8 @@ echo "$as_me: versioning on shared library symbols is $enable_symvers" >&6;} # In addition, need this to deal with std::size_t mangling in # src/compatibility.cc. In a perfect world, could use # typeid(std::size_t).name()[0] to do direct substitution. -echo "$as_me:$LINENO: checking for size_t as unsigned int" >&5 -echo $ECHO_N "checking for size_t as unsigned int... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking for size_t as unsigned int" >&5 +echo $ECHO_N "checking for size_t as unsigned int... $ECHO_C" >&6; } ac_save_CFLAGS="$CFLAGS" CFLAGS="-Werror" cat >conftest.$ac_ext <<_ACEOF @@ -114617,35 +110255,31 @@ __SIZE_TYPE__* stp; unsigned int* uip; stp = uip; } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_size_t_is_i=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_size_t_is_i=no + glibcxx_size_t_is_i=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext CFLAGS=$ac_save_CFLAGS if test "$glibcxx_size_t_is_i" = yes; then @@ -114654,11 +110288,11 @@ cat >>confdefs.h <<\_ACEOF _ACEOF fi -echo "$as_me:$LINENO: result: $glibcxx_size_t_is_i" >&5 -echo "${ECHO_T}$glibcxx_size_t_is_i" >&6 +{ echo "$as_me:$LINENO: result: $glibcxx_size_t_is_i" >&5 +echo "${ECHO_T}$glibcxx_size_t_is_i" >&6; } -echo "$as_me:$LINENO: checking for ptrdiff_t as int" >&5 -echo $ECHO_N "checking for ptrdiff_t as int... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking for ptrdiff_t as int" >&5 +echo $ECHO_N "checking for ptrdiff_t as int... $ECHO_C" >&6; } ac_save_CFLAGS="$CFLAGS" CFLAGS="-Werror" cat >conftest.$ac_ext <<_ACEOF @@ -114677,35 +110311,31 @@ __PTRDIFF_TYPE__* ptp; int* ip; ptp = ip; } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_ptrdiff_t_is_i=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_ptrdiff_t_is_i=no + glibcxx_ptrdiff_t_is_i=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext CFLAGS=$ac_save_CFLAGS if test "$glibcxx_ptrdiff_t_is_i" = yes; then @@ -114714,14 +110344,13 @@ cat >>confdefs.h <<\_ACEOF _ACEOF fi -echo "$as_me:$LINENO: result: $glibcxx_ptrdiff_t_is_i" >&5 -echo "${ECHO_T}$glibcxx_ptrdiff_t_is_i" >&6 +{ echo "$as_me:$LINENO: result: $glibcxx_ptrdiff_t_is_i" >&5 +echo "${ECHO_T}$glibcxx_ptrdiff_t_is_i" >&6; } - # Check whether --enable-visibility or --disable-visibility was given. + # Check whether --enable-visibility was given. if test "${enable_visibility+set}" = set; then - enableval="$enable_visibility" - + enableval=$enable_visibility; case "$enableval" in yes|no) ;; *) { { echo "$as_me:$LINENO: error: Argument to enable/disable visibility must be yes or no" >&5 @@ -114731,12 +110360,13 @@ echo "$as_me: error: Argument to enable/disable visibility must be yes or no" >& else enable_visibility=yes -fi; +fi + if test x$enable_visibility = xyes ; then - echo "$as_me:$LINENO: checking whether the target supports hidden visibility" >&5 -echo $ECHO_N "checking whether the target supports hidden visibility... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking whether the target supports hidden visibility" >&5 +echo $ECHO_N "checking whether the target supports hidden visibility... $ECHO_C" >&6; } if test "${have_attribute_visibility+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else @@ -114759,39 +110389,35 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then have_attribute_visibility=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -have_attribute_visibility=no + have_attribute_visibility=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext CFLAGS="$save_CFLAGS" fi -echo "$as_me:$LINENO: result: $have_attribute_visibility" >&5 -echo "${ECHO_T}$have_attribute_visibility" >&6 +{ echo "$as_me:$LINENO: result: $have_attribute_visibility" >&5 +echo "${ECHO_T}$have_attribute_visibility" >&6; } if test $have_attribute_visibility = no; then enable_visibility=no fi @@ -114829,35 +110455,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then ac_ldbl_compat=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -ac_ldbl_compat=no + ac_ldbl_compat=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test "$ac_ldbl_compat" = yes; then cat >>confdefs.h <<\_ACEOF @@ -114881,18 +110503,19 @@ esac for ac_header in unistd.h sys/time.h sys/resource.h do as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + { echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 +ac_res=`eval echo '${'$as_ac_Header'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } else # Is the header compilable? -echo "$as_me:$LINENO: checking $ac_header usability" >&5 -echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking $ac_header usability" >&5 +echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6; } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF @@ -114903,41 +110526,37 @@ $ac_includes_default #include <$ac_header> _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then ac_header_compiler=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -ac_header_compiler=no + ac_header_compiler=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 -echo "${ECHO_T}$ac_header_compiler" >&6 + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +echo "${ECHO_T}$ac_header_compiler" >&6; } # Is the header present? -echo "$as_me:$LINENO: checking $ac_header presence" >&5 -echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 +{ echo "$as_me:$LINENO: checking $ac_header presence" >&5 +echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6; } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF @@ -114946,24 +110565,22 @@ cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include <$ac_header> _ACEOF -if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 - (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 +if { (ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null; then - if test -s conftest.err; then - ac_cpp_err=$ac_c_preproc_warn_flag - ac_cpp_err=$ac_cpp_err$ac_c_werror_flag - else - ac_cpp_err= - fi -else - ac_cpp_err=yes -fi -if test -z "$ac_cpp_err"; then + (exit $ac_status); } >/dev/null && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then ac_header_preproc=yes else echo "$as_me: failed program was:" >&5 @@ -114971,9 +110588,10 @@ sed 's/^/| /' conftest.$ac_ext >&5 ac_header_preproc=no fi + rm -f conftest.err conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 -echo "${ECHO_T}$ac_header_preproc" >&6 +{ echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 +echo "${ECHO_T}$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in @@ -114997,25 +110615,19 @@ echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\ echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} - ( - cat <<\_ASBOX -## ----------------------------------------- ## -## Report this to the package-unused lists. ## -## ----------------------------------------- ## -_ASBOX - ) | - sed "s/^/$as_me: WARNING: /" >&2 + ;; esac -echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else eval "$as_ac_Header=\$ac_header_preproc" fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 +ac_res=`eval echo '${'$as_ac_Header'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } fi if test `eval echo '${'$as_ac_Header'}'` = yes; then @@ -115034,8 +110646,8 @@ done if test $setrlimit_have_headers = yes; then # Can't do these in a loop, else the resulting syntax is wrong. - echo "$as_me:$LINENO: checking for RLIMIT_DATA" >&5 -echo $ECHO_N "checking for RLIMIT_DATA... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for RLIMIT_DATA" >&5 +echo $ECHO_N "checking for RLIMIT_DATA... $ECHO_C" >&6; } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF @@ -115055,47 +110667,43 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_mresult=1 else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_mresult=0 + glibcxx_mresult=0 fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext cat >>confdefs.h <<_ACEOF #define HAVE_LIMIT_DATA $glibcxx_mresult _ACEOF if test $glibcxx_mresult = 1 ; then res=yes ; else res=no ; fi - echo "$as_me:$LINENO: result: $res" >&5 -echo "${ECHO_T}$res" >&6 + { echo "$as_me:$LINENO: result: $res" >&5 +echo "${ECHO_T}$res" >&6; } - echo "$as_me:$LINENO: checking for RLIMIT_RSS" >&5 -echo $ECHO_N "checking for RLIMIT_RSS... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for RLIMIT_RSS" >&5 +echo $ECHO_N "checking for RLIMIT_RSS... $ECHO_C" >&6; } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF @@ -115115,47 +110723,43 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_mresult=1 else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_mresult=0 + glibcxx_mresult=0 fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext cat >>confdefs.h <<_ACEOF #define HAVE_LIMIT_RSS $glibcxx_mresult _ACEOF if test $glibcxx_mresult = 1 ; then res=yes ; else res=no ; fi - echo "$as_me:$LINENO: result: $res" >&5 -echo "${ECHO_T}$res" >&6 + { echo "$as_me:$LINENO: result: $res" >&5 +echo "${ECHO_T}$res" >&6; } - echo "$as_me:$LINENO: checking for RLIMIT_VMEM" >&5 -echo $ECHO_N "checking for RLIMIT_VMEM... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for RLIMIT_VMEM" >&5 +echo $ECHO_N "checking for RLIMIT_VMEM... $ECHO_C" >&6; } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF @@ -115175,47 +110779,43 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_mresult=1 else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_mresult=0 + glibcxx_mresult=0 fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext cat >>confdefs.h <<_ACEOF #define HAVE_LIMIT_VMEM $glibcxx_mresult _ACEOF if test $glibcxx_mresult = 1 ; then res=yes ; else res=no ; fi - echo "$as_me:$LINENO: result: $res" >&5 -echo "${ECHO_T}$res" >&6 + { echo "$as_me:$LINENO: result: $res" >&5 +echo "${ECHO_T}$res" >&6; } - echo "$as_me:$LINENO: checking for RLIMIT_AS" >&5 -echo $ECHO_N "checking for RLIMIT_AS... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for RLIMIT_AS" >&5 +echo $ECHO_N "checking for RLIMIT_AS... $ECHO_C" >&6; } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF @@ -115235,47 +110835,43 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_mresult=1 else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_mresult=0 + glibcxx_mresult=0 fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext cat >>confdefs.h <<_ACEOF #define HAVE_LIMIT_AS $glibcxx_mresult _ACEOF if test $glibcxx_mresult = 1 ; then res=yes ; else res=no ; fi - echo "$as_me:$LINENO: result: $res" >&5 -echo "${ECHO_T}$res" >&6 + { echo "$as_me:$LINENO: result: $res" >&5 +echo "${ECHO_T}$res" >&6; } - echo "$as_me:$LINENO: checking for RLIMIT_FSIZE" >&5 -echo $ECHO_N "checking for RLIMIT_FSIZE... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for RLIMIT_FSIZE" >&5 +echo $ECHO_N "checking for RLIMIT_FSIZE... $ECHO_C" >&6; } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF @@ -115295,43 +110891,39 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_mresult=1 else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_mresult=0 + glibcxx_mresult=0 fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext cat >>confdefs.h <<_ACEOF #define HAVE_LIMIT_FSIZE $glibcxx_mresult _ACEOF if test $glibcxx_mresult = 1 ; then res=yes ; else res=no ; fi - echo "$as_me:$LINENO: result: $res" >&5 -echo "${ECHO_T}$res" >&6 + { echo "$as_me:$LINENO: result: $res" >&5 +echo "${ECHO_T}$res" >&6; } # Check for rlimit, setrlimit. @@ -115359,42 +110951,38 @@ struct rlimit r; } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then ac_setrlimit=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -ac_setrlimit=no + ac_setrlimit=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi fi - echo "$as_me:$LINENO: checking for testsuite resource limits support" >&5 -echo $ECHO_N "checking for testsuite resource limits support... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for testsuite resource limits support" >&5 +echo $ECHO_N "checking for testsuite resource limits support... $ECHO_C" >&6; } if test $setrlimit_have_headers = yes && test $ac_setrlimit = yes; then ac_res_limits=yes @@ -115405,22 +110993,21 @@ _ACEOF else ac_res_limits=no fi - echo "$as_me:$LINENO: result: $ac_res_limits" >&5 -echo "${ECHO_T}$ac_res_limits" >&6 + { echo "$as_me:$LINENO: result: $ac_res_limits" >&5 +echo "${ECHO_T}$ac_res_limits" >&6; } # Look for setenv, so that extended locale tests can be performed. - echo "$as_me:$LINENO: checking for setenv declaration" >&5 -echo $ECHO_N "checking for setenv declaration... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for setenv declaration" >&5 +echo $ECHO_N "checking for setenv declaration... $ECHO_C" >&6; } if test x${glibcxx_cv_func_setenv_use+set} != xset; then if test "${glibcxx_cv_func_setenv_use+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - - ac_ext=cc + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' @@ -115442,35 +111029,31 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then glibcxx_cv_func_setenv_use=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -glibcxx_cv_func_setenv_use=no + glibcxx_cv_func_setenv_use=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -115481,16 +111064,16 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi - echo "$as_me:$LINENO: result: $glibcxx_cv_func_setenv_use" >&5 -echo "${ECHO_T}$glibcxx_cv_func_setenv_use" >&6 + { echo "$as_me:$LINENO: result: $glibcxx_cv_func_setenv_use" >&5 +echo "${ECHO_T}$glibcxx_cv_func_setenv_use" >&6; } if test x$glibcxx_cv_func_setenv_use = x"yes"; then for ac_func in setenv do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test x$gcc_no_link = xyes; then @@ -115521,68 +111104,60 @@ cat >>conftest.$ac_ext <<_ACEOF #undef $ac_func -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" -{ #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#if defined __stub_$ac_func || defined __stub___$ac_func choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} #endif int main () { -return f != $ac_func; +return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -eval "$as_ac_var=no" + eval "$as_ac_var=no" fi -rm -f conftest.err conftest.$ac_objext \ + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 @@ -115636,9 +111211,7 @@ ABI_TWEAKS_SRCDIR=config/${abi_tweaks_dir} #AM_CONDITIONAL(CANADIAN, test $CANADIAN = yes) # from GLIBCXX_CHECK_COMPLEX_MATH_SUPPORT: #AM_CONDITIONAL(GLIBCXX_BUILD_LIBMATH, test $need_libmath = yes) - - -if test $is_hosted = yes; then + if test $is_hosted = yes; then GLIBCXX_HOSTED_TRUE= GLIBCXX_HOSTED_FALSE='#' else @@ -115647,9 +111220,7 @@ else fi - - -if test $enable_libstdcxx_pch = yes; then + if test $enable_libstdcxx_pch = yes; then GLIBCXX_BUILD_PCH_TRUE= GLIBCXX_BUILD_PCH_FALSE='#' else @@ -115658,9 +111229,7 @@ else fi - - -if test $enable_cheaders = c; then + if test $enable_cheaders = c; then GLIBCXX_C_HEADERS_C_TRUE= GLIBCXX_C_HEADERS_C_FALSE='#' else @@ -115669,9 +111238,7 @@ else fi - - -if test $enable_cheaders = c_std; then + if test $enable_cheaders = c_std; then GLIBCXX_C_HEADERS_C_STD_TRUE= GLIBCXX_C_HEADERS_C_STD_FALSE='#' else @@ -115680,9 +111247,7 @@ else fi - - -if test $enable_cheaders = c_global; then + if test $enable_cheaders = c_global; then GLIBCXX_C_HEADERS_C_GLOBAL_TRUE= GLIBCXX_C_HEADERS_C_GLOBAL_FALSE='#' else @@ -115691,9 +111256,7 @@ else fi - - -if test $c_compatibility = yes; then + if test $c_compatibility = yes; then GLIBCXX_C_HEADERS_COMPATIBILITY_TRUE= GLIBCXX_C_HEADERS_COMPATIBILITY_FALSE='#' else @@ -115702,9 +111265,7 @@ else fi - - -if test $c_extra = yes; then + if test $c_extra = yes; then GLIBCXX_C_HEADERS_EXTRA_TRUE= GLIBCXX_C_HEADERS_EXTRA_FALSE='#' else @@ -115713,9 +111274,7 @@ else fi - - -if test $enable_libstdcxx_debug = yes; then + if test $enable_libstdcxx_debug = yes; then GLIBCXX_BUILD_DEBUG_TRUE= GLIBCXX_BUILD_DEBUG_FALSE='#' else @@ -115724,9 +111283,7 @@ else fi - - -if test $enable_parallel = yes; then + if test $enable_parallel = yes; then ENABLE_PARALLEL_TRUE= ENABLE_PARALLEL_FALSE='#' else @@ -115735,9 +111292,7 @@ else fi - - -if test $enable_symvers != no; then + if test $enable_symvers != no; then ENABLE_SYMVERS_TRUE= ENABLE_SYMVERS_FALSE='#' else @@ -115746,9 +111301,7 @@ else fi - - -if test $enable_symvers = gnu; then + if test $enable_symvers = gnu; then ENABLE_SYMVERS_GNU_TRUE= ENABLE_SYMVERS_GNU_FALSE='#' else @@ -115757,9 +111310,7 @@ else fi - - -if test $enable_symvers = gnu-versioned-namespace; then + if test $enable_symvers = gnu-versioned-namespace; then ENABLE_SYMVERS_GNU_NAMESPACE_TRUE= ENABLE_SYMVERS_GNU_NAMESPACE_FALSE='#' else @@ -115768,9 +111319,7 @@ else fi - - -if test $enable_symvers = darwin; then + if test $enable_symvers = darwin; then ENABLE_SYMVERS_DARWIN_TRUE= ENABLE_SYMVERS_DARWIN_FALSE='#' else @@ -115779,9 +111328,7 @@ else fi - - -if test $enable_visibility = yes; then + if test $enable_visibility = yes; then ENABLE_VISIBILITY_TRUE= ENABLE_VISIBILITY_FALSE='#' else @@ -115790,9 +111337,7 @@ else fi - - -if test $ac_ldbl_compat = yes; then + if test $ac_ldbl_compat = yes; then GLIBCXX_LDBL_COMPAT_TRUE= GLIBCXX_LDBL_COMPAT_FALSE='#' else @@ -115821,39 +111366,58 @@ _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. -# So, don't put newlines in cache variables' values. +# So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. -{ +( + for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do + eval ac_val=\$$ac_var + case $ac_val in #( + *${as_nl}*) + case $ac_var in #( + *_cv_*) { echo "$as_me:$LINENO: WARNING: Cache variable $ac_var contains a newline." >&5 +echo "$as_me: WARNING: Cache variable $ac_var contains a newline." >&2;} ;; + esac + case $ac_var in #( + _ | IFS | as_nl) ;; #( + *) $as_unset $ac_var ;; + esac ;; + esac + done + (set) 2>&1 | - case `(ac_space=' '; set | grep ac_space) 2>&1` in - *ac_space=\ *) + case $as_nl`(ac_space=' '; set) 2>&1` in #( + *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes (double-quote # substitution turns \\\\ into \\, and sed turns \\ into \). sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" - ;; + ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. - sed -n \ - "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p" + sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; - esac; -} | + esac | + sort +) | sed ' + /^ac_cv_env_/b end t clear - : clear + :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end - /^ac_cv_env/!s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ - : end' >>confcache -if diff $cache_file confcache >/dev/null 2>&1; then :; else - if test -w $cache_file; then - test "x$cache_file" != "x/dev/null" && echo "updating cache $cache_file" + s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ + :end' >>confcache +if diff "$cache_file" confcache >/dev/null 2>&1; then :; else + if test -w "$cache_file"; then + test "x$cache_file" != "x/dev/null" && + { echo "$as_me:$LINENO: updating cache $cache_file" >&5 +echo "$as_me: updating cache $cache_file" >&6;} cat confcache >$cache_file else - echo "not updating unwritable cache $cache_file" + { echo "$as_me:$LINENO: not updating unwritable cache $cache_file" >&5 +echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache @@ -115870,13 +111434,12 @@ fi glibcxx_toolexeclibdir=no glibcxx_prefixdir=$prefix - echo "$as_me:$LINENO: checking for gxx-include-dir" >&5 -echo $ECHO_N "checking for gxx-include-dir... $ECHO_C" >&6 + { echo "$as_me:$LINENO: checking for gxx-include-dir" >&5 +echo $ECHO_N "checking for gxx-include-dir... $ECHO_C" >&6; } -# Check whether --with-gxx-include-dir or --without-gxx-include-dir was given. +# Check whether --with-gxx-include-dir was given. if test "${with_gxx_include_dir+set}" = set; then - withval="$with_gxx_include_dir" - case "$withval" in + withval=$with_gxx_include_dir; case "$withval" in yes) { { echo "$as_me:$LINENO: error: Missing directory for --with-gxx-include-dir" >&5 echo "$as_me: error: Missing directory for --with-gxx-include-dir" >&2;} { (exit 1); exit 1; }; } ;; @@ -115885,16 +111448,16 @@ echo "$as_me: error: Missing directory for --with-gxx-include-dir" >&2;} esac else gxx_include_dir=no -fi; - echo "$as_me:$LINENO: result: $gxx_include_dir" >&5 -echo "${ECHO_T}$gxx_include_dir" >&6 +fi + + { echo "$as_me:$LINENO: result: $gxx_include_dir" >&5 +echo "${ECHO_T}$gxx_include_dir" >&6; } - echo "$as_me:$LINENO: checking for --enable-version-specific-runtime-libs" >&5 -echo $ECHO_N "checking for --enable-version-specific-runtime-libs... $ECHO_C" >&6 - # Check whether --enable-version-specific-runtime-libs or --disable-version-specific-runtime-libs was given. + { echo "$as_me:$LINENO: checking for --enable-version-specific-runtime-libs" >&5 +echo $ECHO_N "checking for --enable-version-specific-runtime-libs... $ECHO_C" >&6; } + # Check whether --enable-version-specific-runtime-libs was given. if test "${enable_version_specific_runtime_libs+set}" = set; then - enableval="$enable_version_specific_runtime_libs" - case "$enableval" in + enableval=$enable_version_specific_runtime_libs; case "$enableval" in yes) version_specific_libs=yes ;; no) version_specific_libs=no ;; *) { { echo "$as_me:$LINENO: error: Unknown argument to enable/disable version-specific libs" >&5 @@ -115903,9 +111466,10 @@ echo "$as_me: error: Unknown argument to enable/disable version-specific libs" > esac else version_specific_libs=no -fi; - echo "$as_me:$LINENO: result: $version_specific_libs" >&5 -echo "${ECHO_T}$version_specific_libs" >&6 +fi + + { echo "$as_me:$LINENO: result: $version_specific_libs" >&5 +echo "${ECHO_T}$version_specific_libs" >&6; } # Default case for install directory for include files. if test $version_specific_libs = no && test $gxx_include_dir = no; then @@ -115949,10 +111513,10 @@ echo "${ECHO_T}$version_specific_libs" >&6 esac fi - echo "$as_me:$LINENO: checking for install location" >&5 -echo $ECHO_N "checking for install location... $ECHO_C" >&6 - echo "$as_me:$LINENO: result: $gxx_include_dir" >&5 -echo "${ECHO_T}$gxx_include_dir" >&6 + { echo "$as_me:$LINENO: checking for install location" >&5 +echo $ECHO_N "checking for install location... $ECHO_C" >&6; } + { echo "$as_me:$LINENO: result: $gxx_include_dir" >&5 +echo "${ECHO_T}$gxx_include_dir" >&6; } @@ -116000,12 +111564,12 @@ else fi - ac_config_files="$ac_config_files Makefile include/Makefile libmath/Makefile libsupc++/Makefile src/Makefile po/Makefile testsuite/Makefile" +ac_config_files="$ac_config_files Makefile include/Makefile libmath/Makefile libsupc++/Makefile src/Makefile doc/Makefile po/Makefile testsuite/Makefile" - ac_config_files="$ac_config_files scripts/testsuite_flags" +ac_config_files="$ac_config_files scripts/testsuite_flags" - ac_config_commands="$ac_config_commands default" +ac_config_commands="$ac_config_commands default" cat >confcache <<\_ACEOF @@ -116026,39 +111590,58 @@ _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. -# So, don't put newlines in cache variables' values. +# So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. -{ +( + for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do + eval ac_val=\$$ac_var + case $ac_val in #( + *${as_nl}*) + case $ac_var in #( + *_cv_*) { echo "$as_me:$LINENO: WARNING: Cache variable $ac_var contains a newline." >&5 +echo "$as_me: WARNING: Cache variable $ac_var contains a newline." >&2;} ;; + esac + case $ac_var in #( + _ | IFS | as_nl) ;; #( + *) $as_unset $ac_var ;; + esac ;; + esac + done + (set) 2>&1 | - case `(ac_space=' '; set | grep ac_space) 2>&1` in - *ac_space=\ *) + case $as_nl`(ac_space=' '; set) 2>&1` in #( + *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes (double-quote # substitution turns \\\\ into \\, and sed turns \\ into \). sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" - ;; + ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. - sed -n \ - "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p" + sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; - esac; -} | + esac | + sort +) | sed ' + /^ac_cv_env_/b end t clear - : clear + :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end - /^ac_cv_env/!s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ - : end' >>confcache -if diff $cache_file confcache >/dev/null 2>&1; then :; else - if test -w $cache_file; then - test "x$cache_file" != "x/dev/null" && echo "updating cache $cache_file" + s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ + :end' >>confcache +if diff "$cache_file" confcache >/dev/null 2>&1; then :; else + if test -w "$cache_file"; then + test "x$cache_file" != "x/dev/null" && + { echo "$as_me:$LINENO: updating cache $cache_file" >&5 +echo "$as_me: updating cache $cache_file" >&6;} cat confcache >$cache_file else - echo "not updating unwritable cache $cache_file" + { echo "$as_me:$LINENO: not updating unwritable cache $cache_file" >&5 +echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache @@ -116067,32 +111650,18 @@ test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' -# VPATH may cause trouble with some makes, so we remove $(srcdir), -# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and -# trailing colons and then remove the whole line if VPATH becomes empty -# (actually we leave an empty line to preserve line numbers). -if test "x$srcdir" = x.; then - ac_vpsub='/^[ ]*VPATH[ ]*=/{ -s/:*\$(srcdir):*/:/; -s/:*\${srcdir}:*/:/; -s/:*@srcdir@:*/:/; -s/^\([^=]*=[ ]*\):*/\1/; -s/:*$//; -s/^[^=]*=[ ]*$//; -}' -fi - DEFS=-DHAVE_CONFIG_H ac_libobjs= ac_ltlibobjs= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. - ac_i=`echo "$ac_i" | - sed 's/\$U\././;s/\.o$//;s/\.obj$//'` - # 2. Add them. - ac_libobjs="$ac_libobjs $ac_i\$U.$ac_objext" - ac_ltlibobjs="$ac_ltlibobjs $ac_i"'$U.lo' + ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' + ac_i=`echo "$ac_i" | sed "$ac_script"` + # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR + # will be set to the directory where LIBOBJS objects are built. + ac_libobjs="$ac_libobjs \${LIBOBJDIR}$ac_i\$U.$ac_objext" + ac_ltlibobjs="$ac_ltlibobjs \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs @@ -116235,17 +111804,45 @@ cat >>$CONFIG_STATUS <<\_ACEOF ## M4sh Initialization. ## ## --------------------- ## -# Be Bourne compatible +# Be more Bourne compatible +DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' -elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then - set -o posix + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in + *posix*) set -o posix ;; +esac + +fi + + + + +# PATH needs CR +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + echo "#! /bin/sh" >conf$$.sh + echo "exit 0" >>conf$$.sh + chmod +x conf$$.sh + if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then + PATH_SEPARATOR=';' + else + PATH_SEPARATOR=: + fi + rm -f conf$$.sh fi -DUALCASE=1; export DUALCASE # for MKS sh # Support unset when possible. if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then @@ -116255,8 +111852,43 @@ else fi +# IFS +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent editors from complaining about space-tab. +# (If _AS_PATH_WALK were called with IFS unset, it would disable word +# splitting by setting IFS to empty value.) +as_nl=' +' +IFS=" "" $as_nl" + +# Find who we are. Look in the path if we contain no directory separator. +case $0 in + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break +done +IFS=$as_save_IFS + + ;; +esac +# We did not find ourselves, most probably we were run as `sh COMMAND' +# in which case we are not to be found in the path. +if test "x$as_myself" = x; then + as_myself=$0 +fi +if test ! -f "$as_myself"; then + echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + { (exit 1); exit 1; } +fi + # Work around bugs in pre-3.0 UWIN ksh. -$as_unset ENV MAIL MAILPATH +for as_var in ENV MAIL MAILPATH +do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var +done PS1='$ ' PS2='> ' PS4='+ ' @@ -116270,18 +111902,19 @@ do if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then eval $as_var=C; export $as_var else - $as_unset $as_var + ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var fi done # Required to use basename. -if expr a : '\(a\)' >/dev/null 2>&1; then +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi -if (basename /) >/dev/null 2>&1 && test "X`basename / 2>&1`" = "X/"; then +if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false @@ -116289,159 +111922,120 @@ fi # Name of the executable. -as_me=`$as_basename "$0" || +as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ - X"$0" : 'X\(/\)$' \| \ - . : '\(.\)' 2>/dev/null || + X"$0" : 'X\(/\)' \| . 2>/dev/null || echo X/"$0" | - sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; } - /^X\/\(\/\/\)$/{ s//\1/; q; } - /^X\/\(\/\).*/{ s//\1/; q; } - s/.*/./; q'` + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` - -# PATH needs CR, and LINENO needs CR and PATH. -# Avoid depending upon Character Ranges. -as_cr_letters='abcdefghijklmnopqrstuvwxyz' -as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' -as_cr_Letters=$as_cr_letters$as_cr_LETTERS -as_cr_digits='0123456789' -as_cr_alnum=$as_cr_Letters$as_cr_digits - -# The user is always right. -if test "${PATH_SEPARATOR+set}" != set; then - echo "#! /bin/sh" >conf$$.sh - echo "exit 0" >>conf$$.sh - chmod +x conf$$.sh - if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then - PATH_SEPARATOR=';' - else - PATH_SEPARATOR=: - fi - rm -f conf$$.sh -fi +# CDPATH. +$as_unset CDPATH - as_lineno_1=$LINENO - as_lineno_2=$LINENO - as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` - test "x$as_lineno_1" != "x$as_lineno_2" && - test "x$as_lineno_3" = "x$as_lineno_2" || { - # Find who we are. Look in the path if we contain no path at all - # relative or not. - case $0 in - *[\\/]* ) as_myself=$0 ;; - *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break -done - ;; - esac - # We did not find ourselves, most probably we were run as `sh COMMAND' - # in which case we are not to be found in the path. - if test "x$as_myself" = x; then - as_myself=$0 - fi - if test ! -f "$as_myself"; then - { { echo "$as_me:$LINENO: error: cannot find myself; rerun with an absolute path" >&5 -echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2;} - { (exit 1); exit 1; }; } - fi - case $CONFIG_SHELL in - '') - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for as_base in sh bash ksh sh5; do - case $as_dir in - /*) - if ("$as_dir/$as_base" -c ' as_lineno_1=$LINENO as_lineno_2=$LINENO - as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` test "x$as_lineno_1" != "x$as_lineno_2" && - test "x$as_lineno_3" = "x$as_lineno_2" ') 2>/dev/null; then - $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; } - $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; } - CONFIG_SHELL=$as_dir/$as_base - export CONFIG_SHELL - exec "$CONFIG_SHELL" "$0" ${1+"$@"} - fi;; - esac - done -done -;; - esac + test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || { # Create $as_me.lineno as a copy of $as_myself, but with $LINENO # uniformly replaced by the line number. The first 'sed' inserts a - # line-number line before each line; the second 'sed' does the real - # work. The second script uses 'N' to pair each line-number line - # with the numbered line, and appends trailing '-' during - # substitution so that $LINENO is not a special case at line end. + # line-number line after each line using $LINENO; the second 'sed' + # does the real work. The second script uses 'N' to pair each + # line-number line with the line containing $LINENO, and appends + # trailing '-' during substitution so that $LINENO is not a special + # case at line end. # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the - # second 'sed' script. Blame Lee E. McMahon for sed's syntax. :-) - sed '=' <$as_myself | + # scripts with optimization help from Paolo Bonzini. Blame Lee + # E. McMahon (1931-1989) for sed's syntax. :-) + sed -n ' + p + /[$]LINENO/= + ' <$as_myself | sed ' + s/[$]LINENO.*/&-/ + t lineno + b + :lineno N - s,$,-, - : loop - s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3, + :loop + s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop - s,-$,, - s,^['$as_cr_digits']*\n,, + s/-\n.*// ' >$as_me.lineno && - chmod +x $as_me.lineno || - { { echo "$as_me:$LINENO: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&5 -echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2;} + chmod +x "$as_me.lineno" || + { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2 { (exit 1); exit 1; }; } # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the - # original and so on. Autoconf is especially sensible to this). - . ./$as_me.lineno + # original and so on. Autoconf is especially sensitive to this). + . "./$as_me.lineno" # Exit status is that of the last command. exit } -case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in - *c*,-n*) ECHO_N= ECHO_C=' -' ECHO_T=' ' ;; - *c*,* ) ECHO_N=-n ECHO_C= ECHO_T= ;; - *) ECHO_N= ECHO_C='\c' ECHO_T= ;; +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in +-n*) + case `echo 'x\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + *) ECHO_C='\c';; + esac;; +*) + ECHO_N='-n';; esac -if expr a : '\(a\)' >/dev/null 2>&1; then +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi rm -f conf$$ conf$$.exe conf$$.file +if test -d conf$$.dir; then + rm -f conf$$.dir/conf$$.file +else + rm -f conf$$.dir + mkdir conf$$.dir +fi echo >conf$$.file if ln -s conf$$.file conf$$ 2>/dev/null; then - # We could just check for DJGPP; but this test a) works b) is more generic - # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04). - if test -f conf$$.exe; then - # Don't use ln at all; we don't have any links + as_ln_s='ln -s' + # ... but there are two gotchas: + # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. + # In both cases, we have to default to `cp -p'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -p' - else - as_ln_s='ln -s' - fi elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -p' fi -rm -f conf$$ conf$$.exe conf$$.file +rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file +rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p=: @@ -116450,7 +112044,28 @@ else as_mkdir_p=false fi -as_executable_p="test -f" +if test -x / >/dev/null 2>&1; then + as_test_x='test -x' +else + if ls -dL / >/dev/null 2>&1; then + as_ls_L_option=L + else + as_ls_L_option= + fi + as_test_x=' + eval sh -c '\'' + if test -d "$1"; then + test -d "$1/."; + else + case $1 in + -*)set "./$1";; + esac; + case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in + ???[sx]*):;;*)false;;esac;fi + '\'' sh + ' +fi +as_executable_p=$as_test_x # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" @@ -116459,31 +112074,14 @@ as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" -# IFS -# We need space, tab and new line, in precisely that order. -as_nl=' -' -IFS=" $as_nl" - -# CDPATH. -$as_unset CDPATH - exec 6>&1 -# Open the log real soon, to keep \$[0] and so on meaningful, and to +# Save the log message, to keep $[0] and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their -# values after options handling. Logging --version etc. is OK. -exec 5>>config.log -{ - echo - sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX -## Running $as_me. ## -_ASBOX -} >&5 -cat >&5 <<_CSEOF - +# values after options handling. +ac_log=" This file was extended by package-unused $as_me version-unused, which was -generated by GNU Autoconf 2.59. Invocation command line was +generated by GNU Autoconf 2.61. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS @@ -116491,30 +112089,20 @@ generated by GNU Autoconf 2.59. Invocation command line was CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ -_CSEOF -echo "on `(hostname || uname -n) 2>/dev/null | sed 1q`" >&5 -echo >&5 +on `(hostname || uname -n) 2>/dev/null | sed 1q` +" + _ACEOF +cat >>$CONFIG_STATUS <<_ACEOF # Files that config.status was made for. -if test -n "$ac_config_files"; then - echo "config_files=\"$ac_config_files\"" >>$CONFIG_STATUS -fi - -if test -n "$ac_config_headers"; then - echo "config_headers=\"$ac_config_headers\"" >>$CONFIG_STATUS -fi - -if test -n "$ac_config_links"; then - echo "config_links=\"$ac_config_links\"" >>$CONFIG_STATUS -fi +config_files="$ac_config_files" +config_headers="$ac_config_headers" +config_commands="$ac_config_commands" -if test -n "$ac_config_commands"; then - echo "config_commands=\"$ac_config_commands\"" >>$CONFIG_STATUS -fi +_ACEOF cat >>$CONFIG_STATUS <<\_ACEOF - ac_cs_usage="\ \`$as_me' instantiates files from templates according to the current configuration. @@ -116522,7 +112110,7 @@ current configuration. Usage: $0 [OPTIONS] [FILE]... -h, --help print this help, then exit - -V, --version print version number, then exit + -V, --version print version number and configuration settings, then exit -q, --quiet do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions @@ -116541,19 +112129,22 @@ Configuration commands: $config_commands Report bugs to ." -_ACEOF +_ACEOF cat >>$CONFIG_STATUS <<_ACEOF ac_cs_version="\\ package-unused config.status version-unused -configured by $0, generated by GNU Autoconf 2.59, - with options \\"`echo "$ac_configure_args" | sed 's/[\\""\`\$]/\\\\&/g'`\\" +configured by $0, generated by GNU Autoconf 2.61, + with options \\"`echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\" -Copyright (C) 2003 Free Software Foundation, Inc. +Copyright (C) 2006 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." -srcdir=$srcdir -INSTALL="$INSTALL" + +ac_pwd='$ac_pwd' +srcdir='$srcdir' +INSTALL='$INSTALL' +MKDIR_P='$MKDIR_P' _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF @@ -116564,39 +112155,24 @@ while test $# != 0 do case $1 in --*=*) - ac_option=`expr "x$1" : 'x\([^=]*\)='` - ac_optarg=`expr "x$1" : 'x[^=]*=\(.*\)'` + ac_option=`expr "X$1" : 'X\([^=]*\)='` + ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; - -*) + *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; - *) # This is not an option, so the user has probably given explicit - # arguments. - ac_option=$1 - ac_need_defaults=false;; esac case $ac_option in # Handling of the options. -_ACEOF -cat >>$CONFIG_STATUS <<\_ACEOF -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; - --version | --vers* | -V ) - echo "$ac_cs_version"; exit 0 ;; - --he | --h) - # Conflict between --help and --header - { { echo "$as_me:$LINENO: error: ambiguous option: $1 -Try \`$0 --help' for more information." >&5 -echo "$as_me: error: ambiguous option: $1 -Try \`$0 --help' for more information." >&2;} - { (exit 1); exit 1; }; };; - --help | --hel | -h ) - echo "$ac_cs_usage"; exit 0 ;; - --debug | --d* | -d ) + --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) + echo "$ac_cs_version"; exit ;; + --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift @@ -116606,18 +112182,24 @@ Try \`$0 --help' for more information." >&2;} $ac_shift CONFIG_HEADERS="$CONFIG_HEADERS $ac_optarg" ac_need_defaults=false;; + --he | --h) + # Conflict between --help and --header + { echo "$as_me: error: ambiguous option: $1 +Try \`$0 --help' for more information." >&2 + { (exit 1); exit 1; }; };; + --help | --hel | -h ) + echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. - -*) { { echo "$as_me:$LINENO: error: unrecognized option: $1 -Try \`$0 --help' for more information." >&5 -echo "$as_me: error: unrecognized option: $1 -Try \`$0 --help' for more information." >&2;} + -*) { echo "$as_me: error: unrecognized option: $1 +Try \`$0 --help' for more information." >&2 { (exit 1); exit 1; }; } ;; - *) ac_config_targets="$ac_config_targets $1" ;; + *) ac_config_targets="$ac_config_targets $1" + ac_need_defaults=false ;; esac shift @@ -116633,18 +112215,29 @@ fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF if \$ac_cs_recheck; then - echo "running $SHELL $0 " $ac_configure_args \$ac_configure_extra_args " --no-create --no-recursion" >&6 - exec $SHELL $0 $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion + echo "running CONFIG_SHELL=$SHELL $SHELL $0 "$ac_configure_args \$ac_configure_extra_args " --no-create --no-recursion" >&6 + CONFIG_SHELL=$SHELL + export CONFIG_SHELL + exec $SHELL "$0"$ac_configure_args \$ac_configure_extra_args --no-create --no-recursion fi _ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF +exec 5>>config.log +{ + echo + sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX +## Running $as_me. ## +_ASBOX + echo "$ac_log" +} >&5 +_ACEOF cat >>$CONFIG_STATUS <<_ACEOF # -# INIT-COMMANDS section. +# INIT-COMMANDS # - srcdir="$srcdir" host="$host" target="$target" @@ -116996,31 +112589,33 @@ SUBDIRS="$SUBDIRS" _ACEOF - - cat >>$CONFIG_STATUS <<\_ACEOF + +# Handling of arguments. for ac_config_target in $ac_config_targets do - case "$ac_config_target" in - # Handling of arguments. - "Makefile" ) CONFIG_FILES="$CONFIG_FILES Makefile" ;; - "include/Makefile" ) CONFIG_FILES="$CONFIG_FILES include/Makefile" ;; - "libmath/Makefile" ) CONFIG_FILES="$CONFIG_FILES libmath/Makefile" ;; - "libsupc++/Makefile" ) CONFIG_FILES="$CONFIG_FILES libsupc++/Makefile" ;; - "src/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/Makefile" ;; - "po/Makefile" ) CONFIG_FILES="$CONFIG_FILES po/Makefile" ;; - "testsuite/Makefile" ) CONFIG_FILES="$CONFIG_FILES testsuite/Makefile" ;; - "scripts/testsuite_flags" ) CONFIG_FILES="$CONFIG_FILES scripts/testsuite_flags" ;; - "default-1" ) CONFIG_COMMANDS="$CONFIG_COMMANDS default-1" ;; - "libtool" ) CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;; - "default" ) CONFIG_COMMANDS="$CONFIG_COMMANDS default" ;; - "config.h" ) CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;; + case $ac_config_target in + "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;; + "default-1") CONFIG_COMMANDS="$CONFIG_COMMANDS default-1" ;; + "libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;; + "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; + "include/Makefile") CONFIG_FILES="$CONFIG_FILES include/Makefile" ;; + "libmath/Makefile") CONFIG_FILES="$CONFIG_FILES libmath/Makefile" ;; + "libsupc++/Makefile") CONFIG_FILES="$CONFIG_FILES libsupc++/Makefile" ;; + "src/Makefile") CONFIG_FILES="$CONFIG_FILES src/Makefile" ;; + "doc/Makefile") CONFIG_FILES="$CONFIG_FILES doc/Makefile" ;; + "po/Makefile") CONFIG_FILES="$CONFIG_FILES po/Makefile" ;; + "testsuite/Makefile") CONFIG_FILES="$CONFIG_FILES testsuite/Makefile" ;; + "scripts/testsuite_flags") CONFIG_FILES="$CONFIG_FILES scripts/testsuite_flags" ;; + "default") CONFIG_COMMANDS="$CONFIG_COMMANDS default" ;; + *) { { echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5 echo "$as_me: error: invalid argument: $ac_config_target" >&2;} { (exit 1); exit 1; }; };; esac done + # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely @@ -117032,442 +112627,552 @@ if $ac_need_defaults; then fi # Have a temporary directory for convenience. Make it in the build tree -# simply because there is no reason to put it here, and in addition, +# simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. -# Create a temporary directory, and hook for its removal unless debugging. +# Hook for its removal unless debugging. +# Note that there is a small window in which the directory will not be cleaned: +# after its creation but before its name has been assigned to `$tmp'. $debug || { - trap 'exit_status=$?; rm -rf $tmp && exit $exit_status' 0 + tmp= + trap 'exit_status=$? + { test -z "$tmp" || test ! -d "$tmp" || rm -fr "$tmp"; } && exit $exit_status +' 0 trap '{ (exit 1); exit 1; }' 1 2 13 15 } - # Create a (secure) tmp directory for tmp files. { - tmp=`(umask 077 && mktemp -d -q "./confstatXXXXXX") 2>/dev/null` && + tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" } || { - tmp=./confstat$$-$RANDOM - (umask 077 && mkdir $tmp) + tmp=./conf$$-$RANDOM + (umask 077 && mkdir "$tmp") } || { echo "$me: cannot create a temporary directory in ." >&2 { (exit 1); exit 1; } } -_ACEOF - -cat >>$CONFIG_STATUS <<_ACEOF - # -# CONFIG_FILES section. +# Set up the sed scripts for CONFIG_FILES section. # # No need to generate the scripts if there are no CONFIG_FILES. # This happens for instance when ./config.status config.h -if test -n "\$CONFIG_FILES"; then - # Protect against being on the right side of a sed subst in config.status. - sed 's/,@/@@/; s/@,/@@/; s/,;t t\$/@;t t/; /@;t t\$/s/[\\\\&,]/\\\\&/g; - s/@@/,@/; s/@@/@,/; s/@;t t\$/,;t t/' >\$tmp/subs.sed <<\\CEOF -s,@SHELL@,$SHELL,;t t -s,@PATH_SEPARATOR@,$PATH_SEPARATOR,;t t -s,@PACKAGE_NAME@,$PACKAGE_NAME,;t t -s,@PACKAGE_TARNAME@,$PACKAGE_TARNAME,;t t -s,@PACKAGE_VERSION@,$PACKAGE_VERSION,;t t -s,@PACKAGE_STRING@,$PACKAGE_STRING,;t t -s,@PACKAGE_BUGREPORT@,$PACKAGE_BUGREPORT,;t t -s,@exec_prefix@,$exec_prefix,;t t -s,@prefix@,$prefix,;t t -s,@program_transform_name@,$program_transform_name,;t t -s,@bindir@,$bindir,;t t -s,@sbindir@,$sbindir,;t t -s,@libexecdir@,$libexecdir,;t t -s,@datadir@,$datadir,;t t -s,@sysconfdir@,$sysconfdir,;t t -s,@sharedstatedir@,$sharedstatedir,;t t -s,@localstatedir@,$localstatedir,;t t -s,@libdir@,$libdir,;t t -s,@includedir@,$includedir,;t t -s,@oldincludedir@,$oldincludedir,;t t -s,@infodir@,$infodir,;t t -s,@mandir@,$mandir,;t t -s,@build_alias@,$build_alias,;t t -s,@host_alias@,$host_alias,;t t -s,@target_alias@,$target_alias,;t t -s,@DEFS@,$DEFS,;t t -s,@ECHO_C@,$ECHO_C,;t t -s,@ECHO_N@,$ECHO_N,;t t -s,@ECHO_T@,$ECHO_T,;t t -s,@LIBS@,$LIBS,;t t -s,@libtool_VERSION@,$libtool_VERSION,;t t -s,@multi_basedir@,$multi_basedir,;t t -s,@build@,$build,;t t -s,@build_cpu@,$build_cpu,;t t -s,@build_vendor@,$build_vendor,;t t -s,@build_os@,$build_os,;t t -s,@host@,$host,;t t -s,@host_cpu@,$host_cpu,;t t -s,@host_vendor@,$host_vendor,;t t -s,@host_os@,$host_os,;t t -s,@target@,$target,;t t -s,@target_cpu@,$target_cpu,;t t -s,@target_vendor@,$target_vendor,;t t -s,@target_os@,$target_os,;t t -s,@INSTALL_PROGRAM@,$INSTALL_PROGRAM,;t t -s,@INSTALL_SCRIPT@,$INSTALL_SCRIPT,;t t -s,@INSTALL_DATA@,$INSTALL_DATA,;t t -s,@CYGPATH_W@,$CYGPATH_W,;t t -s,@PACKAGE@,$PACKAGE,;t t -s,@VERSION@,$VERSION,;t t -s,@ACLOCAL@,$ACLOCAL,;t t -s,@AUTOCONF@,$AUTOCONF,;t t -s,@AUTOMAKE@,$AUTOMAKE,;t t -s,@AUTOHEADER@,$AUTOHEADER,;t t -s,@MAKEINFO@,$MAKEINFO,;t t -s,@install_sh@,$install_sh,;t t -s,@STRIP@,$STRIP,;t t -s,@ac_ct_STRIP@,$ac_ct_STRIP,;t t -s,@INSTALL_STRIP_PROGRAM@,$INSTALL_STRIP_PROGRAM,;t t -s,@mkdir_p@,$mkdir_p,;t t -s,@AWK@,$AWK,;t t -s,@SET_MAKE@,$SET_MAKE,;t t -s,@am__leading_dot@,$am__leading_dot,;t t -s,@AMTAR@,$AMTAR,;t t -s,@am__tar@,$am__tar,;t t -s,@am__untar@,$am__untar,;t t -s,@glibcxx_builddir@,$glibcxx_builddir,;t t -s,@glibcxx_srcdir@,$glibcxx_srcdir,;t t -s,@toplevel_srcdir@,$toplevel_srcdir,;t t -s,@CC@,$CC,;t t -s,@ac_ct_CC@,$ac_ct_CC,;t t -s,@EXEEXT@,$EXEEXT,;t t -s,@OBJEXT@,$OBJEXT,;t t -s,@CXX@,$CXX,;t t -s,@ac_ct_CXX@,$ac_ct_CXX,;t t -s,@CFLAGS@,$CFLAGS,;t t -s,@CXXFLAGS@,$CXXFLAGS,;t t -s,@LN_S@,$LN_S,;t t -s,@AS@,$AS,;t t -s,@ac_ct_AS@,$ac_ct_AS,;t t -s,@AR@,$AR,;t t -s,@ac_ct_AR@,$ac_ct_AR,;t t -s,@RANLIB@,$RANLIB,;t t -s,@ac_ct_RANLIB@,$ac_ct_RANLIB,;t t -s,@MAINTAINER_MODE_TRUE@,$MAINTAINER_MODE_TRUE,;t t -s,@MAINTAINER_MODE_FALSE@,$MAINTAINER_MODE_FALSE,;t t -s,@MAINT@,$MAINT,;t t -s,@CPP@,$CPP,;t t -s,@CPPFLAGS@,$CPPFLAGS,;t t -s,@EGREP@,$EGREP,;t t -s,@LIBTOOL@,$LIBTOOL,;t t -s,@SED@,$SED,;t t -s,@FGREP@,$FGREP,;t t -s,@GREP@,$GREP,;t t -s,@LD@,$LD,;t t -s,@DUMPBIN@,$DUMPBIN,;t t -s,@ac_ct_DUMPBIN@,$ac_ct_DUMPBIN,;t t -s,@NM@,$NM,;t t -s,@lt_ECHO@,$lt_ECHO,;t t -s,@LDFLAGS@,$LDFLAGS,;t t -s,@CXXCPP@,$CXXCPP,;t t -s,@enable_shared@,$enable_shared,;t t -s,@enable_static@,$enable_static,;t t -s,@GLIBCXX_HOSTED_TRUE@,$GLIBCXX_HOSTED_TRUE,;t t -s,@GLIBCXX_HOSTED_FALSE@,$GLIBCXX_HOSTED_FALSE,;t t -s,@GLIBCXX_BUILD_PCH_TRUE@,$GLIBCXX_BUILD_PCH_TRUE,;t t -s,@GLIBCXX_BUILD_PCH_FALSE@,$GLIBCXX_BUILD_PCH_FALSE,;t t -s,@glibcxx_PCHFLAGS@,$glibcxx_PCHFLAGS,;t t -s,@CSTDIO_H@,$CSTDIO_H,;t t -s,@BASIC_FILE_H@,$BASIC_FILE_H,;t t -s,@BASIC_FILE_CC@,$BASIC_FILE_CC,;t t -s,@check_msgfmt@,$check_msgfmt,;t t -s,@glibcxx_MOFILES@,$glibcxx_MOFILES,;t t -s,@glibcxx_POFILES@,$glibcxx_POFILES,;t t -s,@glibcxx_localedir@,$glibcxx_localedir,;t t -s,@USE_NLS@,$USE_NLS,;t t -s,@CLOCALE_H@,$CLOCALE_H,;t t -s,@CMESSAGES_H@,$CMESSAGES_H,;t t -s,@CCODECVT_CC@,$CCODECVT_CC,;t t -s,@CCOLLATE_CC@,$CCOLLATE_CC,;t t -s,@CCTYPE_CC@,$CCTYPE_CC,;t t -s,@CMESSAGES_CC@,$CMESSAGES_CC,;t t -s,@CMONEY_CC@,$CMONEY_CC,;t t -s,@CNUMERIC_CC@,$CNUMERIC_CC,;t t -s,@CTIME_H@,$CTIME_H,;t t -s,@CTIME_CC@,$CTIME_CC,;t t -s,@CLOCALE_CC@,$CLOCALE_CC,;t t -s,@CLOCALE_INTERNAL_H@,$CLOCALE_INTERNAL_H,;t t -s,@ALLOCATOR_H@,$ALLOCATOR_H,;t t -s,@ALLOCATOR_NAME@,$ALLOCATOR_NAME,;t t -s,@C_INCLUDE_DIR@,$C_INCLUDE_DIR,;t t -s,@GLIBCXX_C_HEADERS_C_TRUE@,$GLIBCXX_C_HEADERS_C_TRUE,;t t -s,@GLIBCXX_C_HEADERS_C_FALSE@,$GLIBCXX_C_HEADERS_C_FALSE,;t t -s,@GLIBCXX_C_HEADERS_C_STD_TRUE@,$GLIBCXX_C_HEADERS_C_STD_TRUE,;t t -s,@GLIBCXX_C_HEADERS_C_STD_FALSE@,$GLIBCXX_C_HEADERS_C_STD_FALSE,;t t -s,@GLIBCXX_C_HEADERS_C_GLOBAL_TRUE@,$GLIBCXX_C_HEADERS_C_GLOBAL_TRUE,;t t -s,@GLIBCXX_C_HEADERS_C_GLOBAL_FALSE@,$GLIBCXX_C_HEADERS_C_GLOBAL_FALSE,;t t -s,@GLIBCXX_C_HEADERS_COMPATIBILITY_TRUE@,$GLIBCXX_C_HEADERS_COMPATIBILITY_TRUE,;t t -s,@GLIBCXX_C_HEADERS_COMPATIBILITY_FALSE@,$GLIBCXX_C_HEADERS_COMPATIBILITY_FALSE,;t t -s,@GLIBCXX_C_HEADERS_EXTRA_TRUE@,$GLIBCXX_C_HEADERS_EXTRA_TRUE,;t t -s,@GLIBCXX_C_HEADERS_EXTRA_FALSE@,$GLIBCXX_C_HEADERS_EXTRA_FALSE,;t t -s,@DEBUG_FLAGS@,$DEBUG_FLAGS,;t t -s,@GLIBCXX_BUILD_DEBUG_TRUE@,$GLIBCXX_BUILD_DEBUG_TRUE,;t t -s,@GLIBCXX_BUILD_DEBUG_FALSE@,$GLIBCXX_BUILD_DEBUG_FALSE,;t t -s,@ENABLE_PARALLEL_TRUE@,$ENABLE_PARALLEL_TRUE,;t t -s,@ENABLE_PARALLEL_FALSE@,$ENABLE_PARALLEL_FALSE,;t t -s,@EXTRA_CXX_FLAGS@,$EXTRA_CXX_FLAGS,;t t -s,@glibcxx_thread_h@,$glibcxx_thread_h,;t t -s,@WERROR@,$WERROR,;t t -s,@SECTION_FLAGS@,$SECTION_FLAGS,;t t -s,@SECTION_LDFLAGS@,$SECTION_LDFLAGS,;t t -s,@OPT_LDFLAGS@,$OPT_LDFLAGS,;t t -s,@LIBMATHOBJS@,$LIBMATHOBJS,;t t -s,@LIBICONV@,$LIBICONV,;t t -s,@LTLIBICONV@,$LTLIBICONV,;t t -s,@SYMVER_FILE@,$SYMVER_FILE,;t t -s,@port_specific_symbol_files@,$port_specific_symbol_files,;t t -s,@ENABLE_SYMVERS_TRUE@,$ENABLE_SYMVERS_TRUE,;t t -s,@ENABLE_SYMVERS_FALSE@,$ENABLE_SYMVERS_FALSE,;t t -s,@ENABLE_SYMVERS_GNU_TRUE@,$ENABLE_SYMVERS_GNU_TRUE,;t t -s,@ENABLE_SYMVERS_GNU_FALSE@,$ENABLE_SYMVERS_GNU_FALSE,;t t -s,@ENABLE_SYMVERS_GNU_NAMESPACE_TRUE@,$ENABLE_SYMVERS_GNU_NAMESPACE_TRUE,;t t -s,@ENABLE_SYMVERS_GNU_NAMESPACE_FALSE@,$ENABLE_SYMVERS_GNU_NAMESPACE_FALSE,;t t -s,@ENABLE_SYMVERS_DARWIN_TRUE@,$ENABLE_SYMVERS_DARWIN_TRUE,;t t -s,@ENABLE_SYMVERS_DARWIN_FALSE@,$ENABLE_SYMVERS_DARWIN_FALSE,;t t -s,@ENABLE_VISIBILITY_TRUE@,$ENABLE_VISIBILITY_TRUE,;t t -s,@ENABLE_VISIBILITY_FALSE@,$ENABLE_VISIBILITY_FALSE,;t t -s,@GLIBCXX_LDBL_COMPAT_TRUE@,$GLIBCXX_LDBL_COMPAT_TRUE,;t t -s,@GLIBCXX_LDBL_COMPAT_FALSE@,$GLIBCXX_LDBL_COMPAT_FALSE,;t t -s,@baseline_dir@,$baseline_dir,;t t -s,@ATOMICITY_SRCDIR@,$ATOMICITY_SRCDIR,;t t -s,@ATOMIC_WORD_SRCDIR@,$ATOMIC_WORD_SRCDIR,;t t -s,@ATOMIC_FLAGS@,$ATOMIC_FLAGS,;t t -s,@CPU_DEFINES_SRCDIR@,$CPU_DEFINES_SRCDIR,;t t -s,@ABI_TWEAKS_SRCDIR@,$ABI_TWEAKS_SRCDIR,;t t -s,@OS_INC_SRCDIR@,$OS_INC_SRCDIR,;t t -s,@ERROR_CONSTANTS_SRCDIR@,$ERROR_CONSTANTS_SRCDIR,;t t -s,@glibcxx_prefixdir@,$glibcxx_prefixdir,;t t -s,@gxx_include_dir@,$gxx_include_dir,;t t -s,@glibcxx_toolexecdir@,$glibcxx_toolexecdir,;t t -s,@glibcxx_toolexeclibdir@,$glibcxx_toolexeclibdir,;t t -s,@GLIBCXX_INCLUDES@,$GLIBCXX_INCLUDES,;t t -s,@TOPLEVEL_INCLUDES@,$TOPLEVEL_INCLUDES,;t t -s,@OPTIMIZE_CXXFLAGS@,$OPTIMIZE_CXXFLAGS,;t t -s,@WARN_FLAGS@,$WARN_FLAGS,;t t -s,@LIBSUPCXX_PICFLAGS@,$LIBSUPCXX_PICFLAGS,;t t -s,@LIBOBJS@,$LIBOBJS,;t t -s,@LTLIBOBJS@,$LTLIBOBJS,;t t -CEOF - -_ACEOF - - cat >>$CONFIG_STATUS <<\_ACEOF - # Split the substitutions into bite-sized pieces for seds with - # small command number limits, like on Digital OSF/1 and HP-UX. - ac_max_sed_lines=48 - ac_sed_frag=1 # Number of current file. - ac_beg=1 # First line for current file. - ac_end=$ac_max_sed_lines # Line after last line for current file. - ac_more_lines=: - ac_sed_cmds= - while $ac_more_lines; do - if test $ac_beg -gt 1; then - sed "1,${ac_beg}d; ${ac_end}q" $tmp/subs.sed >$tmp/subs.frag - else - sed "${ac_end}q" $tmp/subs.sed >$tmp/subs.frag - fi - if test ! -s $tmp/subs.frag; then - ac_more_lines=false - else - # The purpose of the label and of the branching condition is to - # speed up the sed processing (if there are no `@' at all, there - # is no need to browse any of the substitutions). - # These are the two extra sed commands mentioned above. - (echo ':t - /@[a-zA-Z_][a-zA-Z_0-9]*@/!b' && cat $tmp/subs.frag) >$tmp/subs-$ac_sed_frag.sed - if test -z "$ac_sed_cmds"; then - ac_sed_cmds="sed -f $tmp/subs-$ac_sed_frag.sed" - else - ac_sed_cmds="$ac_sed_cmds | sed -f $tmp/subs-$ac_sed_frag.sed" - fi - ac_sed_frag=`expr $ac_sed_frag + 1` - ac_beg=$ac_end - ac_end=`expr $ac_end + $ac_max_sed_lines` - fi - done - if test -z "$ac_sed_cmds"; then - ac_sed_cmds=cat +if test -n "$CONFIG_FILES"; then + +_ACEOF + + + +ac_delim='%!_!# ' +for ac_last_try in false false false false false :; do + cat >conf$$subs.sed <<_ACEOF +SHELL!$SHELL$ac_delim +PATH_SEPARATOR!$PATH_SEPARATOR$ac_delim +PACKAGE_NAME!$PACKAGE_NAME$ac_delim +PACKAGE_TARNAME!$PACKAGE_TARNAME$ac_delim +PACKAGE_VERSION!$PACKAGE_VERSION$ac_delim +PACKAGE_STRING!$PACKAGE_STRING$ac_delim +PACKAGE_BUGREPORT!$PACKAGE_BUGREPORT$ac_delim +exec_prefix!$exec_prefix$ac_delim +prefix!$prefix$ac_delim +program_transform_name!$program_transform_name$ac_delim +bindir!$bindir$ac_delim +sbindir!$sbindir$ac_delim +libexecdir!$libexecdir$ac_delim +datarootdir!$datarootdir$ac_delim +datadir!$datadir$ac_delim +sysconfdir!$sysconfdir$ac_delim +sharedstatedir!$sharedstatedir$ac_delim +localstatedir!$localstatedir$ac_delim +includedir!$includedir$ac_delim +oldincludedir!$oldincludedir$ac_delim +docdir!$docdir$ac_delim +infodir!$infodir$ac_delim +htmldir!$htmldir$ac_delim +dvidir!$dvidir$ac_delim +pdfdir!$pdfdir$ac_delim +psdir!$psdir$ac_delim +libdir!$libdir$ac_delim +localedir!$localedir$ac_delim +mandir!$mandir$ac_delim +DEFS!$DEFS$ac_delim +ECHO_C!$ECHO_C$ac_delim +ECHO_N!$ECHO_N$ac_delim +ECHO_T!$ECHO_T$ac_delim +LIBS!$LIBS$ac_delim +build_alias!$build_alias$ac_delim +host_alias!$host_alias$ac_delim +target_alias!$target_alias$ac_delim +libtool_VERSION!$libtool_VERSION$ac_delim +multi_basedir!$multi_basedir$ac_delim +build!$build$ac_delim +build_cpu!$build_cpu$ac_delim +build_vendor!$build_vendor$ac_delim +build_os!$build_os$ac_delim +host!$host$ac_delim +host_cpu!$host_cpu$ac_delim +host_vendor!$host_vendor$ac_delim +host_os!$host_os$ac_delim +target!$target$ac_delim +target_cpu!$target_cpu$ac_delim +target_vendor!$target_vendor$ac_delim +target_os!$target_os$ac_delim +INSTALL_PROGRAM!$INSTALL_PROGRAM$ac_delim +INSTALL_SCRIPT!$INSTALL_SCRIPT$ac_delim +INSTALL_DATA!$INSTALL_DATA$ac_delim +am__isrc!$am__isrc$ac_delim +CYGPATH_W!$CYGPATH_W$ac_delim +PACKAGE!$PACKAGE$ac_delim +VERSION!$VERSION$ac_delim +ACLOCAL!$ACLOCAL$ac_delim +AUTOCONF!$AUTOCONF$ac_delim +AUTOMAKE!$AUTOMAKE$ac_delim +AUTOHEADER!$AUTOHEADER$ac_delim +MAKEINFO!$MAKEINFO$ac_delim +install_sh!$install_sh$ac_delim +STRIP!$STRIP$ac_delim +INSTALL_STRIP_PROGRAM!$INSTALL_STRIP_PROGRAM$ac_delim +mkdir_p!$mkdir_p$ac_delim +AWK!$AWK$ac_delim +SET_MAKE!$SET_MAKE$ac_delim +am__leading_dot!$am__leading_dot$ac_delim +AMTAR!$AMTAR$ac_delim +am__tar!$am__tar$ac_delim +am__untar!$am__untar$ac_delim +glibcxx_builddir!$glibcxx_builddir$ac_delim +glibcxx_srcdir!$glibcxx_srcdir$ac_delim +toplevel_srcdir!$toplevel_srcdir$ac_delim +CC!$CC$ac_delim +CFLAGS!$CFLAGS$ac_delim +LDFLAGS!$LDFLAGS$ac_delim +CPPFLAGS!$CPPFLAGS$ac_delim +ac_ct_CC!$ac_ct_CC$ac_delim +EXEEXT!$EXEEXT$ac_delim +OBJEXT!$OBJEXT$ac_delim +CXX!$CXX$ac_delim +CXXFLAGS!$CXXFLAGS$ac_delim +ac_ct_CXX!$ac_ct_CXX$ac_delim +LN_S!$LN_S$ac_delim +AS!$AS$ac_delim +AR!$AR$ac_delim +RANLIB!$RANLIB$ac_delim +MAINTAINER_MODE_TRUE!$MAINTAINER_MODE_TRUE$ac_delim +MAINTAINER_MODE_FALSE!$MAINTAINER_MODE_FALSE$ac_delim +MAINT!$MAINT$ac_delim +CPP!$CPP$ac_delim +GREP!$GREP$ac_delim +EGREP!$EGREP$ac_delim +LIBTOOL!$LIBTOOL$ac_delim +_ACEOF + + if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 97; then + break + elif $ac_last_try; then + { { echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5 +echo "$as_me: error: could not make $CONFIG_STATUS" >&2;} + { (exit 1); exit 1; }; } + else + ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi -fi # test -n "$CONFIG_FILES" +done +ac_eof=`sed -n '/^CEOF[0-9]*$/s/CEOF/0/p' conf$$subs.sed` +if test -n "$ac_eof"; then + ac_eof=`echo "$ac_eof" | sort -nru | sed 1q` + ac_eof=`expr $ac_eof + 1` +fi + +cat >>$CONFIG_STATUS <<_ACEOF +cat >"\$tmp/subs-1.sed" <<\CEOF$ac_eof +/@[a-zA-Z_][a-zA-Z_0-9]*@/!b _ACEOF +sed ' +s/[,\\&]/\\&/g; s/@/@|#_!!_#|/g +s/^/s,@/; s/!/@,|#_!!_#|/ +:n +t n +s/'"$ac_delim"'$/,g/; t +s/$/\\/; p +N; s/^.*\n//; s/[,\\&]/\\&/g; s/@/@|#_!!_#|/g; b n +' >>$CONFIG_STATUS >$CONFIG_STATUS <<_ACEOF +CEOF$ac_eof +_ACEOF + + +ac_delim='%!_!# ' +for ac_last_try in false false false false false :; do + cat >conf$$subs.sed <<_ACEOF +SED!$SED$ac_delim +FGREP!$FGREP$ac_delim +LD!$LD$ac_delim +DUMPBIN!$DUMPBIN$ac_delim +ac_ct_DUMPBIN!$ac_ct_DUMPBIN$ac_delim +NM!$NM$ac_delim +lt_ECHO!$lt_ECHO$ac_delim +CXXCPP!$CXXCPP$ac_delim +enable_shared!$enable_shared$ac_delim +enable_static!$enable_static$ac_delim +GLIBCXX_HOSTED_TRUE!$GLIBCXX_HOSTED_TRUE$ac_delim +GLIBCXX_HOSTED_FALSE!$GLIBCXX_HOSTED_FALSE$ac_delim +GLIBCXX_BUILD_PCH_TRUE!$GLIBCXX_BUILD_PCH_TRUE$ac_delim +GLIBCXX_BUILD_PCH_FALSE!$GLIBCXX_BUILD_PCH_FALSE$ac_delim +glibcxx_PCHFLAGS!$glibcxx_PCHFLAGS$ac_delim +CSTDIO_H!$CSTDIO_H$ac_delim +BASIC_FILE_H!$BASIC_FILE_H$ac_delim +BASIC_FILE_CC!$BASIC_FILE_CC$ac_delim +check_msgfmt!$check_msgfmt$ac_delim +glibcxx_MOFILES!$glibcxx_MOFILES$ac_delim +glibcxx_POFILES!$glibcxx_POFILES$ac_delim +glibcxx_localedir!$glibcxx_localedir$ac_delim +USE_NLS!$USE_NLS$ac_delim +CLOCALE_H!$CLOCALE_H$ac_delim +CMESSAGES_H!$CMESSAGES_H$ac_delim +CCODECVT_CC!$CCODECVT_CC$ac_delim +CCOLLATE_CC!$CCOLLATE_CC$ac_delim +CCTYPE_CC!$CCTYPE_CC$ac_delim +CMESSAGES_CC!$CMESSAGES_CC$ac_delim +CMONEY_CC!$CMONEY_CC$ac_delim +CNUMERIC_CC!$CNUMERIC_CC$ac_delim +CTIME_H!$CTIME_H$ac_delim +CTIME_CC!$CTIME_CC$ac_delim +CLOCALE_CC!$CLOCALE_CC$ac_delim +CLOCALE_INTERNAL_H!$CLOCALE_INTERNAL_H$ac_delim +ALLOCATOR_H!$ALLOCATOR_H$ac_delim +ALLOCATOR_NAME!$ALLOCATOR_NAME$ac_delim +C_INCLUDE_DIR!$C_INCLUDE_DIR$ac_delim +GLIBCXX_C_HEADERS_C_TRUE!$GLIBCXX_C_HEADERS_C_TRUE$ac_delim +GLIBCXX_C_HEADERS_C_FALSE!$GLIBCXX_C_HEADERS_C_FALSE$ac_delim +GLIBCXX_C_HEADERS_C_STD_TRUE!$GLIBCXX_C_HEADERS_C_STD_TRUE$ac_delim +GLIBCXX_C_HEADERS_C_STD_FALSE!$GLIBCXX_C_HEADERS_C_STD_FALSE$ac_delim +GLIBCXX_C_HEADERS_C_GLOBAL_TRUE!$GLIBCXX_C_HEADERS_C_GLOBAL_TRUE$ac_delim +GLIBCXX_C_HEADERS_C_GLOBAL_FALSE!$GLIBCXX_C_HEADERS_C_GLOBAL_FALSE$ac_delim +GLIBCXX_C_HEADERS_COMPATIBILITY_TRUE!$GLIBCXX_C_HEADERS_COMPATIBILITY_TRUE$ac_delim +GLIBCXX_C_HEADERS_COMPATIBILITY_FALSE!$GLIBCXX_C_HEADERS_COMPATIBILITY_FALSE$ac_delim +GLIBCXX_C_HEADERS_EXTRA_TRUE!$GLIBCXX_C_HEADERS_EXTRA_TRUE$ac_delim +GLIBCXX_C_HEADERS_EXTRA_FALSE!$GLIBCXX_C_HEADERS_EXTRA_FALSE$ac_delim +DEBUG_FLAGS!$DEBUG_FLAGS$ac_delim +GLIBCXX_BUILD_DEBUG_TRUE!$GLIBCXX_BUILD_DEBUG_TRUE$ac_delim +GLIBCXX_BUILD_DEBUG_FALSE!$GLIBCXX_BUILD_DEBUG_FALSE$ac_delim +ENABLE_PARALLEL_TRUE!$ENABLE_PARALLEL_TRUE$ac_delim +ENABLE_PARALLEL_FALSE!$ENABLE_PARALLEL_FALSE$ac_delim +EXTRA_CXX_FLAGS!$EXTRA_CXX_FLAGS$ac_delim +glibcxx_thread_h!$glibcxx_thread_h$ac_delim +WERROR!$WERROR$ac_delim +SECTION_FLAGS!$SECTION_FLAGS$ac_delim +SECTION_LDFLAGS!$SECTION_LDFLAGS$ac_delim +OPT_LDFLAGS!$OPT_LDFLAGS$ac_delim +LIBMATHOBJS!$LIBMATHOBJS$ac_delim +LIBICONV!$LIBICONV$ac_delim +LTLIBICONV!$LTLIBICONV$ac_delim +SYMVER_FILE!$SYMVER_FILE$ac_delim +port_specific_symbol_files!$port_specific_symbol_files$ac_delim +ENABLE_SYMVERS_TRUE!$ENABLE_SYMVERS_TRUE$ac_delim +ENABLE_SYMVERS_FALSE!$ENABLE_SYMVERS_FALSE$ac_delim +ENABLE_SYMVERS_GNU_TRUE!$ENABLE_SYMVERS_GNU_TRUE$ac_delim +ENABLE_SYMVERS_GNU_FALSE!$ENABLE_SYMVERS_GNU_FALSE$ac_delim +ENABLE_SYMVERS_GNU_NAMESPACE_TRUE!$ENABLE_SYMVERS_GNU_NAMESPACE_TRUE$ac_delim +ENABLE_SYMVERS_GNU_NAMESPACE_FALSE!$ENABLE_SYMVERS_GNU_NAMESPACE_FALSE$ac_delim +ENABLE_SYMVERS_DARWIN_TRUE!$ENABLE_SYMVERS_DARWIN_TRUE$ac_delim +ENABLE_SYMVERS_DARWIN_FALSE!$ENABLE_SYMVERS_DARWIN_FALSE$ac_delim +ENABLE_VISIBILITY_TRUE!$ENABLE_VISIBILITY_TRUE$ac_delim +ENABLE_VISIBILITY_FALSE!$ENABLE_VISIBILITY_FALSE$ac_delim +GLIBCXX_LDBL_COMPAT_TRUE!$GLIBCXX_LDBL_COMPAT_TRUE$ac_delim +GLIBCXX_LDBL_COMPAT_FALSE!$GLIBCXX_LDBL_COMPAT_FALSE$ac_delim +baseline_dir!$baseline_dir$ac_delim +ATOMICITY_SRCDIR!$ATOMICITY_SRCDIR$ac_delim +ATOMIC_WORD_SRCDIR!$ATOMIC_WORD_SRCDIR$ac_delim +ATOMIC_FLAGS!$ATOMIC_FLAGS$ac_delim +CPU_DEFINES_SRCDIR!$CPU_DEFINES_SRCDIR$ac_delim +ABI_TWEAKS_SRCDIR!$ABI_TWEAKS_SRCDIR$ac_delim +OS_INC_SRCDIR!$OS_INC_SRCDIR$ac_delim +ERROR_CONSTANTS_SRCDIR!$ERROR_CONSTANTS_SRCDIR$ac_delim +glibcxx_prefixdir!$glibcxx_prefixdir$ac_delim +gxx_include_dir!$gxx_include_dir$ac_delim +glibcxx_toolexecdir!$glibcxx_toolexecdir$ac_delim +glibcxx_toolexeclibdir!$glibcxx_toolexeclibdir$ac_delim +GLIBCXX_INCLUDES!$GLIBCXX_INCLUDES$ac_delim +TOPLEVEL_INCLUDES!$TOPLEVEL_INCLUDES$ac_delim +OPTIMIZE_CXXFLAGS!$OPTIMIZE_CXXFLAGS$ac_delim +WARN_FLAGS!$WARN_FLAGS$ac_delim +LIBSUPCXX_PICFLAGS!$LIBSUPCXX_PICFLAGS$ac_delim +LIBOBJS!$LIBOBJS$ac_delim +LTLIBOBJS!$LTLIBOBJS$ac_delim +_ACEOF + + if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 95; then + break + elif $ac_last_try; then + { { echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5 +echo "$as_me: error: could not make $CONFIG_STATUS" >&2;} + { (exit 1); exit 1; }; } + else + ac_delim="$ac_delim!$ac_delim _$ac_delim!! " + fi +done + +ac_eof=`sed -n '/^CEOF[0-9]*$/s/CEOF/0/p' conf$$subs.sed` +if test -n "$ac_eof"; then + ac_eof=`echo "$ac_eof" | sort -nru | sed 1q` + ac_eof=`expr $ac_eof + 1` +fi + +cat >>$CONFIG_STATUS <<_ACEOF +cat >"\$tmp/subs-2.sed" <<\CEOF$ac_eof +/@[a-zA-Z_][a-zA-Z_0-9]*@/!b end +_ACEOF +sed ' +s/[,\\&]/\\&/g; s/@/@|#_!!_#|/g +s/^/s,@/; s/!/@,|#_!!_#|/ +:n +t n +s/'"$ac_delim"'$/,g/; t +s/$/\\/; p +N; s/^.*\n//; s/[,\\&]/\\&/g; s/@/@|#_!!_#|/g; b n +' >>$CONFIG_STATUS >$CONFIG_STATUS <<_ACEOF +:end +s/|#_!!_#|//g +CEOF$ac_eof +_ACEOF + + +# VPATH may cause trouble with some makes, so we remove $(srcdir), +# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and +# trailing colons and then remove the whole line if VPATH becomes empty +# (actually we leave an empty line to preserve line numbers). +if test "x$srcdir" = x.; then + ac_vpsub='/^[ ]*VPATH[ ]*=/{ +s/:*\$(srcdir):*/:/ +s/:*\${srcdir}:*/:/ +s/:*@srcdir@:*/:/ +s/^\([^=]*=[ ]*\):*/\1/ +s/:*$// +s/^[^=]*=[ ]*$// +}' +fi + cat >>$CONFIG_STATUS <<\_ACEOF -for ac_file in : $CONFIG_FILES; do test "x$ac_file" = x: && continue - # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". - case $ac_file in - - | *:- | *:-:* ) # input from stdin - cat >$tmp/stdin - ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` - ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; - *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` - ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; - * ) ac_file_in=$ac_file.in ;; +fi # test -n "$CONFIG_FILES" + + +for ac_tag in :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS +do + case $ac_tag in + :[FHLC]) ac_mode=$ac_tag; continue;; + esac + case $ac_mode$ac_tag in + :[FHL]*:*);; + :L* | :C*:*) { { echo "$as_me:$LINENO: error: Invalid tag $ac_tag." >&5 +echo "$as_me: error: Invalid tag $ac_tag." >&2;} + { (exit 1); exit 1; }; };; + :[FH]-) ac_tag=-:-;; + :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; + esac + ac_save_IFS=$IFS + IFS=: + set x $ac_tag + IFS=$ac_save_IFS + shift + ac_file=$1 + shift + + case $ac_mode in + :L) ac_source=$1;; + :[FH]) + ac_file_inputs= + for ac_f + do + case $ac_f in + -) ac_f="$tmp/stdin";; + *) # Look for the file first in the build tree, then in the source tree + # (if the path is not absolute). The absolute path cannot be DOS-style, + # because $ac_f cannot contain `:'. + test -f "$ac_f" || + case $ac_f in + [\\/$]*) false;; + *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; + esac || + { { echo "$as_me:$LINENO: error: cannot find input file: $ac_f" >&5 +echo "$as_me: error: cannot find input file: $ac_f" >&2;} + { (exit 1); exit 1; }; };; + esac + ac_file_inputs="$ac_file_inputs $ac_f" + done + + # Let's still pretend it is `configure' which instantiates (i.e., don't + # use $as_me), people would be surprised to read: + # /* config.h. Generated by config.status. */ + configure_input="Generated from "`IFS=: + echo $* | sed 's|^[^:]*/||;s|:[^:]*/|, |g'`" by configure." + if test x"$ac_file" != x-; then + configure_input="$ac_file. $configure_input" + { echo "$as_me:$LINENO: creating $ac_file" >&5 +echo "$as_me: creating $ac_file" >&6;} + fi + + case $ac_tag in + *:-:* | *:-) cat >"$tmp/stdin";; + esac + ;; esac - # Compute @srcdir@, @top_srcdir@, and @INSTALL@ for subdirectories. - ac_dir=`(dirname "$ac_file") 2>/dev/null || + ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ - X"$ac_file" : 'X\(/\)' \| \ - . : '\(.\)' 2>/dev/null || + X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || echo X"$ac_file" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } - /^X\(\/\/\)[^/].*/{ s//\1/; q; } - /^X\(\/\/\)$/{ s//\1/; q; } - /^X\(\/\).*/{ s//\1/; q; } - s/.*/./; q'` - { if $as_mkdir_p; then - mkdir -p "$ac_dir" - else - as_dir="$ac_dir" + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + { as_dir="$ac_dir" + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || { $as_mkdir_p && mkdir -p "$as_dir"; } || { as_dirs= - while test ! -d "$as_dir"; do - as_dirs="$as_dir $as_dirs" - as_dir=`(dirname "$as_dir") 2>/dev/null || + while :; do + case $as_dir in #( + *\'*) as_qdir=`echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" + as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ - X"$as_dir" : 'X\(/\)' \| \ - . : '\(.\)' 2>/dev/null || + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || echo X"$as_dir" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } - /^X\(\/\/\)[^/].*/{ s//\1/; q; } - /^X\(\/\/\)$/{ s//\1/; q; } - /^X\(\/\).*/{ s//\1/; q; } - s/.*/./; q'` + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break done - test ! -n "$as_dirs" || mkdir $as_dirs - fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5 -echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;} + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || { { echo "$as_me:$LINENO: error: cannot create directory $as_dir" >&5 +echo "$as_me: error: cannot create directory $as_dir" >&2;} { (exit 1); exit 1; }; }; } - ac_builddir=. -if test "$ac_dir" != .; then +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` - # A "../" for each directory in $ac_dir_suffix. - ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'` -else - ac_dir_suffix= ac_top_builddir= -fi + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,/..,g;s,/,,'` + case $ac_top_builddir_sub in + "") ac_top_builddir_sub=. ac_top_build_prefix= ;; + *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; + esac ;; +esac +ac_abs_top_builddir=$ac_pwd +ac_abs_builddir=$ac_pwd$ac_dir_suffix +# for backward compatibility: +ac_top_builddir=$ac_top_build_prefix case $srcdir in - .) # No --srcdir option. We are building in place. + .) # We are building in place. ac_srcdir=. - if test -z "$ac_top_builddir"; then - ac_top_srcdir=. - else - ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'` - fi ;; - [\\/]* | ?:[\\/]* ) # Absolute path. + ac_top_srcdir=$ac_top_builddir_sub + ac_abs_top_srcdir=$ac_pwd ;; + [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; - ac_top_srcdir=$srcdir ;; - *) # Relative path. - ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix - ac_top_srcdir=$ac_top_builddir$srcdir ;; + ac_top_srcdir=$srcdir + ac_abs_top_srcdir=$srcdir ;; + *) # Relative name. + ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_build_prefix$srcdir + ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac +ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix -# Do not use `cd foo && pwd` to compute absolute paths, because -# the directories may not exist. -case `pwd` in -.) ac_abs_builddir="$ac_dir";; -*) - case "$ac_dir" in - .) ac_abs_builddir=`pwd`;; - [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";; - *) ac_abs_builddir=`pwd`/"$ac_dir";; - esac;; -esac -case $ac_abs_builddir in -.) ac_abs_top_builddir=${ac_top_builddir}.;; -*) - case ${ac_top_builddir}. in - .) ac_abs_top_builddir=$ac_abs_builddir;; - [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;; - *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;; - esac;; -esac -case $ac_abs_builddir in -.) ac_abs_srcdir=$ac_srcdir;; -*) - case $ac_srcdir in - .) ac_abs_srcdir=$ac_abs_builddir;; - [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;; - *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;; - esac;; -esac -case $ac_abs_builddir in -.) ac_abs_top_srcdir=$ac_top_srcdir;; -*) - case $ac_top_srcdir in - .) ac_abs_top_srcdir=$ac_abs_builddir;; - [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;; - *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;; - esac;; -esac + case $ac_mode in + :F) + # + # CONFIG_FILE + # case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; - *) ac_INSTALL=$ac_top_builddir$INSTALL ;; + *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; + esac + ac_MKDIR_P=$MKDIR_P + case $MKDIR_P in + [\\/$]* | ?:[\\/]* ) ;; + */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; esac +_ACEOF - if test x"$ac_file" != x-; then - { echo "$as_me:$LINENO: creating $ac_file" >&5 -echo "$as_me: creating $ac_file" >&6;} - rm -f "$ac_file" - fi - # Let's still pretend it is `configure' which instantiates (i.e., don't - # use $as_me), people would be surprised to read: - # /* config.h. Generated by config.status. */ - if test x"$ac_file" = x-; then - configure_input= - else - configure_input="$ac_file. " - fi - configure_input=$configure_input"Generated from `echo $ac_file_in | - sed 's,.*/,,'` by configure." - - # First look for the input files in the build tree, otherwise in the - # src tree. - ac_file_inputs=`IFS=: - for f in $ac_file_in; do - case $f in - -) echo $tmp/stdin ;; - [\\/$]*) - # Absolute (can't be DOS-style, as IFS=:) - test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 -echo "$as_me: error: cannot find input file: $f" >&2;} - { (exit 1); exit 1; }; } - echo "$f";; - *) # Relative - if test -f "$f"; then - # Build tree - echo "$f" - elif test -f "$srcdir/$f"; then - # Source tree - echo "$srcdir/$f" - else - # /dev/null tree - { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 -echo "$as_me: error: cannot find input file: $f" >&2;} - { (exit 1); exit 1; }; } - fi;; - esac - done` || { (exit 1); exit 1; } +cat >>$CONFIG_STATUS <<\_ACEOF +# If the template does not know about datarootdir, expand it. +# FIXME: This hack should be removed a few years after 2.60. +ac_datarootdir_hack=; ac_datarootdir_seen= + +case `sed -n '/datarootdir/ { + p + q +} +/@datadir@/p +/@docdir@/p +/@infodir@/p +/@localedir@/p +/@mandir@/p +' $ac_file_inputs` in +*datarootdir*) ac_datarootdir_seen=yes;; +*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) + { echo "$as_me:$LINENO: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 +echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF +cat >>$CONFIG_STATUS <<_ACEOF + ac_datarootdir_hack=' + s&@datadir@&$datadir&g + s&@docdir@&$docdir&g + s&@infodir@&$infodir&g + s&@localedir@&$localedir&g + s&@mandir@&$mandir&g + s&\\\${datarootdir}&$datarootdir&g' ;; +esac +_ACEOF + +# Neutralize VPATH when `$srcdir' = `.'. +# Shell code in configure.ac might set extrasub. +# FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF sed "$ac_vpsub $extrasub @@ -117475,252 +113180,131 @@ _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b -s,@configure_input@,$configure_input,;t t -s,@srcdir@,$ac_srcdir,;t t -s,@abs_srcdir@,$ac_abs_srcdir,;t t -s,@top_srcdir@,$ac_top_srcdir,;t t -s,@abs_top_srcdir@,$ac_abs_top_srcdir,;t t -s,@builddir@,$ac_builddir,;t t -s,@abs_builddir@,$ac_abs_builddir,;t t -s,@top_builddir@,$ac_top_builddir,;t t -s,@abs_top_builddir@,$ac_abs_top_builddir,;t t -s,@INSTALL@,$ac_INSTALL,;t t -" $ac_file_inputs | (eval "$ac_sed_cmds") >$tmp/out - rm -f $tmp/stdin - if test x"$ac_file" != x-; then - mv $tmp/out $ac_file - else - cat $tmp/out - rm -f $tmp/out - fi - - # Run the commands associated with the file. +s&@configure_input@&$configure_input&;t t +s&@top_builddir@&$ac_top_builddir_sub&;t t +s&@srcdir@&$ac_srcdir&;t t +s&@abs_srcdir@&$ac_abs_srcdir&;t t +s&@top_srcdir@&$ac_top_srcdir&;t t +s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t +s&@builddir@&$ac_builddir&;t t +s&@abs_builddir@&$ac_abs_builddir&;t t +s&@abs_top_builddir@&$ac_abs_top_builddir&;t t +s&@INSTALL@&$ac_INSTALL&;t t +s&@MKDIR_P@&$ac_MKDIR_P&;t t +$ac_datarootdir_hack +" $ac_file_inputs | sed -f "$tmp/subs-1.sed" | sed -f "$tmp/subs-2.sed" >$tmp/out + +test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && + { ac_out=`sed -n '/\${datarootdir}/p' "$tmp/out"`; test -n "$ac_out"; } && + { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' "$tmp/out"`; test -z "$ac_out"; } && + { echo "$as_me:$LINENO: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined." >&5 +echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined." >&2;} + + rm -f "$tmp/stdin" case $ac_file in - scripts/testsuite_flags ) chmod +x scripts/testsuite_flags ;; + -) cat "$tmp/out"; rm -f "$tmp/out";; + *) rm -f "$ac_file"; mv "$tmp/out" $ac_file;; esac -done + ;; + :H) + # + # CONFIG_HEADER + # _ACEOF -cat >>$CONFIG_STATUS <<\_ACEOF -# -# CONFIG_HEADER section. -# - -# These sed commands are passed to sed as "A NAME B NAME C VALUE D", where -# NAME is the cpp macro being defined and VALUE is the value it is being given. -# -# ac_d sets the value in "#define NAME VALUE" lines. -ac_dA='s,^\([ ]*\)#\([ ]*define[ ][ ]*\)' -ac_dB='[ ].*$,\1#\2' +# Transform confdefs.h into a sed script `conftest.defines', that +# substitutes the proper values into config.h.in to produce config.h. +rm -f conftest.defines conftest.tail +# First, append a space to every undef/define line, to ease matching. +echo 's/$/ /' >conftest.defines +# Then, protect against being on the right side of a sed subst, or in +# an unquoted here document, in config.status. If some macros were +# called several times there might be several #defines for the same +# symbol, which is useless. But do not sort them, since the last +# AC_DEFINE must be honored. +ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* +# These sed commands are passed to sed as "A NAME B PARAMS C VALUE D", where +# NAME is the cpp macro being defined, VALUE is the value it is being given. +# PARAMS is the parameter list in the macro definition--in most cases, it's +# just an empty string. +ac_dA='s,^\\([ #]*\\)[^ ]*\\([ ]*' +ac_dB='\\)[ (].*,\\1define\\2' ac_dC=' ' -ac_dD=',;t' -# ac_u turns "#undef NAME" without trailing blanks into "#define NAME VALUE". -ac_uA='s,^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)' -ac_uB='$,\1#\2define\3' -ac_uC=' ' -ac_uD=',;t' - -for ac_file in : $CONFIG_HEADERS; do test "x$ac_file" = x: && continue - # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". - case $ac_file in - - | *:- | *:-:* ) # input from stdin - cat >$tmp/stdin - ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` - ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; - *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` - ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; - * ) ac_file_in=$ac_file.in ;; - esac - - test x"$ac_file" != x- && { echo "$as_me:$LINENO: creating $ac_file" >&5 -echo "$as_me: creating $ac_file" >&6;} - - # First look for the input files in the build tree, otherwise in the - # src tree. - ac_file_inputs=`IFS=: - for f in $ac_file_in; do - case $f in - -) echo $tmp/stdin ;; - [\\/$]*) - # Absolute (can't be DOS-style, as IFS=:) - test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 -echo "$as_me: error: cannot find input file: $f" >&2;} - { (exit 1); exit 1; }; } - # Do quote $f, to prevent DOS paths from being IFS'd. - echo "$f";; - *) # Relative - if test -f "$f"; then - # Build tree - echo "$f" - elif test -f "$srcdir/$f"; then - # Source tree - echo "$srcdir/$f" - else - # /dev/null tree - { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 -echo "$as_me: error: cannot find input file: $f" >&2;} - { (exit 1); exit 1; }; } - fi;; - esac - done` || { (exit 1); exit 1; } - # Remove the trailing spaces. - sed 's/[ ]*$//' $ac_file_inputs >$tmp/in - -_ACEOF - -# Transform confdefs.h into two sed scripts, `conftest.defines' and -# `conftest.undefs', that substitutes the proper values into -# config.h.in to produce config.h. The first handles `#define' -# templates, and the second `#undef' templates. -# And first: Protect against being on the right side of a sed subst in -# config.status. Protect against being in an unquoted here document -# in config.status. -rm -f conftest.defines conftest.undefs -# Using a here document instead of a string reduces the quoting nightmare. -# Putting comments in sed scripts is not portable. -# -# `end' is used to avoid that the second main sed command (meant for -# 0-ary CPP macros) applies to n-ary macro definitions. -# See the Autoconf documentation for `clear'. -cat >confdef2sed.sed <<\_ACEOF -s/[\\&,]/\\&/g -s,[\\$`],\\&,g -t clear -: clear -s,^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*\)\(([^)]*)\)[ ]*\(.*\)$,${ac_dA}\1${ac_dB}\1\2${ac_dC}\3${ac_dD},gp -t end -s,^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)$,${ac_dA}\1${ac_dB}\1${ac_dC}\2${ac_dD},gp -: end -_ACEOF -# If some macros were called several times there might be several times -# the same #defines, which is useless. Nevertheless, we may not want to -# sort them, since we want the *last* AC-DEFINE to be honored. -uniq confdefs.h | sed -n -f confdef2sed.sed >conftest.defines -sed 's/ac_d/ac_u/g' conftest.defines >conftest.undefs -rm -f confdef2sed.sed - -# This sed command replaces #undef with comments. This is necessary, for +ac_dD=' ,' + +uniq confdefs.h | + sed -n ' + t rset + :rset + s/^[ ]*#[ ]*define[ ][ ]*// + t ok + d + :ok + s/[\\&,]/\\&/g + s/^\('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/ '"$ac_dA"'\1'"$ac_dB"'\2'"${ac_dC}"'\3'"$ac_dD"'/p + s/^\('"$ac_word_re"'\)[ ]*\(.*\)/'"$ac_dA"'\1'"$ac_dB$ac_dC"'\2'"$ac_dD"'/p + ' >>conftest.defines + +# Remove the space that was appended to ease matching. +# Then replace #undef with comments. This is necessary, for # example, in the case of _POSIX_SOURCE, which is predefined and required # on some systems where configure will not decide to define it. -cat >>conftest.undefs <<\_ACEOF -s,^[ ]*#[ ]*undef[ ][ ]*[a-zA-Z_][a-zA-Z_0-9]*,/* & */, -_ACEOF - -# Break up conftest.defines because some shells have a limit on the size -# of here documents, and old seds have small limits too (100 cmds). -echo ' # Handle all the #define templates only if necessary.' >>$CONFIG_STATUS -echo ' if grep "^[ ]*#[ ]*define" $tmp/in >/dev/null; then' >>$CONFIG_STATUS -echo ' # If there are no defines, we may have an empty if/fi' >>$CONFIG_STATUS -echo ' :' >>$CONFIG_STATUS -rm -f conftest.tail -while grep . conftest.defines >/dev/null -do - # Write a limited-size here document to $tmp/defines.sed. - echo ' cat >$tmp/defines.sed <>$CONFIG_STATUS - # Speed up: don't consider the non `#define' lines. - echo '/^[ ]*#[ ]*define/!b' >>$CONFIG_STATUS - # Work around the forget-to-reset-the-flag bug. - echo 't clr' >>$CONFIG_STATUS - echo ': clr' >>$CONFIG_STATUS - sed ${ac_max_here_lines}q conftest.defines >>$CONFIG_STATUS +# (The regexp can be short, since the line contains either #define or #undef.) +echo 's/ $// +s,^[ #]*u.*,/* & */,' >>conftest.defines + +# Break up conftest.defines: +ac_max_sed_lines=50 + +# First sed command is: sed -f defines.sed $ac_file_inputs >"$tmp/out1" +# Second one is: sed -f defines.sed "$tmp/out1" >"$tmp/out2" +# Third one will be: sed -f defines.sed "$tmp/out2" >"$tmp/out1" +# et cetera. +ac_in='$ac_file_inputs' +ac_out='"$tmp/out1"' +ac_nxt='"$tmp/out2"' + +while : +do + # Write a here document: + cat >>$CONFIG_STATUS <<_ACEOF + # First, check the format of the line: + cat >"\$tmp/defines.sed" <<\\CEOF +/^[ ]*#[ ]*undef[ ][ ]*$ac_word_re[ ]*\$/b def +/^[ ]*#[ ]*define[ ][ ]*$ac_word_re[( ]/b def +b +:def +_ACEOF + sed ${ac_max_sed_lines}q conftest.defines >>$CONFIG_STATUS echo 'CEOF - sed -f $tmp/defines.sed $tmp/in >$tmp/out - rm -f $tmp/in - mv $tmp/out $tmp/in -' >>$CONFIG_STATUS - sed 1,${ac_max_here_lines}d conftest.defines >conftest.tail + sed -f "$tmp/defines.sed"' "$ac_in >$ac_out" >>$CONFIG_STATUS + ac_in=$ac_out; ac_out=$ac_nxt; ac_nxt=$ac_in + sed 1,${ac_max_sed_lines}d conftest.defines >conftest.tail + grep . conftest.tail >/dev/null || break rm -f conftest.defines mv conftest.tail conftest.defines done -rm -f conftest.defines -echo ' fi # grep' >>$CONFIG_STATUS -echo >>$CONFIG_STATUS - -# Break up conftest.undefs because some shells have a limit on the size -# of here documents, and old seds have small limits too (100 cmds). -echo ' # Handle all the #undef templates' >>$CONFIG_STATUS -rm -f conftest.tail -while grep . conftest.undefs >/dev/null -do - # Write a limited-size here document to $tmp/undefs.sed. - echo ' cat >$tmp/undefs.sed <>$CONFIG_STATUS - # Speed up: don't consider the non `#undef' - echo '/^[ ]*#[ ]*undef/!b' >>$CONFIG_STATUS - # Work around the forget-to-reset-the-flag bug. - echo 't clr' >>$CONFIG_STATUS - echo ': clr' >>$CONFIG_STATUS - sed ${ac_max_here_lines}q conftest.undefs >>$CONFIG_STATUS - echo 'CEOF - sed -f $tmp/undefs.sed $tmp/in >$tmp/out - rm -f $tmp/in - mv $tmp/out $tmp/in -' >>$CONFIG_STATUS - sed 1,${ac_max_here_lines}d conftest.undefs >conftest.tail - rm -f conftest.undefs - mv conftest.tail conftest.undefs -done -rm -f conftest.undefs +rm -f conftest.defines conftest.tail +echo "ac_result=$ac_in" >>$CONFIG_STATUS cat >>$CONFIG_STATUS <<\_ACEOF - # Let's still pretend it is `configure' which instantiates (i.e., don't - # use $as_me), people would be surprised to read: - # /* config.h. Generated by config.status. */ - if test x"$ac_file" = x-; then - echo "/* Generated by configure. */" >$tmp/config.h - else - echo "/* $ac_file. Generated by configure. */" >$tmp/config.h - fi - cat $tmp/in >>$tmp/config.h - rm -f $tmp/in if test x"$ac_file" != x-; then - if diff $ac_file $tmp/config.h >/dev/null 2>&1; then + echo "/* $configure_input */" >"$tmp/config.h" + cat "$ac_result" >>"$tmp/config.h" + if diff $ac_file "$tmp/config.h" >/dev/null 2>&1; then { echo "$as_me:$LINENO: $ac_file is unchanged" >&5 echo "$as_me: $ac_file is unchanged" >&6;} else - ac_dir=`(dirname "$ac_file") 2>/dev/null || -$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$ac_file" : 'X\(//\)[^/]' \| \ - X"$ac_file" : 'X\(//\)$' \| \ - X"$ac_file" : 'X\(/\)' \| \ - . : '\(.\)' 2>/dev/null || -echo X"$ac_file" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } - /^X\(\/\/\)[^/].*/{ s//\1/; q; } - /^X\(\/\/\)$/{ s//\1/; q; } - /^X\(\/\).*/{ s//\1/; q; } - s/.*/./; q'` - { if $as_mkdir_p; then - mkdir -p "$ac_dir" - else - as_dir="$ac_dir" - as_dirs= - while test ! -d "$as_dir"; do - as_dirs="$as_dir $as_dirs" - as_dir=`(dirname "$as_dir") 2>/dev/null || -$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$as_dir" : 'X\(//\)[^/]' \| \ - X"$as_dir" : 'X\(//\)$' \| \ - X"$as_dir" : 'X\(/\)' \| \ - . : '\(.\)' 2>/dev/null || -echo X"$as_dir" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } - /^X\(\/\/\)[^/].*/{ s//\1/; q; } - /^X\(\/\/\)$/{ s//\1/; q; } - /^X\(\/\).*/{ s//\1/; q; } - s/.*/./; q'` - done - test ! -n "$as_dirs" || mkdir $as_dirs - fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5 -echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;} - { (exit 1); exit 1; }; }; } - rm -f $ac_file - mv $tmp/config.h $ac_file + mv "$tmp/config.h" $ac_file fi else - cat $tmp/config.h - rm -f $tmp/config.h + echo "/* $configure_input */" + cat "$ac_result" fi + rm -f "$tmp/out12" # Compute $ac_file's index in $config_headers. _am_stamp_count=1 for _am_header in $config_headers :; do @@ -117731,135 +113315,39 @@ for _am_header in $config_headers :; do _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done -echo "timestamp for $ac_file" >`(dirname $ac_file) 2>/dev/null || +echo "timestamp for $ac_file" >`$as_dirname -- $ac_file || $as_expr X$ac_file : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X$ac_file : 'X\(//\)[^/]' \| \ X$ac_file : 'X\(//\)$' \| \ - X$ac_file : 'X\(/\)' \| \ - . : '\(.\)' 2>/dev/null || + X$ac_file : 'X\(/\)' \| . 2>/dev/null || echo X$ac_file | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } - /^X\(\/\/\)[^/].*/{ s//\1/; q; } - /^X\(\/\/\)$/{ s//\1/; q; } - /^X\(\/\).*/{ s//\1/; q; } - s/.*/./; q'`/stamp-h$_am_stamp_count -done -_ACEOF -cat >>$CONFIG_STATUS <<\_ACEOF - -# -# CONFIG_COMMANDS section. -# -for ac_file in : $CONFIG_COMMANDS; do test "x$ac_file" = x: && continue - ac_dest=`echo "$ac_file" | sed 's,:.*,,'` - ac_source=`echo "$ac_file" | sed 's,[^:]*:,,'` - ac_dir=`(dirname "$ac_dest") 2>/dev/null || -$as_expr X"$ac_dest" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$ac_dest" : 'X\(//\)[^/]' \| \ - X"$ac_dest" : 'X\(//\)$' \| \ - X"$ac_dest" : 'X\(/\)' \| \ - . : '\(.\)' 2>/dev/null || -echo X"$ac_dest" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } - /^X\(\/\/\)[^/].*/{ s//\1/; q; } - /^X\(\/\/\)$/{ s//\1/; q; } - /^X\(\/\).*/{ s//\1/; q; } - s/.*/./; q'` - { if $as_mkdir_p; then - mkdir -p "$ac_dir" - else - as_dir="$ac_dir" - as_dirs= - while test ! -d "$as_dir"; do - as_dirs="$as_dir $as_dirs" - as_dir=`(dirname "$as_dir") 2>/dev/null || -$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$as_dir" : 'X\(//\)[^/]' \| \ - X"$as_dir" : 'X\(//\)$' \| \ - X"$as_dir" : 'X\(/\)' \| \ - . : '\(.\)' 2>/dev/null || -echo X"$as_dir" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } - /^X\(\/\/\)[^/].*/{ s//\1/; q; } - /^X\(\/\/\)$/{ s//\1/; q; } - /^X\(\/\).*/{ s//\1/; q; } - s/.*/./; q'` - done - test ! -n "$as_dirs" || mkdir $as_dirs - fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5 -echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;} - { (exit 1); exit 1; }; }; } - - ac_builddir=. - -if test "$ac_dir" != .; then - ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` - # A "../" for each directory in $ac_dir_suffix. - ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'` -else - ac_dir_suffix= ac_top_builddir= -fi - -case $srcdir in - .) # No --srcdir option. We are building in place. - ac_srcdir=. - if test -z "$ac_top_builddir"; then - ac_top_srcdir=. - else - ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'` - fi ;; - [\\/]* | ?:[\\/]* ) # Absolute path. - ac_srcdir=$srcdir$ac_dir_suffix; - ac_top_srcdir=$srcdir ;; - *) # Relative path. - ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix - ac_top_srcdir=$ac_top_builddir$srcdir ;; -esac + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'`/stamp-h$_am_stamp_count + ;; -# Do not use `cd foo && pwd` to compute absolute paths, because -# the directories may not exist. -case `pwd` in -.) ac_abs_builddir="$ac_dir";; -*) - case "$ac_dir" in - .) ac_abs_builddir=`pwd`;; - [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";; - *) ac_abs_builddir=`pwd`/"$ac_dir";; - esac;; -esac -case $ac_abs_builddir in -.) ac_abs_top_builddir=${ac_top_builddir}.;; -*) - case ${ac_top_builddir}. in - .) ac_abs_top_builddir=$ac_abs_builddir;; - [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;; - *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;; - esac;; -esac -case $ac_abs_builddir in -.) ac_abs_srcdir=$ac_srcdir;; -*) - case $ac_srcdir in - .) ac_abs_srcdir=$ac_abs_builddir;; - [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;; - *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;; - esac;; -esac -case $ac_abs_builddir in -.) ac_abs_top_srcdir=$ac_top_srcdir;; -*) - case $ac_top_srcdir in - .) ac_abs_top_srcdir=$ac_abs_builddir;; - [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;; - *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;; - esac;; -esac + :C) { echo "$as_me:$LINENO: executing $ac_file commands" >&5 +echo "$as_me: executing $ac_file commands" >&6;} + ;; + esac - { echo "$as_me:$LINENO: executing $ac_dest commands" >&5 -echo "$as_me: executing $ac_dest commands" >&6;} - case $ac_dest in - default-1 ) + case $ac_file$ac_mode in + "default-1":C) # Only add multilib support code if we just rebuilt the top-level # Makefile. case " $CONFIG_FILES " in @@ -117867,7 +113355,7 @@ case " $CONFIG_FILES " in ac_file=Makefile . ${multi_basedir}/config-ml.in ;; esac ;; - libtool ) + "libtool":C) # See if we are running on zsh, and set the options which allow our # commands through without removal of \ escapes. @@ -118577,7 +114065,8 @@ compiler_lib_search_path=$lt_compiler_lib_search_path_CXX _LT_EOF ;; - default ) if test -n "$CONFIG_FILES"; then + "scripts/testsuite_flags":F) chmod +x scripts/testsuite_flags ;; + "default":C) if test -n "$CONFIG_FILES"; then # Multilibs need MULTISUBDIR defined correctly in certain makefiles so # that multilib installs will end up installed in the correct place. # The testsuite needs it for multilib-aware ABI baseline files. @@ -118603,11 +114092,10 @@ _EOF fi (cd include && ${MAKE-make}) ;; + esac -done -_ACEOF +done # for ac_tag -cat >>$CONFIG_STATUS <<\_ACEOF { (exit 0); exit 0; } _ACEOF diff --git a/libstdc++-v3/doc/Makefile.am b/libstdc++-v3/doc/Makefile.am new file mode 100644 index 00000000000..946f8498914 --- /dev/null +++ b/libstdc++-v3/doc/Makefile.am @@ -0,0 +1,62 @@ +## Makefile for the doc subdirectory of the GNU C++ Standard library. +## +## Copyright (C) 2008 Free Software Foundation, Inc. +## +## This file is part of the libstdc++ version 3 distribution. +## Process this file with automake to produce Makefile.in. + +## This file is part of the GNU ISO C++ Library. This library is free +## software; you can redistribute it and/or modify it under the +## terms of the GNU General Public License as published by the +## Free Software Foundation; either version 2, or (at your option) +## any later version. + +## This library is distributed in the hope that it will be useful, +## but WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY 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 Public License along +## with this library; see the file COPYING. If not, write to the Free +## Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, +## USA. + +include $(top_srcdir)/fragment.am + +# These rules are messy, but are hella worth it. +doc-doxygen-html: + -(srcdir=`cd ${top_srcdir}; ${PWD_COMMAND}`; \ + builddir=`cd ..; ${PWD_COMMAND}`; \ + ${SHELL} ${top_srcdir}/doc/doxygen/run_doxygen \ + --host_alias=${host_alias} --mode=html $${srcdir} $${builddir}) + +doc-doxygen-man: + -(srcdir=`cd ${top_srcdir}; ${PWD_COMMAND}`; \ + builddir=`cd ..; ${PWD_COMMAND}`; \ + ${SHELL} ${top_srcdir}/doc/doxygen/run_doxygen \ + --host_alias=${host_alias} --mode=man $${srcdir} $${builddir}) + +# Generates the plots and graphs for performance testing. +doc_performance_script=${top_srcdir}/scripts/make_graphs.py +doc-performance: + -@(chmod + ${doc_performance_script}; \ + ${doc_performance_script} ${top_srcdir} \ + ${glibcxx_builddir}/testsuite \ + ${top_srcdir}/testsuite/data/make_graph_htmls.xml \ + ${top_srcdir}/testsuite/data/make_graph_test_infos.xml local g++) + +# No install-pdf, install-html support in automake yet +install-pdf: +install-html: + +# Installation of distribution html documentation not yet supported +# TODO: Write custom install-html rule. +.PHONY: install-html install-pdf \ + doc-doxygen-html doc-doxygen-man doc-performance + +# By adding these files here, automake will remove them for 'make clean' +CLEANFILES = + +# To remove directories. +clean-local: + rm -rf man doxygen diff --git a/libstdc++-v3/doc/Makefile.in b/libstdc++-v3/doc/Makefile.in new file mode 100644 index 00000000000..80ceb73ff97 --- /dev/null +++ b/libstdc++-v3/doc/Makefile.in @@ -0,0 +1,459 @@ +# Makefile.in generated by automake 1.10 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006 Free Software Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +target_triplet = @target@ +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ + $(top_srcdir)/fragment.am +subdir = doc +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/../config/enable.m4 \ + $(top_srcdir)/../config/futex.m4 \ + $(top_srcdir)/../config/iconv.m4 \ + $(top_srcdir)/../config/lead-dot.m4 \ + $(top_srcdir)/../config/lib-ld.m4 \ + $(top_srcdir)/../config/lib-link.m4 \ + $(top_srcdir)/../config/lib-prefix.m4 \ + $(top_srcdir)/../config/multi.m4 \ + $(top_srcdir)/../config/no-executables.m4 \ + $(top_srcdir)/../config/unwind_ipinfo.m4 \ + $(top_srcdir)/../libtool.m4 $(top_srcdir)/../ltoptions.m4 \ + $(top_srcdir)/../ltsugar.m4 $(top_srcdir)/../ltversion.m4 \ + $(top_srcdir)/crossconfig.m4 $(top_srcdir)/linkage.m4 \ + $(top_srcdir)/acinclude.m4 $(top_srcdir)/../config/tls.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +depcomp = +am__depfiles_maybe = +SOURCES = +DIST_SOURCES = +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ABI_TWEAKS_SRCDIR = @ABI_TWEAKS_SRCDIR@ +ACLOCAL = @ACLOCAL@ +ALLOCATOR_H = @ALLOCATOR_H@ +ALLOCATOR_NAME = @ALLOCATOR_NAME@ +AMTAR = @AMTAR@ +AR = @AR@ +AS = @AS@ +ATOMICITY_SRCDIR = @ATOMICITY_SRCDIR@ +ATOMIC_FLAGS = @ATOMIC_FLAGS@ +ATOMIC_WORD_SRCDIR = @ATOMIC_WORD_SRCDIR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BASIC_FILE_CC = @BASIC_FILE_CC@ +BASIC_FILE_H = @BASIC_FILE_H@ +CC = @CC@ +CCODECVT_CC = @CCODECVT_CC@ +CCOLLATE_CC = @CCOLLATE_CC@ +CCTYPE_CC = @CCTYPE_CC@ +CFLAGS = @CFLAGS@ +CLOCALE_CC = @CLOCALE_CC@ +CLOCALE_H = @CLOCALE_H@ +CLOCALE_INTERNAL_H = @CLOCALE_INTERNAL_H@ +CMESSAGES_CC = @CMESSAGES_CC@ +CMESSAGES_H = @CMESSAGES_H@ +CMONEY_CC = @CMONEY_CC@ +CNUMERIC_CC = @CNUMERIC_CC@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CPU_DEFINES_SRCDIR = @CPU_DEFINES_SRCDIR@ +CSTDIO_H = @CSTDIO_H@ +CTIME_CC = @CTIME_CC@ +CTIME_H = @CTIME_H@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +C_INCLUDE_DIR = @C_INCLUDE_DIR@ +DEBUG_FLAGS = @DEBUG_FLAGS@ +DEFS = @DEFS@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ERROR_CONSTANTS_SRCDIR = @ERROR_CONSTANTS_SRCDIR@ +EXEEXT = @EXEEXT@ +EXTRA_CXX_FLAGS = @EXTRA_CXX_FLAGS@ +FGREP = @FGREP@ +GLIBCXX_INCLUDES = @GLIBCXX_INCLUDES@ +GREP = @GREP@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBICONV = @LIBICONV@ +LIBMATHOBJS = @LIBMATHOBJS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBSUPCXX_PICFLAGS = @LIBSUPCXX_PICFLAGS@ +LIBTOOL = @LIBTOOL@ +LN_S = @LN_S@ +LTLIBICONV = @LTLIBICONV@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +OBJEXT = @OBJEXT@ +OPTIMIZE_CXXFLAGS = @OPTIMIZE_CXXFLAGS@ +OPT_LDFLAGS = @OPT_LDFLAGS@ +OS_INC_SRCDIR = @OS_INC_SRCDIR@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +RANLIB = @RANLIB@ +SECTION_FLAGS = @SECTION_FLAGS@ +SECTION_LDFLAGS = @SECTION_LDFLAGS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +SYMVER_FILE = @SYMVER_FILE@ +TOPLEVEL_INCLUDES = @TOPLEVEL_INCLUDES@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +WARN_FLAGS = @WARN_FLAGS@ +WERROR = @WERROR@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__leading_dot = @am__leading_dot@ +am__tar = @am__tar@ +am__untar = @am__untar@ +baseline_dir = @baseline_dir@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +check_msgfmt = @check_msgfmt@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +enable_shared = @enable_shared@ +enable_static = @enable_static@ +exec_prefix = @exec_prefix@ +glibcxx_MOFILES = @glibcxx_MOFILES@ +glibcxx_PCHFLAGS = @glibcxx_PCHFLAGS@ +glibcxx_POFILES = @glibcxx_POFILES@ +glibcxx_builddir = @glibcxx_builddir@ +glibcxx_localedir = @glibcxx_localedir@ +glibcxx_prefixdir = @glibcxx_prefixdir@ +glibcxx_srcdir = @glibcxx_srcdir@ +glibcxx_thread_h = @glibcxx_thread_h@ +glibcxx_toolexecdir = @glibcxx_toolexecdir@ +glibcxx_toolexeclibdir = @glibcxx_toolexeclibdir@ +gxx_include_dir = @gxx_include_dir@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +libtool_VERSION = @libtool_VERSION@ +localedir = @localedir@ +localstatedir = @localstatedir@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +multi_basedir = @multi_basedir@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +port_specific_symbol_files = @port_specific_symbol_files@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target = @target@ +target_alias = @target_alias@ +target_cpu = @target_cpu@ +target_os = @target_os@ +target_vendor = @target_vendor@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +toplevel_srcdir = @toplevel_srcdir@ + +# May be used by various substitution variables. +gcc_version := $(shell cat $(top_srcdir)/../gcc/BASE-VER) +MAINT_CHARSET = latin1 +mkinstalldirs = $(SHELL) $(toplevel_srcdir)/mkinstalldirs +PWD_COMMAND = $${PWDCMD-pwd} +STAMP = echo timestamp > +toolexecdir = $(glibcxx_toolexecdir) +toolexeclibdir = $(glibcxx_toolexeclibdir) + +# These bits are all figured out from configure. Look in acinclude.m4 +# or configure.ac to see how they are set. See GLIBCXX_EXPORT_FLAGS. +CONFIG_CXXFLAGS = \ + $(SECTION_FLAGS) $(EXTRA_CXX_FLAGS) + +WARN_CXXFLAGS = \ + $(WARN_FLAGS) $(WERROR) -fdiagnostics-show-location=once + + +# -I/-D flags to pass when compiling. +AM_CPPFLAGS = $(GLIBCXX_INCLUDES) + +# Generates the plots and graphs for performance testing. +doc_performance_script = ${top_srcdir}/scripts/make_graphs.py + +# By adding these files here, automake will remove them for 'make clean' +CLEANFILES = +all: all-am + +.SUFFIXES: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/fragment.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign --ignore-deps doc/Makefile'; \ + cd $(top_srcdir) && \ + $(AUTOMAKE) --foreign --ignore-deps doc/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs +tags: TAGS +TAGS: + +ctags: CTAGS +CTAGS: + + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-local mostlyclean-am + +distclean: distclean-am + -rm -f Makefile +distclean-am: clean-am distclean-generic + +dvi: dvi-am + +dvi-am: + +html: html-am + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-exec-am: + +install-info: install-info-am + +install-man: + +install-ps: install-ps-am + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-generic mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: all all-am check check-am clean clean-generic clean-libtool \ + clean-local distclean distclean-generic distclean-libtool \ + distdir dvi dvi-am html html-am info info-am install \ + install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + uninstall uninstall-am + + +# These rules are messy, but are hella worth it. +# XXX mode=html always enables maintainer mode +doc-doxygen-html: + -(srcdir=`cd ${top_srcdir}; ${PWD_COMMAND}`; \ + builddir=`cd ..; ${PWD_COMMAND}`; \ + ${SHELL} ${top_srcdir}/doc/doxygen/run_doxygen \ + --host_alias=${host_alias} --mode=html $${srcdir} $${builddir}) + +doc-doxygen-man: + -(srcdir=`cd ${top_srcdir}; ${PWD_COMMAND}`; \ + builddir=`cd ..; ${PWD_COMMAND}`; \ + ${SHELL} ${top_srcdir}/doc/doxygen/run_doxygen \ + --host_alias=${host_alias} --mode=man $${srcdir} $${builddir}) +doc-performance: + -@(chmod + ${doc_performance_script}; \ + `echo "Required dependencies are PyChart and Beautiful Soup` \ + ${doc_performance_script} ${top_srcdir} \ + ${glibcxx_builddir}/testsuite \ + ${top_srcdir}/testsuite/data/make_graph_htmls.xml \ + ${top_srcdir}/testsuite/data/make_graph_test_infos.xml local g++) + +# No install-pdf, install-html support in automake yet +install-pdf: +install-html: + +# Installation of distribution html documentation not yet supported +# TODO: Write custom install-html rule. +.PHONY: install-html install-pdf \ + doc-doxygen-html doc-doxygen-man doc-performance + +# To remove directories. +clean-local: + rm -rf man doxygen +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/libstdc++-v3/doc/doxygen/Intro.3 b/libstdc++-v3/doc/doxygen/Intro.3 new file mode 100644 index 00000000000..cb3ff2e4a1e --- /dev/null +++ b/libstdc++-v3/doc/doxygen/Intro.3 @@ -0,0 +1,132 @@ +.\" t +.\" This man page is released under the FDL as part of libstdc++. +.TH C++Intro 3 "20 May 2004" "GNU libstdc++" "Standard C++ Library" +.SH NAME +C++Intro \- Introduction to the GNU libstdc++ man pages +.SH DESCRIPTION +This man page serves as a brief introduction to the GNU implementation of +the Standard C++ Library. For a better introduction and more complete +documentation, see the +.B libstdc++ +homepage listed at the end. +.P +All standard library entities are declared within +.I namespace std +and have manual entries beginning with "std::". For example, to see +documentation of the template class +.I std::vector +one would use "man std::vector". Some entities do not have a separate man +page; for those see the main listing in "man Namespace_std". +.P +All the man pages are automatically generated by Doxygen. For more +information on this tool, see the HTML counterpart to these man pages. +.P +Some man pages do not correspond to individual classes or functions. Rather +they describe categories of the Standard Library. (For a more thorough +introduction to the various categories, consult a text such as Josuttis' +or Austern's.) These category pages are: +.P +.\" These are separated by ONE TAB. Nothing else. I don't like it either. +.TS +lB l. +C++Intro This page. +Namespace_std A listing of the contents of std::. +Namespace___gnu_cxx A listing of the contents of __gnu_cxx::. +Containers An introduction to container classes. +Sequences Linear containers. +Assoc_containers Key-based containers. +Iterator_types Programatically distinguishing iterators/pointers. +Intro_functors An introduction to function objects, or functors. +Arithmetic_functors Functors for basic math. +Binder_functors Functors which "remember" an argument. +Comparison_functors Functors wrapping built-in comparisons. +Func_ptr_functors Functors for use with pointers to functions. +Logical_functors Functors wrapping the Boolean operations. +Member_ptr_functor Functors for use with pointers to members. +Negation_functors Functors which negate their contents. +SGIextensions A list of the extensions from the SGI STL subset. + +.TE +.P +The HTML documentation typically goes into much more depth. +.SH FILES +Lots! +.SS Standard Headers +These headers will be found automatically, unless you instruct the compiler +otherwise. +.TS +lB lB lB lB. + + + + + + +646 + + + + + +.TE +.SS Backwards-Compatibility Headers +For GCC 3.0 these headers will be found automatically, unless you instruct +the compiler otherwise. You should not depend on this, instead you should +read FAQ 5.4 and use a +.B backward/ +prefix. +.TS +lB lB lB lB. + +.TE +.SS Extension Headers +These headers will only be found automatically if you include the leading +.B ext/ +in the name. Otherwise you need to read FAQ 5.4. +.\" Easy way to generate these columns of headers is to use GNU ls(1): +.\" ls -w 40 file1 file2... | sed 's=[a-z_][a-z_]*==g' +.TS +lB lB. + + + + + + + + +.TE +.SS Libraries +.TP +.I libstdc++.a +The library implementation in static archive form. If you did not configure +libstdc++ to use shared libraries, this will always be used. Otherwise +it will only be used if the user requests it. +.TP +.I libsupc++.a +This library contains C++ language support routines. Usually you will never +need to know about it, but it can be useful. See FAQ 2.5. +.TP +.I libstdc++.so[.N] +The library implementation in shared object form. This will be used in +preference to the static archive form by default. N will be a number equal +to or greater than 3. If N is in the 2.x series, then you are looking at +the old libstdc++-v2 library, which we do not maintain. +.TP +.I libstdc++.la +.TP +.I libsupc++.la +These are Libtool library files, and should only be used when working with +that tool. +.SH CONFORMING TO +Almost conforming to +.BI "International Standard ISO/IEC 14882:1998(E), " "Programming Languages --- C++" +(aka the C++ standard), in addition to corrections proposed by the Library +Working Group, +.SM JTC1/SC22/WG21. +.SH SEE ALSO +.UR +http://gcc.gnu.org/libstdc++/ +.UE +for the Frequently Asked Questions, online documentation, and much, much more! +.\" vim:ts=8:noet: diff --git a/libstdc++-v3/doc/doxygen/TODO b/libstdc++-v3/doc/doxygen/TODO new file mode 100644 index 00000000000..d50c65d8bab --- /dev/null +++ b/libstdc++-v3/doc/doxygen/TODO @@ -0,0 +1,70 @@ + +The approach I've been using for a given header is to recursively do each +of the "bits" headers which make up the standard header. So, e.g., while +there are four headers making up , three of them were already +documented in the course of doing other headers. + +"Untouched" means I've deliberately skipped it for various reasons, or +haven't gotten to it yet. It /will/ be done (by somebody, eventually.) + +If you document an area and need to skip (for whatever reason) a non-trivial +entity (i.e., one that should be documented), go ahead and add the comment +markup, and use the homegrown @doctodo tag. See include/bits/stl_iterator.h +for examples of this. Doing so will at least cause doxygen to consider the +entitiy as documented and include it in the output. It will also add the +entity to the generated TODO page. + + + Area Still needs to be doxygen-documented +----------------------------------------------------------- + +c17 FINISHED (Nothing in Clause 17 "exists" in terms of code.) +c18 FINISHED, Note A +c19 Note A +c20 Note A +c21 Public functions basic_string done, Note B +c22 Most still to do; see docs/html/22_locale/* +c23 See doxygroups.cc and Note B. Notes on what invalidates + iterators need to be added. +c24 stl_iterator.h (__normal_iterator, other small TODO bits) + stream iterators +c25 stl_algo.h (lots of stuff) +c26 , , stl_numeric.h[26.4], Note A +c27 ios_base callbacks and local storage + basic_ios::copyfmt() + std_streambuf.h's __copy_streambufs() + " " _M_* protected memfns (data has been done) + fstream and sstream protected members + +backward/* Not scanned by doxygen. Should it be? Doubtful. + +ext/* Some of the SGI algorithm/functional extensions. + All of rope/hashing/slist need docs. + +__gnu_cxx Tricky. Right now ext/* are in this namespace. + +----------------------------------------------------------- + +NOTES: + +A) So far I have not tried to document any of the headers. So entities +such as atexit() are undocumented throughout the library. Since we usually +do not have the C code (to which the doxygen comments would be attached), +this would need to be done in entirely separate files, a la doxygroups.cc. + +B) Huge chunks of containers and strings are described in common "Tables" +in the standard. These are pseudo-duplicated in tables.html. We can +use doxygen hooks like @pre and @see to reference the tables. Then the +individual classes do like the standard does, and only document members for +which additional info is available. + + +STYLE: +stl_deque.h, stl_pair.h, and stl_algobase.h have good examples of what I've +been using for class, namespace-scope, and function documentation, respectively. +These should serve as starting points. /Please/ maintain the inter-word and +inter-sentence spacing, as this might be generated and/or scanned in the +future. + + +vim:ts=4:et: diff --git a/libstdc++-v3/doc/doxygen/doxygroups.cc b/libstdc++-v3/doc/doxygen/doxygroups.cc new file mode 100644 index 00000000000..68d142fdbfb --- /dev/null +++ b/libstdc++-v3/doc/doxygen/doxygroups.cc @@ -0,0 +1,238 @@ +/* + Copyright (C) 2001, 2002, 2005 Free Software Foundation, Inc. + See license.html for license. + + This just provides documentation for stuff that doesn't need to be in the + source headers themselves. It is a ".cc" file for the sole cheesy reason + that it triggers many different text editors into doing Nice Things when + typing comments. However, it is mentioned nowhere except the *cfg.in files. + + Some actual code (declarations) is exposed here, but no compiler ever + sees it. The decls must be visible to doxygen, and sometimes their real + declarations are not visible, or not visible in a way we want. + + Pieces separated by '// //' lines will usually not be presented to the + user on the same page. +*/ + +// // // // // // // // // // // // // // // // // // // // // // // // +/** @namespace std + * @brief Everything defined by the ISO C++ Standard is within + * namespace std. +*/ +/** @namespace std::__detail + * @brief Implementation details not part of the namespace std interface. +*/ +/** @namespace std::tr1 + * @brief Everything defined by the ISO C++ TR1 is within namespace std::tr1. +*/ +/** @namespace std::tr1::__detail + * @brief Implementation details not part of the namespace std::tr1 interface. +*/ +/** @namespace __gnu_cxx + * @brief GNU extensions for public use. +*/ +/** @namespace __gnu_cxx::__detail + * @brief Implementation details not part of the namespace __gnu_cxx + * interface. +*/ +/** @namespace __gnu_cxx::typelist + * @brief GNU typelist extensions for public compile-time use. +*/ +/** @namespace __gnu_internal + * @brief GNU implemenation details, not for public use or + * export. Used only when anonymous namespaces cannot be substituted. +*/ +/** @namespace __gnu_debug + * @brief GNU debug classes for public use. +*/ +// // // // // // // // // // // // // // // // // // // // // // // // +/** @addtogroup SGIextensions STL extensions from SGI +Because libstdc++ based its implementation of the STL subsections of +the library on the SGI 3.3 implementation, we inherited their extensions +as well. + +They are additionally documented in the + +online documentation, a copy of which is also shipped with the +library source code (in .../docs/html/documentation.html). You can also +read the documentation on SGI's +site, which is still running even though the code is not maintained. + +NB that the following notes are pulled from various +comments all over the place, so they may seem stilted. +
+*/ + +// // // // // // // // // // // // // // // // // // // // // // // // +// This is standalone because, unlike the functor introduction, there is no +// single header file which serves as a base "all containers must include +// this header". We do some quoting of 14882 here. +/** @addtogroup Containers Containers +Containers are collections of objects. + +A container may hold any type which meets certain requirements, but the type +of contained object is chosen at compile time, and all objects in a given +container must be of the same type. (Polymorphism is possible by declaring a +container of pointers to a base class and then populating it with pointers to +instances of derived classes. Variant value types such as the @c any class +from Boost can also be used. + +All contained types must be @c Assignable and @c CopyConstructible. +Specific containers may place additional requirements on the types of +their contained objects. + +Containers manage memory allocation and deallocation themselves when +storing your objects. The objects are destroyed when the container is +itself destroyed. Note that if you are storing pointers in a container, +@c delete is @e not automatically called on the pointers before destroying them. + +All containers must meet certain requirements, summarized in +tables. + +The standard containers are further refined into +@link Sequences Sequences@endlink and +@link Assoc_containers Associative Containers@endlink. +*/ + +/** @addtogroup Sequences Sequences +Sequences arrange a collection of objects into a strictly linear order. + +The differences between sequences are usually due to one or both of the +following: + - memory management + - algorithmic complexity + +As an example of the first case, @c vector is required to use a contiguous +memory layout, while other sequences such as @c deque are not. + +The prime reason for choosing one sequence over another should be based on +the second category of differences, algorithmic complexity. For example, if +you need to perform many inserts and removals from the middle of a sequence, +@c list would be ideal. But if you need to perform constant-time access to +random elements of the sequence, then @c list should not be used. + +All sequences must meet certain requirements, summarized in +tables. +*/ + +/** @addtogroup Assoc_containers Associative Containers +Associative containers allow fast retrieval of data based on keys. + +Each container type is parameterized on a @c Key type, and an ordering +relation used to sort the elements of the container. + +There should be more text here. + +All associative containers must meet certain requirements, summarized in +tables. +*/ + +// // // // // // // // // // // // // // // // // // // // // // // // +/** @namespace abi + * @brief The cross-vendor C++ Application Binary Interface. A + * namespace alias to __cxxabiv1. + * + * A brief overview of an ABI is given in the libstdc++ FAQ, question + * 5.8 (you may have a copy of the FAQ locally, or you can view the online + * version at http://gcc.gnu.org/onlinedocs/libstdc++/faq/index.html#5_8). + * + * GCC subscribes to a relatively-new cross-vendor ABI for C++, sometimes + * called the IA64 ABI because it happens to be the native ABI for that + * platform. It is summarized at http://www.codesourcery.com/cxx-abi/ + * along with the current specification. + * + * For users of GCC greater than or equal to 3.x, entry points are + * available in , which notes, "It is not normally + * necessary for user programs to include this header, or use the + * entry points directly. However, this header is available should + * that be needed." +*/ + +namespace abi { +/** +@brief New ABI-mandated entry point in the C++ runtime library for demangling. + +@param mangled_name A NUL-terminated character string containing the name + to be demangled. + +@param output_buffer A region of memory, allocated with malloc, of + @a *length bytes, into which the demangled name + is stored. If @a output_buffer is not long enough, + it is expanded using realloc. @a output_buffer may + instead be NULL; in that case, the demangled name is + placed in a region of memory allocated with malloc. + +@param length If @a length is non-NULL, the length of the buffer containing + the demangled name is placed in @a *length. + +@param status @a *status is set to one of the following values: + - 0: The demangling operation succeeded. + - -1: A memory allocation failiure occurred. + - -2: @a mangled_name is not a valid name under the C++ ABI + mangling rules. + - -3: One of the arguments is invalid. + +@return A pointer to the start of the NUL-terminated demangled name, or NULL + if the demangling fails. The caller is responsible for deallocating + this memory using @c free. + + +The demangling is performed using the C++ ABI mangling rules, with +GNU extensions. For example, this function is used +in __gnu_cxx::__verbose_terminate_handler. See +http://gcc.gnu.org/onlinedocs/libstdc++/18_support/howto.html#5 for other +examples of use. + +@note The same demangling functionality is available via libiberty +(@c and @c libiberty.a) in GCC 3.1 and later, but that +requires explicit installation (@c --enable-install-libiberty) and uses a +different API, although the ABI is unchanged. +*/ +char* __cxa_demangle (const char* mangled_name, char* output_buffer, + size_t* length, int* status); +} // namespace abi + +// // // // // // // // // // // // // // // // // // // // // // // // +/** @addtogroup binarysearch Binary search algorithms +These algorithms are variations of a classic binary search. They all assume +that the sequence being searched is already sorted. + +The number of comparisons will be logarithmic (and as few as possible). +The number of steps through the sequence will be logarithmic for +random-access iterators (e.g., pointers), and linear otherwise. + +The LWG has passed Defect Report 270, which notes: The proposed +resolution reinterprets binary search. Instead of thinking about searching +for a value in a sorted range, we view that as an important special +case of a more general algorithm: searching for the partition point in a +partitioned range. We also add a guarantee that the old wording did not: +we ensure that the upper bound is no earlier than the lower bound, that +the pair returned by equal_range is a valid range, and that the first part +of that pair is the lower bound. + +The actual effect of the first sentence is that a comparison functor +passed by the user doesn't necessarily need to induce a strict weak ordering +relation. Rather, it partitions the range. +*/ + +// // // // // // // // // // // // // // // // // // // // // // // // +/** @addtogroup setoperations Set operation algorithms +These algorithms are common set operations performed on sequences that are +already sorted. + +The number of comparisons will be linear. +*/ + +// // // // // // // // // // // // // // // // // // // // // // // // + +// // // // // // // // // // // // // // // // // // // // // // // // +/* * @addtogroup groupname description of group +placeholder text +*/ + +// // // // // // // // // // // // // // // // // // // // // // // // + +// vim:et:noai: + diff --git a/libstdc++-v3/doc/doxygen/guide.html b/libstdc++-v3/doc/doxygen/guide.html new file mode 100644 index 00000000000..309ab9ce07c --- /dev/null +++ b/libstdc++-v3/doc/doxygen/guide.html @@ -0,0 +1,111 @@ + + + + + Build and Writing Guide for libstdc++ Doxygen + + + + + +

libstdc++ Source Documentation

+ +

This file is docs/doxygen/guide.html in the libstdc++ source tree. It + is not included in the generated pages (no real point to doing that). +

+ + + +
+ +

Creating the pages

+

The Makefile rules 'make doc-doxygen-html', + and 'make doc-doxygen-man' in the libstdc++ build + directory generate the HTML docs, the and the man pages, + respectively. Prerequisite tools are Bash 2.x, + + + Doxygen + , a working version of g++ somewhere in the PATH, and + the GNU coreutils. + + In addition, to generate the pretty pictures and hierarchy graphs, the + Graphviz + package will need to be installed. + (g++ is used to build a program which manipulates man pages. GNU versions + of find, xargs, and possibly sed and grep are used, just because the GNU + versions make things very easy.) +

+ +

Careful observers will see that the Makefile rules simply call a script + from the source tree, run_doxygen, which does the actual work + of running Doxygen and then (most importantly) massaging the output files. + If for some reason you prefer to not go through the Makefile, you can call + this script directly. (Start by passing '--help'.) +

+ +

If you wish to tweak the Doxygen settings, do so by editing + docs/doxygen/user.cfg.in. Notes to v3-hackers are written in + triple-# comments. +

+ +

Writing the markup

+

In general, libstdc++ files should be formatted according to the GNU + C++ Coding Standard rules found in the file + C++STYLE. + Before any doxygen-specific formatting tweaks are made, please try to make + sure that the initial formatting is sound. +

+ +

Adding Doxygen markup to a file (informally called "doxygenating") is very + simple. The Doxygen manual can be found + here. + We try to use a very-recent version of Doxygen. +

+ +

Doxygen style guide

+

[incomplete and constantly evolving]

+ +

For classes, use deque/vector/list and std::pair as examples. For + functions, see their member functions, and the free functions in + stl_algobase.h. Member functions of other container-like + types should read similarly to these member functions. +

+ +

These points accompany the first list in section 3.1 of the Doxygen manual: +

+
    +
  1. Use the Javadoc style...
  2. +
  3. ...not the Qt style. The intermediate *'s are preferred.
  4. +
  5. Use the triple-slash style only for one-line comments (the "brief" mode). + Very recent versions of Doxygen permit full-mode comments in triple-slash + blocks, but the formatting still comes out wonky.
  6. +
  7. This is disgusting. Don't do this.
  8. +
+ +

Use the @-style of commands, not the !-style. Please be careful about + whitespace in your markup comments. Most of the time it doesn't matter; + doxygen absorbs most whitespace, and both HTML and *roff are agnostic about + whitespace. However, in <pre> blocks and @code/@endcode sections, + spacing can have "interesting" effects. +

+ +

Use either kind of grouping, as appropriate. doxygroups.cc + exists for this purpose. See stl_iterator.h for a good + example of the "other" kind of grouping. +

+ +

Please use markup tags like @p and @a when referring to things such as the + names of function parameters. Use @e for emphasis when necessary. Use @c + to refer to other standard names. (Examples of all these abound in the + present code.) +

+ + + diff --git a/libstdc++-v3/doc/doxygen/mainpage.html b/libstdc++-v3/doc/doxygen/mainpage.html new file mode 100644 index 00000000000..941e7a8855f --- /dev/null +++ b/libstdc++-v3/doc/doxygen/mainpage.html @@ -0,0 +1,96 @@ + + + +libstdc++ Source: Main Index + + + + + + +

libstdc++ Source Documentation

+ +

Documentation Overview

+ +

Generated on @DATE@.

+ +

There are two types of documentation for libstdc++. One is the + distribution documentation, which can be read online at + http://gcc.gnu.org/onlinedocs/libstdc++/documentation.html + or offline from doc/html/documentation.html in the library source + directory. +

+ +

The other type is the source documentation, of which this is the first page. +

+ +

Here are entry points to all the pages generated by Doxygen: +

+

+ +

If you are using Doxygen for your own projects, you can use + a tag file for the appropriate version and + an entry such as +

+ TAGFILES = "libstdc++.tag = + http://gcc.gnu.org/onlinedocs/libstdc++/latest-doxygen" +
+ Be sure to adjust the URL for the right version. If you download a + local copy of the source documentation for faster viewing, you can use + the doxytag/installdox programs (part of Doxygen) to adjust the links + for you. +

+ +

Generating the documentation

+

These HTML pages are automatically generated, along with the man pages. + See doc/doxygen/guide.html in the source tree for how to + create (and write) the pages. + +

License, Copyright, and Other Lawyerly Verbosity

+

The libstdc++ documentation is released under + + these terms. +

+

Part of the generated documentation involved comments and notes from + SGI, who says we gotta say this: +

+ Permission to use, copy, modify, distribute and sell this software and its + documentation for any purpose is hereby granted without fee, provided + that the below copyright notice appears in all copies and that both + the copyright notice and this permission notice appear in supporting + documentation. Silicon Graphics makes no representations about the + suitability of this software for any purpose. It is provided "as is" + without express or implied warranty. +

+ Copyright © 1994 + Hewlett-Packard Company +
+

+

Part of the generated documentation is quoted from the ISO C++ Standard, + which is Copyright © 1998 by Information Technology Industry Council. +

+ + + diff --git a/libstdc++-v3/doc/doxygen/run_doxygen b/libstdc++-v3/doc/doxygen/run_doxygen new file mode 100644 index 00000000000..775a0361fb1 --- /dev/null +++ b/libstdc++-v3/doc/doxygen/run_doxygen @@ -0,0 +1,334 @@ +#!/bin/bash + +# Runs doxygen and massages the output files. +# Copyright (C) 2001, 2002, 2003, 2004, 2008 Free Software Foundation, Inc. +# +# Synopsis: run_doxygen --mode=[html|man] --host_alias= \ +# v3srcdir v3builddir +# +# Originally hacked together by Phil Edwards + + +# We can check now that the version of doxygen is >= this variable. +DOXYVER=1.5.4 + +find_doxygen() { + local -r v_required=`echo $DOXYVER | \ + awk -F. '{if(NF<3)$3=0;print ($1*100+$2)*100+$3}'` + local testing_version doxygen maybedoxy v_found + # thank you goat book + set `IFS=:; X="$PATH:/usr/local/bin:/bin:/usr/bin"; echo $X` + for dir + do + # AC_EXEEXT could come in useful here + maybedoxy="$dir/doxygen" + test -f "$maybedoxy" && testing_version=`$maybedoxy --version` + if test -n "$testing_version"; then + v_found=`echo $testing_version | \ + awk -F. '{if(NF<3)$3=0;print ($1*100+$2)*100+$3}'` + if test $v_found -ge $v_required; then + doxygen="$maybedoxy" + break + fi + fi + done + if test -z "$doxygen"; then + echo run_doxygen error: Could not find Doxygen $DOXYVER in path. 1>&2 + print_usage + fi + # We need to use other tools from the same package/version. + echo :: Using Doxygen tools from ${dir}. + PATH=$dir:$PATH + hash -r +} + +print_usage() { + cat 1>&2 <] + + MODE is one of: + html Generate user-level HTML library documentation. + man Generate user-level man pages. + + BUILD_ALIAS is the GCC build alias set at configure time. + +Note: Requires Doxygen ${DOXYVER} or later; get it at + ftp://ftp.stack.nl/pub/users/dimitri/doxygen-${DOXYVER}.src.tar.gz + +EOF + exit 1 +} + +parse_options() { + for o + do + # Blatantly ripped from autoconf, er, I mean, "gratefully standing + # on the shoulders of those giants who have gone before us." + case "$o" in + -*=*) arg=`echo "$o" | sed 's/[-_a-zA-Z0-9]*=//'` ;; + *) arg= ;; + esac + + case "$o" in + --mode=*) + mode=$arg ;; + --host_alias=*) + host_alias=$arg ;; + --mode | --host_alias | --help | -h) + print_usage ;; + *) + # this turned out to be a mess, maybe change to --srcdir=, etc + if test $srcdir = unset; then + srcdir=$o + elif test $outdir = unset; then + builddir=${o} + outdir=${o}/doc/doxygen + else + echo run_doxygen error: Too many arguments 1>&2 + exit 1 + fi + ;; + esac + done +} + + +# script begins here +mode=unset +host_alias=unset +srcdir=unset +outdir=unset +do_html=false +do_man=false +enabled_sections= +generate_tagfile= +DATEtext=`date '+%Y-%m-%d'` + +# Show how this script is called. +echo run_doxygen $* + +parse_options $* +find_doxygen + +if test $srcdir = unset || test $outdir = unset || test $mode = unset || test $host_alias = unset; then + # this could be better + echo run_doxygen error: You have not given enough information...! 1>&2 + print_usage +fi + +case x"$mode" in + xhtml) + do_html=true + enabled_sections=maint + generate_tagfile="$outdir/html/libstdc++.tag" + ;; + xman) + do_man=true + ;; + *) + echo run_doxygen error: $mode is an invalid mode 1>&2 + exit 1 ;; +esac + +mkdir -p $outdir +chmod u+w $outdir + +# work around a stupid doxygen bug +if $do_man; then + mkdir -p $outdir/man/man3/ext + chmod -R u+w $outdir/man/man3/ext +fi + +( + set -e + cd $builddir + sed -e "s=@outdir@=${outdir}=g" \ + -e "s=@srcdir@=${srcdir}=g" \ + -e "s=@builddir@=${builddir}=g" \ + -e "s=@host_alias@=${host_alias}=g" \ + -e "s=@html_output_dir@=html=" \ + -e "s=@enabled_sections@=${enabled_sections}=" \ + -e "s=@do_html@=${do_html}=" \ + -e "s=@do_man@=${do_man}=" \ + -e "s=@generate_tagfile@=${generate_tagfile}=" \ + ${srcdir}/doc/doxygen/user.cfg.in > ${outdir}/${mode}.cfg + echo :: NOTE that this may take some time... + echo doxygen ${outdir}/${mode}.cfg + doxygen ${outdir}/${mode}.cfg + echo :: Finished, exit code was $? +) +ret=$? +test $ret -ne 0 && exit $ret + +if $do_html; then + cd ${outdir}/html + + #doxytag -t libstdc++.tag . > /dev/null 2>&1 + sed -e '//d' libstdc++.tag > TEMP + mv TEMP libstdc++.tag + + sed -e "s=@DATE@=${DATEtext}=" \ + ${srcdir}/doc/doxygen/mainpage.html > index.html + + # The following bit of line noise changes annoying + # std::foo < typename _Ugly1, typename _Ugly2, .... _DefaultUgly17 > + # to user-friendly + # std::foo + # in the major "Compound List" page. + sed -e 's=\(::[[:alnum:]_]*\)< .* >=\1=' annotated.html > annstrip.html + mv annstrip.html annotated.html + + # Work around a bug in doxygen 1.3. + for f in class*html struct*html; do + sed '1,10s!^ Template!<title>Template !' $f > TEMP + mv TEMP $f + done + + cp ${srcdir}/doc/doxygen/tables.html tables.html + echo :: + echo :: HTML pages begin with + echo :: ${outdir}/html/index.html +fi + +# Mess with the man pages. We don't need documentation of the internal +# headers, since the man pages for those contain nothing useful anyhow. The +# man pages for doxygen modules need to be renamed (or deleted). And the +# generated #include lines need to be changed from the internal names to the +# standard ones (e.g., "#include <stl_tempbuf.h>" -> "#include <memory>"). +if $do_man; then +echo :: +echo :: Fixing up the man pages... +cd $outdir/man/man3 + +# here's the other end of the "stupid doxygen bug" mentioned above +rm -rf ext + +# File names with embedded spaces (EVIL!) need to be....? renamed or removed? +find . -name "* *" -print0 | xargs -0r rm # requires GNU tools + +# can leave SGIextensions.3 alone, it's an okay name +mv s20_3_1_base.3 Intro_functors.3 +mv s20_3_2_arithmetic.3 Arithmetic_functors.3 +mv s20_3_3_comparisons.3 Comparison_functors.3 +mv s20_3_4_logical.3 Logical_functors.3 +mv s20_3_5_negators.3 Negation_functors.3 +#mv s20_3_6_binder.3 Binder_functors.3 +mv s20_3_7_adaptors.3 Func_ptr_functors.3 +mv s20_3_8_memadaptors.3 Member_ptr_functors.3 +mv iterator_tags.3 Iterator_types.3 +mv std.3 Namespace_std.3 +mv __gnu_cxx.3 Namespace___gnu_cxx.3 + +# man pages are for functions/types/other entities, not source files +# directly. who the heck would type "man foo.h" anyhow? +find . -name "[a-z]*" -a ! -name "std_*" -print | xargs rm +rm -f *.h.3 *config* *.cc.3 *.tcc.3 *_t.3 +# this is used to examine what we would have deleted, for debugging +#mkdir trash +#find . -name "[a-z]*" -a ! -name "std_*" -print | xargs -i mv {} trash +#mv *.h.3 *config* *.cc.3 *.tcc.3 *_t.3 trash + +# Standardize the displayed header names. If anyone who knows perl cares +# enough to rewrite all this, feel free. This only gets run once a century, +# and I'm off getting coffee then anyhow, so I didn't care enough to make +# this super-fast. +g++ ${srcdir}/doc/doxygen/stdheader.cc -o ./stdheader +problematic=`egrep -l '#include <.*_.*>' [a-z]*.3` +for f in $problematic; do + # this is also slow, but safe and easy to debug + oldh=`sed -n '/fC#include </s/.*<\(.*\)>.*/\1/p' $f` + newh=`echo $oldh | ./stdheader` + sed "s=${oldh}=${newh}=" $f > TEMP + mv TEMP $f +done +rm stdheader + +# Some of the pages for generated modules have text that confuses certain +# implementations of man(1), e.g., Linux's. We need to have another top-level +# *roff tag to /stop/ the .SH NAME entry. +#problematic=`egrep --files-without-match '^\.SH SYNOPSIS' [A-Z]*.3` +problematic='Containers.3 Sequences.3 Assoc_containers.3 Iterator_types.3' +for f in $problematic; do + sed '/^\.SH NAME/{ +n +a\ +\ +.SH SYNOPSIS + }' $f > TEMP + mv TEMP $f +done + +# Also, break this (generated) line up. It's ugly as sin. +problematic=`grep -l '[^^]Definition at line' *.3` +for f in $problematic; do + sed 's/Definition at line/\ +.PP\ +&/' $f > TEMP + mv TEMP $f +done + +cp ${srcdir}/doc/doxygen/Intro.3 C++Intro.3 + +# Why didn't I do this at the start? Were rabid weasels eating my brain? +# Who the fsck would "man std_vector" when the class isn't named that? + +# First, deal with nested namespaces. +for f in *__detail_*; do + newname=`echo $f | sed 's/__detail_/__detail::/'` + mv $f $newname +done +for f in *__parallel_*; do + newname=`echo $f | sed 's/__parallel_/__parallel::/'` + mv $f $newname +done + +# Then, clean up other top-level namespaces. +for f in std_tr1_*; do + newname=`echo $f | sed 's/^std_tr1_/std::tr1::/'` + mv $f $newname +done +for f in std_*; do + newname=`echo $f | sed 's/^std_/std::/'` + mv $f $newname +done +for f in __gnu_cxx_*; do + newname=`echo $f | sed 's/^__gnu_cxx_/__gnu_cxx::/'` + mv $f $newname +done +for f in __gnu_debug_*; do + newname=`echo $f | sed 's/^__gnu_debug_/__gnu_debug::/'` + mv $f $newname +done +for f in __gnu_parallel_*; do + newname=`echo $f | sed 's/^__gnu_parallel_/__gnu_parallel::/'` + mv $f $newname +done + +# Generic removal bits, where there are things in the generated man +# pages that need to be killed. +for f in *_libstdc__-v3_*; do + rm $f +done + +for f in *_src_*; do + rm $f +done + + +# Also, for some reason, typedefs don't get their own man pages. Sigh. +for f in ios streambuf istream ostream iostream stringbuf \ + istringstream ostringstream stringstream filebuf ifstream \ + ofstream fstream string; +do + echo ".so man3/std::basic_${f}.3" > std::${f}.3 + echo ".so man3/std::basic_${f}.3" > std::w${f}.3 +done + +echo :: +echo :: Man pages in ${outdir}/man +fi + +# all done +echo :: + +exit 0 diff --git a/libstdc++-v3/doc/doxygen/stdheader.cc b/libstdc++-v3/doc/doxygen/stdheader.cc new file mode 100644 index 00000000000..a5145419b04 --- /dev/null +++ b/libstdc++-v3/doc/doxygen/stdheader.cc @@ -0,0 +1,170 @@ +// This is a slow larval-stage kludge to help massage the generated man +// pages. It's used like this: +const char* const usage = +"\nTakes on stdin, whitespace-separated words of the form\n" +"\n" +" [bits/]stl_foo.h\n" +" [bits/]std_foo.h\n" +"\n" +"and writes on stdout the nearest matching standard header name.\n" +"\n" +"Takes no command-line arguments.\n" +"\n"; + +#include <string> +#include <map> +#include <iostream> + +typedef std::map<std::string, std::string> Map; + +Map headers; + +void init_map() +{ + // Enter the glamourous world of data entry!! Maintain these! + headers["algo.h"] = "algorithm"; + headers["algobase.h"] = "algorithm"; + headers["algorithm.h"] = "algorithm"; + headers["heap.h"] = "algorithm"; + headers["bitset.h"] = "bitset"; + headers["complex.h"] = "complex"; + //headers["construct.h"] stl_construct.h entirely internal + headers["deque.h"] = "deque"; + headers["deque.tcc"] = "deque"; + headers["fstream.h"] = "fstream"; + headers["fstream.tcc"] = "fstream"; + headers["function.h"] = "functional"; + headers["functional.h"] = "functional"; + headers["iomanip.h"] = "iomanip"; + headers["basic_ios.h"] = "ios"; + headers["basic_ios.tcc"] = "ios"; + headers["ios.h"] = "ios"; + headers["iosfwd.h"] = "iosfwd"; + headers["iostream.h"] = "iostream"; + headers["istream.h"] = "istream"; + headers["istream.tcc"] = "istream"; + headers["iterator.h"] = "iterator"; + headers["iterator_base_funcs.h"] = "iterator"; + headers["iterator_base_types.h"] = "iterator"; + headers["stream_iterator.h"] = "iterator"; + headers["streambuf_iterator.h"] = "iterator"; + headers["limits.h"] = "limits"; + headers["list.h"] = "list"; + headers["list.tcc"] = "list"; + headers["codecvt.h"] = "locale"; + headers["locale.h"] = "locale"; + headers["localefwd.h"] = "locale"; + headers["locale_classes.h"] = "locale"; + headers["locale_facets.h"] = "locale"; + headers["locale_facets.tcc"] = "locale"; + headers["map.h"] = "map"; + headers["multimap.h"] = "map"; + headers["memory.h"] = "memory"; + headers["allocator.h"] = "memory"; + headers["raw_storage_iter.h"] = "memory"; + headers["tempbuf.h"] = "memory"; + headers["uninitialized.h"] = "memory"; + headers["numeric.h"] = "numeric"; + headers["ostream.h"] = "ostream"; + headers["ostream.tcc"] = "ostream"; + headers["queue.h"] = "queue"; + headers["set.h"] = "set"; + headers["multiset.h"] = "set"; + headers["sstream.h"] = "sstream"; + headers["sstream.tcc"] = "sstream"; + headers["stack.h"] = "stack"; + headers["functexcept.h"] = "stdexcept"; + headers["stdexcept.h"] = "stdexcept"; + headers["streambuf.h"] = "streambuf"; + headers["streambuf.tcc"] = "streambuf"; + headers["string.h"] = "string"; + headers["char_traits.h"] = "string"; + headers["postypes.h"] = "string"; + headers["basic_string.h"] = "string"; + headers["basic_string.tcc"] = "string"; + headers["tree.h"] = "backward/tree.h"; + headers["pair.h"] = "utility"; + headers["utility.h"] = "utility"; + headers["relops.h"] = "utility"; + headers["gslice.h"] = "valarray"; + headers["gslice_array.h"] = "valarray"; + headers["indirect_array.h"] = "valarray"; + headers["mask_array.h"] = "valarray"; + headers["slice_array.h"] = "valarray"; + headers["valarray.h"] = "valarray"; + headers["valarray_after.h"] = "valarray"; + headers["valarray_before.h"] = "valarray"; + headers["valarray_array.h"] = "valarray"; + headers["valarray_array.tcc"] = "valarray"; + headers["valarray_meta.h"] = "valarray"; + headers["bvector.h"] = "vector"; + headers["vector.h"] = "vector"; + headers["vector.tcc"] = "vector"; + + //headers["concurrence.h"] who knows + //headers["atomicity.h"] who knows + + // C wrappers -- probably was an easier way to do these, but oh well + headers["cassert.h"] = "cassert"; + headers["cctype.h"] = "cctype"; + headers["cerrno.h"] = "cerrno"; + headers["cfloat.h"] = "cfloat"; + headers["climits.h"] = "climits"; + headers["clocale.h"] = "clocale"; + headers["cmath.h"] = "cmath"; + headers["csetjmp.h"] = "csetjmp"; + headers["csignal.h"] = "csignal"; + headers["cstdarg.h"] = "cstdarg"; + headers["cstddef.h"] = "cstddef"; + headers["cstdio.h"] = "cstdio"; + headers["cstdlib.h"] = "cstdlib"; + headers["cstring.h"] = "cstring"; + headers["ctime.h"] = "ctime"; + headers["cwchar.h"] = "cwchar"; + headers["cwctype.h"] = "cwctype"; +} + + +void do_word (std::string const& longheader) +{ + std::string::size_type start = 0; + + // if it doesn't contain a "." then it's already a std header + if (longheader.find(".") == std::string::npos) + { + std::cout << longheader << '\n'; + return; + } + + if (longheader.substr(start,5) == "bits/") start += 5; + if ((longheader.substr(start,4) == "stl_") || + (longheader.substr(start,4) == "std_")) + { + start += 4; + } + + // come on, gdb, find `p' already... + const char* p = longheader.substr(start).c_str(); + Map::iterator word = headers.find(p); + if (word != headers.end()) + std::cout << word->second << '\n'; + else std::cout << "MAYBE_AN_ERROR_MESSAGE_HERE\n"; +} + + +int main (int argc, char**) +{ + if (argc > 1) + { + std::cerr << usage; + exit(0); + } + + init_map(); + + std::string w; + while (std::cin >> w) + do_word (w); +} + + diff --git a/libstdc++-v3/doc/doxygen/style.css b/libstdc++-v3/doc/doxygen/style.css new file mode 100644 index 00000000000..c49c37cdfd9 --- /dev/null +++ b/libstdc++-v3/doc/doxygen/style.css @@ -0,0 +1,74 @@ +BODY { + background: white; + font-size: small; +} +H1 { text-align: center; font-size: large } +H2 { text-align: left; font-size: medium; } +H3 { text-align: left; font-size: small; } +CODE { font-size: small; } +CAPTION { font-weight: normal } +A.qindex {} +A.qindexRef {} +A.el { text-decoration: none; font-size: small; font-weight: normal } +A.elRef { text-decoration: none; font-size: small; font-weight: normal } +A.code { text-decoration: none; font-weight: normal; color: #4444ee } +A.codeRef { font-weight: normal; color: #4444ee } +A:hover { text-decoration: none; background-color: #f2f2ff } +DL.el { margin-left: -1cm } +DIV.fragment { width: 100%; border: none; background-color: #eeeeee } +DIV.ah { + background-color: black; + font-weight: normal; + color: #ffffff; + margin-bottom: 3px; + margin-top: 3px +} +DIV.groupHeader { + margin-left: 16px; + margin-top: 12px; + margin-bottom: 6px; + font-weight: normal +} +DIV.groupText { margin-left: 16px; font-style: italic; font-size: small } +TD.md { background-color: #f2f2ff; font-size: small; } +TD.mdname1 { background-color: #f2f2ff; font-size: small; color: #602020; } +TD.mdname { + background-color: #f2f2ff; + font-weight: normal; + font-size: small; + color: #602020; + width: 600px +} +TD.indexkey { + background-color: #eeeeff; + font-weight: normal; + font-size: small; + padding-right : 10px; + padding-top : 2px; + padding-left : 10px; + padding-bottom : 2px; + margin-left : 0px; + margin-right : 0px; + margin-top : 2px; + margin-bottom : 2px +} +TD.indexvalue { + background-color: #eeeeff; + font-style: italic; + font-size: small; + padding-right : 10px; + padding-top : 2px; + padding-left : 10px; + padding-bottom : 2px; + margin-left : 0px; + margin-right : 0px; + margin-top : 2px; + margin-bottom : 2px +} +span.keyword { color: #008000 } +span.keywordtype { color: #604020 } +span.keywordflow { color: #e08000 } +span.comment { color: #800000 } +span.preprocessor { color: #806020 } +span.stringliteral { color: #002080 } +span.charliteral { color: #008080 } diff --git a/libstdc++-v3/doc/doxygen/tables.html b/libstdc++-v3/doc/doxygen/tables.html new file mode 100644 index 00000000000..74ac3e2165d --- /dev/null +++ b/libstdc++-v3/doc/doxygen/tables.html @@ -0,0 +1,645 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> +<html> +<head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1"> +<title>Tables + + + + + +

Tables

+ +

Most of the requirements on containers are presented in the ISO standard + in the form of tables. In order to avoid massive duplication of effort + while documenting all the classes, we follow the standard's lead and + present the base information here. Individual classes will only document + their departures from these tables (removed functions, additional functions, + changes, etc). +

+ +

We will not try to duplicate all of the surrounding text (footnotes, + explanations, etc.) from the standard, because that would also entail a + duplication of effort. Some of the surrounding text has been paraphrased + here for clarity. If you are uncertain about the meaning or interpretation + of these notes, consult a good textbook, and/or purchase your own copy of + the standard (it's cheap, see our FAQ). +

+ +

The table numbers are the same as those used in the standard. Tables can + be jumped to using their number, e.g., "tables.html#67". Only + Tables 65 through 69 are presented. Some of the active Defect Reports + are also noted or incorporated. +

+ +
+ +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Table 65 --- Container Requirements

+Anything calling itself a container must meet these minimum requirements. +
expressionresult typeoperational semanticsnotes, pre-/post-conditions, assertionscomplexity
X::value_typeT T is Assignablecompile time
X::referencelvalue of T  compile time
X::const_referenceconst lvalue of T  compile time
X::iteratoriterator type pointing to T Any iterator category except output iterator. + Convertible to X::const_iterator.compile time
X::const_iteratoriterator type pointing to const T Any iterator category except output iterator.compile time
X::difference_typesigned integral type identical to the difference type of X::iterator and X::const_iteratorcompile time
X::size_typeunsigned integral type size_type can represent any non-negative value of difference_typecompile time
X u;  post: u.size() == 0constant
X();  X().size == 0constant
X(a);  a == X(a)linear
X u(a);
X u = a;
  post: u == a. Equivalent to: X u; u = a;linear
(&a)->~X();void dtor is applied to every element of a; all the memory is deallocatedlinear
a.begin()iterator; const_iterator for constant a  constant
a.end()iterator; const_iterator for constant a  constant
a == bconvertible to bool == is an equivalence relation. a.size()==b.size() && + equal(a.begin(),a.end(),b.begin())linear
a != bconvertible to bool equivalent to !(a==b)linear
a.swap(b)void swap(a,b)may or may not have constant complexity
r = aX& r == alinear
a.size()size_typea.end() - a.begin() may or may not have constant complexity
a.max_size()size_typesize() of the largest possible container may or may not have constant complexity
a.empty()convertible to boola.size() == 0 constant
a < bconvertible to boollexographical_compare( a.begin, a.end(), b.begin(), b.end())pre: < is defined for T and is a total ordering relationlinear
a > bconvertible to boolb < a linear
a <= bconvertible to bool!(a > b) linear
a >= bconvertible to bool!(a < b) linear

+ + +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Table 66 --- Reversible Container Requirements

+If a container's iterator is bidirectional or random-access, then the +container also meets these requirements. +Deque, list, vector, map, multimap, set, and multiset are such containers. +
expressionresult typenotes, pre-/post-conditions, assertionscomplexity
X::reverse_iteratoriterator type pointing to Treverse_iterator<iterator>compile time
X::const_reverse_iteratoriterator type pointing to const Treverse_iterator<const_iterator>compile time
a.rbegin()reverse_iterator; const_reverse_iterator for constant areverse_iterator(end())constant
a.rend()reverse_iterator; const_reverse_iterator for constant areverse_iterator(begin())constant

+ + +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Table 67 --- Sequence Requirements

+These are in addition to the requirements of containers. +Deque, list, and vector are such containers. +
expressionresult typenotes, pre-/post-conditions, assertions
X(n,t)
X a(n,t)
 constructs a sequence with n copies of t
post: size() == n
X(i,j)
X a(i,j)
 constructs a sequence equal to the range [i,j)
+ post: size() == distance(i,j)
a.insert(p,t)iterator (points to the inserted copy of t)inserts a copy of t before p
a.insert(p,n,t)voidinserts n copies of t before p
a.insert(p,i,j)voidinserts copies of elements in [i,j) before p
+ pre: i, j are not iterators into a
a.erase(q)iterator (points to the element following q (prior to erasure))erases the element pointed to by q
a.erase(q1,q1)iterator (points to the element pointed to by q2 (prior to erasure))erases the elements in the range [q1,q2)
a.clear()voiderase(begin(),end())
post: size() == 0

+ + +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Table 68 --- Optional Sequence Operations

+These operations are only included in containers when the operation can be +done in constant time. +
expressionresult typeoperational semanticscontainer
a.front()reference; const_reference for constant a*a.begin()vector, list, deque
a.back()reference; const_reference for constant a*--a.end()vector, list, deque
a.push_front(x)voida.insert(a.begin(),x)list, deque
a.push_back(x)voida.insert(a.end(),x)vector, list, deque
a.pop_front()voida.erase(a.begin())list, deque
a.pop_back()voida.erase(--a.end())vector, list, deque
a[n]reference; const_reference for constant a*(a.begin() + n)vector, deque
a.at(n)reference; const_reference for constant a*(a.begin() + n)
throws out_of_range if n>=a.size()
vector, deque

+ + +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Table 69 --- Associative Container Requirements

+These are in addition to the requirements of containers. +Map, multimap, set, and multiset are such containers. An associative +container supports unique keys (and is written as +a_uniq instead of a) if it may contain at most +one element for each key. Otherwise it supports equivalent keys +(and is written a_eq). Examples of the former are set and map, +examples of the latter are multiset and multimap. +
expressionresult typenotes, pre-/post-conditions, assertionscomplexity
X::key_typeKeyKey is Assignablecompile time
X::key_compareComparedefaults to less<key_type>compile time
X::value_comparea binary predicate typesame as key_compare for set and multiset; an ordering relation on + pairs induced by the first component (Key) for map and multimapcompile time
X(c)
X a(c)
 constructs an empty container which uses c as a comparison objectconstant
X()
X a
 constructs an empty container using Compare() as a comparison objectconstant
X(i,j,c)
X a(i,j,c)
 constructs an empty container and inserts elements from the range [i,j) + into it; uses c as a comparison objectNlogN in general where N is distance(i,j); linear if [i,j) is + sorted with value_comp()
X(i,j)
X a(i,j)
 same as previous, but uses Compare() as a comparison objectsame as previous
a.key_comp()X::key_comparereturns the comparison object out of which a was constructedconstant
a.value_comp()X::value_comparereturns an object constructed out of the comparison objectconstant
a_uniq.insert(t)pair<iterator,bool>"Inserts t if and only if there is no element in the container with + key equivalent to the key of t. The bool component of the returned pair + is true -iff- the insertion took place, and the iterator component of + the pair points to the element with key equivalent to the key of + t." logarithmic
a_eq.insert(t)iteratorinserts t, returns the iterator pointing to the inserted elementlogarithmic
a.insert(p,t)iteratorpossibly inserts t (depending on whether a_uniq or a_eq); returns iterator + pointing to the element with key equivalent to the key of t; iterator p + is a hint pointing to where the insert should start to searchlogarithmic in general, amortized constant if t is inserted right + after p
+ [but see DR 233 and our + specific notes]
a.insert(i,j)voidpre: i, j are not iterators into a. possibly inserts each element from + the range [i,j) (depending on whether a_uniq or a_eq)Nlog(size()+N) where N is distance(i,j) in general
a.erase(k)size_typeerases all elements with key equivalent to k; returns number of erased + elementslog(size()) + count(k)
a.erase(q)voiderases the element pointed to by qamortized constant
a.erase(q1,q2)voiderases all the elements in the range [q1,q2)log(size()) + distance(q1,q2)
a.clear()voiderases everything; post: size() == 0linear
a.find(k)iterator; const_iterator for constant areturns iterator pointing to element with key equivalent to k, or + a.end() if no such element foundlogarithmic
a.count(k)size_typereturns number of elements with key equivalent to klog(size()) + count(k)
a.lower_bound(k)iterator; const_iterator for constant areturns iterator pointing to the first element with key not less than klogarithmic
a.upper_bound(k)iterator; const_iterator for constant areturns iterator pointing to the first element with key greater than klogarithmic
a.equal_range(k)pair<iterator,iterator>; + pair<const_iterator, const_iterator> for constant aequivalent to make_pair(a.lower_bound(k), a.upper_bound(k))logarithmic

+ + +
+

+See mainpage.html for copying conditions. +See the libstdc++ homepage +for more information. +

+ + + + + diff --git a/libstdc++-v3/doc/doxygen/user.cfg.in b/libstdc++-v3/doc/doxygen/user.cfg.in new file mode 100644 index 00000000000..c9ade242bea --- /dev/null +++ b/libstdc++-v3/doc/doxygen/user.cfg.in @@ -0,0 +1,1488 @@ +# Doxyfile 1.5.4 + +# This file describes the settings to be used by the documentation system +# doxygen (www.doxygen.org) for a project +# +# All text after a hash (#) is considered a comment and will be ignored +# The format is: +# TAG = value [value, ...] +# For lists items can also be appended using: +# TAG += value [value, ...] +# Values that contain spaces should be placed between quotes (" ") + +#--------------------------------------------------------------------------- +# Project related configuration options +#--------------------------------------------------------------------------- + +# This tag specifies the encoding used for all characters in the +# config file that follow. The default is UTF-8 which is also the +# encoding used for all text before the first occurrence of this +# tag. Doxygen uses libiconv (or the iconv built into libc) for the +# transcoding. See http://www.gnu.org/software/libiconv for the list +# of possible encodings. + +DOXYFILE_ENCODING = UTF-8 + +# The PROJECT_NAME tag is a single word (or a sequence of words surrounded +# by quotes) that should identify the project. + +PROJECT_NAME = libstdc++ + +# The PROJECT_NUMBER tag can be used to enter a project or revision number. +# This could be handy for archiving the generated documentation or +# if some version control system is used. + +PROJECT_NUMBER = + +# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) +# base path where the generated documentation will be put. +# If a relative path is entered, it will be relative to the location +# where doxygen was started. If left blank the current directory will be used. + +OUTPUT_DIRECTORY = @outdir@ + +# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create +# 4096 sub-directories (in 2 levels) under the output directory of each output +# format and will distribute the generated files over these directories. +# Enabling this option can be useful when feeding doxygen a huge amount of +# source files, where putting all generated files in the same directory would +# otherwise cause performance problems for the file system. + +CREATE_SUBDIRS = NO + +# The OUTPUT_LANGUAGE tag is used to specify the language in which all +# documentation generated by doxygen is written. Doxygen will use this +# information to generate all constant output in the proper language. +# The default language is English, other supported languages are: +# Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional, +# Croatian, Czech, Danish, Dutch, Finnish, French, German, Greek, Hungarian, +# Italian, Japanese, Japanese-en (Japanese with English messages), Korean, +# Korean-en, Lithuanian, Norwegian, Polish, Portuguese, Romanian, Russian, +# Serbian, Slovak, Slovene, Spanish, Swedish, and Ukrainian. + +OUTPUT_LANGUAGE = English + +# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will +# include brief member descriptions after the members that are listed in +# the file and class documentation (similar to JavaDoc). +# Set to NO to disable this. + +BRIEF_MEMBER_DESC = NO + +# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will +# prepend the brief description of a member or function before the +# detailed description. Note: if both HIDE_UNDOC_MEMBERS and +# BRIEF_MEMBER_DESC are set to NO, the brief descriptions will be +# completely suppressed. + +REPEAT_BRIEF = YES + +# This tag implements a quasi-intelligent brief description abbreviator +# that is used to form the text in various listings. Each string +# in this list, if found as the leading text of the brief description, will be +# stripped from the text and the result after processing the whole list, is +# used as the annotated text. Otherwise, the brief description is used as-is. +# If left blank, the following values are used ("$name" is automatically +# replaced with the name of the entity): "The $name class" "The $name widget" +# "The $name file" "is" "provides" "specifies" "contains" +# "represents" "a" "an" "the" + +ABBREVIATE_BRIEF = + +# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then +# Doxygen will generate a detailed section even if there is only a brief +# description. + +ALWAYS_DETAILED_SEC = YES + +# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all +# inherited members of a class in the documentation of that class as if those +# members were ordinary class members. Constructors, destructors and assignment +# operators of the base classes will not be shown. + +INLINE_INHERITED_MEMB = YES + +# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full +# path before files name in the file list and in the header files. If set +# to NO the shortest path that makes the file name unique will be used. + +FULL_PATH_NAMES = NO + +# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag +# can be used to strip a user-defined part of the path. Stripping is +# only done if one of the specified strings matches the left-hand part of +# the path. The tag can be used to show relative paths in the file list. +# If left blank the directory from which doxygen is run is used as the +# path to strip. + +STRIP_FROM_PATH = + +# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of +# the path mentioned in the documentation of a class, which tells +# the reader which header file to include in order to use a class. +# If left blank only the name of the header file containing the class +# definition is used. Otherwise one should specify the include paths that +# are normally passed to the compiler using the -I flag. + +STRIP_FROM_INC_PATH = + +# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter +# (but less readable) file names. This can be useful is your file systems +# doesn't support long names like on DOS, Mac, or CD-ROM. + +SHORT_NAMES = NO + +# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen +# will interpret the first line (until the first dot) of a JavaDoc-style +# comment as the brief description. If set to NO, the JavaDoc +# comments will behave just like regular Qt-style comments +# (thus requiring an explicit @brief command for a brief description.) + +JAVADOC_AUTOBRIEF = NO + +# If the QT_AUTOBRIEF tag is set to YES then Doxygen will +# interpret the first line (until the first dot) of a Qt-style +# comment as the brief description. If set to NO, the comments +# will behave just like regular Qt-style comments (thus requiring +# an explicit \brief command for a brief description.) + +QT_AUTOBRIEF = NO + +# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen +# treat a multi-line C++ special comment block (i.e. a block of //! or /// +# comments) as a brief description. This used to be the default behaviour. +# The new default is to treat a multi-line C++ comment block as a detailed +# description. Set this tag to YES if you prefer the old behaviour instead. + +MULTILINE_CPP_IS_BRIEF = YES + +# If the DETAILS_AT_TOP tag is set to YES then Doxygen +# will output the detailed description near the top, like JavaDoc. +# If set to NO, the detailed description appears after the member +# documentation. + +DETAILS_AT_TOP = YES + +# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented +# member inherits the documentation from any documented member that it +# re-implements. + +INHERIT_DOCS = YES + +# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce +# a new page for each member. If set to NO, the documentation of a member will +# be part of the file/class/namespace that contains it. + +SEPARATE_MEMBER_PAGES = NO + +# The TAB_SIZE tag can be used to set the number of spaces in a tab. +# Doxygen uses this value to replace tabs by spaces in code fragments. + +TAB_SIZE = 4 + +# This tag can be used to specify a number of aliases that acts +# as commands in the documentation. An alias has the form "name=value". +# For example adding "sideeffect=\par Side Effects:\n" will allow you to +# put the command \sideeffect (or @sideeffect) in the documentation, which +# will result in a user-defined paragraph with heading "Side Effects:". +# You can put \n's in the value part of an alias to insert newlines. + +ALIASES = "doctodo=@todo\nDoc me! See doc/doxygen/TODO and http://gcc.gnu.org/ml/libstdc++/2002-02/msg00003.html for more. " \ + "isiosfwd=One of the @link s27_2_iosfwd I/O forward declarations @endlink " + +# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C +# sources only. Doxygen will then generate output that is more tailored for C. +# For instance, some of the names that are used will be different. The list +# of all members will be omitted, etc. + +OPTIMIZE_OUTPUT_FOR_C = NO + +# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java +# sources only. Doxygen will then generate output that is more tailored for Java. +# For instance, namespaces will be presented as packages, qualified scopes +# will look different, etc. + +OPTIMIZE_OUTPUT_JAVA = NO + +# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want to +# include (a tag file for) the STL sources as input, then you should +# set this tag to YES in order to let doxygen match functions declarations and +# definitions whose arguments contain STL classes (e.g. func(std::string); v.s. +# func(std::string) {}). This also make the inheritance and collaboration +# diagrams that involve STL classes more complete and accurate. + +BUILTIN_STL_SUPPORT = NO + +# If you use Microsoft's C++/CLI language, you should set this option to YES to +# enable parsing support. + +CPP_CLI_SUPPORT = NO + +# Set the SIP_SUPPORT tag to YES if your project consists of sip +# sources only. Doxygen will parse them like normal C++ but will +# assume all classes use public instead of private inheritance when no +# explicit protection keyword is present. + +SIP_SUPPORT = NO + +# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC +# tag is set to YES, then doxygen will reuse the documentation of the first +# member in the group (if any) for the other members of the group. By default +# all members of a group must be documented explicitly. + +DISTRIBUTE_GROUP_DOC = YES + +# Set the SUBGROUPING tag to YES (the default) to allow class member groups of +# the same type (for instance a group of public functions) to be put as a +# subgroup of that type (e.g. under the Public Functions section). Set it to +# NO to prevent subgrouping. Alternatively, this can be done per class using +# the \nosubgrouping command. + +SUBGROUPING = YES + +# When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct (or union) is +# documented as struct with the name of the typedef. So +# typedef struct TypeS {} TypeT, will appear in the documentation as a struct +# with name TypeT. When disabled the typedef will appear as a member of a file, +# namespace, or class. And the struct will be named TypeS. This can typically +# be useful for C code where the coding convention is that all structs are +# typedef'ed and only the typedef is referenced never the struct's name. + +TYPEDEF_HIDES_STRUCT = NO + +#--------------------------------------------------------------------------- +# Build related configuration options +#--------------------------------------------------------------------------- + +# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in +# documentation are documented, even if no documentation was available. +# Private class members and static file members will be hidden unless +# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES + +EXTRACT_ALL = NO + +# If the EXTRACT_PRIVATE tag is set to YES all private members of a class +# will be included in the documentation. + +EXTRACT_PRIVATE = NO + +# If the EXTRACT_STATIC tag is set to YES all static members of a file +# will be included in the documentation. + +EXTRACT_STATIC = YES + +# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) +# defined locally in source files will be included in the documentation. +# If set to NO only classes defined in header files are included. + +EXTRACT_LOCAL_CLASSES = YES + +# This flag is only useful for Objective-C code. When set to YES local +# methods, which are defined in the implementation section but not in +# the interface are included in the documentation. +# If set to NO (the default) only methods in the interface are included. + +EXTRACT_LOCAL_METHODS = YES + +# If this flag is set to YES, the members of anonymous namespaces will +# be extracted and appear in the documentation as a namespace called +# 'anonymous_namespace{file}', where file will be replaced with the +# base name of the file that contains the anonymous namespace. By +# default anonymous namespace are hidden. + +EXTRACT_ANON_NSPACES = NO + +# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all +# undocumented members of documented classes, files or namespaces. +# If set to NO (the default) these members will be included in the +# various overviews, but no documentation section is generated. +# This option has no effect if EXTRACT_ALL is enabled. + +HIDE_UNDOC_MEMBERS = NO + +# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all +# undocumented classes that are normally visible in the class hierarchy. +# If set to NO (the default) these classes will be included in the various +# overviews. This option has no effect if EXTRACT_ALL is enabled. + +HIDE_UNDOC_CLASSES = YES + +# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all +# friend (class|struct|union) declarations. +# If set to NO (the default) these declarations will be included in the +# documentation. + +HIDE_FRIEND_COMPOUNDS = NO + +# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any +# documentation blocks found inside the body of a function. +# If set to NO (the default) these blocks will be appended to the +# function's detailed documentation block. + +HIDE_IN_BODY_DOCS = NO + +# The INTERNAL_DOCS tag determines if documentation +# that is typed after a \internal command is included. If the tag is set +# to NO (the default) then the documentation will be excluded. +# Set it to YES to include the internal documentation. + +INTERNAL_DOCS = NO + +# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate +# file names in lower-case letters. If set to YES upper-case letters are also +# allowed. This is useful if you have classes or files whose names only differ +# in case and if your file system supports case sensitive file names. Windows +# and Mac users are advised to set this option to NO. + +CASE_SENSE_NAMES = NO + +# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen +# will show members with their full class and namespace scopes in the +# documentation. If set to YES the scope will be hidden. + +HIDE_SCOPE_NAMES = NO + +# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen +# will put a list of the files that are included by a file in the documentation +# of that file. + +SHOW_INCLUDE_FILES = NO + +# If the INLINE_INFO tag is set to YES (the default) then a tag [inline] +# is inserted in the documentation for inline members. + +INLINE_INFO = YES + +# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen +# will sort the (detailed) documentation of file and class members +# alphabetically by member name. If set to NO the members will appear in +# declaration order. + +SORT_MEMBER_DOCS = YES + +# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the +# brief documentation of file, namespace and class members alphabetically +# by member name. If set to NO (the default) the members will appear in +# declaration order. + +SORT_BRIEF_DOCS = YES + +# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be +# sorted by fully-qualified names, including namespaces. If set to +# NO (the default), the class list will be sorted only by class name, +# not including the namespace part. +# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. +# Note: This option applies only to the class list, not to the +# alphabetical list. + +SORT_BY_SCOPE_NAME = YES + +# The GENERATE_TODOLIST tag can be used to enable (YES) or +# disable (NO) the todo list. This list is created by putting \todo +# commands in the documentation. + +GENERATE_TODOLIST = YES + +# The GENERATE_TESTLIST tag can be used to enable (YES) or +# disable (NO) the test list. This list is created by putting \test +# commands in the documentation. + +GENERATE_TESTLIST = NO + +# The GENERATE_BUGLIST tag can be used to enable (YES) or +# disable (NO) the bug list. This list is created by putting \bug +# commands in the documentation. + +GENERATE_BUGLIST = YES + +# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or +# disable (NO) the deprecated list. This list is created by putting +# \deprecated commands in the documentation. + +GENERATE_DEPRECATEDLIST= YES + +# The ENABLED_SECTIONS tag can be used to enable conditional +# documentation sections, marked by \if sectionname ... \endif. + +ENABLED_SECTIONS = @enabled_sections@ + +# The MAX_INITIALIZER_LINES tag determines the maximum number of lines +# the initial value of a variable or define consists of for it to appear in +# the documentation. If the initializer consists of more lines than specified +# here it will be hidden. Use a value of 0 to hide initializers completely. +# The appearance of the initializer of individual variables and defines in the +# documentation can be controlled using \showinitializer or \hideinitializer +# command in the documentation regardless of this setting. + +MAX_INITIALIZER_LINES = 0 + +# Set the SHOW_USED_FILES tag to NO to disable the list of files generated +# at the bottom of the documentation of classes and structs. If set to YES the +# list will mention the files that were used to generate the documentation. + +SHOW_USED_FILES = YES + +# If the sources in your project are distributed over multiple +# directories then setting the SHOW_DIRECTORIES tag to YES will show +# the directory hierarchy in the documentation. The default is NO. + +SHOW_DIRECTORIES = YES + +# The FILE_VERSION_FILTER tag can be used to specify a program or +# script that doxygen should invoke to get the current version for +# each file (typically from the version control system). Doxygen will +# invoke the program by executing (via popen()) the command +# , where is the value of the +# FILE_VERSION_FILTER tag, and is the name of an input +# file provided by doxygen. Whatever the program writes to standard +# output is used as the file version. See the manual for examples. + +FILE_VERSION_FILTER = + +#--------------------------------------------------------------------------- +# configuration options related to warning and progress messages +#--------------------------------------------------------------------------- + +# The QUIET tag can be used to turn on/off the messages that are generated +# by doxygen. Possible values are YES and NO. If left blank NO is used. + +QUIET = NO + +# The WARNINGS tag can be used to turn on/off the warning messages that are +# generated by doxygen. Possible values are YES and NO. If left blank +# NO is used. + +WARNINGS = YES + +# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings +# for undocumented members. If EXTRACT_ALL is set to YES then this flag will +# automatically be disabled. + +WARN_IF_UNDOCUMENTED = NO + +# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for +# potential errors in the documentation, such as not documenting some +# parameters in a documented function, or documenting parameters that +# don't exist or using markup commands wrongly. + +WARN_IF_DOC_ERROR = NO + +# This WARN_NO_PARAMDOC option can be abled to get warnings for +# functions that are documented, but have no documentation for their parameters +# or return value. If set to NO (the default) doxygen will only warn about +# wrong or incomplete parameter documentation, but not about the absence of +# documentation. + +WARN_NO_PARAMDOC = NO + +# The WARN_FORMAT tag determines the format of the warning messages that +# doxygen can produce. The string should contain the $file, $line, and $text +# tags, which will be replaced by the file and line number from which the +# warning originated and the warning text. Optionally the format may contain +# $version, which will be replaced by the version of the file (if it could +# be obtained via FILE_VERSION_FILTER) + +WARN_FORMAT = "$file:$line: $text " + +# The WARN_LOGFILE tag can be used to specify a file to which warning +# and error messages should be written. If left blank the output is written +# to stderr. + +WARN_LOGFILE = + +#--------------------------------------------------------------------------- +# configuration options related to the input files +#--------------------------------------------------------------------------- + +# The INPUT tag can be used to specify the files and/or directories +# that contain documented source files. You may enter file names like +# "myfile.cpp" or directories like "/usr/src/myproject". Separate the +# files or directories with spaces. + +INPUT = @srcdir@/doc/doxygen/doxygroups.cc \ + @srcdir@/include/precompiled/stdc++.h \ + @srcdir@/include/precompiled/stdtr1c++.h \ + @srcdir@/include/precompiled/extc++.h \ + @srcdir@/libsupc++/cxxabi.h \ + @srcdir@/libsupc++/exception \ + @srcdir@/libsupc++/new \ + @srcdir@/libsupc++/typeinfo \ + include/@host_alias@/bits \ + include/bits \ + include/debug \ + include/parallel \ + include/ext \ + include/tr1 \ + include/tr1_impl \ + include/algorithm \ + include/array \ + include/bitset \ + include/cassert \ + include/ccomplex \ + include/cctype \ + include/cerrno \ + include/cfenv \ + include/cfloat \ + include/cinttypes \ + include/ciso646 \ + include/climits \ + include/clocale \ + include/cmath \ + include/csetjmp \ + include/csignal \ + include/cstdarg \ + include/cstdbool \ + include/cstddef \ + include/cstdint \ + include/cstdio \ + include/cstdlib \ + include/cstring \ + include/ctgmath \ + include/ctime \ + include/cwchar \ + include/cwctype \ + include/deque \ + include/fstream \ + include/functional \ + include/iomanip \ + include/ios \ + include/iosfwd \ + include/iostream \ + include/istream \ + include/iterator \ + include/limits \ + include/list \ + include/locale \ + include/map \ + include/memory \ + include/numeric \ + include/ostream \ + include/queue \ + include/random \ + include/regex \ + include/set \ + include/sstream \ + include/stack \ + include/stdexcept \ + include/streambuf \ + include/string \ + include/system_error \ + include/tuple \ + include/type_traits \ + include/unordered_map \ + include/unordered_set \ + include/utility \ + include/valarray \ + include/vector \ + include/backward/hash_map \ + include/backward/hash_set \ + include/debug/bitset \ + include/debug/deque \ + include/debug/list \ + include/debug/map \ + include/debug/set \ + include/debug/string \ + include/debug/vector \ + include/ext/algorithm \ + include/ext/functional \ + include/ext/iterator \ + include/ext/memory \ + include/ext/numeric \ + include/ext/rb_tree \ + include/ext/rope \ + include/ext/slist \ + include/ext/pb_ds \ + include/ext/pb_ds/detail \ + include/parallel/algorithm \ + include/parallel/numeric \ + include/tr1/array \ + include/tr1/ccomplex \ + include/tr1/cctype \ + include/tr1/cfenv \ + include/tr1/cfloat \ + include/tr1/cinttypes \ + include/tr1/climits \ + include/tr1/cmath \ + include/tr1/complex \ + include/tr1/cstdarg \ + include/tr1/cstdbool \ + include/tr1/cstdint \ + include/tr1/cstdio \ + include/tr1/cstdlib \ + include/tr1/ctgmath \ + include/tr1/ctime \ + include/tr1/cwchar \ + include/tr1/cwctype \ + include/tr1/functional \ + include/tr1/hashtable.h \ + include/tr1/memory \ + include/tr1/random \ + include/tr1/regex \ + include/tr1/tuple \ + include/tr1/type_traits \ + include/tr1/unordered_map \ + include/tr1/unordered_set \ + include/tr1_impl/utility \ + include/tr1_impl/array \ + include/tr1_impl/cctype \ + include/tr1_impl/cfenv \ + include/tr1_impl/cinttypes \ + include/tr1_impl/cmath \ + include/tr1_impl/complex \ + include/tr1_impl/cstdint \ + include/tr1_impl/cstdio \ + include/tr1_impl/cstdlib \ + include/tr1_impl/cwchar \ + include/tr1_impl/cwctype \ + include/tr1_impl/functional \ + include/tr1_impl/hashtable \ + include/tr1_impl/random \ + include/tr1_impl/regex \ + include/tr1_impl/tuple \ + include/tr1_impl/type_traits \ + include/tr1_impl/unordered_map \ + include/tr1_impl/unordered_set \ + include/tr1_impl/utility + +# This tag can be used to specify the character encoding of the source +# files that doxygen parses. Internally doxygen uses the UTF-8 +# encoding, which is also the default input encoding. Doxygen uses +# libiconv (or the iconv built into libc) for the transcoding. See +# http://www.gnu.org/software/libiconv for the list of possible +# encodings. + +INPUT_ENCODING = UTF-8 + +# If the value of the INPUT tag contains directories, you can use the +# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp +# and *.h) to filter out the source-files in the directories. If left +# blank the following patterns are tested: +# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx +# *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.py *.f90 + +FILE_PATTERNS = *.h \ + *.hpp \ + *.tcc + +# The RECURSIVE tag can be used to turn specify whether or not subdirectories +# should be searched for input files as well. Possible values are YES and NO. +# If left blank NO is used. + +RECURSIVE = NO + +# The EXCLUDE tag can be used to specify files and/or directories that should +# excluded from the INPUT source files. This way you can easily exclude a +# subdirectory from a directory tree whose root is specified with the INPUT tag. + +EXCLUDE = Makefile + +# The EXCLUDE_SYMLINKS tag can be used select whether or not files or +# directories that are symbolic links (a Unix filesystem feature) are excluded +# from the input. + +EXCLUDE_SYMLINKS = NO + +# If the value of the INPUT tag contains directories, you can use the +# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude +# certain files from those directories. Note that the wildcards are matched +# against the file with absolute path, so to exclude all test directories +# for example use the pattern */test/* + +EXCLUDE_PATTERNS = stamp-* \ + *stdc++.h* \ + *stdtr1c++.h* \ + *extc++.h* \ + */.svn/* + +# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol +# names (namespaces, classes, functions, etc.) that should be excluded +# from the output. The symbol name can be a fully qualified name, a +# word, or if the wildcard * is used, a substring. Examples: +# ANamespace, AClass, AClass::ANamespace, ANamespace::*Test + +EXCLUDE_SYMBOLS = + +# The EXAMPLE_PATH tag can be used to specify one or more files or +# directories that contain example code fragments that are included (see +# the \include command). + +EXAMPLE_PATH = + +# If the value of the EXAMPLE_PATH tag contains directories, you can use the +# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp +# and *.h) to filter out the source-files in the directories. If left +# blank all files are included. + +EXAMPLE_PATTERNS = + +# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be +# searched for input files to be used with the \include or \dontinclude +# commands irrespective of the value of the RECURSIVE tag. +# Possible values are YES and NO. If left blank NO is used. + +EXAMPLE_RECURSIVE = NO + +# The IMAGE_PATH tag can be used to specify one or more files or +# directories that contain image that are included in the documentation (see +# the \image command). + +IMAGE_PATH = + +# The INPUT_FILTER tag can be used to specify a program that doxygen should +# invoke to filter for each input file. Doxygen will invoke the filter program +# by executing (via popen()) the command , where +# is the value of the INPUT_FILTER tag, and is the name of an +# input file. Doxygen will then use the output that the filter program writes +# to standard output. If FILTER_PATTERNS is specified, this tag will be +# ignored. + +INPUT_FILTER = + +# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern +# basis. Doxygen will compare the file name with each pattern and apply the +# filter if there is a match. The filters are a list of the form: +# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further +# info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER +# is applied to all files. + +FILTER_PATTERNS = + +# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using +# INPUT_FILTER) will be used to filter the input files when producing source +# files to browse (i.e. when SOURCE_BROWSER is set to YES). + +FILTER_SOURCE_FILES = NO + +#--------------------------------------------------------------------------- +# configuration options related to source browsing +#--------------------------------------------------------------------------- + +# If the SOURCE_BROWSER tag is set to YES then a list of source files +# will be generated. Documented entities will be cross-referenced with +# these sources. Note: To get rid of all source code in the generated +# output, make sure also VERBATIM_HEADERS is set to NO. If you have +# enabled CALL_GRAPH or CALLER_GRAPH then you must also enable this +# option. If you don't then doxygen will produce a warning and turn it +# on anyway + +SOURCE_BROWSER = YES + +# Setting the INLINE_SOURCES tag to YES will include the body +# of functions and classes directly in the documentation. + +INLINE_SOURCES = NO + +# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct +# doxygen to hide any special comment blocks from generated source code +# fragments. Normal C and C++ comments will always remain visible. + +STRIP_CODE_COMMENTS = NO + +# If the REFERENCED_BY_RELATION tag is set to YES (the default) +# then for each documented function all documented +# functions referencing it will be listed. + +REFERENCED_BY_RELATION = YES + +# If the REFERENCES_RELATION tag is set to YES (the default) +# then for each documented function all documented entities +# called/used by that function will be listed. + +REFERENCES_RELATION = YES + +# If the REFERENCES_LINK_SOURCE tag is set to YES (the default) +# and SOURCE_BROWSER tag is set to YES, then the hyperlinks from +# functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will +# link to the source code. Otherwise they will link to the documentstion. + +REFERENCES_LINK_SOURCE = YES + +# If the USE_HTAGS tag is set to YES then the references to source code +# will point to the HTML generated by the htags(1) tool instead of doxygen +# built-in source browser. The htags tool is part of GNU's global source +# tagging system (see http://www.gnu.org/software/global/global.html). You +# will need version 4.8.6 or higher. + +USE_HTAGS = NO + +# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen +# will generate a verbatim copy of the header file for each class for +# which an include is specified. Set to NO to disable this. + +VERBATIM_HEADERS = NO + +#--------------------------------------------------------------------------- +# configuration options related to the alphabetical class index +#--------------------------------------------------------------------------- + +# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index +# of all compounds will be generated. Enable this if the project +# contains a lot of classes, structs, unions or interfaces. + +ALPHABETICAL_INDEX = YES + +# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then +# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns +# in which this list will be split (can be a number in the range [1..20]) + +COLS_IN_ALPHA_INDEX = 2 + +# In case all classes in a project start with a common prefix, all +# classes will be put under the same header in the alphabetical index. +# The IGNORE_PREFIX tag can be used to specify one or more prefixes that +# should be ignored while generating the index headers. + +IGNORE_PREFIX = + +#--------------------------------------------------------------------------- +# configuration options related to the HTML output +#--------------------------------------------------------------------------- + +# If the GENERATE_HTML tag is set to YES (the default) Doxygen will +# generate HTML output. + +GENERATE_HTML = @do_html@ + +# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `html' will be used as the default path. + +HTML_OUTPUT = @html_output_dir@ + +# The HTML_FILE_EXTENSION tag can be used to specify the file extension for +# each generated HTML page (for example: .htm,.php,.asp). If it is left blank +# doxygen will generate files with .html extension. + +HTML_FILE_EXTENSION = .html + +# The HTML_HEADER tag can be used to specify a personal HTML header for +# each generated HTML page. If it is left blank doxygen will generate a +# standard header. + +HTML_HEADER = + +# The HTML_FOOTER tag can be used to specify a personal HTML footer for +# each generated HTML page. If it is left blank doxygen will generate a +# standard footer. + +HTML_FOOTER = + +# The HTML_STYLESHEET tag can be used to specify a user-defined cascading +# style sheet that is used by each HTML page. It can be used to +# fine-tune the look of the HTML output. If the tag is left blank doxygen +# will generate a default style sheet. Note that doxygen will try to copy +# the style sheet file to the HTML output directory, so don't put your own +# stylesheet in the HTML output directory as well, or it will be erased! + +HTML_STYLESHEET = @srcdir@/doc/doxygen/style.css + +# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, +# files or namespaces will be aligned in HTML using tables. If set to +# NO a bullet list will be used. + +HTML_ALIGN_MEMBERS = NO + +# If the GENERATE_HTMLHELP tag is set to YES, additional index files +# will be generated that can be used as input for tools like the +# Microsoft HTML help workshop to generate a compressed HTML help file (.chm) +# of the generated HTML documentation. + +GENERATE_HTMLHELP = NO + +# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML +# documentation will contain sections that can be hidden and shown after the +# page has loaded. For this to work a browser that supports +# JavaScript and DHTML is required (for instance Mozilla 1.0+, Firefox +# Netscape 6.0+, Internet explorer 5.0+, Konqueror, or Safari). + +HTML_DYNAMIC_SECTIONS = NO + +# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can +# be used to specify the file name of the resulting .chm file. You +# can add a path in front of the file if the result should not be +# written to the html output directory. + +CHM_FILE = + +# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can +# be used to specify the location (absolute path including file name) of +# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run +# the HTML help compiler on the generated index.hhp. + +HHC_LOCATION = + +# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag +# controls if a separate .chi index file is generated (YES) or that +# it should be included in the master .chm file (NO). + +GENERATE_CHI = NO + +# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag +# controls whether a binary table of contents is generated (YES) or a +# normal table of contents (NO) in the .chm file. + +BINARY_TOC = NO + +# The TOC_EXPAND flag can be set to YES to add extra items for group members +# to the contents of the HTML help documentation and to the tree view. + +TOC_EXPAND = NO + +# The DISABLE_INDEX tag can be used to turn on/off the condensed index at +# top of each HTML page. The value NO (the default) enables the index and +# the value YES disables it. + +DISABLE_INDEX = YES + +# This tag can be used to set the number of enum values (range [1..20]) +# that doxygen will group on one line in the generated HTML documentation. + +ENUM_VALUES_PER_LINE = 4 + +# If the GENERATE_TREEVIEW tag is set to YES, a side panel will be +# generated containing a tree-like index structure (just like the one that +# is generated for HTML Help). For this to work a browser that supports +# JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+, +# Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are +# probably better off using the HTML help feature. + +GENERATE_TREEVIEW = YES + +# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be +# used to set the initial width (in pixels) of the frame in which the tree +# is shown. + +TREEVIEW_WIDTH = 250 + +#--------------------------------------------------------------------------- +# configuration options related to the LaTeX output +#--------------------------------------------------------------------------- + +# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will +# generate Latex output. + +GENERATE_LATEX = NO + +# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `latex' will be used as the default path. + +LATEX_OUTPUT = latex + +# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be +# invoked. If left blank `latex' will be used as the default command name. + +LATEX_CMD_NAME = latex + +# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to +# generate index for LaTeX. If left blank `makeindex' will be used as the +# default command name. + +MAKEINDEX_CMD_NAME = makeindex + +# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact +# LaTeX documents. This may be useful for small projects and may help to +# save some trees in general. + +COMPACT_LATEX = NO + +# The PAPER_TYPE tag can be used to set the paper type that is used +# by the printer. Possible values are: a4, a4wide, letter, legal and +# executive. If left blank a4wide will be used. + +PAPER_TYPE = letter + +# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX +# packages that should be included in the LaTeX output. + +EXTRA_PACKAGES = amsmath + +# The LATEX_HEADER tag can be used to specify a personal LaTeX header for +# the generated latex document. The header should contain everything until +# the first chapter. If it is left blank doxygen will generate a +# standard header. Notice: only use this tag if you know what you are doing! + +LATEX_HEADER = + +# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated +# is prepared for conversion to pdf (using ps2pdf). The pdf file will +# contain links (just like the HTML output) instead of page references +# This makes the output suitable for online browsing using a pdf viewer. + +PDF_HYPERLINKS = NO + +# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of +# plain latex in the generated Makefile. Set this option to YES to get a +# higher quality PDF documentation. + +USE_PDFLATEX = NO + +# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. +# command to the generated LaTeX files. This will instruct LaTeX to keep +# running if errors occur, instead of asking the user for help. +# This option is also used when generating formulas in HTML. + +LATEX_BATCHMODE = NO + +# If LATEX_HIDE_INDICES is set to YES then doxygen will not +# include the index chapters (such as File Index, Compound Index, etc.) +# in the output. + +LATEX_HIDE_INDICES = NO + +#--------------------------------------------------------------------------- +# configuration options related to the RTF output +#--------------------------------------------------------------------------- + +# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output +# The RTF output is optimized for Word 97 and may not look very pretty with +# other RTF readers or editors. + +GENERATE_RTF = NO + +# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `rtf' will be used as the default path. + +RTF_OUTPUT = rtf + +# If the COMPACT_RTF tag is set to YES Doxygen generates more compact +# RTF documents. This may be useful for small projects and may help to +# save some trees in general. + +COMPACT_RTF = NO + +# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated +# will contain hyperlink fields. The RTF file will +# contain links (just like the HTML output) instead of page references. +# This makes the output suitable for online browsing using WORD or other +# programs which support those fields. +# Note: wordpad (write) and others do not support links. + +RTF_HYPERLINKS = NO + +# Load stylesheet definitions from file. Syntax is similar to doxygen's +# config file, i.e. a series of assignments. You only have to provide +# replacements, missing definitions are set to their default value. + +RTF_STYLESHEET_FILE = + +# Set optional variables used in the generation of an rtf document. +# Syntax is similar to doxygen's config file. + +RTF_EXTENSIONS_FILE = + +#--------------------------------------------------------------------------- +# configuration options related to the man page output +#--------------------------------------------------------------------------- + +# If the GENERATE_MAN tag is set to YES (the default) Doxygen will +# generate man pages + +GENERATE_MAN = @do_man@ + +# The MAN_OUTPUT tag is used to specify where the man pages will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `man' will be used as the default path. + +MAN_OUTPUT = man + +# The MAN_EXTENSION tag determines the extension that is added to +# the generated man pages (default is the subroutine's section .3) + +MAN_EXTENSION = .3 + +# If the MAN_LINKS tag is set to YES and Doxygen generates man output, +# then it will generate one additional man file for each entity +# documented in the real man page(s). These additional files +# only source the real man page, but without them the man command +# would be unable to find the correct page. The default is NO. + +MAN_LINKS = NO + +#--------------------------------------------------------------------------- +# configuration options related to the XML output +#--------------------------------------------------------------------------- + +# If the GENERATE_XML tag is set to YES Doxygen will +# generate an XML file that captures the structure of +# the code including all documentation. + +GENERATE_XML = NO + +# The XML_OUTPUT tag is used to specify where the XML pages will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `xml' will be used as the default path. + +XML_OUTPUT = xml + +# The XML_SCHEMA tag can be used to specify an XML schema, +# which can be used by a validating XML parser to check the +# syntax of the XML files. + +XML_SCHEMA = + +# The XML_DTD tag can be used to specify an XML DTD, +# which can be used by a validating XML parser to check the +# syntax of the XML files. + +XML_DTD = + +# If the XML_PROGRAMLISTING tag is set to YES Doxygen will +# dump the program listings (including syntax highlighting +# and cross-referencing information) to the XML output. Note that +# enabling this will significantly increase the size of the XML output. + +XML_PROGRAMLISTING = YES + +#--------------------------------------------------------------------------- +# configuration options for the AutoGen Definitions output +#--------------------------------------------------------------------------- + +# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will +# generate an AutoGen Definitions (see autogen.sf.net) file +# that captures the structure of the code including all +# documentation. Note that this feature is still experimental +# and incomplete at the moment. + +GENERATE_AUTOGEN_DEF = NO + +#--------------------------------------------------------------------------- +# configuration options related to the Perl module output +#--------------------------------------------------------------------------- + +# If the GENERATE_PERLMOD tag is set to YES Doxygen will +# generate a Perl module file that captures the structure of +# the code including all documentation. Note that this +# feature is still experimental and incomplete at the +# moment. + +GENERATE_PERLMOD = NO + +# If the PERLMOD_LATEX tag is set to YES Doxygen will generate +# the necessary Makefile rules, Perl scripts and LaTeX code to be able +# to generate PDF and DVI output from the Perl module output. + +PERLMOD_LATEX = NO + +# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be +# nicely formatted so it can be parsed by a human reader. This is useful +# if you want to understand what is going on. On the other hand, if this +# tag is set to NO the size of the Perl module output will be much smaller +# and Perl will parse it just the same. + +PERLMOD_PRETTY = YES + +# The names of the make variables in the generated doxyrules.make file +# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. +# This is useful so different doxyrules.make files included by the same +# Makefile don't overwrite each other's variables. + +PERLMOD_MAKEVAR_PREFIX = + +#--------------------------------------------------------------------------- +# Configuration options related to the preprocessor +#--------------------------------------------------------------------------- + +# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will +# evaluate all C-preprocessor directives found in the sources and include +# files. + +ENABLE_PREPROCESSING = YES + +# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro +# names in the source code. If set to NO (the default) only conditional +# compilation will be performed. Macro expansion can be done in a controlled +# way by setting EXPAND_ONLY_PREDEF to YES. + +MACRO_EXPANSION = YES + +# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES +# then the macro expansion is limited to the macros specified with the +# PREDEFINED and EXPAND_AS_DEFINED tags. + +EXPAND_ONLY_PREDEF = NO + +# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files +# in the INCLUDE_PATH (see below) will be search if a #include is found. + +SEARCH_INCLUDES = YES + +# The INCLUDE_PATH tag can be used to specify one or more directories that +# contain include files that are not input files but should be processed by +# the preprocessor. + +INCLUDE_PATH = + +# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard +# patterns (like *.h and *.hpp) to filter out the header-files in the +# directories. If left blank, the patterns specified with FILE_PATTERNS will +# be used. + +INCLUDE_FILE_PATTERNS = + +# The PREDEFINED tag can be used to specify one or more macro names that +# are defined before the preprocessor is started (similar to the -D option of +# gcc). The argument of the tag is a list of macros of the form: name +# or name=definition (no spaces). If the definition and the = are +# omitted =1 is assumed. To prevent a macro definition from being +# undefined via #undef or recursively expanded use the := operator +# instead of the = operator. + +PREDEFINED = __GTHREADS \ + _GLIBCXX_STD=std \ + _GLIBCXX_TR1=tr1 \ + "_GLIBCXX_BEGIN_NAMESPACE(name)=namespace name { " \ + "_GLIBCXX_BEGIN_NESTED_NAMESPACE(name, unused)=namespace name { " \ + _GLIBCXX_END_NAMESPACE=} \ + _GLIBCXX_END_NESTED_NAMESPACE=} \ + "_GLIBCXX_TEMPLATE_ARGS=... " \ + _GLIBCXX_DEPRECATED \ + _GLIBCXX_USE_WCHAR_T \ + _GLIBCXX_USE_LONG_LONG \ + __glibcxx_function_requires=// \ + __glibcxx_class_requires=// \ + __glibcxx_class_requires2=// \ + __glibcxx_class_requires3=// \ + __glibcxx_class_requires4=// + +# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES +# then this tag can be used to specify a list of macro names that +# should be expanded. The macro definition that is found in the +# sources will be used. Use the PREDEFINED tag if you want to use a +# different macro definition. + +EXPAND_AS_DEFINED = + +# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then +# doxygen's preprocessor will remove all function-like macros that are alone +# on a line, have an all uppercase name, and do not end with a semicolon. Such +# function macros are typically used for boiler-plate code, and will confuse +# the parser if not removed. + +SKIP_FUNCTION_MACROS = YES + +#--------------------------------------------------------------------------- +# Configuration::additions related to external references +#--------------------------------------------------------------------------- + +# The TAGFILES option can be used to specify one or more tagfiles. +# Optionally an initial location of the external documentation +# can be added for each tagfile. The format of a tag file without +# this location is as follows: +# TAGFILES = file1 file2 ... +# Adding location for the tag files is done as follows: +# TAGFILES = file1=loc1 "file2 = loc2" ... +# where "loc1" and "loc2" can be relative or absolute paths or +# URLs. If a location is present for each tag, the installdox tool +# does not have to be run to correct the links. +# Note that each tag file must have a unique name +# (where the name does NOT include the path) +# If a tag file is not located in the directory in which doxygen +# is run, you must also specify the path to the tagfile here. + +TAGFILES = + +# When a file name is specified after GENERATE_TAGFILE, doxygen will create +# a tag file that is based on the input files it reads. + +GENERATE_TAGFILE = @generate_tagfile@ + +# If the ALLEXTERNALS tag is set to YES all external classes will be listed +# in the class index. If set to NO only the inherited external classes +# will be listed. + +ALLEXTERNALS = YES + +# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed +# in the modules index. If set to NO, only the current project's groups will +# be listed. + +EXTERNAL_GROUPS = YES + +# The PERL_PATH should be the absolute path and name of the perl script +# interpreter (i.e. the result of `which perl'). + +PERL_PATH = /usr/bin/perl + +#--------------------------------------------------------------------------- +# Configuration options related to the dot tool +#--------------------------------------------------------------------------- + +# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will +# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base +# or super classes. Setting the tag to NO turns the diagrams off. Note that +# this option is superseded by the HAVE_DOT option below. This is only a +# fallback. It is recommended to install and use dot, since it yields more +# powerful graphs. + +CLASS_DIAGRAMS = YES + +# You can define message sequence charts within doxygen comments using the \msc +# command. Doxygen will then run the mscgen tool (see http://www.mcternan.me.uk/mscgen/) to +# produce the chart and insert it in the documentation. The MSCGEN_PATH tag allows you to +# specify the directory where the mscgen tool resides. If left empty the tool is assumed to +# be found in the default search path. + +MSCGEN_PATH = + +# If set to YES, the inheritance and collaboration graphs will hide +# inheritance and usage relations if the target is undocumented +# or is not a class. + +HIDE_UNDOC_RELATIONS = NO + +# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is +# available from the path. This tool is part of Graphviz, a graph visualization +# toolkit from AT&T and Lucent Bell Labs. The other options in this section +# have no effect if this option is set to NO (the default) + +HAVE_DOT = YES + +# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for each documented class showing the direct and +# indirect inheritance relations. Setting this tag to YES will force the +# the CLASS_DIAGRAMS tag to NO. + +CLASS_GRAPH = YES + +# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for each documented class showing the direct and +# indirect implementation dependencies (inheritance, containment, and +# class references variables) of the class with other documented classes. + +COLLABORATION_GRAPH = NO + +# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for groups, showing the direct groups dependencies + +GROUP_GRAPHS = YES + +# If the UML_LOOK tag is set to YES doxygen will generate inheritance and +# collaboration diagrams in a style similar to the OMG's Unified Modeling +# Language. + +UML_LOOK = NO + +# If set to YES, the inheritance and collaboration graphs will show the +# relations between templates and their instances. + +TEMPLATE_RELATIONS = YES + +# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT +# tags are set to YES then doxygen will generate a graph for each documented +# file showing the direct and indirect include dependencies of the file with +# other documented files. + +INCLUDE_GRAPH = NO + +# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and +# HAVE_DOT tags are set to YES then doxygen will generate a graph for each +# documented header file showing the documented files that directly or +# indirectly include this file. + +INCLUDED_BY_GRAPH = NO + +# If the CALL_GRAPH, SOURCE_BROWSER and HAVE_DOT tags are set to YES +# then doxygen will generate a call dependency graph for every global +# function or class method. Note that enabling this option will +# significantly increase the time of a run. So in most cases it will +# be better to enable call graphs for selected functions only using +# the \callgraph command. + +CALL_GRAPH = NO + +# If the CALLER_GRAPH, SOURCE_BROWSER and HAVE_DOT tags are set to YES +# then doxygen will generate a caller dependency graph for every +# global function or class method. Note that enabling this option +# will significantly increase the time of a run. So in most cases it +# will be better to enable caller graphs for selected functions only +# using the \callergraph command. + +CALLER_GRAPH = NO + +# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen +# will graphical hierarchy of all classes instead of a textual one. + +GRAPHICAL_HIERARCHY = YES + +# If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES +# then doxygen will show the dependencies a directory has on other directories +# in a graphical way. The dependency relations are determined by the #include +# relations between the files in the directories. + +DIRECTORY_GRAPH = YES + +# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images +# generated by dot. Possible values are png, jpg, or gif +# If left blank png will be used. + +DOT_IMAGE_FORMAT = png + +# The tag DOT_PATH can be used to specify the path where the dot tool can be +# found. If left blank, it is assumed the dot tool can be found in the path. + +DOT_PATH = + +# The DOTFILE_DIRS tag can be used to specify one or more directories that +# contain dot files that are included in the documentation (see the +# \dotfile command). + +DOTFILE_DIRS = + +# The MAX_DOT_GRAPH_MAX_NODES tag can be used to set the maximum +# number of nodes that will be shown in the graph. If the number of +# nodes in a graph becomes larger than this value, doxygen will +# truncate the graph, which is visualized by representing a node as a +# red box. Note that doxygen if the number of direct children of the +# root node in a graph is already larger than MAX_DOT_GRAPH_NOTES then +# the graph will not be shown at all. Also note that the size of a +# graph can be further restricted by MAX_DOT_GRAPH_DEPTH. + +DOT_GRAPH_MAX_NODES = 50 + +# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the +# graphs generated by dot. A depth value of 3 means that only nodes reachable +# from the root by following a path via at most 3 edges will be shown. Nodes +# that lay further from the root node will be omitted. Note that setting this +# option to 1 or 2 may greatly reduce the computation time needed for large +# code bases. Also note that the size of a graph can be further restricted by +# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction. + +MAX_DOT_GRAPH_DEPTH = 0 + +# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent +# background. This is disabled by default, which results in a white background. +# Warning: Depending on the platform used, enabling this option may lead to +# badly anti-aliased labels on the edges of a graph (i.e. they become hard to +# read). + +DOT_TRANSPARENT = NO + +# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output +# files in one run (i.e. multiple -o and -T options on the command line). This +# makes dot run faster, but since only newer versions of dot (>1.8.10) +# support this, this feature is disabled by default. + +DOT_MULTI_TARGETS = YES + +# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will +# generate a legend page explaining the meaning of the various boxes and +# arrows in the dot generated graphs. + +GENERATE_LEGEND = NO + +# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will +# remove the intermediate dot files that are used to generate +# the various graphs. + +DOT_CLEANUP = YES + +#--------------------------------------------------------------------------- +# Configuration::additions related to the search engine +#--------------------------------------------------------------------------- + +# The SEARCHENGINE tag specifies whether or not a search engine should be +# used. If set to NO the values of all tags below this one will be ignored. + +SEARCHENGINE = NO diff --git a/libstdc++-v3/doc/html/17_intro/BADNAMES b/libstdc++-v3/doc/html/17_intro/BADNAMES new file mode 100644 index 00000000000..a904704ee39 --- /dev/null +++ b/libstdc++-v3/doc/html/17_intro/BADNAMES @@ -0,0 +1,182 @@ + +This is the list of names "reserved to the implementation" that +have been claimed by certain compilers and system headers of interest, +and should not be used in the library. It will grow, of course. +We generally are interested in names that are not all-caps, except +for those like "_T" + +For Solarix: +_B +_C +_L +_N +_P +_S +_U +_X +_E1 +.. +_E24 + +Irix adds: +_A +_G + +MS adds: +_T + +BSD adds: +__used +__unused +__inline +_Complex +__istype +__maskrune +__tolower +__toupper +__wchar_t +__wint_t +_res +_res_ext +__tg_* + +For GCC: + + [Note that this list is out of date. It applies to the old + name-mangling; in G++ 3.0 and higher a different name-mangling is + used. In addition, many of the bugs relating to G++ interpreting + these names as operators have been fixed.] + + The full set of __* identifiers (combined from gcc/cp/lex.c and + gcc/cplus-dem.c) that are either old or new, but are definitely + recognized by the demangler, is: + +__aa +__aad +__ad +__addr +__adv +__aer +__als +__alshift +__amd +__ami +__aml +__amu +__aor +__apl +__array +__ars +__arshift +__as +__bit_and +__bit_ior +__bit_not +__bit_xor +__call +__cl +__cm +__cn +__co +__component +__compound +__cond +__convert +__delete +__dl +__dv +__eq +__er +__ge +__gt +__indirect +__le +__ls +__lt +__max +__md +__method_call +__mi +__min +__minus +__ml +__mm +__mn +__mult +__mx +__ne +__negate +__new +__nop +__nt +__nw +__oo +__op +__or +__pl +__plus +__postdecrement +__postincrement +__pp +__pt +__rf +__rm +__rs +__sz +__trunc_div +__trunc_mod +__truth_andif +__truth_not +__truth_orif +__vc +__vd +__vn + +SGI badnames: +__builtin_alloca +__builtin_fsqrt +__builtin_sqrt +__builtin_fabs +__builtin_dabs +__builtin_cast_f2i +__builtin_cast_i2f +__builtin_cast_d2ll +__builtin_cast_ll2d +__builtin_copy_dhi2i +__builtin_copy_i2dhi +__builtin_copy_dlo2i +__builtin_copy_i2dlo +__add_and_fetch +__sub_and_fetch +__or_and_fetch +__xor_and_fetch +__and_and_fetch +__nand_and_fetch +__mpy_and_fetch +__min_and_fetch +__max_and_fetch +__fetch_and_add +__fetch_and_sub +__fetch_and_or +__fetch_and_xor +__fetch_and_and +__fetch_and_nand +__fetch_and_mpy +__fetch_and_min +__fetch_and_max +__lock_test_and_set +__lock_release +__lock_acquire +__compare_and_swap +__synchronize +__high_multiply +__unix +__sgi +__linux__ +__i386__ +__i486__ +__cplusplus +__embedded_cplusplus +// long double conversion members mangled as __opr +// http://gcc.gnu.org/ml/libstdc++/1999-q4/msg00060.html +_opr diff --git a/libstdc++-v3/doc/html/17_intro/C++STYLE b/libstdc++-v3/doc/html/17_intro/C++STYLE new file mode 100644 index 00000000000..9eca719a32b --- /dev/null +++ b/libstdc++-v3/doc/html/17_intro/C++STYLE @@ -0,0 +1,399 @@ + +C++ Standard Library Coding Style Guidelines +------------------------------------- + +This library is written to appropriate C++ coding standards. As such, +it is intended to precede the recommendations of the GNU Coding +Standard, which can be referenced in full here: + +http://www.gnu.org/prep/standards/standards.html#Formatting + +The rest of this is also interesting reading, but skip the "Design +Advice" part. + +The GCC coding conventions are here, and are also useful: +http://gcc.gnu.org/codingconventions.html + +In addition, because it doesn't seem to be stated explicitly anywhere +else, there is an 80 column source limit. + +ChangeLog entries for member functions should use the +classname::member function name syntax as follows: + +1999-04-15 Dennis Ritchie + + * src/basic_file.cc (__basic_file::open): Fix thinko in + _G_HAVE_IO_FILE_OPEN bits. + +Notable areas of divergence from what may be previous local practice +(particularly for GNU C) include: + +01. Pointers and references + char* p = "flop"; + char& c = *p; + -NOT- + char *p = "flop"; // wrong + char &c = *p; // wrong + + Reason: In C++, definitions are mixed with executable code. Here, + p is being initialized, not *p. This is near-universal + practice among C++ programmers; it is normal for C hackers + to switch spontaneously as they gain experience. + +02. Operator names and parentheses + operator==(type) + -NOT- + operator == (type) // wrong + + Reason: The == is part of the function name. Separating + it makes the declaration look like an expression. + +03. Function names and parentheses + void mangle() + -NOT- + void mangle () // wrong + + Reason: no space before parentheses (except after a control-flow + keyword) is near-universal practice for C++. It identifies the + parentheses as the function-call operator or declarator, as + opposed to an expression or other overloaded use of parentheses. + +04. Template function indentation + template + void + template_function(args) + { } + -NOT- + template + void template_function(args) {}; + + Reason: In class definitions, without indentation whitespace is + needed both above and below the declaration to distinguish + it visually from other members. (Also, re: "typename" + rather than "class".) T often could be int, which is + not a class. ("class", here, is an anachronism.) + +05. Template class indentation + template + class basic_ios : public ios_base + { + public: + // Types: + }; + -NOT- + template + class basic_ios : public ios_base + { + public: + // Types: + }; + -NOT- + template + class basic_ios : public ios_base + { + public: + // Types: + }; + +06. Enumerators + enum + { + space = _ISspace, + print = _ISprint, + cntrl = _IScntrl + }; + -NOT- + enum { space = _ISspace, print = _ISprint, cntrl = _IScntrl }; + +07. Member initialization lists + All one line, separate from class name. + + gribble::gribble() + : _M_private_data(0), _M_more_stuff(0), _M_helper(0); + { } + -NOT- + gribble::gribble() : _M_private_data(0), _M_more_stuff(0), _M_helper(0); + { } + +08. Try/Catch blocks + try + { + // + } + catch (...) + { + // + } + -NOT- + try { + // + } catch(...) { + // + } + +09. Member functions declarations and definitions + Keywords such as extern, static, export, explicit, inline, etc + go on the line above the function name. Thus + + virtual int + foo() + -NOT- + virtual int foo() + + Reason: GNU coding conventions dictate return types for functions + are on a separate line than the function name and parameter list + for definitions. For C++, where we have member functions that can + be either inline definitions or declarations, keeping to this + standard allows all member function names for a given class to be + aligned to the same margin, increasing readibility. + + +10. Invocation of member functions with "this->" + For non-uglified names, use this->name to call the function. + + this->sync() + -NOT- + sync() + + Reason: Koenig lookup. + +11. Namespaces + namespace std + { + blah blah blah; + } // namespace std + + -NOT- + + namespace std { + blah blah blah; + } // namespace std + +12. Spacing under protected and private in class declarations: + space above, none below + ie + + public: + int foo; + + -NOT- + public: + + int foo; + +13. Spacing WRT return statements. + no extra spacing before returns, no parenthesis + ie + + } + return __ret; + + -NOT- + } + + return __ret; + + -NOT- + + } + return (__ret); + + +14. Location of global variables. + All global variables of class type, whether in the "user visable" + space (e.g., cin) or the implementation namespace, must be defined + as a character array with the appropriate alignment and then later + re-initialized to the correct value. + + This is due to startup issues on certain platforms, such as AIX. + For more explanation and examples, see src/globals.cc. All such + variables should be contained in that file, for simplicity. + +15. Exception abstractions + Use the exception abstractions found in functexcept.h, which allow + C++ programmers to use this library with -fno-exceptions. (Even if + that is rarely advisable, it's a necessary evil for backwards + compatibility.) + +16. Exception error messages + All start with the name of the function where the exception is + thrown, and then (optional) descriptive text is added. Example: + + __throw_logic_error(__N("basic_string::_S_construct NULL not valid")); + + Reason: The verbose terminate handler prints out exception::what(), + as well as the typeinfo for the thrown exception. As this is the + default terminate handler, by putting location info into the + exception string, a very useful error message is printed out for + uncaught exceptions. So useful, in fact, that non-programmers can + give useful error messages, and programmers can intelligently + speculate what went wrong without even using a debugger. + +17. The doxygen style guide to comments is a separate document, + see index. + +The library currently has a mixture of GNU-C and modern C++ coding +styles. The GNU C usages will be combed out gradually. + +Name patterns: + +For nonstandard names appearing in Standard headers, we are constrained +to use names that begin with underscores. This is called "uglification". +The convention is: + + Local and argument names: __[a-z].* + + Examples: __count __ix __s1 + + Type names and template formal-argument names: _[A-Z][^_].* + + Examples: _Helper _CharT _N + + Member data and function names: _M_.* + + Examples: _M_num_elements _M_initialize () + + Static data members, constants, and enumerations: _S_.* + + Examples: _S_max_elements _S_default_value + +Don't use names in the same scope that differ only in the prefix, +e.g. _S_top and _M_top. See BADNAMES for a list of forbidden names. +(The most tempting of these seem to be and "_T" and "__sz".) + +Names must never have "__" internally; it would confuse name +unmanglers on some targets. Also, never use "__[0-9]", same reason. + +-------------------------- + +[BY EXAMPLE] + +#ifndef _HEADER_ +#define _HEADER_ 1 + +namespace std +{ + class gribble + { + public: + gribble() throw(); + + gribble(const gribble&); + + explicit + gribble(int __howmany); + + gribble& + operator=(const gribble&); + + virtual + ~gribble() throw (); + + // Start with a capital letter, end with a period. + inline void + public_member(const char* __arg) const; + + // In-class function definitions should be restricted to one-liners. + int + one_line() { return 0 } + + int + two_lines(const char* arg) + { return strchr(arg, 'a'); } + + inline int + three_lines(); // inline, but defined below. + + // Note indentation. + template + void + public_template() const throw(); + + template + void + other_template(); + + private: + class _Helper; + + int _M_private_data; + int _M_more_stuff; + _Helper* _M_helper; + int _M_private_function(); + + enum _Enum + { + _S_one, + _S_two + }; + + static void + _S_initialize_library(); + }; + +// More-or-less-standard language features described by lack, not presence. +# ifndef _G_NO_LONGLONG + extern long long _G_global_with_a_good_long_name; // avoid globals! +# endif + + // Avoid in-class inline definitions, define separately; + // likewise for member class definitions: + inline int + gribble::public_member() const + { int __local = 0; return __local; } + + class gribble::_Helper + { + int _M_stuff; + + friend class gribble; + }; +} + +// Names beginning with "__": only for arguments and +// local variables; never use "__" in a type name, or +// within any name; never use "__[0-9]". + +#endif /* _HEADER_ */ + + +namespace std +{ + template // notice: "typename", not "class", no space + long_return_value_type + function_name(char* pointer, // "char *pointer" is wrong. + char* argument, + const Reference& ref) + { + // int a_local; /* wrong; see below. */ + if (test) + { + nested code + } + + int a_local = 0; // declare variable at first use. + + // char a, b, *p; /* wrong */ + char a = 'a'; + char b = a + 1; + char* c = "abc"; // each variable goes on its own line, always. + + // except maybe here... + for (unsigned i = 0, mask = 1; mask; ++i, mask <<= 1) { + // ... + } + } + + gribble::gribble() + : _M_private_data(0), _M_more_stuff(0), _M_helper(0); + { } + + inline int + gribble::three_lines() + { + // doesn't fit in one line. + } +} // namespace std + + + diff --git a/libstdc++-v3/doc/html/17_intro/COPYING b/libstdc++-v3/doc/html/17_intro/COPYING new file mode 100644 index 00000000000..623b6258a13 --- /dev/null +++ b/libstdc++-v3/doc/html/17_intro/COPYING @@ -0,0 +1,340 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY 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 Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. diff --git a/libstdc++-v3/doc/html/17_intro/COPYING.DOC b/libstdc++-v3/doc/html/17_intro/COPYING.DOC new file mode 100644 index 00000000000..1a864561bd4 --- /dev/null +++ b/libstdc++-v3/doc/html/17_intro/COPYING.DOC @@ -0,0 +1,355 @@ + GNU Free Documentation License + Version 1.1, March 2000 + + Copyright (C) 2000 Free Software Foundation, Inc. + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + +0. PREAMBLE + +The purpose of this License is to make a manual, textbook, or other +written document "free" in the sense of freedom: to assure everyone +the effective freedom to copy and redistribute it, with or without +modifying it, either commercially or noncommercially. Secondarily, +this License preserves for the author and publisher a way to get +credit for their work, while not being considered responsible for +modifications made by others. + +This License is a kind of "copyleft", which means that derivative +works of the document must themselves be free in the same sense. It +complements the GNU General Public License, which is a copyleft +license designed for free software. + +We have designed this License in order to use it for manuals for free +software, because free software needs free documentation: a free +program should come with manuals providing the same freedoms that the +software does. But this License is not limited to software manuals; +it can be used for any textual work, regardless of subject matter or +whether it is published as a printed book. We recommend this License +principally for works whose purpose is instruction or reference. + + +1. APPLICABILITY AND DEFINITIONS + +This License applies to any manual or other work that contains a +notice placed by the copyright holder saying it can be distributed +under the terms of this License. The "Document", below, refers to any +such manual or work. Any member of the public is a licensee, and is +addressed as "you". + +A "Modified Version" of the Document means any work containing the +Document or a portion of it, either copied verbatim, or with +modifications and/or translated into another language. + +A "Secondary Section" is a named appendix or a front-matter section of +the Document that deals exclusively with the relationship of the +publishers or authors of the Document to the Document's overall subject +(or to related matters) and contains nothing that could fall directly +within that overall subject. (For example, if the Document is in part a +textbook of mathematics, a Secondary Section may not explain any +mathematics.) The relationship could be a matter of historical +connection with the subject or with related matters, or of legal, +commercial, philosophical, ethical or political position regarding +them. + +The "Invariant Sections" are certain Secondary Sections whose titles +are designated, as being those of Invariant Sections, in the notice +that says that the Document is released under this License. + +The "Cover Texts" are certain short passages of text that are listed, +as Front-Cover Texts or Back-Cover Texts, in the notice that says that +the Document is released under this License. + +A "Transparent" copy of the Document means a machine-readable copy, +represented in a format whose specification is available to the +general public, whose contents can be viewed and edited directly and +straightforwardly with generic text editors or (for images composed of +pixels) generic paint programs or (for drawings) some widely available +drawing editor, and that is suitable for input to text formatters or +for automatic translation to a variety of formats suitable for input +to text formatters. A copy made in an otherwise Transparent file +format whose markup has been designed to thwart or discourage +subsequent modification by readers is not Transparent. A copy that is +not "Transparent" is called "Opaque". + +Examples of suitable formats for Transparent copies include plain +ASCII without markup, Texinfo input format, LaTeX input format, SGML +or XML using a publicly available DTD, and standard-conforming simple +HTML designed for human modification. Opaque formats include +PostScript, PDF, proprietary formats that can be read and edited only +by proprietary word processors, SGML or XML for which the DTD and/or +processing tools are not generally available, and the +machine-generated HTML produced by some word processors for output +purposes only. + +The "Title Page" means, for a printed book, the title page itself, +plus such following pages as are needed to hold, legibly, the material +this License requires to appear in the title page. For works in +formats which do not have any title page as such, "Title Page" means +the text near the most prominent appearance of the work's title, +preceding the beginning of the body of the text. + + +2. VERBATIM COPYING + +You may copy and distribute the Document in any medium, either +commercially or noncommercially, provided that this License, the +copyright notices, and the license notice saying this License applies +to the Document are reproduced in all copies, and that you add no other +conditions whatsoever to those of this License. You may not use +technical measures to obstruct or control the reading or further +copying of the copies you make or distribute. However, you may accept +compensation in exchange for copies. If you distribute a large enough +number of copies you must also follow the conditions in section 3. + +You may also lend copies, under the same conditions stated above, and +you may publicly display copies. + + +3. COPYING IN QUANTITY + +If you publish printed copies of the Document numbering more than 100, +and the Document's license notice requires Cover Texts, you must enclose +the copies in covers that carry, clearly and legibly, all these Cover +Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on +the back cover. Both covers must also clearly and legibly identify +you as the publisher of these copies. The front cover must present +the full title with all words of the title equally prominent and +visible. You may add other material on the covers in addition. +Copying with changes limited to the covers, as long as they preserve +the title of the Document and satisfy these conditions, can be treated +as verbatim copying in other respects. + +If the required texts for either cover are too voluminous to fit +legibly, you should put the first ones listed (as many as fit +reasonably) on the actual cover, and continue the rest onto adjacent +pages. + +If you publish or distribute Opaque copies of the Document numbering +more than 100, you must either include a machine-readable Transparent +copy along with each Opaque copy, or state in or with each Opaque copy +a publicly-accessible computer-network location containing a complete +Transparent copy of the Document, free of added material, which the +general network-using public has access to download anonymously at no +charge using public-standard network protocols. If you use the latter +option, you must take reasonably prudent steps, when you begin +distribution of Opaque copies in quantity, to ensure that this +Transparent copy will remain thus accessible at the stated location +until at least one year after the last time you distribute an Opaque +copy (directly or through your agents or retailers) of that edition to +the public. + +It is requested, but not required, that you contact the authors of the +Document well before redistributing any large number of copies, to give +them a chance to provide you with an updated version of the Document. + + +4. MODIFICATIONS + +You may copy and distribute a Modified Version of the Document under +the conditions of sections 2 and 3 above, provided that you release +the Modified Version under precisely this License, with the Modified +Version filling the role of the Document, thus licensing distribution +and modification of the Modified Version to whoever possesses a copy +of it. In addition, you must do these things in the Modified Version: + +A. Use in the Title Page (and on the covers, if any) a title distinct + from that of the Document, and from those of previous versions + (which should, if there were any, be listed in the History section + of the Document). You may use the same title as a previous version + if the original publisher of that version gives permission. +B. List on the Title Page, as authors, one or more persons or entities + responsible for authorship of the modifications in the Modified + Version, together with at least five of the principal authors of the + Document (all of its principal authors, if it has less than five). +C. State on the Title page the name of the publisher of the + Modified Version, as the publisher. +D. Preserve all the copyright notices of the Document. +E. Add an appropriate copyright notice for your modifications + adjacent to the other copyright notices. +F. Include, immediately after the copyright notices, a license notice + giving the public permission to use the Modified Version under the + terms of this License, in the form shown in the Addendum below. +G. Preserve in that license notice the full lists of Invariant Sections + and required Cover Texts given in the Document's license notice. +H. Include an unaltered copy of this License. +I. Preserve the section entitled "History", and its title, and add to + it an item stating at least the title, year, new authors, and + publisher of the Modified Version as given on the Title Page. If + there is no section entitled "History" in the Document, create one + stating the title, year, authors, and publisher of the Document as + given on its Title Page, then add an item describing the Modified + Version as stated in the previous sentence. +J. Preserve the network location, if any, given in the Document for + public access to a Transparent copy of the Document, and likewise + the network locations given in the Document for previous versions + it was based on. These may be placed in the "History" section. + You may omit a network location for a work that was published at + least four years before the Document itself, or if the original + publisher of the version it refers to gives permission. +K. In any section entitled "Acknowledgements" or "Dedications", + preserve the section's title, and preserve in the section all the + substance and tone of each of the contributor acknowledgements + and/or dedications given therein. +L. Preserve all the Invariant Sections of the Document, + unaltered in their text and in their titles. Section numbers + or the equivalent are not considered part of the section titles. +M. Delete any section entitled "Endorsements". Such a section + may not be included in the Modified Version. +N. Do not retitle any existing section as "Endorsements" + or to conflict in title with any Invariant Section. + +If the Modified Version includes new front-matter sections or +appendices that qualify as Secondary Sections and contain no material +copied from the Document, you may at your option designate some or all +of these sections as invariant. To do this, add their titles to the +list of Invariant Sections in the Modified Version's license notice. +These titles must be distinct from any other section titles. + +You may add a section entitled "Endorsements", provided it contains +nothing but endorsements of your Modified Version by various +parties--for example, statements of peer review or that the text has +been approved by an organization as the authoritative definition of a +standard. + +You may add a passage of up to five words as a Front-Cover Text, and a +passage of up to 25 words as a Back-Cover Text, to the end of the list +of Cover Texts in the Modified Version. Only one passage of +Front-Cover Text and one of Back-Cover Text may be added by (or +through arrangements made by) any one entity. If the Document already +includes a cover text for the same cover, previously added by you or +by arrangement made by the same entity you are acting on behalf of, +you may not add another; but you may replace the old one, on explicit +permission from the previous publisher that added the old one. + +The author(s) and publisher(s) of the Document do not by this License +give permission to use their names for publicity for or to assert or +imply endorsement of any Modified Version. + + +5. COMBINING DOCUMENTS + +You may combine the Document with other documents released under this +License, under the terms defined in section 4 above for modified +versions, provided that you include in the combination all of the +Invariant Sections of all of the original documents, unmodified, and +list them all as Invariant Sections of your combined work in its +license notice. + +The combined work need only contain one copy of this License, and +multiple identical Invariant Sections may be replaced with a single +copy. If there are multiple Invariant Sections with the same name but +different contents, make the title of each such section unique by +adding at the end of it, in parentheses, the name of the original +author or publisher of that section if known, or else a unique number. +Make the same adjustment to the section titles in the list of +Invariant Sections in the license notice of the combined work. + +In the combination, you must combine any sections entitled "History" +in the various original documents, forming one section entitled +"History"; likewise combine any sections entitled "Acknowledgements", +and any sections entitled "Dedications". You must delete all sections +entitled "Endorsements." + + +6. COLLECTIONS OF DOCUMENTS + +You may make a collection consisting of the Document and other documents +released under this License, and replace the individual copies of this +License in the various documents with a single copy that is included in +the collection, provided that you follow the rules of this License for +verbatim copying of each of the documents in all other respects. + +You may extract a single document from such a collection, and distribute +it individually under this License, provided you insert a copy of this +License into the extracted document, and follow this License in all +other respects regarding verbatim copying of that document. + + +7. AGGREGATION WITH INDEPENDENT WORKS + +A compilation of the Document or its derivatives with other separate +and independent documents or works, in or on a volume of a storage or +distribution medium, does not as a whole count as a Modified Version +of the Document, provided no compilation copyright is claimed for the +compilation. Such a compilation is called an "aggregate", and this +License does not apply to the other self-contained works thus compiled +with the Document, on account of their being thus compiled, if they +are not themselves derivative works of the Document. + +If the Cover Text requirement of section 3 is applicable to these +copies of the Document, then if the Document is less than one quarter +of the entire aggregate, the Document's Cover Texts may be placed on +covers that surround only the Document within the aggregate. +Otherwise they must appear on covers around the whole aggregate. + + +8. TRANSLATION + +Translation is considered a kind of modification, so you may +distribute translations of the Document under the terms of section 4. +Replacing Invariant Sections with translations requires special +permission from their copyright holders, but you may include +translations of some or all Invariant Sections in addition to the +original versions of these Invariant Sections. You may include a +translation of this License provided that you also include the +original English version of this License. In case of a disagreement +between the translation and the original English version of this +License, the original English version will prevail. + + +9. TERMINATION + +You may not copy, modify, sublicense, or distribute the Document except +as expressly provided for under this License. Any other attempt to +copy, modify, sublicense or distribute the Document is void, and will +automatically terminate your rights under this License. However, +parties who have received copies, or rights, from you under this +License will not have their licenses terminated so long as such +parties remain in full compliance. + + +10. FUTURE REVISIONS OF THIS LICENSE + +The Free Software Foundation may publish new, revised versions +of the GNU Free Documentation License from time to time. Such new +versions will be similar in spirit to the present version, but may +differ in detail to address new problems or concerns. See +http://www.gnu.org/copyleft/. + +Each version of the License is given a distinguishing version number. +If the Document specifies that a particular numbered version of this +License "or any later version" applies to it, you have the option of +following the terms and conditions either of that specified version or +of any later version that has been published (not as a draft) by the +Free Software Foundation. If the Document does not specify a version +number of this License, you may choose any version ever published (not +as a draft) by the Free Software Foundation. + + +ADDENDUM: How to use this License for your documents + +To use this License in a document you have written, include a copy of +the License in the document and put the following copyright and +license notices just after the title page: + + Copyright (c) YEAR YOUR NAME. + Permission is granted to copy, distribute and/or modify this document + under the terms of the GNU Free Documentation License, Version 1.1 + or any later version published by the Free Software Foundation; + with the Invariant Sections being LIST THEIR TITLES, with the + Front-Cover Texts being LIST, and with the Back-Cover Texts being LIST. + A copy of the license is included in the section entitled "GNU + Free Documentation License". + +If you have no Invariant Sections, write "with no Invariant Sections" +instead of saying which ones are invariant. If you have no +Front-Cover Texts, write "no Front-Cover Texts" instead of +"Front-Cover Texts being LIST"; likewise for Back-Cover Texts. + +If your document contains nontrivial examples of program code, we +recommend releasing these examples in parallel under your choice of +free software license, such as the GNU General Public License, +to permit their use in free software. diff --git a/libstdc++-v3/doc/html/17_intro/DESIGN b/libstdc++-v3/doc/html/17_intro/DESIGN new file mode 100644 index 00000000000..5af3d9aed3b --- /dev/null +++ b/libstdc++-v3/doc/html/17_intro/DESIGN @@ -0,0 +1,859 @@ + +Standard C++ Library Design Document +------------------------------------ + +This is an overview of libstdc++-v3, with particular attention +to projects to be done and how they fit into the whole. + +The Library +----------- + +This paper is covers two major areas: + + - Features and policies not mentioned in the standard that + the quality of the library implementation depends on, including + extensions and "implementation-defined" features; + + - Plans for required but unimplemented library features and + optimizations to them. + +Overhead +-------- + +The standard defines a large library, much larger than the standard +C library. A naive implementation would suffer substantial overhead +in compile time, executable size, and speed, rendering it unusable +in many (particularly embedded) applications. The alternative demands +care in construction, and some compiler support, but there is no +need for library subsets. + +What are the sources of this overhead? There are four main causes: + + - The library is specified almost entirely as templates, which + with current compilers must be included in-line, resulting in + very slow builds as tens or hundreds of thousands of lines + of function definitions are read for each user source file. + Indeed, the entire SGI STL, as well as the dos Reis valarray, + are provided purely as header files, largely for simplicity in + porting. Iostream/locale is (or will be) as large again. + + - The library is very flexible, specifying a multitude of hooks + where users can insert their own code in place of defaults. + When these hooks are not used, any time and code expended to + support that flexibility is wasted. + + - Templates are often described as causing to "code bloat". In + practice, this refers (when it refers to anything real) to several + independent processes. First, when a class template is manually + instantiated in its entirely, current compilers place the definitions + for all members in a single object file, so that a program linking + to one member gets definitions of all. Second, template functions + which do not actually depend on the template argument are, under + current compilers, generated anew for each instantiation, rather + than being shared with other instantiations. Third, some of the + flexibility mentioned above comes from virtual functions (both in + regular classes and template classes) which current linkers add + to the executable file even when they manifestly cannot be called. + + - The library is specified to use a language feature, exceptions, + which in the current gcc compiler ABI imposes a run time and + code space cost to handle the possibility of exceptions even when + they are not used. Under the new ABI (accessed with -fnew-abi), + there is a space overhead and a small reduction in code efficiency + resulting from lost optimization opportunities associated with + non-local branches associated with exceptions. + +What can be done to eliminate this overhead? A variety of coding +techniques, and compiler, linker and library improvements and +extensions may be used, as covered below. Most are not difficult, +and some are already implemented in varying degrees. + +Overhead: Compilation Time +-------------------------- + +Providing "ready-instantiated" template code in object code archives +allows us to avoid generating and optimizing template instantiations +in each compilation unit which uses them. However, the number of such +instantiations that are useful to provide is limited, and anyway this +is not enough, by itself, to minimize compilation time. In particular, +it does not reduce time spent parsing conforming headers. + +Quicker header parsing will depend on library extensions and compiler +improvements. One approach is some variation on the techniques +previously marketed as "pre-compiled headers", now standardized as +support for the "export" keyword. "Exported" template definitions +can be placed (once) in a "repository" -- really just a library, but +of template definitions rather than object code -- to be drawn upon +at link time when an instantiation is needed, rather than placed in +header files to be parsed along with every compilation unit. + +Until "export" is implemented we can put some of the lengthy template +definitions in #if guards or alternative headers so that users can skip +over the the full definitions when they need only the ready-instantiated +specializations. + +To be precise, this means that certain headers which define +templates which users normally use only for certain arguments +can be instrumented to avoid exposing the template definitions +to the compiler unless a macro is defined. For example, in +, we might have: + + template class basic_string { + ... // member declarations + }; + ... // operator declarations + + #ifdef _STRICT_ISO_ + # if _G_NO_TEMPLATE_EXPORT + # include // headers needed by definitions + # ... + # include // member and global template definitions. + # endif + #endif + +Users who compile without specifying a strict-ISO-conforming flag +would not see many of the template definitions they now see, and rely +instead on ready-instantiated specializations in the library. This +technique would be useful for the following substantial components: +string, locale/iostreams, valarray. It would *not* be useful or +usable with the following: containers, algorithms, iterators, +allocator. Since these constitute a large (though decreasing) +fraction of the library, the benefit the technique offers is +limited. + +The language specifies the semantics of the "export" keyword, but +the gcc compiler does not yet support it. When it does, problems +with large template inclusions can largely disappear, given some +minor library reorganization, along with the need for the apparatus +described above. + +Overhead: Flexibility Cost +-------------------------- + +The library offers many places where users can specify operations +to be performed by the library in place of defaults. Sometimes +this seems to require that the library use a more-roundabout, and +possibly slower, way to accomplish the default requirements than +would be used otherwise. + +The primary protection against this overhead is thorough compiler +optimization, to crush out layers of inline function interfaces. +Kuck & Associates has demonstrated the practicality of this kind +of optimization. + +The second line of defense against this overhead is explicit +specialization. By defining helper function templates, and writing +specialized code for the default case, overhead can be eliminated +for that case without sacrificing flexibility. This takes full +advantage of any ability of the optimizer to crush out degenerate +code. + +The library specifies many virtual functions which current linkers +load even when they cannot be called. Some minor improvements to the +compiler and to ld would eliminate any such overhead by simply +omitting virtual functions that the complete program does not call. +A prototype of this work has already been done. For targets where +GNU ld is not used, a "pre-linker" could do the same job. + +The main areas in the standard interface where user flexibility +can result in overhead are: + + - Allocators: Containers are specified to use user-definable + allocator types and objects, making tuning for the container + characteristics tricky. + + - Locales: the standard specifies locale objects used to implement + iostream operations, involving many virtual functions which use + streambuf iterators. + + - Algorithms and containers: these may be instantiated on any type, + frequently duplicating code for identical operations. + + - Iostreams and strings: users are permitted to use these on their + own types, and specify the operations the stream must use on these + types. + +Note that these sources of overhead are _avoidable_. The techniques +to avoid them are covered below. + +Code Bloat +---------- + +In the SGI STL, and in some other headers, many of the templates +are defined "inline" -- either explicitly or by their placement +in class definitions -- which should not be inline. This is a +source of code bloat. Matt had remarked that he was relying on +the compiler to recognize what was too big to benefit from inlining, +and generate it out-of-line automatically. However, this also can +result in code bloat except where the linker can eliminate the extra +copies. + +Fixing these cases will require an audit of all inline functions +defined in the library to determine which merit inlining, and moving +the rest out of line. This is an issue mainly in chapters 23, 25, and +27. Of course it can be done incrementally, and we should generally +accept patches that move large functions out of line and into ".tcc" +files, which can later be pulled into a repository. Compiler/linker +improvements to recognize very large inline functions and move them +out-of-line, but shared among compilation units, could make this +work unnecessary. + +Pre-instantiating template specializations currently produces large +amounts of dead code which bloats statically linked programs. The +current state of the static library, libstdc++.a, is intolerable on +this account, and will fuel further confused speculation about a need +for a library "subset". A compiler improvement that treats each +instantiated function as a separate object file, for linking purposes, +would be one solution to this problem. An alternative would be to +split up the manual instantiation files into dozens upon dozens of +little files, each compiled separately, but an abortive attempt at +this was done for and, though it is far from complete, it +is already a nuisance. A better interim solution (just until we have +"export") is badly needed. + +When building a shared library, the current compiler/linker cannot +automatically generate the instantiatiations needed. This creates a +miserable situation; it means any time something is changed in the +library, before a shared library can be built someone must manually +copy the declarations of all templates that are needed by other parts +of the library to an "instantiation" file, and add it to the build +system to be compiled and linked to the library. This process is +readily automated, and should be automated as soon as possible. +Users building their own shared libraries experience identical +frustrations. + +Sharing common aspects of template definitions among instantiations +can radically reduce code bloat. The compiler could help a great +deal here by recognizing when a function depends on nothing about +a template parameter, or only on its size, and giving the resulting +function a link-name "equate" that allows it to be shared with other +instantiations. Implementation code could take advantage of the +capability by factoring out code that does not depend on the template +argument into separate functions to be merged by the compiler. + +Until such a compiler optimization is implemented, much can be done +manually (if tediously) in this direction. One such optimization is +to derive class templates from non-template classes, and move as much +implementation as possible into the base class. Another is to partial- +specialize certain common instantiations, such as vector, to share +code for instantiations on all types T. While these techniques work, +they are far from the complete solution that a compiler improvement +would afford. + +Overhead: Expensive Language Features +------------------------------------- + +The main "expensive" language feature used in the standard library +is exception support, which requires compiling in cleanup code with +static table data to locate it, and linking in library code to use +the table. For small embedded programs the amount of such library +code and table data is assumed by some to be excessive. Under the +"new" ABI this perception is generally exaggerated, although in some +cases it may actually be excessive. + +To implement a library which does not use exceptions directly is +not difficult given minor compiler support (to "turn off" exceptions +and ignore exception constructs), and results in no great library +maintenance difficulties. To be precise, given "-fno-exceptions", +the compiler should treat "try" blocks as ordinary blocks, and +"catch" blocks as dead code to ignore or eliminate. Compiler +support is not strictly necessary, except in the case of "function +try blocks"; otherwise the following macros almost suffice: + + #define throw(X) + #define try if (true) + #define catch(X) else if (false) + +However, there may be a need to use function try blocks in the +library implementation, and use of macros in this way can make +correct diagnostics impossible. Furthermore, use of this scheme +would require the library to call a function to re-throw exceptions +from a try block. Implementing the above semantics in the compiler +is preferable. + +Given the support above (however implemented) it only remains to +replace code that "throws" with a call to a well-documented "handler" +function in a separate compilation unit which may be replaced by +the user. The main source of exceptions that would be difficult +for users to avoid is memory allocation failures, but users can +define their own memory allocation primitives that never throw. +Otherwise, the complete list of such handlers, and which library +functions may call them, would be needed for users to be able to +implement the necessary substitutes. (Fortunately, they have the +source code.) + +Opportunities +------------- + +The template capabilities of C++ offer enormous opportunities for +optimizing common library operations, well beyond what would be +considered "eliminating overhead". In particular, many operations +done in Glibc with macros that depend on proprietary language +extensions can be implemented in pristine Standard C++. For example, +the chapter 25 algorithms, and even C library functions such as strchr, +can be specialized for the case of static arrays of known (small) size. + +Detailed optimization opportunities are identified below where +the component where they would appear is discussed. Of course new +opportunities will be identified during implementation. + +Unimplemented Required Library Features +--------------------------------------- + +The standard specifies hundreds of components, grouped broadly by +chapter. These are listed in excruciating detail in the CHECKLIST +file. + + 17 general + 18 support + 19 diagnostics + 20 utilities + 21 string + 22 locale + 23 containers + 24 iterators + 25 algorithms + 26 numerics + 27 iostreams + Annex D backward compatibility + +Anyone participating in implementation of the library should obtain +a copy of the standard, ISO 14882. People in the U.S. can obtain an +electronic copy for US$18 from ANSI's web site. Those from other +countries should visit http://www.iso.ch/ to find out the location +of their country's representation in ISO, in order to know who can +sell them a copy. + +The emphasis in the following sections is on unimplemented features +and optimization opportunities. + +Chapter 17 General +------------------- + +Chapter 17 concerns overall library requirements. + +The standard doesn't mention threads. A multi-thread (MT) extension +primarily affects operators new and delete (18), allocator (20), +string (21), locale (22), and iostreams (27). The common underlying +support needed for this is discussed under chapter 20. + +The standard requirements on names from the C headers create a +lot of work, mostly done. Names in the C headers must be visible +in the std:: and sometimes the global namespace; the names in the +two scopes must refer to the same object. More stringent is that +Koenig lookup implies that any types specified as defined in std:: +really are defined in std::. Names optionally implemented as +macros in C cannot be macros in C++. (An overview may be read at +). The scripts "inclosure" +and "mkcshadow", and the directories shadow/ and cshadow/, are the +beginning of an effort to conform in this area. + +A correct conforming definition of C header names based on underlying +C library headers, and practical linking of conforming namespaced +customer code with third-party C libraries depends ultimately on +an ABI change, allowing namespaced C type names to be mangled into +type names as if they were global, somewhat as C function names in a +namespace, or C++ global variable names, are left unmangled. Perhaps +another "extern" mode, such as 'extern "C-global"' would be an +appropriate place for such type definitions. Such a type would +affect mangling as follows: + + namespace A { + struct X {}; + extern "C-global" { // or maybe just 'extern "C"' + struct Y {}; + }; + } + void f(A::X*); // mangles to f__FPQ21A1X + void f(A::Y*); // mangles to f__FP1Y + +(It may be that this is really the appropriate semantics for regular +'extern "C"', and 'extern "C-global"', as an extension, would not be +necessary.) This would allow functions declared in non-standard C headers +(and thus fixable by neither us nor users) to link properly with functions +declared using C types defined in properly-namespaced headers. The +problem this solves is that C headers (which C++ programmers do persist +in using) frequently forward-declare C struct tags without including +the header where the type is defined, as in + + struct tm; + void munge(tm*); + +Without some compiler accommodation, munge cannot be called by correct +C++ code using a pointer to a correctly-scoped tm* value. + +The current C headers use the preprocessor extension "#include_next", +which the compiler complains about when run "-pedantic". +(Incidentally, it appears that "-fpedantic" is currently ignored, +probably a bug.) The solution in the C compiler is to use +"-isystem" rather than "-I", but unfortunately in g++ this seems +also to wrap the whole header in an 'extern "C"' block, so it's +unusable for C++ headers. The correct solution appears to be to +allow the various special include-directory options, if not given +an argument, to affect subsequent include-directory options additively, +so that if one said + + -pedantic -iprefix $(prefix) \ + -idirafter -ino-pedantic -ino-extern-c -iwithprefix -I g++-v3 \ + -iwithprefix -I g++-v3/ext + +the compiler would search $(prefix)/g++-v3 and not report +pedantic warnings for files found there, but treat files in +$(prefix)/g++-v3/ext pedantically. (The undocumented semantics +of "-isystem" in g++ stink. Can they be rescinded? If not it +must be replaced with something more rationally behaved.) + +All the C headers need the treatment above; in the standard these +headers are mentioned in various chapters. Below, I have only +mentioned those that present interesting implementation issues. + +The components identified as "mostly complete", below, have not been +audited for conformance. In many cases where the library passes +conformance tests we have non-conforming extensions that must be +wrapped in #if guards for "pedantic" use, and in some cases renamed +in a conforming way for continued use in the implementation regardless +of conformance flags. + +The STL portion of the library still depends on a header +stl/bits/stl_config.h full of #ifdef clauses. This apparatus +should be replaced with autoconf/automake machinery. + +The SGI STL defines a type_traits<> template, specialized for +many types in their code including the built-in numeric and +pointer types and some library types, to direct optimizations of +standard functions. The SGI compiler has been extended to generate +specializations of this template automatically for user types, +so that use of STL templates on user types can take advantage of +these optimizations. Specializations for other, non-STL, types +would make more optimizations possible, but extending the gcc +compiler in the same way would be much better. Probably the next +round of standardization will ratify this, but probably with +changes, so it probably should be renamed to place it in the +implementation namespace. + +The SGI STL also defines a large number of extensions visible in +standard headers. (Other extensions that appear in separate headers +have been sequestered in subdirectories ext/ and backward/.) All +these extensions should be moved to other headers where possible, +and in any case wrapped in a namespace (not std!), and (where kept +in a standard header) girded about with macro guards. Some cannot be +moved out of standard headers because they are used to implement +standard features. The canonical method for accommodating these +is to use a protected name, aliased in macro guards to a user-space +name. Unfortunately C++ offers no satisfactory template typedef +mechanism, so very ad-hoc and unsatisfactory aliasing must be used +instead. + +Implementation of a template typedef mechanism should have the highest +priority among possible extensions, on the same level as implementation +of the template "export" feature. + +Chapter 18 Language support +---------------------------- + +Headers: +C headers: + (also 21, 25, 26) + +This defines the built-in exceptions, rtti, numeric_limits<>, +operator new and delete. Much of this is provided by the +compiler in its static runtime library. + +Work to do includes defining numeric_limits<> specializations in +separate files for all target architectures. Values for integer types +except for bool and wchar_t are readily obtained from the C header +, but values for the remaining numeric types (bool, wchar_t, +float, double, long double) must be entered manually. This is +largely dog work except for those members whose values are not +easily deduced from available documentation. Also, this involves +some work in target configuration to identify the correct choice of +file to build against and to install. + +The definitions of the various operators new and delete must be +made thread-safe, which depends on a portable exclusion mechanism, +discussed under chapter 20. Of course there is always plenty of +room for improvements to the speed of operators new and delete. + +, in Glibc, defines some macros that gcc does not allow to +be wrapped into an inline function. Probably this header will demand +attention whenever a new target is chosen. The functions atexit(), +exit(), and abort() in cstdlib have different semantics in C++, so +must be re-implemented for C++. + +Chapter 19 Diagnostics +----------------------- + +Headers: +C headers: + +This defines the standard exception objects, which are "mostly complete". +Cygnus has a version, and now SGI provides a slightly different one. +It makes little difference which we use. + +The C global name "errno", which C allows to be a variable or a macro, +is required in C++ to be a macro. For MT it must typically result in +a function call. + +Chapter 20 Utilities +--------------------- +Headers: +C header: (also in 18) + +SGI STL provides "mostly complete" versions of all the components +defined in this chapter. However, the auto_ptr<> implementation +is known to be wrong. Furthermore, the standard definition of it +is known to be unimplementable as written. A minor change to the +standard would fix it, and auto_ptr<> should be adjusted to match. + +Multi-threading affects the allocator implementation, and there must +be configuration/installation choices for different users' MT +requirements. Anyway, users will want to tune allocator options +to support different target conditions, MT or no. + +The primitives used for MT implementation should be exposed, as an +extension, for users' own work. We need cross-CPU "mutex" support, +multi-processor shared-memory atomic integer operations, and single- +processor uninterruptible integer operations, and all three configurable +to be stubbed out for non-MT use, or to use an appropriately-loaded +dynamic library for the actual runtime environment, or statically +compiled in for cases where the target architecture is known. + +Chapter 21 String +------------------ +Headers: +C headers: (also in 27) + (also in 18, 25, 26) + +We have "mostly-complete" char_traits<> implementations. Many of the +char_traits operations might be optimized further using existing +proprietary language extensions. + +We have a "mostly-complete" basic_string<> implementation. The work +to manually instantiate char and wchar_t specializations in object +files to improve link-time behavior is extremely unsatisfactory, +literally tripling library-build time with no commensurate improvement +in static program link sizes. It must be redone. (Similar work is +needed for some components in chapters 22 and 27.) + +Other work needed for strings is MT-safety, as discussed under the +chapter 20 heading. + +The standard C type mbstate_t from and used in char_traits<> +must be different in C++ than in C, because in C++ the default constructor +value mbstate_t() must be the "base" or "ground" sequence state. +(According to the likely resolution of a recently raised Core issue, +this may become unnecessary. However, there are other reasons to +use a state type not as limited as whatever the C library provides.) +If we might want to provide conversions from (e.g.) internally- +represented EUC-wide to externally-represented Unicode, or vice- +versa, the mbstate_t we choose will need to be more accommodating +than what might be provided by an underlying C library. + +There remain some basic_string template-member functions which do +not overload properly with their non-template brethren. The infamous +hack akin to what was done in vector<> is needed, to conform to +23.1.1 para 10. The CHECKLIST items for basic_string marked 'X', +or incomplete, are so marked for this reason. + +Replacing the string iterators, which currently are simple character +pointers, with class objects would greatly increase the safety of the +client interface, and also permit a "debug" mode in which range, +ownership, and validity are rigorously checked. The current use of +raw pointers as string iterators is evil. vector<> iterators need the +same treatment. Note that the current implementation freely mixes +pointers and iterators, and that must be fixed before safer iterators +can be introduced. + +Some of the functions in are different from the C version. +generally overloaded on const and non-const argument pointers. For +example, in strchr is overloaded. The functions isupper +etc. in typically implemented as macros in C are functions +in C++, because they are overloaded with others of the same name +defined in . + +Many of the functions required in and cannot be +implemented using underlying C facilities on intended targets because +such facilities only partly exist. + +Chapter 22 Locale +------------------ +Headers: +C headers: + +We have a "mostly complete" class locale, with the exception of +code for constructing, and handling the names of, named locales. +The ways that locales are named (particularly when categories +(e.g. LC_TIME, LC_COLLATE) are different) varies among all target +environments. This code must be written in various versions and +chosen by configuration parameters. + +Members of many of the facets defined in are stubs. Generally, +there are two sets of facets: the base class facets (which are supposed +to implement the "C" locale) and the "byname" facets, which are supposed +to read files to determine their behavior. The base ctype<>, collate<>, +and numpunct<> facets are "mostly complete", except that the table of +bitmask values used for "is" operations, and corresponding mask values, +are still defined in libio and just included/linked. (We will need to +implement these tables independently, soon, but should take advantage +of libio where possible.) The num_put<>::put members for integer types +are "mostly complete". + +A complete list of what has and has not been implemented may be +found in CHECKLIST. However, note that the current definition of +codecvt is wrong. It should simply write +out the raw bytes representing the wide characters, rather than +trying to convert each to a corresponding single "char" value. + +Some of the facets are more important than others. Specifically, +the members of ctype<>, numpunct<>, num_put<>, and num_get<> facets +are used by other library facilities defined in , , +and , and the codecvt<> facet is used by basic_filebuf<> +in , so a conforming iostream implementation depends on +these. + +The "long long" type eventually must be supported, but code mentioning +it should be wrapped in #if guards to allow pedantic-mode compiling. + +Performance of num_put<> and num_get<> depend critically on +caching computed values in ios_base objects, and on extensions +to the interface with streambufs. + +Specifically: retrieving a copy of the locale object, extracting +the needed facets, and gathering data from them, for each call to +(e.g.) operator<< would be prohibitively slow. To cache format +data for use by num_put<> and num_get<> we have a _Format_cache<> +object stored in the ios_base::pword() array. This is constructed +and initialized lazily, and is organized purely for utility. It +is discarded when a new locale with different facets is imbued. + +Using only the public interfaces of the iterator arguments to the +facet functions would limit performance by forbidding "vector-style" +character operations. The streambuf iterator optimizations are +described under chapter 24, but facets can also bypass the streambuf +iterators via explicit specializations and operate directly on the +streambufs, and use extended interfaces to get direct access to the +streambuf internal buffer arrays. These extensions are mentioned +under chapter 27. These optimizations are particularly important +for input parsing. + +Unused virtual members of locale facets can be omitted, as mentioned +above, by a smart linker. + +Chapter 23 Containers +---------------------- +Headers: + +All the components in chapter 23 are implemented in the SGI STL. +They are "mostly complete"; they include a large number of +nonconforming extensions which must be wrapped. Some of these +are used internally and must be renamed or duplicated. + +The SGI components are optimized for large-memory environments. For +embedded targets, different criteria might be more appropriate. Users +will want to be able to tune this behavior. We should provide +ways for users to compile the library with different memory usage +characteristics. + +A lot more work is needed on factoring out common code from different +specializations to reduce code size here and in chapter 25. The +easiest fix for this would be a compiler/ABI improvement that allows +the compiler to recognize when a specialization depends only on the +size (or other gross quality) of a template argument, and allow the +linker to share the code with similar specializations. In its +absence, many of the algorithms and containers can be partial- +specialized, at least for the case of pointers, but this only solves +a small part of the problem. Use of a type_traits-style template +allows a few more optimization opportunities, more if the compiler +can generate the specializations automatically. + +As an optimization, containers can specialize on the default allocator +and bypass it, or take advantage of details of its implementation +after it has been improved upon. + +Replacing the vector iterators, which currently are simple element +pointers, with class objects would greatly increase the safety of the +client interface, and also permit a "debug" mode in which range, +ownership, and validity are rigorously checked. The current use of +pointers for iterators is evil. + +As mentioned for chapter 24, the deque iterator is a good example of +an opportunity to implement a "staged" iterator that would benefit +from specializations of some algorithms. + +Chapter 24 Iterators +--------------------- +Headers: + +Standard iterators are "mostly complete", with the exception of +the stream iterators, which are not yet templatized on the +stream type. Also, the base class template iterator<> appears +to be wrong, so everything derived from it must also be wrong, +currently. + +The streambuf iterators (currently located in stl/bits/std_iterator.h, +but should be under bits/) can be rewritten to take advantage of +friendship with the streambuf implementation. + +Matt Austern has identified opportunities where certain iterator +types, particularly including streambuf iterators and deque +iterators, have a "two-stage" quality, such that an intermediate +limit can be checked much more quickly than the true limit on +range operations. If identified with a member of iterator_traits, +algorithms may be specialized for this case. Of course the +iterators that have this quality can be identified by specializing +a traits class. + +Many of the algorithms must be specialized for the streambuf +iterators, to take advantage of block-mode operations, in order +to allow iostream/locale operations' performance not to suffer. +It may be that they could be treated as staged iterators and +take advantage of those optimizations. + +Chapter 25 Algorithms +---------------------- +Headers: +C headers: (also in 18, 21, 26)) + +The algorithms are "mostly complete". As mentioned above, they +are optimized for speed at the expense of code and data size. + +Specializations of many of the algorithms for non-STL types would +give performance improvements, but we must use great care not to +interfere with fragile template overloading semantics for the +standard interfaces. Conventionally the standard function template +interface is an inline which delegates to a non-standard function +which is then overloaded (this is already done in many places in +the library). Particularly appealing opportunities for the sake of +iostream performance are for copy and find applied to streambuf +iterators or (as noted elsewhere) for staged iterators, of which +the streambuf iterators are a good example. + +The bsearch and qsort functions cannot be overloaded properly as +required by the standard because gcc does not yet allow overloading +on the extern-"C"-ness of a function pointer. + +Chapter 26 Numerics +-------------------- +Headers: +C headers: , (also 18, 21, 25) + +Numeric components: Gabriel dos Reis's valarray, Drepper's complex, +and the few algorithms from the STL are "mostly done". Of course +optimization opportunities abound for the numerically literate. It +is not clear whether the valarray implementation really conforms +fully, in the assumptions it makes about aliasing (and lack thereof) +in its arguments. + +The C div() and ldiv() functions are interesting, because they are the +only case where a C library function returns a class object by value. +Since the C++ type div_t must be different from the underlying C type +(which is in the wrong namespace) the underlying functions div() and +ldiv() cannot be re-used efficiently. Fortunately they are trivial to +re-implement. + +Chapter 27 Iostreams +--------------------- +Headers: + +C headers: (also in 21) + +Iostream is currently in a very incomplete state. , , +ios_base, and basic_ios<> are "mostly complete". basic_streambuf<> and +basic_ostream<> are well along, but basic_istream<> has had little work +done. The standard stream objects, and have been +started; basic_filebuf<> "write" functions have been implemented just +enough to do "hello, world". + +Most of the istream and ostream operators << and >> (with the exception +of the op<<(integer) ones) have not been changed to use locale primitives, +sentry objects, or char_traits members. + +All these templates should be manually instantiated for char and +wchar_t in a way that links only used members into user programs. + +Streambuf is fertile ground for optimization extensions. An extended +interface giving iterator access to its internal buffer would be very +useful for other library components. + +Iostream operations (primarily operators << and >>) can take advantage +of the case where user code has not specified a locale, and bypass locale +operations entirely. The current implementation of op<::put, +for the integer types, demonstrates how they can cache encoding details +from the locale on each operation. There is lots more room for +optimization in this area. + +The definition of the relationship between the standard streams +cout et al. and stdout et al. requires something like a "stdiobuf". +The SGI solution of using double-indirection to actually use a +stdio FILE object for buffering is unsatisfactory, because it +interferes with peephole loop optimizations. + +The header work has begun. stringbuf can benefit from +friendship with basic_string<> and basic_string<>::_Rep to use +those objects directly as buffers, and avoid allocating and making +copies. + +The basic_filebuf<> template is a complex beast. It is specified to +use the locale facet codecvt<> to translate characters between native +files and the locale character encoding. In general this involves +two buffers, one of "char" representing the file and another of +"char_type", for the stream, with codecvt<> translating. The process +is complicated by the variable-length nature of the translation, and +the need to seek to corresponding places in the two representations. +For the case of basic_filebuf, when no translation is needed, +a single buffer suffices. A specialized filebuf can be used to reduce +code space overhead when no locale has been imbued. Matt Austern's +work at SGI will be useful, perhaps directly as a source of code, or +at least as an example to draw on. + +Filebuf, almost uniquely (cf. operator new), depends heavily on +underlying environmental facilities. In current releases iostream +depends fairly heavily on libio constant definitions, but it should +be made independent. It also depends on operating system primitives +for file operations. There is immense room for optimizations using +(e.g.) mmap for reading. The shadow/ directory wraps, besides the +standard C headers, the libio.h and unistd.h headers, for use mainly +by filebuf. These wrappings have not been completed, though there +is scaffolding in place. + +The encapulation of certain C header names presents an +interesting problem. It is possible to define an inline std::fprintf() +implemented in terms of the 'extern "C"' vfprintf(), but there is no +standard vfscanf() to use to implement std::fscanf(). It appears that +vfscanf but be re-implemented in C++ for targets where no vfscanf +extension has been defined. This is interesting in that it seems +to be the only significant case in the C library where this kind of +rewriting is necessary. (Of course Glibc provides the vfscanf() +extension.) (The functions related to exit() must be rewritten +for other reasons.) + + +Annex D +------- +Headers: + +Annex D defines many non-library features, and many minor +modifications to various headers, and a complete header. +It is "mostly done", except that the libstdc++-2 +header has not been adopted into the library, or checked to +verify that it matches the draft in those details that were +clarified by the committee. Certainly it must at least be +moved into the std namespace. + +We still need to wrap all the deprecated features in #if guards +so that pedantic compile modes can detect their use. + +Nonstandard Extensions +---------------------- +Headers: + (etc.) + +User code has come to depend on a variety of nonstandard components +that we must not omit. Much of this code can be adopted from +libstdc++-v2 or from the SGI STL. This particularly includes +, , and various SGI extensions such +as . Many of these are already placed in the +subdirectories ext/ and backward/. (Note that it is better to +include them via "" or "" than +to search the subdirectory itself via a "-I" directive. + diff --git a/libstdc++-v3/doc/html/17_intro/TODO b/libstdc++-v3/doc/html/17_intro/TODO new file mode 100644 index 00000000000..a0a257c4876 --- /dev/null +++ b/libstdc++-v3/doc/html/17_intro/TODO @@ -0,0 +1,164 @@ +std::allocator + + - persistent allocator + + - shared memory allocator (use or link to boost::shmem::allocator) + +std::string + + - document __gnu_cxx::__versa_string, add new policies + (Policy-based design incorporating COW + vs. deep copy issues, MT scalability + See Andrei Alexandrescu, June 2001, C/C++ Users Journal + "Generic: A Policy-Based basic_string Implementation" + http://www.cuj.com/documents/s=7994/cujcexp1906alexandr/) + + - operator!= and utility/rel_ops operators need to be made safe with + string and vector iterator classes. basic_string::reverse_iterator may + be implemented incorrectly, or need things like + operator==(__normal_iterator, const char*&), and swap(vector) + + - 'do the right thing' ctor fixing needs to be done for string. This + is still subject to some debate on the library issues list, so I + suggest punting till the dust clears. + + - fix template members of basic_string<> to overload iterators and + non-iterators properly. (This is the infamous hack as in vector<> etc + 23.1.1 para 10.) + +std::locale + + - implement __convert_to_v and __convert_from_v without "C" library + functions and and LANG environment variable dependencies. + + - use localedata to implement generic named (non-MT-safe) locales? + Figure out a way to use ICU data, like libjava? Re-package and use + the glibc localedata, even if we aren't on linux? Need a generic + locale model that does something besides the "C" locale. + + - make locale::classic() separate from named locale code. This will + improve the static linkage situation, but will require new + initialization code. In particular, we need lazy-initialization of + locale::classic(), and maybe the has_facet/use_facet functions for all + the required facets. The end goal is a self-contained + locale_init.cc, or one with transitive closure without the locale + instantiations (locale-inst.cc) or the named locale bits + (localename.cc). + + - Jerry(?)/Paolo(?) work on __float_to_char. + + - minimize ctype convertion in data facets, see numpunct/num_put/num_get + +std::basic_filebuf, 27_io + + - wfilebuf, get variable-encoding working and tested, including + positioning and seeking. (I think this may be done now) + + - wfilebuf testsuite (getting there...) + + - look ahead for unbuffered io, so know when multiple putc's can be + coalesced. + + - unlocked __basic_file + new mutext class + + - optimized the sentries for istream/ostream + + - v2 vs. v3 speed + + - add optimization hooks (esp. whitespace eating) to streambuf + - add _M_begin() and _M_end() to streambuf + - add algorithm specializations for [io]streambuf_iterator (copy find etc.) + +testsuite + + - valgrind hooks into make check so can tell memory leakage + Some commentary on the valgrind users list + + - add hooks for qmtest, pychart, other for visual diffs + + - automatic testing of interactive tests + + - diffing generated output files + + - provide testsuites for numerics. + + - make check-abi needs to have full symbol checking. Scope the LSB + testsuite, see what's going on with the typeinfo etc. bits. + + - try to do a better job of ABI testing, with instantiations of all + standard-specified types checked, not just exported symbols. + +g++/binutils + + - compression for wide versions of basic types, not just narrow + +threads + + - create MT abstraction layer for atomicity to pthreads. + + - solution for threads + C++. + +other/random + +- relocations, work on getting these down + +- issues with __builtin_memcpy and std::copy from Jerry Quinn + http://gcc.gnu.org/ml/libstdc++/2003-02/msg00056.html + http://gcc.gnu.org/ml/libstdc++/2003-02/msg00302.html + http://gcc.gnu.org/ml/gcc/2003-10/msg01305.html + +- fix dependency tracking for includes (.h, .tcc) during build process. + +- coordinate with "C" library people the "C" compatibility headers. + +- Think about naming all member data and member functions consistently + as per + funtions: _M_verb_adverb + data: _M_noun_adjective + +- A C++STYLE guide that deals with nested namespaces, and that +everybody can live with. + +- exception specifications need to be reviewed for all parts of the +library support and utility areas, particularly . Part of this is +a standards issue, where the 27_io standard is really in an odd +spot. Do the work to make this consistent. + +- C-related issues WRT to io and filepos, mbstate_t. Seeking in wide +streams. May need to define operators for mbstate_t so that +'mbstate_t& == mbstate_t' is something that can be done. + +- scoping/linking issues WRT to C structs need to be worked out. See +Nathan's commentary on cantrip, http://www.cantrip.org/cheaders.html + +- auto_ptr: seems to be some disagreement on what is +standards-conformant behavior, specially on conversion operators. + +- list::assignment operator needs const_cast + +- a cleaner division between pointers-to-value_type and true iterators +needs to be drawn throughout the entire STL implementation. + +- priority_queue conversions may be non-conformant + +- Protect valarray::result_type (not Standard) and make it work with + the various helper classes. + +- Make sure `valarray & == _Expr<_BinClos,bool>' + is defined + +- All of the Library working group closed issues need to be +addressed. Some of them proposed resolutions are already in the v-3 +sources, with macro-guards. Also, same with the TR. + +- need to think about doing a .texi or DocBook manual, instead of all +these HTML pages. In addition, it would be nice to have a full manual, +instead of a lot of ad-hoc pages. Weaknesses include numerics, locale, +and io. + +- add FAQ entries -- improve the install instructions + +- add HOWTO entries + +- do more doxygen manpages + diff --git a/libstdc++-v3/doc/html/17_intro/abi.html b/libstdc++-v3/doc/html/17_intro/abi.html new file mode 100644 index 00000000000..c27de61515c --- /dev/null +++ b/libstdc++-v3/doc/html/17_intro/abi.html @@ -0,0 +1,991 @@ + + + + + + + + + + Standard C++ Library ABI + + + + + + +

C++ Standard Library ABI

+ +

+ The latest version of this document is always available at + + http://gcc.gnu.org/onlinedocs/libstdc++/abi.html. +

+ +

+ To the libstdc++ homepage. +

+ + +
+

+ The C++ interface +

+ +

C++ applications often dependent on specific language support +routines, say for throwing exceptions, or catching exceptions, and +perhaps also dependent on features in the C++ Standard Library. +

+ +

The C++ Standard Library has many include files, types defined in +those include files, specific named functions, and other behavior. The +text of these behaviors, as written in source include files, is called +the Application Programing Interface, or API. +

+ +

Furthermore, C++ source that is compiled into object files is + transformed by the compiler: it arranges objects with specific + alignment and in a particular layout, mangling names according to a + well-defined algorithm, has specific arrangements for the support of + virtual functions, etc. These details are defined as the compiler + Application Binary Interface, or ABI. The GNU C++ compiler uses an + industry-standard C++ ABI starting with version 3. Details can be + found in the + ABI specification. +

+ +

+ The GNU C++ compiler, g++, has a compiler command line option to + switch between various different C++ ABIs. This explicit version + switch is the flag -fabi-version. In addition, some + g++ command line options may change the ABI as a side-effect of + use. Such flags include -fpack-struct and + -fno-exceptions, but include others: see the complete + list in the GCC manual under the heading Options + for Code Generation Conventions. +

+ +

The configure options used when building a specific libstdc++ +version may also impact the resulting library ABI. The available +configure options, and their impact on the library ABI, are documented + +here. +

+ +

Putting all of these ideas together results in the C++ Standard +library ABI, which is the compilation of a given library API by a +given compiler ABI. In a nutshell: +

+ + library API + compiler ABI = library ABI + +

+ The library ABI is mostly of interest for end-users who have + unresolved symbols and are linking dynamically to the C++ Standard + library, and who thus must be careful to compile their application + with a compiler that is compatible with the available C++ Standard + library binary. In this case, compatible is defined with the equation + above: given an application compiled with a given compiler ABI and + library API, it will work correctly with a Standard C++ Library + created with the same constraints. +

+ +

+ To use a specific version of the C++ ABI, one must use a + corresponding GNU C++ toolchain (Ie, g++ and libstdc++) that + implements the C++ ABI in question. +

+ +

+ Versioning +

+ +

The C++ interface has evolved throughout the history of the GNU +C++ toolchain. With each release, various details have been changed so +as to give distinct versions to the C++ interface. +

+ +
+ Goals of versioning +
+ +

Extending existing, stable ABIs. Versioning gives subsequent stable +releases series libraries the ability to add new symbols and add +functionality, all the while retaining backwards compatibility with +the previous releases in the series. Note: the reverse is not true. It +is not possible to take binaries linked with the latest version of a +release series (if symbols have been added) and expect the initial +release of the series to remain link compatible. +

+ +

Allows multiple, incompatible ABIs to coexist at the same time. +

+ +

+

+ +
+ Version History +
+

+ How can this complexity be managed? What does C++ versioning mean? + Because library and compiler changes often make binaries compiled + with one version of the GNU tools incompatible with binaries + compiled with other (either newer or older) versions of the same GNU + tools, specific techniques are used to make managing this complexity + easier. +

+ +

+ The following techniques are used: +

+ +
    + +
  • Release versioning on the libgcc_s.so binary. This is +implemented via file names and the ELF DT_SONAME mechanism (at least +on ELF systems).

    + +

    It is versioned as follows: +

    +
      +
    • gcc-3.0.0: libgcc_s.so.1
    • +
    • gcc-3.0.1: libgcc_s.so.1
    • +
    • gcc-3.0.2: libgcc_s.so.1
    • +
    • gcc-3.0.3: libgcc_s.so.1
    • +
    • gcc-3.0.4: libgcc_s.so.1
    • +
    • gcc-3.1.0: libgcc_s.so.1
    • +
    • gcc-3.1.1: libgcc_s.so.1
    • +
    • gcc-3.2.0: libgcc_s.so.1
    • +
    • gcc-3.2.1: libgcc_s.so.1
    • +
    • gcc-3.2.2: libgcc_s.so.1
    • +
    • gcc-3.2.3: libgcc_s.so.1
    • +
    • gcc-3.3.0: libgcc_s.so.1
    • +
    • gcc-3.3.1: libgcc_s.so.1
    • +
    • gcc-3.3.2: libgcc_s.so.1
    • +
    • gcc-3.3.3: libgcc_s.so.1
    • +
    • gcc-3.4.x, gcc-4.0.x, gcc-4.1.x, gcc-4.2.x: on m68k-linux and + hppa-linux this is either libgcc_s.so.1 (when configuring + --with-sjlj-exceptions) or libgcc_s.so.2. For all + others, this is libgcc_s.so.1.
    +

    +
  • + +
  • Symbol versioning on the libgcc_s.so binary. +

    mapfile: gcc/libgcc-std.ver

    + +

    It is versioned with the following labels and version + definitions, where the version definition is the maximum for a + particular release. Labels are cumulative. If a particular release + is not listed, it has the same version labels as the preceeding + release.

    +
      +
    • gcc-3.0.0: GCC_3.0
    • +
    • gcc-3.3.0: GCC_3.3
    • +
    • gcc-3.3.1: GCC_3.3.1
    • +
    • gcc-3.3.2: GCC_3.3.2
    • +
    • gcc-3.3.4: GCC_3.3.4
    • +
    • gcc-3.4.0: GCC_3.4
    • +
    • gcc-3.4.2: GCC_3.4.2
    • +
    • gcc-3.4.4: GCC_3.4.4
    • +
    • gcc-4.0.0: GCC_4.0.0
    • +
    • gcc-4.1.0: GCC_4.1.0
    • +
    • gcc-4.2.0: GCC_4.2.0
    • +
    +

    +
  • + +
  • Release versioning on the libstdc++.so binary, implemented in the same was as the libgcc_s.so binary, above. + +

    It is versioned as follows: +

    +
      +
    • gcc-3.0.0: libstdc++.so.3.0.0
    • +
    • gcc-3.0.1: libstdc++.so.3.0.1
    • +
    • gcc-3.0.2: libstdc++.so.3.0.2
    • +
    • gcc-3.0.3: libstdc++.so.3.0.2 (Error should be libstdc++.so.3.0.3)
    • +
    • gcc-3.0.4: libstdc++.so.3.0.4
    • +
    • gcc-3.1.0: libstdc++.so.4.0.0
    • +
    • gcc-3.1.1: libstdc++.so.4.0.1
    • +
    • gcc-3.2.0: libstdc++.so.5.0.0
    • +
    • gcc-3.2.1: libstdc++.so.5.0.1
    • +
    • gcc-3.2.2: libstdc++.so.5.0.2
    • +
    • gcc-3.2.3: libstdc++.so.5.0.3 (Not strictly required)
    • +
    • gcc-3.3.0: libstdc++.so.5.0.4
    • +
    • gcc-3.3.1: libstdc++.so.5.0.5
    • +
    • gcc-3.3.2: libstdc++.so.5.0.5
    • +
    • gcc-3.3.3: libstdc++.so.5.0.5
    • +
    • gcc-3.4.0: libstdc++.so.6.0.0
    • +
    • gcc-3.4.1: libstdc++.so.6.0.1
    • +
    • gcc-3.4.2: libstdc++.so.6.0.2
    • +
    • gcc-3.4.3: libstdc++.so.6.0.3
    • +
    • gcc-3.4.4: libstdc++.so.6.0.3
    • +
    • gcc-3.4.5: libstdc++.so.6.0.3
    • +
    • gcc-3.4.6: libstdc++.so.6.0.3
    • +
    • gcc-4.0.0: libstdc++.so.6.0.4
    • +
    • gcc-4.0.1: libstdc++.so.6.0.5
    • +
    • gcc-4.0.2: libstdc++.so.6.0.6
    • +
    • gcc-4.0.3: libstdc++.so.6.0.7
    • +
    • gcc-4.1.0: libstdc++.so.6.0.7
    • +
    • gcc-4.1.1: libstdc++.so.6.0.8
    • +
    • gcc-4.1.2: libstdc++.so.6.0.8
    • +
    • gcc-4.2.0: libstdc++.so.6.0.9
    • +
    +

    +
  • + +
  • Symbol versioning on the libstdc++.so binary. + +

    mapfile: libstdc++/config/linker-map.gnu

    +

    It is versioned with the following labels and version + definitions, where the version definition is the maximum for a + particular release. Note, only symbol which are newly introduced + will use the maximum version definition. Thus, for release series + with the same label, but incremented version definitions, the later + release has both versions. (An example of this would be the + gcc-3.2.1 release, which has GLIBCPP_3.2.1 for new symbols and + GLIBCPP_3.2 for symbols that were introduced in the gcc-3.2.0 + release.) If a particular release is not listed, it has the same + version labels as the preceeding release. +

    +
      +
    • gcc-3.0.0: (Error, not versioned)
    • +
    • gcc-3.0.1: (Error, not versioned)
    • +
    • gcc-3.0.2: (Error, not versioned)
    • +
    • gcc-3.0.3: (Error, not versioned)
    • +
    • gcc-3.0.4: (Error, not versioned)
    • +
    • gcc-3.1.0: GLIBCPP_3.1, CXXABI_1
    • +
    • gcc-3.1.1: GLIBCPP_3.1, CXXABI_1
    • +
    • gcc-3.2.0: GLIBCPP_3.2, CXXABI_1.2
    • +
    • gcc-3.2.1: GLIBCPP_3.2.1, CXXABI_1.2
    • +
    • gcc-3.2.2: GLIBCPP_3.2.2, CXXABI_1.2
    • +
    • gcc-3.2.3: GLIBCPP_3.2.2, CXXABI_1.2
    • +
    • gcc-3.3.0: GLIBCPP_3.2.2, CXXABI_1.2.1
    • +
    • gcc-3.3.1: GLIBCPP_3.2.3, CXXABI_1.2.1
    • +
    • gcc-3.3.2: GLIBCPP_3.2.3, CXXABI_1.2.1
    • +
    • gcc-3.3.3: GLIBCPP_3.2.3, CXXABI_1.2.1
    • +
    • gcc-3.4.0: GLIBCXX_3.4, CXXABI_1.3
    • +
    • gcc-3.4.1: GLIBCXX_3.4.1, CXXABI_1.3
    • +
    • gcc-3.4.2: GLIBCXX_3.4.2
    • +
    • gcc-3.4.3: GLIBCXX_3.4.3
    • +
    • gcc-4.0.0: GLIBCXX_3.4.4, CXXABI_1.3.1
    • +
    • gcc-4.0.1: GLIBCXX_3.4.5
    • +
    • gcc-4.0.2: GLIBCXX_3.4.6
    • +
    • gcc-4.0.3: GLIBCXX_3.4.7
    • +
    • gcc-4.1.1: GLIBCXX_3.4.8
    • +
    • gcc-4.2.0: GLIBCXX_3.4.9
    • +
    +

    +
  • + +
  • +

    Incremental bumping of a compiler pre-defined macro, + __GXX_ABI_VERSION. This macro is defined as the version of the + compiler v3 ABI, with g++ 3.0.x being version 100. This macro will + be automatically defined whenever g++ is used (the curious can + test this by invoking g++ with the '-v' flag.) +

    + +

    + This macro was defined in the file "lang-specs.h" in the gcc/cp directory. + Later versions defined it in "c-common.c" in the gcc directory, and from + G++ 3.4 it is defined in c-cppbuiltin.c and its value determined by the + '-fabi-version' command line option. +

    + +

    + It is versioned as follows, where 'n' is given by '-fabi-version=n': +

    +
      +
    • gcc-3.0.x: 100
    • +
    • gcc-3.1.x: 100 (Error, should be 101)
    • +
    • gcc-3.2.x: 102
    • +
    • gcc-3.3.x: 102
    • +
    • gcc-3.4.x, gcc-4.0.x, gcc-4.1.x, gcc-4.2.x: 102 (when n=1)
    • +
    • gcc-3.4.x, gcc-4.0.x, gcc-4.1.x, gcc-4.2.x: 1000 + n (when n>1)
    • +
    • gcc-3.4.x, gcc-4.0.x, gcc-4.1.x, gcc-4.2.x: 999999 (when n=0)
    • +
    +

    +
  • + +
  • +

    Changes to the default compiler option for + -fabi-version. +

    +

    + It is versioned as follows: +

    +
      +
    • gcc-3.0.x: (Error, not versioned)
    • +
    • gcc-3.1.x: (Error, not versioned)
    • +
    • gcc-3.2.x: -fabi-version=1
    • +
    • gcc-3.3.x: -fabi-version=1
    • +
    • gcc-3.4.x, gcc-4.0.x, gcc-4.1.x, gcc-4.2.x: -fabi-version=2
    • +
    +

    +
  • + +
  • +

    Incremental bumping of a library pre-defined macro. For releases + before 3.4.0, the macro is __GLIBCPP__. For later releases, it's + __GLIBCXX__. (The libstdc++ project generously changed from CPP to + CXX throughout its source to allow the "C" pre-processor the CPP + macro namespace.) These macros are defined as the date the library + was released, in compressed ISO date format, as an unsigned long. +

    + +

    + This macro is defined in the file "c++config" in the + "libstdc++/include/bits" directory. (Up to gcc-4.1.0, it was + changed every night by an automated script. Since gcc-4.1.0, it is + the same value as gcc/DATESTAMP.) +

    +

    + It is versioned as follows: +

    +
      +
    • gcc-3.0.0: 20010615
    • +
    • gcc-3.0.1: 20010819
    • +
    • gcc-3.0.2: 20011023
    • +
    • gcc-3.0.3: 20011220
    • +
    • gcc-3.0.4: 20020220
    • +
    • gcc-3.1.0: 20020514
    • +
    • gcc-3.1.1: 20020725
    • +
    • gcc-3.2.0: 20020814
    • +
    • gcc-3.2.1: 20021119
    • +
    • gcc-3.2.2: 20030205
    • +
    • gcc-3.2.3: 20030422
    • +
    • gcc-3.3.0: 20030513
    • +
    • gcc-3.3.1: 20030804
    • +
    • gcc-3.3.2: 20031016
    • +
    • gcc-3.3.3: 20040214
    • +
    • gcc-3.4.0: 20040419
    • +
    • gcc-3.4.1: 20040701
    • +
    • gcc-3.4.2: 20040906
    • +
    • gcc-3.4.3: 20041105
    • +
    • gcc-3.4.4: 20050519
    • +
    • gcc-3.4.5: 20051201
    • +
    • gcc-3.4.6: 20060306
    • +
    • gcc-4.0.0: 20050421
    • +
    • gcc-4.0.1: 20050707
    • +
    • gcc-4.0.2: 20050921
    • +
    • gcc-4.0.3: 20060309
    • +
    • gcc-4.1.0: 20060228
    • +
    • gcc-4.1.1: 20060524
    • +
    • gcc-4.1.2: 20070214
    • +
    • gcc-4.2.0: 20070514
    • +
    +

    +
  • + +
  • +

    + Incremental bumping of a library pre-defined macro, + _GLIBCPP_VERSION. This macro is defined as the released version of + the library, as a string literal. This is only implemented in + gcc-3.1.0 releases and higher, and is deprecated in 3.4 (where it + is called _GLIBCXX_VERSION). +

    + +

    + This macro is defined in the file "c++config" in the + "libstdc++/include/bits" directory and is generated + automatically by autoconf as part of the configure-time generation + of config.h. +

    + +

    + It is versioned as follows: +

    +
      +
    • gcc-3.0.0: "3.0.0"
    • +
    • gcc-3.0.1: "3.0.0" (Error, should be "3.0.1")
    • +
    • gcc-3.0.2: "3.0.0" (Error, should be "3.0.2")
    • +
    • gcc-3.0.3: "3.0.0" (Error, should be "3.0.3")
    • +
    • gcc-3.0.4: "3.0.0" (Error, should be "3.0.4")
    • +
    • gcc-3.1.0: "3.1.0"
    • +
    • gcc-3.1.1: "3.1.1"
    • +
    • gcc-3.2.0: "3.2"
    • +
    • gcc-3.2.1: "3.2.1"
    • +
    • gcc-3.2.2: "3.2.2"
    • +
    • gcc-3.2.3: "3.2.3"
    • +
    • gcc-3.3.0: "3.3"
    • +
    • gcc-3.3.1: "3.3.1"
    • +
    • gcc-3.3.2: "3.3.2"
    • +
    • gcc-3.3.3: "3.3.3"
    • +
    • gcc-3.4.x: "version-unused"
    • +
    • gcc-4.0.x: "version-unused"
    • +
    • gcc-4.1.x: "version-unused"
    • +
    • gcc-4.2.x: "version-unused"
    • +
    +

    +
  • + +
  • +

    + Matching each specific C++ compiler release to a specific set of + C++ include files. This is only implemented in gcc-3.1.1 releases + and higher. +

    +

    + All C++ includes are installed in include/c++, then nest in a + directory hierarchy corresponding to the C++ compiler's released + version. This version corresponds to the variable "gcc_version" in + "libstdc++/acinclude.m4," and more details can be found in that + file's macro GLIBCXX_CONFIGURE (GLIBCPP_CONFIGURE before gcc-3.4.0). +

    +

    + C++ includes are versioned as follows: +

    +
      +
    • gcc-3.0.0: include/g++-v3
    • +
    • gcc-3.0.1: include/g++-v3
    • +
    • gcc-3.0.2: include/g++-v3
    • +
    • gcc-3.0.3: include/g++-v3
    • +
    • gcc-3.0.4: include/g++-v3
    • +
    • gcc-3.1.0: include/g++-v3
    • +
    • gcc-3.1.1: include/c++/3.1.1
    • +
    • gcc-3.2.0: include/c++/3.2
    • +
    • gcc-3.2.1: include/c++/3.2.1
    • +
    • gcc-3.2.2: include/c++/3.2.2
    • +
    • gcc-3.2.3: include/c++/3.2.3
    • +
    • gcc-3.3.0: include/c++/3.3
    • +
    • gcc-3.3.1: include/c++/3.3.1
    • +
    • gcc-3.3.2: include/c++/3.3.2
    • +
    • gcc-3.3.3: include/c++/3.3.3
    • +
    • gcc-3.4.0: include/c++/3.4.0
    • +
    • gcc-3.4.1: include/c++/3.4.1
    • +
    • gcc-3.4.2: include/c++/3.4.2
    • +
    • gcc-3.4.3: include/c++/3.4.3
    • +
    • gcc-3.4.4: include/c++/3.4.4
    • +
    • gcc-3.4.5: include/c++/3.4.5
    • +
    • gcc-3.4.6: include/c++/3.4.6
    • +
    • gcc-4.0.0: include/c++/4.0.0
    • +
    • gcc-4.0.1: include/c++/4.0.1
    • +
    • gcc-4.0.2: include/c++/4.0.2
    • +
    • gcc-4.0.3: include/c++/4.0.3
    • +
    • gcc-4.1.0: include/c++/4.1.0
    • +
    • gcc-4.1.1: include/c++/4.1.1
    • +
    • gcc-4.1.2: include/c++/4.1.2
    • +
    • gcc-4.2.0: include/c++/4.2.0
    • +
    +

    +
  • +
+

+ Taken together, these techniques can accurately specify interface + and implementation changes in the GNU C++ tools themselves. Used + properly, they allow both the GNU C++ tools implementation, and + programs using them, an evolving yet controlled development that + maintains backward compatibility. +

+ + + +
+ Minimum requirements for a versioned ABI +
+

+ Minimum environment that supports a versioned ABI: A supported + dynamic linker, a GNU linker of sufficient vintage to understand + demangled C++ name globbing (ld), a shared executable compiled with + g++, and shared libraries (libgcc_s, libstdc++) compiled by a + compiler (g++) with a compatible ABI. Phew. +

+ +

+ On top of all that, an additional constraint: libstdc++ did not + attempt to version symbols (or age gracefully, really) until version + 3.1.0. +

+ +

+ Most modern Linux and BSD versions, particularly ones using + gcc-3.1.x tools and more recent vintages, will meet the requirements above. +

+ + +
+ What configure options impact symbol versioning? +
+

+ It turns out that most of the configure options that change default + behavior will impact the mangled names of exported symbols, and thus + impact versioning and compatibility. +

+ +

+ For more information on configure options, including ABI impacts, see: + http://gcc.gnu.org/onlinedocs/libstdc++/configopts.html +

+ +

+ There is one flag that explicitly deals with symbol versioning: + --enable-symvers. +

+ +

+ In particular, libstdc++/acinclude.m4 has a macro called + GLIBCXX_ENABLE_SYMVERS that defaults to yes (or the argument passed + in via --enable-symvers=foo). At that point, the macro attempts to + make sure that all the requirement for symbol versioning are in + place. For more information, please consult acinclude.m4. +

+ + +
+ How to tell if symbol versioning is, indeed, active? +
+

+ When the GNU C++ library is being built with symbol versioning on, + you should see the following at configure time for libstdc++: +

+ + + checking versioning on shared library symbols... gnu + +

+ If you don't see this line in the configure output, or if this line + appears but the last word is 'no', then you are out of luck. +

+ +

+ If the compiler is pre-installed, a quick way to test is to compile + the following (or any) simple C++ file and link it to the shared + libstdc++ library: +

+ +
+#include <iostream>
+
+int main()
+{ std::cout << "hello" << std::endl; return 0; }
+
+%g++ hello.cc -o hello.out
+
+%ldd hello.out
+        libstdc++.so.5 => /usr/lib/libstdc++.so.5 (0x00764000)
+        libm.so.6 => /lib/tls/libm.so.6 (0x004a8000)
+        libgcc_s.so.1 => /mnt/hd/bld/gcc/gcc/libgcc_s.so.1 (0x40016000)
+        libc.so.6 => /lib/tls/libc.so.6 (0x0036d000)
+        /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x00355000)
+
+%nm hello.out
+
+ +

+If you see symbols in the resulting output with "GLIBCXX_3" as part +of the name, then the executable is versioned. Here's an example: +

+ + U _ZNSt8ios_base4InitC1Ev@@GLIBCXX_3.4 + +

+ Library allowed ABI changes +

+

+The following will cause the library minor version number to +increase, say from "libstdc++.so.3.0.4" to "libstdc++.so.3.0.5". +

+
    +
  • adding an exported global or static data member
  • +
  • adding an exported function, static or non-virtual member function
  • +
  • adding an exported symbol or symbols by additional instantiations
  • +
+

+

+

+Other allowed changes are possible. +

+ + +

+ Library disallowed ABI changes +

+ +

+The following non-exhaustive list will cause the library major version +number to increase, say from "libstdc++.so.3.0.4" to +"libstdc++.so.4.0.0". +

+
    +
  • changes in the gcc/g++ compiler ABI
  • +
  • changing size of an exported symbol
  • +
  • changing alignment of an exported symbol
  • +
  • changing the layout of an exported symbol
  • +
  • changing mangling on an exported symbol
  • +
  • deleting an exported symbol
  • +
  • changing the inheritance properties of a type by adding or removing + base classes
  • +
  • + changing the size, alignment, or layout of types + specified in the C++ standard. These may not necessarily be + instantiated or otherwise exported in the library binary, and + include all the required locale facets, as well as things like + std::basic_streambuf, et al. +
  • + +
  • adding an explicit copy constructor or destructor to a +class that would otherwise have implicit versions. This will change +the way the compiler deals with this class in by-value return +statements or parameters: instead of being passing instances of this +class in registers, the compiler will be forced to use memory. See this part + of the C++ ABI documentation for further details. +
  • + +
+ +

+ Library implementation strategy

+ +
    +
  • Separation of interface and implementation +

    This is accomplished by two techniques that separate the API from +the ABI: forcing undefined references to link against a library binary +for definitions. +

    + +
    +
    Include files have declarations, source files have defines
    + +
    For non-templatized types, such as much of class + locale, the appropriate standard C++ include, say + locale, can contain full declarations, while various + source files (say locale.cc, locale_init.cc, + localename.cc) contain definitions.
    + +
    Extern template on required types
    + +
    For parts of the standard that have an explicit list of required + instantiations, the GNU extension syntax extern template + can be used to control where template definitions + reside. By marking required instantiations as extern + template in include files, and providing explicit + instantiations in the appropriate instantiation files, non-inlined + template functions can be versioned. This technique is mostly used + on parts of the standard that require char and + wchar_t instantiations, and includes + basic_string, the locale facets, and the types in + iostreams.
    + +
    +

    In addition, these techniques have the additional benefit that + they reduce binary size, which can increase runtime performance. +

    +
  • + +
  • Namespaces linking symbol definitions to export mapfiles + +

    All symbols in the shared library binary are processed by a linker +script at build time that either allows or disallows external +linkage. Because of this, some symbols, regardless of normal C/C++ +linkage, are not visible. Symbols that are internal have several +appealing characteristics: by not exporting the symbols, there are no +relocations when the shared library is started and thus this makes for +faster runtime loading performance by the underlying dynamic loading +mechanism. In addition, they have the possibility of changing without +impacting ABI compatibility. +

    + +

    The following namespaces are transformed by the mapfile:

    + +
    +
    namespace std
    +
    Defaults to exporting all symbols in label +GLIBCXX that do not begin with an underscore, ie +__test_func would not be exported by default. Select +exceptional symbols are allowed to be visible.
    + +
    namespace __gnu_cxx
    +
    Defaults to not exporting any symbols in label +GLIBCXX, select items are allowed to be visible.
    + +
    namespace __gnu_internal
    +
    Defaults to not exported, no items are allowed to be visible.
    + +
    namespace __cxxabiv1, aliased to namespace abi
    +
    Defaults to not exporting any symbols in label +CXXABI, select items are allowed to be visible.
    +
    +

    +

    +
  • + +
  • Freezing the API +

    Disallowed changes, as above, are not made on a stable release +branch. Enforcement tends to be less strict with GNU extensions that +standard includes.

    +
  • +
+ +

+ Testing ABI changes +

+ +

+Testing for GNU C++ ABI changes is composed of two distinct areas: +testing the C++ compiler (g++) for compiler changes, and testing the +C++ library (libstdc++) for library changes. +

+ +

+Testing the C++ compiler ABI can be done various ways. +

+ +

+One. +Intel ABI checker. More information can be obtained +here. +

+ +

+Two. +The second is yet unreleased, but has been announced on the gcc +mailing list. It is yet unspecified if these tools will be freely +available, and able to be included in a GNU project. Please contact +Mark Mitchell (mark@codesourcery.com) for more details, and current +status. +

+ +

+Three. +Involves using the vlad.consistency test framework. This has also been +discussed on the gcc mailing lists. +

+ +

+Testing the C++ library ABI can also be done various ways. +

+ +

+One. +(Brendan Kehoe, Jeff Law suggestion to run 'make check-c++' two ways, +one with a new compiler and an old library, and the other with an old +compiler and a new library, and look for testsuite regressions) +

+ +

+Details on how to set this kind of test up can be found here: +http://gcc.gnu.org/ml/gcc/2002-08/msg00142.html +

+ +

+Two. +Use the 'make check-abi' rule in the libstdc++ Makefile. +

+ +

+This is a proactive check the library ABI. Currently, exported symbol +names that are either weak or defined are checked against a last known +good baseline. Currently, this baseline is keyed off of 3.4.0 +binaries, as this was the last time the .so number was incremented. In +addition, all exported names are demangled, and the exported objects +are checked to make sure they are the same size as the same object in +the baseline. + +Notice that each baseline is relative to a default +configured library and compiler: in particular, if options such as +--enable-clocale, or --with-cpu, in case of multilibs, are used at +configure time, the check may fail, either because of substantive +differences or because of limitations of the current checking +machinery. +

+ +

+This dataset is insufficient, yet a start. Also needed is a +comprehensive check for all user-visible types part of the standard +library for sizeof() and alignof() changes. +

+ +

+Verifying compatible layouts of objects is not even attempted. It +should be possible to use sizeof, alignof, and offsetof to compute +offsets for each structure and type in the standard library, saving to +another datafile. Then, compute this in a similar way for new +binaries, and look for differences. +

+ +

+Another approach might be to use the -fdump-class-hierarchy flag to +get information. However, currently this approach gives insufficient +data for use in library testing, as class data members, their offsets, +and other detailed data is not displayed with this flag. +(See g++/7470 on how this was used to find bugs.) +

+ +

+Perhaps there are other C++ ABI checkers. If so, please notify +us. We'd like to know about them! +

+ +

+ Testing Multi-ABI binaries +

+ +

+A "C" application, dynamically linked to two shared libraries, liba, +libb. The dependent library liba is C++ shared library compiled with +gcc-3.3.x, and uses io, exceptions, locale, etc. The dependent library +libb is a C++ shared library compiled with gcc-3.4.x, and also uses io, +exceptions, locale, etc. +

+ +

As above, libone is constructed as follows:

+
+%$bld/H-x86-gcc-3.4.0/bin/g++ -fPIC -DPIC -c a.cc
+
+%$bld/H-x86-gcc-3.4.0/bin/g++ -shared -Wl,-soname -Wl,libone.so.1 -Wl,-O1 -Wl,-z,defs a.o -o libone.so.1.0.0
+
+%ln -s libone.so.1.0.0 libone.so
+
+%$bld/H-x86-gcc-3.4.0/bin/g++ -c a.cc
+
+%ar cru libone.a a.o 
+
+ +

And, libtwo is constructed as follows:

+ +
+%$bld/H-x86-gcc-3.3.3/bin/g++ -fPIC -DPIC -c b.cc
+
+%$bld/H-x86-gcc-3.3.3/bin/g++ -shared -Wl,-soname -Wl,libtwo.so.1 -Wl,-O1 -Wl,-z,defs b.o -o libtwo.so.1.0.0
+
+%ln -s libtwo.so.1.0.0 libtwo.so
+
+%$bld/H-x86-gcc-3.3.3/bin/g++ -c b.cc
+
+%ar cru libtwo.a b.o 
+
+ +

...with the resulting libraries looking like

+
+%ldd libone.so.1.0.0
+        libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x40016000)
+        libm.so.6 => /lib/tls/libm.so.6 (0x400fa000)
+        libgcc_s.so.1 => /mnt/hd/bld/gcc/gcc/libgcc_s.so.1 (0x4011c000)
+        libc.so.6 => /lib/tls/libc.so.6 (0x40125000)
+        /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x00355000)
+
+%ldd libtwo.so.1.0.0
+        libstdc++.so.5 => /usr/lib/libstdc++.so.5 (0x40027000)
+        libm.so.6 => /lib/tls/libm.so.6 (0x400e1000)
+        libgcc_s.so.1 => /mnt/hd/bld/gcc/gcc/libgcc_s.so.1 (0x40103000)
+        libc.so.6 => /lib/tls/libc.so.6 (0x4010c000)
+        /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x00355000)
+
+
+ +

Then, the "C" compiler is used to compile a source file that uses +functions from each library.

+
+gcc test.c -g -O2 -L. -lone -ltwo /usr/lib/libstdc++.so.5 /usr/lib/libstdc++.so.6
+
+ +

+Which gives the expected: +

+
+%ldd a.out
+        libstdc++.so.5 => /usr/lib/libstdc++.so.5 (0x00764000)
+        libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x40015000)
+        libc.so.6 => /lib/tls/libc.so.6 (0x0036d000)
+        libm.so.6 => /lib/tls/libm.so.6 (0x004a8000)
+        libgcc_s.so.1 => /mnt/hd/bld/gcc/gcc/libgcc_s.so.1 (0x400e5000)
+        /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x00355000)
+
+ +

+This resulting binary, when executed, will be able to safely use code +from both liba, and the dependent libstdc++.so.6, and libb, with the +dependent libstdc++.so.5. +

+ + +

+ Outstanding Issues +

+ +

Some features in the C++ language make versioning especially +difficult. In particular, compiler generated constructs such as +implicit instantiations for templates, typeinfo information, and +virtual tables all may cause ABI leakage across shared library +boundaries. Because of this, mixing C++ ABI's is not recommended at +this time. +

+ +

For more background on this issue, see these bugzilla entries:

+ +

+24660: versioning weak symbols in libstdc++ +

+ +

+19664: libstdc++ headers should have pop/push of the visibility around the declarations +

+ +

+ Bibliography / Further Reading +

+ +

+ABIcheck, a vague idea of checking ABI compatibility +
+http://abicheck.sourceforge.net/ +

+ +

+C++ ABI reference +
+http://www.codesourcery.com/cxx-abi/ +

+ +

+Intel ABI documentation, "Intel® Compilers for Linux* -Compatibility with the GNU Compilers" +
+http://developer.intel.com/software/products/compilers/techtopics/LinuxCompilersCompatibility.htm +

+ +

+Sun Solaris 2.9 docs +
+Linker and Libraries Guide (document 816-1386) +
+C++ Migration Guide (document 816-2459) +
+http://docs.sun.com/db/prod/solaris.9 +
+http://docs.sun.com/?p=/doc/816-1386&a=load +

+ +

+Ulrich Drepper, "ELF Symbol Versioning" +
+http://people.redhat.com/drepper/symbol-versioning +

+ +

+C++ ABI for the ARM Architecture +
+http://www.arm.com/miscPDFs/8033.pdf +

+ +

+Benjamin Kosnik, ISO C++ J16/06-0046 +
+Dynamic Shared Objects: Survey and Issues +

+ +

+Benjamin Kosnik, ISO C++ J16/06-0083 +
+Versioning With Namespaces +

+ + + + diff --git a/libstdc++-v3/doc/html/17_intro/api.html b/libstdc++-v3/doc/html/17_intro/api.html new file mode 100644 index 00000000000..1d1e36d90d2 --- /dev/null +++ b/libstdc++-v3/doc/html/17_intro/api.html @@ -0,0 +1,290 @@ + + + + + + + + + + API Evolution and Deprecation History + + + + + + +

API Evolution and Deprecation History

+ +

+ The latest version of this document is always available at + + http://gcc.gnu.org/onlinedocs/libstdc++/17_intro/api.html. +

+ +

+ To the libstdc++ homepage. +

+ + + +
+

+ API Evolution, Deprecation, and History of User Visible Changes +

+ +

A list of user-visible changes, by release version. +

+ +

+ 3.0 +

+ +

+Extensions moved to include/ext. +

+ +

+Include files from the SGI/HP sources that pre-date the ISO standard +are added. These files are placed into +the include/backward directory and a deprecated warning +is added that notifies on inclusion (-Wno-deprecated +deactivates the warning.) +

+ +

Deprecated include <backward/strstream> added.

+ +

Removal of include <builtinbuf.h>, <indstream.h>, <parsestream.h>, <PlotFile.h>, <SFile.h>, <stdiostream.h>, and <stream.h>.

+ + +

+ 3.1 +

+ +

+Extensions from SGI/HP moved from namespace std +to namespace __gnu_cxx. As part of this, the following +new includes are +added: <ext/algorithm>, <ext/functional>, <ext/iterator>, <ext/memory>, and <ext/numeric>. +

+ +

+Extensions to basic_filebuf introduced: __gnu_cxx::enc_filebuf, and __gnu_cxx::stdio_filebuf. +

+ +

+Extensions to tree data structures added in <ext/rb_tree>. +

+ +

+Removal of <ext/tree>, moved to <backward/tree.h>. +

+ + +

+ 3.2 +

+

Symbol versioning introduced for shared library.

+ +

Removal of include <backward/strstream.h>.

+ +

+ 3.3 +

+

Allocator changes. Change __malloc_alloc to malloc_allocator and __new_alloc to new_allocator.

+ +

Error handling in iostreams cleaned up, made consistent.

+ + +

+ 3.4 +

+

+Large file support. +

+ +

Extensions for generic characters and char_traits added in <ext/pod_char_traits.h>. +

+ +

+Support for wchar_t specializations of basic_filebuf enhanced to support UTF-8 and Unicode, depending on host. More hosts support basic wchar_t functionality. +

+ +

+Support for char_traits beyond builtin types. +

+ +

+Conformant allocator class and usage in containers. As +part of this, the following extensions are +added: <ext/bitmap_allocator.h>, <ext/debug_allocator.h>, <ext/mt_allocator.h>, <ext/malloc_allocator.h>,<ext/new_allocator.h>, <ext/pool_allocator.h>. +

+ + +

+Debug mode first appears. +

+ +

+PCH support. +

+ +

+Macro guard for libstdc++ changed, from _GLIBCPP_ to _GLIBCXX_. +

+ +

+Extension <ext/stdio_sync_filebuf.h> added. +

+ +

+Extension <ext/demangle.h> added. +

+ + +

+ 4.0 +

+

+TR1 features first appear. +

+ +

+Extension allocator <ext/array_allocator.h> added. +

+ +

+Extension codecvt specializations moved to <ext/codecvt_specializations.h>. +

+ +

+Removal of <ext/demangle.h>. +

+ + +

+ 4.1 +

+ +

+Removal of <cassert> from all standard headers: now has to be explicitly included for std::assert calls. +

+ +

Extensions for policy-based data structures first added. New includes, +types, namespace pb_assoc. +

+ + + +

Extensions for typelists added in <ext/typelist.h>. +

+ +

Extension for policy-based basic_string first added: __gnu_cxx::__versa_string in <ext/vstring.h>. +

+ +

+ 4.2 +

+ +

Default visibility attributes applied to namespace std. Support for -fvisibility. +

+ +

TR1 <random>, <complex>, and C compatibility headers added.

+ +

Extensions for concurrent programming consolidated +into <ext/concurrence.h> and <ext/atomicity.h>, +including change of namespace to __gnu_cxx in some +cases. Added types +include _Lock_policy, __concurrence_lock_error, __concurrence_unlock_error, __mutex, __scoped_lock.

+ +

Extensions for type traits consolidated +into <ext/type_traits.h>. Additional traits are added +(__conditional_type, __enable_if, others.) +

+ +

Extensions for policy-based data structures revised. New includes, +types, namespace moved to __pb_ds. +

+ +

Extensions for debug mode modified: now nested in namespace +std::__debug and extensions in namespace +__gnu_cxx::__debug.

+ +

Extensions added: <ext/typelist.h> +and <ext/throw_allocator.h>. +

+ +

+ 4.3 +

+ +

+C++0X features first appear. +

+ +

TR1 <regex> and <cmath>'s mathematical special function added.

+ +

+Backward include edit. +

+
    +
  • Removed: <algobase.h> <algo.h> <alloc.h> <bvector.h> <complex.h> +defalloc.h> <deque.h> <fstream.h> <function.h> <hash_map.h> <hash_set.h> +hashtable.h> <heap.h> <iomanip.h> <iostream.h> <istream.h> <iterator.h> +list.h> <map.h> <multimap.h> <multiset.h> <new.h> <ostream.h> <pair.h> <queue.h> <rope.h> <set.h> <slist.h> <stack.h> <streambuf.h> <stream.h> <tempbuf.h> +<tree.h> <vector.h> +
  • +
  • Added: <hash_map> and <hash_set>
  • +
  • Added in C++0x: <auto_ptr.h> and <binders.h>
  • +
+ +

+Header dependency streamlining. +

+ +
    +
  • <algorithm> no longer includes <climits>, <cstring>, or <iosfwd>
  • +
  • <bitset> no longer includes <istream> or <ostream>, adds <iosfwd>
  • +
  • <functional> no longer includes <cstddef>
  • +
  • <iomanip> no longer includes <istream>, <istream>, or <functional>, adds <ioswd>
  • +
  • <numeric> no longer includes <iterator>
  • +
  • <string> no longer includes <algorithm> or <memory>
  • + +
  • <valarray> no longer includes <numeric> or <cstdlib>
  • +
  • <tr1/hashtable> no longer includes <memory> or <functional>
  • +
  • <tr1/memory> no longer includes <algorithm>
  • +
  • <tr1/random> no longer includes <algorithm> or <fstream>
  • +
+ +

+Debug mode for <unordered_map> and <unordered_set>. +

+ +

+Parallel mode first appears. +

+ +

Variadic template implementations of items in <tuple> and + <functional>. +

+ +

Default what implementations give more elaborate + exception strings for bad_cast, + bad_typeid, bad_exception, and + bad_alloc. +

+ +

+PCH binary files no longer installed. Instead, the source files are installed. +

+ +

+Namespace pb_ds moved to __gnu_pb_ds. +

+ + + + diff --git a/libstdc++-v3/doc/html/17_intro/backwards_compatibility.html b/libstdc++-v3/doc/html/17_intro/backwards_compatibility.html new file mode 100644 index 00000000000..c9af980f0fc --- /dev/null +++ b/libstdc++-v3/doc/html/17_intro/backwards_compatibility.html @@ -0,0 +1,1073 @@ + + + + + + + + + + Backwards Compatibility + + + + + + +

Backwards Compatibility

+ +

+ The latest version of this document is always available at + + http://gcc.gnu.org/onlinedocs/libstdc++/17_intro/backwards_compatibility.html. +

+ +

+ To the libstdc++ homepage. +

+ + +
+

+ First. +

+ +

The first generation GNU C++ library was called libg++. It was a +separate GNU project, although reliably paired with GCC. Rumors imply +that it had a working relationship with at least two kinds of +dinosaur. +

+ +

Known Issues include many of the limitations of its immediate ancestor.

+ +

Portability notes and known implementation limitations are as follows.

+ +
No ios_base
+ +

At least some older implementations don't have std::ios_base, so you should use std::ios::badbit, std::ios::failbit and std::ios::eofbit and std::ios::goodbit. +

+ +
No cout in ostream.h, no cin in istream.h
+ +

+ In earlier versions of the standard, + <fstream.h>, + <ostream.h> + and <istream.h> + used to define + cout, cin and so on. ISO C++ specifies that one needs to include + <iostream> + explicitly to get the required definitions. +

+

Some include adjustment may be required.

+ + +

This project is no longer maintained or supported, and the sources +archived. The code is considered replaced and rewritten. +

+ +
+

+ Second. +

+

The second generation GNU C++ library was called libstdc++, or +libstdc++-v2. It spans the time between libg++ and pre-ISO C++ +standardization and is usually associated with the following GCC +releases: egcs 1.x, gcc 2.95, and gcc 2.96. +

+ +

The STL portions of this library are based on SGI/HP STL release 3.11. +

+ +

Portability notes and known implementation limitations are as follows.

+ +
Namespace std:: not supported
+ +

+ Some care is required to support C++ compiler and or library + implementation that do not have the standard library in + namespace std. +

+

+ The following sections list some possible solutions to support compilers + that cannot ignore std::-qualified names. +

+ +

First, see if the compiler has a flag for this. Namespace + back-portability-issues are generally not a problem for g++ + compilers that do not have libstdc++ in std::, as + the compilers use -fno-honor-std (ignore + std::, :: = std::) by default. That + is, the responsibility for enabling or disabling + std:: is on the user; the maintainer does not have + to care about it. This probably applies to some other compilers + as well. +

+ +

Second, experiment with a variety of pre-processor tricks.

+ +

By defining std as a macro, fully-qualified namespace calls become global. Volia.

+ +
+#ifdef WICKEDLY_OLD_COMPILER
+# define std
+#endif
+
+(thanks to Juergen Heinzl who posted this solution on gnu.gcc.help) + +

Another pre-processor based approach is to define a +macro NAMESPACE_STD, which is defined to either +"" or "std" based on a compile-type test. On GNU +systems, this can be done with autotools by means of an autoconf test +(see below) for HAVE_NAMESPACE_STD, then using that to +set a value for the NAMESPACE_STD macro. At that point, +one is able to use NAMESPACE_STD::string, which will +evaluate to std::string or +::string (ie, in the global namespace on systems that do +not put string in std::).

+ +
+dnl @synopsis AC_CXX_NAMESPACE_STD
+dnl
+dnl If the compiler supports namespace std, define
+dnl HAVE_NAMESPACE_STD.
+dnl
+dnl @category Cxx
+dnl @author Todd Veldhuizen
+dnl @author Luc Maisonobe <luc@spaceroots.org>
+dnl @version 2004-02-04
+dnl @license AllPermissive
+AC_DEFUN([AC_CXX_NAMESPACE_STD], [
+  AC_CACHE_CHECK(if g++ supports namespace std,
+  ac_cv_cxx_have_std_namespace,
+  [AC_LANG_SAVE
+  AC_LANG_CPLUSPLUS
+  AC_TRY_COMPILE([#include <iostream> 
+                  std::istream& is = std::cin;],,
+  ac_cv_cxx_have_std_namespace=yes, ac_cv_cxx_have_std_namespace=no)
+  AC_LANG_RESTORE
+  ])
+  if test "$ac_cv_cxx_have_std_namespace" = yes; then
+    AC_DEFINE(HAVE_NAMESPACE_STD,,[Define if g++ supports namespace std. ])
+  fi
+])
+
+ +
Illegal iterator usage
+

+ The following illustrate implementation-allowed illegal iterator + use, and then correct use. +

+ +
  • you cannot do + ostream::operator<<(iterator) to print the + address of the iterator => use operator<< + &*iterator instead +

  • +
  • you cannot clear an iterator's reference + (iterator = 0) => use + iterator = iterator_type(); +

  • +
  • +if (iterator) won't work any + more => use if (iterator != iterator_type()) +

  • +
+ +
isspace from <cctype> is a macro +
+ +

Glibc 2.0.x and 2.1.x define <ctype.h> +functionality as macros (isspace, isalpha etc.). +

+ +

+This implementations of libstdc++, however, keep these functions as +macros, and so it is not back-portable to use fully qualified +names. For example: +

+ +
 
+#include <cctype> 
+int main() { std::isspace('X'); } 
+
+ +

Results in something like this: +

+ +
 
+std:: (__ctype_b[(int) ( ( 'X' ) )] & (unsigned short int) _ISspace ) ; 
+
+ + +

A solution is to modify a header-file so that the compiler tells +<ctype.h> to define functions instead of macros: +

+ +
+// This keeps isalnum, et al from being propagated as macros. 
+#if __linux__
+# define __NO_CTYPE 1
+#endif
+
+ +

Then, include <ctype.h> +

+ +

+Another problem arises if you put a using namespace std; +declaration at the top, and include <ctype.h>. This +will result in ambiguities between the definitions in the global +namespace (<ctype.h>) and the definitions in namespace +std:: (<cctype>). +

+ +
No vector::at, deque::at, string::at
+ +

+ One solution is to add an autoconf-test for this: +

+
+AC_MSG_CHECKING(for container::at)
+AC_TRY_COMPILE(
+[
+#include <vector>
+#include <deque>
+#include <string>
+	
+using namespace std;
+],
+[
+deque<int> test_deque(3);
+test_deque.at(2);
+vector<int> test_vector(2);
+test_vector.at(1);
+string test_string("test_string");
+test_string.at(3);
+],
+[AC_MSG_RESULT(yes)
+AC_DEFINE(HAVE_CONTAINER_AT)],
+[AC_MSG_RESULT(no)])
+
+ +

+If you are using other (non-GNU) compilers it might be a good idea +to check for string::at separately. +

+ +
No std::char_traits<char>::eof
+ +

+Use some kind of autoconf test, plus this: +

+
 
+#ifdef HAVE_CHAR_TRAITS
+#define CPP_EOF std::char_traits<char>::eof()
+#else
+#define CPP_EOF EOF
+#endif
+
+ +
No string::clear
+ +

+ There are two functions for deleting the contents of a string: + clear and erase (the latter + returns the string). +

+ +
+void 
+clear() { _M_mutate(0, this->size(), 0); }
+
+
+basic_string& 
+erase(size_type __pos = 0, size_type __n = npos)
+{ 
+  return this->replace(_M_check(__pos), _M_fold(__pos, __n),
+                          _M_data(), _M_data()); 
+}
+
+ +

+ Unfortunately, ut clear is not + implemented in this version, so you should use + erase (which is probably faster than + operator=(charT*)). +

+ +
Removal of ostream::form and +istream::scan extensions
+ +

These are no longer supported. Please use + + stringstreams instead. +

+ +
No basic_stringbuf, basic_stringstream
+ +

+Although the ISO standard +i/ostringstream-classes are provided, (<sstream>), for compatibility with older implementations the pre-ISO i/ostrstream (<strstream>) interface is also provided, with these caveats: +

+ +
    +
  • strstream is considered to be + deprecated +

  • +
  • strstream is limited to + char +

  • +
  • with ostringstream you don't + have to take care of terminating the string or freeing its + memory +

  • +
  • istringstream can be re-filled + (clear(); str(input);) +

  • +
+

+ You can then use output-stringstreams like this: +

+ +
+#ifdef HAVE_SSTREAM
+# include <sstream>
+#else
+# include <strstream>
+#endif
+
+#ifdef HAVE_SSTREAM
+  std::ostringstream oss;
+#else
+  std::ostrstream oss;
+#endif
+
+oss << "Name=" << m_name << ", number=" << m_number << std::endl;
+...
+#ifndef HAVE_SSTREAM
+  oss << std::ends; // terminate the char*-string
+#endif
+
+// str() returns char* for ostrstream and a string for ostringstream
+// this also causes ostrstream to think that the buffer's memory
+// is yours
+m_label.set_text(oss.str());
+#ifndef HAVE_SSTREAM
+  // let the ostrstream take care of freeing the memory
+  oss.freeze(false);
+#endif
+
+ +

+ Input-stringstreams can be used similarly: +

+ +
 
+std::string input;
+...
+#ifdef HAVE_SSTREAM
+std::istringstream iss(input);
+#else
+std::istrstream iss(input.c_str());
+#endif
+
+int i;
+iss >> i; 
+
+ +

One (the only?) restriction is that an istrstream cannot be re-filled: +

+ +
+std::istringstream iss(numerator);
+iss >> m_num;
+// this is not possible with istrstream
+iss.clear();
+iss.str(denominator);
+iss >> m_den;
+ 
+ +

+If you don't care about speed, you can put these conversions in + a template-function: +

+
+template <class X>
+void fromString(const string& input, X& any)
+{
+#ifdef HAVE_SSTREAM
+std::istringstream iss(input);
+#else
+std::istrstream iss(input.c_str());
+#endif
+X temp;
+iss >> temp;
+if (iss.fail())
+throw runtime_error(..)
+any = temp;
+}
+
+ +

Another example of using stringstreams is in this howto. +

+ +

There is additional information in the libstdc++-v2 info files, in +particular "info iostream". +

+ +
Little or no wide character support
+ +
No templatized iostreams
+ +
Thread safety issues
+ +

This project is no longer maintained or supported, and the sources +archived. The code is considered replaced and rewritten. +

+ + +
+

+ Third. +

+

The third generation GNU C++ library is called libstdc++, or +libstdc++-v3. +

+ +

The subset commonly known as the Standard Template Library + (chapters 23 through 25, mostly) is adapted from the final release + of the SGI STL (version 3.3), with extensive changes. +

+ +

A more formal description of the V3 goals can be found in the + official design document. +

+ +

Portability notes and known implementation limitations are as follows.

+ +
Pre-ISO headers moved to backwards or removed
+ +

The pre-ISO C++ headers + (iostream.h, defalloc.h etc.) are + available, unlike previous libstdc++ versions, but inclusion + generates a warning that you are using deprecated headers. +

+ +

This compatibility layer is constructed by including the + standard C++ headers, and injecting any items in + std:: into the global namespace. +

+

For those of you new to ISO C++ (welcome, time travelers!), no, + that isn't a typo. Yes, the headers really have new names. + Marshall Cline's C++ FAQ Lite has a good explanation in item + [27.4]. +

+ +

Some include adjustment may be required. What follows is an +autoconf test that defines PRE_STDCXX_HEADERS when they +exist.

+ +
+# AC_HEADER_PRE_STDCXX
+AC_DEFUN([AC_HEADER_PRE_STDCXX], [
+  AC_CACHE_CHECK(for pre-ISO C++ include files,
+  ac_cv_cxx_pre_stdcxx,
+  [AC_LANG_SAVE
+  AC_LANG_CPLUSPLUS
+  ac_save_CXXFLAGS="$CXXFLAGS"
+  CXXFLAGS="$CXXFLAGS -Wno-deprecated"	
+
+  # Omit defalloc.h, as compilation with newer compilers is problematic.
+  AC_TRY_COMPILE([
+  #include <new.h>
+  #include <iterator.h>
+  #include <alloc.h>
+  #include <set.h>
+  #include <hashtable.h>
+  #include <hash_set.h>
+  #include <fstream.h>
+  #include <tempbuf.h>
+  #include <istream.h>
+  #include <bvector.h>
+  #include <stack.h>
+  #include <rope.h>
+  #include <complex.h>
+  #include <ostream.h>
+  #include <heap.h>
+  #include <iostream.h>
+  #include <function.h>
+  #include <multimap.h>
+  #include <pair.h>
+  #include <stream.h>
+  #include <iomanip.h>
+  #include <slist.h>
+  #include <tree.h>
+  #include <vector.h>
+  #include <deque.h>
+  #include <multiset.h>
+  #include <list.h>
+  #include <map.h>
+  #include <algobase.h>
+  #include <hash_map.h>
+  #include <algo.h>
+  #include <queue.h>
+  #include <streambuf.h>
+  ],,
+  ac_cv_cxx_pre_stdcxx=yes, ac_cv_cxx_pre_stdcxx=no)
+  CXXFLAGS="$ac_save_CXXFLAGS"
+  AC_LANG_RESTORE
+  ])
+  if test "$ac_cv_cxx_pre_stdcxx" = yes; then
+    AC_DEFINE(PRE_STDCXX_HEADERS,,[Define if pre-ISO C++ header files are present. ])
+  fi
+])
+
+ +

Porting between pre-ISO headers and ISO headers is simple: headers +like <vector.h> can be replaced with <vector> and a using +directive using namespace std; can be put at the global +scope. This should be enough to get this code compiling, assuming the +other usage is correct. +

+ +
Extension headers hash_map, hash_set moved to ext or backwards
+ +

Header files hash_map and hash_set moved +to ext/hash_map and ext/hash_set, +respectively. At the same time, all types in these files are enclosed +in namespace __gnu_cxx. Later versions move deprecate +these files, and suggest using TR1's unordered_map +and unordered_set instead. +

+ +

The following autoconf tests check for working HP/SGI hash containers. +

+ +
+# AC_HEADER_EXT_HASH_MAP
+AC_DEFUN([AC_HEADER_EXT_HASH_MAP], [
+  AC_CACHE_CHECK(for ext/hash_map,
+  ac_cv_cxx_ext_hash_map,
+  [AC_LANG_SAVE
+  AC_LANG_CPLUSPLUS
+  ac_save_CXXFLAGS="$CXXFLAGS"
+  CXXFLAGS="$CXXFLAGS -Werror"	
+  AC_TRY_COMPILE([#include <ext/hash_map>], [using __gnu_cxx::hash_map;],
+  ac_cv_cxx_ext_hash_map=yes, ac_cv_cxx_ext_hash_map=no)
+  CXXFLAGS="$ac_save_CXXFLAGS"
+  AC_LANG_RESTORE
+  ])
+  if test "$ac_cv_cxx_ext_hash_map" = yes; then
+    AC_DEFINE(HAVE_EXT_HASH_MAP,,[Define if ext/hash_map is present. ])
+  fi
+])
+
+ +
+# AC_HEADER_EXT_HASH_SET
+AC_DEFUN([AC_HEADER_EXT_HASH_SET], [
+  AC_CACHE_CHECK(for ext/hash_set,
+  ac_cv_cxx_ext_hash_set,
+  [AC_LANG_SAVE
+  AC_LANG_CPLUSPLUS
+  ac_save_CXXFLAGS="$CXXFLAGS"
+  CXXFLAGS="$CXXFLAGS -Werror"	
+  AC_TRY_COMPILE([#include <ext/hash_set>], [using __gnu_cxx::hash_set;],
+  ac_cv_cxx_ext_hash_set=yes, ac_cv_cxx_ext_hash_set=no)
+  CXXFLAGS="$ac_save_CXXFLAGS"
+  AC_LANG_RESTORE
+  ])
+  if test "$ac_cv_cxx_ext_hash_set" = yes; then
+    AC_DEFINE(HAVE_EXT_HASH_SET,,[Define if ext/hash_set is present. ])
+  fi
+])
+
+ + +
+No ios::nocreate/ios::noreplace. +
+ +

The existence of ios::nocreate being used for +input-streams has been confirmed, most probably because the author +thought it would be more correct to specify nocreate explicitly. So +it can be left out for input-streams. +

+ +

For output streams, "nocreate" is probably the default, +unless you specify std::ios::trunc ? To be safe, you can +open the file for reading, check if it has been opened, and then +decide whether you want to create/replace or not. To my knowledge, +even older implementations support app, ate +and trunc (except for app ?). +

+ + +
+No stream::attach(int fd) +
+ +

+ Phil Edwards writes: It was considered and rejected for the ISO + standard. Not all environments use file descriptors. Of those + that do, not all of them use integers to represent them. +

+ +

+ For a portable solution (among systems which use + filedescriptors), you need to implement a subclass of + std::streambuf (or + std::basic_streambuf<..>) which opens a file + given a descriptor, and then pass an instance of this to the + stream-constructor. +

+ +

+ An extension is available that implements this. + <ext/stdio_filebuf.h> contains a derived class called + __gnu_cxx::stdio_filebuf. + This class can be constructed from a C FILE* or a file + descriptor, and provides the fd() function. +

+ +

+ For another example of this, refer to + fdstream example + by Nicolai Josuttis. +

+ +
+Support for C++98 dialect. +
+ +

Check for complete library coverage of the C++1998/2003 standard. +

+ +
+
+# AC_HEADER_STDCXX_98
+AC_DEFUN([AC_HEADER_STDCXX_98], [
+  AC_CACHE_CHECK(for ISO C++ 98 include files,
+  ac_cv_cxx_stdcxx_98,
+  [AC_LANG_SAVE
+  AC_LANG_CPLUSPLUS
+  AC_TRY_COMPILE([
+    #include <cassert>
+    #include <cctype>
+    #include <cerrno>
+    #include <cfloat>
+    #include <ciso646>
+    #include <climits>
+    #include <clocale>
+    #include <cmath>
+    #include <csetjmp>
+    #include <csignal>
+    #include <cstdarg>
+    #include <cstddef>
+    #include <cstdio>
+    #include <cstdlib>
+    #include <cstring>
+    #include <ctime>
+
+    #include <algorithm>
+    #include <bitset>
+    #include <complex>
+    #include <deque>
+    #include <exception>
+    #include <fstream>
+    #include <functional>
+    #include <iomanip>
+    #include <ios>
+    #include <iosfwd>
+    #include <iostream>
+    #include <istream>
+    #include <iterator>
+    #include <limits>
+    #include <list>
+    #include <locale>
+    #include <map>
+    #include <memory>
+    #include <new>
+    #include <numeric>
+    #include <ostream>
+    #include <queue>
+    #include <set>
+    #include <sstream>
+    #include <stack>
+    #include <stdexcept>
+    #include <streambuf>
+    #include <string>
+    #include <typeinfo>
+    #include <utility>
+    #include <valarray>
+    #include <vector>
+  ],,
+  ac_cv_cxx_stdcxx_98=yes, ac_cv_cxx_stdcxx_98=no)
+  AC_LANG_RESTORE
+  ])
+  if test "$ac_cv_cxx_stdcxx_98" = yes; then
+    AC_DEFINE(STDCXX_98_HEADERS,,[Define if ISO C++ 1998 header files are present. ])
+  fi
+])
+
+ + +
+Support for C++TR1 dialect. +
+ +

Check for library coverage of the TR1 standard. +

+ +
+
+# AC_HEADER_STDCXX_TR1
+AC_DEFUN([AC_HEADER_STDCXX_TR1], [
+  AC_CACHE_CHECK(for ISO C++ TR1 include files,
+  ac_cv_cxx_stdcxx_tr1,
+  [AC_LANG_SAVE
+  AC_LANG_CPLUSPLUS
+  AC_TRY_COMPILE([
+  #include <tr1/array>
+  #include <tr1/ccomplex>
+  #include <tr1/cctype>
+  #include <tr1/cfenv>
+  #include <tr1/cfloat>
+  #include <tr1/cinttypes>
+  #include <tr1/climits>
+  #include <tr1/cmath>
+  #include <tr1/complex>
+  #include <tr1/cstdarg>
+  #include <tr1/cstdbool>
+  #include <tr1/cstdint>
+  #include <tr1/cstdio>
+  #include <tr1/cstdlib>
+  #include <tr1/ctgmath>
+  #include <tr1/ctime>
+  #include <tr1/cwchar>
+  #include <tr1/cwctype>
+  #include <tr1/functional>
+  #include <tr1/memory>
+  #include <tr1/random>
+  #include <tr1/regex>
+  #include <tr1/tuple>
+  #include <tr1/type_traits>
+  #include <tr1/unordered_set>
+  #include <tr1/unordered_map>
+  #include <tr1/utility>
+  ],,
+  ac_cv_cxx_stdcxx_tr1=yes, ac_cv_cxx_stdcxx_tr1=no)
+  AC_LANG_RESTORE
+  ])
+  if test "$ac_cv_cxx_stdcxx_tr1" = yes; then
+    AC_DEFINE(STDCXX_TR1_HEADERS,,[Define if ISO C++ TR1 header files are present. ])
+  fi
+])
+
+ +

An alternative is to check just for specific TR1 includes, such as <unordered_map> and <unordered_set>. +

+ +
+# AC_HEADER_TR1_UNORDERED_MAP
+AC_DEFUN([AC_HEADER_TR1_UNORDERED_MAP], [
+  AC_CACHE_CHECK(for tr1/unordered_map,
+  ac_cv_cxx_tr1_unordered_map,
+  [AC_LANG_SAVE
+  AC_LANG_CPLUSPLUS
+  AC_TRY_COMPILE([#include <tr1/unordered_map>], [using std::tr1::unordered_map;],
+  ac_cv_cxx_tr1_unordered_map=yes, ac_cv_cxx_tr1_unordered_map=no)
+  AC_LANG_RESTORE
+  ])
+  if test "$ac_cv_cxx_tr1_unordered_map" = yes; then
+    AC_DEFINE(HAVE_TR1_UNORDERED_MAP,,[Define if tr1/unordered_map is present. ])
+  fi
+])
+
+ +
+# AC_HEADER_TR1_UNORDERED_SET
+AC_DEFUN([AC_HEADER_TR1_UNORDERED_SET], [
+  AC_CACHE_CHECK(for tr1/unordered_set,
+  ac_cv_cxx_tr1_unordered_set,
+  [AC_LANG_SAVE
+  AC_LANG_CPLUSPLUS
+  AC_TRY_COMPILE([#include <tr1/unordered_set>], [using std::tr1::unordered_set;],
+  ac_cv_cxx_tr1_unordered_set=yes, ac_cv_cxx_tr1_unordered_set=no)
+  AC_LANG_RESTORE
+  ])
+  if test "$ac_cv_cxx_tr1_unordered_set" = yes; then
+    AC_DEFINE(HAVE_TR1_UNORDERED_SET,,[Define if tr1/unordered_set is present. ])
+  fi
+])
+
+ + + +
+Support for C++0x dialect. +
+ +

Check for baseline language coverage in the compiler for the C++0xstandard. +

+ +
+# AC_COMPILE_STDCXX_OX
+AC_DEFUN([AC_COMPILE_STDCXX_0X], [
+  AC_CACHE_CHECK(if g++ supports C++0x features without additional flags,
+  ac_cv_cxx_compile_cxx0x_native,
+  [AC_LANG_SAVE
+  AC_LANG_CPLUSPLUS
+  AC_TRY_COMPILE([
+  template <typename T>
+    struct check 
+    {
+      static_assert(sizeof(int) <= sizeof(T), "not big enough");
+    };
+
+    typedef check<check<bool>> right_angle_brackets;
+
+    int a;
+    decltype(a) b;
+
+    typedef check<int> check_type;
+    check_type c;
+    check_type&& cr = c;],,
+  ac_cv_cxx_compile_cxx0x_native=yes, ac_cv_cxx_compile_cxx0x_native=no)
+  AC_LANG_RESTORE
+  ])
+
+  AC_CACHE_CHECK(if g++ supports C++0x features with -std=c++0x,
+  ac_cv_cxx_compile_cxx0x_cxx,
+  [AC_LANG_SAVE
+  AC_LANG_CPLUSPLUS
+  ac_save_CXXFLAGS="$CXXFLAGS"
+  CXXFLAGS="$CXXFLAGS -std=c++0x"	
+  AC_TRY_COMPILE([
+  template <typename T>
+    struct check 
+    {
+      static_assert(sizeof(int) <= sizeof(T), "not big enough");
+    };
+
+    typedef check<check<bool>> right_angle_brackets;
+
+    int a;
+    decltype(a) b;
+
+    typedef check<int> check_type;
+    check_type c;
+    check_type&& cr = c;],,
+  ac_cv_cxx_compile_cxx0x_cxx=yes, ac_cv_cxx_compile_cxx0x_cxx=no)
+  CXXFLAGS="$ac_save_CXXFLAGS"
+  AC_LANG_RESTORE
+  ])
+
+  AC_CACHE_CHECK(if g++ supports C++0x features with -std=gnu++0x,
+  ac_cv_cxx_compile_cxx0x_gxx,
+  [AC_LANG_SAVE
+  AC_LANG_CPLUSPLUS
+  ac_save_CXXFLAGS="$CXXFLAGS"
+  CXXFLAGS="$CXXFLAGS -std=gnu++0x"	
+  AC_TRY_COMPILE([
+  template <typename T>
+    struct check 
+    {
+      static_assert(sizeof(int) <= sizeof(T), "not big enough");
+    };
+
+    typedef check<check<bool>> right_angle_brackets;
+
+    int a;
+    decltype(a) b;
+
+    typedef check<int> check_type;
+    check_type c;
+    check_type&& cr = c;],,
+  ac_cv_cxx_compile_cxx0x_gxx=yes, ac_cv_cxx_compile_cxx0x_gxx=no)
+  CXXFLAGS="$ac_save_CXXFLAGS"
+  AC_LANG_RESTORE
+  ])
+
+  if test "$ac_cv_cxx_compile_cxx0x_native" = yes || 
+     test "$ac_cv_cxx_compile_cxx0x_cxx" = yes || 
+     test "$ac_cv_cxx_compile_cxx0x_gxx" = yes; then
+    AC_DEFINE(HAVE_STDCXX_0X,,[Define if g++ supports C++0x features. ])
+  fi
+])
+
+ + +

Check for library coverage of the C++0xstandard. +

+ +
+
+# AC_HEADER_STDCXX_0X
+AC_DEFUN([AC_HEADER_STDCXX_0X], [
+  AC_CACHE_CHECK(for ISO C++ 0x include files,
+  ac_cv_cxx_stdcxx_0x,
+  [AC_REQUIRE([AC_COMPILE_STDCXX_0X])
+  AC_LANG_SAVE
+  AC_LANG_CPLUSPLUS
+  ac_save_CXXFLAGS="$CXXFLAGS"
+  CXXFLAGS="$CXXFLAGS -std=gnu++0x"	
+
+  AC_TRY_COMPILE([
+    #include <cassert>
+    #include <ccomplex>
+    #include <cctype>
+    #include <cerrno>
+    #include <cfenv>
+    #include <cfloat>
+    #include <cinttypes>
+    #include <ciso646>
+    #include <climits>
+    #include <clocale>
+    #include <cmath>
+    #include <csetjmp>
+    #include <csignal>
+    #include <cstdarg>
+    #include <cstdbool>
+    #include <cstddef>
+    #include <cstdint>
+    #include <cstdio>
+    #include <cstdlib>
+    #include <cstring>
+    #include <ctgmath>
+    #include <ctime>
+    #include <cwchar>
+    #include <cwctype>
+
+    #include <algorithm>
+    #include <array>
+    #include <bitset>
+    #include <complex>
+    #include <deque>
+    #include <exception>
+    #include <fstream>
+    #include <functional>
+    #include <iomanip>
+    #include <ios>
+    #include <iosfwd>
+    #include <iostream>
+    #include <istream>
+    #include <iterator>
+    #include <limits>
+    #include <list>
+    #include <locale>
+    #include <map>
+    #include <memory>
+    #include <new>
+    #include <numeric>
+    #include <ostream>
+    #include <queue>
+    #include <random>
+    #include <regex>
+    #include <set>
+    #include <sstream>
+    #include <stack>
+    #include <stdexcept>
+    #include <streambuf>
+    #include <string>
+    #include <tuple>
+    #include <typeinfo>
+    #include <type_traits>
+    #include <unordered_map>
+    #include <unordered_set>
+    #include <utility>
+    #include <valarray>
+    #include <vector>
+  ],,
+  ac_cv_cxx_stdcxx_0x=yes, ac_cv_cxx_stdcxx_0x=no)
+  AC_LANG_RESTORE
+  CXXFLAGS="$ac_save_CXXFLAGS"
+  ])
+  if test "$ac_cv_cxx_stdcxx_0x" = yes; then
+    AC_DEFINE(STDCXX_0X_HEADERS,,[Define if ISO C++ 0x header files are present. ])
+  fi
+])
+
+ +

As is the case for TR1 support, these autoconf macros can be made for a finer-grained, per-header-file check. For <unordered_map> +

+ +
+
+# AC_HEADER_UNORDERED_MAP
+AC_DEFUN([AC_HEADER_UNORDERED_MAP], [
+  AC_CACHE_CHECK(for unordered_map,
+  ac_cv_cxx_unordered_map,
+  [AC_REQUIRE([AC_COMPILE_STDCXX_0X])
+  AC_LANG_SAVE
+  AC_LANG_CPLUSPLUS
+  ac_save_CXXFLAGS="$CXXFLAGS"
+  CXXFLAGS="$CXXFLAGS -std=gnu++0x"	
+  AC_TRY_COMPILE([#include <unordered_map>], [using std::unordered_map;],
+  ac_cv_cxx_unordered_map=yes, ac_cv_cxx_unordered_map=no)
+  CXXFLAGS="$ac_save_CXXFLAGS"
+  AC_LANG_RESTORE
+  ])
+  if test "$ac_cv_cxx_unordered_map" = yes; then
+    AC_DEFINE(HAVE_UNORDERED_MAP,,[Define if unordered_map is present. ])
+  fi
+])
+
+ +
+# AC_HEADER_UNORDERED_SET
+AC_DEFUN([AC_HEADER_UNORDERED_SET], [
+  AC_CACHE_CHECK(for unordered_set,
+  ac_cv_cxx_unordered_set,
+  [AC_REQUIRE([AC_COMPILE_STDCXX_0X])
+  AC_LANG_SAVE
+  AC_LANG_CPLUSPLUS
+  ac_save_CXXFLAGS="$CXXFLAGS"
+  CXXFLAGS="$CXXFLAGS -std=gnu++0x"	
+  AC_TRY_COMPILE([#include <unordered_set>], [using std::unordered_set;],
+  ac_cv_cxx_unordered_set=yes, ac_cv_cxx_unordered_set=no)
+  CXXFLAGS="$ac_save_CXXFLAGS"
+  AC_LANG_RESTORE
+  ])
+  if test "$ac_cv_cxx_unordered_set" = yes; then
+    AC_DEFINE(HAVE_UNORDERED_SET,,[Define if unordered_set is present. ])
+  fi
+])
+
+ + +
+Container iterator_type is not necessarily container value_type* +
+ + +
+

+ Fourth, and future +

+ +
+

+ Links +

+ +

+Migrating to gcc-4.1, by Dan Kegel. +

+ +

+Building the whole Debian archive with GCC 4.1: a summary, by Martin Michlmayr +

+ +

+Migration guide for GCC-3.2 +

+ + + + diff --git a/libstdc++-v3/doc/html/17_intro/c++0x_status.html b/libstdc++-v3/doc/html/17_intro/c++0x_status.html new file mode 100644 index 00000000000..cfc28ed44a5 --- /dev/null +++ b/libstdc++-v3/doc/html/17_intro/c++0x_status.html @@ -0,0 +1,2290 @@ + + + + + + + + + + + + Status of C++0x features in GCC + - GNU Project - Free Software Foundation (FSF) + + + + + + +

+ Status of C++0x features in GCC +

+ +

+This table is based on the table of contents of ISO/IEC +Doc No: N2461=07-0331 Date: 2007-10-22 +Working Draft, Standard for Programming Language C++ +

+ +

+In this implementation -std=gnu++0x or +-std=c++0x flags must be used to enable language and +library features. The pre-defined symbol +__GXX_EXPERIMENTAL_CXX0X__ is used to check for the +presence of the required flag. +

+ +

+This page describes the C++0x support in mainline GCC SVN, not in any +particular release. +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
SectionDescriptionDoneBrokenMissingComments
20General Utilities
20.2Utility Componentsincomplete
20.2.1Operatorspartial
20.2.2forward/move helperspartial
20.2.3Pairsdone
20.3Header <tuple> synopsisdone
20.3.1Class template tupledone
20.3.1.1Constructiondone
20.3.1.2Tuple creation functionsdone
20.3.1.3Tuple helper classesdone
20.3.1.4Element accessdone
20.3.1.5Relational operatorsdone
20.4Metaprogramming and type traits
20.4.1Requirementsdone
20.4.2Header <type_traits> synopsisdone
20.4.3Helper classesdone
20.4.4General Requirementsdone
20.4.5Unary Type Traitsdone
20.4.5.1Primary Type Categoriesdone
20.4.5.2Composite type traitsdone
20.4.5.3Type propertiesdone
20.4.6Relationships between typesdone
20.4.7Transformations between typesdone
20.4.7.1Const-volatile modificationsdone
20.4.7.2Reference modificationsdone
20.4.7.3Array modificationsdone
20.4.7.4Pointer modificationsdone
20.4.8Other transformationsdone
20.4.9Implementation requirementsdone
20.5 Function Objectsdone
20.5Additions to header <functional> synopsisdone
20.5.1Definitionsdone
20.5.2Requirementsdone
20.5.3Basedone
20.5.4Function return typesdone
20.5.5Class template reference_wrapperdone
20.5.5.1reference_wrapper construct/copy/destroydone
20.5.5.2reference_wrapper assignmentdone
20.5.5.3reference_wrapper accessdone
20.5.5.4reference_wrapper invocationdone
20.5.5.5reference_wrapper helper functionsdone
20.5.14Function template mem_fndone
20.5.11Template function binddone
20.5.11.1Function object bindersdone
20.5.11.1.1Class template is_bind_expressiondone
20.5.11.1.2Class template is_placeholderdone
20.5.11.1.3Function template binddone
20.5.11.1.4Placeholdersdone
20.5.15Polymorphic function wrappersdone
20.5.15.1Class bad_function_calldone
20.5.15.1.1bad_function_call constructordone
20.5.15.2Class template functiondone
20.5.15.2.1function construct/copy/destroydone
20.5.15.2.2function modifiersdone
20.5.15.2.3function capacitydone
20.5.15.2.4function invocationdone
20.5.15.2.5function target accessdone
20.5.15.2.7null pointer comparison operatorsdone
20.5.15.2.8specialized algorithmsdone
20.5.16Class template hashdone
20.6Additions to header <memory> synopsispartialmissing unique_ptr
20.6.5Class template unique_ptrmissing
20.6.6Smart pointersdone
20.6.6.1Class bad_weak_ptrdone
20.6.6.2Class template shared_ptrdone1
20.6.6.2.1shared_ptr constructorsdone
20.6.6.2.2shared_ptr destructordone
20.6.6.2.3shared_ptr assignmentdone
20.6.6.2.4shared_ptr modifiersdone
20.6.6.2.5shared_ptr observersdone
20.6.6.2.6shared_ptr creationdone + N2351 +
20.6.6.2.7shared_ptr comparisondone
20.6.6.2.8shared_ptr I/Odone
20.6.6.2.9shared_ptr specialized algorithmsdone
20.6.6.2.10shared_ptr castsdone
20.6.6.2.11get_deleterdone
20.6.6.3Class template weak_ptrdone
20.6.6.3.1weak_ptr constructorsdone
20.6.6.3.2weak_ptr destructordone
20.6.6.3.3weak_ptr assignmentdone
20.6.6.3.4weak_ptr modifiersdone
20.6.6.3.5weak_ptr observersdone
20.6.6.3.6weak_ptr comparisondone
20.6.6.3.7weak_ptr specialized algorithmsdone
20.6.6.4Class template enable_shared_from_thisdone
23Containers
23.2.1Header <array> synopsisdone
23.2.1Class template arraydone
23.2.1.1array constructors, copy, and assignmentdone
23.2.1.2array specialized algorithmsdone
23.2.1.3array sizedone
23.2.1.4array datadone
23.2.1.5Zero sized arraysdone
23.2.1.6Tuple interface to class template arraydone
23.4Unordered associative containersdone
23.4.1Class template unordered_mapdone
23.4.1.1unordered_map constructorsdone
23.4.1.2unordered_map element accessdone
23.4.1.3unordered_map swapdone
23.4.2Class template unordered_multimapdone
23.4.2.1unordered_multimap constructorsdone
23.4.2.2unordered_multimap swapdone
23.4.3Class template unordered_setdone
23.4.3.1unordered_set constructorsdone
23.4.3.2unordered_set swapdone
23.4.4Class template unordered_multisetdone
23.4.4.1unordered_multiset constructorsdone
23.4.4.2unordered_multiset swapdone
26Numerics
26.4Random number generationdone
26.4.1Requirementsdone
26.4.2Header <random> synopsispartial
26.4.3Random number engine class templatesdone
26.4.3.1Class template linear_congruential_enginedone
26.4.3.2Class template mersenne_twister_enginedone
26.4.3.3Class template subtract_with_carry_enginedone
26.4.4Random number engine adaptor class templatesdone
26.4.4.1Class template discard_block_enginedone
26.4.4.2Class template independent_bits_enginedone
26.4.4.3Class template shuffle_order_enginedone
26.4.4.4Class template xor_combine_enginedoneoperator()() per N2079
26.4.5Engines and engine adaptors with predefined parametersdone
26.4.6Class random_devicedone
26.4.7Utilitiesdone
26.4.7.1Class seed_seqmissing
26.4.7.2Function template generate_cannonicalmissing
26.4.8Random number generation class templatesdone
26.4.8.1Uniform distributionspartial
26.4.8.1Class template uniform_int_distributionmissing
26.4.8.1Class template uniform_real_distributionmissing
26.4.8.2Bernoulli distributionspartial
26.4.8.2.1Class bernoulli_distributiondone
26.4.8.2.2Class template binomial_distributiondone
26.4.8.2.3Class template geometric_distributiondone
26.4.8.2.4Class template negative_binomial_distributionmissing
26.4.8.3Poisson distributionspartial
26.4.8.3.1Class template poisson_distributiondone
26.4.8.3.2Class template exponential_distributiondone
26.4.8.3.3Class template gamma_distributiondone
26.4.8.3.4Class template weibull_distributionmissing
26.4.8.3.5Class template extreme_value_distributionmissing
26.4.8.4Normal distributionspartial
26.4.8.4.1Class template normal_distributiondone
26.4.8.4.2Class template lognormal_distributionmissing
26.4.8.4.3Class template chi_squared_distributionmissing
26.4.8.4.4Class template cauchy_distributionmissing
26.4.8.4.5Class template fisher_f_distributionmissing
26.4.8.4.6Class template student_t_distributionmissing
26.4.8.5Sampling distributionsmissing
26.4.8.5.1Class template discrete_distributionmissing
26.4.8.5.1Class template piecewise_constant_distributionmissing
26.4.8.5.1Class template general_pdf_distributionmissing
28Regular expressions
28.1Definitionsmissing
28.2Requirementsmissing
28.3Regular expressions summarymissing
28.4Header <regex> synopsismissing
28.5Namespace tr1::regex_constantsmissing
28.5.1Bitmask Type syntax_option_typemissing
28.5.2Bitmask Type regex_constants::match_flag_typemissing
28.5.3Implementation defined error_typemissing
28.6Class regex_errormissing
28.7Class template regex_traitsmissing
28.8Class template basic_regexmissing
28.8.1basic_regex constantsmissing
28.8.2basic_regex constructorsmissing
28.8.3basic_regex assignmissing
28.8.4basic_regex constant operationsmissing
28.8.5basic_regex localemissing
28.8.6basic_regex swapmissing
28.8.7basic_regex non-member functionsmissing
28.8.7.1basic_regex non-member swapmissing
28.9Class template sub_matchmissing
28.9.1sub_match membersmissing
28.9.2sub_match non-member operatorsmissing
28.10Class template match_resultsmissing
28.10.1match_results constructorsmissing
28.10.2match_results sizemissing
28.10.3match_results element accessmissing
28.10.4match_results formattingmissing
28.10.5match_results allocatormissing
28.10.6match_results swapmissing
28.11Regular expression algorithmsmissing
28.11.1exceptionsmissing
28.11.2regex_matchmissing
28.11.3regex_searchmissing
28.11.4regex_replacemissing
28.12Regular expression Iteratorsmissing
28.12.1Class template regex_iteratormissing
28.12.1.1regex_iterator constructorsmissing
28.12.1.2regex_iterator comparisonsmissing
28.12.1.3regex_iterator dereferencemissing
28.12.1.4regex_iterator incrementmissing
28.12.2Class template regex_token_iteratormissing
28.12.2.1regex_token_iterator constructorsmissing
28.12.2.2regex_token_iterator comparisonsmissing
28.12.2.3regex_token_iterator dereferencemissing
28.12.2.4regex_token_iterator incrementmissing
28.13Modified ECMAScript regular expression grammarmissing
CC compatibility
C2.1Additions to header <complex>done
C2.1.1Synopsisdone
C2.1.2Function acosdone
C2.1.3Function asindone
C2.1.4Function atandone
C2.1.5Function acoshdone
C2.1.6Function asinhdone
C2.1.7Function atanhdone
C2.1.8Function fabsdone
C2.1.9Additional Overloadsdone
C2.2Header <ccomplex>missingDR 551
C2.3Header <complex.h>missingDR 551
C2.4Additions to header <cctype>done
C2.4.1Synopsisdone
C2.4.2Function isblankdone
C2.5Additions to header <ctype.h>done
C2.6Header <cfenv>done
C2.6.1Synopsisdone
C2.6.2Definitionsdone
C2.7Header <fenv.h>done
C2.8Additions to header <cfloat>done
C2.9Additions to header <float.h>done
C2.10Additions to header <ios>missing
C2.10.1Synopsismissing
C2.10.2Function hexfloatmissing
C2.11Header <cinttypes>done
C2.11.1SynopsisdoneDR 557
C2.11.2Definitionsdone
C2.12Header <inttypes.h>done
C2.13Additions to header <climits>done
C2.14Additions to header <limits.h>done
C2.15Additions to header <locale>missing
C2.16Additions to header <cmath>done
C2.16.1Synopsisdone
C2.16.2Definitionsdone
C2.16.3Function template definitionsdone
C2.16.4Additional overloadsdoneDR 568; DR 550
C2.17Additions to header <math.h>done
C2.18Additions to header <cstdarg>done
C2.19Additions to header <stdarg.h>done
C2.20The header <cstdbool>done
C2.21The header <stdbool.h>done
C2.22The header <cstdint>done
C2.22.1Synopsisdone
C2.22.2Definitionsdone
C2.23The header <stdint.h>done
C2.24Additions to header <cstdio>done
C2.24.1Synopsisdone
C2.24.2Definitionsdone
C2.24.3Additional format specifiersdoneC library responsibility
C2.24.4Additions to header <stdio.h>done
C2.25Additions to header <cstdlib>done
C2.25.1Synopsisdone
C2.25.2Definitionsdone
C2.25.3Function absdone
C2.25.4Function divdone
C2.26Additions to header <stdlib.h>done
C2.27Header <ctgmath>doneDR 551
C2.28Header <tgmath.h>doneDR 551
C2.29Additions to header <ctime>doneC library responsibility
C2.30Additions to header <cwchar>done
C2.30.1Synopsisdone
C2.30.2Definitionsdone
C2.30.3Additional wide format specifiersdoneC library responsibility
C2.31Additions to header <wchar.h>done
C2.32Additions to header <cwctype>done
C2.32.1Synopsisdone
C2.32.2Function iswblankdone
C2.33Additions to header <wctype.h>done
DCompatibility Features
D.6Old iostream membersdone
D.8Bindersdone33911
D.9Class template auto_ptrdone33911
+ +

Footnotes

+ +
    + +
  1. + + The shared_ptr implementation uses some code from the + Boost + shared_ptr library. +
  2. + +
+ +

+Please send FSF & GNU inquiries & questions to +gnu@gnu.org. +There are also other ways +to contact the FSF. +

+ +

+These pages are maintained by +the GCC team. +

+ +
+For questions related to the use of GCC, please consult these web +pages and the GCC manuals. If +that fails, the gcc-help@gcc.gnu.org +mailing list might help.
+Please send comments on these web pages and the development of GCC to our +developer mailing list at gcc@gnu.org +or gcc@gcc.gnu.org. All of our lists +have public archives. +
+ +

+Copyright (C) Free Software Foundation, Inc., +51 Franklin St, Fifth Floor, Boston, MA 02110, USA. +

+

+Verbatim copying and distribution of this entire article is +permitted in any medium, provided this notice is preserved. +

+ + + + + + +
+ Last modified 2007-10-30 + + + Valid XHTML 1.0 + +
+ + + diff --git a/libstdc++-v3/doc/html/17_intro/c++1998_status.html b/libstdc++-v3/doc/html/17_intro/c++1998_status.html new file mode 100644 index 00000000000..7865e649982 --- /dev/null +++ b/libstdc++-v3/doc/html/17_intro/c++1998_status.html @@ -0,0 +1,6004 @@ +
+
+   Completion Checklist for the Standard C++ Library
+   Updated: 2003-04-25
+
+   Status Code Legend:
+    M - Missing
+    S - Present as stub.
+    X - Partially implemented, or buggy.
+    T - Implemented, pending test/inspection.
+    V - Verified to pass all available test suites.
+    Q - Qualified by inspection for non-testable correctness.
+    P - Portability verified.
+    C - Certified.
+
+   Lexical notes:
+   Only status codes appear in column 0.  Notes relating to conformance
+   issues appear [in brackets].
+
+   Note that this checklist does not (yet) include all emendations
+   recommended by the ISO Library Working Group:
+   http://anubis.dkuug.dk/jtc1/sc22/wg21/docs/lwg-toc.html
+
+   Detailed explanation of status codes:
+
+    M - Missing:  The name is not visible to programs that include
+        the specified header, either at compile or link stage.
+
+    S - Present as stub:  A program can use the name, but no implementation
+        is provided.  Programs that use the name link correctly, but
+        cannot usefully be run.
+
+    X - Partially implemented, or buggy:  Some implementation has been
+        provided, but it is known or believed not to conform fully.
+        It may have an incorrect base class, wrong namespace, wrong
+        storage class, or simply not fully implement requirements.
+        However, it may be sufficiently usable to help test other
+        components.
+
+    T - Implemented, pending test/inspection:  Implementation believed
+        to be complete, and informal testing suggests it is ready for
+        formal verification.
+
+    V - Verified, passes all test suites:  Verified to satisfy all
+        generically testable conformance requirements.
+
+    Q - Qualified by inspection for non-testable correctness:
+        Inspected, "implementation-defined" documentation accepted,
+        local usability criteria satisfied, formally inspected for
+        other untestable conformance.  (Untestable requirements
+        include exception-safety, thread-safety, worst-case
+        complexity, memory cleanliness, usefulness.)
+
+    P - Portability verified:  Qualified on all primary target platforms.
+
+    C - Certified:  Formally certified to have passed all tests,
+        inspections, qualifications; approved under "signing authority"
+        to be used to satisfy contractual guarantees.
+
+   ----------------------------------------------------------------------
+                          
+                                 
+                                  
+X                          
+                             
+                      
+          
+
+   [C header names must be in std:: to qualify.  Related to shadow/ dir.]
+                
+                
+X               
+                
+
+    Macro:
+X   errno,  declared  or  defined in .
+
+    Macro fn:
+X   setjmp(jmp_buf), declared or defined in 
+X   va_end(va_list), declared or defined in 
+
+    Types:
+X   clock_t, div_t, FILE, fpos_t, lconv, ldiv_t, mbstate_t,
+X   ptrdiff_t, sig_atomic_t, size_t,  time_t,  tm,  va_list,
+X   wctrans_t, wctype_t, and wint_t.
+
+   1 Which  of  the functions in the C++ Standard Library are not reentrant
+    subroutines is implementation-defined.
+
+   18.1  Types                                        [lib.support.types]
+X      
+X      NULL
+X      offsetof
+X      ptrdiff_t
+X      size_t
+
+   18.2  Implementation properties                   [lib.support.limits]
+
+    , , and 
+
+   18.2.1  Numeric limits                                    [lib.limits]
+
+X   template class numeric_limits;
+
+T   enum float_round_style;
+T   enum float_denorm_style;
+
+T   template<> class numeric_limits;
+
+T   template<> class numeric_limits;
+T   template<> class numeric_limits;
+T   template<> class numeric_limits;
+T   template<> class numeric_limits;
+
+T   template<> class numeric_limits;
+T   template<> class numeric_limits;
+T   template<> class numeric_limits;
+T   template<> class numeric_limits;
+T   template<> class numeric_limits;
+T   template<> class numeric_limits;
+
+X   template<> class numeric_limits;
+X   template<> class numeric_limits;
+X   template<> class numeric_limits;
+
+   18.2.1.1  Template class numeric_limits           [lib.numeric.limits]
+T   template class numeric_limits {
+    public:
+T     static const bool is_specialized = false;
+T     static T min() throw();
+T     static T max() throw();
+T     static const int  digits = 0;
+T     static const int  digits10 = 0;
+T     static const bool is_signed = false;
+T     static const bool is_integer = false;
+T     static const bool is_exact = false;
+T     static const int  radix = 0;
+T     static T epsilon() throw();
+T     static T round_error() throw();
+
+T     static const int  min_exponent = 0;
+T     static const int  min_exponent10 = 0;
+T     static const int  max_exponent = 0;
+T     static const int  max_exponent10 = 0;
+
+T     static const bool has_infinity = false;
+T     static const bool has_quiet_NaN = false;
+T     static const bool has_signaling_NaN = false;
+T     static const float_denorm_style has_denorm = denorm_absent;
+T     static const bool has_denorm_loss = false;
+T     static T infinity() throw();
+T     static T quiet_NaN() throw();
+T     static T signaling_NaN() throw();
+T     static T denorm_min() throw();
+
+T     static const bool is_iec559 = false;
+T     static const bool is_bounded = false;
+T     static const bool is_modulo = false;
+
+T     static const bool traps = false;
+T     static const bool tinyness_before = false;
+T     static const float_round_style round_style = round_toward_zero;
+    };
+
+   18.2.1.3  Type float_round_style                     [lib.round.style]
+
+T   enum float_round_style {
+T     round_indeterminate       = -1,
+T     round_toward_zero         =  0,
+T     round_to_nearest          =  1,
+T     round_toward_infinity     =  2,
+T     round_toward_neg_infinity =  3
+    };
+
+   18.2.1.4  Type float_denorm_style                   [lib.denorm.style]
+
+T   enum float_denorm_style {
+T     denorm_indeterminate = -1;
+T     denorm_absent = 0;
+T     denorm present = 1;
+    };
+
+   18.2.1.5  numeric_limits specializations         [lib.numeric.special]
+   
+   [Note: see Note at 18.2.1.  ]
+
+   18.2.2  C Library                                       [lib.c.limits]
+
+   1 Header  (Table 3):
+      CHAR_BIT   INT_MAX    LONG_MIN     SCHAR_MIN   UCHAR_MAX   USHRT_MAX
+X     CHAR_MAX   INT_MIN    MB_LEN_MAX   SHRT_MAX    UINT_MAX
+      CHAR_MIN   LONG_MAX   SCHAR_MAX    SHRT_MIN    ULONG_MAX
+
+   3 Header  (Table 4):
+
+    DBL_DIG          DBL_MIN_EXP      FLT_MIN_10_EXP   LDBL_MAX_10_EXP
+    DBL_EPSILON      FLT_DIG          FLT_MIN_EXP      LDBL_MAX_EXP
+    DBL_MANT_DIG     FLT_EPSILON      FLT_RADIX        LDBL_MIN
+X   DBL_MAX          FLT_MANT_DIG     FLT_ROUNDS       LDBL_MIN_10_EXP
+    DBL_MAX_10_EXP   FLT_MAX          LDBL_DIG         LDBL_MIN_EXP
+    DBL_MAX_EXP      FLT_MAX_10_EXP   LDBL_EPSILON
+    DBL_MIN          FLT_MAX_EXP      LDBL_MANT_DIG
+    DBL_MIN_10_EXP   FLT_MIN          LDBL_MAX
+
+
+        1 Header  (partial), Table 5:
+X             EXIT_FAILURE     EXIT_SUCCESS
+              abort   atexit   exit
+
+S    abort(void)
+S    extern "C" int atexit(void (*f)(void))
+S    extern "C++" int atexit(void (*f)(void))
+S    exit(int status)
+
+   18.4  Dynamic memory management                  [lib.support.dynamic]
+
+   Header  synopsis
+
+T    class bad_alloc;
+T    struct nothrow_t {};
+T    extern const nothrow_t nothrow;
+T    typedef void (*new_handler)();
+T    new_handler set_new_handler(new_handler new_p) throw();
+
+T    void* operator new(std::size_t size) throw(std::bad_alloc);
+T    void* operator new(std::size_t size, const std::nothrow_t&) throw();
+T    void  operator delete(void* ptr) throw();
+T    void  operator delete(void* ptr, const std::nothrow_t&) throw();
+T    void* operator new[](std::size_t size) throw(std::bad_alloc);
+T    void* operator new[](std::size_t size, const std::nothrow_t&) throw();
+T    void  operator delete[](void* ptr) throw();
+T    void  operator delete[](void* ptr, const std::nothrow_t&) throw();
+T    void* operator new  (std::size_t size, void* ptr) throw();
+T    void* operator new[](std::size_t size, void* ptr) throw();
+T    void  operator delete  (void* ptr, void*) throw();
+T    void  operator delete[](void* ptr, void*) throw();
+
+   18.4.2.1  Class bad_alloc                              [lib.bad.alloc]
+
+T   class bad_alloc : public exception {
+    public:
+T     bad_alloc() throw();
+T     bad_alloc(const bad_alloc&) throw();
+T     bad_alloc& operator=(const bad_alloc&) throw();
+T     virtual ~bad_alloc() throw();
+T     virtual const char* what() const throw();
+
+
+
+T  new_handler set_new_handler(new_handler new_p) throw();
+
+
+     Header  synopsis
+
+T    class type_info;
+T    class bad_cast;
+T    class bad_typeid;
+
+   18.5.1 - Class type_info [lib.type.info]
+
+T    class type_info {
+    public:
+T      virtual ~type_info();
+T      bool operator==(const type_info& rhs) const;
+T      bool operator!=(const type_info& rhs) const;
+T      bool before(const type_info& rhs) const;
+T      const char* name() const;
+    private:
+T      type_info(const type_info& rhs);
+T      type_info& operator=(const type_info& rhs);
+    };
+
+   18.5.2 - Class bad_cast [lib.bad.cast]
+
+T  bad_cast() throw();
+T  virtual const char* bad_cast::what() const throw();
+
+   18.5.3  Class bad_typeid                              [lib.bad.typeid]
+
+T    class bad_typeid : public exception {
+    public:
+T      bad_typeid() throw();
+T      bad_typeid(const bad_typeid&) throw();
+T      bad_typeid& operator=(const bad_typeid&) throw();
+T      virtual ~bad_typeid() throw();
+T      virtual const char* what() const throw();
+    };
+
+   18.6  Exception handling                       [lib.support.exception]
+
+T      Header  synopsis
+
+T    class exception;
+T    class bad_exception;
+
+T    typedef void (*unexpected_handler)();
+T    unexpected_handler set_unexpected(unexpected_handler f) throw();
+T    void unexpected();
+T    typedef void (*terminate_handler)();
+T    terminate_handler set_terminate(terminate_handler f) throw();
+T    void terminate();
+T    bool uncaught_exception();
+
+   18.6.1  Class exception                                [lib.exception]
+
+T    class exception {
+     public:
+T      exception() throw();
+T      exception(const exception&) throw();
+T      exception& operator=(const exception&) throw();
+T      virtual ~exception() throw();
+T      virtual const char* what() const throw();
+    };
+
+   18.6.2.1  Class bad_exception                      [lib.bad.exception]
+T    class bad_exception : public exception {
+    public:
+T      bad_exception() throw();
+T      bad_exception(const bad_exception&) throw();
+T      bad_exception& operator=(const bad_exception&) throw();
+T      virtual ~bad_exception() throw();
+T      virtual const char* what() const throw();
+    };
+
+   18.7  Other runtime support                      [lib.support.runtime]
+
+   1 Headers  (variable arguments),    (nonlocal  jumps),
+      (system  clock clock(), time()),  (signal handling),
+    and  (runtime environment getenv(), system()).
+
+                    Table 6--Header  synopsis
+                 Macros:   va_arg    va_end   va_start
+X                Type:     va_list
+
+                    Table 7--Header  synopsis
+
+                          Macro:      setjmp |
+X                         Type:       jmp_buf
+                          Function:   longjmp
+
+                     Table 8--Header  synopsis
+
+                      Macros:      CLOCKS_PER_SEC
+X                     Types:       clock_t
+                      Functions:   clock
+
+                    Table 9--Header  synopsis
+
+X        Macros:      SIGABRT        SIGILL   SIGSEGV   SIG_DFL
+         SIG_IGN      SIGFPE         SIGINT   SIGTERM   SIG_ERR
+         Type:        sig_atomic_t
+         Functions:   raise          signal
+
+                   Table 10--Header  synopsis
+
+X                     Functions:   getenv   system
+
+   19.1  Exception classes                           [lib.std.exceptions]
+
+   Header  synopsis
+
+T     class logic_error;
+T     class domain_error;
+T     class invalid_argument;
+T     class length_error;
+T     class out_of_range;
+T     class runtime_error;
+T     class range_error;
+T     class overflow_error;
+T     class underflow_error;
+
+   19.1.1  Class logic_error                            [lib.logic.error]
+T   class logic_error : public exception {
+    public:
+T     explicit logic_error(const string& what_arg);
+    };
+
+   19.1.2  Class domain_error                          [lib.domain.error]
+
+T   class domain_error : public logic_error {
+    public:
+T     explicit domain_error(const string& what_arg);
+    };
+
+   19.1.3  Class invalid_argument                  [lib.invalid.argument]
+
+T   class invalid_argument : public logic_error {
+    public:
+T     explicit invalid_argument(const string& what_arg);
+    };
+
+   19.1.4  Class length_error                          [lib.length.error]
+
+T   class length_error : public logic_error {
+    public:
+T     explicit length_error(const string& what_arg);
+    };
+
+   19.1.5  Class out_of_range                          [lib.out.of.range]
+
+T   class out_of_range : public logic_error {
+    public:
+T     explicit out_of_range(const string& what_arg);
+    };
+
+
+   19.1.6  Class runtime_error                        [lib.runtime.error]
+
+T   class runtime_error : public exception {
+    public:
+T     explicit runtime_error(const string& what_arg);
+    };
+
+
+   19.1.7  Class range_error                            [lib.range.error]
+
+T   class range_error : public runtime_error {
+    public:
+T     explicit range_error(const string& what_arg);
+    };
+
+   19.1.8  Class overflow_error                      [lib.overflow.error]
+
+T   class overflow_error : public runtime_error {
+    public:
+T     explicit overflow_error(const string& what_arg);
+    };
+
+
+   19.1.9  Class underflow_error                    [lib.underflow.error]
+
+T   class underflow_error : public runtime_error {
+    public:
+T     explicit underflow_error(const string& what_arg);
+    };
+
+
+   19.2  Assertions                                      [lib.assertions]
+
+                    Table 2--Header  synopsis
+
+X                         Macro:   assert
+
+   19.3  Error numbers                                        [lib.errno]
+
+                    Table 3--Header  synopsis
+
+X                    |Macros:   EDOM   ERANGE   errno |
+
+
+   20.2  Utility components                                 [lib.utility]
+
+   Header  synopsis
+
+    // _lib.operators_, operators:
+T    namespace rel_ops {
+T      template bool operator!=(const T&, const T&);
+T      template bool operator> (const T&, const T&);
+T      template bool operator<=(const T&, const T&);
+T      template bool operator>=(const T&, const T&);
+    }
+    // _lib.pairs_, pairs:
+T   template  struct pair;
+T   template 
+      bool operator==(const pair&, const pair&);
+T   template 
+      bool operator< (const pair&, const pair&);
+T   template 
+      bool operator!=(const pair&, const pair&);
+T   template 
+      bool operator> (const pair&, const pair&);
+T   template 
+      bool operator>=(const pair&, const pair&);
+T   template 
+      bool operator<=(const pair&, const pair&);
+T   template  pair make_pair(const T1&, const T2&);
+
+
+   20.2.2  Pairs                                              [lib.pairs]
+
+T  template 
+   struct pair {
+T    typedef T1 first_type;
+T    typedef T2 second_type;
+
+T    T1 first;
+T    T2 second;
+T    pair();
+T    pair(const T1& x, const T2& y);
+T    template pair(const pair &p);
+   };
+
+   20.3  Function objects                          [lib.function.objects]
+
+   Header  synopsis
+
+    // _lib.base_, base:
+V   template  struct unary_function;
+V   template  struct binary_function;
+
+    // _lib.arithmetic.operations_, arithmetic operations:
+V   template  struct plus;
+V   template  struct minus;
+V   template  struct multiplies;
+V   template  struct divides;
+V   template  struct modulus;
+V   template  struct negate;
+    // _lib.comparisons_, comparisons:
+V   template  struct equal_to;
+V   template  struct not_equal_to;
+V   template  struct greater;
+V   template  struct less;
+V   template  struct greater_equal;
+V   template  struct less_equal;
+    // _lib.logical.operations_, logical operations:
+V   template  struct logical_and;
+V   template  struct logical_or;
+V   template  struct logical_not;
+    // _lib.negators_, negators:
+    template  struct unary_negate;
+V   template 
+      unary_negate  not1(const Predicate&);
+V   template  struct binary_negate;
+V   template 
+      binary_negate not2(const Predicate&);
+    // _lib.binders_, binders:
+V   template   class binder1st;
+V   template 
+      binder1st bind1st(const Operation&, const T&);
+V   template  class binder2nd;
+V   template 
+      binder2nd bind2nd(const Operation&, const T&);
+    // _lib.function.pointer.adaptors_, adaptors:
+V   template  class pointer_to_unary_function;
+V   template 
+      pointer_to_unary_function ptr_fun(Result (*)(Arg));
+V   template 
+      class pointer_to_binary_function;
+V   template 
+      pointer_to_binary_function
+        ptr_fun(Result (*)(Arg1,Arg2));
+
+    // _lib.member.pointer.adaptors_, adaptors:
+V   template class mem_fun_t;
+V   template class mem_fun1_t;
+V   template
+        mem_fun_t mem_fun(S (T::*f)());
+V   template
+        mem_fun1_t mem_fun(S (T::*f)(A));
+V   template class mem_fun_ref_t;
+V   template class mem_fun1_ref_t;
+V   template
+        mem_fun_ref_t mem_fun_ref(S (T::*f)());
+V   template
+        mem_fun1_ref_t mem_fun_ref(S (T::*f)(A));
+
+V   template  class const_mem_fun_t;
+V   template  class const_mem_fun1_t;
+V   template 
+      const_mem_fun_t mem_fun(S (T::*f)() const);
+V   template 
+      const_mem_fun1_t mem_fun(S (T::*f)(A) const);
+V   template  class const_mem_fun_ref_t;
+V   template  class const_mem_fun1_ref_t;
+V   template 
+      const_mem_fun_ref_t mem_fun_ref(S (T::*f)() const);
+V   template 
+      const_mem_fun1_ref_t mem_fun_ref(S (T::*f)(A) const);
+   }
+
+   20.3.1  Base                                                [lib.base]
+
+V   template 
+    struct unary_function {
+V     typedef Arg    argument_type;
+V     typedef Result result_type;
+    };
+V   template 
+    struct binary_function {
+V     typedef Arg1   first_argument_type;
+V     typedef Arg2   second_argument_type;
+V     typedef Result result_type;
+    };
+
+   20.3.2  Arithmetic operations              [lib.arithmetic.operations]
+
+T  template  struct plus : binary_function {
+V   T operator()(const T& x, const T& y) const;
+   };
+
+T  template  struct minus : binary_function {
+V   T operator()(const T& x, const T& y) const;
+   };
+
+T  template  struct multiplies : binary_function {
+V   T operator()(const T& x, const T& y) const;
+   };
+
+T  template  struct divides : binary_function {
+V   T operator()(const T& x, const T& y) const;
+   };
+
+T  template  struct modulus : binary_function {
+V   T operator()(const T& x, const T& y) const;
+   };
+
+T  template  struct negate : unary_function {
+V   T operator()(const T& x) const;
+   };
+
+   20.3.3  Comparisons                                  [lib.comparisons]
+
+T  template  struct equal_to : binary_function {
+V   bool operator()(const T& x, const T& y) const;
+   };
+
+T  template  struct not_equal_to : binary_function {
+V   bool operator()(const T& x, const T& y) const;
+   };
+
+T  template  struct greater : binary_function {
+V   bool operator()(const T& x, const T& y) const;
+   };
+
+T  template  struct less : binary_function {
+V   bool operator()(const T& x, const T& y) const;
+   };
+
+T  template  struct greater_equal : binary_function {
+V   bool operator()(const T& x, const T& y) const;
+   };
+
+T  template  struct less_equal : binary_function {
+V   bool operator()(const T& x, const T& y) const;
+   };
+
+   20.3.4  Logical operations                    [lib.logical.operations]
+
+T  template  struct logical_and : binary_function {
+V   bool operator()(const T& x, const T& y) const;
+   };
+
+T  template  struct logical_or : binary_function {
+V   bool operator()(const T& x, const T& y) const;
+   };
+
+T  template  struct logical_not : unary_function {
+V   bool operator()(const T& x) const;
+   };
+
+   20.3.5  Negators                                        [lib.negators]
+
+T  template 
+    class unary_negate
+      : public unary_function {
+   public:
+T   explicit unary_negate(const Predicate& pred);
+V   bool operator()(const typename Predicate::argument_type& x) const;
+   };
+
+T  template 
+    class binary_negate
+      : public binary_function {
+    public:
+T     explicit binary_negate(const Predicate& pred);
+V     bool operator()(const typename Predicate::first_argument_type&  x,
+          const typename Predicate::second_argument_type& y) const;
+    };
+
+
+   20.3.6  Binders                                          [lib.binders]
+
+   20.3.6.1  Template class binder1st                    [lib.binder.1st]
+T   template 
+    class binder1st
+      : public unary_function {
+    protected:
+T     Operation                      op;
+T     typename Operation::first_argument_type value;
+    public:
+V     binder1st(const Operation& x,
+                const typename Operation::first_argument_type& y);
+V     typename Operation::result_type
+        operator()(const typename Operation::second_argument_type& x) const;
+    };
+
+   20.3.6.2  bind1st                                       [lib.bind.1st]
+
+V  template 
+    binder1st bind1st(const Operation& op, const T& x);
+
+   20.3.6.3  Template class binder2nd                    [lib.binder.2nd]
+T   template 
+    class binder2nd
+      : public unary_function {
+    protected:
+T     Operation                       op;
+T     typename Operation::second_argument_type value;
+    public:
+V     binder2nd(const Operation& x,
+                const typename Operation::second_argument_type& y);
+V     typename Operation::result_type
+        operator()(const typename Operation::first_argument_type& x) const;
+    };
+
+   20.3.6.4  bind2nd                                       [lib.bind.2nd]
+
+T  template 
+    binder2nd bind2nd(const Operation& op, const T& x);
+
+
+   20.3.7  Adaptors for pointers to       [lib.function.pointer.adaptors]
+       functions
+
+   1 To  allow  pointers to (unary and binary) functions to work with func-
+   tion adaptors the library provides:
+
+T   template 
+    class pointer_to_unary_function : public unary_function {
+    public:
+T     explicit pointer_to_unary_function(Result (*f)(Arg));
+V     Result operator()(Arg x) const;
+    };
+
+T  template 
+    pointer_to_unary_function ptr_fun(Result (*f)(Arg));
+
+T       template 
+        class pointer_to_binary_function :
+          public binary_function {
+        public:
+T         explicit pointer_to_binary_function(Result (*f)(Arg1, Arg2));
+V         Result operator()(Arg1 x, Arg2 y) const;
+        };
+
+
+   20.3.8  Adaptors for pointers to         [lib.member.pointer.adaptors]
+       members
+
+T  template  class mem_fun_t
+          : public unary_function {
+   public:
+T   explicit mem_fun_t(S (T::*p)());
+V   S operator()(T* p) const;
+   };
+
+T   template  class mem_fun1_t
+          : public binary_function {
+    public:
+T     explicit mem_fun1_t(S (T::*p)(A));
+V     S operator()(T* p, A x) const;
+   };
+
+V   template mem_fun_t
+       mem_fun(S (T::*f)());
+V   template mem_fun1_t
+       mem_fun(S (T::*f)(A));
+
+T   template  class mem_fun_ref_t
+          : public unary_function {
+    public:
+T     explicit mem_fun_ref_t(S (T::*p)());
+V     S operator()(T& p) const;
+   };
+
+T   template  class mem_fun1_ref_t
+          : public binary_function {
+    public:
+T     explicit mem_fun1_ref_t(S (T::*p)(A));
+V     S operator()(T& p, A x) const;
+   };
+
+T   template mem_fun_ref_t
+       mem_fun_ref(S (T::*f)());
+
+T   template mem_fun1_ref_t
+       mem_fun_ref(S (T::*f)(A));
+
+T  template  class const_mem_fun_t
+        : public unary_function {
+   public:
+T   explicit const_mem_fun_t(S (T::*p)() const);
+V   S operator()(const T* p) const;
+   };
+
+T  template  class const_mem_fun1_t
+        : public binary_function {
+   public:
+T   explicit const mem_fun1_t(S (T::*p)(A) const);
+V   S operator()(const T* p, A x) const;
+   };
+
+V   template const_mem_fun_t
+       mem_fun(S (T::*f)() const);
+V   template const_mem_fun1_t
+       mem_fun(S (T::*f)(A) const);
+
+T   template  class const_mem_fun_ref_t
+          : public unary_function {
+    public:
+T     explicit const_mem_fun_ref_t(S (T::*p)() const);
+V     S operator()(const T& p) const;
+   };
+
+T   template  class const_mem_fun1_ref_t
+          : public binary_function {
+    public:
+T     explicit const_mem_fun1_ref_t(S (T::*p)(A) const);
+V     S operator()(const T& p, A x) const;
+   };
+
+T   template const_mem_fun_ref_t
+       mem_fun_ref(S (T::*f)() const);
+
+T   template const_mem_fun1_ref_t
+        mem_fun_ref(S (T::*f)(A) const);
+
+   20.4  Memory                                              [lib.memory]
+
+   Header  synopsis
+
+    // _lib.default.allocator_, the default allocator:
+T   template  class allocator;
+T   template <> class allocator;
+T   template 
+      bool operator==(const allocator&, const allocator&) throw();
+T   template 
+      bool operator!=(const allocator&, const allocator&) throw();
+    // _lib.storage.iterator_, raw storage iterator:
+T   template  class raw_storage_iterator;
+    // _lib.temporary.buffer_, temporary buffers:
+T   template 
+      pair get_temporary_buffer(ptrdiff_t n);
+T   template 
+      void return_temporary_buffer(T* p);
+    // _lib.specialized.algorithms_, specialized algorithms:
+T   template 
+      ForwardIterator
+        uninitialized_copy(InputIterator first, InputIterator last,
+                           ForwardIterator result);
+T   template 
+      void uninitialized_fill(ForwardIterator first, ForwardIterator last,
+                              const T& x);
+T   template 
+      void uninitialized_fill_n(ForwardIterator first, Size n, const T& x);
+    // _lib.auto.ptr_, pointers:
+X   template class auto_ptr;
+   }
+
+   20.4.1  The default allocator                  [lib.default.allocator]
+
+T   template  class allocator;
+    // specialize for void:
+T   template <> class allocator {
+    public:
+T     typedef void*       pointer;
+T     typedef const void* const_pointer;
+      // reference-to-void members are impossible.
+T     typedef void  value_type;
+T     template  struct rebind { typedef allocator other; };
+    };
+
+T   template  class allocator {
+     public:
+T     typedef size_t    size_type;
+T     typedef ptrdiff_t difference_type;
+T     typedef T*        pointer;
+T     typedef const T*  const_pointer;
+T     typedef T&        reference;
+T     typedef const T&  const_reference;
+T     typedef T         value_type;
+T     template  struct rebind { typedef allocator other; };
+T     allocator() throw();
+T     allocator(const allocator&) throw();
+T     template  allocator(const allocator&) throw();
+T    ~allocator() throw();
+T     pointer address(reference x) const;
+T     const_pointer address(const_reference x) const;
+T     pointer allocate(
+        size_type, allocator::const_pointer hint = 0);
+T     void deallocate(pointer p, size_type n);
+T     size_type max_size() const throw();
+T     void construct(pointer p, const T& val);
+T     void destroy(pointer p);
+    };
+
+   20.4.1.2  allocator globals                    [lib.allocator.globals]
+
+T  template 
+    bool operator==(const allocator&, const allocator&) throw();
+T  template 
+    bool operator!=(const allocator&, const allocator&) throw();
+
+   20.4.2  Raw storage iterator                    [lib.storage.iterator]
+
+T   template 
+    class raw_storage_iterator
+      : public iterator {
+    public:
+T     explicit raw_storage_iterator(OutputIterator x);
+T     raw_storage_iterator& operator*();
+T     raw_storage_iterator& operator=(const T& element);
+T     raw_storage_iterator& operator++();
+T     raw_storage_iterator  operator++(int);
+    };
+
+   20.4.3  Temporary buffers                       [lib.temporary.buffer]
+
+T  template 
+    pair get_temporary_buffer(ptrdiff_t n);
+
+T  template  void return_temporary_buffer(T* p);
+
+   20.4.4  Specialized algorithms            [lib.specialized.algorithms]
+
+   20.4.4.1  uninitialized_copy                  [lib.uninitialized.copy]
+
+V  template 
+    ForwardIterator
+      uninitialized_copy(InputIterator first, InputIterator last,
+                         ForwardIterator result);
+
+   20.4.4.2  uninitialized_fill                  [lib.uninitialized.fill]
+
+V  template 
+    void uninitialized_fill(ForwardIterator first, ForwardIterator last,
+                            const T& x);
+
+   20.4.4.3  uninitialized_fill_n              [lib.uninitialized.fill.n]
+
+V  template 
+    void uninitialized_fill_n(ForwardIterator first, Size n, const T& x);
+
+   20.4.5  Template class auto_ptr                         [lib.auto.ptr]
+
+X   template class auto_ptr {
+      template  struct auto_ptr_ref {};
+    public:
+T     typedef X element_type;
+      // _lib.auto.ptr.cons_ construct/copy/destroy:
+T     explicit auto_ptr(X* p =0) throw();
+T     auto_ptr(auto_ptr&) throw();
+T     template auto_ptr(auto_ptr&) throw();
+T     auto_ptr& operator=(auto_ptr&) throw();
+T     template auto_ptr& operator=(auto_ptr&) throw();
+T    ~auto_ptr() throw();
+      // _lib.auto.ptr.members_ members:
+T     X& operator*() const throw();
+T     X* operator->() const throw();
+T     X* get() const throw();
+T     X* release() throw();
+T     void reset(X* p =0) throw();
+
+      // _lib.auto.ptr.conv_ conversions:
+X     auto_ptr(auto_ptr_ref) throw();
+X     template operator auto_ptr_ref() throw();
+X     template operator auto_ptr() throw();
+    };
+
+   20.4.6  C Library                                       [lib.c.malloc]
+
+                    Table 7--Header  synopsis
+
+X                    Functions:   calloc   malloc
+                                  free     realloc
+
+
+                    Table 8--Header  synopsis
+
+X                    Macro:       NULL
+X                    Type:        size_t
+X                    Functions:   memchr    memcmp
+X                    memcpy       memmove   memset
+
+                     Table 9--Header  synopsis
+
+X          Macros:   NULL
+X          Types:    size_t   clock_t    time_t
+X          Struct:   tm
+           Functions:
+X          asctime   clock    difftime   localtime   strftime
+X          ctime     gmtime   mktime     time
+
+   21.1.1  Character traits requirements        [lib.char.traits.require]
+
+   2 The struct template
+T  template struct char_traits;
+   shall be provided in the header  as a basis for  explicit spe-
+   cializations.
+
+
+   21.1.3.1  struct                [lib.char.traits.specializations.char]
+       char_traits
+
+T   template<>
+    struct char_traits {
+T     typedef char        char_type;
+T     typedef int         int_type;
+T     typedef streamoff   off_type;
+T     typedef streampos   pos_type;
+T     typedef mbstate_t   state_type;
+
+T     static void assign(char_type& c1, const char_type& c2);
+T     static bool eq(const char_type& c1, const char_type& c2);
+T     static bool lt(const char_type& c1, const char_type& c2);
+
+T     static int compare(const char_type* s1, const char_type* s2, size_t n);
+T     static size_t length(const char_type* s);
+T     static const char_type* find(const char_type* s, size_t n,
+                                   const char_type& a);
+T     static char_type* move(char_type* s1, const char_type* s2, size_t n);
+T     static char_type* copy(char_type* s1, const char_type* s2, size_t n);
+T     static char_type* assign(char_type* s, size_t n, char_type a);
+
+T     static int_type not_eof(const int_type& c);
+T     static char_type to_char_type(const int_type& c);
+T     static int_type to_int_type(const char_type& c);
+T     static bool eq_int_type(const int_type& c1, const int_type& c2);
+T     static int_type eof();
+    };
+
+   21.1.3.2  struct             [lib.char.traits.specializations.wchar.t]
+       char_traits
+
+V   template<>
+    struct char_traits {
+V     typedef wchar_t      char_type;
+V     typedef wint_t       int_type;
+V     typedef streamoff   off_type;
+V     typedef wstreampos   pos_type;
+V     typedef mbstate_t    state_type;
+
+V     static void assign(char_type& c1, const char_type& c2);
+V     static bool eq(const char_type& c1, const char_type& c2);
+V     static bool lt(const char_type& c1, const char_type& c2);
+
+V     static int compare(const char_type* s1, const char_type* s2, size_t n);
+V     static size_t length(const char_type* s);
+V     static const char_type* find(const char_type* s, size_t n,
+                                   const char_type& a);
+V     static char_type* move(char_type* s1, const char_type* s2, size_t n);
+V     static char_type* copy(char_type* s1, const char_type* s2, size_t n);
+V     static char_type* assign(char_type* s, size_t n, char_type a);
+
+V     static int_type not_eof(const int_type& c);
+V     static char_type to_char_type(const int_type& c);
+V     static int_type to_int_type(const char_type& c);
+V     static bool eq_int_type(const int_type& c1, const int_type& c2);
+V     static int_type eof();
+    };
+
+   21.2  String classes                              [lib.string.classes]
+
+    // _lib.char.traits_, character traits:
+V   template
+      struct char_traits;
+V   template <> struct char_traits;
+V   template <> struct char_traits;
+
+    // _lib.basic.string_, basic_string:
+V   template,
+             class Allocator = allocator >
+      class basic_string;
+V   template
+      basic_string
+        operator+(const basic_string& lhs,
+                  const basic_string& rhs);
+V   template
+      basic_string
+        operator+(const charT* lhs,
+                  const basic_string& rhs);
+V   template
+      basic_string
+        operator+(charT lhs, const basic_string& rhs);
+V   template
+      basic_string
+        operator+(const basic_string& lhs,
+                  const charT* rhs);
+V   template
+      basic_string
+        operator+(const basic_string& lhs, charT rhs);
+
+V   template
+      bool operator==(const basic_string& lhs,
+                      const basic_string& rhs);
+V   template
+      bool operator==(const charT* lhs,
+                      const basic_string& rhs);
+V   template
+      bool operator==(const basic_string& lhs,
+                      const charT* rhs);
+V   template
+      bool operator!=(const basic_string& lhs,
+                      const basic_string& rhs);
+V   template
+      bool operator!=(const charT* lhs,
+                      const basic_string& rhs);
+V   template
+      bool operator!=(const basic_string& lhs,
+                      const charT* rhs);
+V   template
+      bool operator< (const basic_string& lhs,
+                      const basic_string& rhs);
+V   template
+      bool operator< (const basic_string& lhs,
+                      const charT* rhs);
+V   template
+      bool operator< (const charT* lhs,
+                      const basic_string& rhs);
+V   template
+      bool operator> (const basic_string& lhs,
+                      const basic_string& rhs);
+V   template
+      bool operator> (const basic_string& lhs,
+                      const charT* rhs);
+V   template
+      bool operator> (const charT* lhs,
+                      const basic_string& rhs);
+V   template
+      bool operator<=(const basic_string& lhs,
+                      const basic_string& rhs);
+V   template
+      bool operator<=(const basic_string& lhs,
+                      const charT* rhs);
+V   template
+      bool operator<=(const charT* lhs,
+                      const basic_string& rhs);
+V   template
+      bool operator>=(const basic_string& lhs,
+                      const basic_string& rhs);
+V   template
+      bool operator>=(const basic_string& lhs,
+                      const charT* rhs);
+V   template
+      bool operator>=(const charT* lhs,
+                      const basic_string& rhs);
+
+    // _lib.string.special_:
+V   template
+       void swap(basic_string& lhs,
+                 basic_string& rhs);
+V   template
+     basic_istream&
+      operator>>(basic_istream& is,
+                 basic_string& str);
+T   template
+     basic_ostream&
+      operator<<(basic_ostream& os,
+                 const basic_string& str);
+V   template
+     basic_istream&
+       getline(basic_istream& is,
+               basic_string& str,
+               charT delim);
+V   template
+     basic_istream&
+       getline(basic_istream& is,
+               basic_string& str);
+V   typedef basic_string string;
+T   typedef basic_string wstring;
+   }
+
+   21.3  Template class basic_string                   [lib.basic.string]
+
+V  namespace std {
+    template,
+             class Allocator = allocator >
+    class basic_string {
+    public:
+      // types:
+      typedef          traits                     traits_type;
+      typedef typename traits::char_type          value_type;
+      typedef          Allocator                  allocator_type;
+      typedef typename Allocator::size_type       size_type;
+      typedef typename Allocator::difference_type difference_type;
+      typedef typename Allocator::reference       reference;
+      typedef typename Allocator::const_reference const_reference;
+      typedef typename Allocator::pointer         pointer;
+      typedef typename Allocator::const_pointer   const_pointer;
+      typedef implementation defined             iterator;
+      typedef implementation defined             const_iterator;
+      typedef std::reverse_iterator reverse_iterator;
+      typedef std::reverse_iterator const_reverse_iterator;
+      static const size_type npos = -1;
+
+      // _lib.string.cons_ construct/copy/destroy:
+V     explicit basic_string(const Allocator& a = Allocator());
+V     basic_string(const basic_string& str, size_type pos = 0,
+                   size_type n = npos, const Allocator& a = Allocator());
+V     basic_string(const charT* s,
+                   size_type n, const Allocator& a = Allocator());
+V     basic_string(const charT* s, const Allocator& a = Allocator());
+V     basic_string(size_type n, charT c, const Allocator& a = Allocator());
+V     template
+        basic_string(InputIterator begin, InputIterator end,
+                     const Allocator& a = Allocator());
+V    ~basic_string();
+V     basic_string& operator=(const basic_string& str);
+V     basic_string& operator=(const charT* s);
+V     basic_string& operator=(charT c);
+      // _lib.string.iterators_ iterators:
+V     iterator       begin();
+V     const_iterator begin() const;
+V     iterator       end();
+V     const_iterator end() const;
+
+V     reverse_iterator       rbegin();
+V     const_reverse_iterator rbegin() const;
+V     reverse_iterator       rend();
+V     const_reverse_iterator rend() const;
+      // _lib.string.capacity_ capacity:
+V     size_type size() const;
+V     size_type length() const;
+V     size_type max_size() const;
+V     void resize(size_type n, charT c);
+V     void resize(size_type n);
+V     size_type capacity() const;
+V     void reserve(size_type res_arg = 0);
+V     void clear();
+V     bool empty() const;
+      // _lib.string.access_ element access:
+V     const_reference operator[](size_type pos) const;
+V     reference       operator[](size_type pos);
+V     const_reference at(size_type n) const;
+V     reference       at(size_type n);
+      // _lib.string.modifiers_ modifiers:
+V     basic_string& operator+=(const basic_string& str);
+V     basic_string& operator+=(const charT* s);
+V     basic_string& operator+=(charT c);
+V     basic_string& append(const basic_string& str);
+V     basic_string& append(const basic_string& str, size_type pos,
+                           size_type n);
+V     basic_string& append(const charT* s, size_type n);
+V     basic_string& append(const charT* s);
+V     basic_string& append(size_type n, charT c);
+V     template
+        basic_string& append(InputIterator first, InputIterator last);
+V     void push_back(const charT);
+
+V     basic_string& assign(const basic_string&);
+V     basic_string& assign(const basic_string& str, size_type pos,
+                           size_type n);
+V     basic_string& assign(const charT* s, size_type n);
+V     basic_string& assign(const charT* s);
+V     basic_string& assign(size_type n, charT c);
+V     template
+        basic_string& assign(InputIterator first, InputIterator last);
+V     basic_string& insert(size_type pos1, const basic_string& str);
+V     basic_string& insert(size_type pos1, const basic_string& str,
+                           size_type pos2, size_type n);
+V     basic_string& insert(size_type pos, const charT* s, size_type n);
+V     basic_string& insert(size_type pos, const charT* s);
+V     basic_string& insert(size_type pos, size_type n, charT c);
+V     iterator insert(iterator p, charT c);
+V     void     insert(iterator p, size_type n, charT c);
+V     template
+        void insert(iterator p, InputIterator first, InputIterator last);
+V     basic_string& erase(size_type pos = 0, size_type n = npos);
+V     iterator erase(iterator position);
+V     iterator erase(iterator first, iterator last);
+V     basic_string& replace(size_type pos1, size_type n1,
+                            const basic_string& str);
+V     basic_string& replace(size_type pos1, size_type n1,
+                            const basic_string& str,
+                            size_type pos2, size_type n2);
+V     basic_string& replace(size_type pos, size_type n1, const charT* s,
+                            size_type n2);
+V     basic_string& replace(size_type pos, size_type n1, const charT* s);
+V     basic_string& replace(size_type pos, size_type n1, size_type n2,
+                            charT c);
+V     basic_string& replace(iterator i1, iterator i2, const basic_string& str);
+V     basic_string& replace(iterator i1, iterator i2, const charT* s,
+                            size_type n);
+V     basic_string& replace(iterator i1, iterator i2, const charT* s);
+V     basic_string& replace(iterator i1, iterator i2,
+                            size_type n, charT c);
+V     template
+        basic_string& replace(iterator i1, iterator i2,
+                              InputIterator j1, InputIterator j2);
+V     size_type copy(charT* s, size_type n, size_type pos = 0) const;
+V     void swap(basic_string&);
+      // _lib.string.ops_ string operations:
+V     const charT* c_str() const;         // explicit
+V     const charT* data() const;
+V     allocator_type get_allocator() const;
+V     size_type find (const basic_string& str, size_type pos = 0) const;
+V     size_type find (const charT* s, size_type pos, size_type n) const;
+V     size_type find (const charT* s, size_type pos = 0) const;
+V     size_type find (charT c, size_type pos = 0) const;
+V     size_type rfind(const basic_string& str, size_type pos = npos) const;
+V     size_type rfind(const charT* s, size_type pos, size_type n) const;
+V     size_type rfind(const charT* s, size_type pos = npos) const;
+V     size_type rfind(charT c, size_type pos = npos) const;
+
+V     size_type find_first_of(const basic_string& str,
+                              size_type pos = 0) const;
+V     size_type find_first_of(const charT* s,
+                              size_type pos, size_type n) const;
+V     size_type find_first_of(const charT* s, size_type pos = 0) const;
+V     size_type find_first_of(charT c, size_type pos = 0) const;
+V     size_type find_last_of (const basic_string& str,
+                              size_type pos = npos) const;
+V     size_type find_last_of (const charT* s,
+                              size_type pos, size_type n) const;
+V     size_type find_last_of (const charT* s, size_type pos = npos) const;
+V     size_type find_last_of (charT c, size_type pos = npos) const;
+V     size_type find_first_not_of(const basic_string& str,
+                                  size_type pos = 0) const;
+V     size_type find_first_not_of(const charT* s, size_type pos,
+                                  size_type n) const;
+V     size_type find_first_not_of(const charT* s, size_type pos = 0) const;
+V     size_type find_first_not_of(charT c, size_type pos = 0) const;
+V     size_type find_last_not_of (const basic_string& str,
+                                  size_type pos = npos) const;
+V     size_type find_last_not_of (const charT* s, size_type pos,
+                                  size_type n) const;
+V     size_type find_last_not_of (const charT* s,
+                                  size_type pos = npos) const;
+V     size_type find_last_not_of (charT c, size_type pos = npos) const;
+V     basic_string substr(size_type pos = 0, size_type n = npos) const;
+V     int compare(const basic_string& str) const;
+V     int compare(size_type pos1, size_type n1,
+                  const basic_string& str) const;
+V     int compare(size_type pos1, size_type n1,
+                  const basic_string& str,
+                  size_type pos2, size_type n2) const;
+V     int compare(const charT* s) const;
+V     int compare(size_type pos1, size_type n1,
+                  const charT* s, size_type n2 = npos) const;
+    };
+   }
+
+   21.4  Null-terminated sequence utilities               [lib.c.strings]
+
+                    Table 10--Header  synopsis
+
+            isalnum   isdigit   isprint   isupper    tolower
+X           isalpha   isgraph   ispunct   isxdigit   toupper
+            iscntrl   islower   isspace
+
+                   Table 11--Header  synopsis
+
+X  Macro:     WEOF 
+X  Types:     wctrans_t   wctype_t   wint_t 
+   Functions:
+X  iswalnum   iswctype    iswlower   iswspace    towctrans   wctrans
+X  iswalpha   iswdigit    iswprint   iswupper    towlower    wctype
+X  iswcntrl   iswgraph    iswpunct   iswxdigit   towupper
+
+                   Table 12--Header  synopsis
+
+X           Macro:    NULL 
+X           Type:     size_t 
+            Functions:
+X           memchr    strcat    strcspn    strncpy   strtok
+X           memcmp    strchr    strerror   strpbrk   strxfrm
+X           memcpy    strcmp    strlen     strrchr
+X           memmove   strcoll   strncat    strspn
+X           memset    strcpy    strncmp    strstr
+
+                    Table 13--Header  synopsis
+   Macros:    NULL    WCHAR_MAX         WCHAR_MIN   WEOF 
+   Types:     mbstate_t       wint_t    size_t
+   Functions:
+X  btowc      getwchar        ungetwc           wcscpy      wcsrtombs   wmemchr
+X  fgetwc     mbrlen          vfwprintf         wcscspn     wcsspn      wmemcmp
+X  fgetws     mbrtowc         vswprintf         wcsftime    wcsstr      wmemcpy
+X  fputwc     mbsinit         vwprintf          wcslen      wcstod      wmemmove
+X  fputws     mbsrtowcs       wcrtomb           wcsncat     wcstok      wmemset
+X  fwide      putwc           wcscat            wcsncmp     wcstol      wprintf
+X  fwprintf   putwchar        wcschr            wcsncpy     wcstoul     wscanf
+X  fwscanf    swprintf        wcscmp            wcspbrk     wcsxfrm
+X  getwc      swscanf         wcscoll           wcsrchr     wctob
+
+                   Table 14--Header  synopsis
+
+               Macros:   MB_CUR_MAX
+               Functions:
+X              atol      mblen        strtod    wctomb
+X              atof      mbstowcs     strtol    wcstombs
+X              atoi      mbtowc       strtoul
+
+X  const char* strchr(const char* s, int c);
+X       char* strchr(      char* s, int c);
+
+X  const char* strpbrk(const char* s1, const char* s2);
+X       char* strpbrk(      char* s1, const char* s2);
+
+X  const char* strrchr(const char* s, int c);
+X       char* strrchr(      char* s, int c);
+
+X  const char* strstr(const char* s1, const char* s2);
+X       char* strstr(      char* s1, const char* s2);
+
+X  const void* memchr(const void* s, int c, size_t n);
+X       void* memchr(      void* s, int c, size_t n);
+
+X  const wchar_t* wcschr(const wchar_t* s, wchar_t c);
+X       wchar_t* wcschr(      wchar_t* s, wchar_t c);
+
+X  const wchar_t* wcspbrk(const wchar_t* s1, const wchar_t* s2);
+X       wchar_t* wcspbrk(      wchar_t* s1, const wchar_t* s2);
+
+X  const wchar_t* wcsrchr(const wchar_t* s, wchar_t c);
+X       wchar_t* wcsrchr(      wchar_t* s, wchar_t c);
+
+X  const wchar_t* wcsstr(const wchar_t* s1, const wchar_t* s2);
+X       wchar_t* wcsstr(      wchar_t* s1, const wchar_t* s2);
+
+X  const wchar_t* wmemchr(const wchar_t* s, wchar_t c, size_t n);
+X       wchar_t* wmemchr(      wchar_t* s, wchar_t c, size_t n);
+
+   [for initial efforts on the above, see shadow/string.h]
+
+   22.1  Locales                                            [lib.locales]
+
+   Header  synopsis
+
+    // _lib.locale_, locale:
+T   class locale;
+T   template  const Facet& use_facet(const locale&);
+T   template  bool         has_facet(const locale&) throw();
+
+    // _lib.locale.convenience_, convenience interfaces:
+T   template  bool isspace (charT c, const locale& loc);
+T   template  bool isprint (charT c, const locale& loc);
+T   template  bool iscntrl (charT c, const locale& loc);
+T   template  bool isupper (charT c, const locale& loc);
+T   template  bool islower (charT c, const locale& loc);
+T   template  bool isalpha (charT c, const locale& loc);
+T   template  bool isdigit (charT c, const locale& loc);
+T   template  bool ispunct (charT c, const locale& loc);
+T   template  bool isxdigit(charT c, const locale& loc);
+T   template  bool isalnum (charT c, const locale& loc);
+T   template  bool isgraph (charT c, const locale& loc);
+T   template  charT toupper(charT c, const locale& loc);
+T   template  charT tolower(charT c, const locale& loc);
+    // _lib.category.ctype_ and _lib.facet.ctype.special_, ctype:
+    class ctype_base;
+T   template  class ctype;
+T   template <>            class ctype;             // specialization
+S   template  class ctype_byname;
+S   template <>            class ctype_byname;      // specialization
+T   class codecvt_base;
+X   template  class codecvt;
+S   template  class codecvt_byname;
+    // _lib.category.numeric_ and _lib.facet.numpunct_, numeric:
+X   template   class num_get;
+X   template  class num_put;
+T   template  class numpunct;
+S   template  class numpunct_byname;
+    // _lib.category.collate_, collation:
+T   template  class collate;
+S   template  class collate_byname;
+    // _lib.category.time_, date and time:
+T   class time_base;
+S   template   class time_get;
+S   template   class time_get_byname;
+S   template  class time_put;
+S   template  class time_put_byname;
+    // _lib.category.monetary_, money:
+T   class money_base;
+S   template   class money_get;
+S   template  class money_put;
+S   template  class moneypunct;
+S   template  class moneypunct_byname;
+    // _lib.category.messages_, message retrieval:
+T   class messages_base;
+S   template  class messages;
+S   template  class messages_byname;
+
+
+   22.1.1  Class locale                                      [lib.locale]
+
+X   class locale {
+    public:
+      // types:
+T     class facet;
+T     class id;
+T     typedef int category;
+T     static const category   // values assigned here are for exposition only
+T       none     = 0,
+T       collate  = 0x010, ctype    = 0x020,
+T       monetary = 0x040, numeric  = 0x080,
+T       time     = 0x100, messages = 0x200,
+T       all = collate | ctype | monetary | numeric | time  | messages;
+      // construct/copy/destroy:
+T     locale() throw()
+T     locale(const locale& other) throw()
+X     explicit locale(const char* std_name);
+X     locale(const locale& other, const char* std_name, category);
+T     template  locale(const locale& other, Facet* f);
+T     locale(const locale& other, const locale& one, category);
+T    ~locale() throw();           // non-virtual
+T     const locale& operator=(const locale& other) throw();
+T     template  locale combine(const locale& other) const;
+      // locale operations:
+X     basic_string                  name() const;
+T     bool operator==(const locale& other) const;
+T     bool operator!=(const locale& other) const;
+T     template 
+        bool operator()(const basic_string& s1,
+                        const basic_string& s2) const;
+      // global locale objects:
+T     static       locale  global(const locale&);
+T     static const locale& classic();
+    };
+
+   22.1.1.1  locale types                              [lib.locale.types]
+
+   22.1.1.1.1  Type locale::category                [lib.locale.category]
+
+T  typedef int category;
+
+T   none, collate, ctype, monetary, numeric, time, and messages
+
+      [required locale members]
+T     collate, collate
+T     ctype, ctype
+T     codecvt,
+S     codecvt
+T     moneypunct, moneypunct
+T     moneypunct, moneypunct,
+S     money_get, money_get, money_put
+T     numpunct, numpunct,
+X     num_get, num_get
+X     num_put, num_put
+S     time_get, time_get,
+S     time_put, time_put
+S     messages, messages
+
+      [required instantiations]
+S    collate_byname, collate_byname
+S    ctype_byname, ctype_byname
+S    codecvt_byname,
+S    codecvt_byname
+S    moneypunct_byname,
+S    moneypunct_byname,
+S    money_get,
+S    money_put
+S    numpunct_byname, numpunct_byname
+X    num_get, num_put
+S    time_get,
+S    time_get_byname,
+S    time_get,
+S    time_get_byname,
+S    time_put,
+S    time_put_byname,
+S    time_put
+S    time_put_byname
+S    messages_byname, messages_byname
+
+
+   22.1.1.1.2  Class locale::facet                     [lib.locale.facet]
+
+T   class locale::facet {
+    protected:
+T     explicit facet(size_t refs = 0);
+T     virtual ~facet();
+    private:
+T     facet(const facet&);                // not defined
+T     void operator=(const facet&);       // not defined
+    };
+   }
+
+
+   22.1.1.1.3  Class locale::id                           [lib.locale.id]
+
+T   class locale::id {
+    public:
+T     id();
+    private:
+T     void operator=(const id&);  // not defined
+T     id(const id&);              // not defined
+    };
+   }
+
+
+   22.2.1  The ctype category                        [lib.category.ctype]
+
+T   class ctype_base {
+    public:
+T     enum mask {         // numeric values are for exposition only.
+T       space=, print=, cntrl=, upper=, lower=,
+T       alpha=, digit=, punct=, xdigit=,
+T       alnum=, graph=
+      };
+    };
+
+
+   22.2.1.1  Template class ctype                      [lib.locale.ctype]
+
+T   template 
+    class ctype : public locale::facet, public ctype_base {
+    public:
+T     typedef charT char_type;
+T     explicit ctype(size_t refs = 0);
+T     bool         is(mask m, charT c) const;
+T     const charT* is(const charT* low, const charT* high, mask* vec) const;
+T     const charT* scan_is(mask m,
+                           const charT* low, const charT* high) const;
+T     const charT* scan_not(mask m,
+                            const charT* low, const charT* high) const;
+T     charT        toupper(charT c) const;
+T     const charT* toupper(charT* low, const charT* high) const;
+T     charT        tolower(charT c) const;
+T     const charT* tolower(charT* low, const charT* high) const;
+T     charT        widen(char c) const;
+T     const char*  widen(const char* low, const char* high, charT* to) const;
+T     char         narrow(charT c, char dfault) const;
+T     const charT* narrow(const charT* low, const charT*, char dfault,
+                          char* to) const;
+T     static locale::id id;
+
+    protected:
+T    ~ctype();                    // virtual
+T     virtual bool         do_is(mask m, charT c) const;
+T     virtual const charT* do_is(const charT* low, const charT* high,
+                                 mask* vec) const;
+T     virtual const charT* do_scan_is(mask m,
+                              const charT* low, const charT* high) const;
+T     virtual const charT* do_scan_not(mask m,
+                              const charT* low, const charT* high) const;
+T     virtual charT        do_toupper(charT) const;
+T     virtual const charT* do_toupper(charT* low, const charT* high) const;
+T     virtual charT        do_tolower(charT) const;
+T     virtual const charT* do_tolower(charT* low, const charT* high) const;
+T     virtual charT        do_widen(char) const;
+T     virtual const char*  do_widen(const char* low, const char* high,
+                                    charT* dest) const;
+T     virtual char         do_narrow(charT, char dfault) const;
+T     virtual const charT* do_narrow(const charT* low, const charT* high,
+                                     char dfault, char* dest) const;
+    };
+
+
+   22.2.1.2  Template class ctype_byname        [lib.locale.ctype.byname]
+
+X   template 
+    class ctype_byname : public ctype {
+    public:
+T     typedef ctype::mask mask;
+S     explicit ctype_byname(const char*, size_t refs = 0);
+    protected:
+S    ~ctype_byname();             // virtual
+S     virtual bool         do_is(mask m, charT c) const;
+S     virtual const charT* do_is(const charT* low, const charT* high,
+                                 mask* vec) const;
+S     virtual const char*  do_scan_is(mask m,
+                               const charT* low, const charT* high) const;
+S     virtual const char*  do_scan_not(mask m,
+                               const charT* low, const charT* high) const;
+S     virtual charT        do_toupper(charT) const;
+S     virtual const charT* do_toupper(charT* low, const charT* high) const;
+S     virtual charT        do_tolower(charT) const;
+S     virtual const charT* do_tolower(charT* low, const charT* high) const;
+S     virtual charT        do_widen(char) const;
+S     virtual const char*  do_widen(const char* low, const char* high,
+                                    charT* dest) const;
+S     virtual char         do_narrow(charT, char dfault) const;
+S     virtual const charT* do_narrow(const charT* low, const charT* high,
+                                     char dfault, char* dest) const;
+    };
+
+   22.2.1.3  ctype specializations              [lib.facet.ctype.special]
+
+T   template <> class ctype
+      : public locale::facet, public ctype_base {
+    public:
+T     typedef char char_type;
+T     explicit ctype(const mask* tab = 0, bool del = false,
+                     size_t refs = 0);
+T     bool is(mask m, char c) const;
+T     const char* is(const char* low, const char* high, mask* vec) const;
+T     const char* scan_is (mask m,
+                           const char* low, const char* high) const;
+T     const char* scan_not(mask m,
+                           const char* low, const char* high) const;
+T     char        toupper(char c) const;
+T     const char* toupper(char* low, const char* high) const;
+T     char        tolower(char c) const;
+T     const char* tolower(char* low, const char* high) const;
+T     char  widen(char c) const;
+T     const char* widen(const char* low, const char* high, char* to) const;
+T     char  narrow(char c, char dfault) const;
+T     const char* narrow(const char* low, const char* high, char dfault,
+                         char* to) const;
+T     static locale::id id;
+T     static const size_t table_size = IMPLEMENTATION_DEFINED;
+
+    protected:
+T     const mask* table() const throw();
+T     static const mask* classic_table() throw();
+T    ~ctype();                    // virtual
+T     virtual char        do_toupper(char c) const;
+T     virtual const char* do_toupper(char* low, const char* high) const;
+T     virtual char        do_tolower(char c) const;
+T     virtual const char* do_tolower(char* low, const char* high) const;
+
+T     virtual char        do_widen(char c) const;
+T     virtual const char* do_widen(const char* low,
+                                   const char* high,
+                                   char* to) const;
+T     virtual char        do_narrow(char c, char dfault) const;
+T     virtual const char* do_narrow(const char* low,
+                                    const char* high,
+                                    char dfault, char* to) const;
+    };
+
+
+   22.2.1.4  Class                      [lib.locale.ctype.byname.special]
+       ctype_byname
+
+X   template <> class ctype_byname : public ctype {
+    public:
+S     explicit ctype_byname(const char*, size_t refs = 0);
+    protected:
+S    ~ctype_byname();             // virtual
+S     virtual char        do_toupper(char c) const;
+S     virtual const char* do_toupper(char* low, const char* high) const;
+S     virtual char        do_tolower(char c) const;
+S     virtual const char* do_tolower(char* low, const char* high) const;
+
+S     virtual char        do_widen(char c) const;
+S     virtual const char* do_widen(char* low,
+                                   const char* high,
+                                   char* to) const;
+S     virtual char        do_widen(char c) const;
+S     virtual const char* do_widen(char* low, const char* high) const;
+
+    };
+
+
+
+   22.2.1.5  Template class codecvt                  [lib.locale.codecvt]
+
+T  class codecvt_base {
+   public:
+T   enum result { ok, partial, error, noconv };
+   };
+
+T  template 
+   class codecvt : public locale::facet, public codecvt_base {
+   public:
+T   typedef internT  intern_type;
+T   typedef externT  extern_type;
+T   typedef stateT state_type;
+T   explicit codecvt(size_t refs = 0)
+T   result out(stateT& state,
+     const internT* from, const internT* from_end, const internT*& from_next,
+           externT*   to,       externT* to_limit, externT*& to_next) const;
+T   result unshift(stateT& state,
+           externT*   to,        externT* to_limit, externT*& to_next) const;
+T   result in(stateT& state,
+     const externT* from, const externT* from_end, const externT*& from_next,
+           internT*   to,       internT* to_limit, internT*& to_next) const;
+T   int encoding() const throw();
+T   bool always_noconv() const throw();
+T   int length(const stateT&, const externT* from, const externT* end,
+               size_t max) const;
+T   int max_length() const throw();
+T   static locale::id id;
+
+   protected:
+T   ~codecvt();                   // virtual
+T   virtual result do_out(stateT& state,
+     const internT* from, const internT* from_end, const internT*& from_next,
+           externT* to,         externT* to_limit, externT*& to_next) const;
+T   virtual result do_in(stateT& state,
+T    const externT* from, const externT* from_end, const externT*& from_next,
+           internT* to,         internT* to_limit, internT*& to_next) const;
+T   virtual result do_unshift(stateT& state,
+           externT* to,         externT* to_limit, externT*& to_next) const;
+T   virtual int do_encoding() const throw();
+T   virtual bool do_always_noconv() const throw();
+T   virtual int do_length(const stateT&, const externT* from,
+                          const externT* end, size_t max) const;
+T   virtual int do_max_length() const throw();
+   };
+   }
+
+
+   22.2.1.6  Template class                   [lib.locale.codecvt.byname]
+       codecvt_byname
+
+X  template 
+   class codecvt_byname : public codecvt {
+   public:
+S   explicit codecvt_byname(const char*, size_t refs = 0);
+   protected:
+S  ~codecvt_byname();             // virtual
+S   virtual result do_out(stateT& state,
+      const internT* from, const internT* from_end, const internT*& from_next,
+            externT* to,         externT* to_limit, externT*& to_next) const;
+S   virtual result do_in(stateT& state,
+      const externT* from, const externT* from_end, const externT*& from_next,
+            internT* to,         internT* to_limit, internT*& to_next) const;
+S   virtual result do_unshift(stateT& state,
+            externT* to,         externT* to_limit, externT*& to_next) const;
+S   virtual int do_encoding() const throw();
+S   virtual bool do_always_noconv() const throw();
+S   virtual int do_length(const stateT&, const externT* from,
+                          const externT* end, size_t max) const;
+S   virtual result do_unshift(stateT& state,
+           externT* to, externT* to_limit, externT*& to_next) const;
+S   virtual int do_max_length() const throw();
+    };
+
+
+   22.2.2.1  Template class num_get                  [lib.locale.num.get]
+
+X   template  >
+    class num_get : public locale::facet {
+    public:
+T     typedef charT            char_type;
+T     typedef InputIterator    iter_type;
+T     explicit num_get(size_t refs = 0);
+T     iter_type get(iter_type in, iter_type end, ios_base&,
+                    ios_base::iostate& err, bool& v)           const;
+T     iter_type get(iter_type in, iter_type end, ios_base& ,
+                    ios_base::iostate& err, long& v)           const;
+T     iter_type get(iter_type in, iter_type end, ios_base&,
+                    ios_base::iostate& err, unsigned short& v) const;
+T     iter_type get(iter_type in, iter_type end, ios_base&,
+                    ios_base::iostate& err, unsigned int& v)   const;
+T     iter_type get(iter_type in, iter_type end, ios_base&,
+                    ios_base::iostate& err, unsigned long& v)  const;
+T     iter_type get(iter_type in, iter_type end, ios_base&,
+                    ios_base::iostate& err, float& v)          const;
+T     iter_type get(iter_type in, iter_type end, ios_base&,
+                    ios_base::iostate& err, double& v)         const;
+T     iter_type get(iter_type in, iter_type end, ios_base&,
+                    ios_base::iostate& err, long double& v)    const;
+T     iter_type get(iter_type in, iter_type end, ios_base&,
+                    ios_base::iostate& err, void*& v)          const;
+T     static locale::id id;
+
+    protected:
+T    ~num_get();                  // virtual
+T     virtual iter_type do_get(iter_type, iter_type, ios_base&,
+          ios_base::iostate& err, bool& v) const;
+S     virtual iter_type do_get(iter_type, iter_type, ios_base&,
+          ios_base::iostate& err, long& v) const;
+S     virtual iter_type do_get(iter_type, iter_type, ios_base&,
+          ios_base::iostate& err, unsigned short& v) const;
+S     virtual iter_type do_get(iter_type, iter_type, ios_base&,
+          ios_base::iostate& err, unsigned int& v) const;
+S     virtual iter_type do_get(iter_type, iter_type, ios_base&,
+          ios_base::iostate& err, unsigned long& v) const;
+S     virtual iter_type do_get(iter_type, iter_type, ios_base&,
+          ios_base::iostate& err, float& v) const;
+S     virtual iter_type do_get(iter_type, iter_type, ios_base&,
+          ios_base::iostate& err, double& v) const;
+S     virtual iter_type do_get(iter_type, iter_type, ios_base&,
+          ios_base::iostate& err, long double& v) const;
+S     virtual iter_type do_get(iter_type, iter_type, ios_base&,
+          ios_base::iostate& err, void*& v) const;
+    };
+
+
+
+   22.2.2.2  Template class num_put                   [lib.locale.nm.put]
+
+X   template  >
+    class num_put : public locale::facet {
+    public:
+T     typedef charT            char_type;
+T     typedef OutputIterator   iter_type;
+T     explicit num_put(size_t refs = 0);
+T     iter_type put(iter_type s, ios_base& f, char_type fill, bool v) const;
+T     iter_type put(iter_type s, ios_base& f, char_type fill, long v) const;
+T     iter_type put(iter_type s, ios_base& f, char_type fill,
+                    unsigned long v) const;
+T     iter_type put(iter_type s, ios_base& f, char_type fill,
+                    double v) const;
+T     iter_type put(iter_type s, ios_base& f, char_type fill,
+                    long double v) const;
+T     iter_type put(iter_type s, ios_base& f, char_type fill,
+                    const void* v) const;
+T     static locale::id id;
+    protected:
+T    ~num_put();                  // virtual
+T     virtual iter_type do_put(iter_type, ios_base&, char_type fill,
+                               bool v) const;
+T     virtual iter_type do_put(iter_type, ios_base&, char_type fill,
+                               long v) const;
+T     virtual iter_type do_put(iter_type, ios_base&, char_type fill,
+                               unsigned long) const;
+S     virtual iter_type do_put(iter_type, ios_base&, char_type fill,
+                               double v) const;
+S     virtual iter_type do_put(iter_type, ios_base&, char_type fill,
+                               long double v) const;
+T     virtual iter_type do_put(iter_type, ios_base&, char_type fill,
+                               const void* v) const;
+    };
+   }
+
+   22.2.3.1  Template class numpunct                [lib.locale.numpunct]
+
+T   template 
+    class numpunct : public locale::facet {
+    public:
+T     typedef charT               char_type;
+T     typedef basic_string string_type;
+T     explicit numpunct(size_t refs = 0);
+T     char_type    decimal_point()   const;
+T     char_type    thousands_sep()   const;
+T     string       grouping()        const;
+T     string_type  truename()        const;
+T     string_type  falsename()       const;
+T     static locale::id id;
+    protected:
+T    ~numpunct();                 // virtual
+T     virtual char_type    do_decimal_point() const;
+T     virtual char_type    do_thousands_sep() const;
+T     virtual string       do_grouping()      const;
+T     virtual string_type  do_truename()      const;      // for bool
+T     virtual string_type  do_falsename()     const;      // for bool
+    };
+   }
+
+
+
+   22.2.3.2  Template class                  [lib.locale.numpunct.byname]
+       numpunct_byname
+
+X   template 
+    class numpunct_byname : public numpunct {
+   // this class is specialized for char and wchar_t.
+    public:
+T     typedef charT                char_type;
+T     typedef basic_string  string_type;
+S     explicit numpunct_byname(const char*, size_t refs = 0);
+    protected:
+S    ~numpunct_byname();          // virtual
+S     virtual char_type    do_decimal_point() const;
+S     virtual char_type    do_thousands_sep() const;
+S     virtual string       do_grouping()      const;
+S     virtual string_type  do_truename()      const;      // for bool
+S     virtual string_type  do_falsename()     const;      // for bool
+    };
+
+
+   22.2.4.1  Template class collate                  [lib.locale.collate]
+
+T   template 
+    class collate : public locale::facet {
+    public:
+T     typedef charT               char_type;
+T     typedef basic_string string_type;
+T     explicit collate(size_t refs = 0);
+T     int compare(const charT* low1, const charT* high1,
+                  const charT* low2, const charT* high2) const;
+T     string_type transform(const charT* low, const charT* high) const;
+T     long hash(const charT* low, const charT* high) const;
+T     static locale::id id;
+    protected:
+T    ~collate();                  // virtual
+T     virtual int    do_compare(const charT* low1, const charT* high1,
+                                const charT* low2, const charT* high2) const;
+T     virtual string_type do_transform
+                               (const charT* low, const charT* high) const;
+T     virtual long   do_hash   (const charT* low, const charT* high) const;
+    };
+
+
+   22.2.4.2  Template class                   [lib.locale.collate.byname]
+       collate_byname
+
+X   template 
+    class collate_byname : public collate {
+    public:
+T     typedef basic_string string_type;
+T     explicit collate_byname(const char*, size_t refs = 0);
+    protected:
+S    ~collate_byname();           // virtual
+S     virtual int    do_compare(const charT* low1, const charT* high1,
+                                const charT* low2, const charT* high2) const;
+S     virtual string_type do_transform
+                               (const charT* low, const charT* high) const;
+S     virtual long   do_hash   (const charT* low, const charT* high) const;
+    };
+
+
+   22.2.5.1  Template class time_get                [lib.locale.time.get]
+
+T   class time_base {
+    public:
+T     enum dateorder { no_order, dmy, mdy, ymd, ydm };
+    };
+
+    [Note: semantics of time_get members are implementation-defined.
+     To complete implementation requires documenting behavior.]
+
+X   template  >
+    class time_get : public locale::facet, public time_base {
+    public:
+T     typedef charT            char_type;
+T     typedef InputIterator    iter_type;
+T     explicit time_get(size_t refs = 0);
+
+T     dateorder date_order()  const { return do_date_order(); }
+T     iter_type get_time(iter_type s, iter_type end, ios_base& f,
+                         ios_base::iostate& err, tm* t)  const;
+T     iter_type get_date(iter_type s, iter_type end, ios_base& f,
+                         ios_base::iostate& err, tm* t)  const;
+T     iter_type get_weekday(iter_type s, iter_type end, ios_base& f,
+                            ios_base::iostate& err, tm* t) const;
+T     iter_type get_monthname(iter_type s, iter_type end, ios_base& f,
+                              ios_base::iostate& err, tm* t) const;
+T     iter_type get_year(iter_type s, iter_type end, ios_base& f,
+                         ios_base::iostate& err, tm* t) const;
+T     static locale::id id;
+    protected:
+     ~time_get();                 // virtual
+X     virtual dateorder do_date_order()  const;
+S     virtual iter_type do_get_time(iter_type s, iter_type end, ios_base&,
+                                    ios_base::iostate& err, tm* t) const;
+S     virtual iter_type do_get_date(iter_type s, iter_type end, ios_base&,
+                                    ios_base::iostate& err, tm* t) const;
+S     virtual iter_type do_get_weekday(iter_type s, iter_type end, ios_base&,
+                                       ios_base::iostate& err, tm* t) const;
+S     virtual iter_type do_get_monthname(iter_type s, ios_base&,
+                                         ios_base::iostate& err, tm* t) const;
+S     virtual iter_type do_get_year(iter_type s, iter_type end, ios_base&,
+                                    ios_base::iostate& err, tm* t) const;
+    };
+
+
+
+   22.2.5.2  Template class                  [lib.locale.time.get.byname]
+       time_get_byname
+
+X   template  >
+    class time_get_byname : public time_get {
+    public:
+T     typedef time_base::dateorder dateorder;
+T     typedef InputIterator        iter_type
+
+S     explicit time_get_byname(const char*, size_t refs = 0);
+    protected:
+S    ~time_get_byname();          // virtual
+S     virtual dateorder do_date_order()  const;
+S     virtual iter_type do_get_time(iter_type s, iter_type end, ios_base&,
+                                    ios_base::iostate& err, tm* t) const;
+S     virtual iter_type do_get_date(iter_type s, iter_type end, ios_base&,
+                                    ios_base::iostate& err, tm* t) const;
+T     virtual iter_type do_get_weekday(iter_type s, iter_type end, ios_base&,
+                                       ios_base::iostate& err, tm* t) const;
+T     virtual iter_type do_get_monthname(iter_type s, iter_type end, ios_base&,
+                                         ios_base::iostate& err, tm* t) const;
+S     virtual iter_type do_get_year(iter_type s, iter_type end, ios_base&,
+                                    ios_base::iostate& err, tm* t) const;
+    };
+   }
+
+   22.2.5.3  Template class time_put                [lib.locale.time.put]
+
+X   template  >
+    class time_put : public locale::facet {
+    public:
+T     typedef charT            char_type;
+T     typedef OutputIterator   iter_type;
+T     explicit time_put(size_t refs = 0);
+      // the following is implemented in terms of other member functions.
+S     iter_type put(iter_type s, ios_base& f, char_type fill, const tm* tmb,
+                    const charT* pattern, const charT* pat_end) const;
+T     iter_type put(iter_type s, ios_base& f, char_type fill,
+                    const tm* tmb, char format, char modifier = 0) const;
+T     static locale::id id;
+    protected:
+T    ~time_put();                 // virtual
+S     virtual iter_type do_put(iter_type s, ios_base&, char_type, const tm* t,
+                               char format, char modifier) const;
+    };
+
+
+
+   22.2.5.4  Template class                  [lib.locale.time.put.byname]
+       time_put_byname
+
+T   template  >
+    class time_put_byname : public time_put
+    {
+    public:
+T     typedef charT          char_type;
+T     typedef OutputIterator iter_type;
+
+T     explicit time_put_byname(const char*, size_t refs = 0);
+    protected:
+T    ~time_put_byname();          // virtual
+S     virtual iter_type do_put(iter_type s, ios_base&, char_type, const tm* t,
+                               char format, char modifier) const;
+    };
+
+
+   22.2.6.1  Template class money_get              [lib.locale.money.get]
+
+X   template  >
+    class money_get : public locale::facet {
+    public:
+T     typedef charT               char_type;
+T     typedef InputIterator       iter_type;
+T     typedef basic_string string_type;
+T     explicit money_get(size_t refs = 0);
+T     iter_type get(iter_type s, iter_type end, bool intl,
+                    ios_base& f, ios_base::iostate& err,
+                    long double& units) const;
+T     iter_type get(iter_type s, iter_type end, bool intl,
+                    ios_base& f, ios_base::iostate& err,
+                    string_type& digits) const;
+T     static locale::id id;
+    protected:
+T    ~money_get();                // virtual
+S     virtual iter_type do_get(iter_type, iter_type, bool, ios_base&,
+                       ios_base::iostate& err, long double& units) const;
+S     virtual iter_type do_get(iter_type, iter_type, bool, ios_base&,
+                       ios_base::iostate& err, string_type& digits) const;
+    };
+
+   22.2.6.2  Template class money_put              [lib.locale.money.put]
+
+X   template  >
+    class money_put : public locale::facet {
+    public:
+T     typedef charT               char_type;
+T     typedef OutputIterator      iter_type;
+T     typedef basic_string string_type;
+T     explicit money_put(size_t refs = 0);
+T     iter_type put(iter_type s, bool intl, ios_base& f,
+                    char_type fill, long double units) const;
+T     iter_type put(iter_type s, bool intl, ios_base& f,
+                    char_type fill, const string_type& digits) const;
+T     static locale::id id;
+
+    protected:
+T    ~money_put();                // virtual
+S     virtual iter_type
+        do_put(iter_type, bool, ios_base&, char_type fill,
+               long double units) const;
+S     virtual iter_type
+        do_put(iter_type, bool, ios_base&, char_type fill,
+               const string_type& digits) const;
+    };
+
+
+   22.2.6.3  Template class moneypunct            [lib.locale.moneypunct]
+
+T   class money_base {
+    public:
+T     enum part { none, space, symbol, sign, value };
+T     struct pattern { char field[4]; };
+    };
+
+X   template 
+    class moneypunct : public locale::facet, public money_base {
+    public:
+T     typedef charT char_type;
+T     typedef basic_string string_type;
+T     explicit moneypunct(size_t refs = 0);
+T     charT        decimal_point() const;
+T     charT        thousands_sep() const;
+T     string       grouping()      const;
+T     string_type  curr_symbol()   const;
+T     string_type  positive_sign() const;
+T     string_type  negative_sign() const;
+T     int          frac_digits()   const;
+T     pattern      pos_format()    const;
+T     pattern      neg_format()    const;
+T     static locale::id id;
+T     static const bool intl = International;
+    protected:
+T    ~moneypunct();               // virtual
+S     virtual charT        do_decimal_point() const;
+S     virtual charT        do_thousands_sep() const;
+S     virtual string       do_grouping()      const;
+S     virtual string_type  do_curr_symbol()   const;
+S     virtual string_type  do_positive_sign() const;
+S     virtual string_type  do_negative_sign() const;
+S     virtual int          do_frac_digits()   const;
+T     virtual pattern      do_pos_format()    const;
+T     virtual pattern      do_neg_format()    const;
+    };
+   }
+
+   22.2.6.4  Template class                [lib.locale.moneypunct.byname]
+       moneypunct_byname
+
+X   template 
+    class moneypunct_byname : public moneypunct {
+    public:
+T     typedef money_base::pattern pattern;
+T     typedef basic_string string_type;
+
+T     explicit moneypunct_byname(const char*, size_t refs = 0);
+    protected:
+T    ~moneypunct_byname();        // virtual
+S     virtual charT        do_decimal_point() const;
+S     virtual charT        do_thousands_sep() const;
+S     virtual string       do_grouping()      const;
+S     virtual string_type  do_curr_symbol()   const;
+S     virtual string_type  do_positive_sign() const;
+S     virtual string_type  do_negative_sign() const;
+S     virtual int          do_frac_digits()   const;
+S     virtual pattern      do_pos_format()    const;
+S     virtual pattern      do_neg_format()    const;
+    };
+
+   22.2.7.1  Template class messages                [lib.locale.messages]
+
+T   class messages_base {
+    public:
+T     typedef int catalog;
+    };
+
+X   template 
+    class messages : public locale::facet, public messages_base {
+    public:
+T     typedef charT char_type;
+T     typedef basic_string string_type;
+T     explicit messages(size_t refs = 0);
+T     catalog open(const basic_string& fn, const locale&) const;
+T     string_type  get(catalog c, int set, int msgid,
+                       const string_type& dfault) const;
+T     void    close(catalog c) const;
+T     static locale::id id;
+    protected:
+T    ~messages();                 // virtual
+S     virtual catalog do_open(const basic_string&, const locale&) const;
+S     virtual string_type  do_get(catalog, int set, int msgid,
+                             const string_type& dfault) const;
+S     virtual void    do_close(catalog) const;
+    };
+
+   22.2.7.2  Template class                  [lib.locale.messages.byname]
+       messages_byname
+
+
+X   template 
+    class messages_byname : public messages {
+    public:
+T     typedef messages_base::catalog catalog;
+T     typedef basic_string    string_type;
+
+T     explicit messages_byname(const char*, size_t refs = 0);
+    protected:
+T    ~messages_byname();          // virtual
+S     virtual catalog do_open(const basic_string&, const locale&) const;
+S     virtual string_type  do_get(catalog, int set, int msgid,
+                             const string_type& dfault) const;
+S     virtual void    do_close(catalog) const;
+    };
+
+
+   22.3  C Library Locales                                [lib.c.locales]
+
+
+                   Table 13--Header  synopsis
+            Macros:
+X                        LC_ALL        LC_COLLATE   LC_CTYPE
+X                        LC_MONETARY   LC_NUMERIC   LC_TIME
+X                        NULL
+X           Struct:      lconv
+X           Functions:   localeconv    setlocale
+
+
+   23.2  Sequences                                        [lib.sequences]
+
+   , , , , and .
+
+   Header  synopsis
+
+T   template  > class deque;
+T   template 
+      bool operator==(const deque& x, const deque& y);
+T   template 
+      bool operator< (const deque& x, const deque& y);
+T   template 
+      bool operator!=(const deque& x, const deque& y);
+T   template 
+      bool operator> (const deque& x, const deque& y);
+T   template 
+      bool operator>=(const deque& x, const deque& y);
+T   template 
+      bool operator<=(const deque& x, const deque& y);
+T   template 
+      void swap(deque& x, deque& y);
+   }
+
+   Header  synopsis
+
+T   template  > class list;
+T   template 
+      bool operator==(const list& x, const list& y);
+T   template 
+      bool operator< (const list& x, const list& y);
+T   template 
+      bool operator!=(const list& x, const list& y);
+T   template 
+      bool operator> (const list& x, const list& y);
+T   template 
+      bool operator>=(const list& x, const list& y);
+T   template 
+      bool operator<=(const list& x, const list& y);
+T   template 
+      void swap(list& x, list& y);
+   }
+
+   Header  synopsis
+
+   namespace std {
+T   template  > class queue;
+T   template 
+      bool operator==(const queue& x,
+                      const queue& y);
+T   template 
+      bool operator< (const queue& x,
+                      const queue& y);
+T   template 
+      bool operator!=(const queue& x,
+                      const queue& y);
+T   template 
+      bool operator> (const queue& x,
+                      const queue& y);
+T   template 
+      bool operator>=(const queue& x,
+                      const queue& y);
+T   template 
+      bool operator<=(const queue& x,
+                      const queue& y);
+T   template ,
+              class Compare = less >
+T   class priority_queue;
+   }
+
+   Header  synopsis
+
+   namespace std {
+T   template  > class stack;
+T   template 
+      bool operator==(const stack& x,
+                      const stack& y);
+T   template 
+      bool operator< (const stack& x,
+                      const stack& y);
+T   template 
+      bool operator!=(const stack& x,
+                      const stack& y);
+T   template 
+      bool operator> (const stack& x,
+                      const stack& y);
+T   template 
+      bool operator>=(const stack& x,
+                      const stack& y);
+T   template 
+      bool operator<=(const stack& x,
+                      const stack& y);
+   }
+
+   Header  synopsis
+
+T   template  > class vector;
+
+T   template 
+      bool operator==(const vector& x,
+                      const vector& y);
+T   template 
+      bool operator< (const vector& x,
+                      const vector& y);
+T   template 
+      bool operator!=(const vector& x,
+                      const vector& y);
+T   template 
+      bool operator> (const vector& x,
+                      const vector& y);
+T   template 
+      bool operator>=(const vector& x,
+                      const vector& y);
+T   template 
+      bool operator<=(const vector& x,
+                      const vector& y);
+T   template 
+      void swap(vector& x, vector& y);
+
+T   template  class vector;
+T   template 
+      bool operator==(const vector& x,
+                      const vector& y);
+T   template 
+      bool operator< (const vector& x,
+                      const vector& y);
+T   template 
+      bool operator!=(const vector& x,
+                      const vector& y);
+T   template 
+      bool operator> (const vector& x,
+                      const vector& y);
+T   template 
+      bool operator>=(const vector& x,
+                      const vector& y);
+T   template 
+      bool operator<=(const vector& x,
+                      const vector& y);
+T   template 
+      void swap(vector& x, vector& y);
+   }
+
+   23.2.1  Template class deque                               [lib.deque]
+
+    template  >
+T   class deque {
+    public:
+      // types:
+T     typedef typename Allocator::reference         reference;
+T     typedef typename Allocator::const_reference   const_reference;
+T     typedef implementation defined                iterator;
+T     typedef implementation defined                const_iterator;
+T     typedef implementation defined                size_type;
+T     typedef implementation defined                difference_type;
+T     typedef T                                     value_type;
+T     typedef Allocator                             allocator_type;
+T     typedef typename Allocator::pointer           pointer;
+T     typedef typename Allocator::const_pointer     const_pointer;
+T     typedef std::reverse_iterator       reverse_iterator;
+T     typedef std::reverse_iterator const_reverse_iterator;
+      // _lib.deque.cons_ construct/copy/destroy:
+T     explicit deque(const Allocator& = Allocator());
+T     explicit deque(size_type n, const T& value = T(),
+          const Allocator& = Allocator());
+T     template 
+        deque(InputIterator first, InputIterator last,
+              const Allocator& = Allocator());
+T     deque(const deque& x);
+T    ~deque();
+T     deque& operator=(const deque& x);
+T     template 
+        void assign(InputIterator first, InputIterator last);
+T     void assign(size_type n, const T& t);
+T     allocator_type get_allocator() const;
+      // iterators:
+T     iterator               begin();
+T     const_iterator         begin() const;
+T     iterator               end();
+T     const_iterator         end() const;
+T     reverse_iterator       rbegin();
+T     const_reverse_iterator rbegin() const;
+T     reverse_iterator       rend();
+T     const_reverse_iterator rend() const;
+      // _lib.deque.capacity_ capacity:
+T     size_type size() const;
+T     size_type max_size() const;
+T     void      resize(size_type sz, T c = T());
+T     bool      empty() const;
+
+      // element access:
+T     reference       operator[](size_type n);
+T     const_reference operator[](size_type n) const;
+T     reference       at(size_type n);
+T     const_reference at(size_type n) const;
+T     reference       front();
+T     const_reference front() const;
+T     reference       back();
+T     const_reference back() const;
+      // _lib.deque.modifiers_ modifiers:
+T     void push_front(const T& x);
+T     void push_back(const T& x);
+T     iterator insert(iterator position, const T& x);
+T     void     insert(iterator position, size_type n, const T& x);
+T     template 
+        void insert (iterator position,
+                     InputIterator first, InputIterator last);
+T     void pop_front();
+T     void pop_back();
+T     iterator erase(iterator position);
+T     iterator erase(iterator first, iterator last);
+T     void     swap(deque&);
+T     void     clear();
+    };
+T   template 
+      bool operator==(const deque& x,
+                      const deque& y);
+T   template 
+      bool operator< (const deque& x,
+                      const deque& y);
+T   template 
+      bool operator!=(const deque& x,
+                      const deque& y);
+T   template 
+      bool operator> (const deque& x,
+                      const deque& y);
+T   template 
+      bool operator>=(const deque& x,
+                      const deque& y);
+T   template 
+      bool operator<=(const deque& x,
+                      const deque& y);
+    // specialized algorithms:
+T   template 
+      void swap(deque& x, deque& y);
+
+
+   23.2.2  Template class list                                 [lib.list]
+
+T   template  >
+    class list {
+    public:
+      // types:
+T     typedef typename Allocator::reference         reference;
+T     typedef typename Allocator::const_reference   const_reference;
+T     typedef implementation defined                iterator;
+T     typedef implementation defined                const_iterator;
+T     typedef implementation defined                size_type;
+T     typedef implementation defined                difference_type;
+T     typedef T                                     value_type;
+T     typedef Allocator                             allocator_type;
+T     typedef typename Allocator::pointer           pointer;
+T     typedef typename Allocator::const_pointer     const_pointer;
+T     typedef std::reverse_iterator       reverse_iterator;
+T     typedef std::reverse_iterator const_reverse_iterator;
+
+      // _lib.list.cons_ construct/copy/destroy:
+T     explicit list(const Allocator& = Allocator());
+T     explicit list(size_type n, const T& value = T(),
+                    const Allocator& = Allocator());
+T     template 
+        list(InputIterator first, InputIterator last,
+             const Allocator& = Allocator());
+T     list(const list& x);
+T    ~list();
+T     list& operator=(const list& x);
+T     template 
+        void assign(InputIterator first, InputIterator last);
+T     void assign(size_type n, const T& t);
+T     allocator_type get_allocator() const;
+      // iterators:
+T     iterator               begin();
+T     const_iterator         begin() const;
+T     iterator               end();
+T     const_iterator         end() const;
+T     reverse_iterator       rbegin();
+T     const_reverse_iterator rbegin() const;
+T     reverse_iterator       rend();
+T     const_reverse_iterator rend() const;
+      // _lib.list.capacity_ capacity:
+T     bool      empty() const;
+T     size_type size() const;
+T     size_type max_size() const;
+T     void      resize(size_type sz, T c = T());
+      // element access:
+T     reference       front();
+T     const_reference front() const;
+T     reference       back();
+T     const_reference back() const;
+      // _lib.list.modifiers_ modifiers:
+T     void push_front(const T& x);
+T     void pop_front();
+T     void push_back(const T& x);
+T     void pop_back();
+T     iterator insert(iterator position, const T& x);
+T     void     insert(iterator position, size_type n, const T& x);
+T     template 
+        void insert(iterator position, InputIterator first,
+                    InputIterator last);
+T     iterator erase(iterator position);
+T     iterator erase(iterator position, iterator last);
+T     void     swap(list&);
+T     void     clear();
+      // _lib.list.ops_ list operations:
+T     void splice(iterator position, list& x);
+T     void splice(iterator position, list& x, iterator i);
+T     void splice(iterator position, list& x, iterator first,
+                  iterator last);
+T     void remove(const T& value);
+T     template  void remove_if(Predicate pred);
+
+T     void unique();
+T     template 
+        void unique(BinaryPredicate binary_pred);
+T     void merge(list& x);
+T     template  void merge(list& x, Compare comp);
+        void sort();
+T     template  void sort(Compare comp);
+        void reverse();
+    };
+T   template 
+      bool operator==(const list& x, const list& y);
+T   template 
+      bool operator< (const list& x, const list& y);
+T   template 
+      bool operator!=(const list& x, const list& y);
+T   template 
+      bool operator> (const list& x, const list& y);
+T   template 
+      bool operator>=(const list& x, const list& y);
+T   template 
+      bool operator<=(const list& x, const list& y);
+    // specialized algorithms:
+T   template 
+      void swap(list& x, list& y);
+
+
+   23.2.3.1  Template class queue                             [lib.queue]
+
+T   template  >
+    class queue {
+    public:
+T     typedef typename Container::value_type            value_type;
+T     typedef typename Container::size_type             size_type;
+T     typedef          Container                        container_type;
+    protected:
+T     Container c;
+    public:
+T     explicit queue(const Container& = Container());
+
+T     bool      empty() const             { return c.empty(); }
+T     size_type size()  const             { return c.size(); }
+T     value_type&       front()           { return c.front(); }
+T     const value_type& front() const     { return c.front(); }
+T     value_type&       back()            { return c.back(); }
+T     const value_type& back() const      { return c.back(); }
+T     void push(const value_type& x)      { c.push_back(x); }
+T     void pop()                          { c.pop_front(); }
+    };
+
+T   template 
+      bool operator==(const queue& x,
+                      const queue& y);
+T   template 
+      bool operator< (const queue& x,
+                      const queue& y);
+T   template 
+      bool operator!=(const queue& x,
+                      const queue& y);
+T   template 
+      bool operator> (const queue& x,
+                      const queue& y);
+T   template 
+      bool operator>=(const queue& x,
+                      const queue& y);
+T   template 
+      bool operator<=(const queue& x,
+                      const queue& y);
+
+   23.2.3.2  Template class priority_queue           [lib.priority.queue]
+
+T   template ,
+              class Compare = less >
+    class priority_queue {
+    public:
+T     typedef typename Container::value_type            value_type;
+T     typedef typename Container::size_type             size_type;
+T     typedef          Container                        container_type;
+    protected:
+T     Container c;
+T     Compare comp;
+    public:
+T     explicit priority_queue(const Compare& x = Compare(),
+                              const Container& = Container());
+T     template 
+        priority_queue(InputIterator first, InputIterator last,
+                       const Compare& x = Compare(),
+                       const Container& = Container());
+
+T     bool      empty() const       { return c.empty(); }
+T     size_type size()  const       { return c.size(); }
+T     const value_type& top() const { return c.front(); }
+T     void push(const value_type& x);
+T     void pop();
+    };
+
+   23.2.3.3  Template class stack                             [lib.stack]
+
+T   template  >
+    class stack {
+    public:
+T     typedef typename Container::value_type            value_type;
+T     typedef typename Container::size_type             size_type;
+T     typedef          Container                        container_type;
+    protected:
+T     Container c;
+    public:
+T     explicit stack(const Container& = Container());
+
+T     bool      empty() const             { return c.empty(); }
+T     size_type size()  const             { return c.size(); }
+T     value_type&       top()             { return c.back(); }
+T     const value_type& top() const       { return c.back(); }
+T     void push(const value_type& x)      { c.push_back(x); }
+T     void pop()                          { c.pop_back(); }
+    };
+T   template 
+      bool operator==(const stack& x,
+                      const stack& y);
+T   template 
+      bool operator< (const stack& x,
+                      const stack& y);
+T   template 
+      bool operator!=(const stack& x,
+                      const stack& y);
+T   template 
+      bool operator> (const stack& x,
+                      const stack& y);
+T   template 
+      bool operator>=(const stack& x,
+                      const stack& y);
+T   template 
+      bool operator<=(const stack& x,
+                      const stack& y);
+
+   23.2.4  Template class vector                             [lib.vector]
+
+    template  >
+T   class vector {
+    public:
+      // types:
+T     typedef typename Allocator::reference         reference;
+T     typedef typename Allocator::const_reference   const_reference;
+T     typedef implementation defined                iterator;
+T     typedef implementation defined                const_iterator;
+T     typedef implementation defined                size_type;
+T     typedef implementation defined                difference_type;
+T     typedef T                                     value_type;
+T     typedef Allocator                             allocator_type;
+T     typedef typename Allocator::pointer           pointer;
+T     typedef typename Allocator::const_pointer     const_pointer
+T     typedef std::reverse_iterator       reverse_iterator;
+T     typedef std::reverse_iterator const_reverse_iterator;
+      // _lib.vector.cons_ construct/copy/destroy:
+T     explicit vector(const Allocator& = Allocator());
+T     explicit vector(size_type n, const T& value = T(),
+          const Allocator& = Allocator());
+T     template 
+        vector(InputIterator first, InputIterator last,
+          const Allocator& = Allocator());
+T     vector(const vector& x);
+T    ~vector();
+T     vector& operator=(const vector& x);
+T     template 
+        void assign(InputIterator first, InputIterator last);
+T     void assign(size_type n, const T& u);
+T     allocator_type get_allocator() const;
+      // iterators:
+T     iterator               begin();
+T     const_iterator         begin() const;
+T     iterator               end();
+T     const_iterator         end() const;
+T     reverse_iterator       rbegin();
+T     const_reverse_iterator rbegin() const;
+T     reverse_iterator       rend();
+T     const_reverse_iterator rend() const;
+      // _lib.vector.capacity_ capacity:
+T     size_type size() const;
+T     size_type max_size() const;
+T     void      resize(size_type sz, T c = T());
+T     size_type capacity() const;
+T     bool      empty() const;
+T     void      reserve(size_type n);
+
+      // element access:
+T     reference       operator[](size_type n);
+T     const_reference operator[](size_type n) const;
+T     const_reference at(size_type n) const;
+T     reference       at(size_type n);
+T     reference       front();
+T     const_reference front() const;
+T     reference       back();
+T     const_reference back() const;
+      // _lib.vector.modifiers_ modifiers:
+T     void push_back(const T& x);
+T     void pop_back();
+T     iterator insert(iterator position, const T& x);
+T     void     insert(iterator position, size_type n, const T& x);
+T     template 
+          void insert(iterator position,
+                      InputIterator first, InputIterator last);
+T     iterator erase(iterator position);
+T     iterator erase(iterator first, iterator last);
+T     void     swap(vector&);
+T     void     clear();
+    };
+
+T   template 
+      bool operator==(const vector& x,
+                      const vector& y);
+T   template 
+      bool operator< (const vector& x,
+                      const vector& y);
+T   template 
+      bool operator!=(const vector& x,
+                      const vector& y);
+T   template 
+      bool operator> (const vector& x,
+                      const vector& y);
+T   template 
+      bool operator>=(const vector& x,
+                      const vector& y);
+T   template 
+      bool operator<=(const vector& x,
+                      const vector& y);
+    // specialized algorithms:
+T   template 
+      void swap(vector& x, vector& y);
+
+
+   23.2.5  Class vector                           [lib.vector.bool]
+
+T   template  class vector {
+    public:
+      // types:
+T     typedef bool                                  const_reference;
+T     typedef implementation defined                iterator;
+T     typedef implementation defined                const_iterator;
+T     typedef implementation defined                size_type;
+T     typedef implementation defined                difference_type;
+T     typedef bool                                  value_type;
+T     typedef Allocator                             allocator_type;
+T     typedef implementation defined                pointer;
+T     typedef implementation defined                const_pointer
+T     typedef std::reverse_iterator       reverse_iterator;
+T     typedef std::reverse_iterator const_reverse_iterator;
+      // bit reference:
+T     class reference {
+       friend class vector;
+T      reference();
+      public:
+T      ~reference();
+T       operator bool() const;
+T       reference& operator=(const bool x);
+T       reference& operator=(const reference& x);
+T       void flip();              // flips the bit
+      };
+
+      // construct/copy/destroy:
+T     explicit vector(const Allocator& = Allocator());
+T     explicit vector(size_type n, const bool& value = bool(),
+                      const Allocator& = Allocator());
+T     template 
+        vector(InputIterator first, InputIterator last,
+          const Allocator& = Allocator());
+T     vector(const vector& x);
+T    ~vector();
+T     vector& operator=(const vector& x);
+T     template 
+        void assign(InputIterator first, InputIterator last);
+T     void assign(size_type n, const T& t);
+T     allocator_type get_allocator() const;
+      // iterators:
+T     iterator               begin();
+T     const_iterator         begin() const;
+T     iterator               end();
+T     const_iterator         end() const;
+T     reverse_iterator       rbegin();
+T     const_reverse_iterator rbegin() const;
+T     reverse_iterator       rend();
+T     const_reverse_iterator rend() const;
+      // capacity:
+T     size_type size() const;
+T     size_type max_size() const;
+T     void      resize(size_type sz, bool c = false);
+T     size_type capacity() const;
+T     bool      empty() const;
+T     void      reserve(size_type n);
+      // element access:
+T     reference       operator[](size_type n);
+T     const_reference operator[](size_type n) const;
+T     const_reference at(size_type n) const;
+T     reference       at(size_type n);
+T     reference       front();
+T     const_reference front() const;
+T     reference       back();
+T     const_reference back() const;
+      // modifiers:
+T     void push_back(const bool& x);
+T     void pop_back();
+T     iterator insert(iterator position, const bool& x);
+T     void     insert (iterator position, size_type n, const bool& x);
+T     template 
+          void insert(iterator position,
+                      InputIterator first, InputIterator last);
+T     iterator erase(iterator position);
+T     iterator erase(iterator first, iterator last);
+T     void swap(vector&);
+T     static void swap(reference x, reference y);
+T     void flip();                // flips all bits
+T     void clear();
+    };
+
+T   template 
+      bool operator==(const vector& x,
+                      const vector& y);
+T   template 
+      bool operator< (const vector& x,
+                      const vector& y);
+T   template 
+      bool operator!=(const vector& x,
+                      const vector& y);
+T   template 
+      bool operator> (const vector& x,
+                      const vector& y);
+T   template 
+      bool operator>=(const vector& x,
+                      const vector& y);
+T   template 
+      bool operator<=(const vector& x,
+                      const vector& y);
+    // specialized algorithms:
+T   template 
+      void swap(vector& x, vector& y);
+
+   23.3  Associative containers                         [lib.associative]
+
+  and :
+
+   Header  synopsis
+
+    template ,
+              class Allocator = allocator > >
+T     class map;
+
+T   template 
+      bool operator==(const map& x,
+                      const map& y);
+T   template 
+      bool operator< (const map& x,
+                      const map& y);
+T   template 
+      bool operator!=(const map& x,
+                      const map& y);
+T   template 
+      bool operator> (const map& x,
+                      const map& y);
+T   template 
+      bool operator>=(const map& x,
+                      const map& y);
+T   template 
+      bool operator<=(const map& x,
+                      const map& y);
+T   template 
+      void swap(map& x,
+                map& y);
+T   template ,
+              class Allocator = allocator > >
+      class multimap;
+T   template 
+      bool operator==(const multimap& x,
+                      const multimap& y);
+T   template 
+      bool operator< (const multimap& x,
+                      const multimap& y);
+T   template 
+      bool operator!=(const multimap& x,
+                      const multimap& y);
+T   template 
+      bool operator> (const multimap& x,
+                      const multimap& y);
+T   template 
+      bool operator>=(const multimap& x,
+                      const multimap& y);
+T   template 
+      bool operator<=(const multimap& x,
+                      const multimap& y);
+T   template 
+      void swap(multimap& x,
+                multimap& y);
+   }
+
+   Header  synopsis
+
+    template ,
+              class Allocator = allocator >
+T     class set;
+
+T   template 
+      bool operator==(const set& x,
+                      const set& y);
+T   template 
+      bool operator< (const set& x,
+                      const set& y);
+T   template 
+      bool operator!=(const set& x,
+                      const set& y);
+T   template 
+      bool operator> (const set& x,
+                      const set& y);
+T   template 
+      bool operator>=(const set& x,
+                      const set& y);
+T   template 
+      bool operator<=(const set& x,
+                      const set& y);
+T   template 
+      void swap(set& x,
+                set& y);
+T   template ,
+              class Allocator = allocator >
+      class multiset;
+T   template 
+      bool operator==(const multiset& x,
+                      const multiset& y);
+T   template 
+      bool operator< (const multiset& x,
+                      const multiset& y);
+T   template 
+      bool operator!=(const multiset& x,
+                      const multiset& y);
+T   template 
+      bool operator> (const multiset& x,
+                      const multiset& y);
+T   template 
+      bool operator>=(const multiset& x,
+                      const multiset& y);
+T   template 
+      bool operator<=(const multiset& x,
+                      const multiset& y);
+T   template 
+      void swap(multiset& x,
+                multiset& y);
+   }
+
+   23.3.1  Template class map                                   [lib.map]
+
+    template ,
+              class Allocator = allocator > >
+T     class map {
+    public:
+      // types:
+T     typedef Key                                   key_type;
+T     typedef T                                     mapped_type;
+T     typedef pair                    value_type;
+T     typedef Compare                               key_compare;
+T     typedef Allocator                             allocator_type;
+T     typedef typename Allocator::reference         reference;
+T     typedef typename Allocator::const_reference   const_reference;
+T     typedef implementation defined                iterator;
+T     typedef implementation defined                const_iterator;
+T     typedef implementation defined                size_type;
+T     typedef implementation defined                difference_type;
+T     typedef typename Allocator::pointer           pointer;
+T     typedef typename Allocator::const_pointer     const_pointer;
+T     typedef std::reverse_iterator       reverse_iterator;
+T     typedef std::reverse_iterator const_reverse_iterator;
+T     class value_compare
+        : public binary_function {
+      friend class map;
+      protected:
+T       Compare comp;
+T       value_compare(Compare c) : comp(c) {}
+      public:
+T       bool operator()(const value_type& x, const value_type& y) const {
+          return comp(x.first, y.first);
+        }
+      };
+
+      // _lib.map.cons_ construct/copy/destroy:
+T     explicit map(const Compare& comp = Compare(),
+                   const Allocator& = Allocator());
+T     template 
+        map(InputIterator first, InputIterator last,
+            const Compare& comp = Compare(), const Allocator& = Allocator());
+T     map(const map& x);
+T    ~map();
+T     map&
+        operator=(const map& x);
+      // iterators:
+T     iterator               begin();
+T     const_iterator         begin() const;
+T     iterator               end();
+T     const_iterator         end() const;
+T     reverse_iterator       rbegin();
+T     const_reverse_iterator rbegin() const;
+T     reverse_iterator       rend();
+T     const_reverse_iterator rend() const;
+      // capacity:
+T     bool      empty() const;
+T     size_type size() const;
+T     size_type max_size() const;
+      // _lib.map.access_ element access:
+T     T& operator[](const key_type& x);
+      // modifiers:
+T     pair insert(const value_type& x);
+T     iterator             insert(iterator position, const value_type& x);
+T     template 
+        void insert(InputIterator first, InputIterator last);
+T     void      erase(iterator position);
+T     size_type erase(const key_type& x);
+T     void      erase(iterator first, iterator last);
+T     void swap(map&);
+T     void clear();
+      // observers:
+T     key_compare   key_comp() const;
+T     value_compare value_comp() const;
+      // _lib.map.ops_ map operations:
+T     iterator       find(const key_type& x);
+T     const_iterator find(const key_type& x) const;
+T     size_type      count(const key_type& x) const;
+T     iterator       lower_bound(const key_type& x);
+T     const_iterator lower_bound(const key_type& x) const;
+T     iterator       upper_bound(const key_type& x);
+T     const_iterator upper_bound(const key_type& x) const;
+T     pair
+          equal_range(const key_type& x);
+T     pair
+          equal_range(const key_type& x) const;
+    };
+
+T   template 
+      bool operator==(const map& x,
+                      const map& y);
+T   template 
+      bool operator< (const map& x,
+                      const map& y);
+T   template 
+      bool operator!=(const map& x,
+                      const map& y);
+T   template 
+      bool operator> (const map& x,
+                      const map& y);
+T   template 
+      bool operator>=(const map& x,
+                      const map& y);
+T   template 
+      bool operator<=(const map& x,
+                      const map& y);
+    // specialized algorithms:
+T   template 
+      void swap(map& x,
+                map& y);
+
+   23.3.2  Template class multimap                         [lib.multimap]
+
+    template ,
+              class Allocator = allocator > >
+T   class multimap {
+    public:
+      // types:
+T     typedef Key                                   key_type;
+T     typedef T                                     mapped_type;
+T     typedef pair                     value_type;
+T     typedef Compare                               key_compare;
+T     typedef Allocator                             allocator_type;
+T     typedef typename Allocator::reference         reference;
+T     typedef typename Allocator::const_reference   const_reference;
+T     typedef implementation defined                iterator;
+T     typedef implementation defined                const_iterator;
+T     typedef implementation defined                size_type;
+T     typedef implementation defined                difference_type
+T     typedef typename Allocator::pointer           pointer;
+T     typedef typename Allocator::const_pointer     const_pointer;
+T     typedef std::reverse_iterator       reverse_iterator;
+T     typedef std::reverse_iterator const_reverse_iterator;
+T     class value_compare
+        : public binary_function {
+      friend class multimap;
+      protected:
+T       Compare comp;
+T       value_compare(Compare c) : comp(c) {}
+      public:
+T       bool operator()(const value_type& x, const value_type& y) const {
+          return comp(x.first, y.first);
+        }
+      };
+      // construct/copy/destroy:
+T     explicit multimap(const Compare& comp = Compare(),
+                        const Allocator& = Allocator());
+T     template 
+        multimap(InputIterator first, InputIterator last,
+                 const Compare& comp = Compare(),
+                 const Allocator& = Allocator());
+T     multimap(const multimap& x);
+T    ~multimap();
+T     multimap&
+        operator=(const multimap& x);
+T     allocator_type get_allocator() const;
+
+      // iterators:
+T     iterator               begin();
+T     const_iterator         begin() const;
+T     iterator               end();
+T     const_iterator         end() const;
+T     reverse_iterator       rbegin();
+T     const_reverse_iterator rbegin() const;
+T     reverse_iterator       rend();
+T     const_reverse_iterator rend() const;
+      // capacity:
+T     bool           empty() const;
+T     size_type      size() const;
+T     size_type      max_size() const;
+      // modifiers:
+T     iterator insert(const value_type& x);
+T     iterator insert(iterator position, const value_type& x);
+T     template 
+        void insert(InputIterator first, InputIterator last);
+T     void      erase(iterator position);
+T     size_type erase(const key_type& x);
+T     void      erase(iterator first, iterator last);
+T     void swap(multimap&);
+T     void clear();
+      // observers:
+T     key_compare    key_comp() const;
+T     value_compare  value_comp() const;
+      // map operations:
+T     iterator       find(const key_type& x);
+T     const_iterator find(const key_type& x) const;
+T     size_type      count(const key_type& x) const;
+T     iterator       lower_bound(const key_type& x);
+T     const_iterator lower_bound(const key_type& x) const;
+T     iterator       upper_bound(const key_type& x);
+T     const_iterator upper_bound(const key_type& x) const;
+T     pair             equal_range(const key_type& x);
+T     pair equal_range(const key_type& x) const;
+    };
+
+T   template 
+      bool operator==(const multimap& x,
+                      const multimap& y);
+T   template 
+      bool operator< (const multimap& x,
+                      const multimap& y);
+T   template 
+      bool operator!=(const multimap& x,
+                      const multimap& y);
+T   template 
+      bool operator> (const multimap& x,
+                      const multimap& y);
+T   template 
+      bool operator>=(const multimap& x,
+                      const multimap& y);
+T   template 
+      bool operator<=(const multimap& x,
+                      const multimap& y);
+    // specialized algorithms:
+T   template 
+      void swap(multimap& x,
+                multimap& y);
+
+
+   23.3.3  Template class set                                   [lib.set]
+
+    template ,
+              class Allocator = allocator >
+T   class set {
+    public:
+      // types:
+T     typedef Key                                   key_type;
+T     typedef Key                                   value_type;
+T     typedef Compare                               key_compare;
+T     typedef Compare                               value_compare;
+T     typedef Allocator                             allocator_type;
+T     typedef typename Allocator::reference         reference;
+T     typedef typename Allocator::const_reference   const_reference;
+T     typedef implementation defined                iterator;
+T     typedef implementation defined                const_iterator;
+T     typedef implementation defined                size_type;
+T     typedef implementation defined                difference_type;
+T     typedef typename Allocator::pointer           pointer;
+T     typedef typename Allocator::const_pointer     const_pointer;
+T     typedef std::reverse_iterator       reverse_iterator;
+T     typedef std::reverse_iterator const_reverse_iterator;
+      // _lib.set.cons_ construct/copy/destroy:
+T     explicit set(const Compare& comp = Compare(),
+                   const Allocator& = Allocator());
+T     template 
+        set(InputIterator first, InputIterator last,
+            const Compare& comp = Compare(), const Allocator& = Allocator());
+T     set(const set& x);
+T    ~set();
+T     set&
+        operator=(const set& x);
+T     allocator_type get_allocator() const;
+      // iterators:
+T     iterator               begin();
+T     const_iterator         begin() const;
+T     iterator               end();
+T     const_iterator         end() const;
+T     reverse_iterator       rbegin();
+T     const_reverse_iterator rbegin() const;
+T     reverse_iterator       rend();
+T     const_reverse_iterator rend() const;
+      // capacity:
+T     bool          empty() const;
+T     size_type     size() const;
+T     size_type     max_size() const;
+      // modifiers:
+T     pair insert(const value_type& x);
+T     iterator            insert(iterator position, const value_type& x);
+T     template 
+T         void insert(InputIterator first, InputIterator last);
+T     void      erase(iterator position);
+T     size_type erase(const key_type& x);
+T     void      erase(iterator first, iterator last);
+T     void swap(set&);
+T     void clear();
+
+      // observers:
+T     key_compare   key_comp() const;
+T     value_compare value_comp() const;
+      // set operations:
+T     iterator  find(const key_type& x) const;
+T     size_type count(const key_type& x) const;
+T     iterator  lower_bound(const key_type& x) const;
+T     iterator  upper_bound(const key_type& x) const;
+T     pair equal_range(const key_type& x) const;
+    };
+T   template 
+      bool operator==(const set& x,
+                      const set& y);
+T   template 
+      bool operator< (const set& x,
+                      const set& y);
+T   template 
+      bool operator!=(const set& x,
+                      const set& y);
+T   template 
+      bool operator> (const set& x,
+                      const set& y);
+T   template 
+      bool operator>=(const set& x,
+                      const set& y);
+T   template 
+      bool operator<=(const set& x,
+                      const set& y);
+    // specialized algorithms:
+T   template 
+      void swap(set& x,
+                set& y);
+
+   23.3.4  Template class multiset                         [lib.multiset]
+
+    template ,
+              class Allocator = allocator >
+T   class multiset {
+    public:
+      // types:
+T     typedef Key                                   key_type;
+T     typedef Key                                   value_type;
+T     typedef Compare                               key_compare;
+T     typedef Compare                               value_compare;
+T     typedef Allocator                             allocator_type;
+T     typedef typename Allocator::reference         reference;
+T     typedef typename Allocator::const_reference   const_reference;
+T     typedef implementation defined                iterator;
+T     typedef implementation defined                const_iterator;
+T     typedef implementation defined                size_type;
+T     typedef implementation defined                difference_type
+T     typedef typename Allocator::pointer           pointer;
+T     typedef typename Allocator::const_pointer     const_pointer;
+T     typedef std::reverse_iterator       reverse_iterator;
+T     typedef std::reverse_iterator const_reverse_iterator;
+
+      // construct/copy/destroy:
+T     explicit multiset(const Compare& comp = Compare(),
+                        const Allocator& = Allocator());
+T     template 
+        multiset(InputIterator first, InputIterator last,
+                 const Compare& comp = Compare(),
+                 const Allocator& = Allocator());
+T     multiset(const multiset& x);
+T    ~multiset();
+T     multiset&
+          operator=(const multiset& x);
+T     allocator_type get_allocator() const;
+      // iterators:
+T     iterator               begin();
+T     const_iterator         begin() const;
+T     iterator               end();
+T     const_iterator         end() const;
+T     reverse_iterator       rbegin();
+T     const_reverse_iterator rbegin() const;
+T     reverse_iterator       rend();
+T     const_reverse_iterator rend() const;
+      // capacity:
+T     bool          empty() const;
+T     size_type     size() const;
+T     size_type     max_size() const;
+      // modifiers:
+T     iterator insert(const value_type& x);
+T     iterator insert(iterator position, const value_type& x);
+T     template 
+        void insert(InputIterator first, InputIterator last);
+T     void      erase(iterator position);
+T     size_type erase(const key_type& x);
+T     void      erase(iterator first, iterator last);
+T     void swap(multiset&);
+T     void clear();
+      // observers:
+T     key_compare   key_comp() const;
+T     value_compare value_comp() const;
+      // set operations:
+T     iterator  find(const key_type& x) const;
+T     size_type count(const key_type& x) const;
+T     iterator  lower_bound(const key_type& x) const;
+T     iterator  upper_bound(const key_type& x) const;
+T     pair equal_range(const key_type& x) const;
+    };
+
+T   template 
+      bool operator==(const multiset& x,
+                      const multiset& y);
+T   template 
+      bool operator< (const multiset& x,
+                      const multiset& y);
+T   template 
+      bool operator!=(const multiset& x,
+                      const multiset& y);
+T   template 
+      bool operator> (const multiset& x,
+                      const multiset& y);
+T   template 
+      bool operator>=(const multiset& x,
+                      const multiset& y);
+T   template 
+      bool operator<=(const multiset& x,
+                      const multiset& y);
+    // specialized algorithms:
+T   template 
+      void swap(multiset& x,
+                multiset& y);
+
+   23.3.5  Template class bitset                    [lib.template.bitset]
+
+   Header  synopsis
+
+T   template  class bitset;
+    // _lib.bitset.operators_ bitset operations:
+T   template 
+      bitset operator&(const bitset&, const bitset&);
+T   template 
+      bitset operator|(const bitset&, const bitset&);
+T   template 
+      bitset operator^(const bitset&, const bitset&);
+T   template 
+      basic_istream&
+      operator>>(basic_istream& is, bitset& x);
+T   template 
+      basic_ostream&
+      operator<<(basic_ostream& os, const bitset& x);
+
+T   template class bitset {
+    public:
+      // bit reference:
+T     class reference {
+        friend class bitset;
+T       reference();
+      public:
+T      ~reference();
+T       reference& operator=(bool x);             // for b[i] = x;
+T       reference& operator=(const reference&);   // for b[i] = b[j];
+T       bool operator~() const;                   // flips the bit
+T       operator bool() const;                    // for x = b[i];
+T       reference& flip();                        // for b[i].flip();
+      };
+
+      // _lib.bitset.cons_ constructors:
+T     bitset();
+T     bitset(unsigned long val);
+T     template
+        explicit bitset(
+          const basic_string& str,
+          typename basic_string::size_type pos = 0,
+          typename basic_string::size_type n =
+            basic_string::npos);
+      // _lib.bitset.members_ bitset operations:
+T     bitset& operator&=(const bitset& rhs);
+T     bitset& operator|=(const bitset& rhs);
+T     bitset& operator^=(const bitset& rhs);
+T     bitset& operator<<=(size_t pos);
+T     bitset& operator>>=(size_t pos);
+T     bitset& set();
+T     bitset& set(size_t pos, int val = true);
+T     bitset& reset();
+T     bitset& reset(size_t pos);
+T     bitset  operator~() const;
+T     bitset& flip();
+T     bitset& flip(size_t pos);
+      // element access:
+T     reference operator[](size_t pos);         // for b[i];
+T     unsigned long  to_ulong() const;
+T     template 
+        basic_string to_string() const;
+T     size_t count() const;
+T     size_t size()  const;
+T     bool operator==(const bitset& rhs) const;
+T     bool operator!=(const bitset& rhs) const;
+T     bool test(size_t pos) const;
+T     bool any() const;
+T     bool none() const;
+T     bitset operator<<(size_t pos) const;
+T     bitset operator>>(size_t pos) const;
+    };
+
+
+
+
+   24.2  Header  synopsis               [lib.iterator.synopsis]
+
+    // _lib.iterator.primitives_, primitives:
+T   template struct iterator_traits;
+T   template struct iterator_traits;
+
+X   template struct iterator;
+T   struct input_iterator_tag {};
+T   struct output_iterator_tag {};
+T   struct forward_iterator_tag: public input_iterator_tag {};
+T   struct bidirectional_iterator_tag: public forward_iterator_tag {};
+T   struct random_access_iterator_tag: public bidirectional_iterator_tag {};
+    // _lib.iterator.operations_, iterator operations:
+T   template 
+      void advance(InputIterator& i, Distance n);
+T   template 
+      typename iterator_traits::difference_type
+      distance(InputIterator first, InputIterator last);
+    // _lib.predef.iterators_, predefined iterators:
+X   template  class reverse_iterator;
+T   template 
+      bool operator==(
+        const reverse_iterator& x,
+        const reverse_iterator& y);
+T   template 
+      bool operator<(
+        const reverse_iterator& x,
+        const reverse_iterator& y);
+T   template 
+      bool operator!=(
+        const reverse_iterator& x,
+        const reverse_iterator& y);
+T   template 
+      bool operator>(
+        const reverse_iterator& x,
+        const reverse_iterator& y);
+T   template 
+      bool operator>=(
+        const reverse_iterator& x,
+        const reverse_iterator& y);
+T   template 
+      bool operator<=(
+        const reverse_iterator& x,
+        const reverse_iterator& y);
+T   template 
+      typename reverse_iterator::difference_type operator-(
+        const reverse_iterator& x,
+        const reverse_iterator& y);
+T   template 
+      reverse_iterator
+        operator+(
+          typename reverse_iterator::difference_type n,
+          const reverse_iterator& x);
+
+X   template  class back_insert_iterator;
+T   template 
+      back_insert_iterator back_inserter(Container& x);
+X   template  class front_insert_iterator;
+T   template 
+      front_insert_iterator front_inserter(Container& x);
+X   template  class insert_iterator;
+T   template 
+      insert_iterator inserter(Container& x, Iterator i);
+    // _lib.stream.iterators_, stream iterators:
+X   template ,
+              class Distance = ptrdiff_t>
+      class istream_iterator;
+    template 
+X     bool operator==(const istream_iterator& x,
+                      const istream_iterator& y);
+    template 
+X     bool operator!=(const istream_iterator& x,
+                      const istream_iterator& y);
+X   template  >
+        class ostream_iterator;
+X   template >
+      class istreambuf_iterator;
+X   template 
+      bool operator==(const istreambuf_iterator& a,
+                      const istreambuf_iterator& b);
+X   template 
+      bool operator!=(const istreambuf_iterator& a,
+                      const istreambuf_iterator& b);
+T   template  >
+      class ostreambuf_iterator;
+
+   24.3  Iterator primitives                    [lib.iterator.primitives]
+
+T   template struct iterator_traits {
+T     typedef typename Iterator::difference_type difference_type;
+T     typedef typename Iterator::value_type value_type;
+T     typedef typename Iterator::pointer pointer;
+T     typedef typename Iterator::reference reference;
+T     typedef typename Iterator::iterator_category iterator_category;
+    };
+
+T   template struct iterator_traits {
+T     typedef ptrdiff_t difference_type;
+T     typedef T value_type;
+T     typedef T* pointer;
+T     typedef T& reference;
+T     typedef random_access_iterator_tag iterator_category;
+    };
+
+T   template struct iterator_traits {
+T     typedef ptrdiff_t difference_type;
+T     typedef T value_type;
+T     typedef const T* pointer;
+T     typedef const T& reference;
+T     typedef random_access_iterator_tag iterator_category;
+    };
+
+   24.3.2  Basic iterator                            [lib.iterator.basic]
+
+    template
+X     struct iterator {
+T         typedef T         value_type;
+T         typedef Distance  difference_type;
+T         typedef Pointer   pointer;
+T         typedef Reference reference;
+T         typedef Category  iterator_category;
+    };
+
+   24.3.3  Standard iterator tags                 [lib.std.iterator.tags]
+
+T   struct input_iterator_tag {};
+T   struct output_iterator_tag {};
+T   struct forward_iterator_tag: public input_iterator_tag {};
+T   struct bidirectional_iterator_tag: public forward_iterator_tag {};
+T   struct random_access_iterator_tag: public bidirectional_iterator_tag {};
+
+
+   24.4.1  Reverse iterators                      [lib.reverse.iterators]
+
+    template 
+X   class reverse_iterator : public
+          iterator::iterator_category,
+                   typename iterator_traits::value_type,
+                   typename iterator_traits::difference_type,
+                   typename iterator_traits::pointer,
+                   typename iterator_traits::reference> {
+    protected:
+T     Iterator current;
+    public:
+T     typedef Iterator
+          iterator_type;
+T     typedef typename iterator_traits::difference_type
+          difference_type;
+T     typedef typename iterator_traits::reference
+          reference;
+T     typedef typename iterator_traits::pointer
+          pointer;
+
+T     reverse_iterator();
+T     explicit reverse_iterator(Iterator x);
+T     template  reverse_iterator(const reverse_iterator& u);
+T     Iterator base() const;      // explicit
+T     reference operator*() const;
+T     pointer   operator->() const;
+T     reverse_iterator& operator++();
+T     reverse_iterator  operator++(int);
+T     reverse_iterator& operator--();
+T     reverse_iterator  operator--(int);
+
+T     reverse_iterator  operator+ (difference_type n) const;
+T     reverse_iterator& operator+=(difference_type n);
+T     reverse_iterator  operator- (difference_type n) const;
+T     reverse_iterator& operator-=(difference_type n);
+T     reference operator[](difference_type n) const;
+    };
+T   template 
+      bool operator==(
+        const reverse_iterator& x,
+        const reverse_iterator& y);
+T   template 
+      bool operator<(
+        const reverse_iterator& x,
+        const reverse_iterator& y);
+T   template 
+      bool operator!=(
+        const reverse_iterator& x,
+        const reverse_iterator& y);
+T   template 
+      bool operator>(
+        const reverse_iterator& x,
+        const reverse_iterator& y);
+T   template 
+      bool operator>=(
+        const reverse_iterator& x,
+        const reverse_iterator& y);
+T   template 
+      bool operator<=(
+        const reverse_iterator& x,
+        const reverse_iterator& y);
+T   template 
+      typename reverse_iterator::difference_type operator-(
+        const reverse_iterator& x,
+        const reverse_iterator& y);
+T   template 
+      reverse_iterator operator+(
+        typename reverse_iterator::difference_type n,
+        const reverse_iterator& x);
+
+
+   24.4.2.1  Template class                    [lib.back.insert.iterator]
+       back_insert_iterator
+
+    template 
+X   class back_insert_iterator :
+          public iterator {
+    protected:
+T     Container* container;
+    public:
+T     typedef Container container_type;
+T     explicit back_insert_iterator(Container& x);
+T     back_insert_iterator&
+        operator=(typename Container::const_reference value);
+
+T     back_insert_iterator& operator*();
+T     back_insert_iterator& operator++();
+T     back_insert_iterator  operator++(int);
+    };
+T   template 
+      back_insert_iterator back_inserter(Container& x);
+
+
+
+   24.4.2.3  Template class                   [lib.front.insert.iterator]
+       front_insert_iterator
+
+    template 
+X   class front_insert_iterator :
+          public iterator {
+    protected:
+T     Container* container;
+    public:
+T     typedef Container container_type;
+T     explicit front_insert_iterator(Container& x);
+T     front_insert_iterator&
+        operator=(typename Container::const_reference value);
+T     front_insert_iterator& operator*();
+T     front_insert_iterator& operator++();
+T     front_insert_iterator  operator++(int);
+    };
+T   template 
+      front_insert_iterator front_inserter(Container& x);
+
+
+   24.4.2.5  Template class insert_iterator         [lib.insert.iterator]
+
+    template 
+X   class insert_iterator :
+          public iterator {
+    protected:
+T     Container* container;
+T     typename Container::iterator iter;
+    public:
+T     typedef Container container_type;
+T     insert_iterator(Container& x, typename Container::iterator i);
+T     insert_iterator&
+        operator=(typename Container::const_reference value);
+T     insert_iterator& operator*();
+T     insert_iterator& operator++();
+T     insert_iterator& operator++(int);
+    };
+T   template 
+      insert_iterator inserter(Container& x, Iterator i);
+
+   24.5.1  Template class istream_iterator         [lib.istream.iterator]
+
+    template ,
+        class Distance = ptrdiff_t>
+X   class istream_iterator:
+      public iterator {
+    public:
+T     typedef charT char_type
+T     typedef traits traits_type;
+T     typedef basic_istream istream_type;
+T     istream_iterator();
+T     istream_iterator(istream_type& s);
+T     istream_iterator(const istream_iterator& x);
+T    ~istream_iterator();
+
+T     const T& operator*() const;
+T     const T* operator->() const;
+T     istream_iterator& operator++();
+T     istream_iterator  operator++(int);
+    };
+
+T   template 
+      bool operator==(const istream_iterator& x,
+                      const istream_iterator& y);
+T   template 
+      bool operator!=(const istream_iterator& x,
+                      const istream_iterator& y);
+
+
+   24.5.2  Template class ostream_iterator         [lib.ostream.iterator]
+
+    template  >
+X   class ostream_iterator:
+      public iterator {
+    public:
+T     typedef charT char_type;
+T     typedef traits traits_type;
+T     typedef basic_ostream ostream_type;
+T     ostream_iterator(ostream_type& s);
+T     ostream_iterator(ostream_type& s, const charT* delimiter);
+T     ostream_iterator(const ostream_iterator& x);
+T    ~ostream_iterator();
+T     ostream_iterator& operator=(const T& value);
+
+T     ostream_iterator& operator*();
+T     ostream_iterator& operator++();
+T     ostream_iterator& operator++(int);
+    };
+
+
+   24.5.3  Template class                       [lib.istreambuf.iterator]
+       istreambuf_iterator
+
+    template >
+X   class istreambuf_iterator
+       : public iterator {
+    public:
+T     typedef charT                         char_type;
+T     typedef traits                        traits_type;
+T     typedef typename traits::int_type     int_type;
+T     typedef basic_streambuf streambuf_type;
+T     typedef basic_istream   istream_type;
+T     class proxy;                        // exposition only
+T     istreambuf_iterator() throw();
+T     istreambuf_iterator(istream_type& s) throw();
+T     istreambuf_iterator(streambuf_type* s) throw();
+T     istreambuf_iterator(const proxy& p) throw();
+T     charT operator*() const;
+T     istreambuf_iterator& operator++();
+T     proxy operator++(int);
+X     bool equal(istreambuf_iterator& b);
+    };
+
+T   template 
+      bool operator==(const istreambuf_iterator& a,
+                      const istreambuf_iterator& b);
+
+T   template 
+      bool operator!=(const istreambuf_iterator& a,
+                      const istreambuf_iterator& b);
+
+   24.5.3.1  Template class              [lib.istreambuf.iterator::proxy]
+       istreambuf_iterator::proxy
+
+    template  >
+T     class istreambuf_iterator::proxy
+    {
+T     charT keep_;
+T     basic_streambuf* sbuf_;
+T     proxy(charT c,
+            basic_streambuf* sbuf);
+        : keep_(c), sbuf_(sbuf) {}
+    public:
+T     charT operator*() { return keep_; }
+    };
+
+
+
+   24.5.4  Template class                       [lib.ostreambuf.iterator]
+       ostreambuf_iterator
+
+    template  >
+T   class ostreambuf_iterator:
+      public iterator {
+    public:
+T     typedef charT                         char_type;
+T     typedef traits                        traits_type;
+T     typedef basic_streambuf streambuf_type;
+T     typedef basic_ostream   ostream_type;
+    public:
+T     ostreambuf_iterator(ostream_type& s) throw();
+T     ostreambuf_iterator(streambuf_type* s) throw();
+T     ostreambuf_iterator& operator=(charT c);
+T     ostreambuf_iterator& operator*();
+T     ostreambuf_iterator& operator++();
+T     ostreambuf_iterator& operator++(int);
+T     bool failed() const throw();
+    };
+
+
+   Header  synopsis
+
+
+    // _lib.alg.nonmodifying_, non-modifying sequence operations:
+T   template
+      Function for_each(InputIterator first, InputIterator last, Function f);
+T   template
+      InputIterator find(InputIterator first, InputIterator last,
+                         const T& value);
+T   template
+      InputIterator find_if(InputIterator first, InputIterator last,
+                            Predicate pred);
+T   template
+      ForwardIterator1
+        find_end(ForwardIterator1 first1, ForwardIterator1 last1,
+                 ForwardIterator2 first2, ForwardIterator2 last2);
+T   template
+      ForwardIterator1
+        find_end(ForwardIterator1 first1, ForwardIterator1 last1,
+                 ForwardIterator2 first2, ForwardIterator2 last2,
+                 BinaryPredicate pred);
+T   template
+      ForwardIterator1
+        find_first_of(ForwardIterator1 first1, ForwardIterator1 last1,
+                      ForwardIterator2 first2, ForwardIterator2 last2);
+T   template
+      ForwardIterator1
+        find_first_of(ForwardIterator1 first1, ForwardIterator1 last1,
+                 ForwardIterator2 first2, ForwardIterator2 last2,
+                 BinaryPredicate pred);
+T   template
+      ForwardIterator adjacent_find(ForwardIterator first,
+                                    ForwardIterator last);
+T   template
+      ForwardIterator adjacent_find(ForwardIterator first,
+          ForwardIterator last, BinaryPredicate pred);
+T   template
+      typename iterator_traits::difference_type
+        count(InputIterator first, InputIterator last, const T& value);
+T   template
+      typename iterator_traits::difference_type
+        count_if(InputIterator first, InputIterator last, Predicate pred);
+T   template
+      pair
+        mismatch(InputIterator1 first1, InputIterator1 last1,
+                 InputIterator2 first2);
+T   template
+      pair
+        mismatch(InputIterator1 first1, InputIterator1 last1,
+                 InputIterator2 first2, BinaryPredicate pred);
+
+T   template
+      bool equal(InputIterator1 first1, InputIterator1 last1,
+                 InputIterator2 first2);
+T   template
+      bool equal(InputIterator1 first1, InputIterator1 last1,
+                 InputIterator2 first2, BinaryPredicate pred);
+T   template
+      ForwardIterator1 search(ForwardIterator1 first1, ForwardIterator1 last1,
+                              ForwardIterator2 first2, ForwardIterator2 last2);
+T   template
+      ForwardIterator1 search(ForwardIterator1 first1, ForwardIterator1 last1,
+                              ForwardIterator2 first2, ForwardIterator2 last2,
+                              BinaryPredicate pred);
+T   template
+      ForwardIterator  search_n(ForwardIterator first, ForwardIterator last,
+                              Size count, const T& value);
+T   template
+      ForwardIterator1 search_n(ForwardIterator first, ForwardIterator last,
+                              Size count, const T& value,
+                              BinaryPredicate pred);
+    // _lib.alg.modifying.operations_, modifying sequence operations:
+    // _lib.alg.copy_, copy:
+T   template
+      OutputIterator copy(InputIterator first, InputIterator last,
+                          OutputIterator result);
+T   template
+      BidirectionalIterator2
+        copy_backward(BidirectionalIterator1 first, BidirectionalIterator1 last,
+                      BidirectionalIterator2 result);
+    // _lib.alg.swap_, swap:
+T   template void swap(T& a, T& b);
+T   template
+      ForwardIterator2 swap_ranges(ForwardIterator1 first1,
+          ForwardIterator1 last1, ForwardIterator2 first2);
+T   template
+      void iter_swap(ForwardIterator1 a, ForwardIterator2 b);
+T   template
+      OutputIterator transform(InputIterator first, InputIterator last,
+                               OutputIterator result, UnaryOperation op);
+T   template
+      OutputIterator transform(InputIterator1 first1, InputIterator1 last1,
+                               InputIterator2 first2, OutputIterator result,
+                               BinaryOperation binary_op);
+
+T   template
+      void replace(ForwardIterator first, ForwardIterator last,
+                   const T& old_value, const T& new_value);
+T   template
+      void replace_if(ForwardIterator first, ForwardIterator last,
+                      Predicate pred, const T& new_value);
+T   template
+      OutputIterator replace_copy(InputIterator first, InputIterator last,
+                                  OutputIterator result,
+                                  const T& old_value, const T& new_value);
+T   template
+      OutputIterator replace_copy_if(Iterator first, Iterator last,
+                                     OutputIterator result,
+                                     Predicate pred, const T& new_value);
+T   template
+      void fill(ForwardIterator first, ForwardIterator last, const T& value);
+T   template
+      void fill_n(OutputIterator first, Size n, const T& value);
+T   template
+      void generate(ForwardIterator first, ForwardIterator last, Generator gen);
+T   template
+      void generate_n(OutputIterator first, Size n, Generator gen);
+T   template
+      ForwardIterator remove(ForwardIterator first, ForwardIterator last,
+                             const T& value);
+T   template
+      ForwardIterator remove_if(ForwardIterator first, ForwardIterator last,
+                                Predicate pred);
+T   template
+      OutputIterator remove_copy(InputIterator first, InputIterator last,
+                                 OutputIterator result, const T& value);
+T   template
+      OutputIterator remove_copy_if(InputIterator first, InputIterator last,
+                                    OutputIterator result, Predicate pred);
+T   template
+      ForwardIterator unique(ForwardIterator first, ForwardIterator last);
+T   template
+      ForwardIterator unique(ForwardIterator first, ForwardIterator last,
+                             BinaryPredicate pred);
+T   template
+      OutputIterator unique_copy(InputIterator first, InputIterator last,
+                                 OutputIterator result);
+T   template
+      OutputIterator unique_copy(InputIterator first, InputIterator last,
+                                 OutputIterator result, BinaryPredicate pred);
+T   template
+      void reverse(BidirectionalIterator first, BidirectionalIterator last);
+T   template
+      OutputIterator reverse_copy(BidirectionalIterator first,
+                                  BidirectionalIterator last,
+                                  OutputIterator result);
+
+T   template
+      void rotate(ForwardIterator first, ForwardIterator middle,
+                  ForwardIterator last);
+T   template
+      OutputIterator rotate_copy(ForwardIterator first, ForwardIterator middle,
+                                 ForwardIterator last, OutputIterator result);
+T   template
+      void random_shuffle(RandomAccessIterator first,
+                          RandomAccessIterator last);
+T   template
+      void random_shuffle(RandomAccessIterator first,
+                          RandomAccessIterator last,
+                          RandomNumberGenerator& rand);
+    // _lib.alg.partitions_, partitions:
+T   template
+      BidirectionalIterator partition(BidirectionalIterator first,
+                                      BidirectionalIterator last,
+                                      Predicate pred);
+T   template
+      BidirectionalIterator stable_partition(BidirectionalIterator first,
+                                             BidirectionalIterator last,
+                                             Predicate pred);
+    // _lib.alg.sorting_, sorting and related operations:
+    // _lib.alg.sort_, sorting:
+T   template
+      void sort(RandomAccessIterator first, RandomAccessIterator last);
+T   template
+      void sort(RandomAccessIterator first, RandomAccessIterator last,
+                Compare comp);
+T   template
+      void stable_sort(RandomAccessIterator first, RandomAccessIterator last);
+T   template
+      void stable_sort(RandomAccessIterator first, RandomAccessIterator last,
+                       Compare comp);
+T   template
+      void partial_sort(RandomAccessIterator first,
+                        RandomAccessIterator middle,
+                        RandomAccessIterator last);
+T   template
+      void partial_sort(RandomAccessIterator first,
+                        RandomAccessIterator middle,
+                        RandomAccessIterator last, Compare comp);
+T   template
+      RandomAccessIterator
+        partial_sort_copy(InputIterator first, InputIterator last,
+                          RandomAccessIterator result_first,
+                          RandomAccessIterator result_last);
+T   template
+      RandomAccessIterator
+        partial_sort_copy(InputIterator first, InputIterator last,
+                          RandomAccessIterator result_first,
+                          RandomAccessIterator result_last,
+                          Compare comp);
+
+T   template
+      void nth_element(RandomAccessIterator first, RandomAccessIterator nth,
+                       RandomAccessIterator last);
+T   template
+      void nth_element(RandomAccessIterator first, RandomAccessIterator nth,
+                       RandomAccessIterator last, Compare comp);
+    // _lib.alg.binary.search_, binary search:
+T   template
+      ForwardIterator lower_bound(ForwardIterator first, ForwardIterator last,
+                                  const T& value);
+T   template
+      ForwardIterator lower_bound(ForwardIterator first, ForwardIterator last,
+                                  const T& value, Compare comp);
+T   template
+      ForwardIterator upper_bound(ForwardIterator first, ForwardIterator last,
+                                  const T& value);
+T   template
+      ForwardIterator upper_bound(ForwardIterator first, ForwardIterator last,
+                                  const T& value, Compare comp);
+T   template
+      pair
+        equal_range(ForwardIterator first, ForwardIterator last,
+                    const T& value);
+T   template
+      pair
+        equal_range(ForwardIterator first, ForwardIterator last,
+                    const T& value, Compare comp);
+T   template
+      bool binary_search(ForwardIterator first, ForwardIterator last,
+                         const T& value);
+T   template
+      bool binary_search(ForwardIterator first, ForwardIterator last,
+                         const T& value, Compare comp);
+    // _lib.alg.merge_, merge:
+T   template
+      OutputIterator merge(InputIterator1 first1, InputIterator1 last1,
+                           InputIterator2 first2, InputIterator2 last2,
+                           OutputIterator result);
+T   template
+      OutputIterator merge(InputIterator1 first1, InputIterator1 last1,
+                           InputIterator2 first2, InputIterator2 last2,
+                           OutputIterator result, Compare comp);
+T   template
+      void inplace_merge(BidirectionalIterator first,
+                         BidirectionalIterator middle,
+                         BidirectionalIterator last);
+T   template
+      void inplace_merge(BidirectionalIterator first,
+                         BidirectionalIterator middle,
+                         BidirectionalIterator last, Compare comp);
+
+    // _lib.alg.set.operations_, set operations:
+T   template
+      bool includes(InputIterator1 first1, InputIterator1 last1,
+                    InputIterator2 first2, InputIterator2 last2);
+T   template
+      bool includes(InputIterator1 first1, InputIterator1 last1,
+                    InputIterator2 first2, InputIterator2 last2, Compare comp);
+T   template
+      OutputIterator set_union(InputIterator1 first1, InputIterator1 last1,
+                               InputIterator2 first2, InputIterator2 last2,
+                               OutputIterator result);
+T   template
+      OutputIterator set_union(InputIterator1 first1, InputIterator1 last1,
+                               InputIterator2 first2, InputIterator2 last2,
+                               OutputIterator result, Compare comp);
+T   template
+      OutputIterator set_intersection
+          (InputIterator1 first1, InputIterator1 last1,
+           InputIterator2 first2, InputIterator2 last2,
+           OutputIterator result);
+T   template
+      OutputIterator set_intersection
+          (InputIterator1 first1, InputIterator1 last1,
+           InputIterator2 first2, InputIterator2 last2,
+           OutputIterator result, Compare comp);
+T   template
+      OutputIterator set_difference
+          (InputIterator1 first1, InputIterator1 last1,
+           InputIterator2 first2, InputIterator2 last2,
+           OutputIterator result);
+T   template
+      OutputIterator set_difference(InputIterator1 first1, InputIterator1 last1,
+                                    InputIterator2 first2, InputIterator2 last2,
+                                    OutputIterator result, Compare comp);
+T   template
+      OutputIterator
+        set_symmetric_difference(InputIterator1 first1, InputIterator1 last1,
+                                 InputIterator2 first2, InputIterator2 last2,
+                                 OutputIterator result);
+T   template
+      OutputIterator
+        set_symmetric_difference(InputIterator1 first1, InputIterator1 last1,
+                                 InputIterator2 first2, InputIterator2 last2,
+                                 OutputIterator result, Compare comp);
+    // _lib.alg.heap.operations_, heap operations:
+T   template
+      void push_heap(RandomAccessIterator first, RandomAccessIterator last);
+T   template
+      void push_heap(RandomAccessIterator first, RandomAccessIterator last,
+                     Compare comp);
+
+T   template
+      void pop_heap(RandomAccessIterator first, RandomAccessIterator last);
+T   template
+      void pop_heap(RandomAccessIterator first, RandomAccessIterator last,
+                    Compare comp);
+T   template
+      void make_heap(RandomAccessIterator first, RandomAccessIterator last);
+T   template
+      void make_heap(RandomAccessIterator first, RandomAccessIterator last,
+                     Compare comp);
+T   template
+      void sort_heap(RandomAccessIterator first, RandomAccessIterator last);
+T   template
+      void sort_heap(RandomAccessIterator first, RandomAccessIterator last,
+                     Compare comp);
+    // _lib.alg.min.max_, minimum and maximum:
+T   template const T& min(const T& a, const T& b);
+T   template
+      const T& min(const T& a, const T& b, Compare comp);
+T   template const T& max(const T& a, const T& b);
+T   template
+      const T& max(const T& a, const T& b, Compare comp);
+T   template
+      ForwardIterator min_element(ForwardIterator first, ForwardIterator last);
+T   template
+      ForwardIterator min_element(ForwardIterator first, ForwardIterator last,
+                                Compare comp);
+T   template
+      ForwardIterator max_element(ForwardIterator first, ForwardIterator last);
+T   template
+      ForwardIterator max_element(ForwardIterator first, ForwardIterator last,
+                                Compare comp);
+T   template
+      bool lexicographical_compare
+          (InputIterator1 first1, InputIterator1 last1,
+           InputIterator2 first2, InputIterator2 last2);
+T   template
+      bool lexicographical_compare
+          (InputIterator1 first1, InputIterator1 last1,
+           InputIterator2 first2, InputIterator2 last2,
+           Compare comp);
+
+    // _lib.alg.permutation.generators_, permutations
+T   template
+      bool next_permutation(BidirectionalIterator first,
+                            BidirectionalIterator last);
+T   template
+      bool next_permutation(BidirectionalIterator first,
+                            BidirectionalIterator last, Compare comp);
+T   template
+      bool prev_permutation(BidirectionalIterator first,
+                            BidirectionalIterator last);
+T   template
+      bool prev_permutation(BidirectionalIterator first,
+                            BidirectionalIterator last, Compare comp);
+
+
+   25.4  C library algorithms                         [lib.alg.c.library]
+
+   1 Header  (partial, Table 2):
+
+                    Table 2--Header  synopsis
+
+                      Functions:   bsearch   qsort
+
+
+X  extern "C" void *bsearch(const void *key, const void *base,
+                          size_t nmemb, size_t size,
+                          int (*compar)(const void *, const void *));
+X  extern "C++" void *bsearch(const void *key, const void *base,
+                          size_t nmemb, size_t size,
+                          int (*compar)(const void *, const void *));
+
+X  extern "C" void qsort(void* base, size_t nmemb, size_t size,
+                  int (*compar)(const void*, const void*));
+X  extern "C++" void qsort(void* base, size_t nmemb, size_t size,
+                  int (*compar)(const void*, const void*));
+
+
+
+   26.2  Complex numbers                            [lib.complex.numbers]
+
+
+   26.2.1  Header  synopsis               [lib.complex.synopsis]
+
+T   template class complex;
+T   template<> class complex;
+T   template<> class complex;
+T   template<> class complex;
+    // _lib.complex.ops_ operators:
+T   template
+      complex operator+(const complex&, const complex&);
+T   template complex operator+(const complex&, const T&);
+T   template complex operator+(const T&, const complex&);
+T   template complex operator-
+      (const complex&, const complex&);
+T   template complex operator-(const complex&, const T&);
+T   template complex operator-(const T&, const complex&);
+T   template complex operator*
+      (const complex&, const complex&);
+T   template complex operator*(const complex&, const T&);
+T   template complex operator*(const T&, const complex&);
+T   template complex operator/
+      (const complex&, const complex&);
+T   template complex operator/(const complex&, const T&);
+T   template complex operator/(const T&, const complex&);
+T   template complex operator+(const complex&);
+T   template complex operator-(const complex&);
+T   template bool operator==
+      (const complex&, const complex&);
+T   template bool operator==(const complex&, const T&);
+T   template bool operator==(const T&, const complex&);
+T   template bool operator!=(const complex&, const complex&);
+T   template bool operator!=(const complex&, const T&);
+T   template bool operator!=(const T&, const complex&);
+T   template
+      basic_istream&
+      operator>>(basic_istream&, complex&);
+
+T   template
+      basic_ostream&
+      operator<<(basic_ostream&, const complex&);
+    // _lib.complex.value.ops_ values:
+T   template T real(const complex&);
+T   template T imag(const complex&);
+
+T   template T abs(const complex&);
+T   template T arg(const complex&);
+T   template T norm(const complex&);
+T   template complex conj(const complex&);
+T   template complex polar(const T&, const T&);
+    // _lib.complex.transcendentals_ transcendentals:
+T   template complex cos  (const complex&);
+T   template complex cosh (const complex&);
+T   template complex exp  (const complex&);
+T   template complex log  (const complex&);
+T   template complex log10(const complex&);
+T   template complex pow(const complex&, int);
+T   template complex pow(const complex&, const T&);
+T   template complex pow(const complex&, const complex&);
+T   template complex pow(const T&, const complex&);
+T   template complex sin  (const complex&);
+T   template complex sinh (const complex&);
+T   template complex sqrt (const complex&);
+T   template complex tan  (const complex&);
+T   template complex tanh (const complex&);
+   }
+
+   26.2.2  Template class complex                           [lib.complex]
+
+    template
+T   class complex {
+    public:
+T     typedef T value_type;
+
+T     complex(const T& re = T(), const T& im = T());
+T     complex(const complex&);
+T     template complex(const complex&);
+
+T     T real() const;
+T     T imag() const;
+
+T     complex& operator= (const T&);
+T     complex& operator+=(const T&);
+T     complex& operator-=(const T&);
+T     complex& operator*=(const T&);
+T     complex& operator/=(const T&);
+
+T     complex& operator=(const complex&);
+T     template complex& operator= (const complex&);
+T     template complex& operator+=(const complex&);
+T     template complex& operator-=(const complex&);
+T     template complex& operator*=(const complex&);
+T     template complex& operator/=(const complex&);
+    };
+
+T   template complex operator+
+      (const complex&, const complex&);
+T   template complex operator+(const complex&, const T&);
+T   template complex operator+(const T&, const complex&);
+
+T   template complex operator-
+      (const complex&, const complex&);
+T   template complex operator-(const complex&, const T&);
+T   template complex operator-(const T&, const complex&);
+
+T   template complex operator*
+      (const complex&, const complex&);
+T   template complex operator*(const complex&, const T&);
+T   template complex operator*(const T&, const complex&);
+
+T   template complex operator/
+      (const complex&, const complex&);
+T   template complex operator/(const complex&, const T&);
+T   template complex operator/(const T&, const complex&);
+
+T   template complex operator+(const complex&);
+T   template complex operator-(const complex&);
+
+T   template bool operator==(const complex&, const complex&);
+T   template bool operator==(const complex&, const T&);
+T   template bool operator==(const T&, const complex&);
+
+T   template bool operator!=(const complex&, const complex&);
+T   template bool operator!=(const complex&, const T&);
+T   template bool operator!=(const T&, const complex&);
+
+T   template
+      basic_istream&
+      operator>>(basic_istream&, complex&);
+
+T   template
+      basic_ostream&
+      operator<<(basic_ostream&, const complex&);
+
+
+   26.2.3  complex specializations                  [lib.complex.special]
+
+T   template<> class complex {
+    public:
+T     typedef float value_type;
+
+T     complex(float re = 0.0f, float im = 0.0f);
+T     explicit complex(const complex&);
+T     explicit complex(const complex&);
+T     float real() const;
+T     float imag() const;
+
+T     complex& operator= (float);
+T     complex& operator+=(float);
+T     complex& operator-=(float);
+T     complex& operator*=(float);
+T     complex& operator/=(float);
+
+T     complex& operator=(const complex&);
+T     template complex& operator= (const complex&);
+T     template complex& operator+=(const complex&);
+T     template complex& operator-=(const complex&);
+T     template complex& operator*=(const complex&);
+T     template complex& operator/=(const complex&);
+    };
+T   template<> class complex {
+    public:
+T     typedef double value_type;
+
+T     complex(double re = 0.0, double im = 0.0);
+T     complex(const complex&);
+T     explicit complex(const complex&);
+T     double real() const;
+T     double imag() const;
+
+T     complex& operator= (double);
+T     complex& operator+=(double);
+T     complex& operator-=(double);
+T     complex& operator*=(double);
+T     complex& operator/=(double);
+
+T     complex& operator=(const complex&);
+T     template complex& operator= (const complex&);
+T     template complex& operator+=(const complex&);
+T     template complex& operator-=(const complex&);
+T     template complex& operator*=(const complex&);
+T     template complex& operator/=(const complex&);
+    };
+
+T   template<> class complex {
+    public:
+T     typedef long double value_type;
+
+T     complex(long double re = 0.0L, long double im = 0.0L);
+T     complex(const complex&);
+T     complex(const complex&);
+T     long double real() const;
+T     long double imag() const;
+
+T     complex& operator=(const complex&);
+T     complex& operator= (long double);
+T     complex& operator+=(long double);
+T     complex& operator-=(long double);
+T     complex& operator*=(long double);
+T     complex& operator/=(long double);
+
+T     template complex& operator= (const complex&);
+T     template complex& operator+=(const complex&);
+T     template complex& operator-=(const complex&);
+T     template complex& operator*=(const complex&);
+T     template complex& operator/=(const complex&);
+    };
+
+   26.3  Numeric arrays                                    [lib.numarray]
+
+   26.3.1  Header  synopsis             [lib.valarray.synopsis]
+
+T   template class valarray;         // An array of type T
+T   class slice;
+T   template class slice_array;
+T   class gslice;
+T   template class gslice_array;
+T   template class mask_array;       // a masked array
+T   template class indirect_array;   // an indirected array
+
+T   template valarray operator*
+      (const valarray&, const valarray&);
+T   template valarray operator* (const valarray&, const T&);
+T   template valarray operator* (const T&, const valarray&);
+T   template valarray operator/
+      (const valarray&, const valarray&);
+T   template valarray operator/ (const valarray&, const T&);
+T   template valarray operator/ (const T&, const valarray&);
+T   template valarray operator%
+      (const valarray&, const valarray&);
+T   template valarray operator% (const valarray&, const T&);
+T   template valarray operator% (const T&, const valarray&);
+T   template valarray operator+
+      (const valarray&, const valarray&);
+T   template valarray operator+ (const valarray&, const T&);
+T   template valarray operator+ (const T&, const valarray&);
+T   template valarray operator-
+      (const valarray&, const valarray&);
+T   template valarray operator- (const valarray&, const T&);
+T   template valarray operator- (const T&, const valarray&);
+T   template valarray operator^
+      (const valarray&, const valarray&);
+T   template valarray operator^ (const valarray&, const T&);
+T   template valarray operator^ (const T&, const valarray&);
+T   template valarray operator&
+      (const valarray&, const valarray&);
+T   template valarray operator& (const valarray&, const T&);
+T   template valarray operator& (const T&, const valarray&);
+T   template valarray operator|
+      (const valarray&, const valarray&);
+T   template valarray operator| (const valarray&, const T&);
+T   template valarray operator| (const T&, const valarray&);
+T   template valarray operator<<
+      (const valarray&, const valarray&);
+T   template valarray operator<<(const valarray&, const T&);
+T   template valarray operator<<(const T&, const valarray&);
+T   template valarray operator>>
+      (const valarray&, const valarray&);
+T   template valarray operator>>(const valarray&, const T&);
+T   template valarray operator>>(const T&, const valarray&);
+T   template valarray operator&&
+      (const valarray&, const valarray&);
+T   template valarray operator&&(const valarray&, const T&);
+T   template valarray operator&&(const T&, const valarray&);
+T   template valarray operator||
+      (const valarray&, const valarray&);
+T   template valarray operator||(const valarray&, const T&);
+T   template valarray operator||(const T&, const valarray&);
+
+T   template
+      valarray operator==(const valarray&, const valarray&);
+T   template valarray operator==(const valarray&, const T&);
+T   template valarray operator==(const T&, const valarray&);
+T   template
+      valarray operator!=(const valarray&, const valarray&);
+T   template valarray operator!=(const valarray&, const T&);
+T   template valarray operator!=(const T&, const valarray&);
+T   template
+      valarray operator< (const valarray&, const valarray&);
+T   template valarray operator< (const valarray&, const T&);
+T   template valarray operator< (const T&, const valarray&);
+T   template
+      valarray operator> (const valarray&, const valarray&);
+T   template valarray operator> (const valarray&, const T&);
+T   template valarray operator> (const T&, const valarray&);
+T   template
+      valarray operator<=(const valarray&, const valarray&);
+T   template valarray operator<=(const valarray&, const T&);
+T   template valarray operator<=(const T&, const valarray&);
+T   template
+      valarray operator>=(const valarray&, const valarray&);
+T   template valarray operator>=(const valarray&, const T&);
+T   template valarray operator>=(const T&, const valarray&);
+T   template valarray abs  (const valarray&);
+T   template valarray acos (const valarray&);
+T   template valarray asin (const valarray&);
+T   template valarray atan (const valarray&);
+T   template valarray atan2
+      (const valarray&, const valarray&);
+T   template valarray atan2(const valarray&, const T&);
+T   template valarray atan2(const T&, const valarray&);
+T   template valarray cos  (const valarray&);
+T   template valarray cosh (const valarray&);
+T   template valarray exp  (const valarray&);
+T   template valarray log  (const valarray&);
+T   template valarray log10(const valarray&);
+T   template valarray pow(const valarray&, const valarray&);
+T   template valarray pow(const valarray&, const T&);
+T   template valarray pow(const T&, const valarray&);
+T   template valarray sin  (const valarray&);
+T   template valarray sinh (const valarray&);
+T   template valarray sqrt (const valarray&);
+T   template valarray tan  (const valarray&);
+T   template valarray tanh (const valarray&);
+   }
+
+
+   26.3.2  Template class valarray                [lib.template.valarray]
+
+T   template class valarray {
+    public:
+T     typedef T value_type;
+
+      // _lib.valarray.cons_ construct/destroy:
+T     valarray();
+T     explicit valarray(size_t);
+T     valarray(const T&, size_t);
+T     valarray(const T*, size_t);
+T     valarray(const valarray&);
+T     valarray(const slice_array&);
+T     valarray(const gslice_array&);
+T     valarray(const mask_array&);
+T     valarray(const indirect_array&);
+T    ~valarray();
+
+      // _lib.valarray.assign_ assignment:
+T     valarray& operator=(const valarray&);
+T     valarray& operator=(const T&);
+T     valarray& operator=(const slice_array&);
+T     valarray& operator=(const gslice_array&);
+T     valarray& operator=(const mask_array&);
+T     valarray& operator=(const indirect_array&);
+      // _lib.valarray.access_ element access:
+T     T                 operator[](size_t) const;
+T     T&                operator[](size_t);
+      // _lib.valarray.sub_ subset operations:
+T     valarray       operator[](slice) const;
+T     slice_array    operator[](slice);
+T     valarray       operator[](const gslice&) const;
+T     gslice_array   operator[](const gslice&);
+T     valarray       operator[](const valarray&) const;
+T     mask_array     operator[](const valarray&);
+T     valarray       operator[](const valarray&) const;
+T     indirect_array operator[](const valarray&);
+      // _lib.valarray.unary_ unary operators:
+T     valarray operator+() const;
+T     valarray operator-() const;
+T     valarray operator~() const;
+T     valarray operator!() const;
+      // _lib.valarray.cassign_ computed assignment:
+T     valarray& operator*= (const T&);
+T     valarray& operator/= (const T&);
+T     valarray& operator%= (const T&);
+T     valarray& operator+= (const T&);
+T     valarray& operator-= (const T&);
+T     valarray& operator^= (const T&);
+T     valarray& operator&= (const T&);
+T     valarray& operator|= (const T&);
+T     valarray& operator<<=(const T&);
+T     valarray& operator>>=(const T&);
+T     valarray& operator*= (const valarray&);
+T     valarray& operator/= (const valarray&);
+T     valarray& operator%= (const valarray&);
+T     valarray& operator+= (const valarray&);
+T     valarray& operator-= (const valarray&);
+T     valarray& operator^= (const valarray&);
+T     valarray& operator|= (const valarray&);
+T     valarray& operator&= (const valarray&);
+T     valarray& operator<<=(const valarray&);
+T     valarray& operator>>=(const valarray&);
+      // _lib.valarray.members_ member functions:
+T     size_t size() const;
+T     T    sum() const;
+T     T    min() const;
+T     T    max() const;
+
+T     valarray shift (int) const;
+T     valarray cshift(int) const;
+T     valarray apply(T func(T)) const;
+T     valarray apply(T func(const T&)) const;
+T     void resize(size_t sz, T c = T());
+    };
+   }
+
+
+
+   26.3.4  Class slice                                  [lib.class.slice]
+
+T   class slice {
+    public:
+T     slice();
+T     slice(size_t, size_t, size_t);
+
+T     size_t start() const;
+T     size_t size() const;
+T     size_t stride() const;
+    };
+   }
+
+
+
+   26.3.5  Template class slice_array          [lib.template.slice.array]
+
+T   template  class slice_array {
+    public:
+T     typedef T value_type;
+
+T     void operator=  (const valarray&) const;
+T     void operator*= (const valarray&) const;
+T     void operator/= (const valarray&) const;
+T     void operator%= (const valarray&) const;
+T     void operator+= (const valarray&) const;
+T     void operator-= (const valarray&) const;
+T     void operator^= (const valarray&) const;
+T     void operator&= (const valarray&) const;
+T     void operator|= (const valarray&) const;
+T     void operator<<=(const valarray&) const;
+T     void operator>>=(const valarray&) const;
+T     void operator=(const T&);
+T    ~slice_array();
+    private:
+T     slice_array();
+T     slice_array(const slice_array&);
+T     slice_array& operator=(const slice_array&);
+    };
+   }
+
+
+
+   26.3.6  The gslice class                            [lib.class.gslice]
+
+T   class gslice {
+    public:
+T     gslice();
+T     gslice(size_t s, const valarray& l, const valarray& d);
+
+T     size_t           start() const;
+T     valarray size() const;
+T     valarray stride() const;
+    };
+
+
+   26.3.7  Template class gslice_array        [lib.template.gslice.array]
+
+T   template  class gslice_array {
+    public:
+T     typedef T value_type;
+
+T     void operator=  (const valarray&) const;
+T     void operator*= (const valarray&) const;
+T     void operator/= (const valarray&) const;
+T     void operator%= (const valarray&) const;
+T     void operator+= (const valarray&) const;
+T     void operator-= (const valarray&) const;
+T     void operator^= (const valarray&) const;
+T     void operator&= (const valarray&) const;
+T     void operator|= (const valarray&) const;
+T     void operator<<=(const valarray&) const;
+T     void operator>>=(const valarray&) const;
+T     void operator=(const T&);
+T    ~gslice_array();
+    private:
+T     gslice_array();
+T     gslice_array(const gslice_array&);
+T     gslice_array& operator=(const gslice_array&);
+    };
+
+
+   26.3.8  Template class mask_array            [lib.template.mask.array]
+
+T   template  class mask_array {
+    public:
+T     typedef T value_type;
+
+T     void operator=  (const valarray&) const;
+T     void operator*= (const valarray&) const;
+T     void operator/= (const valarray&) const;
+T     void operator%= (const valarray&) const;
+T     void operator+= (const valarray&) const;
+T     void operator-= (const valarray&) const;
+T     void operator^= (const valarray&) const;
+T     void operator&= (const valarray&) const;
+T     void operator|= (const valarray&) const;
+T     void operator<<=(const valarray&) const;
+T     void operator>>=(const valarray&) const;
+T     void operator=(const T&);
+T    ~mask_array();
+    private:
+T     mask_array();
+T     mask_array(const mask_array&);
+T     mask_array& operator=(const mask_array&);
+      //  remainder implementation defined
+    };
+
+
+   26.3.9  Template class                   [lib.template.indirect.array]
+       indirect_array
+
+T   template  class indirect_array {
+    public:
+T     typedef T value_type;
+
+T     void operator=  (const valarray&) const;
+T     void operator*= (const valarray&) const;
+T     void operator/= (const valarray&) const;
+T     void operator%= (const valarray&) const;
+T     void operator+= (const valarray&) const;
+T     void operator-= (const valarray&) const;
+T     void operator^= (const valarray&) const;
+T     void operator&= (const valarray&) const;
+T     void operator|= (const valarray&) const;
+T     void operator<<=(const valarray&) const;
+T     void operator>>=(const valarray&) const;
+T     void operator=(const T&);
+T    ~indirect_array();
+    private:
+T     indirect_array();
+T     indirect_array(const indirect_array&);
+T     indirect_array& operator=(const indirect_array&);
+      //  remainder implementation defined
+    };
+
+   26.4  Generalized numeric operations                 [lib.numeric.ops]
+
+   Header  synopsis
+
+T   template 
+      T accumulate(InputIterator first, InputIterator last, T init);
+
+T   template 
+      T accumulate(InputIterator first, InputIterator last, T init,
+                   BinaryOperation binary_op);
+
+T   template 
+      T inner_product(InputIterator1 first1, InputIterator1 last1,
+                      InputIterator2 first2, T init);
+
+T   template 
+      T inner_product(InputIterator1 first1, InputIterator1 last1,
+                      InputIterator2 first2, T init,
+                      BinaryOperation1 binary_op1,
+                      BinaryOperation2 binary_op2);
+
+T   template 
+      OutputIterator partial_sum(InputIterator first,
+                                 InputIterator last,
+                                 OutputIterator result);
+
+T   template 
+      OutputIterator partial_sum(InputIterator first,
+                                 InputIterator last,
+                                 OutputIterator result,
+                                 BinaryOperation binary_op);
+
+T   template 
+      OutputIterator adjacent_difference(InputIterator first,
+                                         InputIterator last,
+                                         OutputIterator result);
+
+T   template 
+      OutputIterator adjacent_difference(InputIterator first,
+                                         InputIterator last,
+                                         OutputIterator result,
+                                         BinaryOperation binary_op);
+
+
+   26.5  C Library                                           [lib.c.math]
+
+                     Table 2--Header  synopsis
+X               Macro:   HUGE_VAL
+                Functions:
+X               acos     cos        fmod    modf   tan
+X               asin     cosh       frexp   pow    tanh
+X               atan     exp        ldexp   sin
+X               atan2    fabs       log     sinh
+X               ceil     floor      log10   sqrt
+
+                    Table 3--Header  synopsis
+X                     Macros:   RAND_MAX
+X                     Types:    div_t      ldiv_t
+                      Functions:
+X                     abs       labs       srand
+X                     div       ldiv       rand
+
+X  long   abs(long);               // labs()
+X  ldiv_t div(long, long);         // ldiv()
+
+X  float abs  (float);
+X  float acos (float);
+X  float asin (float);
+X  float atan (float);
+X  float atan2(float, float);
+X  float ceil (float);
+X  float cos  (float);
+X  float cosh (float);
+X  float exp  (float);
+X  float fabs (float);
+X  float floor(float);
+X  float fmod (float, float);
+X  float frexp(float, int*);
+X  float ldexp(float, int);
+X  float log  (float);
+X  float log10(float);
+X  float modf (float, float*);
+X  float pow  (float, float);
+X  float pow  (float, int);
+X  float sin  (float);
+X  float sinh (float);
+X  float sqrt (float);
+X  float tan  (float);
+X  float tanh (float);
+
+X  double abs(double);            // fabs()
+X  double pow(double, int);
+
+X  long double abs  (long double);
+X  long double acos (long double);
+X  long double asin (long double);
+X  long double atan (long double);
+X  long double atan2(long double, long double);
+X  long double ceil (long double);
+X  long double cos  (long double);
+X  long double cosh (long double);
+X  long double exp  (long double);
+X  long double fabs (long double);
+X  long double floor(long double);
+X  long double fmod (long double, long double);
+X  long double frexp(long double, int*);
+X  long double ldexp(long double, int);
+X  long double log  (long double);
+X  long double log10(long double);
+X  long double modf (long double, long double*);
+X  long double pow  (long double, long double);
+X  long double pow  (long double, int);
+X  long double sin  (long double);
+X  long double sinh (long double);
+X  long double sqrt (long double);
+X  long double tan  (long double);
+X  long double tanh (long double);
+
+   Header  synopsis
+
+X   template class char_traits;
+X   template<> class char_traits;
+X   template<> class char_traits;
+X   template class allocator;
+X   template  >
+      class basic_ios;
+
+X   template  >
+      class basic_streambuf;
+
+X   template  >
+      class basic_istream;
+
+X   template  >
+      class basic_ostream;
+
+X   template  >
+      class basic_iostream;
+
+X   template ,
+              class Allocator = allocator >
+      class basic_stringbuf;
+
+X   template ,
+              class Allocator = allocator >
+      class basic_istringstream;
+
+X   template ,
+              class Allocator = allocator >
+      class basic_ostringstream;
+
+X   template ,
+              class Allocator = allocator >
+      class basic_stringstream;
+
+X   template  >
+      class basic_filebuf;
+
+X   template  >
+      class basic_ifstream;
+
+X   template  >
+      class basic_ofstream;
+
+X   template  >
+      class basic_fstream;
+X   template  >
+      class istreambuf_iterator;
+
+X   template  >
+      class ostreambuf_iterator;
+X   typedef basic_ios       ios;
+X   typedef basic_ios    wios;
+X   typedef basic_streambuf streambuf;
+X   typedef basic_istream   istream;
+X   typedef basic_ostream   ostream;
+X   typedef basic_iostream  iostream;
+X   typedef basic_stringbuf     stringbuf;
+X   typedef basic_istringstream istringstream;
+X   typedef basic_ostringstream ostringstream;
+X   typedef basic_stringstream  stringstream;
+X   typedef basic_filebuf  filebuf;
+X   typedef basic_ifstream ifstream;
+X   typedef basic_ofstream ofstream;
+X   typedef basic_fstream  fstream;
+X   typedef basic_streambuf wstreambuf;
+X   typedef basic_istream   wistream;
+X   typedef basic_ostream   wostream;
+X   typedef basic_iostream  wiostream;
+X   typedef basic_stringbuf     wstringbuf;
+X   typedef basic_istringstream wistringstream;
+X   typedef basic_ostringstream wostringstream;
+X   typedef basic_stringstream  wstringstream;
+
+X   typedef basic_filebuf  wfilebuf;
+X   typedef basic_ifstream wifstream;
+X   typedef basic_ofstream wofstream;
+X   typedef basic_fstream  wfstream;
+X   template  class fpos;
+X   typedef fpos::state_type>    streampos;
+X   typedef fpos::state_type> wstreampos;
+
+   27.3  Standard iostream objects                 [lib.iostream.objects]
+
+   Header  synopsis
+
+T  [must also include  and ]
+T   extern istream cin;
+T   extern ostream cout;
+T   extern ostream cerr;
+T   extern ostream clog;
+
+T   extern wistream wcin;
+T   extern wostream wcout;
+T   extern wostream wcerr;
+T   extern wostream wclog;
+
+   27.4  Iostreams base classes                      [lib.iostreams.base]
+
+   Header  synopsis
+
+   #include 
+
+T   typedef OFF_T  streamoff;
+T   typedef SZ_T streamsize;
+T   template  class fpos;
+
+    class ios_base;
+    template  >
+      class basic_ios;
+   // _lib.std.ios.manip_, manipulators:
+T   ios_base& boolalpha  (ios_base& str);
+T   ios_base& noboolalpha(ios_base& str);
+T   ios_base& showbase   (ios_base& str);
+T   ios_base& noshowbase (ios_base& str);
+T   ios_base& showpoint  (ios_base& str);
+T   ios_base& noshowpoint(ios_base& str);
+T   ios_base& showpos    (ios_base& str);
+T   ios_base& noshowpos  (ios_base& str);
+T   ios_base& skipws     (ios_base& str);
+T   ios_base& noskipws   (ios_base& str);
+T   ios_base& nouppercase(ios_base& str);
+T   ios_base& uppercase  (ios_base& str);
+M   ios_base& unitbuf    (ios_base& str);
+M   ios_base& nounitbuf  (ios_base& str);
+   // _lib.adjustfield.manip_ adjustfield:
+T   ios_base& internal   (ios_base& str);
+T   ios_base& left       (ios_base& str);
+T   ios_base& right      (ios_base& str);
+   // _lib.basefield.manip_ basefield:
+T   ios_base& dec        (ios_base& str);
+T   ios_base& hex        (ios_base& str);
+T   ios_base& oct        (ios_base& str);
+
+   // _lib.floatfield.manip_ floatfield:
+T   ios_base& fixed      (ios_base& str);
+T   ios_base& scientific (ios_base& str);
+
+
+   27.4.2  Class ios_base                                  [lib.ios.base]
+
+T   class ios_base {
+    public:
+      class failure;
+T     typedef T1 fmtflags;
+T     static const fmtflags boolalpha;
+T     static const fmtflags dec;
+T     static const fmtflags fixed;
+T     static const fmtflags hex;
+T     static const fmtflags internal;
+T     static const fmtflags left;
+T     static const fmtflags oct;
+T     static const fmtflags right;
+T     static const fmtflags scientific;
+T     static const fmtflags showbase;
+T     static const fmtflags showpoint;
+T     static const fmtflags showpos;
+T     static const fmtflags skipws;
+X     static const fmtflags unitbuf;
+T     static const fmtflags uppercase;
+T     static const fmtflags adjustfield;
+T     static const fmtflags basefield;
+T     static const fmtflags floatfield;
+
+      typedef T2 iostate;
+T     static const iostate badbit;
+T     static const iostate eofbit;
+T     static const iostate failbit;
+T     static const iostate goodbit;
+T     typedef T3 openmode;
+T     static const openmode app;
+T     static const openmode ate;
+T     static const openmode binary;
+T     static const openmode in;
+T     static const openmode out;
+T     static const openmode trunc;
+T     typedef T4 seekdir;
+T     static const seekdir beg;
+T     static const seekdir cur;
+T     static const seekdir end;
+T     class Init;
+      // _lib.fmtflags.state_ fmtflags state:
+T     fmtflags flags() const;
+T     fmtflags flags(fmtflags fmtfl);
+T     fmtflags setf(fmtflags fmtfl);
+T     fmtflags setf(fmtflags fmtfl, fmtflags mask);
+T     void unsetf(fmtflags mask);
+T     streamsize precision() const;
+T     streamsize precision(streamsize prec);
+T     streamsize width() const;
+T     streamsize width(streamsize wide);
+      // _lib.ios.base.locales_ locales:
+T     locale imbue(const locale& loc);
+T     locale getloc() const;
+      // _lib.ios.base.storage_ storage:
+T     static int xalloc();
+T     long&  iword(int index);
+T     void*& pword(int index);
+      // destructor
+T     virtual ~ios_base();
+      // _lib.ios.base.callback_ callbacks;
+T     enum event { erase_event, imbue_event, copyfmt_event };
+T     typedef void (*event_callback)(event, ios_base&, int index);
+T     void register_callback(event_call_back fn, int index);
+T     static bool sync_with_stdio(bool sync = true);
+    protected:
+T     ios_base();
+    };
+
+   27.4.2.1.1  Class ios_base::failure                 [lib.ios::failure]
+
+T   class ios_base::failure : public exception {
+    public:
+T     explicit failure(const string& msg);
+T     virtual ~failure();
+T     virtual const char* what() const throw();
+    };
+
+
+   27.4.2.1.6  Class ios_base::Init                       [lib.ios::Init]
+
+T   class ios_base::Init {
+    public:
+T     Init();
+T    ~Init();
+    };
+
+
+   27.4.3  Template class fpos                                 [lib.fpos]
+
+X   template  class fpos {
+    public:
+      // _lib.fpos.members_ Members
+T     stateT state() const;
+T     void state(stateT);
+    private;
+T     stateT st; // exposition only
+    };
+
+
+   27.4.5  Template class basic_ios                             [lib.ios]
+
+    template  >
+X   class basic_ios : public ios_base {
+    public:
+
+      // Types:
+T     typedef charT                     char_type;
+T     typedef typename traits::int_type int_type;
+T     typedef typename traits::pos_type pos_type;
+T     typedef typename traits::off_type off_type;
+T     typedef traits                    traits_type;
+T     operator void*() const
+T     bool operator!() const
+T     iostate rdstate() const;
+T     void clear(iostate state = goodbit);
+T     void setstate(iostate state);
+T     bool good() const;
+T     bool eof()  const;
+T     bool fail() const;
+T     bool bad()  const;
+T     iostate exceptions() const;
+T     void exceptions(iostate except);
+      // _lib.basic.ios.cons_ Constructor/destructor:
+T     explicit basic_ios(basic_streambuf* sb);
+T     virtual ~basic_ios();
+      // _lib.basic.ios.members_ Members:
+T     basic_ostream* tie() const;
+T     basic_ostream* tie(basic_ostream* tiestr);
+T     basic_streambuf* rdbuf() const;
+T     basic_streambuf* rdbuf(basic_streambuf* sb);
+X     basic_ios& copyfmt(const basic_ios& rhs);
+T     char_type fill() const;
+T     char_type fill(char_type ch);
+      // _lib.ios.base.locales_ locales:
+T     locale imbue(const locale& loc);
+X     char     narrow(char_type c, char dfault) const;
+X     char_type widen(char c) const;
+    protected:
+      basic_ios();
+T     void init(basic_streambuf* sb);
+   private:
+T     basic_ios(const basic_ios& );       // not defined
+T     basic_ios& operator=(const basic_ios&);     // not defined
+    };
+
+
+   27.5  Stream buffers                              [lib.stream.buffers]
+
+   Header  synopsis
+
+X   template  >
+      class basic_streambuf;
+T   typedef basic_streambuf     streambuf;
+T   typedef basic_streambuf wstreambuf;
+
+   27.5.2  Template class                                 [lib.streambuf]
+       basic_streambuf
+
+    template  >
+X   class basic_streambuf {
+    public:
+
+      // Types:
+T     typedef charT                     char_type;
+T     typedef typename traits::int_type int_type;
+T     typedef typename traits::pos_type pos_type;
+T     typedef typename traits::off_type off_type;
+T     typedef traits                    traits_type;
+T     virtual ~basic_streambuf();
+      // _lib.streambuf.locales_ locales:
+T     locale   pubimbue(const locale &loc);
+T     locale   getloc() const;
+      // _lib.streambuf.buffer_ buffer and positioning:
+T     basic_streambuf*
+               pubsetbuf(char_type* s, streamsize n);
+T     pos_type pubseekoff(off_type off, ios_base::seekdir way,
+                          ios_base::openmode which =
+                              ios_base::in | ios_base::out);
+T     pos_type pubseekpos(pos_type sp,
+                          ios_base::openmode which =
+                              ios_base::in | ios_base::out);
+T     int      pubsync();
+
+      // Get and put areas:
+      // _lib.streambuf.pub.get_ Get area:
+T     streamsize in_avail();
+T     int_type snextc();
+T     int_type sbumpc();
+T     int_type sgetc();
+T     streamsize sgetn(char_type* s, streamsize n);
+      // _lib.streambuf.pub.pback_ Putback:
+X     int_type sputbackc(char_type c);
+X     int_type sungetc();
+      // _lib.streambuf.pub.put_ Put area:
+T     int_type   sputc(char_type c);
+X     streamsize sputn(const char_type* s, streamsize n);
+    protected:
+T     basic_streambuf();
+      // _lib.streambuf.get.area_ Get area:
+T     char_type* eback() const;
+T     char_type* gptr()  const;
+T     char_type* egptr() const;
+T     void       gbump(int n);
+T     void       setg(char_type* gbeg, char_type* gnext, char_type* gend);
+      // _lib.streambuf.put.area_ Put area:
+T     char_type* pbase() const;
+T     char_type* pptr() const;
+T     char_type* epptr() const;
+T     void       pbump(int n);
+T     void       setp(char_type* pbeg, char_type* pend);
+      // _lib.streambuf.virtuals_ virtual functions:
+      // _lib.streambuf.virt.locales_ Locales:
+T     virtual void imbue(const locale &loc);
+      // _lib.streambuf.virt.buffer_ Buffer management and positioning:
+T     virtual basic_streambuf*
+                       setbuf(char_type* s, streamsize n);
+T     virtual pos_type seekoff(off_type off, ios_base::seekdir way,
+                ios_base::openmode which = ios_base::in | ios_base::out);
+T     virtual pos_type seekpos(pos_type sp,
+                ios_base::openmode which = ios_base::in | ios_base::out);
+T     virtual int      sync();
+      // _lib.streambuf.virt.get_ Get area:
+T     virtual int        showmanyc();
+T     virtual streamsize xsgetn(char_type* s, streamsize n);
+T     virtual int_type   underflow();
+T     virtual int_type   uflow();
+      // _lib.streambuf.virt.pback_ Putback:
+T     virtual int_type   pbackfail(int_type c = traits::eof());
+      // _lib.streambuf.virt.put_ Put area:
+X     virtual streamsize xsputn(const char_type* s, streamsize n);
+T     virtual int_type   overflow (int_type c = traits::eof());
+    };
+
+   27.6  Formatting and manipulators                [lib.iostream.format]
+
+   Header  synopsis
+
+T   template  >
+      class basic_istream;
+T   typedef basic_istream     istream;
+T   typedef basic_istream wistream;
+
+T   template  >
+      class basic_iostream;
+T   typedef basic_iostream    iostream;
+T   typedef basic_iostream wiostream;
+
+X   template 
+      basic_istream& ws(basic_istream& is);
+
+   Header  synopsis
+
+X   template  >
+      class basic_ostream;
+T   typedef basic_ostream     ostream;
+T   typedef basic_ostream wostream;
+
+T   template 
+      basic_ostream& endl(basic_ostream& os);
+T   template 
+      basic_ostream& ends(basic_ostream& os);
+T   template 
+      basic_ostream& flush(basic_ostream& os);
+
+   Header  synopsis
+
+      // Types T1, T2, ... are unspecified implementation types
+T     T1 resetiosflags(ios_base::fmtflags mask);
+T     T2 setiosflags  (ios_base::fmtflags mask);
+T     T3 setbase(int base);
+T     template T4 setfill(charT c);
+T     T5 setprecision(int n);
+T     T6 setw(int n);
+
+
+   27.6.1.1  Template class basic_istream                   [lib.istream]
+
+    template  >
+T   class basic_istream : virtual public basic_ios {
+    public:
+    // Types (inherited from basic_ios (_lib.ios_)):
+T     typedef charT                     char_type;
+T     typedef typename traits::int_type int_type;
+T     typedef typename traits::pos_type pos_type;
+T     typedef typename traits::off_type off_type;
+T     typedef traits                    traits_type;
+      // _lib.istream.cons_ Constructor/destructor:
+T     explicit basic_istream(basic_streambuf* sb);
+T     virtual ~basic_istream();
+      // _lib.istream::sentry_ Prefix/suffix:
+T     class sentry;
+
+      // _lib.istream.formatted_ Formatted input:
+T     basic_istream& operator>>
+          (basic_istream& (*pf)(basic_istream&))
+T     basic_istream& operator>>
+          (basic_ios& (*pf)(basic_ios&))
+T     basic_istream& operator>>
+          (ios_base& (*pf)(ios_base&))
+S     basic_istream& operator>>(bool& n);
+S     basic_istream& operator>>(short& n);
+S     basic_istream& operator>>(unsigned short& n);
+S     basic_istream& operator>>(int& n);
+S     basic_istream& operator>>(unsigned int& n);
+S     basic_istream& operator>>(long& n);
+S     basic_istream& operator>>(unsigned long& n);
+S     basic_istream& operator>>(float& f);
+S     basic_istream& operator>>(double& f);
+S     basic_istream& operator>>(long double& f);
+S     basic_istream& operator>>(void*& p);
+S     basic_istream& operator>>
+          (basic_streambuf* sb);
+      // _lib.istream.unformatted_ Unformatted input:
+T     streamsize gcount() const;
+S     int_type get();
+S     basic_istream& get(char_type& c);
+S     basic_istream& get(char_type* s, streamsize n);
+S     basic_istream& get(char_type* s, streamsize n,
+                        char_type delim);
+S     basic_istream& get(basic_streambuf& sb);
+S     basic_istream& get(basic_streambuf& sb,
+                        char_type delim);
+S     basic_istream& getline(char_type* s, streamsize n);
+S     basic_istream& getline(char_type* s, streamsize n,
+                        char_type delim);
+S     basic_istream& ignore
+          (streamsize n = 1, int_type delim = traits::eof());
+S     int_type                     peek();
+S     basic_istream& read    (char_type* s, streamsize n);
+S     streamsize                   readsome(char_type* s, streamsize n);
+S     basic_istream& putback(char_type c);
+S     basic_istream& unget();
+S     int sync();
+
+S     pos_type tellg();
+S     basic_istream& seekg(pos_type);
+S     basic_istream& seekg(off_type, ios_base::seekdir);
+    };
+
+    // _lib.istream::extractors_ character extraction templates:
+S   template
+      basic_istream& operator>>(basic_istream&,
+                                              charT&);
+S   template
+      basic_istream& operator>>(basic_istream&,
+                                             unsigned char&);
+S   template
+      basic_istream& operator>>(basic_istream&,
+                                             signed char&);
+
+S   template
+      basic_istream& operator>>(basic_istream&,
+                                              charT*);
+S   template
+      basic_istream& operator>>(basic_istream&,
+                                             unsigned char*);
+S   template
+      basic_istream& operator>>(basic_istream&,
+                                             signed char*);
+
+   27.6.1.1.2  Class basic_istream::sentry          [lib.istream::sentry]
+
+
+    template  >
+S   class basic_istream::sentry {
+      typedef traits traits_type;
+S     bool ok_; // exposition only
+     public:
+S     explicit sentry(basic_istream& is, bool noskipws = false);
+S     ~sentry();
+S     operator bool() const { return ok_; }
+     private:
+T     sentry(const sentry&); //   not defined
+T     sentry& operator=(const sentry&); //   not defined
+    };
+
+
+   27.6.1.5  Template class basic_iostream            [lib.iostreamclass]
+
+    template  >
+T   class basic_iostream :
+      public basic_istream,
+      public basic_ostream {
+    public:
+      // constructor/destructor
+T     explicit basic_iostream(basic_streambuf* sb);
+T     virtual ~basic_iostream();
+    };
+
+
+   27.6.2.1  Template class basic_ostream                   [lib.ostream]
+
+    template  >
+X   class basic_ostream : virtual public basic_ios {
+    public:
+    // Types (inherited from basic_ios (_lib.ios_)):
+T     typedef charT                     char_type;
+T     typedef typename traits::int_type int_type;
+T     typedef typename traits::pos_type pos_type;
+T     typedef typename traits::off_type off_type;
+T     typedef traits                    traits_type;
+      // _lib.ostream.cons_ Constructor/destructor:
+T     explicit basic_ostream(basic_streambuf* sb);
+T     virtual ~basic_ostream();
+      // _lib.ostream::sentry_ Prefix/suffix:
+T     class sentry;
+      // _lib.ostream.formatted_ Formatted output:
+T     basic_ostream& operator<<
+          (basic_ostream& (*pf)(basic_ostream&));
+T     basic_ostream& operator<<
+          (basic_ios& (*pf)(basic_ios&));
+T     basic_ostream& operator<<
+          (ios_base& (*pf)(ios_base&));
+T     basic_ostream& operator<<(bool n);
+T     basic_ostream& operator<<(short n);
+T     basic_ostream& operator<<(unsigned short n);
+T     basic_ostream& operator<<(int n);
+T     basic_ostream& operator<<(unsigned int n);
+T     basic_ostream& operator<<(long n);
+T     basic_ostream& operator<<(unsigned long n);
+S     basic_ostream& operator<<(float f);
+S     basic_ostream& operator<<(double f);
+S     basic_ostream& operator<<(long double f);
+T     basic_ostream& operator<<(const void* p);
+X     basic_ostream& operator<<
+          (basic_streambuf* sb);
+      // _lib.ostream.unformatted_ Unformatted output:
+T     basic_ostream& put(char_type c);
+T     basic_ostream& write(const char_type* s, streamsize n);
+X     basic_ostream& flush();
+
+      // _lib.ostream.seeks_ seeks:
+S     pos_type tellp();
+S     basic_ostream& seekp(pos_type);
+S     basic_ostream& seekp(off_type, ios_base::seekdir);
+    };
+    // _lib.ostream.inserters.character_ character inserters
+X   template
+    basic_ostream& operator<<(basic_ostream&,
+                                            charT);
+X   template
+    basic_ostream& operator<<(basic_ostream&,
+                                            char);
+    // specialization
+X   template
+      basic_ostream& operator<<(basic_ostream&,
+                                             char);
+    // signed and unsigned
+X   template
+      basic_ostream& operator<<(basic_ostream&,
+                                             signed char);
+X   template
+      basic_ostream& operator<<(basic_ostream&,
+                                             unsigned char)
+X   template
+      basic_ostream& operator<<(basic_ostream&,
+                                              const charT*);
+X   template
+      basic_ostream& operator<<(basic_ostream&,
+                                              const char*);
+    // partial specializationss
+X   template
+      basic_ostream& operator<<(basic_ostream&,
+                                             const char*);
+    //  signed and unsigned
+X   template
+      basic_ostream& operator<<(basic_ostream&,
+                                             const signed char*);
+X   template
+      basic_ostream& operator<<(basic_ostream&,
+                                             const unsigned char*);
+
+
+   27.6.2.3  Class basic_ostream::sentry            [lib.ostream::sentry]
+
+    template  >
+X   class basic_ostream::sentry {
+      bool ok_; // exposition only
+     public:
+X     explicit sentry(basic_ostream& os);
+X     ~sentry();
+X     operator bool() const { return ok_; }
+     private
+X     sentry(const sentry&); //   not defined
+X     sentry& operator=(const sentry&); //   not defined
+    };
+
+   27.7  String-based streams                        [lib.string.streams]
+
+   Header  synopsis
+
+X   template ,
+                      class Allocator = allocator >
+      class basic_stringbuf;
+
+T   typedef basic_stringbuf     stringbuf;
+T   typedef basic_stringbuf wstringbuf;
+
+    template ,
+                      class Allocator = allocator >
+X     class basic_istringstream;
+
+T   typedef basic_istringstream     istringstream;
+T   typedef basic_istringstream wistringstream;
+
+    template ,
+                      class Allocator = allocator >
+X     class basic_ostringstream;
+T   typedef basic_ostringstream     ostringstream;
+T   typedef basic_ostringstream wostringstream;
+
+    template ,
+                      class Allocator = allocator >
+X     class basic_stringstream;
+T   typedef basic_stringstream     stringstream;
+T   typedef basic_stringstream wstringstream;
+
+   27.7.1  Template class basic_stringbuf                 [lib.stringbuf]
+
+    template ,
+              class Allocator = allocator >
+X   class basic_stringbuf : public basic_streambuf {
+    public:
+T     typedef charT                     char_type;
+T     typedef typename traits::int_type int_type;
+T     typedef typename traits::pos_type pos_type;
+T     typedef typename traits::off_type off_type;
+T     typedef traits                    traits_type;
+      // _lib.stringbuf.cons_ Constructors:
+S     explicit basic_stringbuf(ios_base::openmode which
+                                = ios_base::in | ios_base::out);
+S     explicit basic_stringbuf
+          (const basic_string& str,
+           ios_base::openmode which = ios_base::in | ios_base::out);
+      // _lib.stringbuf.members_ Get and set:
+S     basic_string str() const;
+S     void               str(const basic_string& s);
+
+    protected:
+      // _lib.stringbuf.virtuals_ Overridden virtual functions:
+S     virtual int_type   underflow();
+S     virtual int_type   pbackfail(int_type c = traits::eof());
+S     virtual int_type   overflow (int_type c = traits::eof());
+S     virtual  basic_streambuf* setbuf(charT*, streamsize);
+
+S     virtual pos_type   seekoff(off_type off, ios_base::seekdir way,
+                                 ios_base::openmode which
+                                  = ios_base::in | ios_base::out);
+S     virtual pos_type   seekpos(pos_type sp,
+                                 ios_base::openmode which
+                                  = ios_base::in | ios_base::out);
+    };
+
+
+   27.7.2  Template class basic_istringstream         [lib.istringstream]
+
+    template ,
+              class Allocator = allocator >
+X   class basic_istringstream : public basic_istream {
+    public:
+T     typedef charT                     char_type;
+T     typedef typename traits::int_type int_type;
+T     typedef typename traits::pos_type pos_type;
+T     typedef typename traits::off_type off_type;
+T     typedef traits                    traits_type;
+      // _lib.istringstream.cons_ Constructors:
+S     explicit basic_istringstream(ios_base::openmode which = ios_base::in);
+S     explicit basic_istringstream(
+                         const basic_string& str,
+                         ios_base::openmode which = ios_base::in);
+
+      // _lib.istringstream.members_ Members:
+S     basic_stringbuf* rdbuf() const;
+S     basic_string str() const;
+S     void str(const basic_string& s);
+   private:
+   //  basic_stringbuf sb;   exposition only
+    };
+
+   27.7.3  Class basic_ostringstream                  [lib.ostringstream]
+
+    template ,
+              class Allocator = allocator >
+X   class basic_ostringstream : public basic_ostream {
+    public:
+
+      // Types:
+T     typedef charT            char_type;
+T     typedef typename traits::int_type int_type;
+T     typedef typename traits::pos_type pos_type;
+T     typedef typename traits::off_type off_type;
+      // _lib.ostringstream.cons_ Constructors/destructor:
+S     explicit basic_ostringstream(ios_base::openmode which = ios_base::out);
+S     explicit basic_ostringstream(
+                           const basic_string& str,
+                           ios_base::openmode which = ios_base::out);
+      // _lib.ostringstream.members_ Members:
+S     basic_stringbuf* rdbuf() const;
+S     basic_string str() const;
+S     void    str(const basic_string& s);
+    };
+
+
+   27.7.4  Template class basic_stringstream           [lib.stringstream]
+
+    template ,
+              class Allocator = allocator >
+X   class basic_stringstream
+      : public basic_iostream {
+    public:
+      // Types
+T     typedef charT                     char_type;
+T     typedef typename traits::int_type int_type;
+T     typedef typename traits::pos_type pos_type;
+T     typedef typename traits::off_type off_type;
+      // constructors/destructors
+S     explicit basic_stringstream(
+          ios_base::openmode which = ios_base::out|ios_base::in);
+S     explicit basic_stringstream(
+          const basic_string& str,
+          ios_base::openmode which = ios_base::out|ios_base::in);
+      // Members:
+S     basic_stringbuf* rdbuf() const;
+S     basic_string str() const;
+S     void str(const basic_string& str);
+    };
+
+
+
+   27.8.1  File streams                                    [lib.fstreams]
+
+
+   Header  synopsis
+
+X   template  >
+      class basic_filebuf;
+T   typedef basic_filebuf    filebuf;
+T   typedef basic_filebuf wfilebuf;
+
+X   template  >
+      class basic_ifstream;
+T   typedef basic_ifstream    ifstream;
+T   typedef basic_ifstream wifstream;
+
+X   template  >
+      class basic_ofstream;
+T   typedef basic_ofstream    ofstream;
+T   typedef basic_ofstream wofstream;
+
+X   template  >
+      class basic_fstream;
+T   typedef basic_fstream     fstream;
+T   typedef basic_fstream wfstream;
+
+   27.8.1.1  Template class basic_filebuf                   [lib.filebuf]
+
+    template  >
+X   class basic_filebuf : public basic_streambuf {
+    public:
+T     typedef charT                     char_type;
+T     typedef typename traits::int_type int_type;
+T     typedef typename traits::pos_type pos_type;
+T     typedef typename traits::off_type off_type;
+T     typedef traits                    traits_type;
+      // _lib.filebuf.cons_ Constructors/destructor:
+X     basic_filebuf();
+X     virtual ~basic_filebuf();
+       // _lib.filebuf.members_ Members:
+T     bool is_open() const;
+X     basic_filebuf* open
+          (const char* s, ios_base::openmode mode);
+X     basic_filebuf* close();
+    protected:
+      // _lib.filebuf.virtuals_ Overridden virtual functions:
+X     virtual streamsize showmanyc();
+X     virtual int_type underflow();
+X     virtual int_type uflow();
+X     virtual int_type pbackfail(int_type c = traits::eof());
+X     virtual int_type overflow (int_type c = traits::eof());
+S     virtual basic_streambuf*
+                       setbuf(char_type* s, streamsize n);
+S     virtual pos_type seekoff(off_type off, ios_base::seekdir way,
+                               ios_base::openmode which
+                                 = ios_base::in | ios_base::out);
+S     virtual pos_type seekpos(pos_type sp, ios_base::openmode which
+                                 = ios_base::in | ios_base::out);
+S     virtual int      sync();
+S     virtual void     imbue(const locale& loc);
+    };
+
+
+
+   27.8.1.5  Template class basic_ifstream                 [lib.ifstream]
+
+    template  >
+X   class basic_ifstream : public basic_istream {
+    public:
+T     typedef charT                     char_type;
+T     typedef typename traits::int_type int_type;
+T     typedef typename traits::pos_type pos_type;
+T     typedef typename traits::off_type off_type;
+T     typedef traits                    traits_type;
+      // _lib.ifstream.cons_ Constructors:
+S     basic_ifstream();
+S     explicit basic_ifstream(const char* s,
+                              ios_base::openmode mode = ios_base::in);
+      // _lib.ifstream.members_ Members:
+S     basic_filebuf* rdbuf() const;
+S     bool is_open();
+S     void open(const char* s, ios_base::openmode mode = ios_base::in);
+S     void close();
+    };
+
+
+   27.8.1.8  Template class basic_ofstream                 [lib.ofstream]
+
+    template  >
+X   class basic_ofstream : public basic_ostream {
+    public:
+T     typedef charT                     char_type;
+T     typedef typename traits::int_type int_type;
+T     typedef typename traits::pos_type pos_type;
+T     typedef typename traits::off_type off_type;
+T     typedef traits                    traits_type;
+      // _lib.ofstream.cons_ Constructors:
+X     basic_ofstream();
+X     explicit basic_ofstream(const char* s,
+                              ios_base::openmode mode
+                                = ios_base::out);
+      // _lib.ofstream.members_ Members:
+X     basic_filebuf* rdbuf() const;
+T     bool is_open();
+X     void open(const char* s, ios_base::openmode mode = ios_base::out);
+X     void close();
+    };
+
+
+   27.8.1.11  Template class basic_fstream                  [lib.fstream]
+
+    template  >
+X   class basic_fstream
+      : public basic_iostream {
+    public:
+T     typedef charT                     char_type;
+T     typedef typename traits::int_type int_type;
+T     typedef typename traits::pos_type pos_type;
+T     typedef typename traits::off_type off_type;
+T     typedef traits                    traits_type;
+      // constructors/destructor
+S     basic_fstream();
+S     explicit basic_fstream(
+          const char* s,
+          ios_base::openmode mode = ios_base::in|ios_base::out);
+
+      // Members:
+S     basic_filebuf* rdbuf() const;
+S     bool is_open();
+S     void open(
+          const char* s,
+          ios_base::openmode mode = ios_base::in|ios_base::out);
+S     void close();
+    };
+
+
+
+   27.8.2  C Library files                                  [lib.c.files]
+
+
+                    Table 13--Header  synopsis
+    Macros:
+X   BUFSIZ         L_tmpnam        SEEK_SET   TMP_MAX
+X   EOF            NULL    stderr     _IOFBF
+X   FILENAME_MAX   SEEK_CUR        stdin      _IOLBF
+X   FOPEN_MAX      SEEK_END        stdout     _IONBF
+
+X   Types:         FILE            fpos_t     size_t 
+    Functions:
+X   clearerr       fgets           fscanf     gets     rewind
+X   fclose         fopen           fseek      perror   scanf     tmpnam
+X   feof           fprintf         fsetpos    printf   setbuf    ungetc
+X   ferror         fputc           ftell      putc     setvbuf   vprintf
+X   fflush         fputs           fwrite     puts     sprintf   vfprintf
+X   fgetc          fread           getc       remove   sscanf    vsprintf
+X   fgetpos        freopen         getchar    putchar  rename    tmpfile
+
+
+
+
+   1.5  Standard C library headers                       [depr.c.headers]
+
+X                  
+                   
+                
+                  
+
+   1.6  Old iostreams members                          [depr.ios.members]
+
+   [Note: these should be #ifdef'd to permit diagnostics if used.]
+   namespace std {
+    class ios_base {
+    public:
+T     typedef T1  io_state;
+T     typedef T2 open_mode;
+T     typedef T3  seek_dir;
+T     typedef OFF_T  streamoff;
+T     typedef OFF_T  streampos;
+      // remainder unchanged
+    };
+   }
+
+   [Note: these should be #ifdef'd to permit diagnostics if used.]
+   namespace std {
+    template >
+    class basic_streambuf {
+    public:
+T     void stossc();
+      // remainder unchanged
+    };
+   }
+
+   8 An implementation may provide  the  following  member  functions  that
+   overload signatures specified in clause _lib.iostreams_:
+
+   [Note: the following overloads should be #ifdef'd to permit
+    diagnostics to be emitted, by default, if used.]
+
+    template class basic_ios {
+    public:
+M     void clear(io_state state);
+M     void setstate(io_state state);
+      // remainder unchanged
+    };
+    class ios_base {
+    public:
+M     void exceptions(io_state);
+      // remainder unchanged
+    };
+    template >
+    class basic_streambuf {
+    public:
+M     pos_type pubseekoff(off_type off, ios_base::seek_dir way,
+                ios_base::open_mode which = ios_base::in | ios_base::out);
+M     pos_type pubseekpos(pos_type sp,
+                ios_base::open_mode which = ios_base::in | ios_base::out);
+      // remainder unchanged
+    };
+    template  >
+    class basic_filebuf : public basic_streambuf {
+    public:
+M     basic_filebuf* open
+          (const char* s, ios_base::open_mode mode);
+      // remainder unchanged
+    };
+    template  >
+    class basic_ifstream : public basic_istream {
+    public:
+M     void open(const char* s, ios_base::open_mode mode = in);
+      // remainder unchanged
+    };
+    template  >
+    class basic_ofstream : public basic_ostream {
+    public:
+M     void open(const char* s, ios_base::open_mode mode = out | trunc);
+      // remainder unchanged
+    };
+   }
+
+
+
+   1.7.1  Class strstreambuf                          [depr.strstreambuf]
+
+   [Note: It should be possible to adopt these components with only
+    minor changes from the 2.8 version of the library.]
+
+M   class strstreambuf : public basic_streambuf {
+    public:
+M     explicit strstreambuf(streamsize alsize_arg = 0);
+M     strstreambuf(void* (*palloc_arg)(size_t), void (*pfree_arg)(void*));
+M     strstreambuf(char* gnext_arg, streamsize n, char* pbeg_arg = 0);
+M     strstreambuf(const char* gnext_arg, streamsize n);
+M     strstreambuf(signed char* gnext_arg, streamsize n,
+                   signed char* pbeg_arg = 0);
+M     strstreambuf(const signed char* gnext_arg, streamsize n);
+M     strstreambuf(unsigned char* gnext_arg, streamsize n,
+                   unsigned char* pbeg_arg = 0);
+M     strstreambuf(const unsigned char* gnext_arg, streamsize n);
+M     virtual ~strstreambuf();
+M     void  freeze(bool freezefl = true);
+M     char* str();
+M     int   pcount();
+    protected:
+M     virtual int_type overflow (int_type c = EOF);
+M     virtual int_type pbackfail(int_type c = EOF);
+M     virtual int_type underflow();
+M     virtual pos_type seekoff(off_type off, ios_base::seekdir way,
+                               ios_base::openmode which
+                                = ios_base::in | ios_base::out);
+M     virtual pos_type seekpos(pos_type sp, ios_base::openmode which
+                                = ios_base::in | ios_base::out);
+M     virtual streambuf* setbuf(char* s, streamsize n);
+   }
+
+   1.7.4  Class strstream                                [depr.strstream]
+
+M   class strstream
+      : public basic_iostream {
+    public:
+      // Types
+M     typedef char                                char_type;
+M     typedef typename char_traits::int_type int_type
+M     typedef typename char_traits::pos_type pos_type;
+M     typedef typename char_traits::off_type off_type;
+      // consturctors/destructor
+M     strstream();
+M     strstream(char* s, int n,
+                ios_base::openmode mode = ios_base::in|ios_base::out);
+M     virtual ~strstream();
+      // Members:
+M     strstreambuf* rdbuf() const;
+M     void freeze(bool freezefl = true);
+M     int pcount() const;
+M     char* str();
+    };
+
+
\ No newline at end of file diff --git a/libstdc++-v3/doc/html/17_intro/confdeps.dot b/libstdc++-v3/doc/html/17_intro/confdeps.dot new file mode 100644 index 00000000000..a62d28ce9dd --- /dev/null +++ b/libstdc++-v3/doc/html/17_intro/confdeps.dot @@ -0,0 +1,14 @@ +# Blatantly ripped out of the graphviz examples and modified. -pme +digraph v3conf { + size="6,6"; + node [color=lightblue2, style=filled]; + "aclocal.m4" -> "acinclude.m4"; + "configure" -> "aclocal.m4"; + "configure" -> "configure.ac"; + "configure" -> "crossconfig.m4"; + "configure" -> "linkage.m4"; + "[*/]Makefile.in" -> "Makefile.am"; + "[*/]Makefile.in" -> "configure.ac"; + "config.h.in" -> "acconfig.h"; + "config.h.in" -> "configure.ac"; +} diff --git a/libstdc++-v3/doc/html/17_intro/confdeps.png b/libstdc++-v3/doc/html/17_intro/confdeps.png new file mode 100644 index 00000000000..5075aa869b1 Binary files /dev/null and b/libstdc++-v3/doc/html/17_intro/confdeps.png differ diff --git a/libstdc++-v3/doc/html/17_intro/configury.html b/libstdc++-v3/doc/html/17_intro/configury.html new file mode 100644 index 00000000000..a35ccf23996 --- /dev/null +++ b/libstdc++-v3/doc/html/17_intro/configury.html @@ -0,0 +1,305 @@ + + + + + + + + + + libstdc++ configury + + + + + +

> open configury door

+

> look

+ +

You are in a maze of twisty passages, all +different.

+

It is dark. You are likely to be eaten by a +Canadian cross build.

+ + +
+

Notes on libstdc++ configury

+
+No problem is insoluble in all conceivable circumstances.
+-- The Cosmic AC, +The +Last Question, by Isaac Asimov +
+ + +
+

Prerequisites for configure and make hacking

+ +

As +noted previously, +certain other tools are necessary for hacking on files that control +configure (configure.ac, acinclude.m4) and +make (Makefile.am). These additional tools +(automake, and autoconf) are further +described in detail in their respective manuals. All the libraries in GCC try to stay in sync with each other in terms of versions of the auto-tools used, so please try to play nicely with the neighbors. +

+ + +
+

Overview: what comes from where

+

Dependency graph in PNG graphics format.  (Get a better browser!)

+ +

Regenerate all generated files by using the command sequence + "autoreconf" at the top level of the libstdc++ source + directory. The following will also work, but is much more complex: + "aclocal-1.7 && autoconf-2.59 && + autoheader-2.59 && automake-1.7" The version numbers + may be absent entirely or otherwise vary depending on + the current + requirements and your vendor's choice of installation names. +

+ + +
+

Storing information in non-AC files, like + configure.host

+

Until that glorious day when we can use AC_TRY_LINK with a cross-compiler, + we have to hardcode the results of what the tests would have shown if + they could be run. So we have an inflexible mess like crossconfig.m4. +

+ +

Wouldn't it be nice if we could store that information in files like + configure.host, which can be modified without needing to regenerate + anything, and can even be tweaked without really knowing how the configury + all works? Perhaps break the pieces of crossconfig.m4 out and place them in + their appropriate config/{cpu,os} directory. +

+ +

Alas, writing macros like "AC_DEFINE(HAVE_A_NICE_DAY)" can + only be done inside files which are passed through autoconf. Files which + are pure shell script can be source'd at configure time. Files which + contain autoconf macros must be processed with autoconf. We could still + try breaking the pieces out into "config/*/cross.m4" bits, for instance, + but then we would need arguments to aclocal/autoconf to properly find + them all when generating configure. I would discourage that. +

+ + +
+

Coding and commenting conventions

+

Lots of stuff got thrown out because the new autotools kindly generate + the same (or better) shell code for us. +

+ +

Most comments should use {octothorpes, shibboleths, hash marks, pound + signs, whatevers} rather than "dnl". Nearly all comments in configure.ac + should. Comments inside macros written in ancilliary .m4 files should. + About the only comments which should not use #, but use dnl + instead, are comments outside our own macros in the ancilliary + files. The difference is that # comments show up in configure + (which is most helpful for debugging), while dnl'd lines just vanish. + Since the macros in ancilliary files generate code which appears in odd + places, their "outside" comments tend to not be useful while reading + configure. +

+ +

Do not use any $target* variables, such as + $target_alias. The single exception is in configure.ac, + for automake+dejagnu's sake. +

+ +

+

+ +
+

The acinclude.m4 layout

+

The nice thing about acinclude.m4/aclocal.m4 is that macros aren't actually + performed/called/expanded/whatever here, just loaded. So we can arrange + the contents however we like. As of this writing, acinclude.m4 is arranged + as follows: +

+
+    GLIBCXX_CHECK_HOST
+    GLIBCXX_TOPREL_CONFIGURE
+    GLIBCXX_CONFIGURE
+
+

All the major variable "discovery" is done here. CXX, multilibs, etc. +

+
+    fragments included from elsewhere
+
+

Right now, "fragments" == "the math/linkage bits". +

+
+    GLIBCXX_CHECK_COMPILER_FEATURES
+    GLIBCXX_CHECK_LINKER_FEATURES
+    GLIBCXX_CHECK_WCHAR_T_SUPPORT
+
+

Next come extra compiler/linker feature tests. Wide character support + was placed here because I couldn't think of another place for it. It will + probably get broken apart like the math tests, because we're still disabling + wchars on systems which could actually support them. +

+
+    GLIBCXX_CHECK_SETRLIMIT_ancilliary
+    GLIBCXX_CHECK_SETRLIMIT
+    GLIBCXX_CHECK_S_ISREG_OR_S_IFREG
+    GLIBCXX_CHECK_POLL
+    GLIBCXX_CHECK_WRITEV
+
+    GLIBCXX_CONFIGURE_TESTSUITE
+
+

Feature tests which only get used in one place. Here, things used only in + the testsuite, plus a couple bits used in the guts of I/O. +

+
+    GLIBCXX_EXPORT_INCLUDES
+    GLIBCXX_EXPORT_FLAGS
+    GLIBCXX_EXPORT_INSTALL_INFO
+
+

Installation variables, multilibs, working with the rest of the compiler. + Many of the critical variables used in the makefiles are set here. +

+
+    GLIBGCC_ENABLE
+    GLIBCXX_ENABLE_C99
+    GLIBCXX_ENABLE_CHEADERS
+    GLIBCXX_ENABLE_CLOCALE
+    GLIBCXX_ENABLE_CONCEPT_CHECKS
+    GLIBCXX_ENABLE_CSTDIO
+    GLIBCXX_ENABLE_CXX_FLAGS
+    GLIBCXX_ENABLE_C_MBCHAR
+    GLIBCXX_ENABLE_DEBUG
+    GLIBCXX_ENABLE_DEBUG_FLAGS
+    GLIBCXX_ENABLE_LONG_LONG
+    GLIBCXX_ENABLE_PCH
+    GLIBCXX_ENABLE_SJLJ_EXCEPTIONS
+    GLIBCXX_ENABLE_SYMVERS
+    GLIBCXX_ENABLE_THREADS
+
+

All the features which can be controlled with enable/disable configure + options. Note how they're alphabetized now? Keep them like that. :-) +

+
+    AC_LC_MESSAGES
+    libtool bits
+
+

Things which we don't seem to use directly, but just has to be present + otherwise stuff magically goes wonky. +

+ + +
+

GLIBCXX_ENABLE, the --enable howto

+

All the GLIBCXX_ENABLE_FOO macros use a common helper, GLIBCXX_ENABLE. + (You don't have to use it, but it's easy.) The helper does two things + for us: +

+ +
    +
  1. Builds the call to the AC_ARG_ENABLE macro, with --help text properly + quoted and aligned. (Death to changequote!)
  2. +
  3. Checks the result against a list of allowed possibilities, and signals + a fatal error if there's no match. This means that the rest of the + GLIBCXX_ENABLE_FOO macro doesn't need to test for strange arguments, + nor do we need to protect against empty/whitespace strings with the + "x$foo" = "xbar" idiom.
  4. +
+ +

Doing these things correctly takes some extra autoconf/autom4te code, + which made our macros nearly illegible. So all the ugliness is factored + out into this one helper macro. +

+ +

Many of the macros take an argument, passed from when they are expanded + in configure.ac. The argument controls the default value of the + enable/disable switch. Previously, the arguments themselves had defaults. + Now they don't, because that's extra complexity with zero gain for us. +

+ +

There are three "overloaded signatures". When reading the descriptions + below, keep in mind that the brackets are autoconf's quotation characters, + and that they will be stripped. Examples of just about everything occur + in acinclude.m4, if you want to look. +

+ +
+    GLIBCXX_ENABLE (FEATURE, DEFAULT, HELP-ARG, HELP-STRING)
+    GLIBCXX_ENABLE (FEATURE, DEFAULT, HELP-ARG, HELP-STRING, permit a|b|c)
+    GLIBCXX_ENABLE (FEATURE, DEFAULT, HELP-ARG, HELP-STRING, SHELL-CODE-HANDLER)
+
+ +
    +
  • FEATURE is the string that follows --enable. The results of the test + (such as it is) will be in the variable $enable_FEATURE, where FEATURE + has been squashed. Example: [extra-foo], controlled by the + --enable-extra-foo option and stored in $enable_extra_foo.

  • +
  • DEFAULT is the value to store in $enable_FEATURE if the user does not + pass --enable/--disable. It should be one of the permitted values + passed later. Examples: [yes], or [bar], or + [$1] (which passes the argument given to the + GLIBCXX_ENABLE_FOO macro as the default).

    +

    For cases where we need to probe for particular models + of things, it is useful to have an undocumented "auto" value here (see + GLIBCXX_ENABLE_CLOCALE for an example).

  • +
  • HELP-ARG is any text to append to the option string itself in the + --help output. Examples: [] (i.e., an empty string, + which appends nothing), + [=BAR], which produces + --enable-extra-foo=BAR, and + [@<:@=BAR@:>@], which produces + --enable-extra-foo[=BAR]. See the difference? See what + it implies to the user?

    +

    If you're wondering what that line noise in the last example was, + that's how you embed autoconf special characters in output text. + They're called +quadrigraphs + and you should use them whenever necessary.

  • +
  • HELP-STRING is what you think it is. Do not include the "default" + text like we used to do; it will be done for you by GLIBCXX_ENABLE. + By convention, these are not full English sentences. + Example: [turn on extra foo]

  • +
+ +

With no other arguments, only the standard autoconf patterns are + allowed: "--{enable,disable}-foo[={yes,no}]" The + $enable_FEATURE variable is guaranteed to equal either "yes" or "no" + after the macro. If the user tries to pass something else, an + explanatory error message will be given, and configure will halt. +

+ +

The second signature takes a fifth argument, + "[permit a|b|c|...]" + This allows a or b or ... after the equals sign in the + option, and $enable_FEATURE is guaranteed to equal one of them after the + macro. Note that if you want to allow plain --enable/--disable with no + "=whatever", you must include "yes" and "no" in the list of permitted + values. Also note that whatever you passed as DEFAULT must be in the list. + If the user tries to pass something not on the list, a semi-explanatory + error message will be given, and configure will halt. + Example: [permit generic|gnu|ieee_1003.1-2001|yes|no|auto] +

+ +

The third signature takes a fifth argument. It is arbitrary shell code + to execute if the user actually passes the enable/disable option. (If + the user does not, the default is used. Duh.) No argument checking at + all is done in this signature. See GLIBCXX_ENABLE_CXX_FLAGS for an + example of handling, and an error message. +

+ +
+ + diff --git a/libstdc++-v3/doc/html/17_intro/contribute.html b/libstdc++-v3/doc/html/17_intro/contribute.html new file mode 100644 index 00000000000..00c749a4490 --- /dev/null +++ b/libstdc++-v3/doc/html/17_intro/contribute.html @@ -0,0 +1,135 @@ + + + + + + How to contribute + + + + + + + +

How to contribute

+

The Standard C++ Library v3, follows an open development +model. Active contributors are assigned maintainer-ship +responsibility, and given write access to the SVN repository. First +time contributors should follow this procedure: +

+ +
+

ONE : read the documentation

+ +
    +
  • Get and read the relevant sections of the C++ language +specification. Copies of the full ISO 14882 standard are available on +line via the ISO mirror site for committee members. Non-members, or +those who have not paid for the privilege of sitting on the committee +and sustained their two meeting commitment for voting rights, may get +a copy of the standard from their respective national standards +organization. In the USA, this national standards organization is ANSI +and their web-site is right + + here. +(And if you've already registered with them, clicking this link will take you to directly to the place where you can +buy the standard on-line.) +
  • + +
  • The library working group bugs, and known defects, can be obtained here: + http://www.open-std.org/jtc1/sc22/wg21 +
  • + +
  • The newsgroup dedicated to standardization issues is comp.std.c++: this FAQ for this group is quite useful and can be found here . +
  • + +
  • Peruse the GNU Coding Standards, and chuckle when you hit the part about "Using Languages Other Than C." +
  • + +
  • Be familiar with the extensions that preceded these general GNU rules. These style issues for libstdc++ can be found in the file C++STYLE, located in the root level of the distribution, or here. +
  • + +
  • And last but certainly not least, read the library-specific information found here. +
  • + +
+ + + +
+

TWO : copyright assignment

+

+Small changes can be accepted without a copyright assignment form on +file. New code and additions to the library need completed copyright +assignment form on file at the FSF. Note: your employer may be required +to fill out appropriate disclaimer forms as well. +

+ +

Historically, the libstdc++ assignment form added the following question: +

+ +[Which Belgian comic book character is better, Tintin or +Asterix, and why?] + +

+While not strictly necessary, humoring the maintainers and answering +this question would be appreciated. +

+ +

+For more information about getting a copyright assignment, please see +Legal +Matters. +

+ +

+Please contact Benjamin +Kosnik if you are confused about the assignment or have general +licensing questions. When requesting an assignment form from assign@gnu.org, please cc +the above libstdc++ maintainer so that progress can be monitored. +

+ + +
+

THREE : submitting patches

+ +

+Every patch must have several pieces of information before it can be +properly evaluated. Ideally (and to ensure the fastest possible +response from the maintainers) it would have all of these pieces: +

+ +
    + +
  • A description of the bug and how your patch fixes this bug. For + new features a description of the feature and your implementation.
  • + +
  • A ChangeLog entry as plain text; see the various ChangeLog files + for format and content. If using you are using emacs as your editor, + simply position the insertion point at the beginning of your change + and hit CX-4a to bring up the appropriate ChangeLog + entry. See--magic! Similar functionality also exists for vi.
  • + +
  • A testsuite submission or sample program that will easily and + simply show the existing error or test new functionality.
  • + +
  • The patch itself. If you are accessing the SVN repository + use "svn update; svn diff NEW"; else, use "diff -cp OLD NEW" + ... If your version of diff does not support these options, then + get the latest version of GNU diff. The SVN Tricks wiki page + has information on customising the output of svn diff.
  • + +
  • When you have all these pieces, bundle them up in a mail message +and send it to libstdc++@gcc.gnu.org. All patches and related +discussion should be sent to the libstdc++ mailing list.
  • + +
+ + + + diff --git a/libstdc++-v3/doc/html/17_intro/howto.html b/libstdc++-v3/doc/html/17_intro/howto.html new file mode 100644 index 00000000000..09f1a3c370a --- /dev/null +++ b/libstdc++-v3/doc/html/17_intro/howto.html @@ -0,0 +1,737 @@ + + + + + + + + + + + libstdc++ HOWTO: Chapter 17: Library Introduction + + + + + + + + +

Chapter 17: Library Introduction

+ +

Chapter 17 is actually a list of definitions and descriptions used + in the following chapters of the Standard when describing the actual + library. Here, we use "Introduction" as an introduction + to the GNU implementation of the ISO Standard C++ Library. +

+ + + +
+

Contents

+ + +
+ + + +

Header Files

+

The C++ standard specifies the entire set of header files that must be + available to all hosted implementations. Actually, the word + "files" is a misnomer, since the contents of the headers + don't necessarily have to be in any kind of external file. The + only rule is that when one #include's a header, the + contents of that header become + available, no matter how. +

+ +

That said, in practice files are used.

+ +

There are two main types of include files: header files related to +a specific version of the ISO C++ standard (called Standard Headers), +and all others (TR1, C++ ABI, and Extensions).

+ +

Two dialects of standard headers are supported, corresponding to +the 1998 standard as updated for 2003, and the draft of the upcoming +200x standard. +

+ +

C++98/03 include files. These are available in the default compilation mode, ie -std=c++98 or -std=gnu++98. +

+ +
+ + + + + + + +
C++98 Library Headers
<algorithm><iomanip><list><ostream><streambuf>
<bitset><ios><locale><queue><string>
<complex><iosfwd><map><set><typeinfo>
<deque><iostream><memory><sstream><utility>
<exception><istream><new><stack><valarray>
<fstream><iterator><numeric><stdexcept><vector>
<functional><limits>
+ +

+ +
+ + + + +
C++98 Headers for C Library Facilities
<cassert><ciso646><csetjmp><cstdio><ctime>
<cctype><climits><csignal><cstdlib><cwchar>
<cerrno><clocale><cstdarg><cstring><cwctype>
<cfloat><cmath><cstddef>
+ +

C++0x include files. These are only available in C++0x compilation mode, ie -std=c++0x or -std=gnu++0x. +

+ +
+ + + + + + + + +
C++0x Library Headers
<algorithm><iomanip><locale><regex><tuple>
<array><ios><map><set><typeinfo>
<bitset><iosfwd><memory><sstream><type_traits>
<complex><iostream><new><stack><unordered_map>
<deque><istream><numeric><stdexcept><unordered_set>
<exception><iterator><ostream><streambuf><utility>
<fstream><limits><queue><string><valarray>
<functional><list><random><system_error><vector>
+ +

+ +
+ + + + + +
C++0x Headers for C Library Facilities
<cassert><cfloat><cmath><cstddef><ctgmath>
<ccomplex><cinttypes><csetjmp><cstdint><ctime>
<cctype><ciso646><csignal><cstdio><cuchar>
<cerrno><climits><cstdarg><cstdlib><cwchar>
<cfenv><clocale><cstdbool><cstring><cwctype>
+ + +

In addition, TR1 includes as: +

+ +
+ + + +
TR1 Library Headers
<tr1/array><tr1/memory><tr1/regex><tr1/type_traits><tr1/unordered_set>
<tr1/complex><tr1/random><tr1/tuple><tr1/unordered_map><tr1/utility>
<tr1/functional>
+ +

+ +
+ + + +
TR1 Headers for C Library Facilities
<tr1/cmath><tr1/cfloat><tr1/cstdarg><tr1/cstdio><tr1/ctime>
<tr1/ccomplex><tr1/cinttypes><tr1/cstdbool><tr1/cstdlib><tr1/cwchar>
<tr1/cfenv><tr1/climits><tr1/cstdint><tr1/ctgmath><tr1/cwctype>
+ +

Also included are files for the C++ ABI interface: +

+
+ +
C++ ABI Headers
<cxxabi.h><cxxabi_forced.h>
+ +

And a large variety of extensions. +

+ +
+ + + + + + +
Extension Headers
<ext/algorithm><ext/debug_allocator.h><ext/mt_allocator.h><ext/pod_char_traits.h><ext/stdio_sync_filebuf.h>
<ext/array_allocator.h><ext/enc_filebuf.h><ext/new_allocator.h><ext/pool_allocator.h><ext/throw_allocator.h>
<ext/atomicity.h><ext/functional><ext/numeric><ext/rb_tree><ext/typelist.h>
<ext/bitmap_allocator.h><ext/iterator><ext/numeric_traits.h><ext/rope><ext/type_traits.h>
<ext/codecvt_specializations.h><ext/malloc_allocator.h><ext/pb_ds/assoc_container.h><ext/slist><ext/vstring.h>
<ext/concurrence.h><ext/memory><ext/pb_ds/priority_queue.h><ext/stdio_filebuf.h>
+ +

+ +
+ + +
Extension Debug Headers
<debug/bitset><debug/list><debug/set><debug/unordered_map><debug/vector>
<debug/deque><debug/map><debug/string><debug/unordered_set>
+ +

+ +
+ +
Extension Parallel Headers
<parallel/algorithm><parallel/numeric>
+ +
+

Recipes for mixing headers

+ +

A few simple rules. +

+ +

First, mixing different dialects of the standard headers is not +possible. It's an all-or-nothing affair. Thus, code like +

+ +
+#include <array>
+#include <functional>
+
+ +

Implies C++0x mode. To use the entities in <array>, the C++0x +compilation mode must be used, which implies the C++0x functionality +(and deprecations) in <functional> will be present. +

+ +

Second, the other headers can be included with either dialect of +the standard headers, although features and types specific to C++0x +are still only enabled when in C++0x compilation mode. So, to use +rvalue references with __gnu_cxx::vstring, or to use the +debug-mode versions of std::unordered_map, one must use +the std=gnu++0x compiler flag. (Or std=c++0x, of course.) +

+ +

A special case of the second rule is the mixing of TR1 and C++0x +facilities. It is possible (although not especially prudent) to +include both the TR1 version and the C++0x version of header in the +same translation unit: +

+ +
+#include <tr1/type_traits>
+#include <type_traits>
+
+ +

Several parts of C++0x diverge quite substantially from TR1 predecessors. +

+ + +
+

The C Headers and namespace std

+

+ The standard specifies that if one includes the C-style header + (<math.h> in this case), the symbols will be available + in the global namespace and perhaps in + namespace std:: (but this is no longer a firm + requirement.) One the other hand, including the C++-style + header (<cmath>) guarantees that the entities will be + found in namespace std and perhaps in the global namespace. +

+ +

+Usage of C++-style headers is recommended, as then +C-linkage names can be disambiguated by explicit qualification, such +as by std::abort. In addition, the C++-style headers can +use function overloading to provide a simpler interface to certain +families of C-functions. For instance in <cmath>, the +function std::sin has overloads for all the builtin +floating-point types. This means that std::sin can be +used uniformly, instead of a combination +of std::sinf, std::sin, +and std::sinl. +

+ +
+

Precompiled Headers

+ +

There are three base header files that are provided. They can be +used to precompile the standard headers and extensions into binary +files that may the be used to speed compiles that use these headers. +

+ + +
    +
  • stdc++.h +

    Includes all standard headers. Actual content varies depending on +language dialect. +

    +
  • + +
  • stdtr1c++.h +

    Includes all of <stdc++.h>, and adds all the TR1 headers. +

    +
  • + +
  • extc++.h +

    Includes all of <stdtr1c++.h>, and adds all the Extension headers. +

  • +
+ +

How to construct a .gch file from one of these base header files.

+ +

First, find the include directory for the compiler. One way to do +this is:

+ +
+g++ -v hello.cc
+
+#include <...> search starts here:
+ /mnt/share/bld/H-x86-gcc.20071201/include/c++/4.3.0
+...
+End of search list.
+
+ + +

Then, create a precompiled header file with the same flags that +will be used to compile other projects.

+ +
+g++ -Winvalid-pch -x c++-header -g -O2 -o ./stdc++.h.gch /mnt/share/bld/H-x86-gcc.20071201/include/c++/4.3.0/x86_64-unknown-linux-gnu/bits/stdc++.h
+
+ +

The resulting file will be quite large: the current size is around +thirty megabytes.

+ +

How to use the resulting file.

+ +
+g++ -I. -include stdc++.h  -H -g -O2 hello.cc 
+
+ +

Verification that the PCH file is being used is easy:

+ +
+g++ -Winvalid-pch -I. -include stdc++.h -H -g -O2 hello.cc -o test.exe
+! ./stdc++.h.gch
+. /mnt/share/bld/H-x86-gcc.20071201/include/c++/4.3.0/iostream
+. /mnt/share/bld/H-x86-gcc.20071201include/c++/4.3.0/string
+
+ +

The exclamation point to the left of the stdc++.h.gch listing means that the generated PCH file was used, and thus the

+

+ +

Detailed information about creating precompiled header files can be found in the GCC documentation. +

+ + +
+

Namespaces

+ + +

There are three main namespaces. +

+ +
    +
  • std +

    The ISO C++ standards specify that "all library entities are defined +within namespace std." This includes namepaces nested +within namespace std, such as namespace +std::tr1. +

    +
  • +
  • abi +

    Specified by the C++ ABI. This ABI specifies a number of type and +function APIs supplemental to those required by the ISO C++ Standard, +but necessary for interoperability. +

    +
  • + +
  • __gnu_ +

    Indicating one of several GNU extensions. Choices +include __gnu_cxx, __gnu_debug, __gnu_parallel, +and __gnu_pbds. +

  • +
+ +

A complete list of implementation namespaces (including namespace contents) is available in the generated source documentation. +

+ + +
+

Namespace std::

+ +

+ One standard requirement is that the library components are defined + in namespace std::. Thus, in order to use these types or + functions, one must do one of two things: +

+ +
  • put a kind of +using-declaration in your source +(either using namespace std; or i.e. using +std::string;) This approach works well for individual source files, but +should not be used in a global context, like header files. +

  • use a fully +qualified name for each library symbol +(i.e. std::string, std::cout) Always can be +used, and usually enhanced, by strategic use of typedefs. (In the +cases where the qualified verbiage becomes unwieldy.) +

  • +
+ +
+

Using namespace composition

+ +

+Best practice in programming suggests sequestering new data or +functionality in a sanely-named, unique namespace whenever +possible. This is considered an advantage over dumping everything in +the global namespace, as then name look-up can be explicitly enabled or +disabled as above, symbols are consistently mangled without repetitive +naming prefixes or macros, etc. +

+ +

For instance, consider a project that defines most of its classes in namespace gtk. It is possible to + adapt namespace gtk to namespace std by using a C++-feature called + namespace composition. This is what happens if + a using-declaration is put into a + namespace-definition: the imported symbol(s) gets imported into the + currently active namespace(s). For example: +

+
+namespace gtk 
+{
+  using std::string;
+  using std::tr1::array;
+
+  class Window { ... };
+}
+
+

+ In this example, std::string gets imported into + namespace gtk. The result is that use of + std::string inside namespace gtk can just use string, without the explicit qualification. + As an added bonus, + std::string does not get imported into + the global namespace. Additionally, a more elaborate arrangement can be made for backwards compatibility and portability, whereby the + using-declarations can wrapped in macros that + are set based on autoconf-tests to either "" or i.e. using + std::string; (depending on whether the system has + libstdc++ in std:: or not). (ideas from + <llewelly@dbritsch.dsl.xmission.com>, Karl Nelson + <kenelson@ece.ucdavis.edu>) +

+ +
+

Macros for libstdc++

+ +

All pre-processor switches and configurations are all gathered + in the file c++config.h, which is generated during + the libstdc++ configuration and build process, and included by + files part of the public libstdc++ API. Most of these macros + should not be used by consumers of libstdc++, and are reserved + for internal implementation use. These macros cannot be + redefined. However, a select handful of these macro + control libstdc++ extensions and extra features, or provide + versioning information for the API, and are able to be used. +

+ +

All library macros begin with _GLIBCXX_ (except for + versions 3.1.x to 3.3.x, which use _GLIBCPP_). +

+ +

Below is the macro which users may check for library version + information.

+ +
+
__GLIBCXX__
The current version of + libstdc++ in compressed ISO date format, form of an unsigned + long. For details on the value of this particular macro for a + particular release, please consult this + document.
+ +

Below are the macros which users may change with #define/#undef or + with -D/-U compiler flags. The default state of the symbol is + listed.

+ +

"Configurable" (or "Not configurable") means + that the symbol is initially chosen (or not) based on + --enable/--disable options at library build and configure time + (documented here), with the + various --enable/--disable choices being translated to + #define/#undef). +

+ +

"ABI" means that changing from the default value may + mean changing the ABI of compiled code. In other words, these + choices control code which has already been compiled (i.e., in a + binary such as libstdc++.a/.so). If you explicitly #define or + #undef these macros, the headers may see different code + paths, but the libraries which you link against will not. + Experimenting with different values with the expectation of + consistent linkage requires changing the config headers before + building/installing the library. +

+ +
+
_GLIBCXX_DEPRECATED
+
Defined by default. Not configurable. ABI-changing. Turning this off + removes older ARM-style iostreams code, and other anachronisms + from the API. This macro is dependent on the version of the + standard being tracked, and as a result may give different results for + -std=c++98 and -std=c++0x. This may + be useful in updating old C++ code which no longer meet the + requirements of the language, or for checking current code + against new language standards.
+ +
_GLIBCXX_FORCE_NEW
Undefined by + default. When defined, memory allocation and allocators controlled + by libstdc++ call operator new/delete without caching and + pooling. Configurable via + --enable-libstdcxx-allocator. ABI-changing. +
+ + +
_GLIBCXX_CONCEPT_CHECKS
Undefined by + default. Configurable via --enable-concept-checks. + When defined, performs compile-time checking on certain template + instantiations to detect violations of the requirements of the + standard. This is described in more detail here.
+ +
_GLIBCXX_DEBUG
+
Undefined by default. When defined, compiles + user code using the libstdc++ debug + mode. +
+
_GLIBCXX_DEBUG_PEDANTIC
+
Undefined by default. When defined while + compiling with the libstdc++ debug + mode, makes the debug mode extremely picky by making the use + of libstdc++ extensions and libstdc++-specific behavior into + errors. +
+
_GLIBCXX_PARALLEL
+
Undefined by default. When defined, compiles + user code using the libstdc++ parallel + mode. +
+
+ +
+

The Standard C++ library and multithreading

+

This section discusses issues surrounding the proper compilation + of multithreaded applications which use the Standard C++ + library. This information is GCC-specific since the C++ + standard does not address matters of multithreaded applications. + Unless explicitly prefaced, all information in this section is + relevant to the GCC 3.0 release and all later releases. +

+

Earlier GCC releases had a somewhat different approach to + threading configuration and proper compilation. Before GCC 3.0, + configuration of the threading model was dictated by compiler + command-line options and macros (both of which were somewhat + thread-implementation and port-specific). There were no + guarantees related to being able to link code compiled with one + set of options and macro setting with another set. For GCC 3.0, + configuration of the threading model used with libraries and + user-code is performed when GCC is configured and built using + the --enable-threads and --disable-threads options. The ABI is + stable for symbol name-mangling and limited functional + compatibility exists between code compiled under different + threading models. +

+

All normal disclaimers aside, multithreaded C++ application are + only supported when libstdc++ and all user code was built with + compilers which report (via gcc/g++ -v ) the same thread + model and that model is not single. As long as your + final application is actually single-threaded, then it should be + safe to mix user code built with a thread model of + single with a libstdc++ and other C++ libraries built + with another thread model useful on the platform. Other mixes + may or may not work but are not considered supported. (Thus, if + you distribute a shared C++ library in binary form only, it may + be best to compile it with a GCC configured with + --enable-threads for maximal interchangeability and usefulness + with a user population that may have built GCC with either + --enable-threads or --disable-threads.) +

+

When you link a multithreaded application, you will probably + need to add a library or flag to g++. This is a very + non-standardized area of GCC across ports. Some ports support a + special flag (the spelling isn't even standardized yet) to add + all required macros to a compilation (if any such flags are + required then you must provide the flag for all compilations not + just linking) and link-library additions and/or replacements at + link time. The documentation is weak. Here is a quick summary + to display how ad hoc this is: On Solaris, both -pthreads and + -threads (with subtly different meanings) are honored. On OSF, + -pthread and -threads (with subtly different meanings) are + honored. On Linux/i386, -pthread is honored. On FreeBSD, + -pthread is honored. Some other ports use other switches. + AFAIK, none of this is properly documented anywhere other than + in ``gcc -dumpspecs'' (look at lib and cpp entries). +

+

See FAQ (general overview), 23 (containers), and 27 (I/O) for more information. +

+

The libstdc++ library has been designed so that it can be used in + multithreaded applications (with libstdc++-v2 this was + only true of the STL parts.) The first problem is + finding a fast method of implementation portable to all + platforms. Due to historical reasons, some of the library is + written against per-CPU-architecture spinlocks and other parts + against the gthr.h abstraction layer which is provided by gcc. + A minor problem that pops up every so often is different + interpretations of what "thread-safe" means for a + library (not a general program). We currently use the same + definition that SGI uses for their STL subset. However, the + exception for read-only containers only applies to the STL + components. This definition is widely-used and something similar + will be used in the next version of the C++ standard library. +

+

Here is a small link farm to threads (no pun) in the mail archives + that discuss the threading problem. Each link is to the first + relevant message in the thread; from there you can use + "Thread Next" to move down the thread. This farm is in + latest-to-oldest order. +

+
    +
  • Our threading expert Loren gives a breakdown of + the + six situations involving threads for the 3.0 release series.
  • +
  • + This message inspired a recent updating of issues with threading + and the SGI STL library. It also contains some example + POSIX-multithreaded STL code.
  • +
+

(A large selection of links to older messages has been removed; many + of the messages from 1999 were lost in a disk crash, and the few + people with access to the backup tapes have been too swamped with work + to restore them. Many of the points have been superseded anyhow.) +

+

This section will be updated as new and interesting issues come + to light. +

+

Return to top of page or + to the FAQ. +

+ +
+

Behavior specific to libstdc++

+

The ISO standard defines the following phrase: +

+
+
[1.3.5] implementation-defined behavior
+
behavior, for a well-formed program construct and correct data, that + depends on the implementation and that each implementation + shall document. +
+
+

We do so here, for the C++ library only. Behavior of the compiler, + linker, runtime loader, and other elements of "the + implementation" are documented elsewhere. Everything listed in + Annex B, Implementation Qualities, are also part of the compiler, not + the library. +

+

For each entry, we give the section number of the standard, when + applicable. This list is probably incomplet and inkorrekt. +

+

[1.9]/11 #3 If isatty(3) is true, then + interactive stream support is implied. +

+

[17.4.4.5] Non-reentrant functions are probably best + discussed in the various sections on multithreading (see above). +

+ +

[18.1]/4 The type of NULL is described + here. +

+

[18.3]/8 Even though it's listed in the library + sections, libstdc++ has zero control over what the cleanup code hands + back to the runtime loader. Talk to the compiler people. :-) +

+

[18.4.2.1]/5 (bad_alloc),
+ [18.5.2]/5 (bad_cast),
+ [18.5.3]/5 (bad_typeid),
+ [18.6.1]/8 (exception),
+ [18.6.2.1]/5 (bad_exception): The what() + member function of class std::exception, and these other + classes publicly derived from it, simply returns the name of the + class. But they are the mangled names; you will need to call + c++filt and pass the names as command-line parameters to + demangle them, or call a + runtime demangler function. + (The classes in <stdexcept> have constructors which + require an argument to use later for what() calls, so the + problem of what()'s value does not arise in most + user-defined exceptions.) +

+

[18.5.1]/7 The return value of + std::type_info::name() is the mangled type name (see the + previous entry for more). +

+

[20.1.5]/5 "Implementors are encouraged to + supply libraries that can accept allocators that encapsulate more + general memory models and that support non-equal instances. In such + implementations, any requirements imposed on allocators by containers + beyond those requirements that appear in Table 32, and the semantics + of containers and algorithms when allocator instances compare + non-equal, are implementation-defined." As yet we don't + have any allocators which compare non-equal, so we can't describe how + they behave. +

+

[21.1.3.1]/3,4,
+ [21.1.3.2]/2,
+ [23.*]'s foo::iterator,
+ [27.*]'s foo::*_type,
+ others... + Nope, these types are called implementation-defined because you + shouldn't be taking advantage of their underlying types. Listing them + here would defeat the purpose. :-) +

+

[21.1.3.1]/5 I don't really know about the mbstate_t + stuff... see the chapter 22 notes + for what does exist. +

+

[22.*] Anything and everything we have on locale + implementation will be described + over here. +

+

[26.2.8]/9 I have no idea what + complex<T>'s pow(0,0) returns. +

+

[27.4.2.4]/2 Calling + std::ios_base::sync_with_stdio after I/O has already been + performed on the standard stream objects will + flush the buffers, and + destroy and recreate the underlying buffer instances. Whether or not + the previously-written I/O is destroyed in this process depends mostly + on the --enable-libio choice: for stdio, if the written data is + already in the stdio buffer, the data may be completely safe! +

+

[27.6.1.1.2],
+ [27.6.2.3] The I/O sentry ctor and dtor can perform + additional work than the minimum required. We are not currently taking + advantage of this yet. +

+

[27.7.1.3]/16,
+ [27.8.1.4]/10 + The effects of pubsetbuf/setbuf are described + in this chapter. +

+

[27.8.1.4]/16 Calling fstream::sync when + a get area exists will... whatever fflush() does, I think. +

+

Return to top of page or + to the FAQ. +

+ + +

Return to top of page or + to the FAQ. +

+ + + + + +
+

+See license.html for copying conditions. +Comments and suggestions are welcome, and may be sent to +the libstdc++ mailing list. +

+ + + + + + diff --git a/libstdc++-v3/doc/html/17_intro/license.html b/libstdc++-v3/doc/html/17_intro/license.html new file mode 100644 index 00000000000..294a00892d3 --- /dev/null +++ b/libstdc++-v3/doc/html/17_intro/license.html @@ -0,0 +1,119 @@ + + + + + + + + + + + libstdc++ copying + + + + + +

Licenses for the Library

+ +

There are two licenses affecting GNU libstdc++: one for the code, and + one for the documentation. Here we will describe both of them, and try + to answer some of the widespread questions. If you have more questions, + ask the FSF or the + gcc mailing list; the person + writing this page is a programmer, not a lawyer. +

+ +
+ +

The Code: Runtime GPL

+ +

The source code of libstdc++ is distributed under version 2 of the + GNU General Public License, with the so-called + "runtime exception," as follows (or see any header or + implementation file): +

+
+   As a special exception, you may use this file as part of a free software
+   library without restriction.  Specifically, if other files instantiate
+   templates or use macros or inline functions from this file, or you compile
+   this file and link it with other files to produce an executable, this
+   file does not by itself cause the resulting executable to be covered by
+   the GNU General Public License.  This exception does not however
+   invalidate any other reasons why the executable file might be covered by
+   the GNU General Public License.
+
+ +

Hopefully that text is self-explanatory. If it isn't, you need to speak + to your lawyer, or the Free Software Foundation. +

+ + +

Q: So any program which uses libstdc++ falls under the GPL? +
A: No. The special exception permits use of the + library in proprietary applications. +

+ +

Q: How is that different from the GNU {Lesser,Library} + GPL? + +
A: The LGPL requires that users be able to replace the LGPL code with a + modified version; this is trivial if the library in question is a C + shared library. But there's no way to make that work with C++, where + much of the library consists of inline functions and templates, which + are expanded inside the code that uses the library. So to allow people + to replace the library code, someone using the library would have to + distribute their own source, rendering the LGPL equivalent to the GPL. +

+ +

Q: I see. So, what restrictions are there on + programs that use the library? +
A: None. We encourage such programs to be released as open source, + but we won't punish you or sue you if you choose otherwise. +

+ +
+ +

The Docs: GPL, FDL

+ +

The documentation shipped with the library and made available over the + web, excluding the pages generated from source comments, are copyrighted + by the Free Software Foundation, and placed under + the GNU Free Documentation License version 1.1. + There are no Front-Cover Texts, no Back-Cover Texts, and + + no Invariant Sections. +

+ +

For documentation generated by doxygen or other automated tools +via processing source code comments and markup, the original source +code license applies to the generated files. Thus, the doxygen +documents are licensed GPL. +

+ +

If you plan on making copies of the documentation, please let us know. + We can probably offer suggestions. +

+ + + + +
+

+Comments and suggestions about this page are welcome, and may be sent to +the libstdc++ mailing list. +Comments or questions about the licenses themselves are also welcome, and +should be directed to the GCC list as descibed above. +

+ + + + + + diff --git a/libstdc++-v3/doc/html/17_intro/porting.html b/libstdc++-v3/doc/html/17_intro/porting.html new file mode 100644 index 00000000000..2a561a9abc3 --- /dev/null +++ b/libstdc++-v3/doc/html/17_intro/porting.html @@ -0,0 +1,992 @@ + + +Porting libstdc++ + + + + + + + + +

Porting libstdc++

+
+


+Node: Top, +Next: , +Up: (dir) +
+
+ +

Porting libstdc++

+ +

This document explains how to port libstdc++ (the GNU C++ library) to +a new target. + +

In order to make the GNU C++ library (libstdc++) work with a new +target, you must edit some configuration files and provide some new +header files. Unless this is done, libstdc++ will use generic +settings which may not be correct for your target; even if they are +correct, they will likely be inefficient. + +

Before you get started, make sure that you have a working C library on +your target. The C library need not precisely comply with any +particular standard, but should generally conform to the requirements +imposed by the ANSI/ISO standard. + +

In addition, you should try to verify that the C++ compiler generally +works. It is difficult to test the C++ compiler without a working +library, but you should at least try some minimal test cases. + +

(Note that what we think of as a "target," the library refers to as +a "host." The comment at the top of configure.ac explains why.) + +

Here are the primary steps required to port the library: + +

+ +
+


+Node: Operating system, +Next: , +Previous: Top, +Up: Top +
+
+ +

Operating system

+ +

If you are porting to a new operating system (as opposed to a new chip +using an existing operating system), you will need to create a new +directory in the config/os hierarchy. For example, the IRIX +configuration files are all in config/os/irix. There is no set +way to organize the OS configuration directory. For example, +config/os/solaris/solaris-2.6 and +config/os/solaris/solaris-2.7 are used as configuration +directories for these two versions of Solaris. On the other hand, both +Solaris 2.7 and Solaris 2.8 use the config/os/solaris/solaris-2.7 +directory. The important information is that there needs to be a +directory under config/os to store the files for your operating +system. + +

You might have to change the configure.host file to ensure that +your new directory is activated. Look for the switch statement that sets +os_include_dir, and add a pattern to handle your operating system +if the default will not suffice. The switch statement switches on only +the OS portion of the standard target triplet; e.g., the solaris2.8 +in sparc-sun-solaris2.8. If the new directory is named after the +OS portion of the triplet (the default), then nothing needs to be changed. + +

The first file to create in this directory, should be called +os_defines.h. This file contains basic macro definitions +that are required to allow the C++ library to work with your C library. + +

Several libstdc++ source files unconditionally define the macro +_POSIX_SOURCE. On many systems, defining this macro causes +large portions of the C library header files to be eliminated +at preprocessing time. Therefore, you may have to #undef this +macro, or define other macros (like _LARGEFILE_SOURCE or +__EXTENSIONS__). You won't know what macros to define or +undefine at this point; you'll have to try compiling the library and +seeing what goes wrong. If you see errors about calling functions +that have not been declared, look in your C library headers to see if +the functions are declared there, and then figure out what macros you +need to define. You will need to add them to the +CPLUSPLUS_CPP_SPEC macro in the GCC configuration file for your +target. It will not work to simply define these macros in +os_defines.h. + +

At this time, there are a few libstdc++-specific macros which may be +defined: + +

_GLIBCXX_USE_C99_CHECK may be defined to 1 to check C99 +function declarations (which are not covered by specialization below) +found in system headers against versions found in the library headers +derived from the standard. + +

_GLIBCXX_USE_C99_DYNAMIC may be defined to an expression that +yields 0 if and only if the system headers are exposing proper support +for C99 functions (which are not covered by specialization below). If +defined, it must be 0 while bootstrapping the compiler/rebuilding the +library. + +

_GLIBCXX_USE_C99_LONG_LONG_CHECK may be defined to 1 to check +the set of C99 long long function declarations found in system headers +against versions found in the library headers derived from the +standard. + +

_GLIBCXX_USE_C99_LONG_LONG_DYNAMIC may be defined to an +expression that yields 0 if and only if the system headers are +exposing proper support for the set of C99 long long functions. If +defined, it must be 0 while bootstrapping the compiler/rebuilding the +library. + +

_GLIBCXX_USE_C99_FP_MACROS_DYNAMIC may be defined to an +expression that yields 0 if and only if the system headers +are exposing proper support for the related set of macros. If defined, +it must be 0 while bootstrapping the compiler/rebuilding the library. + +

_GLIBCXX_USE_C99_FLOAT_TRANSCENDENTALS_CHECK may be defined +to 1 to check the related set of function declarations found in system +headers against versions found in the library headers derived from +the standard. + +

_GLIBCXX_USE_C99_FLOAT_TRANSCENDENTALS_DYNAMIC may be defined +to an expression that yields 0 if and only if the system headers +are exposing proper support for the related set of functions. If defined, +it must be 0 while bootstrapping the compiler/rebuilding the library. + +

Finally, you should bracket the entire file in an include-guard, like +this: + +

     #ifndef _GLIBCXX_OS_DEFINES
+     #define _GLIBCXX_OS_DEFINES
+     ...
+     #endif
+     
+ +

We recommend copying an existing os_defines.h to use as a +starting point. + +

+


+Node: CPU, +Next: , +Previous: Operating system, +Up: Top +
+
+ +

CPU

+ +

If you are porting to a new chip (as opposed to a new operating system +running on an existing chip), you will need to create a new directory in the +config/cpu hierarchy. Much like the Operating system setup, +there are no strict rules on how to organize the CPU configuration +directory, but careful naming choices will allow the configury to find your +setup files without explicit help. + +

We recommend that for a target triplet <CPU>-<vendor>-<OS>, you +name your configuration directory config/cpu/<CPU>. If you do this, +the configury will find the directory by itself. Otherwise you will need to +edit the configure.host file and, in the switch statement that sets +cpu_include_dir, add a pattern to handle your chip. + +

Note that some chip families share a single configuration directory, for +example, alpha, alphaev5, and alphaev6 all use the +config/cpu/alpha directory, and there is an entry in the +configure.host switch statement to handle this. + +

The cpu_include_dir sets default locations for the files controlling +Thread safety and Numeric limits, if the defaults are not +appropriate for your chip. + +

+


+Node: Character types, +Next: , +Previous: CPU, +Up: Top +
+
+ +

Character types

+ +

The library requires that you provide three header files to implement +character classification, analogous to that provided by the C libraries +<ctype.h> header. You can model these on the files provided in +config/os/generic. However, these files will almost +certainly need some modification. + +

The first file to write is ctype_base.h. This file provides +some very basic information about character classification. The libstdc++ +library assumes that your C library implements <ctype.h> by using +a table (indexed by character code) containing integers, where each of +these integers is a bit-mask indicating whether the character is +upper-case, lower-case, alphabetic, etc. The ctype_base.h +file gives the type of the integer, and the values of the various bit +masks. You will have to peer at your own <ctype.h> to figure out +how to define the values required by this file. + +

The ctype_base.h header file does not need include guards. +It should contain a single struct definition called +ctype_base. This struct should contain two type +declarations, and one enumeration declaration, like this example, taken +from the IRIX configuration: + +

     struct ctype_base
+     {
+       typedef unsigned int 	mask;
+       typedef int* 		__to_type;
+     
+       enum
+       {
+         space = _ISspace,
+         print = _ISprint,
+         cntrl = _IScntrl,
+         upper = _ISupper,
+         lower = _ISlower,
+         alpha = _ISalpha,
+         digit = _ISdigit,
+         punct = _ISpunct,
+         xdigit = _ISxdigit,
+         alnum = _ISalnum,
+         graph = _ISgraph
+       };
+     };
+     
+ +

The mask type is the type of the elements in the table. If your +C library uses a table to map lower-case numbers to upper-case numbers, +and vice versa, you should define __to_type to be the type of the +elements in that table. If you don't mind taking a minor performance +penalty, or if your library doesn't implement toupper and +tolower in this way, you can pick any pointer-to-integer type, +but you must still define the type. + +

The enumeration should give definitions for all the values in the above +example, using the values from your native <ctype.h>. They can +be given symbolically (as above), or numerically, if you prefer. You do +not have to include <ctype.h> in this header; it will always be +included before ctype_base.h is included. + +

The next file to write is ctype_noninline.h, which also does +not require include guards. This file defines a few member functions +that will be included in include/bits/locale_facets.h. The first +function that must be written is the ctype<char>::ctype +constructor. Here is the IRIX example: + +

     ctype<char>::ctype(const mask* __table = 0, bool __del = false,
+           size_t __refs = 0)
+       : _Ctype_nois<char>(__refs), _M_del(__table != 0 && __del),
+         _M_toupper(NULL),
+         _M_tolower(NULL),
+         _M_ctable(NULL),
+         _M_table(!__table
+                  ? (const mask*) (__libc_attr._ctype_tbl->_class + 1)
+                  : __table)
+       { }
+     
+ +

There are two parts of this that you might choose to alter. The first, +and most important, is the line involving __libc_attr. That is +IRIX system-dependent code that gets the base of the table mapping +character codes to attributes. You need to substitute code that obtains +the address of this table on your system. If you want to use your +operating system's tables to map upper-case letters to lower-case, and +vice versa, you should initialize _M_toupper and +_M_tolower with those tables, in similar fashion. + +

Now, you have to write two functions to convert from upper-case to +lower-case, and vice versa. Here are the IRIX versions: + +

     char
+     ctype<char>::do_toupper(char __c) const
+     { return _toupper(__c); }
+     
+     char
+     ctype<char>::do_tolower(char __c) const
+     { return _tolower(__c); }
+     
+ +

Your C library provides equivalents to IRIX's _toupper and +_tolower. If you initialized _M_toupper and +_M_tolower above, then you could use those tables instead. + +

Finally, you have to provide two utility functions that convert strings +of characters. The versions provided here will always work - but you +could use specialized routines for greater performance if you have +machinery to do that on your system: + +

     const char*
+     ctype<char>::do_toupper(char* __low, const char* __high) const
+     {
+       while (__low < __high)
+         {
+           *__low = do_toupper(*__low);
+           ++__low;
+         }
+       return __high;
+     }
+     
+     const char*
+     ctype<char>::do_tolower(char* __low, const char* __high) const
+     {
+       while (__low < __high)
+         {
+           *__low = do_tolower(*__low);
+           ++__low;
+         }
+       return __high;
+     }
+     
+ +

You must also provide the ctype_inline.h file, which +contains a few more functions. On most systems, you can just copy +config/os/generic/ctype_inline.h and use it on your system. + +

In detail, the functions provided test characters for particular +properties; they are analogous to the functions like isalpha and +islower provided by the C library. + +

The first function is implemented like this on IRIX: + +

     bool
+     ctype<char>::
+     is(mask __m, char __c) const throw()
+     { return (_M_table)[(unsigned char)(__c)] & __m; }
+     
+ +

The _M_table is the table passed in above, in the constructor. +This is the table that contains the bitmasks for each character. The +implementation here should work on all systems. + +

The next function is: + +

     const char*
+     ctype<char>::
+     is(const char* __low, const char* __high, mask* __vec) const throw()
+     {
+       while (__low < __high)
+         *__vec++ = (_M_table)[(unsigned char)(*__low++)];
+       return __high;
+     }
+     
+ +

This function is similar; it copies the masks for all the characters +from __low up until __high into the vector given by +__vec. + +

The last two functions again are entirely generic: + +

     const char*
+     ctype<char>::
+     scan_is(mask __m, const char* __low, const char* __high) const throw()
+     {
+       while (__low < __high && !this->is(__m, *__low))
+         ++__low;
+       return __low;
+     }
+     
+     const char*
+     ctype<char>::
+     scan_not(mask __m, const char* __low, const char* __high) const throw()
+     {
+       while (__low < __high && this->is(__m, *__low))
+         ++__low;
+       return __low;
+     }
+     
+ +
+


+Node: Thread safety, +Next: , +Previous: Character types, +Up: Top +
+
+ +

Thread safety

+ +

The C++ library string functionality requires a couple of atomic +operations to provide thread-safety. If you don't take any special +action, the library will use stub versions of these functions that are +not thread-safe. They will work fine, unless your applications are +multi-threaded. + +

If you want to provide custom, safe, versions of these functions, there +are two distinct approaches. One is to provide a version for your CPU, +using assembly language constructs. The other is to use the +thread-safety primitives in your operating system. In either case, you +make a file called atomicity.h, and the variable +ATOMICITYH must point to this file. + +

If you are using the assembly-language approach, put this code in +config/cpu/<chip>/atomicity.h, where chip is the name of +your processor (see CPU). No additional changes are necessary to +locate the file in this case; ATOMICITYH will be set by default. + +

If you are using the operating system thread-safety primitives approach, +you can also put this code in the same CPU directory, in which case no more +work is needed to locate the file. For examples of this approach, +see the atomicity.h file for IRIX or IA64. + +

Alternatively, if the primitives are more closely related to the OS +than they are to the CPU, you can put the atomicity.h file in +the Operating system directory instead. In this case, you must +edit configure.host, and in the switch statement that handles +operating systems, override the ATOMICITYH variable to point to +the appropriate os_include_dir. For examples of this approach, +see the atomicity.h file for AIX. + +

With those bits out of the way, you have to actually write +atomicity.h itself. This file should be wrapped in an +include guard named _GLIBCXX_ATOMICITY_H. It should define one +type, and two functions. + +

The type is _Atomic_word. Here is the version used on IRIX: + +

     typedef long _Atomic_word;
+     
+ +

This type must be a signed integral type supporting atomic operations. +If you're using the OS approach, use the same type used by your system's +primitives. Otherwise, use the type for which your CPU provides atomic +primitives. + +

Then, you must provide two functions. The bodies of these functions +must be equivalent to those provided here, but using atomic operations: + +

     static inline _Atomic_word
+     __attribute__ ((__unused__))
+     __exchange_and_add (_Atomic_word* __mem, int __val)
+     {
+       _Atomic_word __result = *__mem;
+       *__mem += __val;
+       return __result;
+     }
+     
+     static inline void
+     __attribute__ ((__unused__))
+     __atomic_add (_Atomic_word* __mem, int __val)
+     {
+       *__mem += __val;
+     }
+     
+ +
+


+Node: Numeric limits, +Next: , +Previous: Thread safety, +Up: Top +
+
+ +

Numeric limits

+ +

The C++ library requires information about the fundamental data types, +such as the minimum and maximum representable values of each type. +You can define each of these values individually, but it is usually +easiest just to indicate how many bits are used in each of the data +types and let the library do the rest. For information about the +macros to define, see the top of include/bits/std_limits.h. + +

If you need to define any macros, you can do so in os_defines.h. +However, if all operating systems for your CPU are likely to use the +same values, you can provide a CPU-specific file instead so that you +do not have to provide the same definitions for each operating system. +To take that approach, create a new file called cpu_limits.h in +your CPU configuration directory (see CPU). + +

+


+Node: Libtool, +Next: , +Previous: Numeric limits, +Up: Top +
+
+ +

Libtool

+ +

The C++ library is compiled, archived and linked with libtool. +Explaining the full workings of libtool is beyond the scope of this +document, but there are a few, particular bits that are necessary for +porting. + +

Some parts of the libstdc++ library are compiled with the libtool +--tags CXX option (the C++ definitions for libtool). Therefore, +ltcf-cxx.sh in the top-level directory needs to have the correct +logic to compile and archive objects equivalent to the C version of libtool, +ltcf-c.sh. Some libtool targets have definitions for C but not +for C++, or C++ definitions which have not been kept up to date. + +

The C++ run-time library contains initialization code that needs to be +run as the library is loaded. Often, that requires linking in special +object files when the C++ library is built as a shared library, or +taking other system-specific actions. + +

The libstdc++ library is linked with the C version of libtool, even +though it is a C++ library. Therefore, the C version of libtool needs to +ensure that the run-time library initializers are run. The usual way to +do this is to build the library using gcc -shared. + +

If you need to change how the library is linked, look at +ltcf-c.sh in the top-level directory. Find the switch statement +that sets archive_cmds. Here, adjust the setting for your +operating system. + +

+


+Node: GNU Free Documentation License, +Previous: Libtool, +Up: Top +
+
+ +

GNU Free Documentation License

+ +
Version 1.2, November 2002
+
     Copyright © 2000,2001,2002 Free Software Foundation, Inc.
+     51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
+     
+     Everyone is permitted to copy and distribute verbatim copies
+     of this license document, but changing it is not allowed.
+     
+ +
    +
  1. PREAMBLE + +

    The purpose of this License is to make a manual, textbook, or other +functional and useful document free in the sense of freedom: to +assure everyone the effective freedom to copy and redistribute it, +with or without modifying it, either commercially or noncommercially. +Secondarily, this License preserves for the author and publisher a way +to get credit for their work, while not being considered responsible +for modifications made by others. + +

    This License is a kind of "copyleft", which means that derivative +works of the document must themselves be free in the same sense. It +complements the GNU General Public License, which is a copyleft +license designed for free software. + +

    We have designed this License in order to use it for manuals for free +software, because free software needs free documentation: a free +program should come with manuals providing the same freedoms that the +software does. But this License is not limited to software manuals; +it can be used for any textual work, regardless of subject matter or +whether it is published as a printed book. We recommend this License +principally for works whose purpose is instruction or reference. + +

  2. APPLICABILITY AND DEFINITIONS + +

    This License applies to any manual or other work, in any medium, that +contains a notice placed by the copyright holder saying it can be +distributed under the terms of this License. Such a notice grants a +world-wide, royalty-free license, unlimited in duration, to use that +work under the conditions stated herein. The "Document", below, +refers to any such manual or work. Any member of the public is a +licensee, and is addressed as "you". You accept the license if you +copy, modify or distribute the work in a way requiring permission +under copyright law. + +

    A "Modified Version" of the Document means any work containing the +Document or a portion of it, either copied verbatim, or with +modifications and/or translated into another language. + +

    A "Secondary Section" is a named appendix or a front-matter section +of the Document that deals exclusively with the relationship of the +publishers or authors of the Document to the Document's overall +subject (or to related matters) and contains nothing that could fall +directly within that overall subject. (Thus, if the Document is in +part a textbook of mathematics, a Secondary Section may not explain +any mathematics.) The relationship could be a matter of historical +connection with the subject or with related matters, or of legal, +commercial, philosophical, ethical or political position regarding +them. + +

    The "Invariant Sections" are certain Secondary Sections whose titles +are designated, as being those of Invariant Sections, in the notice +that says that the Document is released under this License. If a +section does not fit the above definition of Secondary then it is not +allowed to be designated as Invariant. The Document may contain zero +Invariant Sections. If the Document does not identify any Invariant +Sections then there are none. + +

    The "Cover Texts" are certain short passages of text that are listed, +as Front-Cover Texts or Back-Cover Texts, in the notice that says that +the Document is released under this License. A Front-Cover Text may +be at most 5 words, and a Back-Cover Text may be at most 25 words. + +

    A "Transparent" copy of the Document means a machine-readable copy, +represented in a format whose specification is available to the +general public, that is suitable for revising the document +straightforwardly with generic text editors or (for images composed of +pixels) generic paint programs or (for drawings) some widely available +drawing editor, and that is suitable for input to text formatters or +for automatic translation to a variety of formats suitable for input +to text formatters. A copy made in an otherwise Transparent file +format whose markup, or absence of markup, has been arranged to thwart +or discourage subsequent modification by readers is not Transparent. +An image format is not Transparent if used for any substantial amount +of text. A copy that is not "Transparent" is called "Opaque". + +

    Examples of suitable formats for Transparent copies include plain +ASCII without markup, Texinfo input format, LaTeX input +format, SGML or XML using a publicly available +DTD, and standard-conforming simple HTML, +PostScript or PDF designed for human modification. Examples +of transparent image formats include PNG, XCF and +JPG. Opaque formats include proprietary formats that can be +read and edited only by proprietary word processors, SGML or +XML for which the DTD and/or processing tools are +not generally available, and the machine-generated HTML, +PostScript or PDF produced by some word processors for +output purposes only. + +

    The "Title Page" means, for a printed book, the title page itself, +plus such following pages as are needed to hold, legibly, the material +this License requires to appear in the title page. For works in +formats which do not have any title page as such, "Title Page" means +the text near the most prominent appearance of the work's title, +preceding the beginning of the body of the text. + +

    A section "Entitled XYZ" means a named subunit of the Document whose +title either is precisely XYZ or contains XYZ in parentheses following +text that translates XYZ in another language. (Here XYZ stands for a +specific section name mentioned below, such as "Acknowledgements", +"Dedications", "Endorsements", or "History".) To "Preserve the Title" +of such a section when you modify the Document means that it remains a +section "Entitled XYZ" according to this definition. + +

    The Document may include Warranty Disclaimers next to the notice which +states that this License applies to the Document. These Warranty +Disclaimers are considered to be included by reference in this +License, but only as regards disclaiming warranties: any other +implication that these Warranty Disclaimers may have is void and has +no effect on the meaning of this License. + +

  3. VERBATIM COPYING + +

    You may copy and distribute the Document in any medium, either +commercially or noncommercially, provided that this License, the +copyright notices, and the license notice saying this License applies +to the Document are reproduced in all copies, and that you add no other +conditions whatsoever to those of this License. You may not use +technical measures to obstruct or control the reading or further +copying of the copies you make or distribute. However, you may accept +compensation in exchange for copies. If you distribute a large enough +number of copies you must also follow the conditions in section 3. + +

    You may also lend copies, under the same conditions stated above, and +you may publicly display copies. + +

  4. COPYING IN QUANTITY + +

    If you publish printed copies (or copies in media that commonly have +printed covers) of the Document, numbering more than 100, and the +Document's license notice requires Cover Texts, you must enclose the +copies in covers that carry, clearly and legibly, all these Cover +Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on +the back cover. Both covers must also clearly and legibly identify +you as the publisher of these copies. The front cover must present +the full title with all words of the title equally prominent and +visible. You may add other material on the covers in addition. +Copying with changes limited to the covers, as long as they preserve +the title of the Document and satisfy these conditions, can be treated +as verbatim copying in other respects. + +

    If the required texts for either cover are too voluminous to fit +legibly, you should put the first ones listed (as many as fit +reasonably) on the actual cover, and continue the rest onto adjacent +pages. + +

    If you publish or distribute Opaque copies of the Document numbering +more than 100, you must either include a machine-readable Transparent +copy along with each Opaque copy, or state in or with each Opaque copy +a computer-network location from which the general network-using +public has access to download using public-standard network protocols +a complete Transparent copy of the Document, free of added material. +If you use the latter option, you must take reasonably prudent steps, +when you begin distribution of Opaque copies in quantity, to ensure +that this Transparent copy will remain thus accessible at the stated +location until at least one year after the last time you distribute an +Opaque copy (directly or through your agents or retailers) of that +edition to the public. + +

    It is requested, but not required, that you contact the authors of the +Document well before redistributing any large number of copies, to give +them a chance to provide you with an updated version of the Document. + +

  5. MODIFICATIONS + +

    You may copy and distribute a Modified Version of the Document under +the conditions of sections 2 and 3 above, provided that you release +the Modified Version under precisely this License, with the Modified +Version filling the role of the Document, thus licensing distribution +and modification of the Modified Version to whoever possesses a copy +of it. In addition, you must do these things in the Modified Version: + +

      +
    1. Use in the Title Page (and on the covers, if any) a title distinct +from that of the Document, and from those of previous versions +(which should, if there were any, be listed in the History section +of the Document). You may use the same title as a previous version +if the original publisher of that version gives permission. + +
    2. List on the Title Page, as authors, one or more persons or entities +responsible for authorship of the modifications in the Modified +Version, together with at least five of the principal authors of the +Document (all of its principal authors, if it has fewer than five), +unless they release you from this requirement. + +
    3. State on the Title page the name of the publisher of the +Modified Version, as the publisher. + +
    4. Preserve all the copyright notices of the Document. + +
    5. Add an appropriate copyright notice for your modifications +adjacent to the other copyright notices. + +
    6. Include, immediately after the copyright notices, a license notice +giving the public permission to use the Modified Version under the +terms of this License, in the form shown in the Addendum below. + +
    7. Preserve in that license notice the full lists of Invariant Sections +and required Cover Texts given in the Document's license notice. + +
    8. Include an unaltered copy of this License. + +
    9. Preserve the section Entitled "History", Preserve its Title, and add +to it an item stating at least the title, year, new authors, and +publisher of the Modified Version as given on the Title Page. If +there is no section Entitled "History" in the Document, create one +stating the title, year, authors, and publisher of the Document as +given on its Title Page, then add an item describing the Modified +Version as stated in the previous sentence. + +
    10. Preserve the network location, if any, given in the Document for +public access to a Transparent copy of the Document, and likewise +the network locations given in the Document for previous versions +it was based on. These may be placed in the "History" section. +You may omit a network location for a work that was published at +least four years before the Document itself, or if the original +publisher of the version it refers to gives permission. + +
    11. For any section Entitled "Acknowledgements" or "Dedications", Preserve +the Title of the section, and preserve in the section all the +substance and tone of each of the contributor acknowledgements and/or +dedications given therein. + +
    12. Preserve all the Invariant Sections of the Document, +unaltered in their text and in their titles. Section numbers +or the equivalent are not considered part of the section titles. + +
    13. Delete any section Entitled "Endorsements". Such a section +may not be included in the Modified Version. + +
    14. Do not retitle any existing section to be Entitled "Endorsements" or +to conflict in title with any Invariant Section. + +
    15. Preserve any Warranty Disclaimers. +
    + +

    If the Modified Version includes new front-matter sections or +appendices that qualify as Secondary Sections and contain no material +copied from the Document, you may at your option designate some or all +of these sections as invariant. To do this, add their titles to the +list of Invariant Sections in the Modified Version's license notice. +These titles must be distinct from any other section titles. + +

    You may add a section Entitled "Endorsements", provided it contains +nothing but endorsements of your Modified Version by various +parties--for example, statements of peer review or that the text has +been approved by an organization as the authoritative definition of a +standard. + +

    You may add a passage of up to five words as a Front-Cover Text, and a +passage of up to 25 words as a Back-Cover Text, to the end of the list +of Cover Texts in the Modified Version. Only one passage of +Front-Cover Text and one of Back-Cover Text may be added by (or +through arrangements made by) any one entity. If the Document already +includes a cover text for the same cover, previously added by you or +by arrangement made by the same entity you are acting on behalf of, +you may not add another; but you may replace the old one, on explicit +permission from the previous publisher that added the old one. + +

    The author(s) and publisher(s) of the Document do not by this License +give permission to use their names for publicity for or to assert or +imply endorsement of any Modified Version. + +

  6. COMBINING DOCUMENTS + +

    You may combine the Document with other documents released under this +License, under the terms defined in section 4 above for modified +versions, provided that you include in the combination all of the +Invariant Sections of all of the original documents, unmodified, and +list them all as Invariant Sections of your combined work in its +license notice, and that you preserve all their Warranty Disclaimers. + +

    The combined work need only contain one copy of this License, and +multiple identical Invariant Sections may be replaced with a single +copy. If there are multiple Invariant Sections with the same name but +different contents, make the title of each such section unique by +adding at the end of it, in parentheses, the name of the original +author or publisher of that section if known, or else a unique number. +Make the same adjustment to the section titles in the list of +Invariant Sections in the license notice of the combined work. + +

    In the combination, you must combine any sections Entitled "History" +in the various original documents, forming one section Entitled +"History"; likewise combine any sections Entitled "Acknowledgements", +and any sections Entitled "Dedications". You must delete all +sections Entitled "Endorsements." + +

  7. COLLECTIONS OF DOCUMENTS + +

    You may make a collection consisting of the Document and other documents +released under this License, and replace the individual copies of this +License in the various documents with a single copy that is included in +the collection, provided that you follow the rules of this License for +verbatim copying of each of the documents in all other respects. + +

    You may extract a single document from such a collection, and distribute +it individually under this License, provided you insert a copy of this +License into the extracted document, and follow this License in all +other respects regarding verbatim copying of that document. + +

  8. AGGREGATION WITH INDEPENDENT WORKS + +

    A compilation of the Document or its derivatives with other separate +and independent documents or works, in or on a volume of a storage or +distribution medium, is called an "aggregate" if the copyright +resulting from the compilation is not used to limit the legal rights +of the compilation's users beyond what the individual works permit. +When the Document is included an aggregate, this License does not +apply to the other works in the aggregate which are not themselves +derivative works of the Document. + +

    If the Cover Text requirement of section 3 is applicable to these +copies of the Document, then if the Document is less than one half of +the entire aggregate, the Document's Cover Texts may be placed on +covers that bracket the Document within the aggregate, or the +electronic equivalent of covers if the Document is in electronic form. +Otherwise they must appear on printed covers that bracket the whole +aggregate. + +

  9. TRANSLATION + +

    Translation is considered a kind of modification, so you may +distribute translations of the Document under the terms of section 4. +Replacing Invariant Sections with translations requires special +permission from their copyright holders, but you may include +translations of some or all Invariant Sections in addition to the +original versions of these Invariant Sections. You may include a +translation of this License, and all the license notices in the +Document, and any Warrany Disclaimers, provided that you also include +the original English version of this License and the original versions +of those notices and disclaimers. In case of a disagreement between +the translation and the original version of this License or a notice +or disclaimer, the original version will prevail. + +

    If a section in the Document is Entitled "Acknowledgements", +"Dedications", or "History", the requirement (section 4) to Preserve +its Title (section 1) will typically require changing the actual +title. + +

  10. TERMINATION + +

    You may not copy, modify, sublicense, or distribute the Document except +as expressly provided for under this License. Any other attempt to +copy, modify, sublicense or distribute the Document is void, and will +automatically terminate your rights under this License. However, +parties who have received copies, or rights, from you under this +License will not have their licenses terminated so long as such +parties remain in full compliance. + +

  11. FUTURE REVISIONS OF THIS LICENSE + +

    The Free Software Foundation may publish new, revised versions +of the GNU Free Documentation License from time to time. Such new +versions will be similar in spirit to the present version, but may +differ in detail to address new problems or concerns. See +http://www.gnu.org/copyleft/. + +

    Each version of the License is given a distinguishing version number. +If the Document specifies that a particular numbered version of this +License "or any later version" applies to it, you have the option of +following the terms and conditions either of that specified version or +of any later version that has been published (not as a draft) by the +Free Software Foundation. If the Document does not specify a version +number of this License, you may choose any version ever published (not +as a draft) by the Free Software Foundation. +

+ +

ADDENDUM: How to use this License for your documents

+ +

To use this License in a document you have written, include a copy of +the License in the document and put the following copyright and +license notices just after the title page: + +

       Copyright (C)  year  your name.
+       Permission is granted to copy, distribute and/or modify this document
+       under the terms of the GNU Free Documentation License, Version 1.2
+       or any later version published by the Free Software Foundation;
+       with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
+       A copy of the license is included in the section entitled ``GNU
+       Free Documentation License''.
+     
+ +

If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts, +replace the "with...Texts." line with this: + +

         with the Invariant Sections being list their titles, with
+         the Front-Cover Texts being list, and with the Back-Cover Texts
+         being list.
+     
+ +

If you have Invariant Sections without Cover Texts, or some other +combination of the three, merge those two alternatives to suit the +situation. + +

If your document contains nontrivial examples of program code, we +recommend releasing these examples in parallel under your choice of +free software license, such as the GNU General Public License, +to permit their use in free software. + + +

+ + + diff --git a/libstdc++-v3/doc/html/17_intro/porting.texi b/libstdc++-v3/doc/html/17_intro/porting.texi new file mode 100644 index 00000000000..090bdf77155 --- /dev/null +++ b/libstdc++-v3/doc/html/17_intro/porting.texi @@ -0,0 +1,570 @@ +\input texinfo + +@c --------------------------------------------------------------------- +@c Prologue +@c --------------------------------------------------------------------- + +@setfilename porting.info +@settitle Porting libstdc++-v3 +@setchapternewpage odd + +@copying +Copyright @copyright{} 2000, 2001, 2002, 2003, 2005 +Free Software Foundation, Inc. + +Permission is granted to copy, distribute and/or modify this document +under the terms of the GNU Free Documentation License, Version 1.2 or +any later version published by the Free Software Foundation; with the +Invariant Sections being ``GNU General Public License'', the Front-Cover +texts being (a) (see below), and with the Back-Cover Texts being (b) +(see below). A copy of the license is included in the section entitled +``GNU Free Documentation License''. + +(a) The FSF's Front-Cover Text is: + + A GNU Manual + +(b) The FSF's Back-Cover Text is: + + You have freedom to copy and modify this GNU Manual, like GNU + software. Copies published by the Free Software Foundation raise + funds for GNU development. +@end copying + +@ifinfo +This file explains how to port libstdc++-v3 (the GNU C++ library) to +a new target. + +@insertcopying +@end ifinfo + +@c --------------------------------------------------------------------- +@c Titlepage +@c --------------------------------------------------------------------- + +@titlepage +@title Porting libstdc++-v3 +@author Mark Mitchell +@page +@vskip 0pt plus 1filll +@insertcopying +@end titlepage + +@c --------------------------------------------------------------------- +@c Top +@c --------------------------------------------------------------------- + +@node Top +@top Porting libstdc++-v3 + +This document explains how to port libstdc++-v3 (the GNU C++ library) to +a new target. + +In order to make the GNU C++ library (libstdc++-v3) work with a new +target, you must edit some configuration files and provide some new +header files. Unless this is done, libstdc++-v3 will use generic +settings which may not be correct for your target; even if they are +correct, they will likely be inefficient. + +Before you get started, make sure that you have a working C library on +your target. The C library need not precisely comply with any +particular standard, but should generally conform to the requirements +imposed by the ANSI/ISO standard. + +In addition, you should try to verify that the C++ compiler generally +works. It is difficult to test the C++ compiler without a working +library, but you should at least try some minimal test cases. + +(Note that what we think of as a ``target,'' the library refers to as +a ``host.'' The comment at the top of @file{configure.ac} explains why.) + +Here are the primary steps required to port the library: + +@menu +* Operating system:: Configuring for your operating system. +* CPU:: Configuring for your processor chip. +* Character types:: Implementing character classification. +* Thread safety:: Implementing atomic operations. +* Numeric limits:: Implementing numeric limits. +* Libtool:: Using libtool. +* GNU Free Documentation License:: How you can copy and share this manual. +@end menu + +@c --------------------------------------------------------------------- +@c Operating system +@c --------------------------------------------------------------------- + +@node Operating system +@chapter Operating system + +If you are porting to a new operating system (as opposed to a new chip +using an existing operating system), you will need to create a new +directory in the @file{config/os} hierarchy. For example, the IRIX +configuration files are all in @file{config/os/irix}. There is no set +way to organize the OS configuration directory. For example, +@file{config/os/solaris/solaris-2.6} and +@file{config/os/solaris/solaris-2.7} are used as configuration +directories for these two versions of Solaris. On the other hand, both +Solaris 2.7 and Solaris 2.8 use the @file{config/os/solaris/solaris-2.7} +directory. The important information is that there needs to be a +directory under @file{config/os} to store the files for your operating +system. + +You might have to change the @file{configure.host} file to ensure that +your new directory is activated. Look for the switch statement that sets +@code{os_include_dir}, and add a pattern to handle your operating system +if the default will not suffice. The switch statement switches on only +the OS portion of the standard target triplet; e.g., the @code{solaris2.8} +in @code{sparc-sun-solaris2.8}. If the new directory is named after the +OS portion of the triplet (the default), then nothing needs to be changed. + +The first file to create in this directory, should be called +@file{os_defines.h}. This file contains basic macro definitions +that are required to allow the C++ library to work with your C library. + +Several libstdc++-v3 source files unconditionally define the macro +@code{_POSIX_SOURCE}. On many systems, defining this macro causes +large portions of the C library header files to be eliminated +at preprocessing time. Therefore, you may have to @code{#undef} this +macro, or define other macros (like @code{_LARGEFILE_SOURCE} or +@code{__EXTENSIONS__}). You won't know what macros to define or +undefine at this point; you'll have to try compiling the library and +seeing what goes wrong. If you see errors about calling functions +that have not been declared, look in your C library headers to see if +the functions are declared there, and then figure out what macros you +need to define. You will need to add them to the +@code{CPLUSPLUS_CPP_SPEC} macro in the GCC configuration file for your +target. It will not work to simply define these macros in +@file{os_defines.h}. + +At this time, there are a few libstdc++-v3-specific macros which may be +defined: + +@code{_GLIBCXX_USE_C99_CHECK} may be defined to 1 to check C99 +function declarations (which are not covered by specialization below) +found in system headers against versions found in the library headers +derived from the standard. + +@code{_GLIBCXX_USE_C99_DYNAMIC} may be defined to an expression that +yields 0 if and only if the system headers are exposing proper support +for C99 functions (which are not covered by specialization below). If +defined, it must be 0 while bootstrapping the compiler/rebuilding the +library. + +@code{_GLIBCXX_USE_C99_LONG_LONG_CHECK} may be defined to 1 to check +the set of C99 long long function declarations found in system headers +against versions found in the library headers derived from the +standard. + +@code{_GLIBCXX_USE_C99_LONG_LONG_DYNAMIC} may be defined to an +expression that yields 0 if and only if the system headers are +exposing proper support for the set of C99 long long functions. If +defined, it must be 0 while bootstrapping the compiler/rebuilding the +library. + +@code{_GLIBCXX_USE_C99_FP_MACROS_DYNAMIC} may be defined to an +expression that yields 0 if and only if the system headers +are exposing proper support for the related set of macros. If defined, +it must be 0 while bootstrapping the compiler/rebuilding the library. + +@code{_GLIBCXX_USE_C99_FLOAT_TRANSCENDENTALS_CHECK} may be defined +to 1 to check the related set of function declarations found in system +headers against versions found in the library headers derived from +the standard. + +@code{_GLIBCXX_USE_C99_FLOAT_TRANSCENDENTALS_DYNAMIC} may be defined +to an expression that yields 0 if and only if the system headers +are exposing proper support for the related set of functions. If defined, +it must be 0 while bootstrapping the compiler/rebuilding the library. + +Finally, you should bracket the entire file in an include-guard, like +this: + +@example +#ifndef _GLIBCXX_OS_DEFINES +#define _GLIBCXX_OS_DEFINES +... +#endif +@end example + +We recommend copying an existing @file{os_defines.h} to use as a +starting point. + +@c --------------------------------------------------------------------- +@c CPU +@c --------------------------------------------------------------------- + +@node CPU +@chapter CPU + +If you are porting to a new chip (as opposed to a new operating system +running on an existing chip), you will need to create a new directory in the +@file{config/cpu} hierarchy. Much like the @ref{Operating system} setup, +there are no strict rules on how to organize the CPU configuration +directory, but careful naming choices will allow the configury to find your +setup files without explicit help. + +We recommend that for a target triplet @code{--}, you +name your configuration directory @file{config/cpu/}. If you do this, +the configury will find the directory by itself. Otherwise you will need to +edit the @file{configure.host} file and, in the switch statement that sets +@code{cpu_include_dir}, add a pattern to handle your chip. + +Note that some chip families share a single configuration directory, for +example, @code{alpha}, @code{alphaev5}, and @code{alphaev6} all use the +@file{config/cpu/alpha} directory, and there is an entry in the +@file{configure.host} switch statement to handle this. + +The @code{cpu_include_dir} sets default locations for the files controlling +@ref{Thread safety} and @ref{Numeric limits}, if the defaults are not +appropriate for your chip. + + +@c --------------------------------------------------------------------- +@c Character types +@c --------------------------------------------------------------------- + +@node Character types +@chapter Character types + +The library requires that you provide three header files to implement +character classification, analogous to that provided by the C libraries +@file{} header. You can model these on the files provided in +@file{config/os/generic}. However, these files will almost +certainly need some modification. + +The first file to write is @file{ctype_base.h}. This file provides +some very basic information about character classification. The libstdc++-v3 +library assumes that your C library implements @file{} by using +a table (indexed by character code) containing integers, where each of +these integers is a bit-mask indicating whether the character is +upper-case, lower-case, alphabetic, etc. The @file{ctype_base.h} +file gives the type of the integer, and the values of the various bit +masks. You will have to peer at your own @file{} to figure out +how to define the values required by this file. + +The @file{ctype_base.h} header file does not need include guards. +It should contain a single @code{struct} definition called +@code{ctype_base}. This @code{struct} should contain two type +declarations, and one enumeration declaration, like this example, taken +from the IRIX configuration: + +@example +struct ctype_base +@{ + typedef unsigned int mask; + typedef int* __to_type; + + enum + @{ + space = _ISspace, + print = _ISprint, + cntrl = _IScntrl, + upper = _ISupper, + lower = _ISlower, + alpha = _ISalpha, + digit = _ISdigit, + punct = _ISpunct, + xdigit = _ISxdigit, + alnum = _ISalnum, + graph = _ISgraph + @}; +@}; +@end example + +@noindent +The @code{mask} type is the type of the elements in the table. If your +C library uses a table to map lower-case numbers to upper-case numbers, +and vice versa, you should define @code{__to_type} to be the type of the +elements in that table. If you don't mind taking a minor performance +penalty, or if your library doesn't implement @code{toupper} and +@code{tolower} in this way, you can pick any pointer-to-integer type, +but you must still define the type. + +The enumeration should give definitions for all the values in the above +example, using the values from your native @file{}. They can +be given symbolically (as above), or numerically, if you prefer. You do +not have to include @file{} in this header; it will always be +included before @file{ctype_base.h} is included. + +The next file to write is @file{ctype_noninline.h}, which also does +not require include guards. This file defines a few member functions +that will be included in @file{include/bits/locale_facets.h}. The first +function that must be written is the @code{ctype::ctype} +constructor. Here is the IRIX example: + +@example +ctype::ctype(const mask* __table = 0, bool __del = false, + size_t __refs = 0) + : _Ctype_nois(__refs), _M_del(__table != 0 && __del), + _M_toupper(NULL), + _M_tolower(NULL), + _M_ctable(NULL), + _M_table(!__table + ? (const mask*) (__libc_attr._ctype_tbl->_class + 1) + : __table) + @{ @} +@end example + +@noindent +There are two parts of this that you might choose to alter. The first, +and most important, is the line involving @code{__libc_attr}. That is +IRIX system-dependent code that gets the base of the table mapping +character codes to attributes. You need to substitute code that obtains +the address of this table on your system. If you want to use your +operating system's tables to map upper-case letters to lower-case, and +vice versa, you should initialize @code{_M_toupper} and +@code{_M_tolower} with those tables, in similar fashion. + +Now, you have to write two functions to convert from upper-case to +lower-case, and vice versa. Here are the IRIX versions: + +@example +char +ctype::do_toupper(char __c) const +@{ return _toupper(__c); @} + +char +ctype::do_tolower(char __c) const +@{ return _tolower(__c); @} +@end example + +@noindent +Your C library provides equivalents to IRIX's @code{_toupper} and +@code{_tolower}. If you initialized @code{_M_toupper} and +@code{_M_tolower} above, then you could use those tables instead. + +Finally, you have to provide two utility functions that convert strings +of characters. The versions provided here will always work -- but you +could use specialized routines for greater performance if you have +machinery to do that on your system: + +@example +const char* +ctype::do_toupper(char* __low, const char* __high) const +@{ + while (__low < __high) + @{ + *__low = do_toupper(*__low); + ++__low; + @} + return __high; +@} + +const char* +ctype::do_tolower(char* __low, const char* __high) const +@{ + while (__low < __high) + @{ + *__low = do_tolower(*__low); + ++__low; + @} + return __high; +@} +@end example + +You must also provide the @file{ctype_inline.h} file, which +contains a few more functions. On most systems, you can just copy +@file{config/os/generic/ctype_inline.h} and use it on your system. + +In detail, the functions provided test characters for particular +properties; they are analogous to the functions like @code{isalpha} and +@code{islower} provided by the C library. + +The first function is implemented like this on IRIX: + +@example +bool +ctype:: +is(mask __m, char __c) const throw() +@{ return (_M_table)[(unsigned char)(__c)] & __m; @} +@end example + +@noindent +The @code{_M_table} is the table passed in above, in the constructor. +This is the table that contains the bitmasks for each character. The +implementation here should work on all systems. + +The next function is: + +@example +const char* +ctype:: +is(const char* __low, const char* __high, mask* __vec) const throw() +@{ + while (__low < __high) + *__vec++ = (_M_table)[(unsigned char)(*__low++)]; + return __high; +@} +@end example + +@noindent +This function is similar; it copies the masks for all the characters +from @code{__low} up until @code{__high} into the vector given by +@code{__vec}. + +The last two functions again are entirely generic: + +@example +const char* +ctype:: +scan_is(mask __m, const char* __low, const char* __high) const throw() +@{ + while (__low < __high && !this->is(__m, *__low)) + ++__low; + return __low; +@} + +const char* +ctype:: +scan_not(mask __m, const char* __low, const char* __high) const throw() +@{ + while (__low < __high && this->is(__m, *__low)) + ++__low; + return __low; +@} +@end example + +@c --------------------------------------------------------------------- +@c Thread safety +@c --------------------------------------------------------------------- + +@node Thread safety +@chapter Thread safety + +The C++ library string functionality requires a couple of atomic +operations to provide thread-safety. If you don't take any special +action, the library will use stub versions of these functions that are +not thread-safe. They will work fine, unless your applications are +multi-threaded. + +If you want to provide custom, safe, versions of these functions, there +are two distinct approaches. One is to provide a version for your CPU, +using assembly language constructs. The other is to use the +thread-safety primitives in your operating system. In either case, you +make a file called @file{atomicity.h}, and the variable +@code{ATOMICITYH} must point to this file. + +If you are using the assembly-language approach, put this code in +@file{config/cpu//atomicity.h}, where chip is the name of +your processor (@pxref{CPU}). No additional changes are necessary to +locate the file in this case; @code{ATOMICITYH} will be set by default. + +If you are using the operating system thread-safety primitives approach, +you can also put this code in the same CPU directory, in which case no more +work is needed to locate the file. For examples of this approach, +see the @file{atomicity.h} file for IRIX or IA64. + +Alternatively, if the primitives are more closely related to the OS +than they are to the CPU, you can put the @file{atomicity.h} file in +the @ref{Operating system} directory instead. In this case, you must +edit @file{configure.host}, and in the switch statement that handles +operating systems, override the @code{ATOMICITYH} variable to point to +the appropriate @code{os_include_dir}. For examples of this approach, +see the @file{atomicity.h} file for AIX. + +With those bits out of the way, you have to actually write +@file{atomicity.h} itself. This file should be wrapped in an +include guard named @code{_GLIBCXX_ATOMICITY_H}. It should define one +type, and two functions. + +The type is @code{_Atomic_word}. Here is the version used on IRIX: + +@example +typedef long _Atomic_word; +@end example + +@noindent +This type must be a signed integral type supporting atomic operations. +If you're using the OS approach, use the same type used by your system's +primitives. Otherwise, use the type for which your CPU provides atomic +primitives. + +Then, you must provide two functions. The bodies of these functions +must be equivalent to those provided here, but using atomic operations: + +@example +static inline _Atomic_word +__attribute__ ((__unused__)) +__exchange_and_add (_Atomic_word* __mem, int __val) +@{ + _Atomic_word __result = *__mem; + *__mem += __val; + return __result; +@} + +static inline void +__attribute__ ((__unused__)) +__atomic_add (_Atomic_word* __mem, int __val) +@{ + *__mem += __val; +@} +@end example + +@c --------------------------------------------------------------------- +@c Numeric limits +@c --------------------------------------------------------------------- + +@node Numeric limits +@chapter Numeric limits + +The C++ library requires information about the fundamental data types, +such as the minimum and maximum representable values of each type. +You can define each of these values individually, but it is usually +easiest just to indicate how many bits are used in each of the data +types and let the library do the rest. For information about the +macros to define, see the top of @file{include/bits/std_limits.h}. + +If you need to define any macros, you can do so in @file{os_defines.h}. +However, if all operating systems for your CPU are likely to use the +same values, you can provide a CPU-specific file instead so that you +do not have to provide the same definitions for each operating system. +To take that approach, create a new file called @file{cpu_limits.h} in +your CPU configuration directory (@pxref{CPU}). + +@c --------------------------------------------------------------------- +@c Libtool +@c --------------------------------------------------------------------- + +@node Libtool +@chapter Libtool + +The C++ library is compiled, archived and linked with libtool. +Explaining the full workings of libtool is beyond the scope of this +document, but there are a few, particular bits that are necessary for +porting. + +Some parts of the libstdc++-v3 library are compiled with the libtool +@code{--tags CXX} option (the C++ definitions for libtool). Therefore, +@file{ltcf-cxx.sh} in the top-level directory needs to have the correct +logic to compile and archive objects equivalent to the C version of libtool, +@file{ltcf-c.sh}. Some libtool targets have definitions for C but not +for C++, or C++ definitions which have not been kept up to date. + +The C++ run-time library contains initialization code that needs to be +run as the library is loaded. Often, that requires linking in special +object files when the C++ library is built as a shared library, or +taking other system-specific actions. + +The libstdc++-v3 library is linked with the C version of libtool, even +though it is a C++ library. Therefore, the C version of libtool needs to +ensure that the run-time library initializers are run. The usual way to +do this is to build the library using @code{gcc -shared}. + +If you need to change how the library is linked, look at +@file{ltcf-c.sh} in the top-level directory. Find the switch statement +that sets @code{archive_cmds}. Here, adjust the setting for your +operating system. + +@c --------------------------------------------------------------------- +@c GFDL +@c --------------------------------------------------------------------- + +@include fdl.texi + +@c --------------------------------------------------------------------- +@c Epilogue +@c --------------------------------------------------------------------- + +@contents +@bye diff --git a/libstdc++-v3/doc/html/17_intro/tr1_status.html b/libstdc++-v3/doc/html/17_intro/tr1_status.html new file mode 100644 index 00000000000..3d3d673cf89 --- /dev/null +++ b/libstdc++-v3/doc/html/17_intro/tr1_status.html @@ -0,0 +1,2322 @@ + + + + + + + + + + + + Status of TR1 features in GCC + - GNU Project - Free Software Foundation (FSF) + + + + + + +

+ Status of TR1 features in GCC +

+ +

+This table is based on the table of contents of ISO/IEC DTR 19768 +Doc No: N1836=05-0096 Date: 2005-06-24 +Draft Technical Report on C++ Library Extensions +

+ +

+In this implementation the header names are prefixed by +tr1/, for instance <tr1/functional>, +<tr1/memory>, and so on. +

+ +

+This page describes the TR1 support in mainline GCC SVN, not in any particular +release. +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
SectionDescriptionDoneBrokenMissingComments
2General Utilities
2.1Reference wrappersdone
2.1.1Additions to header <functional> synopsisdone
2.1.2Class template reference_wrapperdone
2.1.2.1reference_wrapper construct/copy/destroydone
2.1.2.2reference_wrapper assignmentdone
2.1.2.3reference_wrapper accessdone
2.1.2.4reference_wrapper invocationdone
2.1.2.5reference_wrapper helper functionsdone
2.2Smart pointersdone
2.2.1Additions to header <memory> synopsisdone
2.2.2Class bad_weak_ptrdone
2.2.3Class template shared_ptrdone1
2.2.3.1shared_ptr constructorsdone
2.2.3.2shared_ptr destructordone
2.2.3.3shared_ptr assignmentdone
2.2.3.4shared_ptr modifiersdone
2.2.3.5shared_ptr observersdone
2.2.3.6shared_ptr comparisondone
2.2.3.7shared_ptr I/Odone
2.2.3.8shared_ptr specialized algorithmsdone
2.2.3.9shared_ptr castsdone
2.2.3.10get_deleterdone
2.2.4Class template weak_ptrdone
2.2.4.1weak_ptr constructorsdone
2.2.4.2weak_ptr destructordone
2.2.4.3weak_ptr assignmentdone
2.2.4.4weak_ptr modifiersdone
2.2.4.5weak_ptr observersdone
2.2.4.6weak_ptr comparisondone
2.2.4.7weak_ptr specialized algorithmsdone
2.2.5Class template enable_shared_from_thisdone
3Function objects
3.1Definitionsdone
3.2Additions to <functional> synopsisdone
3.3Requirementsdone
3.4Function return typesdone
3.5Function template mem_fndone
3.6Function object bindersdone
3.6.1Class template is_bind_expressiondone
3.6.2Class template is_placeholderdone
3.6.3Function template binddone
3.6.4Placeholdersdone
3.7Polymorphic function wrappersdone
3.7.1Class bad_function_calldone
3.7.1.1bad_function_call constructordone
3.7.2Class template functiondone
3.7.2.1function construct/copy/destroydone
3.7.2.2function modifiersdone
3.7.2.3function capacitydone
3.7.2.4function invocationdone
3.7.2.5function target accessdone
3.7.2.6undefined operatorsdone
3.7.2.7null pointer comparison operatorsdone
3.7.2.8specialized algorithmsdone
4Metaprogramming and type traits
4.1Requirementsdone
4.2Header <type_traits> synopsisdone
4.3Helper classesdone
4.4General Requirementsdone
4.5Unary Type Traitsdone
4.5.1Primary Type Categoriesdone
4.5.2Composite type traitsdone
4.5.3Type propertiesdone
4.6Relationships between typesdone
4.7Transformations between typesdone
4.7.1Const-volatile modificationsdone
4.7.2Reference modificationsdone
4.7.3Array modificationsdone
4.7.4Pointer modificationsdone
4.8Other transformationsdone
4.9Implementation requirementsdone
5Numerical facilities
5.1Random number generationdone
5.1.1Requirementsdone
5.1.2Header <random> synopsisdone
5.1.3Class template variate_generatordone
5.1.4Random number engine class templatesdone
5.1.4.1Class template linear_congruentialdone
5.1.4.2Class template mersenne_twisterdone
5.1.4.3Class template subtract_with_carrydone
5.1.4.4Class template subtract_with_carry_01done
5.1.4.5Class template discard_blockdone
5.1.4.6Class template xor_combinedoneoperator()() per N2079
5.1.5Engines with predefined parametersdone
5.1.6Class random_devicedone
5.1.7Random distribution class templatesdone
5.1.7.1Class template uniform_intdone
5.1.7.2Class bernoulli_distributiondone
5.1.7.3Class template geometric_distributiondone
5.1.7.4Class template poisson_distributiondone
5.1.7.5Class template binomial_distributiondone
5.1.7.6Class template uniform_realdone
5.1.7.7Class template exponential_distributiondone
5.1.7.8Class template normal_distributiondone
5.1.7.9Class template gamma_distributiondone
5.2Mathematical special functionsdone
5.2.1Additions to header <cmath> synopsisdone
5.2.1.1associated Laguerre polynomialsdone
5.2.1.2associated Legendre functionsdone
5.2.1.3beta functiondone
5.2.1.4(complete) elliptic integral of the first kinddone
5.2.1.5(complete) elliptic integral of the second kinddone
5.2.1.6(complete) elliptic integral of the third kinddone
5.2.1.7confluent hypergeometric functionsdone
5.2.1.8regular modified cylindrical Bessel functionsdone
5.2.1.9cylindrical Bessel functions (of the first kind)done
5.2.1.10irregular modified cylindrical Bessel functionsdone
5.2.1.11cylindrical Neumann functionsdone
5.2.1.12(incomplete) elliptic integral of the first kinddone
5.2.1.13(incomplete) elliptic integral of the second kinddone
5.2.1.14(incomplete) elliptic integral of the third kinddone
5.2.1.15exponential integraldone
5.2.1.16Hermite polynomialsdone
5.2.1.17hypergeometric functionsdone
5.2.1.18Laguerre polynomialsdone
5.2.1.19Legendre polynomialsdone
5.2.1.20Riemann zeta functiondone
5.2.1.21spherical Bessel functions (of the first kind)done
5.2.1.22spherical associated Legendre functionsdone
5.2.1.23spherical Neumann functionsdone
5.2.2Additions to header <math.h> synopsisdone
6Containers
6.1Tuple typesdone
6.1.1Header <tuple> synopsisdone
6.1.2Additions to header <utility> synopsisdone
6.1.3Class template tupledone
6.1.3.1Constructiondone
6.1.3.2Tuple creation functionsdone
6.1.3.3Tuple helper classesdone
6.1.3.4Element accessdone
6.1.3.5Relational operatorsdone
6.1.4Pairsdone
6.2Fixed size arraydone
6.2.1Header <array> synopsisdone
6.2.2Class template arraydone
6.2.2.1array constructors, copy, and assignmentdone
6.2.2.2array specialized algorithmsdone
6.2.2.3array sizedone
6.2.2.4Zero sized arraysdone
6.2.2.5Tuple interface to class template arraydone
6.3Unordered associative containersdone
6.3.1Unordered associative container requirementsdone
6.3.1.1Exception safety guaranteesdone
6.3.2Additions to header <functional> synopsisdone
6.3.3Class template hashdone
6.3.4Unordered associative container classesdone
6.3.4.1Header <unordered_set> synopsisdone
6.3.4.2Header <unordered_map> synopsisdone
6.3.4.3Class template unordered_setdone
6.3.4.3.1unordered_set constructorsdone
6.3.4.3.2unordered_set swapdone
6.3.4.4Class template unordered_mapdone
6.3.4.4.1unordered_map constructorsdone
6.3.4.4.2unordered_map element accessdone
6.3.4.4.3unordered_map swapdone
6.3.4.5Class template unordered_multisetdone
6.3.4.5.1unordered_multiset constructorsdone
6.3.4.5.2unordered_multiset swapdone
6.3.4.6Class template unordered_multimapdone
6.3.4.6.1unordered_multimap constructorsdone
6.3.4.6.2unordered_multimap swapdone
7Regular expressions
7.1Definitionsmissing
7.2Requirementsmissing
7.3Regular expressions summarymissing
7.4Header <regex> synopsismissing
7.5Namespace tr1::regex_constantsmissing
7.5.1Bitmask Type syntax_option_typemissing
7.5.2Bitmask Type regex_constants::match_flag_typemissing
7.5.3Implementation defined error_typemissing
7.6Class regex_errormissing
7.7Class template regex_traitsmissing
7.8Class template basic_regexmissing
7.8.1basic_regex constantsmissing
7.8.2basic_regex constructorsmissing
7.8.3basic_regex assignmissing
7.8.4basic_regex constant operationsmissing
7.8.5basic_regex localemissing
7.8.6basic_regex swapmissing
7.8.7basic_regex non-member functionsmissing
7.8.7.1basic_regex non-member swapmissing
7.9Class template sub_matchmissing
7.9.1sub_match membersmissing
7.9.2sub_match non-member operatorsmissing
7.10Class template match_resultsmissing
7.10.1match_results constructorsmissing
7.10.2match_results sizemissing
7.10.3match_results element accessmissing
7.10.4match_results formattingmissing
7.10.5match_results allocatormissing
7.10.6match_results swapmissing
7.11Regular expression algorithmsmissing
7.11.1exceptionsmissing
7.11.2regex_matchmissing
7.11.3regex_searchmissing
7.11.4regex_replacemissing
7.12Regular expression Iteratorsmissing
7.12.1Class template regex_iteratormissing
7.12.1.1regex_iterator constructorsmissing
7.12.1.2regex_iterator comparisonsmissing
7.12.1.3regex_iterator dereferencemissing
7.12.1.4regex_iterator incrementmissing
7.12.2Class template regex_token_iteratormissing
7.12.2.1regex_token_iterator constructorsmissing
7.12.2.2regex_token_iterator comparisonsmissing
7.12.2.3regex_token_iterator dereferencemissing
7.12.2.4regex_token_iterator incrementmissing
7.13Modified ECMAScript regular expression grammarmissing
8C compatibility
8.1Additions to header <complex>done
8.1.1Synopsisdone
8.1.2Function acosdone
8.1.3Function asindone
8.1.4Function atandone
8.1.5Function acoshdone
8.1.6Function asinhdone
8.1.7Function atanhdone
8.1.8Function fabsdone
8.1.9Additional Overloadsdone
8.2Header <ccomplex>missingDR 551
8.3Header <complex.h>missingDR 551
8.4Additions to header <cctype>done
8.4.1Synopsisdone
8.4.2Function isblankdone
8.5Additions to header <ctype.h>done
8.6Header <cfenv>done
8.6.1Synopsisdone
8.6.2Definitionsdone
8.7Header <fenv.h>done
8.8Additions to header <cfloat>done
8.9Additions to header <float.h>done
8.10Additions to header <ios>missing
8.10.1Synopsismissing
8.10.2Function hexfloatmissing
8.11Header <cinttypes>done
8.11.1SynopsisdoneDR 557
8.11.2Definitionsdone
8.12Header <inttypes.h>done
8.13Additions to header <climits>done
8.14Additions to header <limits.h>done
8.15Additions to header <locale>missing
8.16Additions to header <cmath>done
8.16.1Synopsisdone
8.16.2Definitionsdone
8.16.3Function template definitionsdone
8.16.4Additional overloadsdoneDR 568; DR 550
8.17Additions to header <math.h>done
8.18Additions to header <cstdarg>done
8.19Additions to header <stdarg.h>done
8.20The header <cstdbool>done
8.21The header <stdbool.h>done
8.22The header <cstdint>done
8.22.1Synopsisdone
8.22.2Definitionsdone
8.23The header <stdint.h>done
8.24Additions to header <cstdio>done
8.24.1Synopsisdone
8.24.2Definitionsdone
8.24.3Additional format specifiersdoneC library responsibility
8.24.4Additions to header <stdio.h>done
8.25Additions to header <cstdlib>done
8.25.1Synopsisdone
8.25.2Definitionsdone
8.25.3Function absdone
8.25.4Function divdone
8.26Additions to header <stdlib.h>done
8.27Header <ctgmath>doneDR 551
8.28Header <tgmath.h>doneDR 551
8.29Additions to header <ctime>doneC library responsibility
8.30Additions to header <cwchar>done
8.30.1Synopsisdone
8.30.2Definitionsdone
8.30.3Additional wide format specifiersdoneC library responsibility
8.31Additions to header <wchar.h>done
8.32Additions to header <cwctype>done
8.32.1Synopsisdone
8.32.2Function iswblankdone
8.33Additions to header <wctype.h>done
+ +

Footnotes

+ +
    + +
  1. + + The shared_ptr implementation uses some code from the + Boost + shared_ptr library. +
  2. + +
+ +

+Please send FSF & GNU inquiries & questions to +gnu@gnu.org. +There are also other ways +to contact the FSF. +

+ +

+These pages are maintained by +the GCC team. +

+ +
+For questions related to the use of GCC, please consult these web +pages and the GCC manuals. If +that fails, the gcc-help@gcc.gnu.org +mailing list might help.
+Please send comments on these web pages and the development of GCC to our +developer mailing list at gcc@gnu.org +or gcc@gcc.gnu.org. All of our lists +have public archives. +
+ +

+Copyright (C) Free Software Foundation, Inc., +51 Franklin St, Fifth Floor, Boston, MA 02110, USA. +

+

+Verbatim copying and distribution of this entire article is +permitted in any medium, provided this notice is preserved. +

+ + + + + + +
+ Last modified 2006-10-01 + + + Valid XHTML 1.0 + +
+ + + diff --git a/libstdc++-v3/doc/html/18_support/howto.html b/libstdc++-v3/doc/html/18_support/howto.html new file mode 100644 index 00000000000..d7ea434db2d --- /dev/null +++ b/libstdc++-v3/doc/html/18_support/howto.html @@ -0,0 +1,435 @@ + + + + + + + + + + + libstdc++ HOWTO: Chapter 18: Library Support + + + + + + + + + +

Chapter 18: Library Support

+ +

Chapter 18 deals with the functions called and objects created + automatically during the course of a program's existence. +

+

While we can't reproduce the contents of the Standard here (you need to + get your own copy from your nation's member body; see our homepage for + help), we can mention a couple of changes in what kind of support a C++ + program gets from the Standard Library. +

+ + + +
+

Contents

+ + +
+ + + +

Types

+

All the types that you're used to in C are here in one form or + another. The only change that might affect people is the type of + NULL: while it is required to be a macro, the definition of that + macro is not allowed to be (void*)0, which is + often used in C. +

+

In g++, NULL is #define'd to be __null, a magic keyword + extension of g++. +

+

The biggest problem of #defining NULL to be something like + "0L" is that the compiler will view that as a long integer + before it views it as a pointer, so overloading won't do what you + expect. (This is why g++ has a magic extension, so that NULL is + always a pointer.) +

+

In his book + Effective C++, + Scott Meyers points out that the best way to solve this problem is to + not overload on pointer-vs-integer types to begin with. He also + offers a way to make your own magic NULL that will match pointers + before it matches integers: +

+
+   const                             // this is a const object...
+   class {
+   public:
+     template<class T>               // convertible to any type
+       operator T*() const           // of null non-member
+       { return 0; }                 // pointer...
+
+     template<class C, class T>      // or any type of null
+       operator T C::*() const       // member pointer...
+       { return 0; }
+
+   private:
+     void operator&() const;         // whose address can't be
+                                     // taken (see Item 27)...
+
+   } NULL;                           // and whose name is NULL
+   
+

(Cribbed from the published version of + the + Effective C++ CD, reproduced here with permission.) +

+

If you aren't using g++ (why?), but you do have a compiler which + supports member function templates, then you can use this definition + of NULL (be sure to #undef any existing versions). It only helps if + you actually use NULL in function calls, though; if you make a call of + foo(0); instead of foo(NULL);, then you're back + where you started. +

+

Added Note: When we contacted Dr. Meyers to ask + permission to + print this stuff, it prompted him to run this code through current + compilers to see what the state of the art is with respect to member + template functions. He posted + + an article to Usenet after discovering that the code above is not + valid! Even though it has no data members, it still needs a + user-defined constructor (which means that the class needs a type name + after all). The ctor can have an empty body; it just needs to be + there. (Stupid requirement? We think so too, and this will probably + be changed in the language itself.) +

+

Return to top of page or + to the FAQ. +

+ +
+

Implementation properties

+

<limits>

+

This header mainly defines traits classes to give access to various + implementation defined-aspects of the fundamental types. The + traits classes -- fourteen in total -- are all specializations of the + template class numeric_limits, documented + here + and defined as follows: +

+
+   template<typename T> struct class {
+      static const bool is_specialized;
+      static T max() throw();
+      static T min() throw();
+
+      static const int digits;
+      static const int digits10;
+      static const bool is_signed;
+      static const bool is_integer;
+      static const bool is_exact;
+      static const int radix;
+      static T epsilon() throw();
+      static T round_error() throw();
+
+      static const int min_exponent;
+      static const int min_exponent10;
+      static const int max_exponent;
+      static const int max_exponent10;
+
+      static const bool has_infinity;
+      static const bool has_quiet_NaN;
+      static const bool has_signaling_NaN;
+      static const float_denorm_style has_denorm;
+      static const bool has_denorm_loss;
+      static T infinity() throw();
+      static T quiet_NaN() throw();
+      static T denorm_min() throw();
+
+      static const bool is_iec559;
+      static const bool is_bounded;
+      static const bool is_modulo;
+
+      static const bool traps;
+      static const bool tinyness_before;
+      static const float_round_style round_style;
+   };
+

Return to top of page or + to the FAQ. +

+ +
+

Start and Termination

+

Not many changes here to <cstdlib> (the old stdlib.h). + You should note that the abort() function does not call + the destructors of automatic nor static objects, so if you're depending + on those to do cleanup, it isn't going to happen. (The functions + registered with atexit() don't get called either, so you + can forget about that possibility, too.) +

+

The good old exit() function can be a bit funky, too, until + you look closer. Basically, three points to remember are: +

+
    +
  1. Static objects are destroyed in reverse order of their creation. +
  2. +
  3. Functions registered with atexit() are called in + reverse order of registration, once per registration call. + (This isn't actually new.) +
  4. +
  5. The previous two actions are "interleaved," that is, + given this pseudocode: +
    +              extern "C or C++" void  f1 (void);
    +              extern "C or C++" void  f2 (void);
    +
    +              static Thing obj1;
    +              atexit(f1);
    +              static Thing obj2;
    +              atexit(f2);
    +            
    + then at a call of exit(), f2 will be called, then + obj2 will be destroyed, then f1 will be called, and finally obj1 + will be destroyed. If f1 or f2 allow an exception to propagate + out of them, Bad Things happen. +
  6. +
+

Note also that atexit() is only required to store 32 + functions, and the compiler/library might already be using some of + those slots. If you think you may run out, we recommend using + the xatexit/xexit combination from libiberty, which has no such limit. +

+

Return to top of page or + to the FAQ. +

+ +
+

Verbose terminate

+

If you are having difficulty with uncaught exceptions and want a + little bit of help debugging the causes of the core dumps, you can + make use of a GNU extension in GCC 3.1 and later: +

+
+   #include <exception>
+
+   int main()
+   {
+       std::set_terminate(__gnu_cxx::__verbose_terminate_handler);
+       ...
+
+       throw anything;
+   }
+

The __verbose_terminate_handler function obtains the name + of the current exception, attempts to demangle it, and prints it to + stderr. If the exception is derived from std::exception + then the output from what() will be included. +

+

Any replacement termination function is required to kill the program + without returning; this one calls abort. +

+

For example: +

+
+   #include <exception>
+   #include <stdexcept>
+
+   struct argument_error : public std::runtime_error
+   {  
+     argument_error(const std::string& s): std::runtime_error(s) { }
+   };
+
+   int main(int argc)
+   {
+     std::set_terminate(__gnu_cxx::__verbose_terminate_handler);
+     if (argc > 5)
+       throw argument_error("argc is greater than 5!");
+     else
+       throw argc;
+   }
+   
+

In GCC 3.1 and later, this gives +

+
+   % ./a.out
+   terminate called after throwing a `int'
+   Aborted
+   % ./a.out f f f f f f f f f f f
+   terminate called after throwing an instance of `argument_error'
+   what(): argc is greater than 5!
+   Aborted
+   %
+

The 'Aborted' line comes from the call to abort(), of course. +

+

UPDATE: Starting with GCC 3.4, this is the default + termination handler; nothing need be done to use it. To go back to + the previous "silent death" method, simply include + <exception> and <cstdlib>, + and call +

+
+       std::set_terminate(std::abort);
+ +

+ This function will attempt to write to stderr. If your application + closes stderr or redirects it to an inappropriate location, + __verbose_terminate_handler will behave in an + unspecified manner. +

+ +

Return to top of page or + to the FAQ. +

+ + +
+

Dynamic memory management

+

There are six flavors each of new and + delete, so make certain that you're using the right + ones! Here are quickie descriptions of new: +

+
    +
  • single object form, throwing a bad_alloc on errors; + this is what most people are used to using
  • +
  • single object "nothrow" form, returning NULL on errors
  • +
  • array new, throwing bad_alloc on errors
  • +
  • array nothrow new, returning NULL on errors
  • +
  • placement new, which does nothing (like it's supposed to)
  • +
  • placement array new, which also does nothing
  • +
+

They are distinguished by the parameters that you pass to them, like + any other overloaded function. The six flavors of delete + are distinguished the same way, but none of them are allowed to throw + an exception under any circumstances anyhow. (They match up for + completeness' sake.) +

+

Remember that it is perfectly okay to call delete on a + NULL pointer! Nothing happens, by definition. That is not the + same thing as deleting a pointer twice. +

+

By default, if one of the "throwing news" can't + allocate the memory requested, it tosses an instance of a + bad_alloc exception (or, technically, some class derived + from it). You can change this by writing your own function (called a + new-handler) and then registering it with set_new_handler(): +

+
+   typedef void (*PFV)(void);
+
+   static char*  safety;
+   static PFV    old_handler;
+
+   void my_new_handler ()
+   {
+       delete[] safety;
+       popup_window ("Dude, you are running low on heap memory.  You
+                      should, like, close some windows, or something.
+                      The next time you run out, we're gonna burn!");
+       set_new_handler (old_handler);
+       return;
+   }
+
+   int main ()
+   {
+       safety = new char[500000];
+       old_handler = set_new_handler (&my_new_handler);
+       ...
+   }
+   
+

bad_alloc is derived from the base exception + class defined in Chapter 19. +

+

Return to top of page or + to the FAQ. +

+ +
+

RTTI, the ABI, and demangling

+

If you have read the source + documentation for namespace abi then you are aware + of the cross-vendor C++ ABI which we use. One of the exposed + functions is the one which we use for demangling in programs like + c++filt, and you can use it yourself as well. +

+

(The function itself might use different demanglers, but that's the + whole point of abstract interfaces. If we change the implementation, + you won't notice.) +

+

Probably the only times you'll be interested in demangling at runtime + are when you're seeing typeid strings in RTTI, or when + you're handling the runtime-support exception classes. For example: +

+
+#include <exception>
+#include <iostream>
+#include <cxxabi.h>
+
+struct empty { };
+
+template <typename T, int N>
+  struct bar { };
+
+
+int main()
+{
+  int     status;
+  char   *realname;
+
+  // exception classes not in <stdexcept>, thrown by the implementation
+  // instead of the user
+  std::bad_exception  e;
+  realname = abi::__cxa_demangle(e.what(), 0, 0, &status);
+  std::cout << e.what() << "\t=> " << realname << "\t: " << status << '\n';
+  free(realname);
+
+
+  // typeid
+  bar<empty,17>          u;
+  const std::type_info  &ti = typeid(u);
+
+  realname = abi::__cxa_demangle(ti.name(), 0, 0, &status);
+  std::cout << ti.name() << "\t=> " << realname << "\t: " << status << '\n';
+  free(realname);
+
+  return 0;
+}
+

With GCC 3.1 and later, this prints +

+
+      St13bad_exception       => std::bad_exception   : 0
+      3barI5emptyLi17EE       => bar<empty, 17>       : 0 
+

The demangler interface is described in the source documentation + linked to above. It is actually written in C, so you don't need to + be writing C++ in order to demangle C++. (That also means we have to + use crummy memory management facilities, so don't forget to free() + the returned char array.) +

+

Return to top of page or + to the FAQ. +

+ + + + +
+

+See license.html for copying conditions. +Comments and suggestions are welcome, and may be sent to +the libstdc++ mailing list. +

+ + + + diff --git a/libstdc++-v3/doc/html/19_diagnostics/howto.html b/libstdc++-v3/doc/html/19_diagnostics/howto.html new file mode 100644 index 00000000000..90a60b3bca5 --- /dev/null +++ b/libstdc++-v3/doc/html/19_diagnostics/howto.html @@ -0,0 +1,127 @@ + + + + + + + + + + + libstdc++ HOWTO: Chapter 19: Diagnostics + + + + + + + + + +

Chapter 19: Diagnostics

+ +

Chapter 19 deals with program diagnostics, such as exceptions + and assertions. You know, all the things we wish weren't even + necessary at all. +

+ + + +
+

Contents

+ + +
+ + + +

Adding data to exceptions

+

The standard exception classes carry with them a single string as + data (usually describing what went wrong or where the 'throw' took + place). It's good to remember that you can add your own data to + these exceptions when extending the hierarchy: +

+
+   struct My_Exception : public std::runtime_error
+   {
+     public:
+       My_Exception (const string& whatarg)
+           : std::runtime_error(whatarg), e(errno), id(GetDataBaseID()) { }
+       int  errno_at_time_of_throw() const { return e; }
+       DBID id_of_thing_that_threw() const { return id; }
+     protected:
+       int    e;
+       DBID   id;     // some user-defined type
+   };
+   
+

Return to top of page or + to the FAQ. +

+ +
+

Concept checkers -- new and improved!

+

Better taste! Less fat! Literally!

+

In 1999, SGI added concept checkers to their implementation + of the STL: code which checked the template parameters of + instantiated pieces of the STL, in order to insure that the parameters + being used met the requirements of the standard. For example, + the Standard requires that types passed as template parameters to + vector be "Assignable" (which means what you think + it means). The checking was done during compilation, and none of + the code was executed at runtime. +

+

Unfortunately, the size of the compiler files grew significantly + as a result. The checking code itself was cumbersome. And bugs + were found in it on more than one occasion. +

+

The primary author of the checking code, Jeremy Siek, had already + started work on a replacement implementation. The new code has been + formally reviewed and accepted into + the + Boost libraries, and we are pleased to incorporate it into the + GNU C++ library. +

+

The new version imposes a much smaller space overhead on the generated + object file. The checks are also cleaner and easier to read and + understand. +

+

They are off by default for all versions of GCC from 3.0 to 3.4 (the + latest release at the time of writing). + They can be enabled at configure time with + --enable-concept-checks. + You can enable them on a per-translation-unit basis with + #define _GLIBCXX_CONCEPT_CHECKS for GCC 3.4 and higher + (or with #define _GLIBCPP_CONCEPT_CHECKS for versions + 3.1, 3.2 and 3.3). +

+ +

Please note that the upcoming C++ standard has first-class + support for template parameter constraints based on concepts in the core + language. This will obviate the need for the library-simulated concept + checking described above. +

+ +

Return to top of page or + to the FAQ. +

+ + + +
+

+See license.html for copying conditions. +Comments and suggestions are welcome, and may be sent to +the libstdc++ mailing list. +

+ + + + diff --git a/libstdc++-v3/doc/html/20_util/allocator.html b/libstdc++-v3/doc/html/20_util/allocator.html new file mode 100644 index 00000000000..951c12df36d --- /dev/null +++ b/libstdc++-v3/doc/html/20_util/allocator.html @@ -0,0 +1,554 @@ + + + + + + + + + + Allocators and allocation + + + + + + + +

Allocators and allocation

+ +

+ The latest version of this document is always available at + + http://gcc.gnu.org/onlinedocs/libstdc++/20_util/allocator.html. +

+ +

+ To the libstdc++ homepage. +

+ + +
+

The C++ Standard encapsulates memory management characteristics + for strings, container classes, and parts of iostreams in a + template class called std::allocator. This class, and + base classes of it, are the superset of available free store + ("heap") management classes. +

+ +

+ Standard requirements +

+

The C++ standard only gives a few directives in this area: +

+
    +
  • When you add elements to a container, and the container must allocate + more memory to hold them, the container makes the request via its + Allocator template parameter. This includes adding + chars to the string class, which acts as a regular STL container + in this respect. +
  • +
  • The default Allocator of every container-of-T is + std::allocator<T>. +
  • +
  • The interface of the allocator<T> class is + extremely simple. It has about 20 public declarations (nested + typedefs, member functions, etc), but the two which concern us most + are: +
    +      T*    allocate   (size_type n, const void* hint = 0);
    +      void  deallocate (T* p, size_type n);
    + (This is a simplification; the real signatures use nested typedefs.) + The "n" arguments in both those functions is a + count of the number of T's to allocate space for, + not their total size. +
  • +
  • "The storage is obtained by calling + ::operator new(size_t), but it is unspecified when or + how often this function is called. The use of hint + is unspecified, but intended as an aid to locality if an + implementation so desires." [20.4.1.1]/6 +
  • +
+ +

Complete details cam be found in the C++ standard, look in + [20.4 Memory]. +

+ +

+ Problems and Possibilities +

+

The easiest way of fulfilling the requirements is to call operator new + each time a container needs memory, and to call operator delete each + time the container releases memory. This method may be + slower + than caching the allocations and re-using previously-allocated + memory, but has the advantage of working correctly across a wide + variety of hardware and operating systems, including large + clusters. The __gnu_cxx::new_allocator implements + the simple operator new and operator delete semantics, while __gnu_cxx::malloc_allocator implements much the same thing, only with the C language functions std::malloc and std::free. +

+ +

Another approach is to use intelligence within the allocator class +to cache allocations. This extra machinery can take a variety of +forms: a bitmap index, an index into an exponentially increasing +power-of-two-sized buckets, or simpler fixed-size pooling cache. The +cache is shared among all the containers in the program: when your +program's std::vector<int> gets cut in half and frees a bunch of +its storage, that memory can be reused by the private +std::list<WonkyWidget> brought in from a KDE library that you +linked against. And operators new and delete are not always called to +pass the memory on, either, which is a speed bonus. Examples of +allocators that use these techniques +are __gnu_cxx::bitmap_allocator, __gnu_cxx::pool_allocator, +and __gnu_cxx::__mt_alloc. +

+ +

Depending on the implementation techniques used, the underlying +operating system, and compilation environment, scaling caching +allocators can be tricky. In particular, order-of-destruction and +order-of-creation for memory pools may be difficult to pin down with +certainty, which may create problems when used with plugins or loading +and unloading shared objects in memory. As such, using caching +allocators on systems that do not +support abi::__cxa_atexit is not recommended. +

+ +

Versions of libstdc++ prior to 3.4 cache allocations in a memory + pool, instead of passing through to call the global allocation + operators (ie, __gnu_cxx::pool_allocator). More + recent versions default to the + simpler __gnu_cxx::new_allocator. +

+ +

+ Implementation details of std::allocator +

+

The implementation of std::allocator has continued + to evolve through successive releases. Here's a brief history. +

+ +
+ 3.0, 3.1, 3.2, 3.3 +
+

During this period, all allocators were written to the SGI + style, and all STL containers expected this interface. This + interface had a traits class called _Alloc_traits that + attempted to provide more information for compile-time allocation + selection and optimization. This traits class had another allocator + wrapper, __simple_alloc<T,A>, which was a + wrapper around another allocator, A, which itself is an allocator + for instances of T. But wait, there's more: + __allocator<T,A> is another adapter. Many of + the provided allocator classes were SGI style: such classes can be + changed to a conforming interface with this wrapper: + __allocator<T, __alloc> is thus the same as + allocator<T>. +

+ +

The class std::allocator use the typedef + __alloc to select an underlying allocator that + satisfied memory allocation requests. The selection of this + underlying allocator was not user-configurable. +

+ +
+ 3.4 +
+

For this and later releases, the only allocator interface that + is support is the standard C++ interface. As such, all STL + containers have been adjusted, and all external allocators have + been modified to support this change. Because of this, + __simple_alloc, __allocator, __alloc, and + _Alloc_traits have all been removed. +

+ +

The class std::allocator just has typedef, + constructor, and rebind members. It inherits from one of the + high-speed extension allocators, covered below. Thus, all + allocation and deallocation depends on the base class. +

+ +

The base class that std::allocator is derived from + is not user-configurable. +

+ +
+ How the default allocation strategy is selected. +
+

It's difficult to pick an allocation strategy that will provide + maximum utility, without excessively penalizing some behavior. In + fact, it's difficult just deciding which typical actions to measure + for speed. +

+ +

Three synthetic benchmarks have been created that provide data + that is used to compare different C++ allocators. These tests are: +

+ +
    +
  • Insertion. Over multiple iterations, various STL container + objects have elements inserted to some maximum amount. A variety + of allocators are tested. + Test source for sequence + and associative + containers. +
  • + +
  • Insertion and erasure in a multi-threaded environment. + This test shows the ability of the allocator to reclaim memory + on a pre-thread basis, as well as measuring thread contention + for memory resources. + Test source + here. +
  • + +
  • A threaded producer/consumer model. + Test source for + sequence + and + associative + containers. +
  • +
+ +
+ Disabling memory caching. +
+

In use, std::allocator may allocate and deallocate + using implementation-specified strategies and heuristics. Because of + this, every call to an allocator object's allocate + member function may not actually call the global operator new. This + situation is also duplicated for calls to the + deallocate member function. +

+ +

This can be confusing. +

+ +

In particular, this can make debugging memory errors more + difficult, especially when using third party tools like valgrind or + debug versions of new. +

+ +

There are various ways to solve this problem. One would be to + use a custom allocator that just called operators new + and delete directly, for every + allocation. (See include/ext/new_allocator.h, for instance.) + However, that option would involve changing source code to use the a + non-default allocator. Another option is to force the default + allocator to remove caching and pools, and to directly allocate + with every call of allocate and directly deallocate + with every call of deallocate, regardless of + efficiency. As it turns out, this last option is available, + although the exact mechanism has evolved with time. +

+ +

For GCC releases from 2.95 through the 3.1 series, defining + __USE_MALLOC on the gcc command line would change the + default allocation strategy to instead use malloc and + free. See + this note + for details as to why this was something needing improvement. +

+ +

Starting with GCC 3.2, and continued in the 3.3 series, to + globally disable memory caching within the library for the + default allocator, merely set GLIBCPP_FORCE_NEW (at this time, + with any value) in the system's environment before running the + program. If your program crashes with GLIBCPP_FORCE_NEW in the + environment, it likely means that you linked against objects + built against the older library. Code to support this extension + is fully compatible with 3.2 code if GLIBCPP_FORCE_NEW is not in + the environment. +

+ +

As it turns out, the 3.4 code base continues to use this + mechanism, only the environment variable has been changed to + GLIBCXX_FORCE_NEW. +

+ +

+ Other allocators +

+

Several other allocators are provided as part of this + implementation. The location of the extension allocators and their + names have changed, but in all cases, functionality is + equivalent. Starting with gcc-3.4, all extension allocators are + standard style. Before this point, SGI style was the norm. Because of + this, the number of template arguments also changed. Here's a simple + chart to track the changes. +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Allocator (3.4)Header (3.4)Allocator (3.[0-3])Header (3.[0-3])
__gnu_cxx::new_allocator<T><ext/new_allocator.h>std::__new_alloc<memory>
__gnu_cxx::malloc_allocator<T><ext/malloc_allocator.h>std::__malloc_alloc_template<int><memory>
__gnu_cxx::debug_allocator<T><ext/debug_allocator.h>std::debug_alloc<T><memory>
__gnu_cxx::__pool_alloc<T><ext/pool_allocator.h>std::__default_alloc_template<bool,int><memory>
__gnu_cxx::__mt_alloc<T><ext/mt_allocator.h>
__gnu_cxx::bitmap_allocator<T><ext/bitmap_allocator.h>
+ +

Releases after gcc-3.4 have continued to add to the collection + of available allocators. All of these new allocators are + standard-style. The following table includes details, along with + the first released version of GCC that included the extension allocator. +

+ + + + + + + + + + + + + + + + + +
AllocatorIncludeVersion
__gnu_cxx::array_allocator<T><ext/array_allocator.h>4.0.0
__gnu_cxx::throw_allocator<T><ext/throw_allocator.h>4.2.0
+ +

More details on each of these extension allocators follows.

+
    +
  • new_allocator +

    Simply wraps ::operator new + and ::operator delete. +

    +
  • +
  • malloc_allocator +

    Simply wraps + malloc and free. There is also a hook + for an out-of-memory handler (for new/delete this is taken care of + elsewhere). +

    +
  • +
  • array_allocator +

    Allows allocations of known and fixed sizes using existing + global or external storage allocated via construction of + std::tr1::array objects. By using this allocator, fixed size + containers (including std::string) can be used without + instances calling ::operator new and + ::operator delete. This capability allows the + use of STL abstractions without runtime complications or + overhead, even in situations such as program startup. For + usage examples, please consult the libstdc++ testsuite. +

    +
  • +
  • debug_allocator +

    A wrapper around an + arbitrary allocator A. It passes on slightly increased size + requests to A, and uses the extra memory to store size information. + When a pointer is passed to deallocate(), the stored + size is checked, and assert() is used to guarantee they match. +

    +
  • +
  • throw_allocator +

    Includes memory tracking and marking abilities as well as hooks for + throwing exceptinos at configurable intervals (including random, + all, none). +

    +
  • +
  • __pool_alloc +

    A high-performance, single pool allocator. The reusable + memory is shared among identical instantiations of this type. + It calls through ::operator new to obtain new memory + when its lists run out. If a client container requests a block + larger than a certain threshold size, then the pool is bypassed, + and the allocate/deallocate request is passed to + ::operator new directly.

    + +

    For versions of __pool_alloc after 3.4.0, there is + only one template parameter, as per the standard. +

    + +

    Older versions of this class take a boolean template parameter, + called thr, and an integer template parameter, + called inst. +

    + +

    The inst number is used to track additional memory + pools. The point of the number is to allow multiple + instantiations of the classes without changing the semantics at + all. All three of +

    + +
    +    typedef  __pool_alloc<true,0>    normal;
    +    typedef  __pool_alloc<true,1>    private;
    +    typedef  __pool_alloc<true,42>   also_private;
    +

    behave exactly the same way. However, the memory pool for each type + (and remember that different instantiations result in different types) + remains separate. +

    +

    The library uses 0 in all its instantiations. If you + wish to keep separate free lists for a particular purpose, use a + different number. +

    +

    The thr boolean determines whether the pool should + be manipulated atomically or not. When thr=true, the allocator + is is threadsafe, while thr=false, and is slightly faster but + unsafe for multiple threads. +

    + +

    For thread-enabled configurations, the pool is locked with a + single big lock. In some situations, this implementation detail may + result in severe performance degredation. +

    + +

    (Note that the GCC thread abstraction layer allows us to provide safe + zero-overhead stubs for the threading routines, if threads were + disabled at configuration time.) +

    + +
  • + +
  • __mt_alloc +

    A high-performance + fixed-size allocator. It has its own documentation, found here. +

    +
  • + +
  • bitmap_allocator +

    A high-performance allocator that uses a bit-map to keep track + of the used and unused memory locations. It has its own + documentation, found here. +

    +
  • +
+ + +

+ Using a specific allocator +

+

You can specify different memory management schemes on a + per-container basis, by overriding the default + Allocator template parameter. For example, an easy + (but non-portable) method of specifying that only malloc/free + should be used instead of the default node allocator is: +

+
+    std::list <int, __gnu_cxx::malloc_allocator<int> >  malloc_list;
+ Likewise, a debugging form of whichever allocator is currently in use: +
+    std::deque <int, __gnu_cxx::debug_allocator<std::allocator<int> > >  debug_deque;
+ + +

+ Writing custom allocators +

+

Writing a portable C++ allocator would dictate that the + interface would look much like the one specified for + std::allocator. Additional member functions, but not + subtractions, would be permissible. +

+ +

Probably the best place to start would be to copy one of the + extension allocators already shipped with libstdc++: say, + new_allocator . +

+ + +

+ Bibliography / Further Reading +

+

+ ISO/IEC 14882:1998 Programming languages - C++ [20.4 Memory] +

+ +

+ Austern, Matt, C/C++ Users Journal. + The Standard Librarian: What Are Allocators Good + For? +

+ +

+ Berger, Emery, + The Hoard memory allocator +

+ +

+ Berger, Emery with Ben Zorn & Kathryn McKinley, OOPSLA 2002 + Reconsidering Custom Memory Allocation +

+ +

+ Kreft, Klaus and Angelika Langer, C++ Report, June 1998 + Allocator Types +

+ +

+ Stroustrup, Bjarne, 19.4 Allocators, The C++ Programming + Language, Special Edition, Addison Wesley, Inc. 2000 +

+ +

+ Yen, Felix, Yalloc: A Recycling C++ Allocator +

+ +
+

Return to the top of the page or + to the libstdc++ homepage. +

+ + + + +
+

+See license.html for copying conditions. +Comments and suggestions are welcome, and may be sent to +the libstdc++ mailing list. +

+ + + + diff --git a/libstdc++-v3/doc/html/20_util/howto.html b/libstdc++-v3/doc/html/20_util/howto.html new file mode 100644 index 00000000000..fb02aa169fb --- /dev/null +++ b/libstdc++-v3/doc/html/20_util/howto.html @@ -0,0 +1,234 @@ + + + + + + + + + + + libstdc++ HOWTO: Chapter 20: General Utilities + + + + + + + + + + +

Chapter 20: General Utilities

+ +

Chapter 20 deals with utility classes and functions, such as + the oft-debated auto_ptr<>. +

+ + + +
+

Contents

+ + +
+ + + +

auto_ptr is not omnipotent

+

I'm not going to try and explain all of the fun and delicious + things that can happen with misuse of the auto_ptr class template + (called AP here), nor am I going to try and teach you how to use + AP safely in the presence of copying. The AP class is a really + nifty idea for a smart pointer, but it is one of the dumbest of + all the smart pointers -- and that's fine. +

+

AP is not meant to be a supersmart solution to all resource + leaks everywhere. Neither is it meant to be an effective form + of garbage collection (although it can help, a little bit). + And it can not be used for arrays! +

+

AP is meant to prevent nasty leaks in the presence of + exceptions. That's all. This code is AP-friendly: +

+
+    // not a recommend naming scheme, but good for web-based FAQs
+    typedef std::auto_ptr<MyClass>  APMC;
+
+    extern function_taking_MyClass_pointer (MyClass*);
+    extern some_throwable_function ();
+
+    void func (int data)
+    {
+        APMC  ap (new MyClass(data));
+
+        some_throwable_function();   // this will throw an exception
+
+        function_taking_MyClass_pointer (ap.get());
+    }
+   
+

When an exception gets thrown, the instance of MyClass that's + been created on the heap will be delete'd as the stack is + unwound past func(). +

+

Changing that code as follows is not AP-friendly: +

+
+        APMC  ap (new MyClass[22]);
+   
+

You will get the same problems as you would without the use + of AP: +

+
+        char*  array = new char[10];       // array new...
+        ...
+        delete array;                      // ...but single-object delete
+   
+

AP cannot tell whether the pointer you've passed at creation points + to one or many things. If it points to many things, you are about + to die. AP is trivial to write, however, so you could write your + own auto_array_ptr for that situation (in fact, this has + been done many times; check the mailing lists, Usenet, Boost, etc). +

+

Return to top of page or + to the FAQ. +

+ +
+

auto_ptr inside container classes

+

All of the containers + described in the standard library require their contained types + to have, among other things, a copy constructor like this: +

+
+    struct My_Type
+    {
+        My_Type (My_Type const&);
+    };
+   
+

Note the const keyword; the object being copied shouldn't change. + The template class auto_ptr (called AP here) does not + meet this requirement. Creating a new AP by copying an existing + one transfers ownership of the pointed-to object, which means that + the AP being copied must change, which in turn means that the + copy ctors of AP do not take const objects. +

+

The resulting rule is simple: Never ever use a container of + auto_ptr objects. The standard says that "undefined" + behavior is the result, but it is guaranteed to be messy. +

+

To prevent you from doing this to yourself, the + concept checks built + in to this implementation will issue an error if you try to + compile code like this: +

+
+    #include <vector>
+    #include <memory>
+    
+    void f()
+    {
+        std::vector< std::auto_ptr<int> >   vec_ap_int;
+    }
+   
+

Should you try this with the checks enabled, you will see an error. +

+

Return to top of page or + to the FAQ. +

+ +
+

Functors

+

If you don't know what functors are, you're not alone. Many people + get slightly the wrong idea. In the interest of not reinventing + the wheel, we will refer you to the introduction to the functor + concept written by SGI as part of their STL, in + their + http://www.sgi.com/tech/stl/functors.html. +

+

Return to top of page or + to the FAQ. +

+ +
+

Pairs

+

The pair<T1,T2> is a simple and handy way to + carry around a pair of objects. One is of type T1, and another of + type T2; they may be the same type, but you don't get anything + extra if they are. The two members can be accessed directly, as + .first and .second. +

+

Construction is simple. The default ctor initializes each member + with its respective default ctor. The other simple ctor, +

+
+    pair (const T1& x, const T2& y);
+   
+

does what you think it does, first getting x + and second getting y. +

+

There is a copy constructor, but it requires that your compiler + handle member function templates: +

+
+    template <class U, class V> pair (const pair<U,V>& p);
+   
+

The compiler will convert as necessary from U to T1 and from + V to T2 in order to perform the respective initializations. +

+

The comparison operators are done for you. Equality + of two pair<T1,T2>s is defined as both first + members comparing equal and both second members comparing + equal; this simply delegates responsibility to the respective + operator== functions (for types like MyClass) or builtin + comparisons (for types like int, char, etc). +

+

+ The less-than operator is a bit odd the first time you see it. It + is defined as evaluating to: + +

+
+    x.first  <  y.first  ||
+        ( !(y.first  <  x.first)  &&  x.second  <  y.second )
+   
+

The other operators are not defined using the rel_ops + functions above, but their semantics are the same. +

+

Finally, there is a template function called make_pair + that takes two references-to-const objects and returns an + instance of a pair instantiated on their respective types: +

+
+    pair<int,MyClass> p = make_pair(4,myobject);
+   
+ +

Return to top of page or + to the FAQ. +

+ + + + +
+

+See license.html for copying conditions. +Comments and suggestions are welcome, and may be sent to +the libstdc++ mailing list. +

+ + + + diff --git a/libstdc++-v3/doc/html/20_util/shared_ptr.html b/libstdc++-v3/doc/html/20_util/shared_ptr.html new file mode 100644 index 00000000000..6df2e6de635 --- /dev/null +++ b/libstdc++-v3/doc/html/20_util/shared_ptr.html @@ -0,0 +1,419 @@ + + + + + + + + + Notes on the shared_ptr implementation. + + + + + + + +

+Notes on the shared_ptr implementation. +

+ +prepared by Jonathan Wakely on November 11, 2007 + + +

+1. Abstract +

+

+The shared_ptr class template stores a pointer, usually obtained via new, +and implements shared ownership semantics. +

+ +

+2. What the standard says +

+ +
+20.6.6.2 - Class template shared_ptr [util.smartptr.shared] +
+ +

+The standard deliberately doesn't require a reference-counted implementation, +allowing other techniques such as a circular-linked-list. +

+ +

+At the time of writing the C++0x working paper doesn't mention how threads +affect shared_ptr, but it is likely to follow the existing practice set by +boost::shared_ptr. The shared_ptr in libstdc++ is derived +from Boost's, so the same rules apply. +

+ +

+3. Problems with shared_ptr: TR1 vs C++0x, thread safety. +

+ +

+The interface of tr1::shared_ptr was extended for C++0x with +support for rvalue-references and the other features from N2351. As +with other libstdc++ headers shared by TR1 and C++0x, boost_shared_ptr.h +uses conditional compilation, based on the macros _GLIBCXX_INCLUDE_AS_CXX0X +and _GLIBCXX_INCLUDE_AS_TR1, to enable and disable features. +

+ +

+C++0x-only features are: rvalue-ref/move support, allocator support, +aliasing constructor, make_shared & allocate_shared. Additionally, the +constructors taking auto_ptr parameters are deprecated in C++0x mode. +

+ +

+The +Thread +Safety section of the Boost shared_ptr documentation says "shared_ptr +objects offer the same level of thread safety as built-in types." +The implementation must ensure that concurrent updates to separate shared_ptr +instances are correct even when those instances share a reference count e.g. +

+
+shared_ptr<A> a(new A);
+shared_ptr<A> b(a);
+
+// Thread 1     // Thread 2
+   a.reset();      b.reset();
+
+

+The dynamically-allocated object must be destroyed by exactly one of the +threads. Weak references make things even more interesting. +The shared state used to implement shared_ptr must be transparent to the +user and invariants must be preserved at all times. +The key pieces of shared state are the strong and weak reference counts. +Updates to these need to be atomic and visible to all threads to ensure +correct cleanup of the managed resource (which is, after all, shared_ptr's +job!) +On multi-processor systems memory synchronisation may be needed so that +reference-count updates and the destruction of the managed resource are +race-free. +

+ +

+The function _Sp_counted_base::_M_add_ref_lock(), called when +obtaining a shared_ptr from a weak_ptr, has to test if the managed +resource still exists and either increment the reference count or throw +std::bad_weak_ptr. +In a multi-threaded program there is a potential race condition if the last +reference is dropped (and the managed resource destroyed) between testing +the reference count and incrementing it, which could result in a shared_ptr +pointing to invalid memory. +

+

+The Boost shared_ptr (as used in GCC) features a clever lock-free algorithm +to avoid the race condition, but this relies on the processor supporting +an atomic Compare-And-Swap instruction. For other platforms there +are fall-backs using mutex locks. Boost (as of version 1.35) includes +several different implementations and the preprocessor selects one based +on the compiler, standard library, platform etc. For the version of +shared_ptr in libstdc++ the compiler and library are fixed, which makes +things much simpler: we have an atomic CAS or we don't, see Lock Policy +below for details. +

+ +

+4. Design and Implementation Details +

+ +

+The shared_ptr code in libstdc++ was kindly donated to GCC by the Boost +project and the original authors of the code. The basic design and +algorithms are from Boost, the notes below describe details specific to +the GCC implementation. Names have been uglified in this implementation, +but the design should be recognisable to anyone familiar with the Boost +1.32 shared_ptr. +

+ +

+The basic design is an abstract base class, _Sp_counted_base that +does the reference-counting and calls virtual functions when the count +drops to zero. +Derived classes override those functions to destroy resources in a context +where the correct dynamic type is known. This is an application of the +technique known as type erasure. +

+ +

+C++0x and TR1 Implementations +

+ +

+The classes derived from _Sp_counted_base (see Class Hierarchy +below) and __shared_count are implemented separately for C++0x +and TR1, in bits/boost_sp_shared_count.h and +tr1/boost_sp_shared_count.h respectively. All other classes +including _Sp_counted_base are shared by both implementations. +

+ +

+The TR1 implementation is considered relatively stable, so is unlikely to +change unless bug fixes require it to. If the code that is common to both +C++0x and TR1 modes needs to diverge further then it might be necessary to +duplicate additional classes and only make changes to the C++0x versions. +

+ +

+Lock Policy +

+ +

+Libstdc++ has a single _Sp_counted_base class, which is a +template parameterized on the enum __gnu_cxx::_Lock_policy. +The entire family of classes is parameterized on the lock policy, right up +to __shared_ptr, __weak_ptr and +__enable_shared_from_this. The actual +std::shared_ptr class inherits from __shared_ptr +with the lock policy parameter selected automatically based on the thread +model and platform that libstdc++ is configured for, so that the best +available template specialization will be used. This design is necessary +because it would not be conforming for std::shared_ptr to have +an extra template parameter, even if it had a default value. +The available policies are: +

+ +
+
_S_Atomic
+
+Selected when GCC supports a builtin atomic compare-and-swap +operation on the target processor (see +Atomic +Builtins.) +The reference counts are maintained using a lock-free algorithm and GCC's +atomic builtins, which provide the required memory synchronisation. +
+
_S_Mutex
+
+The _Sp_counted_base specialization for this policy contains a mutex, +which is locked in add_ref_lock(). This policy is used when GCC's atomic +builtins aren't available so explicit memory barriers are needed in places. +
+
_S_Single
+
+This policy uses a non-reentrant add_ref_lock() with no locking. It is +used when libstdc++ is built without --enable-threads. +
+
+ +

+For all three policies, reference count increments and decrements are done +via the functions in <ext/atomicity.h>, which detect if the +program is multi-threaded. +If only one thread of execution exists in the program then less expensive +non-atomic operations are used. +

+ +

+Class Hierarchy +

+ +

+A shared_ptr<T> contains a pointer of type T* +and an object of type __shared_count. The shared_count contains +a pointer of type _Sp_counted_base* which points to the object +that maintains the reference-counts and destroys the managed resource. +

+ +
+
_Sp_counted_base<Lp>
+
+The base of the hierarchy is parameterized on the lock policy alone. +_Sp_counted_base doesn't depend on the type of pointer being managed, +it only maintains the reference counts and calls virtual functions when +the counts drop to zero. The managed object is destroyed when the last +strong reference is dropped, but the _Sp_counted_base itself must exist +until the last weak reference is dropped. +
+
_Sp_counted_base_impl<Ptr, Deleter, Lp>
+
+Inherits from _Sp_counted_base and stores a pointer of type Ptr +and a deleter of type Deleter. _Sp_deleter is +used when the user doesn't supply a custom deleter. Unlike Boost's, this +default deleter is not "checked" because GCC already issues a warning if +delete is used with an incomplete type. +This is the only derived type used by tr1::shared_ptr<Ptr> +and it is never used by std::shared_ptr, which uses one of +the following types, depending on how the shared_ptr is constructed. +
+
_Sp_counted_ptr<Ptr, Lp>
+
+Inherits from _Sp_counted_base and stores a pointer of type Ptr, +which is passed to delete when the last reference is dropped. +This is the simplest form and is used when there is no custom deleter or +allocator. +
+
_Sp_counted_deleter<Ptr, Deleter, Alloc>
+
+Inherits from _Sp_counted_ptr and adds support for custom deleter and +allocator. Empty Base Optimization is used for the allocator. This class +is used even when the user only provides a custom deleter, in which case +std::allocator is used as the allocator. +
+
_Sp_counted_ptr_inplace<Tp, Alloc, Lp>
+
+Used by allocate_shared and make_shared. +Contains aligned storage to hold an object of type Tp, +which is constructed in-place with placement new. +Has a variadic template constructor allowing any number of arguments to +be forwarded to Tp's constructor. +Unlike the other _Sp_counted_* classes, this one is parameterized on the +type of object, not the type of pointer; this is purely a convenience +that simplifies the implementation slightly. +
+
+ +

+Related functions and classes +

+ +
+
dynamic_pointer_cast, static_pointer_cast, +const_pointer_cast
+
+As noted in N2351, these functions can be implemented non-intrusively using +the alias constructor. However the aliasing constructor is only available +in C++0x mode, so in TR1 mode these casts rely on three non-standard +constructors in shared_ptr and __shared_ptr. +In C++0x mode these constructors and the related tag types are not needed. +
+
enable_shared_from_this
+
+The clever overload to detect a base class of type +enable_shared_from_this comes straight from Boost. +There is an extra overload for __enable_shared_from_this to +work smoothly with __shared_ptr<Tp, Lp> using any lock +policy. +
+
make_shared, allocate_shared
+
+make_shared simply forwards to allocate_shared +with std::allocator as the allocator. +Although these functions can be implemented non-intrusively using the +alias constructor, if they have access to the implementation then it is +possible to save storage and reduce the number of heap allocations. The +newly constructed object and the _Sp_counted_* can be allocated in a single +block and the standard says implementations are "encouraged, but not required," +to do so. This implementation provides additional non-standard constructors +(selected with the type _Sp_make_shared_tag) which create an +object of type _Sp_counted_ptr_inplace to hold the new object. +The returned shared_ptr<A> needs to know the address of the +new A object embedded in the _Sp_counted_ptr_inplace, +but it has no way to access it. +This implementation uses a "covert channel" to return the address of the +embedded object when get_deleter<_Sp_make_shared_tag>() +is called. Users should not try to use this. +As well as the extra constructors, this implementation also needs some +members of _Sp_counted_deleter to be protected where they could otherwise +be private. +
+
+ +

+5. Examples +

+ +

+Examples of use can be found in the testsuite, under +testsuite/tr1/2_general_utilities/shared_ptr. +

+ +

+6. Unresolved Issues +

+ +

+The resolution to C++ Standard Library issue 674, +"shared_ptr interface changes for consistency with N1856" will need to be +implemented after it is accepted into the working paper. Issue 743 +might also require changes. +

+ +

+The _S_single policy uses atomics when used in MT code, because it uses +the same dispatcher functions that check __gthread_active_p(). This could be +addressed by providing template specialisations for some members of +_Sp_counted_base<_S_single>. +

+ +

+Unlike Boost, this implementation does not use separate classes for the +pointer+deleter and pointer+deleter+allocator cases in C++0x mode, combining +both into _Sp_counted_deleter and using std::allocator when the user doesn't +specify an allocator. +If it was found to be beneficial an additional class could easily be added. +With the current implementation, the _Sp_counted_deleter and __shared_count +constructors taking a custom deleter but no allocator are technically +redundant and could be removed, changing callers to always specify an +allocator. If a separate pointer+deleter class was added the __shared_count +constructor would be needed, so it has been kept for now. +

+ +

+The hack used to get the address of the managed object from +_Sp_counted_ptr_inplace::_M_get_deleter() is accessible to users. This +could be prevented if get_deleter<_Sp_make_shared_tag>() always +returned NULL, since the hack only needs to work at a lower level, not +in the public API. This wouldn't be difficult, but hasn't been done since +there is no danger of accidental misuse: users already know they are +relying on unsupported features if they refer to implementation details +such as _Sp_make_shared_tag. +

+ +

+tr1::_Sp_deleter could be a private member of tr1::__shared_count but it +would alter the ABI. +

+ +

+Exposing the alias constructor in TR1 mode could simplify the *_pointer_cast +functions. +Constructor could be private in TR1 mode, with the cast functions as friends. +

+ +

+7. Acknowledgments +

+

+The original authors of the Boost shared_ptr, which is really nice code +to work with, Peter Dimov in particular for his help and invaluable advice +on thread safety. +Phillip Jordan and Paolo Carlini for the lock policy implementation. +

+ + +

+8. Bibliography / Referenced Documents +

+ +

+N2351 Improving shared_ptr for C++0x, Revision 2 +http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2351.htm +

+ +

+N2456 C++ Standard Library Active Issues List (Revision R52) +http://open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2456.html

+

+N2461 Working Draft, Standard for Programming Language C++ +http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2461.pdf +

+ +

+Boost C++ Libraries documentation - shared_ptr class template +http://boost.org/libs/smart_ptr/shared_ptr.htm +

+ + + + diff --git a/libstdc++-v3/doc/html/21_strings/gotw29a.txt b/libstdc++-v3/doc/html/21_strings/gotw29a.txt new file mode 100644 index 00000000000..9326604855e --- /dev/null +++ b/libstdc++-v3/doc/html/21_strings/gotw29a.txt @@ -0,0 +1,159 @@ +From: herbs@cntc.com (Herb Sutter) +Subject: Guru of the Week #29: Solution +Date: 22 Jan 1998 00:00:00 GMT +Message-ID: <6a8q26$9qa@netlab.cs.rpi.edu> +Newsgroups: comp.lang.c++.moderated + + + .--------------------------------------------------------------------. + | Guru of the Week problems and solutions are posted regularly on | + | news:comp.lang.c++.moderated. For past problems and solutions | + | see the GotW archive at http://www.cntc.com. | + | Is there a topic you'd like to see covered? mailto:herbs@cntc.com | + `--------------------------------------------------------------------' +_______________________________________________________ + +GotW #29: Strings + +Difficulty: 7 / 10 +_______________________________________________________ + + +>Write a ci_string class which is identical to the +>standard 'string' class, but is case-insensitive in the +>same way as the C function stricmp(): + +The "how can I make a case-insensitive string?" +question is so common that it probably deserves its own +FAQ -- hence this issue of GotW. + +Note 1: The stricmp() case-insensitive string +comparison function is not part of the C standard, but +it is a common extension on many C compilers. + +Note 2: What "case insensitive" actually means depends +entirely on your application and language. For +example, many languages do not have "cases" at all, and +for languages that do you have to decide whether you +want accented characters to compare equal to unaccented +characters, and so on. This GotW provides guidance on +how to implement case-insensitivity for standard +strings in whatever sense applies to your particular +situation. + + +Here's what we want to achieve: + +> ci_string s( "AbCdE" ); +> +> // case insensitive +> assert( s == "abcde" ); +> assert( s == "ABCDE" ); +> +> // still case-preserving, of course +> assert( strcmp( s.c_str(), "AbCdE" ) == 0 ); +> assert( strcmp( s.c_str(), "abcde" ) != 0 ); + +The key here is to understand what a "string" actually +is in standard C++. If you look in your trusty string +header, you'll see something like this: + + typedef basic_string string; + +So string isn't really a class... it's a typedef of a +template. In turn, the basic_string<> template is +declared as follows, in all its glory: + + template, + class Allocator = allocator > + class basic_string; + +So "string" really means "basic_string, allocator >". We don't need +to worry about the allocator part, but the key here is +the char_traits part because char_traits defines how +characters interact and compare(!). + +basic_string supplies useful comparison functions that +let you compare whether a string is equal to another, +less than another, and so on. These string comparisons +functions are built on top of character comparison +functions supplied in the char_traits template. In +particular, the char_traits template supplies character +comparison functions named eq(), ne(), and lt() for +equality, inequality, and less-than comparisons, and +compare() and find() functions to compare and search +sequences of characters. + +If we want these to behave differently, all we have to +do is provide a different char_traits template! Here's +the easiest way: + + struct ci_char_traits : public char_traits + // just inherit all the other functions + // that we don't need to override + { + static bool eq( char c1, char c2 ) { + return tolower(c1) == tolower(c2); + } + + static bool ne( char c1, char c2 ) { + return tolower(c1) != tolower(c2); + } + + static bool lt( char c1, char c2 ) { + return tolower(c1) < tolower(c2); + } + + static int compare( const char* s1, + const char* s2, + size_t n ) { + return strnicmp( s1, s2, n ); + // if available on your compiler, + // otherwise you can roll your own + } + + static const char* + find( const char* s, int n, char a ) { + while( n-- > 0 && tolower(*s) != tolower(a) ) { + ++s; + } + return n >= 0 ? s : 0; + } + }; + +[N.B. A bug in the original code has been fixed for the +GCC documentation, the corrected code was taken from +Herb Sutter's book, Exceptional C++] + +And finally, the key that brings it all together: + + typedef basic_string ci_string; + +All we've done is created a typedef named "ci_string" +which operates exactly like the standard "string", +except that it uses ci_char_traits instead of +char_traits to get its character comparison +rules. Since we've handily made the ci_char_traits +rules case-insensitive, we've made ci_string itself +case-insensitive without any further surgery -- that +is, we have a case-insensitive string without having +touched basic_string at all! + +This GotW should give you a flavour for how the +basic_string template works and how flexible it is in +practice. If you want different comparisons than the +ones stricmp() and tolower() give you, just replace the +five functions shown above with your own code that +performs character comparisons the way that's +appropriate in your particular application. + + + +Exercise for the reader: + +Is it safe to inherit ci_char_traits from +char_traits this way? Why or why not? + + diff --git a/libstdc++-v3/doc/html/21_strings/howto.html b/libstdc++-v3/doc/html/21_strings/howto.html new file mode 100644 index 00000000000..bdc868a02dc --- /dev/null +++ b/libstdc++-v3/doc/html/21_strings/howto.html @@ -0,0 +1,472 @@ + + + + + + + + + + + libstdc++ HOWTO: Chapter 21: Strings + + + + + + + + + +

Chapter 21: Strings

+ +

Chapter 21 deals with the C++ strings library (a welcome relief). +

+ + + +
+

Contents

+ + +
+ + + +

MFC's CString

+

A common lament seen in various newsgroups deals with the Standard + string class as opposed to the Microsoft Foundation Class called + CString. Often programmers realize that a standard portable + answer is better than a proprietary nonportable one, but in porting + their application from a Win32 platform, they discover that they + are relying on special functions offered by the CString class. +

+

Things are not as bad as they seem. In + this + message, Joe Buck points out a few very important things: +

+
    +
  • The Standard string supports all the operations + that CString does, with three exceptions. +
  • +
  • Two of those exceptions (whitespace trimming and case + conversion) are trivial to implement. In fact, we do so + on this page. +
  • +
  • The third is CString::Format, which allows formatting + in the style of sprintf. This deserves some mention: +
  • +
+

+ The old libg++ library had a function called form(), which did much + the same thing. But for a Standard solution, you should use the + stringstream classes. These are the bridge between the iostream + hierarchy and the string class, and they operate with regular + streams seamlessly because they inherit from the iostream + hierarchy. An quick example: + +

+
+   #include <iostream>
+   #include <string>
+   #include <sstream>
+
+   string f (string& incoming)     // incoming is "foo  N"
+   {
+       istringstream   incoming_stream(incoming);
+       string          the_word;
+       int             the_number;
+
+       incoming_stream >> the_word        // extract "foo"
+                       >> the_number;     // extract N
+
+       ostringstream   output_stream;
+       output_stream << "The word was " << the_word
+                     << " and 3*N was " << (3*the_number);
+
+       return output_stream.str();
+   } 
+

A serious problem with CString is a design bug in its memory + allocation. Specifically, quoting from that same message: +

+
+   CString suffers from a common programming error that results in
+   poor performance.  Consider the following code:
+   
+   CString n_copies_of (const CString& foo, unsigned n)
+   {
+           CString tmp;
+           for (unsigned i = 0; i < n; i++)
+                   tmp += foo;
+           return tmp;
+   }
+   
+   This function is O(n^2), not O(n).  The reason is that each +=
+   causes a reallocation and copy of the existing string.  Microsoft
+   applications are full of this kind of thing (quadratic performance
+   on tasks that can be done in linear time) -- on the other hand,
+   we should be thankful, as it's created such a big market for high-end
+   ix86 hardware. :-)
+   
+   If you replace CString with string in the above function, the
+   performance is O(n).
+   
+

Joe Buck also pointed out some other things to keep in mind when + comparing CString and the Standard string class: +

+
    +
  • CString permits access to its internal representation; coders + who exploited that may have problems moving to string. +
  • +
  • Microsoft ships the source to CString (in the files + MFC\SRC\Str{core,ex}.cpp), so you could fix the allocation + bug and rebuild your MFC libraries. + Note: It looks like the CString shipped + with VC++6.0 has fixed this, although it may in fact have been + one of the VC++ SPs that did it. +
  • +
  • string operations like this have O(n) complexity + if the implementors do it correctly. The libstdc++ + implementors did it correctly. Other vendors might not. +
  • +
  • While parts of the SGI STL are used in libstdc++, their + string class is not. The SGI string is essentially + vector<char> and does not do any reference + counting like libstdc++'s does. (It is O(n), though.) + So if you're thinking about SGI's string or rope classes, + you're now looking at four possibilities: CString, the + libstdc++ string, the SGI string, and the SGI rope, and this + is all before any allocator or traits customizations! (More + choices than you can shake a stick at -- want fries with that?) +
  • +
+

Return to top of page or + to the FAQ. +

+ +
+

A case-insensitive string class

+

The well-known-and-if-it-isn't-well-known-it-ought-to-be + Guru of the Week + discussions held on Usenet covered this topic in January of 1998. + Briefly, the challenge was, "write a 'ci_string' class which + is identical to the standard 'string' class, but is + case-insensitive in the same way as the (common but nonstandard) + C function stricmp():" +

+
+   ci_string s( "AbCdE" );
+
+   // case insensitive
+   assert( s == "abcde" );
+   assert( s == "ABCDE" );
+
+   // still case-preserving, of course
+   assert( strcmp( s.c_str(), "AbCdE" ) == 0 );
+   assert( strcmp( s.c_str(), "abcde" ) != 0 ); 
+ +

The solution is surprisingly easy. The original + answer was posted on Usenet, and a revised version appears in + Herb Sutter's book Exceptional C++ and on his website as + GotW 29. +

+

See? Told you it was easy!

+

Added June 2000: The May 2000 issue of C++ Report + contains a fascinating + article by Matt Austern (yes, the Matt Austern) + on why case-insensitive comparisons are not as easy as they seem, + and why creating a class is the wrong way to go about it in + production code. (The GotW answer mentions one of the principle + difficulties; his article mentions more.) +

+

Basically, this is "easy" only if you ignore some things, + things which may be too important to your program to ignore. (I chose + to ignore them when originally writing this entry, and am surprised + that nobody ever called me on it...) The GotW question and answer + remain useful instructional tools, however. +

+

Added September 2000: James Kanze provided a link to a + Unicode + Technical Report discussing case handling, which provides some + very good information. +

+

Return to top of page or + to the FAQ. +

+ +
+

Breaking a C++ string into tokens

+

The Standard C (and C++) function strtok() leaves a lot to + be desired in terms of user-friendliness. It's unintuitive, it + destroys the character string on which it operates, and it requires + you to handle all the memory problems. But it does let the client + code decide what to use to break the string into pieces; it allows + you to choose the "whitespace," so to speak. +

+

A C++ implementation lets us keep the good things and fix those + annoyances. The implementation here is more intuitive (you only + call it once, not in a loop with varying argument), it does not + affect the original string at all, and all the memory allocation + is handled for you. +

+

It's called stringtok, and it's a template function. It's given + in this file in a less-portable form than + it could be, to keep this example simple (for example, see the + comments on what kind of string it will accept). The author uses + a more general (but less readable) form of it for parsing command + strings and the like. If you compiled and ran this code using it: +

+
+   std::list<string>  ls;
+   stringtok (ls, " this  \t is\t\n  a test  ");
+   for (std::list<string>const_iterator i = ls.begin();
+        i != ls.end(); ++i)
+   {
+       std::cerr << ':' << (*i) << ":\n";
+   } 
+

You would see this as output: +

+
+   :this:
+   :is:
+   :a:
+   :test: 
+

with all the whitespace removed. The original s is still + available for use, ls will clean up after itself, and + ls.size() will return how many tokens there were. +

+

As always, there is a price paid here, in that stringtok is not + as fast as strtok. The other benefits usually outweigh that, however. + Another version of stringtok is given + here, suggested by Chris King and tweaked by Petr Prikryl, + and this one uses the + transformation functions mentioned below. If you are comfortable + with reading the new function names, this version is recommended + as an example. +

+

Added February 2001: Mark Wilden pointed out that the + standard std::getline() function can be used with standard + istringstreams to perform + tokenizing as well. Build an istringstream from the input text, + and then use std::getline with varying delimiters (the three-argument + signature) to extract tokens into a string. +

+

Return to top of page or + to the FAQ. +

+ +
+

Simple transformations

+

Here are Standard, simple, and portable ways to perform common + transformations on a string instance, such as "convert + to all upper case." The word transformations is especially + apt, because the standard template function + transform<> is used. +

+

This code will go through some iterations (no pun). Here's the + simplistic version usually seen on Usenet: +

+
+   #include <string>
+   #include <algorithm>
+   #include <cctype>      // old <ctype.h>
+
+   struct ToLower
+   {
+     char operator() (char c) const  { return std::tolower(c); }
+   };
+
+   struct ToUpper
+   {
+     char operator() (char c) const  { return std::toupper(c); }
+   };
+
+   int main()
+   {
+     std::string  s ("Some Kind Of Initial Input Goes Here");
+
+     // Change everything into upper case
+     std::transform (s.begin(), s.end(), s.begin(), ToUpper());
+
+     // Change everything into lower case
+     std::transform (s.begin(), s.end(), s.begin(), ToLower());
+
+     // Change everything back into upper case, but store the
+     // result in a different string
+     std::string  capital_s;
+     capital_s.resize(s.size());
+     std::transform (s.begin(), s.end(), capital_s.begin(), ToUpper());
+   } 
+

Note that these calls all + involve the global C locale through the use of the C functions + toupper/tolower. This is absolutely guaranteed to work -- + but only if the string contains only characters + from the basic source character set, and there are only + 96 of those. Which means that not even all English text can be + represented (certain British spellings, proper names, and so forth). + So, if all your input forevermore consists of only those 96 + characters (hahahahahaha), then you're done. +

+

Note that the + ToUpper and ToLower function objects + are needed because toupper and tolower + are overloaded names (declared in <cctype> and + <locale>) so the template-arguments for + transform<> cannot be deduced, as explained in + this + message. + At minimum, you can write short wrappers like +

+
+   char toLower (char c)
+   {
+      return std::tolower(c);
+   } 
+

The correct method is to use a facet for a particular locale + and call its conversion functions. These are discussed more in + Chapter 22; the specific part is + Correct Transformations, + which shows the final version of this code. (Thanks to James Kanze + for assistance and suggestions on all of this.) +

+

Another common operation is trimming off excess whitespace. Much + like transformations, this task is trivial with the use of string's + find family. These examples are broken into multiple + statements for readability: +

+
+   std::string  str (" \t blah blah blah    \n ");
+
+   // trim leading whitespace
+   string::size_type  notwhite = str.find_first_not_of(" \t\n");
+   str.erase(0,notwhite);
+
+   // trim trailing whitespace
+   notwhite = str.find_last_not_of(" \t\n"); 
+   str.erase(notwhite+1); 
+

Obviously, the calls to find could be inserted directly + into the calls to erase, in case your compiler does not + optimize named temporaries out of existence. +

+

Return to top of page or + to the FAQ. +

+ +
+

Making strings of arbitrary character types

+

The std::basic_string is tantalizingly general, in that + it is parameterized on the type of the characters which it holds. + In theory, you could whip up a Unicode character class and instantiate + std::basic_string<my_unicode_char>, or assuming + that integers are wider than characters on your platform, maybe just + declare variables of type std::basic_string<int>. +

+

That's the theory. Remember however that basic_string has additional + type parameters, which take default arguments based on the character + type (called CharT here): +

+
+      template <typename CharT,
+                typename Traits = char_traits<CharT>,
+                typename Alloc = allocator<CharT> >
+      class basic_string { .... };
+

Now, allocator<CharT> will probably Do The Right + Thing by default, unless you need to implement your own allocator + for your characters. +

+

But char_traits takes more work. The char_traits + template is declared but not defined. + That means there is only +

+
+      template <typename CharT>
+        struct char_traits
+        {
+            static void foo (type1 x, type2 y);
+            ...
+        };
+

and functions such as char_traits<CharT>::foo() are not + actually defined anywhere for the general case. The C++ standard + permits this, because writing such a definition to fit all possible + CharT's cannot be done. +

+

The C++ standard also requires that char_traits be specialized for + instantiations of char and wchar_t, and it + is these template specializations that permit entities like + basic_string<char,char_traits<char>> to work. +

+

If you want to use character types other than char and wchar_t, + such as unsigned char and int, you will + need suitable specializations for them. For a time, in earlier + versions of GCC, there was a mostly-correct implementation that + let programmers be lazy but it broke under many situations, so it + was removed. GCC 3.4 introduced a new implementation that mostly + works and can be specialized even for int and other + built-in types. +

+

If you want to use your own special character class, then you have + a lot + of work to do, especially if you with to use i18n features + (facets require traits information but don't have a traits argument). +

+

Another example of how to specialize char_traits was given on the + mailing list and at a later date was put into the file + include/ext/pod_char_traits.h. We agree + that the way it's used with basic_string (scroll down to main()) + doesn't look nice, but that's because the + nice-looking first attempt turned out to not + be conforming C++, due to the rule that CharT must be a POD. + (See how tricky this is?) +

+

Return to top of page or + to the FAQ. +

+ +
+

Shrink-to-fit strings

+ +

From GCC 3.4 calling s.reserve(res) on a + string s with res < s.capacity() will + reduce the string's capacity to std::max(s.size(), res). +

+

This behaviour is suggested, but not required by the standard. Prior + to GCC 3.4 the following alternative can be used instead +

+
+      std::string(str.data(), str.size()).swap(str);
+   
+

This is similar to the idiom for reducing a vector's + memory usage (see FAQ 5.9) but + the regular copy constructor cannot be used because libstdc++'s + string is Copy-On-Write. +

+ + + + +
+

+See license.html for copying conditions. +Comments and suggestions are welcome, and may be sent to +the libstdc++ mailing list. +

+ + + + diff --git a/libstdc++-v3/doc/html/21_strings/stringtok_h.txt b/libstdc++-v3/doc/html/21_strings/stringtok_h.txt new file mode 100644 index 00000000000..81d87a6efaf --- /dev/null +++ b/libstdc++-v3/doc/html/21_strings/stringtok_h.txt @@ -0,0 +1,102 @@ +/* + * stringtok.h -- Breaks a string into tokens. This is an example for lib3. + * + * Template function looks like this: + * + * template + * void stringtok (Container &l, + * string const &s, + * char const * const ws = " \t\n"); + * + * A nondestructive version of strtok() that handles its own memory and can + * be broken up by any character(s). Does all the work at once rather than + * in an invocation loop like strtok() requires. + * + * Container is any type that supports push_back(a_string), although using + * list and deque are indicated due to their O(1) push_back. + * (I prefer deque<> because op[]/at() is available as well.) The first + * parameter references an existing Container. + * + * s is the string to be tokenized. From the parameter declaration, it can + * be seen that s is not affected. Since references-to-const may refer to + * temporaries, you could use stringtok(some_container, readline("")) when + * using the GNU readline library. + * + * The final parameter is an array of characters that serve as whitespace. + * Whitespace characters default to one or more of tab, space, and newline, + * in any combination. + * + * 'l' need not be empty on entry. On return, 'l' will have the token + * strings appended. + * + * + * [Example: + * list ls; + * stringtok (ls, " this \t is\t\n a test "); + * for (list::const_iterator i = ls.begin(); + * i != ls.end(); ++i) + * { + * cerr << ':' << (*i) << ":\n"; + * } + * + * would print + * :this: + * :is: + * :a: + * :test: + * -end example] + * + * pedwards@jaj.com May 1999 +*/ + + +#include +#include // for strchr + + +/***************************************************************** + * This is the only part of the implementation that I don't like. + * It can probably be improved upon by the reader... +*/ +namespace { + inline bool + isws (char c, char const * const wstr) + { + return (strchr(wstr,c) != NULL); + } +} + + +/***************************************************************** + * Simplistic and quite Standard, but a bit slow. This should be + * templatized on basic_string instead, or on a more generic StringT + * that just happens to support ::size_type, .substr(), and so on. + * I had hoped that "whitespace" would be a trait, but it isn't, so + * the user must supply it. Enh, this lets them break up strings on + * different things easier than traits would anyhow. +*/ +template +void +stringtok (Container &l, string const &s, char const * const ws = " \t\n") +{ + const string::size_type S = s.size(); + string::size_type i = 0; + + while (i < S) { + // eat leading whitespace + while ((i < S) && (isws(s[i],ws))) ++i; + if (i == S) return; // nothing left but WS + + // find end of word + string::size_type j = i+1; + while ((j < S) && (!isws(s[j],ws))) ++j; + + // add word + l.push_back(s.substr(i,j-i)); + + // set up for next loop + i = j+1; + } +} + + diff --git a/libstdc++-v3/doc/html/21_strings/stringtok_std_h.txt b/libstdc++-v3/doc/html/21_strings/stringtok_std_h.txt new file mode 100644 index 00000000000..2f3d7e07368 --- /dev/null +++ b/libstdc++-v3/doc/html/21_strings/stringtok_std_h.txt @@ -0,0 +1,39 @@ +/* + * Same as stringtok_h.txt, but doesn't (visiably) use C functions. +*/ + +#include + +// The std:: prefix is not used here, for readability, and a line like +// "using namespace std;" is dangerous to have in a header file. + +template +void +stringtok (Container &container, string const &in, + const char * const delimiters = " \t\n") +{ + const string::size_type len = in.length(); + string::size_type i = 0; + + while ( i < len ) + { + // eat leading whitespace + i = in.find_first_not_of (delimiters, i); + if (i == string::npos) + return; // nothing left but white space + + // find the end of the token + string::size_type j = in.find_first_of (delimiters, i); + + // push token + if (j == string::npos) { + container.push_back (in.substr(i)); + return; + } else + container.push_back (in.substr(i, j-i)); + + // set up for next loop + i = j + 1; + } +} + diff --git a/libstdc++-v3/doc/html/22_locale/codecvt.html b/libstdc++-v3/doc/html/22_locale/codecvt.html new file mode 100644 index 00000000000..c760c098b5c --- /dev/null +++ b/libstdc++-v3/doc/html/22_locale/codecvt.html @@ -0,0 +1,595 @@ + + + + + + + + + + Notes on the codecvt implementation. + + + + + + + +

+ Notes on the codecvt implementation. +

+

+ +prepared by Benjamin Kosnik (bkoz@redhat.com) on August 28, 2000 + +

+ +

+1. Abstract +

+

+The standard class codecvt attempts to address conversions between +different character encoding schemes. In particular, the standard +attempts to detail conversions between the implementation-defined wide +characters (hereafter referred to as wchar_t) and the standard type +char that is so beloved in classic "C" (which can now be referred to +as narrow characters.) This document attempts to describe how the GNU +libstdc++ implementation deals with the conversion between wide and +narrow characters, and also presents a framework for dealing with the +huge number of other encodings that iconv can convert, including +Unicode and UTF8. Design issues and requirements are addressed, and +examples of correct usage for both the required specializations for +wide and narrow characters and the implementation-provided extended +functionality are given. +

+ +

+2. What the standard says +

+Around page 425 of the C++ Standard, this charming heading comes into view: + +
+22.2.1.5 - Template class codecvt [lib.locale.codecvt] +
+ +The text around the codecvt definition gives some clues: + +
+ +-1- The class codecvt<internT,externT,stateT> is for use when +converting from one codeset to another, such as from wide characters +to multibyte characters, between wide character encodings such as +Unicode and EUC. + +
+ +

+Hmm. So, in some unspecified way, Unicode encodings and +translations between other character sets should be handled by this +class. +

+ +
+ +-2- The stateT argument selects the pair of codesets being mapped between. + +
+ +

+Ah ha! Another clue... +

+ +
+ +-3- The instantiations required in the Table ?? +(lib.locale.category), namely codecvt<wchar_t,char,mbstate_t> and +codecvt<char,char,mbstate_t>, convert the implementation-defined +native character set. codecvt<char,char,mbstate_t> implements a +degenerate conversion; it does not convert at +all. codecvt<wchar_t,char,mbstate_t> converts between the native +character sets for tiny and wide characters. Instantiations on +mbstate_t perform conversion between encodings known to the library +implementor. Other encodings can be converted by specializing on a +user-defined stateT type. The stateT object can contain any state that +is useful to communicate to or from the specialized do_convert member. + +
+ +

+At this point, a couple points become clear: +

+ +

+One: The standard clearly implies that attempts to add non-required +(yet useful and widely used) conversions need to do so through the +third template parameter, stateT.

+ +

+Two: The required conversions, by specifying mbstate_t as the third +template parameter, imply an implementation strategy that is mostly +(or wholly) based on the underlying C library, and the functions +mcsrtombs and wcsrtombs in particular.

+ +

+3. Some thoughts on what would be useful +

+Probably the most frequently asked question about code conversion is: +"So dudes, what's the deal with Unicode strings?" The dude part is +optional, but apparently the usefulness of Unicode strings is pretty +widely appreciated. Sadly, this specific encoding (And other useful +encodings like UTF8, UCS4, ISO 8859-10, etc etc etc) are not mentioned +in the C++ standard. + +

+In particular, the simple implementation detail of wchar_t's size +seems to repeatedly confound people. Many systems use a two byte, +unsigned integral type to represent wide characters, and use an +internal encoding of Unicode or UCS2. (See AIX, Microsoft NT, Java, +others.) Other systems, use a four byte, unsigned integral type to +represent wide characters, and use an internal encoding of +UCS4. (GNU/Linux systems using glibc, in particular.) The C +programming language (and thus C++) does not specify a specific size +for the type wchar_t. +

+ +

+Thus, portable C++ code cannot assume a byte size (or endianness) either. +

+ +

+Getting back to the frequently asked question: What about Unicode strings? +

+ +

+What magic spell will do this conversion? +

+ +

+A couple of comments: +

+ +

+The thought that all one needs to convert between two arbitrary +codesets is two types and some kind of state argument is +unfortunate. In particular, encodings may be stateless. The naming of +the third parameter as stateT is unfortunate, as what is really needed +is some kind of generalized type that accounts for the issues that +abstract encodings will need. The minimum information that is required +includes: +

+ +
    +
  • +

    + Identifiers for each of the codesets involved in the conversion. For +example, using the iconv family of functions from the Single Unix +Specification (what used to be called X/Open) hosted on the GNU/Linux +operating system allows bi-directional mapping between far more than +the following tantalizing possibilities: +

    + +

    +(An edited list taken from `iconv --list` on a Red Hat 6.2/Intel system: +

    + +
    +
    +8859_1, 8859_9, 10646-1:1993, 10646-1:1993/UCS4, ARABIC, ARABIC7,
    +ASCII, EUC-CN, EUC-JP, EUC-KR, EUC-TW, GREEK-CCIcode, GREEK, GREEK7-OLD,
    +GREEK7, GREEK8, HEBREW, ISO-8859-1, ISO-8859-2, ISO-8859-3,
    +ISO-8859-4, ISO-8859-5, ISO-8859-6, ISO-8859-7, ISO-8859-8,
    +ISO-8859-9, ISO-8859-10, ISO-8859-11, ISO-8859-13, ISO-8859-14,
    +ISO-8859-15, ISO-10646, ISO-10646/UCS2, ISO-10646/UCS4,
    +ISO-10646/UTF-8, ISO-10646/UTF8, SHIFT-JIS, SHIFT_JIS, UCS-2, UCS-4,
    +UCS2, UCS4, UNICODE, UNICODEBIG, UNICODELIcodeLE, US-ASCII, US, UTF-8,
    +UTF-16, UTF8, UTF16).
    +
    +
    + +

    +For iconv-based implementations, string literals for each of the +encodings (ie. "UCS-2" and "UTF-8") are necessary, +although for other, +non-iconv implementations a table of enumerated values or some other +mechanism may be required. +

    +
  • + +
  • + Maximum length of the identifying string literal. +
  • + +
  • + Some encodings require explicit endian-ness. As such, some kind + of endian marker or other byte-order marker will be necessary. See + "Footnotes for C/C++ developers" in Haible for more information on + UCS-2/Unicode endian issues. (Summary: big endian seems most likely, + however implementations, most notably Microsoft, vary.) +
  • + +
  • + Types representing the conversion state, for conversions involving + the machinery in the "C" library, or the conversion descriptor, for + conversions using iconv (such as the type iconv_t.) Note that the + conversion descriptor encodes more information than a simple encoding + state type. +
  • + +
  • + Conversion descriptors for both directions of encoding. (ie, both + UCS-2 to UTF-8 and UTF-8 to UCS-2.) +
  • + +
  • + Something to indicate if the conversion requested if valid. +
  • + +
  • + Something to represent if the conversion descriptors are valid. +
  • + +
  • + Some way to enforce strict type checking on the internal and + external types. As part of this, the size of the internal and + external types will need to be known. +
  • +
+ +

+4. Problems with "C" code conversions : thread safety, global +locales, termination. +

+ +In addition, multi-threaded and multi-locale environments also impact +the design and requirements for code conversions. In particular, they +affect the required specialization codecvt<wchar_t, char, mbstate_t> +when implemented using standard "C" functions. + +

+Three problems arise, one big, one of medium importance, and one small. +

+ +

+First, the small: mcsrtombs and wcsrtombs may not be multithread-safe +on all systems required by the GNU tools. For GNU/Linux and glibc, +this is not an issue. +

+ +

+Of medium concern, in the grand scope of things, is that the functions +used to implement this specialization work on null-terminated +strings. Buffers, especially file buffers, may not be null-terminated, +thus giving conversions that end prematurely or are otherwise +incorrect. Yikes! +

+ +

+The last, and fundamental problem, is the assumption of a global +locale for all the "C" functions referenced above. For something like +C++ iostreams (where codecvt is explicitly used) the notion of +multiple locales is fundamental. In practice, most users may not run +into this limitation. However, as a quality of implementation issue, +the GNU C++ library would like to offer a solution that allows +multiple locales and or simultaneous usage with computationally +correct results. In short, libstdc++ is trying to offer, as an +option, a high-quality implementation, damn the additional complexity! +

+ +

+For the required specialization codecvt<wchar_t, char, mbstate_t> , +conversions are made between the internal character set (always UCS4 +on GNU/Linux) and whatever the currently selected locale for the +LC_CTYPE category implements. +

+ +

+5. Design +

+The two required specializations are implemented as follows: + +

+ +codecvt<char, char, mbstate_t> + +

+

+This is a degenerate (ie, does nothing) specialization. Implementing +this was a piece of cake. +

+ +

+ +codecvt<char, wchar_t, mbstate_t> + +

+

+This specialization, by specifying all the template parameters, pretty +much ties the hands of implementors. As such, the implementation is +straightforward, involving mcsrtombs for the conversions between char +to wchar_t and wcsrtombs for conversions between wchar_t and char. +

+ +

+Neither of these two required specializations deals with Unicode +characters. As such, libstdc++ implements a partial specialization +of the codecvt class with and iconv wrapper class, encoding_state as the +third template parameter. +

+ +

+This implementation should be standards conformant. First of all, the +standard explicitly points out that instantiations on the third +template parameter, stateT, are the proper way to implement +non-required conversions. Second of all, the standard says (in Chapter +17) that partial specializations of required classes are a-ok. Third +of all, the requirements for the stateT type elsewhere in the standard +(see 21.1.2 traits typedefs) only indicate that this type be copy +constructible. +

+ +

+As such, the type encoding_state is defined as a non-templatized, POD +type to be used as the third type of a codecvt instantiation. This +type is just a wrapper class for iconv, and provides an easy interface +to iconv functionality. +

+ +

+There are two constructors for encoding_state: +

+ +

+ +encoding_state() : __in_desc(0), __out_desc(0) + +

+

+This default constructor sets the internal encoding to some default +(currently UCS4) and the external encoding to whatever is returned by +nl_langinfo(CODESET). +

+ +

+ +encoding_state(const char* __int, const char* __ext) + +

+

+This constructor takes as parameters string literals that indicate the +desired internal and external encoding. There are no defaults for +either argument. +

+ +

+One of the issues with iconv is that the string literals identifying +conversions are not standardized. Because of this, the thought of +mandating and or enforcing some set of pre-determined valid +identifiers seems iffy: thus, a more practical (and non-migraine +inducing) strategy was implemented: end-users can specify any string +(subject to a pre-determined length qualifier, currently 32 bytes) for +encodings. It is up to the user to make sure that these strings are +valid on the target system. +

+ +

+ +void +_M_init() + +

+

+Strangely enough, this member function attempts to open conversion +descriptors for a given encoding_state object. If the conversion +descriptors are not valid, the conversion descriptors returned will +not be valid and the resulting calls to the codecvt conversion +functions will return error. +

+ +

+ +bool +_M_good() + +

+

+Provides a way to see if the given encoding_state object has been +properly initialized. If the string literals describing the desired +internal and external encoding are not valid, initialization will +fail, and this will return false. If the internal and external +encodings are valid, but iconv_open could not allocate conversion +descriptors, this will also return false. Otherwise, the object is +ready to convert and will return true. +

+ +

+ +encoding_state(const encoding_state&) + +

+

+As iconv allocates memory and sets up conversion descriptors, the copy +constructor can only copy the member data pertaining to the internal +and external code conversions, and not the conversion descriptors +themselves. +

+ +

+Definitions for all the required codecvt member functions are provided +for this specialization, and usage of codecvt<internal character type, +external character type, encoding_state> is consistent with other +codecvt usage. +

+ +

+6. Examples +

+ +
    +
  • + a. conversions involving string literals + +
    +  typedef codecvt_base::result                  result;
    +  typedef unsigned short                        unicode_t;
    +  typedef unicode_t                             int_type;
    +  typedef char                                  ext_type;
    +  typedef encoding_state                          state_type;
    +  typedef codecvt<int_type, ext_type, state_type> unicode_codecvt;
    +
    +  const ext_type*       e_lit = "black pearl jasmine tea";
    +  int                   size = strlen(e_lit);
    +  int_type              i_lit_base[24] = 
    +  { 25088, 27648, 24832, 25344, 27392, 8192, 28672, 25856, 24832, 29184, 
    +    27648, 8192, 27136, 24832, 29440, 27904, 26880, 28160, 25856, 8192, 29696,
    +    25856, 24832, 2560
    +  };
    +  const int_type*       i_lit = i_lit_base;
    +  const ext_type*       efrom_next;
    +  const int_type*       ifrom_next;
    +  ext_type*             e_arr = new ext_type[size + 1];
    +  ext_type*             eto_next;
    +  int_type*             i_arr = new int_type[size + 1];
    +  int_type*             ito_next;
    +
    +  // construct a locale object with the specialized facet.
    +  locale                loc(locale::classic(), new unicode_codecvt);
    +  // sanity check the constructed locale has the specialized facet.
    +  VERIFY( has_facet<unicode_codecvt>(loc) );
    +  const unicode_codecvt& cvt = use_facet<unicode_codecvt>(loc); 
    +  // convert between const char* and unicode strings
    +  unicode_codecvt::state_type state01("UNICODE", "ISO_8859-1");
    +  initialize_state(state01);
    +  result r1 = cvt.in(state01, e_lit, e_lit + size, efrom_next, 
    +                     i_arr, i_arr + size, ito_next);
    +  VERIFY( r1 == codecvt_base::ok );
    +  VERIFY( !int_traits::compare(i_arr, i_lit, size) ); 
    +  VERIFY( efrom_next == e_lit + size );
    +  VERIFY( ito_next == i_arr + size );
    +
    +
  • +
  • + b. conversions involving std::string +
  • +
  • + c. conversions involving std::filebuf and std::ostream +
  • +
+ +More information can be found in the following testcases: +
    +
  • testsuite/22_locale/codecvt_char_char.cc
  • +
  • testsuite/22_locale/codecvt_unicode_wchar_t.cc
  • +
  • testsuite/22_locale/codecvt_unicode_char.cc
  • +
  • testsuite/22_locale/codecvt_wchar_t_char.cc
  • +
+ +

+7. Unresolved Issues +

+
    +
  • + a. things that are sketchy, or remain unimplemented: + do_encoding, max_length and length member functions + are only weakly implemented. I have no idea how to do + this correctly, and in a generic manner. Nathan? +
  • + +
  • + b. conversions involving std::string + +
      +
    • + how should operators != and == work for string of + different/same encoding? +
    • + +
    • + what is equal? A byte by byte comparison or an + encoding then byte comparison? +
    • + +
    • + conversions between narrow, wide, and unicode strings +
    • +
    +
  • +
  • + c. conversions involving std::filebuf and std::ostream +
      +
    • + how to initialize the state object in a + standards-conformant manner? +
    • + +
    • + how to synchronize the "C" and "C++" + conversion information? +
    • + +
    • + wchar_t/char internal buffers and conversions between + internal/external buffers? +
    • +
    +
  • +
+ +

+8. Acknowledgments +

+Ulrich Drepper for the iconv suggestions and patient answering of +late-night questions, Jason Merrill for the template partial +specialization hints, language clarification, and wchar_t fixes. + +

+9. Bibliography / Referenced Documents +

+ +Drepper, Ulrich, GNU libc (glibc) 2.2 manual. In particular, Chapters "6. Character Set Handling" and "7 Locales and Internationalization" + +

+Drepper, Ulrich, Numerous, late-night email correspondence +

+ +

+Feather, Clive, "A brief description of Normative Addendum 1," in particular the parts on Extended Character Sets +http://www.lysator.liu.se/c/na1.html +

+ +

+Haible, Bruno, "The Unicode HOWTO" v0.18, 4 August 2000 +ftp://ftp.ilog.fr/pub/Users/haible/utf8/Unicode-HOWTO.html +

+ +

+ISO/IEC 14882:1998 Programming languages - C++ +

+ +

+ISO/IEC 9899:1999 Programming languages - C +

+ +

+Khun, Markus, "UTF-8 and Unicode FAQ for Unix/Linux" +http://www.cl.cam.ac.uk/~mgk25/unicode.html +

+ +

+Langer, Angelika and Klaus Kreft, Standard C++ IOStreams and Locales, Advanced Programmer's Guide and Reference, Addison Wesley Longman, Inc. 2000 +

+ +

+Stroustrup, Bjarne, Appendix D, The C++ Programming Language, Special Edition, Addison Wesley, Inc. 2000 +

+ +

+System Interface Definitions, Issue 6 (IEEE Std. 1003.1-200x) +The Open Group/The Institute of Electrical and Electronics Engineers, Inc. +http://www.opennc.org/austin/docreg.html +

+ + + diff --git a/libstdc++-v3/doc/html/22_locale/ctype.html b/libstdc++-v3/doc/html/22_locale/ctype.html new file mode 100644 index 00000000000..e52f8353bd9 --- /dev/null +++ b/libstdc++-v3/doc/html/22_locale/ctype.html @@ -0,0 +1,166 @@ + + + + + + + + + + Notes on the ctype implementation. + + + + + + + +

+ Notes on the ctype implementation. +

+ +prepared by Benjamin Kosnik (bkoz@redhat.com) on August 30, 2000 + + +

+1. Abstract +

+

+Woe is me. +

+ +

+2. What the standard says +

+ + +

+3. Problems with "C" ctype : global locales, termination. +

+ +

+For the required specialization codecvt<wchar_t, char, mbstate_t> , +conversions are made between the internal character set (always UCS4 +on GNU/Linux) and whatever the currently selected locale for the +LC_CTYPE category implements. +

+ +

+4. Design +

+The two required specializations are implemented as follows: + +

+ +ctype<char> + +

+

+This is simple specialization. Implementing this was a piece of cake. +

+ +

+ +ctype<wchar_t> + +

+

+This specialization, by specifying all the template parameters, pretty +much ties the hands of implementors. As such, the implementation is +straightforward, involving mcsrtombs for the conversions between char +to wchar_t and wcsrtombs for conversions between wchar_t and char. +

+ +

+Neither of these two required specializations deals with Unicode +characters. As such, libstdc++ implements +

+ +

+5. Examples +

+ +
+  typedef ctype<char> cctype;
+
+ +More information can be found in the following testcases: +
    +
  • testsuite/22_locale/ctype_char_members.cc
  • +
  • testsuite/22_locale/ctype_wchar_t_members.cc
  • +
+ +

+6. Unresolved Issues +

+ +
    +
  • how to deal with the global locale issue?
  • + +
  • how to deal with different types than char, wchar_t?
  • + +
  • codecvt/ctype overlap: narrow/widen
  • + +
  • mask typedef in codecvt_base, argument types in codecvt. + what is know about this type?
  • + +
  • why mask* argument in codecvt?
  • + +
  • can this be made (more) generic? is there a simple way to + straighten out the configure-time mess that is a by-product of + this class?
  • + +
  • get the ctype<wchar_t>::mask stuff under control. Need to + make some kind of static table, and not do lookup evertime + somebody hits the do_is... functions. Too bad we can't just + redefine mask for ctype<wchar_t>
  • + +
  • rename abstract base class. See if just smash-overriding + is a better approach. Clarify, add sanity to naming.
  • + +
+ + +

+7. Acknowledgments +

+Ulrich Drepper for patient answering of late-night questions, skeletal +examples, and C language expertise. + +

+8. Bibliography / Referenced Documents +

+ +Drepper, Ulrich, GNU libc (glibc) 2.2 manual. In particular, Chapters "6. Character Set Handling" and "7 Locales and Internationalization" + +

+Drepper, Ulrich, Numerous, late-night email correspondence +

+ +

+ISO/IEC 14882:1998 Programming languages - C++ +

+ +

+ISO/IEC 9899:1999 Programming languages - C +

+ +

+Langer, Angelika and Klaus Kreft, Standard C++ IOStreams and Locales, Advanced Programmer's Guide and Reference, Addison Wesley Longman, Inc. 2000 +

+ +

+Stroustrup, Bjarne, Appendix D, The C++ Programming Language, Special Edition, Addison Wesley, Inc. 2000 +

+ +

+System Interface Definitions, Issue 6 (IEEE Std. 1003.1-200x) +The Open Group/The Institute of Electrical and Electronics Engineers, Inc. +http://www.opennc.org/austin/docreg.html +

+ + + diff --git a/libstdc++-v3/doc/html/22_locale/howto.html b/libstdc++-v3/doc/html/22_locale/howto.html new file mode 100644 index 00000000000..3709a6fac97 --- /dev/null +++ b/libstdc++-v3/doc/html/22_locale/howto.html @@ -0,0 +1,240 @@ + + + + + + + + + + + libstdc++ HOWTO: Chapter 22: Localization + + + + + + + + + + + + + + + +

Chapter 22: Localization

+ +

Chapter 22 deals with the C++ localization facilities. +

+ + + + +
+

Contents

+ + + + +
+

class locale

+

Notes made during the implementation of locales can be found + here. +

+ +
+

class codecvt

+

Notes made during the implementation of codecvt can be found + here. +

+ +

The following is the abstract from the implementation notes: +

+
+ The standard class codecvt attempts to address conversions between + different character encoding schemes. In particular, the standard + attempts to detail conversions between the implementation-defined + wide characters (hereafter referred to as wchar_t) and the standard + type char that is so beloved in classic "C" (which can + now be referred to as narrow characters.) This document attempts + to describe how the GNU libstdc++ implementation deals with the + conversion between wide and narrow characters, and also presents a + framework for dealing with the huge number of other encodings that + iconv can convert, including Unicode and UTF8. Design issues and + requirements are addressed, and examples of correct usage for both + the required specializations for wide and narrow characters and the + implementation-provided extended functionality are given. +
+ +
+

class ctype

+

Notes made during the implementation of ctype can be found + here. +

+ +
+

class messages

+

Notes made during the implementation of messages can be found + here. +

+ +
+

Bjarne Stroustrup on Locales

+

Dr. Bjarne Stroustrup has released a + pointer + to Appendix D of his book, + The C++ + Programming Language (3rd Edition). It is a detailed + description of locales and how to use them. +

+

He also writes: +

+
+ Please note that I still consider this detailed description of + locales beyond the needs of most C++ programmers. It is written + with experienced programmers in mind and novices will do best to + avoid it. +
+ +
+

Nathan Myers on Locales

+

An article entitled "The Standard C++ Locale" was + published in Dr. Dobb's Journal and can be found + here. +

+ +
+

Correct Transformations

+ +

A very common question on newsgroups and mailing lists is, "How + do I do <foo> to a character string?" where <foo> is + a task such as changing all the letters to uppercase, to lowercase, + testing for digits, etc. A skilled and conscientious programmer + will follow the question with another, "And how do I make the + code portable?" +

+

(Poor innocent programmer, you have no idea the depths of trouble + you are getting yourself into. 'Twould be best for your sanity if + you dropped the whole idea and took up basket weaving instead. No? + Fine, you asked for it...) +

+

The task of changing the case of a letter or classifying a character + as numeric, graphical, etc., all depends on the cultural context of the + program at runtime. So, first you must take the portability question + into account. Once you have localized the program to a particular + natural language, only then can you perform the specific task. + Unfortunately, specializing a function for a human language is not + as simple as declaring + extern "Danish" int tolower (int); . +

+

The C++ code to do all this proceeds in the same way. First, a locale + is created. Then member functions of that locale are called to + perform minor tasks. Continuing the example from Chapter 21, we wish + to use the following convenience functions: +

+
+   namespace std {
+     template <class charT>
+       charT
+       toupper (charT c, const locale& loc) const;
+     template <class charT>
+       charT
+       tolower (charT c, const locale& loc) const;
+   }
+

+ This function extracts the appropriate "facet" from the + locale loc and calls the appropriate member function of that + facet, passing c as its argument. The resulting character + is returned. +

+

For the C/POSIX locale, the results are the same as calling the + classic C toupper/tolower function that was used in previous + examples. For other locales, the code should Do The Right Thing. +

+

Of course, these functions take a second argument, and the + transformation algorithm's operator argument can only take a single + parameter. So we write simple wrapper structs to handle that. +

+

The next-to-final version of the code started in Chapter 21 looks like: +

+
+   #include <iterator>    // for back_inserter
+   #include <locale>
+   #include <string>
+   #include <algorithm>
+   #include <cctype>      // old <ctype.h>
+
+   struct ToUpper
+   {
+       ToUpper(std::locale const& l) : loc(l) {;}
+       char operator() (char c) const  { return std::toupper(c,loc); }
+   private:
+       std::locale const& loc;
+   };
+   
+   struct ToLower
+   {
+       ToLower(std::locale const& l) : loc(l) {;}
+       char operator() (char c) const  { return std::tolower(c,loc); }
+   private:
+       std::locale const& loc;
+   };
+   
+   int main ()
+   {
+      std::string  s("Some Kind Of Initial Input Goes Here");
+      ToUpper      up(std::locale::classic());
+      ToLower      down(std::locale::classic());
+   
+      // Change everything into upper case.
+      std::transform(s.begin(), s.end(), s.begin(), up);
+   
+      // Change everything into lower case.
+      std::transform(s.begin(), s.end(), s.begin(), down);
+   
+      // Change everything back into upper case, but store the
+      // result in a different string.
+      std::string  capital_s;
+      std::transform(s.begin(), s.end(), std::back_inserter(capital_s), up);
+   }
+

The ToUpper and ToLower structs can be + generalized for other character types by making operator() + a member function template. +

+

The final version of the code uses bind2nd to eliminate + the wrapper structs, but the resulting code is tricky. I have not + shown it here because no compilers currently available to me will + handle it. +

+ + + + +
+

+See license.html for copying conditions. +Comments and suggestions are welcome, and may be sent to +the libstdc++ mailing list. +

+ + + + diff --git a/libstdc++-v3/doc/html/22_locale/locale.html b/libstdc++-v3/doc/html/22_locale/locale.html new file mode 100644 index 00000000000..57ef5b4e981 --- /dev/null +++ b/libstdc++-v3/doc/html/22_locale/locale.html @@ -0,0 +1,543 @@ + + + + + + + + + + Notes on the locale implementation. + + + + + + + +

+ Notes on the locale implementation. +

+ +prepared by Benjamin Kosnik (bkoz@redhat.com) on October 14, 2002 + + +

+1. Abstract +

+

+Describes the basic locale object, including nested +classes id, facet, and the reference-counted implementation object, +class _Impl. +

+ +

+2. What the standard says +

+Class locale is non-templatized and has two distinct types nested +inside of it: + +
+ +class facet +22.1.1.1.2 Class locale::facet + +
+ +

+Facets actually implement locale functionality. For instance, a facet +called numpunct is the data objects that can be used to query for the +thousands separator is in the German locale. +

+ +Literally, a facet is strictly defined: +
    +
  • containing the following public data member: +

    + static locale::id id; +

    +
  • + +
  • derived from another facet: +

    + class gnu_codecvt: public std::ctype<user-defined-type> +

    +
  • +
+ +

+Of interest in this class are the memory management options explicitly +specified as an argument to facet's constructor. Each constructor of a +facet class takes a std::size_t __refs argument: if __refs == 0, the +facet is deleted when the locale containing it is destroyed. If __refs +== 1, the facet is not destroyed, even when it is no longer +referenced. +

+ +
+ +class id +22.1.1.1.3 - Class locale::id + +
+ +

+Provides an index for looking up specific facets. +

+ + +

+3. Interacting with "C" locales. +

+ +

+Some help on determining the underlying support for locales on a system. +Note, this is specific to linux (and glibc-2.3.x) +

+ +
    +
  • `locale -a` displays available locales. +
    +
    +af_ZA
    +ar_AE
    +ar_AE.utf8
    +ar_BH
    +ar_BH.utf8
    +ar_DZ
    +ar_DZ.utf8
    +ar_EG
    +ar_EG.utf8
    +ar_IN
    +ar_IQ
    +ar_IQ.utf8
    +ar_JO
    +ar_JO.utf8
    +ar_KW
    +ar_KW.utf8
    +ar_LB
    +ar_LB.utf8
    +ar_LY
    +ar_LY.utf8
    +ar_MA
    +ar_MA.utf8
    +ar_OM
    +ar_OM.utf8
    +ar_QA
    +ar_QA.utf8
    +ar_SA
    +ar_SA.utf8
    +ar_SD
    +ar_SD.utf8
    +ar_SY
    +ar_SY.utf8
    +ar_TN
    +ar_TN.utf8
    +ar_YE
    +ar_YE.utf8
    +be_BY
    +be_BY.utf8
    +bg_BG
    +bg_BG.utf8
    +br_FR
    +bs_BA
    +C
    +ca_ES
    +ca_ES@euro
    +ca_ES.utf8
    +ca_ES.utf8@euro
    +cs_CZ
    +cs_CZ.utf8
    +cy_GB
    +da_DK
    +da_DK.iso885915
    +da_DK.utf8
    +de_AT
    +de_AT@euro
    +de_AT.utf8
    +de_AT.utf8@euro
    +de_BE
    +de_BE@euro
    +de_BE.utf8
    +de_BE.utf8@euro
    +de_CH
    +de_CH.utf8
    +de_DE
    +de_DE@euro
    +de_DE.utf8
    +de_DE.utf8@euro
    +de_LU
    +de_LU@euro
    +de_LU.utf8
    +de_LU.utf8@euro
    +el_GR
    +el_GR.utf8
    +en_AU
    +en_AU.utf8
    +en_BW
    +en_BW.utf8
    +en_CA
    +en_CA.utf8
    +en_DK
    +en_DK.utf8
    +en_GB
    +en_GB.iso885915
    +en_GB.utf8
    +en_HK
    +en_HK.utf8
    +en_IE
    +en_IE@euro
    +en_IE.utf8
    +en_IE.utf8@euro
    +en_IN
    +en_NZ
    +en_NZ.utf8
    +en_PH
    +en_PH.utf8
    +en_SG
    +en_SG.utf8
    +en_US
    +en_US.iso885915
    +en_US.utf8
    +en_ZA
    +en_ZA.utf8
    +en_ZW
    +en_ZW.utf8
    +es_AR
    +es_AR.utf8
    +es_BO
    +es_BO.utf8
    +es_CL
    +es_CL.utf8
    +es_CO
    +es_CO.utf8
    +es_CR
    +es_CR.utf8
    +es_DO
    +es_DO.utf8
    +es_EC
    +es_EC.utf8
    +es_ES
    +es_ES@euro
    +es_ES.utf8
    +es_ES.utf8@euro
    +es_GT
    +es_GT.utf8
    +es_HN
    +es_HN.utf8
    +es_MX
    +es_MX.utf8
    +es_NI
    +es_NI.utf8
    +es_PA
    +es_PA.utf8
    +es_PE
    +es_PE.utf8
    +es_PR
    +es_PR.utf8
    +es_PY
    +es_PY.utf8
    +es_SV
    +es_SV.utf8
    +es_US
    +es_US.utf8
    +es_UY
    +es_UY.utf8
    +es_VE
    +es_VE.utf8
    +et_EE
    +et_EE.utf8
    +eu_ES
    +eu_ES@euro
    +eu_ES.utf8
    +eu_ES.utf8@euro
    +fa_IR
    +fi_FI
    +fi_FI@euro
    +fi_FI.utf8
    +fi_FI.utf8@euro
    +fo_FO
    +fo_FO.utf8
    +fr_BE
    +fr_BE@euro
    +fr_BE.utf8
    +fr_BE.utf8@euro
    +fr_CA
    +fr_CA.utf8
    +fr_CH
    +fr_CH.utf8
    +fr_FR
    +fr_FR@euro
    +fr_FR.utf8
    +fr_FR.utf8@euro
    +fr_LU
    +fr_LU@euro
    +fr_LU.utf8
    +fr_LU.utf8@euro
    +ga_IE
    +ga_IE@euro
    +ga_IE.utf8
    +ga_IE.utf8@euro
    +gl_ES
    +gl_ES@euro
    +gl_ES.utf8
    +gl_ES.utf8@euro
    +gv_GB
    +gv_GB.utf8
    +he_IL
    +he_IL.utf8
    +hi_IN
    +hr_HR
    +hr_HR.utf8
    +hu_HU
    +hu_HU.utf8
    +id_ID
    +id_ID.utf8
    +is_IS
    +is_IS.utf8
    +it_CH
    +it_CH.utf8
    +it_IT
    +it_IT@euro
    +it_IT.utf8
    +it_IT.utf8@euro
    +iw_IL
    +iw_IL.utf8
    +ja_JP.eucjp
    +ja_JP.utf8
    +ka_GE
    +kl_GL
    +kl_GL.utf8
    +ko_KR.euckr
    +ko_KR.utf8
    +kw_GB
    +kw_GB.utf8
    +lt_LT
    +lt_LT.utf8
    +lv_LV
    +lv_LV.utf8
    +mi_NZ
    +mk_MK
    +mk_MK.utf8
    +mr_IN
    +ms_MY
    +ms_MY.utf8
    +mt_MT
    +mt_MT.utf8
    +nl_BE
    +nl_BE@euro
    +nl_BE.utf8
    +nl_BE.utf8@euro
    +nl_NL
    +nl_NL@euro
    +nl_NL.utf8
    +nl_NL.utf8@euro
    +nn_NO
    +nn_NO.utf8
    +no_NO
    +no_NO.utf8
    +oc_FR
    +pl_PL
    +pl_PL.utf8
    +POSIX
    +pt_BR
    +pt_BR.utf8
    +pt_PT
    +pt_PT@euro
    +pt_PT.utf8
    +pt_PT.utf8@euro
    +ro_RO
    +ro_RO.utf8
    +ru_RU
    +ru_RU.koi8r
    +ru_RU.utf8
    +ru_UA
    +ru_UA.utf8
    +se_NO
    +sk_SK
    +sk_SK.utf8
    +sl_SI
    +sl_SI.utf8
    +sq_AL
    +sq_AL.utf8
    +sr_YU
    +sr_YU@cyrillic
    +sr_YU.utf8
    +sr_YU.utf8@cyrillic
    +sv_FI
    +sv_FI@euro
    +sv_FI.utf8
    +sv_FI.utf8@euro
    +sv_SE
    +sv_SE.iso885915
    +sv_SE.utf8
    +ta_IN
    +te_IN
    +tg_TJ
    +th_TH
    +th_TH.utf8
    +tl_PH
    +tr_TR
    +tr_TR.utf8
    +uk_UA
    +uk_UA.utf8
    +ur_PK
    +uz_UZ
    +vi_VN
    +vi_VN.tcvn
    +wa_BE
    +wa_BE@euro
    +yi_US
    +zh_CN
    +zh_CN.gb18030
    +zh_CN.gbk
    +zh_CN.utf8
    +zh_HK
    +zh_HK.utf8
    +zh_TW
    +zh_TW.euctw
    +zh_TW.utf8
    +
    +
    +
  • + +
  • `locale` displays environmental variables + that impact how locale("") will be deduced. + +
    +
    +LANG=en_US
    +LC_CTYPE="en_US"
    +LC_NUMERIC="en_US"
    +LC_TIME="en_US"
    +LC_COLLATE="en_US"
    +LC_MONETARY="en_US"
    +LC_MESSAGES="en_US"
    +LC_PAPER="en_US"
    +LC_NAME="en_US"
    +LC_ADDRESS="en_US"
    +LC_TELEPHONE="en_US"
    +LC_MEASUREMENT="en_US"
    +LC_IDENTIFICATION="en_US"
    +LC_ALL=
    +
    +
    +
  • +
+ +

+From Josuttis, p. 697-698, which says, that "there is only *one* +relation (of the C++ locale mechanism) to the C locale mechanism: the +global C locale is modified if a named C++ locale object is set as the +global locale" (emphasis Paolo), that is: +

+ std::locale::global(std::locale("")); + +

affects the C functions as if the following call was made:

+ + std::setlocale(LC_ALL, ""); + +

+On the other hand, there is *no* viceversa, that is, calling setlocale +has *no* whatsoever on the C++ locale mechanism, in particular on the +working of locale(""), which constructs the locale object from the +environment of the running program, that is, in practice, the set of +LC_ALL, LANG, etc. variable of the shell. +

+ + +

+4. Design +

+ + +

+The major design challenge is fitting an object-orientated and +non-global locale design ontop of POSIX and other relevant stanards, +which include the Single Unix (nee X/Open.) +

+ +

+Because POSIX falls down so completely, portibility is an issue. +

+ +class _Impl +The internal representation of the std::locale object. + + +

+5. Examples +

+ +More information can be found in the following testcases: +
    +
  • testsuite/22_locale/all
  • +
+ +

+6. Unresolved Issues +

+ +
    +
  • locale initialization: at what point does _S_classic, + _S_global get initialized? Can named locales assume this + initialization has already taken place?
  • + +
  • document how named locales error check when filling data + members. Ie, a fr_FR locale that doesn't have + numpunct::truename(): does it use "true"? Or is it a blank + string? What's the convention?
  • + +
  • explain how locale aliasing happens. When does "de_DE" + use "de" information? What is the rule for locales composed of + just an ISO language code (say, "de") and locales with both an + ISO language code and ISO country code (say, "de_DE").
  • + +
  • what should non-required facet instantiations do? If the + generic implemenation is provided, then how to end-users + provide specializations?
  • +
+ +

+7. Acknowledgments +

+ +

+8. Bibliography / Referenced Documents +

+ +Drepper, Ulrich, GNU libc (glibc) 2.2 manual. In particular, Chapters "6. Character Set Handling" and "7 Locales and Internationalization" + +

+Drepper, Ulrich, Numerous, late-night email correspondence +

+ +

+ISO/IEC 14882:1998 Programming languages - C++ +

+ +

+ISO/IEC 9899:1999 Programming languages - C +

+ +

+Langer, Angelika and Klaus Kreft, Standard C++ IOStreams and Locales, Advanced Programmer's Guide and Reference, Addison Wesley Longman, Inc. 2000 +

+ +

+Stroustrup, Bjarne, Appendix D, The C++ Programming Language, Special Edition, Addison Wesley, Inc. 2000 +

+ +

+System Interface Definitions, Issue 6 (IEEE Std. 1003.1-200x) +The Open Group/The Institute of Electrical and Electronics Engineers, Inc. +http://www.opennc.org/austin/docreg.html +

+ + + + + diff --git a/libstdc++-v3/doc/html/22_locale/messages.html b/libstdc++-v3/doc/html/22_locale/messages.html new file mode 100644 index 00000000000..bb096c09e7f --- /dev/null +++ b/libstdc++-v3/doc/html/22_locale/messages.html @@ -0,0 +1,461 @@ + + + + + + + + + + Notes on the messages implementation. + + + + + + + +

+Notes on the messages implementation. +

+ +prepared by Benjamin Kosnik (bkoz@redhat.com) on August 8, 2001 + + +

+1. Abstract +

+

+The std::messages facet implements message retrieval functionality +equivalent to Java's java.text.MessageFormat .using either GNU gettext +or IEEE 1003.1-200 functions. +

+ +

+2. What the standard says +

+The std::messages facet is probably the most vaguely defined facet in +the standard library. It's assumed that this facility was built into +the standard library in order to convert string literals from one +locale to the other. For instance, converting the "C" locale's +const char* c = "please" to a German-localized "bitte" +during program execution. + +
+22.2.7.1 - Template class messages [lib.locale.messages] +
+ +This class has three public member functions, which directly +correspond to three protected virtual member functions. + +The public member functions are: + +

+catalog open(const string&, const locale&) const +

+ +

+string_type get(catalog, int, int, const string_type&) const +

+ +

+void close(catalog) const +

+ +

+While the virtual functions are: +

+ +

+catalog do_open(const string&, const locale&) const +

+
+ +-1- Returns: A value that may be passed to get() to retrieve a +message, from the message catalog identified by the string name +according to an implementation-defined mapping. The result can be used +until it is passed to close(). Returns a value less than 0 if no such +catalog can be opened. + +
+ +

+string_type do_get(catalog, int, int, const string_type&) const +

+
+ +-3- Requires: A catalog cat obtained from open() and not yet closed. +-4- Returns: A message identified by arguments set, msgid, and dfault, +according to an implementation-defined mapping. If no such message can +be found, returns dfault. + +
+ +

+void do_close(catalog) const +

+
+ +-5- Requires: A catalog cat obtained from open() and not yet closed. +-6- Effects: Releases unspecified resources associated with cat. +-7- Notes: The limit on such resources, if any, is implementation-defined. + +
+ + +

+3. Problems with "C" messages: thread safety, +over-specification, and assumptions. +

+A couple of notes on the standard. + +

+First, why is messages_base::catalog specified as a typedef +to int? This makes sense for implementations that use +catopen, but not for others. Fortunately, it's not heavily +used and so only a minor irritant. +

+ +

+Second, by making the member functions const, it is +impossible to save state in them. Thus, storing away information used +in the 'open' member function for use in 'get' is impossible. This is +unfortunate. +

+ +

+The 'open' member function in particular seems to be oddly +designed. The signature seems quite peculiar. Why specify a const +string& argument, for instance, instead of just const +char*? Or, why specify a const locale& argument that is +to be used in the 'get' member function? How, exactly, is this locale +argument useful? What was the intent? It might make sense if a locale +argument was associated with a given default message string in the +'open' member function, for instance. Quite murky and unclear, on +reflection. +

+ +

+Lastly, it seems odd that messages, which explicitly require code +conversion, don't use the codecvt facet. Because the messages facet +has only one template parameter, it is assumed that ctype, and not +codecvt, is to be used to convert between character sets. +

+ +

+It is implicitly assumed that the locale for the default message +string in 'get' is in the "C" locale. Thus, all source code is assumed +to be written in English, so translations are always from "en_US" to +other, explicitly named locales. +

+ +

+4. Design and Implementation Details +

+This is a relatively simple class, on the face of it. The standard +specifies very little in concrete terms, so generic implementations +that are conforming yet do very little are the norm. Adding +functionality that would be useful to programmers and comparable to +Java's java.text.MessageFormat takes a bit of work, and is highly +dependent on the capabilities of the underlying operating system. + +

+Three different mechanisms have been provided, selectable via +configure flags: +

+ +
    +
  • generic +

    + This model does very little, and is what is used by default. +

    +
  • + +
  • gnu +

    + The gnu model is complete and fully tested. It's based on the + GNU gettext package, which is part of glibc. It uses the functions + textdomain, bindtextdomain, gettext + to implement full functionality. Creating message + catalogs is a relatively straight-forward process and is + lightly documented below, and fully documented in gettext's + distributed documentation. +

    +
  • + +
  • ieee_1003.1-200x +

    + This is a complete, though untested, implementation based on + the IEEE standard. The functions + catopen, catgets, catclose + are used to retrieve locale-specific messages given the + appropriate message catalogs that have been constructed for + their use. Note, the script po2msg.sed that is part + of the gettext distribution can convert gettext catalogs into + catalogs that catopen can use. +

    +
  • +
+ +

+A new, standards-conformant non-virtual member function signature was +added for 'open' so that a directory could be specified with a given +message catalog. This simplifies calling conventions for the gnu +model. +

+ +

+The rest of this document discusses details of the GNU model. +

+ +

+The messages facet, because it is retrieving and converting between +characters sets, depends on the ctype and perhaps the codecvt facet in +a given locale. In addition, underlying "C" library locale support is +necessary for more than just the LC_MESSAGES mask: +LC_CTYPE is also necessary. To avoid any unpleasantness, all +bits of the "C" mask (ie LC_ALL) are set before retrieving +messages. +

+ +

+Making the message catalogs can be initially tricky, but become quite +simple with practice. For complete info, see the gettext +documentation. Here's an idea of what is required: +

+ +
    +
  • Make a source file with the required string literals + that need to be translated. See + intl/string_literals.cc for an example. +
  • + +
  • Make initial catalog (see "4 Making the PO Template File" + from the gettext docs). +

    + xgettext --c++ --debug string_literals.cc -o libstdc++.pot +

    +
  • + +
  • Make language and country-specific locale catalogs. +

    + cp libstdc++.pot fr_FR.po +

    +

    + cp libstdc++.pot de_DE.po +

    +
  • + +
  • Edit localized catalogs in emacs so that strings are + translated. +

    + emacs fr_FR.po +

    +
  • + +
  • Make the binary mo files. +

    + msgfmt fr_FR.po -o fr_FR.mo +

    +

    + msgfmt de_DE.po -o de_DE.mo +

    +
  • + +
  • Copy the binary files into the correct directory structure. +

    + cp fr_FR.mo (dir)/fr_FR/LC_MESSAGES/libstdc++.mo +

    +

    + cp de_DE.mo (dir)/de_DE/LC_MESSAGES/libstdc++.mo +

    +
  • + +
  • Use the new message catalogs. +

    + locale loc_de("de_DE"); +

    +

    + + use_facet<messages<char> >(loc_de).open("libstdc++", locale(), dir); + +

    +
  • +
+ +

+5. Examples +

+ +
    +
  • message converting, simple example using the GNU model. + +
    +#include <iostream>
    +#include <locale>
    +using namespace std;
    +
    +void test01()
    +{
    +  typedef messages<char>::catalog catalog;
    +  const char* dir =
    +  "/mnt/egcs/build/i686-pc-linux-gnu/libstdc++/po/share/locale";  
    +  const locale loc_de("de_DE");
    +  const messages<char>& mssg_de = use_facet<messages<char> >(loc_de); 
    +
    +  catalog cat_de = mssg_de.open("libstdc++", loc_de, dir);
    +  string s01 = mssg_de.get(cat_de, 0, 0, "please");
    +  string s02 = mssg_de.get(cat_de, 0, 0, "thank you");
    +  cout << "please in german:" << s01 << '\n';
    +  cout << "thank you in german:" << s02 << '\n';
    +  mssg_de.close(cat_de);
    +}
    +
    +
  • +
+ +More information can be found in the following testcases: +
    +
  • testsuite/22_locale/messages.cc
  • +
  • testsuite/22_locale/messages_byname.cc
  • +
  • testsuite/22_locale/messages_char_members.cc
  • +
+ +

+6. Unresolved Issues +

+
    +
  • Things that are sketchy, or remain unimplemented: +
      +
    • _M_convert_from_char, _M_convert_to_char are in + flux, depending on how the library ends up doing + character set conversions. It might not be possible to + do a real character set based conversion, due to the + fact that the template parameter for messages is not + enough to instantiate the codecvt facet (1 supplied, + need at least 2 but would prefer 3). +
    • + +
    • There are issues with gettext needing the global + locale set to extract a message. This dependence on + the global locale makes the current "gnu" model non + MT-safe. Future versions of glibc, ie glibc 2.3.x will + fix this, and the C++ library bits are already in + place. +
    • +
    +
  • + +
  • Development versions of the GNU "C" library, glibc 2.3 will allow + a more efficient, MT implementation of std::messages, and will + allow the removal of the _M_name_messages data member. If this + is done, it will change the library ABI. The C++ parts to + support glibc 2.3 have already been coded, but are not in use: + once this version of the "C" library is released, the marked + parts of the messages implementation can be switched over to + the new "C" library functionality. +
  • +
  • At some point in the near future, std::numpunct will probably use + std::messages facilities to implement truename/falename + correctly. This is currently not done, but entries in + libstdc++.pot have already been made for "true" and "false" + string literals, so all that remains is the std::numpunct + coding and the configure/make hassles to make the installed + library search its own catalog. Currently the libstdc++.mo + catalog is only searched for the testsuite cases involving + messages members. +
  • + +
  • The following member functions: + +

    + + catalog + open(const basic_string<char>& __s, const locale& __loc) const + +

    + +

    + + catalog + open(const basic_string<char>&, const locale&, const char*) const; + +

    + +

    + Don't actually return a "value less than 0 if no such catalog + can be opened" as required by the standard in the "gnu" + model. As of this writing, it is unknown how to query to see + if a specified message catalog exists using the gettext + package. +

    +
  • +
+ +

+7. Acknowledgments +

+Ulrich Drepper for the character set explanations, gettext details, +and patient answering of late-night questions, Tom Tromey for the java details. + + +

+8. Bibliography / Referenced Documents +

+ +Drepper, Ulrich, GNU libc (glibc) 2.2 manual. In particular, Chapters +"7 Locales and Internationalization" + +

+Drepper, Ulrich, Thread-Aware Locale Model, A proposal. This is a +draft document describing the design of glibc 2.3 MT locale +functionality. +

+ +

+Drepper, Ulrich, Numerous, late-night email correspondence +

+ +

+ISO/IEC 9899:1999 Programming languages - C +

+ +

+ISO/IEC 14882:1998 Programming languages - C++ +

+ +

+Java 2 Platform, Standard Edition, v 1.3.1 API Specification. In +particular, java.util.Properties, java.text.MessageFormat, +java.util.Locale, java.util.ResourceBundle. +http://java.sun.com/j2se/1.3/docs/api +

+ +

+System Interface Definitions, Issue 7 (IEEE Std. 1003.1-200x) +The Open Group/The Institute of Electrical and Electronics Engineers, Inc. +In particular see lines 5268-5427. +http://www.opennc.org/austin/docreg.html +

+ +

GNU gettext tools, version 0.10.38, Native Language Support +Library and Tools. +http://sources.redhat.com/gettext +

+ +

+Langer, Angelika and Klaus Kreft, Standard C++ IOStreams and Locales, +Advanced Programmer's Guide and Reference, Addison Wesley Longman, +Inc. 2000. See page 725, Internationalized Messages. +

+ +

+Stroustrup, Bjarne, Appendix D, The C++ Programming Language, Special Edition, Addison Wesley, Inc. 2000 +

+ + + + diff --git a/libstdc++-v3/doc/html/23_containers/howto.html b/libstdc++-v3/doc/html/23_containers/howto.html new file mode 100644 index 00000000000..c4b6eb856f5 --- /dev/null +++ b/libstdc++-v3/doc/html/23_containers/howto.html @@ -0,0 +1,457 @@ + + + + + + + + + + + libstdc++ HOWTO: Chapter 23: Containers + + + + + + + + + +

Chapter 23: Containers

+ +

Chapter 23 deals with container classes and what they offer. +

+ + + +
+

Contents

+ + +
+ + + +

Making code unaware of the container/array difference

+

You're writing some code and can't decide whether to use builtin + arrays or some kind of container. There are compelling reasons + to use one of the container classes, but you're afraid that you'll + eventually run into difficulties, change everything back to arrays, + and then have to change all the code that uses those data types to + keep up with the change. +

+

If your code makes use of the standard algorithms, this isn't as + scary as it sounds. The algorithms don't know, nor care, about + the kind of "container" on which they work, since the + algorithms are only given endpoints to work with. For the container + classes, these are iterators (usually begin() and + end(), but not always). For builtin arrays, these are + the address of the first element and the + past-the-end element. +

+

Some very simple wrapper functions can hide all of that from the + rest of the code. For example, a pair of functions called + beginof can be written, one that takes an array, another + that takes a vector. The first returns a pointer to the first + element, and the second returns the vector's begin() + iterator. +

+

The functions should be made template functions, and should also + be declared inline. As pointed out in the comments in the code + below, this can lead to beginof being optimized out of + existence, so you pay absolutely nothing in terms of increased + code size or execution time. +

+

The result is that if all your algorithm calls look like +

+
+   std::transform(beginof(foo), endof(foo), beginof(foo), SomeFunction);
+

then the type of foo can change from an array of ints to a vector + of ints to a deque of ints and back again, without ever changing any + client code. +

+

This author has a collection of such functions, called "*of" + because they all extend the builtin "sizeof". It started + with some Usenet discussions on a transparent way to find the length + of an array. A simplified and much-reduced version for easier + reading is given here. +

+

Astute readers will notice two things at once: first, that the + container class is still a vector<T> instead of a + more general Container<T>. This would mean that + three functions for deque would have to be added, another + three for list, and so on. This is due to problems with + getting template resolution correct; I find it easier just to + give the extra three lines and avoid confusion. +

+

Second, the line +

+
+    inline unsigned int lengthof (T (&)[sz]) { return sz; } 
+

looks just weird! Hint: unused parameters can be left nameless. +

+

Return to top of page or + to the FAQ. +

+ +
+

Variable-sized bitmasks

+

No, you cannot write code of the form +

+ +
+      #include <bitset>
+
+      void foo (size_t n)
+      {
+          std::bitset<n>   bits;
+          ....
+      } 
+

because n must be known at compile time. Your compiler is + correct; it is not a bug. That's the way templates work. (Yes, it + is a feature.) +

+

There are a couple of ways to handle this kind of thing. Please + consider all of them before passing judgement. They include, in + no particular order: +

+
    +
  • A very large N in bitset<N>.
  • +
  • A container<bool>.
  • +
  • Extremely weird solutions.
  • +
+

A very large N in + bitset<N>.   It has + been pointed out a few times in newsgroups that N bits only takes up + (N/8) bytes on most systems, and division by a factor of eight is pretty + impressive when speaking of memory. Half a megabyte given over to a + bitset (recall that there is zero space overhead for housekeeping info; + it is known at compile time exactly how large the set is) will hold over + four million bits. If you're using those bits as status flags (e.g., + "changed"/"unchanged" flags), that's a lot + of state. +

+

You can then keep track of the "maximum bit used" during some + testing runs on representative data, make note of how many of those bits + really need to be there, and then reduce N to a smaller number. Leave + some extra space, of course. (If you plan to write code like the + incorrect example above, where the bitset is a local variable, then you + may have to talk your compiler into allowing that much stack space; + there may be zero space overhead, but it's all allocated inside the + object.) +

+

A container<bool>.   The Committee + made provision + for the space savings possible with that (N/8) usage previously mentioned, + so that you don't have to do wasteful things like + Container<char> or + Container<short int>. + Specifically, vector<bool> is required to be + specialized for that space savings. +

+

The problem is that vector<bool> doesn't behave like a + normal vector anymore. There have been recent journal articles which + discuss the problems (the ones by Herb Sutter in the May and + July/August 1999 issues of + C++ Report cover it well). Future revisions of the ISO C++ + Standard will change the requirement for vector<bool> + specialization. In the meantime, deque<bool> is + recommended (although its behavior is sane, you probably will not get + the space savings, but the allocation scheme is different than that + of vector). +

+

Extremely weird solutions.   If you have + access to + the compiler and linker at runtime, you can do something insane, like + figuring out just how many bits you need, then writing a temporary + source code file. That file contains an instantiation of + bitset + for the required number of bits, inside some wrapper functions with + unchanging signatures. Have your program then call the + compiler on that file using Position Independent Code, then open the + newly-created object file and load those wrapper functions. You'll have + an instantiation of bitset<N> for the exact + N + that you need at the time. Don't forget to delete the temporary files. + (Yes, this can be, and has been, done.) +

+ +

This would be the approach of either a visionary genius or a raving + lunatic, depending on your programming and management style. Probably + the latter. +

+

Which of the above techniques you use, if any, are up to you and your + intended application. Some time/space profiling is indicated if it + really matters (don't just guess). And, if you manage to do anything + along the lines of the third category, the author would love to hear + from you... +

+

Also note that the implementation of bitset used in libstdc++ has + some extensions. +

+

Return to top of page or + to the FAQ. +

+ +
+

Containers and multithreading

+

This section discusses issues surrounding the design of + multithreaded applications which use Standard C++ containers. + All information in this section is current as of the gcc 3.0 + release and all later point releases. Although earlier gcc + releases had a different approach to threading configuration and + proper compilation, the basic code design rules presented here + were similar. For information on all other aspects of + multithreading as it relates to libstdc++, including details on + the proper compilation of threaded code (and compatibility between + threaded and non-threaded code), see Chapter 17. +

+

Two excellent pages to read when working with the Standard C++ + containers and threads are + SGI's + http://www.sgi.com/tech/stl/thread_safety.html and + SGI's + http://www.sgi.com/tech/stl/Allocators.html. +

+

However, please ignore all discussions about the user-level + configuration of the lock implementation inside the STL + container-memory allocator on those pages. For the sake of this + discussion, libstdc++ configures the SGI STL implementation, + not you. This is quite different from how gcc pre-3.0 worked. + In particular, past advice was for people using g++ to + explicitly define _PTHREADS or other macros or port-specific + compilation options on the command line to get a thread-safe + STL. This is no longer required for any port and should no + longer be done unless you really know what you are doing and + assume all responsibility. +

+

Since the container implementation of libstdc++ uses the SGI + code, we use the same definition of thread safety as SGI when + discussing design. A key point that beginners may miss is the + fourth major paragraph of the first page mentioned above + ("For most clients,"...), which points out that + locking must nearly always be done outside the container, by + client code (that'd be you, not us). There is a notable + exceptions to this rule. Allocators called while a container or + element is constructed uses an internal lock obtained and + released solely within libstdc++ code (in fact, this is the + reason STL requires any knowledge of the thread configuration). +

+

For implementing a container which does its own locking, it is + trivial to provide a wrapper class which obtains the lock (as + SGI suggests), performs the container operation, and then + releases the lock. This could be templatized to a certain + extent, on the underlying container and/or a locking + mechanism. Trying to provide a catch-all general template + solution would probably be more trouble than it's worth. +

+

The STL implementation is currently configured to use the + high-speed caching memory allocator. Some people like to + test and/or normally run threaded programs with a different + default. For all details about how to globally override this + at application run-time see here. +

+

There is a better way (not standardized yet): It is possible to + force the malloc-based allocator on a per-case-basis for some + application code. The library team generally believes that this + is a better way to tune an application for high-speed using this + implementation of the STL. There is + more information on allocators here. +

+

Return to top of page or + to the FAQ. +

+ +
+

"Hinting" during insertion

+

Section [23.1.2], Table 69, of the C++ standard lists this function + for all of the associative containers (map, set, etc): +

+
+      a.insert(p,t);
+

where 'p' is an iterator into the container 'a', and 't' is the item + to insert. The standard says that "t is inserted + as close as possible to the position just prior to + p." (Library DR #233 addresses this topic, referring to + N1780. + Since version 4.2 GCC implements the resolution to DR 233, so that + insertions happen as close as possible to the hint. For earlier releases + the hint was only used as described below. +

+

Here we'll describe how the hinting works in the libstdc++ + implementation, and what you need to do in order to take advantage of + it. (Insertions can change from logarithmic complexity to amortized + constant time, if the hint is properly used.) Also, since the current + implementation is based on the SGI STL one, these points may hold true + for other library implementations also, since the HP/SGI code is used + in a lot of places. +

+

In the following text, the phrases greater than and less + than refer to the results of the strict weak ordering imposed on + the container by its comparison object, which defaults to (basically) + "<". Using those phrases is semantically sloppy, but I + didn't want to get bogged down in syntax. I assume that if you are + intelligent enough to use your own comparison objects, you are also + intelligent enough to assign "greater" and "lesser" + their new meanings in the next paragraph. *grin* +

+

If the hint parameter ('p' above) is equivalent to: +

+
    +
  • begin(), then the item being inserted should have a key + less than all the other keys in the container. The item will + be inserted at the beginning of the container, becoming the new + entry at begin(). +
  • +
  • end(), then the item being inserted should have a key + greater than all the other keys in the container. The item will + be inserted at the end of the container, becoming the new entry + at end(). +
  • +
  • neither begin() nor end(), then: Let h + be the entry in the container pointed to by hint, that + is, h = *hint. Then the item being inserted should have + a key less than that of h, and greater than that of the + item preceding h. The new item will be inserted + between h and h's predecessor. +
  • +
+

For multimap and multiset, the restrictions are + slightly looser: "greater than" should be replaced by + "not less than" and "less than" should be replaced + by "not greater than." (Why not replace greater with + greater-than-or-equal-to? You probably could in your head, but the + mathematicians will tell you that it isn't the same thing.) +

+

If the conditions are not met, then the hint is not used, and the + insertion proceeds as if you had called a.insert(t) + instead. (Note that GCC releases prior to 3.0.2 + had a bug in the case with hint == begin() for the + map and set classes. You should not use a hint + argument in those releases.) +

+

This behavior goes well with other containers' insert() + functions which take an iterator: if used, the new item will be + inserted before the iterator passed as an argument, same as the other + containers. +

+

Note also that the hint in this implementation is a + one-shot. The older insertion-with-hint routines check the immediately + surrounding entries to ensure that the new item would in fact belong + there. If the hint does not point to the correct place, then no + further local searching is done; the search begins from scratch in + logarithmic time. +

+

Return to top of page or + to the FAQ. +

+ +
+

Bitmasks and string arguments

+

Bitmasks do not take char* nor const char* arguments in their + constructors. This is something of an accident, but you can read + about the problem: follow the library's "Links" from the + homepage, and from the C++ information "defect reflector" + link, select the library issues list. Issue number 116 describes the + problem. +

+

For now you can simply make a temporary string object using the + constructor expression: +

+
+      std::bitset<5> b ( std::string("10110") );
+      
+ instead of +
+      std::bitset<5> b ( "10110" );    // invalid
+      
+

Return to top of page or + to the FAQ. +

+ +
+

std::list::size() is O(n)!

+

Yes it is, and that's okay. This is a decision that we preserved when + we imported SGI's STL implementation. The following is quoted from + their FAQ: +

+
+

The size() member function, for list and slist, takes time + proportional to the number of elements in the list. This was a + deliberate tradeoff. The only way to get a constant-time size() for + linked lists would be to maintain an extra member variable containing + the list's size. This would require taking extra time to update that + variable (it would make splice() a linear time operation, for example), + and it would also make the list larger. Many list algorithms don't + require that extra word (algorithms that do require it might do better + with vectors than with lists), and, when it is necessary to maintain + an explicit size count, it's something that users can do themselves. +

+

This choice is permitted by the C++ standard. The standard says that + size() "should" be constant time, and "should" + does not mean the same thing as "shall". This is the + officially recommended ISO wording for saying that an implementation + is supposed to do something unless there is a good reason not to. +

+

One implication of linear time size(): you should never write +

+
+         if (L.size() == 0)
+             ...
+ Instead, you should write +
+         if (L.empty())
+             ...
+
+

Return to top of page or + to the FAQ. +

+ +
+

Space overhead management for vectors

+

In + this + message to the list, Daniel Kostecky announced work on an + alternate form of std::vector that would support hints + on the number of elements to be over-allocated. The design was also + described, along with possible implementation choices. +

+

The first two alpha releases were announced + here + and + here. + The releases themselves are available at + + http://www.kotelna.sk/dk/sw/caphint/. +

+

Return to top of page or + to the FAQ. +

+ + + + +
+

+See license.html for copying conditions. +Comments and suggestions are welcome, and may be sent to +the libstdc++ mailing list. +

+ + + + diff --git a/libstdc++-v3/doc/html/23_containers/wrappers_h.txt b/libstdc++-v3/doc/html/23_containers/wrappers_h.txt new file mode 100644 index 00000000000..53b59204220 --- /dev/null +++ b/libstdc++-v3/doc/html/23_containers/wrappers_h.txt @@ -0,0 +1,48 @@ + +/***************************************************************** + * Functions to help treat arrays in a uniform manner. These were + * inspired by a thread on comp.lang.c++.moderated, started by Dietmar + * Kuehl and contributed to by the rest of the entire planet. + * + * beginof (x), endof (x), lengthof (x) now accompany sizeof, where x + * can be either a container (currently only sequences) or a builtin + * array (/not/ a pointer). The beginof/endof are intended for use in + * the algorithms library, and lengthof is a "sizing" function. + * + * Note example: + * char an_array [17]; + * cerr << lengthof(an_array) << endl; + * produces assembly code of + * mov 17,register0 + * call ofstream_put + * i.e., the template function inlining really does work; g++ + * requires -O3 (or -finline-functions) before it does this, though. + * + * pedwards 13Nov98 +*/ +// beginof +template + inline typename vector::iterator beginof (vector &v) + { return v.begin(); } + +template + inline T* beginof (T (&array)[sz]) { return array; } + + +// endof +template + inline typename vector::iterator endof (vector &v) + { return v.end(); } + +template + inline T* endof (T (&array)[sz]) { return array + sz; } + + +// lengthof +template + inline typename vector::size_type lengthof (vector &v) + { return v.size(); } + +template + inline unsigned int lengthof (T (&)[sz]) { return sz; } + diff --git a/libstdc++-v3/doc/html/24_iterators/howto.html b/libstdc++-v3/doc/html/24_iterators/howto.html new file mode 100644 index 00000000000..7c2f106ac31 --- /dev/null +++ b/libstdc++-v3/doc/html/24_iterators/howto.html @@ -0,0 +1,200 @@ + + + + + + + + + + + libstdc++ HOWTO: Chapter 24: Iterators + + + + + + + + + +

Chapter 24: Iterators

+ +

Chapter 24 deals with the FORTRAN subroutines for automatically + transforming lemmings into gold. +

+ + + +
+

Contents

+ + +
+ + + +

They ain't pointers!

+

FAQ 5.1 points out that iterators + are not implemented as pointers. They are a generalization of + pointers, but they are implemented in libstdc++ as separate classes. +

+

Keeping that simple fact in mind as you design your code will + prevent a whole lot of difficult-to-understand bugs. +

+

You can think of it the other way 'round, even. Since iterators + are a generalization, that means that pointers are + iterators, and that pointers can be used whenever an + iterator would be. All those functions in the Algorithms chapter + of the Standard will work just as well on plain arrays and their + pointers. +

+

That doesn't mean that when you pass in a pointer, it gets wrapped + into some special delegating iterator-to-pointer class with a layer + of overhead. (If you think that's the case anywhere, you don't + understand templates to begin with...) Oh, no; if you pass + in a pointer, then the compiler will instantiate that template + using T* as a type, and good old high-speed pointer arithmetic as + its operations, so the resulting code will be doing exactly the same + things as it would be doing if you had hand-coded it yourself (for + the 273rd time). +

+

How much overhead is there when using an iterator class? + Very little. Most of the layering classes contain nothing but + typedefs, and typedefs are "meta-information" that simply + tell the compiler some nicknames; they don't create code. That + information gets passed down through inheritance, so while the + compiler has to do work looking up all the names, your runtime code + does not. (This has been a prime concern from the beginning.) +

+

Return to top of page or + to the FAQ. +

+ +
+

It ends where?

+

This starts off sounding complicated, but is actually very easy, + especially towards the end. Trust me. +

+

Beginners usually have a little trouble understand the whole + 'past-the-end' thing, until they remember their early algebra classes + (see, they told you that stuff would come in handy!) and + the concept of half-open ranges. +

+

First, some history, and a reminder of some of the funkier rules in + C and C++ for builtin arrays. The following rules have always been + true for both languages: +

+
    +
  1. You can point anywhere in the array, or to the first element + past the end of the array. A pointer that points to one + past the end of the array is guaranteed to be as unique as a + pointer to somewhere inside the array, so that you can compare + such pointers safely. +
  2. +
  3. You can only dereference a pointer that points into an array. + If your array pointer points outside the array -- even to just + one past the end -- and you dereference it, Bad Things happen. +
  4. +
  5. Strictly speaking, simply pointing anywhere else invokes + undefined behavior. Most programs won't puke until such a + pointer is actually dereferenced, but the standards leave that + up to the platform. +
  6. +
+

The reason this past-the-end addressing was allowed is to make it + easy to write a loop to go over an entire array, e.g., + while (*d++ = *s++);. +

+

So, when you think of two pointers delimiting an array, don't think + of them as indexing 0 through n-1. Think of them as boundary + markers: +

+
+
+   beginning            end
+     |                   |
+     |                   |               This is bad.  Always having to
+     |                   |               remember to add or subtract one.
+     |                   |               Off-by-one bugs very common here.
+     V                   V
+        array of N elements
+     |---|---|--...--|---|---|
+     | 0 | 1 |  ...  |N-2|N-1|
+     |---|---|--...--|---|---|
+
+     ^                       ^
+     |                       |
+     |                       |           This is good.  This is safe.  This
+     |                       |           is guaranteed to work.  Just don't
+     |                       |           dereference 'end'.
+   beginning                end
+
+   
+

See? Everything between the boundary markers is part of the array. + Simple. +

+

Now think back to your junior-high school algebra course, when you + were learning how to draw graphs. Remember that a graph terminating + with a solid dot meant, "Everything up through this point," + and a graph terminating with an open dot meant, "Everything up + to, but not including, this point," respectively called closed + and open ranges? Remember how closed ranges were written with + brackets, [a,b], and open ranges were written with parentheses, + (a,b)? +

+

The boundary markers for arrays describe a half-open range, + starting with (and including) the first element, and ending with (but + not including) the last element: [beginning,end). See, I + told you it would be simple in the end. +

+

Iterators, and everything working with iterators, follows this same + time-honored tradition. A container's begin() method returns + an iterator referring to the first element, and its end() + method returns a past-the-end iterator, which is guaranteed to be + unique and comparable against any other iterator pointing into the + middle of the container. +

+

Container constructors, container methods, and algorithms, all take + pairs of iterators describing a range of values on which to operate. + All of these ranges are half-open ranges, so you pass the beginning + iterator as the starting parameter, and the one-past-the-end iterator + as the finishing parameter. +

+

This generalizes very well. You can operate on sub-ranges quite + easily this way; functions accepting a [first,last) range + don't know or care whether they are the boundaries of an entire {array, + sequence, container, whatever}, or whether they only enclose a few + elements from the center. This approach also makes zero-length + sequences very simple to recognize: if the two endpoints compare + equal, then the {array, sequence, container, whatever} is empty. +

+

Just don't dereference end(). +

+

Return to top of page or + to the FAQ. +

+ + + + + + +
+

+See license.html for copying conditions. +Comments and suggestions are welcome, and may be sent to +the libstdc++ mailing list. +

+ + + + diff --git a/libstdc++-v3/doc/html/25_algorithms/howto.html b/libstdc++-v3/doc/html/25_algorithms/howto.html new file mode 100644 index 00000000000..bb5caee354a --- /dev/null +++ b/libstdc++-v3/doc/html/25_algorithms/howto.html @@ -0,0 +1,116 @@ + + + + + + + + + + + libstdc++ HOWTO: Chapter 25: Algorithms + + + + + + + + + +

Chapter 25: Algorithms

+ +

Chapter 25 deals with the generalized subroutines for automatically + transforming lemmings into gold. +

+ + + +
+

Contents

+ + +
+ + + +

Prerequisites

+

The neatest accomplishment of the algorithms chapter is that all the + work is done via iterators, not containers directly. This means two + important things: +

+
    +
  1. Anything that behaves like an iterator can be used in one of + these algorithms. Raw pointers make great candidates, thus + built-in arrays are fine containers, as well as your own iterators. +
  2. +
  3. The algorithms do not (and cannot) affect the container as a + whole; only the things between the two iterator endpoints. If + you pass a range of iterators only enclosing the middle third of + a container, then anything outside that range is inviolate. +
  4. +
+

Even strings can be fed through the algorithms here, although the + string class has specialized versions of many of these functions (for + example, string::find()). Most of the examples on this + page will use simple arrays of integers as a playground for + algorithms, just to keep things simple. + The use of N as a size in the + examples is to keep things easy to read but probably won't be valid + code. You can use wrappers such as those described in the + containers chapter to keep + real code readable. +

+

The single thing that trips people up the most is the definition of + range used with iterators; the famous + "past-the-end" rule that everybody loves to hate. The + iterators chapter of this + document has a complete explanation of this simple rule that seems to + cause so much confusion. Once you get range into your head + (it's not that hard, honest!), then the algorithms are a cakewalk. +

+

Return to top of page or + to the FAQ. +

+ +
+

Special swaps

+

If you call std::swap(x,y); where x and y are standard + containers, then the call will automatically be replaced by a call to + x.swap(y); instead. +

+

This allows member functions of each container class to take over, and + containers' swap functions should have O(1) complexity according to + the standard. (And while "should" allows implementations to + behave otherwise and remain compliant, this implementation does in + fact use constant-time swaps.) This should not be surprising, since + for two containers of the same type to swap contents, only some + internal pointers to storage need to be exchanged. +

+

Return to top of page or + to the FAQ. +

+ + + + + + +
+

+See license.html for copying conditions. +Comments and suggestions are welcome, and may be sent to +the libstdc++ mailing list. +

+ + + + diff --git a/libstdc++-v3/doc/html/26_numerics/howto.html b/libstdc++-v3/doc/html/26_numerics/howto.html new file mode 100644 index 00000000000..e56659b3804 --- /dev/null +++ b/libstdc++-v3/doc/html/26_numerics/howto.html @@ -0,0 +1,179 @@ + + + + + + + + + + + libstdc++ HOWTO: Chapter 26: Numerics + + + + + + + + + +

Chapter 26: Numerics

+ +

Chapter 26 deals with building block abstractions to aid in + numerical computing: +

+
    +
  • Template data structures such as valarray<> + and complex<>. +
  • +
  • Template numerical functions such as accumulate, + inner_product, partial_sum, and + adjacent_difference. +
  • +
+

All of the Standard C math functions are of course included in C++, + and overloaded versions for long, float, and + long double have been added for all of them. +

+ + +
+

Contents

+ + +
+ + + +

Complex Number Processing

+

Using complex<> becomes even more comple- er, sorry, + complicated, with the not-quite-gratuitously-incompatible + addition of complex types to the C language. David Tribble has + compiled a list of C++98 and C99 conflict points; his description of + C's new type versus those of C++ and how to get them playing together + nicely is +here. +

+

complex<> is intended to be instantiated with a + floating-point type. As long as you meet that and some other basic + requirements, then the resulting instantiation has all of the usual + math operators defined, as well as definitions of op<< + and op>> that work with iostreams: op<< + prints (u,v) and op>> can read u, + (u), and (u,v). +

+

Return to top of page or + to the FAQ. +

+ +
+

Array Processing

+

One of the major reasons why FORTRAN can chew through numbers so well + is that it is defined to be free of pointer aliasing, an assumption + that C89 is not allowed to make, and neither is C++98. C99 adds a new + keyword, restrict, to apply to individual pointers. The + C++ solution is contained in the library rather than the language + (although many vendors can be expected to add this to their compilers + as an extension). +

+

That library solution is a set of two classes, five template classes, + and "a whole bunch" of functions. The classes are required + to be free of pointer aliasing, so compilers can optimize the + daylights out of them the same way that they have been for FORTRAN. + They are collectively called valarray, although strictly + speaking this is only one of the five template classes, and they are + designed to be familiar to people who have worked with the BLAS + libraries before. +

+

Some more stuff should go here once somebody has time to write it. +

+

Return to top of page or + to the FAQ. +

+ +
+

Numerical Functions

+

There are four generalized functions in the <numeric> header + that follow the same conventions as those in <algorithm>. Each + of them is overloaded: one signature for common default operations, + and a second for fully general operations. Their names are + self-explanatory to anyone who works with numerics on a regular basis: +

+
    +
  • accumulate
  • +
  • inner_product
  • +
  • partial_sum
  • +
  • adjacent_difference
  • +
+

Here is a simple example of the two forms of accumulate. +

+
+   int   ar[50];
+   int   someval = somefunction();
+
+   // ...initialize members of ar to something...
+
+   int  sum       = std::accumulate(ar,ar+50,0);
+   int  sum_stuff = std::accumulate(ar,ar+50,someval);
+   int  product   = std::accumulate(ar,ar+50,1,std::multiplies<int>());
+   
+

The first call adds all the members of the array, using zero as an + initial value for sum. The second does the same, but uses + someval as the starting value (thus, sum_stuff == sum + + someval). The final call uses the second of the two signatures, + and multiplies all the members of the array; here we must obviously + use 1 as a starting value instead of 0. +

+

The other three functions have similar dual-signature forms. +

+

Return to top of page or + to the FAQ. +

+ +
+

C99

+

In addition to the other topics on this page, we'll note here some + of the C99 features that appear in libstdc++. +

+

The C99 features depend on the --enable-c99 configure flag. + This flag is already on by default, but it can be disabled by the + user. Also, the configuration machinery will disable it if the + necessary support for C99 (e.g., header files) cannot be found. +

+

As of GCC 3.0, C99 support includes classification functions + such as isnormal, isgreater, + isnan, etc. + The functions used for 'long long' support such as strtoll + are supported, as is the lldiv_t typedef. Also supported + are the wide character functions using 'long long', like + wcstoll. +

+

Return to top of page or + to the FAQ. +

+ + + + + +
+

+See license.html for copying conditions. +Comments and suggestions are welcome, and may be sent to +the libstdc++ mailing list. +

+ + + + diff --git a/libstdc++-v3/doc/html/27_io/binary_iostreams_kanze.txt b/libstdc++-v3/doc/html/27_io/binary_iostreams_kanze.txt new file mode 100644 index 00000000000..65d79c996c5 --- /dev/null +++ b/libstdc++-v3/doc/html/27_io/binary_iostreams_kanze.txt @@ -0,0 +1,51 @@ + +From: James Kanze +Newsgroups: comp.lang.c++.moderated +Subject: Re: binary iostreams ? +Date: 3 Feb 2001 14:28:19 -0500 +Message-ID: <86lmro86qp.fsf@alex.gabi-soft.de> + +"Plinio Conti" writes: + +|> Why std c++ library stream classes are only text-oriented? + +Because that is the only universally recognized format. + +|> I mean, if I want to write an int, a float, etc. AS IT IS I can't +|> use streams, because they write and read a human readable text +|> format of numbers. + +Correct. + +|> Does anyone know how to solve the problem? + +It depends on what you really want to do. If you are just dumping a +block of memory to disk, in order to free up memory, and will reread it +later in the same run of the same program, ostream::write and +istream::read are what you need. Note, however, that this ony works 1) +in the same run of the same program, and 2) for PODs without pointers. + +If you are writing something that will be read by another program, or a +later run of the same program, you'll have to define a specific format +to use, and implement streams to input and output that. If you are +writing something that will be read by an existing program, or be +transmitted over a network to another machine, you will have to find out +what protocol is expected, and adher to it. + +|> Any public library? + +Not that I know of. I think that there is a library somewhere that +outputs in format RPC, or maybe some Internet format. + +|> What do you think about this choice? + +What other choice is possible? It's not reasonable to ask the standard +to support all binary formats, and it's not reasonable for it to favor +any one of them. Given that, what else can you do. + +-- +James Kanze mailto:kanze@gabi-soft.de +Conseils en informatique orientée objet/ + Beratung in objektorientierter Datenverarbeitung +Ziegelhüttenweg 17a, 60598 Frankfurt, Germany Tel. +49(069)63198627 + diff --git a/libstdc++-v3/doc/html/27_io/binary_iostreams_kuehl.txt b/libstdc++-v3/doc/html/27_io/binary_iostreams_kuehl.txt new file mode 100644 index 00000000000..901701ff480 --- /dev/null +++ b/libstdc++-v3/doc/html/27_io/binary_iostreams_kuehl.txt @@ -0,0 +1,89 @@ + +From: kuehl@ramsen.informatik.uni-konstanz.de (Dietmar Kuehl) +Newsgroups: comp.std.c++ +Subject: Re: binary iostreams ? +Date: Sat, 3 Feb 2001 17:17:49 GMT +Message-ID: <95hctq$suu$2@news.BelWue.DE> + +Hi, +Plinio Conti (plinio.contiNO@SPAMMINGmclink.it) wrote: +: Why std c++ library stream classes are only text-oriented? + +There is only a text oriented front end to stream buffers because text +input and output does not vary between platforms. This is very +different for binary output. For example, binary output has to consider + +- word sizes: Is an 'int' two, four, or eight bytes long? The same + questions arise for all other built-in types. + +- what is the bit pattern of a value? I think that at least implicitly + in the standard a binary representation for integer types is required. + I don't think that it is required to use two's complement. In any + case, the floating point representations do differ, eg. in their + number of bytes used. + +- what "endianess" is to be used? + +Basically it is possible to decide a format for each of those. This, +however, implies inefficient implementations on platforms where the +format does not match the internal representation. + +What many people asking for binary I/O forget is that binary I/O also +requires some form of formatting! Assuming that just writing data and +then reading it in will work is asking for problems, eg. when the +compiler version changes and they decided to use a 32 bit integer +rather than a 16 bit integer: It is not even necessary to switch +platforms to run into problems! + +: I mean, if I want to write an int, a float, etc. AS IT IS I can't use +: streams, because they write and read a human readable text format of +: numbers. + +Which is for most I/O a reasonable approach. If it is not for you, you +might want to consider a data base: File I/O is not really useful as a +persistance mechanism. It is fine eg. for user interaction (text I/O), +logging (text I/O), cross platfrom program interaction (formatted I/O), +and data exchange (formatted I/O). In all these cases, the I/O is +formatted, although possible using a binary format. For persistance, +data bases are used. Depending on your needs, a relational or an object +oriented one may be better suited. + +That said, it is worth to mention that it is easy to create a hierarchy +similar to IOStreams built on top of stream buffers but doing binary +formatting. A somewhat aged example is found at +. +This uses XDR formatting of the binary data (well, if I remmeber +correctly, it is easy to plug in a different binary formatting). + +: Does anyone know how to solve the problem? + +Use a data base, text formatting, or binary formatting. With the +details you have given it is impossible to tell which of those is the +right approach because you haven't told *why* you want a binary format +and *what* you want to do. That basically means that you came up with +solution and you want us to confirm that it is the right one without +telling us what problem is solved! Until I have seen the problem I +doubt that binary I/O is the right approach... + +... and, BTW, using 'std::istream::read()' and 'std::ostream::write()' +is almost certainly the *wrong* approach! These functions are an +historical mistake which should have been corrected in the standard: +It is my understanding that these methods were present in the IOStream +version predating the rework from Jerry Schwartz and were left in to +be compatible with the earlier stuff although they were not necessary: +You could get binary I/O from the stream buffer level. The original +IOStream library (maybe you remember using ) did not have +stream buffers and thus basic support for binary I/O was also present +on the streams level. + +: What do you think about this choice? + +When I wrote the above paragraph about confirming your choice, I haven't +read this question! As I said above: You told us what solution you have +choosen without stating what problem is solved. We cannot determine +whether your choice is the right one. Actually, I'm pretty sure it is +the wrong one but without seen the details I can't be certain. +-- + +Phaidros eaSE - Easy Software Engineering: + diff --git a/libstdc++-v3/doc/html/27_io/howto.html b/libstdc++-v3/doc/html/27_io/howto.html new file mode 100644 index 00000000000..46d03b34630 --- /dev/null +++ b/libstdc++-v3/doc/html/27_io/howto.html @@ -0,0 +1,779 @@ + + + + + + + + + + + libstdc++ HOWTO: Chapter 27: Input/Output + + + + + + + + + +

Chapter 27: Input/Output

+ +

Chapter 27 deals with iostreams and all their subcomponents + and extensions. All kinds of fun stuff. +

+ + + +
+

Contents

+ + +
+ + + +

Copying a file

+

So you want to copy a file quickly and easily, and most important, + completely portably. And since this is C++, you have an open + ifstream (call it IN) and an open ofstream (call it OUT): +

+
+   #include <fstream>
+
+   std::ifstream  IN ("input_file");
+   std::ofstream  OUT ("output_file"); 
+

Here's the easiest way to get it completely wrong: +

+
+   OUT << IN;
+

For those of you who don't already know why this doesn't work + (probably from having done it before), I invite you to quickly + create a simple text file called "input_file" containing + the sentence +

+
+      The quick brown fox jumped over the lazy dog.
+

surrounded by blank lines. Code it up and try it. The contents + of "output_file" may surprise you. +

+

Seriously, go do it. Get surprised, then come back. It's worth it. +

+
+

The thing to remember is that the basic_[io]stream classes + handle formatting, nothing else. In particular, they break up on + whitespace. The actual reading, writing, and storing of data is + handled by the basic_streambuf family. Fortunately, the + operator<< is overloaded to take an ostream and + a pointer-to-streambuf, in order to help with just this kind of + "dump the data verbatim" situation. +

+

Why a pointer to streambuf and not just a streambuf? Well, + the [io]streams hold pointers (or references, depending on the + implementation) to their buffers, not the actual + buffers. This allows polymorphic behavior on the part of the buffers + as well as the streams themselves. The pointer is easily retrieved + using the rdbuf() member function. Therefore, the easiest + way to copy the file is: +

+
+   OUT << IN.rdbuf();
+

So what was happening with OUT<<IN? Undefined + behavior, since that particular << isn't defined by the Standard. + I have seen instances where it is implemented, but the character + extraction process removes all the whitespace, leaving you with no + blank lines and only "Thequickbrownfox...". With + libraries that do not define that operator, IN (or one of IN's + member pointers) sometimes gets converted to a void*, and the output + file then contains a perfect text representation of a hexadecimal + address (quite a big surprise). Others don't compile at all. +

+

Also note that none of this is specific to o*f*streams. + The operators shown above are all defined in the parent + basic_ostream class and are therefore available with all possible + descendants. +

+

Return to top of page or + to the FAQ. +

+ +
+

The buffering is screwing up my program!

+ +

First, are you sure that you understand buffering? Particularly + the fact that C++ may not, in fact, have anything to do with it? +

+

The rules for buffering can be a little odd, but they aren't any + different from those of C. (Maybe that's why they can be a bit + odd.) Many people think that writing a newline to an output + stream automatically flushes the output buffer. This is true only + when the output stream is, in fact, a terminal and not a file + or some other device -- and that may not even be true + since C++ says nothing about files nor terminals. All of that is + system-dependent. (The "newline-buffer-flushing only occurring + on terminals" thing is mostly true on Unix systems, though.) +

+

Some people also believe that sending endl down an + output stream only writes a newline. This is incorrect; after a + newline is written, the buffer is also flushed. Perhaps this + is the effect you want when writing to a screen -- get the text + out as soon as possible, etc -- but the buffering is largely + wasted when doing this to a file: +

+
+   output << "a line of text" << endl;
+   output << some_data_variable << endl;
+   output << "another line of text" << endl; 
+

The proper thing to do in this case to just write the data out + and let the libraries and the system worry about the buffering. + If you need a newline, just write a newline: +

+
+   output << "a line of text\n"
+          << some_data_variable << '\n'
+          << "another line of text\n"; 
+

I have also joined the output statements into a single statement. + You could make the code prettier by moving the single newline to + the start of the quoted text on the last line, for example. +

+

If you do need to flush the buffer above, you can send an + endl if you also need a newline, or just flush the buffer + yourself: +

+
+   output << ...... << flush;    // can use std::flush manipulator
+   output.flush();               // or call a member fn 
+

On the other hand, there are times when writing to a file should + be like writing to standard error; no buffering should be done + because the data needs to appear quickly (a prime example is a + log file for security-related information). The way to do this is + just to turn off the buffering before any I/O operations at + all have been done (note that opening counts as an I/O operation): +

+
+   std::ofstream    os;
+   std::ifstream    is;
+   int   i;
+
+   os.rdbuf()->pubsetbuf(0,0);
+   is.rdbuf()->pubsetbuf(0,0);
+
+   os.open("/foo/bar/baz");
+   is.open("/qux/quux/quuux");
+   ...
+   os << "this data is written immediately\n";
+   is >> i;   // and this will probably cause a disk read 
+

Since all aspects of buffering are handled by a streambuf-derived + member, it is necessary to get at that member with rdbuf(). + Then the public version of setbuf can be called. The + arguments are the same as those for the Standard C I/O Library + function (a buffer area followed by its size). +

+

A great deal of this is implementation-dependent. For example, + streambuf does not specify any actions for its own + setbuf()-ish functions; the classes derived from + streambuf each define behavior that "makes + sense" for that class: an argument of (0,0) turns off buffering + for filebuf but does nothing at all for its siblings + stringbuf and strstreambuf, and specifying + anything other than (0,0) has varying effects. + User-defined classes derived from streambuf can + do whatever they want. (For filebuf and arguments for + (p,s) other than zeros, libstdc++ does what you'd expect: + the first s bytes of p are used as a buffer, + which you must allocate and deallocate.) +

+

A last reminder: there are usually more buffers involved than + just those at the language/library level. Kernel buffers, disk + buffers, and the like will also have an effect. Inspecting and + changing those are system-dependent. +

+

Return to top of page or + to the FAQ. +

+ +
+

Binary I/O

+

The first and most important thing to remember about binary I/O is + that opening a file with ios::binary is not, repeat + not, the only thing you have to do. It is not a silver + bullet, and will not allow you to use the <</>> + operators of the normal fstreams to do binary I/O. +

+

Sorry. Them's the breaks. +

+

This isn't going to try and be a complete tutorial on reading and + writing binary files (because "binary" + covers a lot of ground), but we will try and clear + up a couple of misconceptions and common errors. +

+

First, ios::binary has exactly one defined effect, no more + and no less. Normal text mode has to be concerned with the newline + characters, and the runtime system will translate between (for + example) '\n' and the appropriate end-of-line sequence (LF on Unix, + CRLF on DOS, CR on Macintosh, etc). (There are other things that + normal mode does, but that's the most obvious.) Opening a file in + binary mode disables this conversion, so reading a CRLF sequence + under Windows won't accidentally get mapped to a '\n' character, etc. + Binary mode is not supposed to suddenly give you a bitstream, and + if it is doing so in your program then you've discovered a bug in + your vendor's compiler (or some other part of the C++ implementation, + possibly the runtime system). +

+

Second, using << to write and >> to + read isn't going to work with the standard file stream classes, even + if you use skipws during reading. Why not? Because + ifstream and ofstream exist for the purpose of formatting, + not reading and writing. Their job is to interpret the data into + text characters, and that's exactly what you don't want to happen + during binary I/O. +

+

Third, using the get() and put()/write() member + functions still aren't guaranteed to help you. These are + "unformatted" I/O functions, but still character-based. + (This may or may not be what you want, see below.) +

+

Notice how all the problems here are due to the inappropriate use + of formatting functions and classes to perform something + which requires that formatting not be done? There are a + seemingly infinite number of solutions, and a few are listed here: +

+
    +
  • "Derive your own fstream-type classes and write your own + <</>> operators to do binary I/O on whatever data + types you're using." This is a Bad Thing, because while + the compiler would probably be just fine with it, other humans + are going to be confused. The overloaded bitshift operators + have a well-defined meaning (formatting), and this breaks it. +
  • +
  • "Build the file structure in memory, then mmap() + the file and copy the structure." Well, this is easy to + make work, and easy to break, and is pretty equivalent to + using ::read() and ::write() directly, and + makes no use of the iostream library at all... +
  • +
  • "Use streambufs, that's what they're there for." + While not trivial for the beginner, this is the best of all + solutions. The streambuf/filebuf layer is the layer that is + responsible for actual I/O. If you want to use the C++ + library for binary I/O, this is where you start. +
  • +
+

How to go about using streambufs is a bit beyond the scope of this + document (at least for now), but while streambufs go a long way, + they still leave a couple of things up to you, the programmer. + As an example, byte ordering is completely between you and the + operating system, and you have to handle it yourself. +

+

Deriving a streambuf or filebuf + class from the standard ones, one that is specific to your data + types (or an abstraction thereof) is probably a good idea, and + lots of examples exist in journals and on Usenet. Using the + standard filebufs directly (either by declaring your own or by + using the pointer returned from an fstream's rdbuf()) + is certainly feasible as well. +

+

One area that causes problems is trying to do bit-by-bit operations + with filebufs. C++ is no different from C in this respect: I/O + must be done at the byte level. If you're trying to read or write + a few bits at a time, you're going about it the wrong way. You + must read/write an integral number of bytes and then process the + bytes. (For example, the streambuf functions take and return + variables of type int_type.) +

+

Another area of problems is opening text files in binary mode. + Generally, binary mode is intended for binary files, and opening + text files in binary mode means that you now have to deal with all of + those end-of-line and end-of-file problems that we mentioned before. + An instructive thread from comp.lang.c++.moderated delved off into + this topic starting more or less at + this + article and continuing to the end of the thread. (You'll have to + sort through some flames every couple of paragraphs, but the points + made are good ones.) +

+ +
+

What is this <sstream>/stringstreams thing?

+

Stringstreams (defined in the header <sstream>) + are in this author's opinion one of the coolest things since + sliced time. An example of their use is in the Received Wisdom + section for Chapter 21 (Strings), + describing how to + format strings. +

+

The quick definition is: they are siblings of ifstream and ofstream, + and they do for std::string what their siblings do for + files. All that work you put into writing << and + >> functions for your classes now pays off + again! Need to format a string before passing the string + to a function? Send your stuff via << to an + ostringstream. You've read a string as input and need to parse it? + Initialize an istringstream with that string, and then pull pieces + out of it with >>. Have a stringstream and need to + get a copy of the string inside? Just call the str() + member function. +

+

This only works if you've written your + <</>> functions correctly, though, + and correctly means that they take istreams and ostreams as + parameters, not ifstreams and ofstreams. If they + take the latter, then your I/O operators will work fine with + file streams, but with nothing else -- including stringstreams. +

+

If you are a user of the strstream classes, you need to update + your code. You don't have to explicitly append ends to + terminate the C-style character array, you don't have to mess with + "freezing" functions, and you don't have to manage the + memory yourself. The strstreams have been officially deprecated, + which means that 1) future revisions of the C++ Standard won't + support them, and 2) if you use them, people will laugh at you. +

+ +
+

Deriving a stream buffer

+

Creating your own stream buffers for I/O can be remarkably easy. + If you are interested in doing so, we highly recommend two very + excellent books: + Standard C++ + IOStreams and Locales by Langer and Kreft, ISBN 0-201-18395-1, and + The C++ Standard Library + by Nicolai Josuttis, ISBN 0-201-37926-0. Both are published by + Addison-Wesley, who isn't paying us a cent for saying that, honest. +

+

Here is a simple example, io/outbuf1, from the Josuttis text. It + transforms everything sent through it to uppercase. This version + assumes many things about the nature of the character type being + used (for more information, read the books or the newsgroups): +

+
+    #include <iostream>
+    #include <streambuf>
+    #include <locale>
+    #include <cstdio>
+
+    class outbuf : public std::streambuf
+    {
+      protected:
+	/* central output function
+	 * - print characters in uppercase mode
+	 */
+	virtual int_type overflow (int_type c) {
+	    if (c != EOF) {
+		// convert lowercase to uppercase
+		c = std::toupper(static_cast<char>(c),getloc());
+
+		// and write the character to the standard output
+		if (putchar(c) == EOF) {
+		    return EOF;
+		}
+	    }
+	    return c;
+	}
+    };
+
+    int main()
+    {
+	// create special output buffer
+	outbuf ob;
+	// initialize output stream with that output buffer
+	std::ostream out(&ob);
+
+	out << "31 hexadecimal: "
+	    << std::hex << 31 << std::endl;
+	return 0;
+    }
+   
+

Try it yourself! More examples can be found in 3.1.x code, in + include/ext/*_filebuf.h, and on + Dietmar + Kühl's IOStreams page. +

+ +
+

More on binary I/O

+

Towards the beginning of February 2001, the subject of + "binary" I/O was brought up in a couple of places at the + same time. One notable place was Usenet, where James Kanze and + Dietmar Kühl separately posted articles on why attempting + generic binary I/O was not a good idea. (Here are copies of + Kanze's article and + Kühl's article.) +

+

Briefly, the problems of byte ordering and type sizes mean that + the unformatted functions like ostream::put() and + istream::get() cannot safely be used to communicate + between arbitrary programs, or across a network, or from one + invocation of a program to another invocation of the same program + on a different platform, etc. +

+

The entire Usenet thread is instructive, and took place under the + subject heading "binary iostreams" on both comp.std.c++ + and comp.lang.c++.moderated in parallel. Also in that thread, + Dietmar Kühl mentioned that he had written a pair of stream + classes that would read and write XDR, which is a good step towards + a portable binary format. +

+ +
+

Pathetic performance? Ditch C.

+

It sounds like a flame on C, but it isn't. Really. Calm down. + I'm just saying it to get your attention. +

+

Because the C++ library includes the C library, both C-style and + C++-style I/O have to work at the same time. For example: +

+
+     #include <iostream>
+     #include <cstdio>
+
+     std::cout << "Hel";
+     std::printf ("lo, worl");
+     std::cout << "d!\n";
+   
+

This must do what you think it does. +

+

Alert members of the audience will immediately notice that buffering + is going to make a hash of the output unless special steps are taken. +

+

The special steps taken by libstdc++, at least for version 3.0, + involve doing very little buffering for the standard streams, leaving + most of the buffering to the underlying C library. (This kind of + thing is tricky to get right.) + The upside is that correctness is ensured. The downside is that + writing through cout can quite easily lead to awful + performance when the C++ I/O library is layered on top of the C I/O + library (as it is for 3.0 by default). Some patches have been applied + which improve the situation for 3.1. +

+

However, the C and C++ standard streams only need to be kept in sync + when both libraries' facilities are in use. If your program only uses + C++ I/O, then there's no need to sync with the C streams. The right + thing to do in this case is to call +

+
+     #include any of the I/O headers such as ios, iostream, etc
+
+     std::ios::sync_with_stdio(false);
+   
+

You must do this before performing any I/O via the C++ stream objects. + Once you call this, the C++ streams will operate independently of the + (unused) C streams. For GCC 3.x, this means that cout and + company will become fully buffered on their own. +

+

Note, by the way, that the synchronization requirement only applies to + the standard streams (cin, cout, + cerr, + clog, and their wide-character counterparts). File stream + objects that you declare yourself have no such requirement and are fully + buffered. +

+ +
+

Threads and I/O

+

I'll assume that you have already read the + general notes on library threads, + and the + notes on threaded container + access (you might not think of an I/O stream as a container, but + the points made there also hold here). If you have not read them, + please do so first. +

+

This gets a bit tricky. Please read carefully, and bear with me. +

+

Structure

+

A wrapper + type called __basic_file provides our abstraction layer + for the std::filebuf classes. Nearly all decisions dealing + with actual input and output must be made in __basic_file. +

+

A generic locking mechanism is somewhat in place at the filebuf layer, + but is not used in the current code. Providing locking at any higher + level is akin to providing locking within containers, and is not done + for the same reasons (see the links above). +

+

The defaults for 3.0.x

+

The __basic_file type is simply a collection of small wrappers around + the C stdio layer (again, see the link under Structure). We do no + locking ourselves, but simply pass through to calls to fopen, + fwrite, and so forth. +

+

So, for 3.0, the question of "is multithreading safe for I/O" + must be answered with, "is your platform's C library threadsafe + for I/O?" Some are by default, some are not; many offer multiple + implementations of the C library with varying tradeoffs of threadsafety + and efficiency. You, the programmer, are always required to take care + with multiple threads. +

+

(As an example, the POSIX standard requires that C stdio FILE* + operations are atomic. POSIX-conforming C libraries (e.g, on Solaris + and GNU/Linux) have an internal mutex to serialize operations on + FILE*s. However, you still need to not do stupid things like calling + fclose(fs) in one thread followed by an access of + fs in another.) +

+

So, if your platform's C library is threadsafe, then your + fstream I/O operations will be threadsafe at the lowest + level. For higher-level operations, such as manipulating the data + contained in the stream formatting classes (e.g., setting up callbacks + inside an std::ofstream), you need to guard such accesses + like any other critical shared resource. +

+

The future

+

A + second choice may be available for I/O implementations: libio. This is + disabled by default, and in fact will not currently work due to other + issues. It will be revisited, however. +

+

The libio code is a subset of the guts of the GNU libc (glibc) I/O + implementation. When libio is in use, the __basic_file + type is basically derived from FILE. (The real situation is more + complex than that... it's derived from an internal type used to + implement FILE. See libio/libioP.h to see scary things done with + vtbls.) The result is that there is no "layer" of C stdio + to go through; the filebuf makes calls directly into the same + functions used to implement fread, fwrite, + and so forth, using internal data structures. (And when I say + "makes calls directly," I mean the function is literally + replaced by a jump into an internal function. Fast but frightening. + *grin*) +

+

Also, the libio internal locks are used. This requires pulling in + large chunks of glibc, such as a pthreads implementation, and is one + of the issues preventing widespread use of libio as the libstdc++ + cstdio implementation. +

+

But we plan to make this work, at least as an option if not a future + default. Platforms running a copy of glibc with a recent-enough + version will see calls from libstdc++ directly into the glibc already + installed. For other platforms, a copy of the libio subsection will + be built and included in libstdc++. +

+

Alternatives

+

Don't forget that other cstdio implementations are possible. You could + easily write one to perform your own forms of locking, to solve your + "interesting" problems. +

+ +
+

Which header?

+

To minimize the time you have to wait on the compiler, it's good to + only include the headers you really need. Many people simply include + <iostream> when they don't need to -- and that can penalize + your runtime as well. Here are some tips on which header to use + for which situations, starting with the simplest. +

+

<iosfwd> should be included whenever you simply + need the name of an I/O-related class, such as + "ofstream" or "basic_streambuf". Like the name + implies, these are forward declarations. (A word to all you fellow + old school programmers: trying to forward declare classes like + "class istream;" won't work. Look in the iosfwd header if + you'd like to know why.) For example, +

+
+    #include <iosfwd>
+
+    class MyClass
+    {
+        ....
+        std::ifstream&   input_file;
+    };
+
+    extern std::ostream& operator<< (std::ostream&, MyClass&);
+   
+

<ios> declares the base classes for the entire + I/O stream hierarchy, std::ios_base and std::basic_ios<charT>, the + counting types std::streamoff and std::streamsize, the file + positioning type std::fpos, and the various manipulators like + std::hex, std::fixed, std::noshowbase, and so forth. +

+

The ios_base class is what holds the format flags, the state flags, + and the functions which change them (setf(), width(), precision(), + etc). You can also store extra data and register callback functions + through ios_base, but that has been historically underused. Anything + which doesn't depend on the type of characters stored is consolidated + here. +

+

The template class basic_ios is the highest template class in the + hierarchy; it is the first one depending on the character type, and + holds all general state associated with that type: the pointer to the + polymorphic stream buffer, the facet information, etc. +

+

<streambuf> declares the template class + basic_streambuf, and two standard instantiations, streambuf and + wstreambuf. If you need to work with the vastly useful and capable + stream buffer classes, e.g., to create a new form of storage + transport, this header is the one to include. +

+

<istream>/<ostream> are + the headers to include when you are using the >>/<< + interface, or any of the other abstract stream formatting functions. + For example, +

+
+    #include <istream>
+
+    std::ostream& operator<< (std::ostream& os, MyClass& c)
+    {
+       return os << c.data1() << c.data2();
+    }
+   
+

The std::istream and std::ostream classes are the abstract parents of + the various concrete implementations. If you are only using the + interfaces, then you only need to use the appropriate interface header. +

+

<iomanip> provides "extractors and inserters + that alter information maintained by class ios_base and its derived + classes," such as std::setprecision and std::setw. If you need + to write expressions like os << setw(3); or + is >> setbase(8);, you must include <iomanip>. +

+

<sstream>/<fstream> + declare the six stringstream and fstream classes. As they are the + standard concrete descendants of istream and ostream, you will already + know about them. +

+

Finally, <iostream> provides the eight standard + global objects (cin, cout, etc). To do this correctly, this header + also provides the contents of the <istream> and <ostream> + headers, but nothing else. The contents of this header look like +

+
+    #include <ostream>
+    #include <istream>
+
+    namespace std
+    {
+        extern istream cin;
+        extern ostream cout;
+        ....
+
+        // this is explained below
+        static ios_base::Init __foo;    // not its real name
+    }
+   
+

Now, the runtime penalty mentioned previously: the global objects + must be initialized before any of your own code uses them; this is + guaranteed by the standard. Like any other global object, they must + be initialized once and only once. This is typically done with a + construct like the one above, and the nested class ios_base::Init is + specified in the standard for just this reason. +

+

How does it work? Because the header is included before any of your + code, the __foo object is constructed before any of + your objects. (Global objects are built in the order in which they + are declared, and destroyed in reverse order.) The first time the + constructor runs, the eight stream objects are set up. +

+

The static keyword means that each object file compiled + from a source file containing <iostream> will have its own + private copy of __foo. There is no specified order + of construction across object files (it's one of those pesky NP + problems that make life so interesting), so one copy in each object + file means that the stream objects are guaranteed to be set up before + any of your code which uses them could run, thereby meeting the + requirements of the standard. +

+

The penalty, of course, is that after the first copy of + __foo is constructed, all the others are just wasted + processor time. The time spent is merely for an increment-and-test + inside a function call, but over several dozen or hundreds of object + files, that time can add up. (It's not in a tight loop, either.) +

+

The lesson? Only include <iostream> when you need to use one of + the standard objects in that source file; you'll pay less startup + time. Only include the header files you need to in general; your + compile times will go down when there's less parsing work to do. +

+ + +
+

Using FILE*s and file descriptors with IOStreams

+ +

The v2 library included non-standard extensions to construct + std::filebufs from C stdio types such as + FILE*s and POSIX file descriptors. + Today the recommended way to use stdio types with libstdc++ + IOStreams is via the stdio_filebuf class (see below), + but earlier releases provided slightly different mechanisms. +

+
    +
  • 3.0.x filebufs have another ctor with this signature: +
    + basic_filebuf(__c_file_type*, ios_base::openmode, int_type); +
    This comes in very handy in a number of places, such as + attaching Unix sockets, pipes, and anything else which uses file + descriptors, into the IOStream buffering classes. The three + arguments are as follows: +
      +
    • __c_file_type* F + // the __c_file_type typedef usually boils down to stdio's FILE +
    • +
    • ios_base::openmode M + // same as all the other uses of openmode +
    • +
    • int_type B + // buffer size, defaults to BUFSIZ if not specified +
    • +
    + For those wanting to use file descriptors instead of FILE*'s, I + invite you to contemplate the mysteries of C's fdopen(). +
  • +
  • In library snapshot 3.0.95 and later, filebufs bring + back an old extension: the fd() member function. The + integer returned from this function can be used for whatever file + descriptors can be used for on your platform. Naturally, the + library cannot track what you do on your own with a file descriptor, + so if you perform any I/O directly, don't expect the library to be + aware of it. +
  • +
  • Beginning with 3.1, the extra filebuf constructor and + the fd() function were removed from the standard + filebuf. Instead, <ext/stdio_filebuf.h> contains + a derived class called + __gnu_cxx::stdio_filebuf. + This class can be constructed from a C FILE* or a file + descriptor, and provides the fd() function. +
  • +
+

If you want to access a filebuf's file descriptor to + implement file locking (e.g. using the fcntl() system + call) then you might be interested in Henry Suter's + RWLock + class. +

+ + + +
+

+See license.html for copying conditions. +Comments and suggestions are welcome, and may be sent to +the libstdc++ mailing list. +

+ + + + + + diff --git a/libstdc++-v3/doc/html/configopts.html b/libstdc++-v3/doc/html/configopts.html new file mode 100644 index 00000000000..c830a9967ba --- /dev/null +++ b/libstdc++-v3/doc/html/configopts.html @@ -0,0 +1,342 @@ + + + + + + + + + + libstdc++ configure options + + + + + +

Interesting configure +options

+ +

+ The latest version of this document is always available at + + http://gcc.gnu.org/onlinedocs/libstdc++/configopts.html. +

+ +

+ To the libstdc++ homepage. +

+ + +
+

Here are some of the non-obvious options to libstdc++'s configure. + Keep in mind that + + they + all have opposite forms as well + (enable/disable and with/without). The defaults are for current + development sources, which may be different than those for + released versions. +

+

The canonical way to find out the configure options that are + available for a given set of libstdc++ sources is to go to the + source directory and then type: ./configure --help +

+ +
+
--enable-multilib [default]
+

This is part of the generic multilib support for building cross + compilers. As such, targets like "powerpc-elf" will have + libstdc++ built many different ways: "-msoft-float" + and not, etc. A different libstdc++ will be built for each of + the different multilib versions. This option is on by default. +

+
+ +
--enable-sjlj-exceptions
+

Forces old, set-jump/long-jump exception handling model. If + at all possible, the new, frame unwinding exception handling routines + should be used instead, as they significantly reduce both + runtime memory usage and executable size. This option can + change the library ABI. +

+
+ +
--enable-version-specific-runtime-libs
+

Specify that run-time libraries should be installed in the + compiler-specific subdirectory (i.e., + ${libdir}/gcc-lib/${target_alias}/${gcc_version}) + instead of ${libdir}. This option is useful if you + intend to use several versions of gcc in parallel. In addition, + libstdc++'s include files will be installed in + ${libdir}/gcc-lib/${target_alias}/${gcc_version}/include/g++, + unless you also specify + --with-gxx-include-dir=dirname during configuration. +

+
+ +
--with-gxx-include-dir=<include-files dir>
+

Adds support for named libstdc++ include directory. For instance, + the following puts all the libstdc++ headers into a directory + called "2.97-20001008" instead of the usual + "c++/(version)". +

+
+   --with-gxx-include-dir=/foo/H-x86-gcc-3-c-gxx-inc/include/2.97-20001008
+ +
--enable-cstdio
+

This is an abbreviated form of '--enable-cstdio=stdio' + (described next). This option can change the library ABI. +

+
+ +
--enable-cstdio=OPTION
+

Select a target-specific I/O package. At the moment, the only + choice is to use 'stdio', a generic "C" abstraction. + The default is 'stdio'. +

+
+ +
--enable-clocale
+

This is an abbreviated form of '--enable-clocale=generic' + (described next). This option can change the library ABI. +

+
+ +
--enable-clocale=OPTION
+

Select a target-specific underlying locale package. The + choices are 'ieee_1003.1-2001' to specify an X/Open, Standard Unix + (IEEE Std. 1003.1-2001) model based on langinfo/iconv/catgets, + 'gnu' to specify a model based on functionality from the GNU C + library (langinfo/iconv/gettext) (from glibc, the GNU C + library), or 'generic' to use a generic "C" + abstraction which consists of "C" locale info. +

+ +

As part of the configuration process, the "C" library is + probed both for sufficient vintage, and installed locale + data. If either of these elements are not present, the C++ + locale model default to 'generic.' On glibc-based systems of + version 2.2.5 and above with installed locale files, 'gnu' is + automatically selected. +

+
+ +
--enable-libstdcxx-allocator
+

This is an abbreviated form of + '--enable-libstdcxx-allocator=auto' (described + next). This option can change the library ABI. +

+
+ +
--enable-libstdcxx-allocator=OPTION
+

Select a target-specific underlying std::allocator. The + choices are 'new' to specify a wrapper for new, 'malloc' to + specify a wrapper for malloc, 'mt' for a fixed power of two allocator + (documented under extensions), + 'pool' for the SGI pooled allocator or 'bitmap' for a bitmap allocator. + This option can change the library ABI. +

+
+ +
--enable-cheaders=OPTION
+

This allows the user to define the approach taken for C header + compatibility with C++. Options are c, c_std, and c_global. + These correspond to the source directory's include/c, + include/c_std, and include/c_global, and may also include + include/c_compatibility. The default is c_global. +

+
+ +
--enable-threads
+

This is an abbreviated form of '--enable-threads=yes' + (described next). This option can change the library ABI. +

+
+ +
--enable-threads=OPTION
+

Select a threading library. A full description is given in the + general compiler + configuration instructions. +

+
+ +
--enable-libstdcxx-debug
+

Build separate debug libraries in addition to what is normally built. + By default, the debug libraries are compiled with + CXXFLAGS='-g3 -O0' + , are installed in ${libdir}/debug, and have the + same names and versioning information as the non-debug + libraries. This option is off by default. +

+

Note this make command, executed in + the build directory, will do much the same thing, without the + configuration difference and without building everything twice: + make CXXFLAGS='-g3 -O0' all +

+
+ +
--enable-libstdcxx-debug-flags=FLAGS
+ +

This option is only valid when --enable-debug + is also specified, and applies to the debug builds only. With + this option, you can pass a specific string of flags to the + compiler to use when building the debug versions of libstdc++. + FLAGS is a quoted string of options, like +

+
+  --enable-libstdcxx-debug-flags='-g3 -O1 -gdwarf-2'
+
+ +
--enable-cxx-flags=FLAGS
+

With this option, you can pass a string of -f (functionality) + flags to the compiler to use when building libstdc++. This + option can change the library ABI. FLAGS is a quoted string of + options, like +

+
+  --enable-cxx-flags='-fvtable-gc -fomit-frame-pointer -ansi'
+

+ Note that the flags don't necessarily have to all be -f flags, + as shown, but usually those are the ones that will make sense + for experimentation and configure-time overriding. +

+

The advantage of --enable-cxx-flags over setting CXXFLAGS in + the 'make' environment is that, if files are automatically + rebuilt, the same flags will be used when compiling those files + as well, so that everything matches. +

+

Fun flags to try might include combinations of +

+
+  -fstrict-aliasing
+  -fno-exceptions
+  -ffunction-sections
+  -fvtable-gc
+

and opposite forms (-fno-) of the same. Tell us (the libstdc++ + mailing list) if you discover more! +

+
+ +
--enable-c99
+

The "long long" type was introduced in C99, along + with many other functions for wide characters, and math + classification macros, etc. If enabled, all C99 functions not + specified by the C++ standard will be put into namespace + __gnu_cxx, and then all these names will + be injected into namespace std, so that C99 functions can be + used "as if" they were in the C++ standard (as they + will eventually be in some future revision of the standard, + without a doubt). By default, C99 support is on, assuming the + configure probes find all the necessary functions and bits + necessary. This option can change the library ABI. +

+
+ +
--enable-wchar_t [default]
+

Template specializations for the "wchar_t" type are + required for wide character conversion support. Disabling + wide character specializations may be expedient for initial + porting efforts, but builds only a subset of what is required by + ISO, and is not recommended. By default, this option is on. + This option can change the library ABI. +

+
+ +
--enable-long-long
+

The "long long" type was introduced in C99. It is + provided as a GNU extension to C++98 in g++. This flag builds + support for "long long" into the library (specialized + templates and the like for iostreams). This option is on by default: + if enabled, users will have to either use the new-style "C" + headers by default (i.e., <cmath> not <math.h>) + or add appropriate compile-time flags to all compile lines to + allow "C" visibility of this feature (on GNU/Linux, + the flag is -D_ISOC99_SOURCE, which is added automatically via + CPLUSPLUS_CPP_SPEC's addition of _GNU_SOURCE). + This option can change the library ABI. +

+
+ +
--enable-fully-dynamic-string
+

This option enables a special version of basic_string avoiding + the optimization that allocates empty objects in static memory. + Mostly useful together with shared memory allocators, see PR + libstdc++/16612 for details. +

+
+ +
--enable-concept-checks
+

This turns on additional compile-time checks for instantiated + library templates, in the form of specialized templates, + described here. They + can help users discover when they break the rules of the STL, before + their programs run. +

+
+ +
--enable-symvers[=style]
+ +

In 3.1 and later, tries to turn on symbol versioning in the + shared library (if a shared library has been + requested). Values for 'style' that are currently supported + are 'gnu', 'gnu-versioned-namespace', 'darwin', and + 'darwin-export'. Both gnu- options require that a recent + version of the GNU linker be in use. Both darwin options are + equivalent. With no style given, the configure script will try + to guess correct defaults for the host system, probe to see if + additional requirements are necessary and present for + activation, and if so, will turn symbol versioning on. This + option can change the library ABI. +

+ +
+ +
--enable-visibility
+

In 4.2 and later, enables or disables visibility attributes. + If enabled (as by default), and the compiler seems capable of + passing the simple sanity checks thrown at it, adjusts items + in namespace std, namespace std::tr1, and namespace __gnu_cxx + so that -fvisibility options work. +

+
+ +
--enable-libstdcxx-pch
+

In 3.4 and later, tries to turn on the generation of + stdc++.h.gch, a pre-compiled file including all the standard + C++ includes. If enabled (as by default), and the compiler + seems capable of passing the simple sanity checks thrown at + it, try to build stdc++.h.gch as part of the make process. + In addition, this generated file is used later on (by appending + --include bits/stdc++.h to CXXFLAGS) when running the + testsuite. +

+
+ +
--disable-hosted-libstdcxx
+

By default, a complete hosted C++ library is built. The + C++ Standard also describes a freestanding environment, + in which only a minimal set of headers are provided. This option + builds such an environment. +

+
+
+

Return to the top of the page or + to the libstdc++ homepage. +

+ + + + +
+

+See license.html for copying conditions. +Comments and suggestions are welcome, and may be sent to +the libstdc++ mailing list. +

+ + + + diff --git a/libstdc++-v3/doc/html/debug.html b/libstdc++-v3/doc/html/debug.html new file mode 100644 index 00000000000..61c6a8ba17b --- /dev/null +++ b/libstdc++-v3/doc/html/debug.html @@ -0,0 +1,474 @@ + + + + + + + + + + Debugging schemes and strategies + + + + + +

Debugging schemes and strategies

+ +

+ The latest version of this document is always available at + + http://gcc.gnu.org/onlinedocs/libstdc++/debug.html. +

+ +

+ To the libstdc++ homepage. +

+ + +
+

There are numerous things that can be done to improve the ease with + which C++ binaries are debugged when using the GNU + tool chain. Here are some of them. +

+ +

Compiler flags determine debug info

+

The default optimizations and debug flags for a libstdc++ build are + -g -O2. However, both debug and optimization flags can + be varied to change debugging characteristics. For instance, + turning off all optimization via the -g -O0 flag will + disable inlining, so that stepping through all functions, including + inlined constructors and destructors, is possible. In addition, + -fno-eliminate-unused-debug-types can be used when + additional debug information, such as nested class info, is desired. +

+ +

Or, the debug format that the compiler and debugger use to communicate + information about source constructs can be changed via + -gdwarf-2 or -gstabs flags: some debugging + formats permit more expressive type and scope information to be + shown in gdb. The default debug information for a particular + platform can be identified via the value set by the + PREFERRED_DEBUGGING_TYPE macro in the gcc sources. +

+ +

Many other options are available: please see +"Options for Debugging Your Program" + in Using the GNU Compiler Collection (GCC) for a complete list. +

+ +

Using special flags to make a debug binary

+

If you would like debug symbols in libstdc++, there are two ways to + build libstdc++ with debug flags. The first is to run make from the + toplevel in a freshly-configured tree with +

+
+     --enable-libstdcxx-debug
+
+

and perhaps

+
+     --enable-libstdcxx-debug-flags='...'
+
+

to create a separate debug build. Both the normal build and the + debug build will persist, without having to specify + CXXFLAGS, and the debug library will be installed in a + separate directory tree, in (prefix)/lib/debug. For + more information, look at the configuration + options document. +

+ +

A second approach is to use the configuration flags +

+
+     make CXXFLAGS='-g3 -O0' all
+
+ +

This quick and dirty approach is often sufficient for quick + debugging tasks, when you cannot or don't want to recompile your + application to use the debug mode.

+ +

The libstdc++ debug mode

+

By default, libstdc++ is built with efficiency in mind, and + therefore performs little or no error checking that is not required + by the C++ standard. This means that programs that incorrectly use + the C++ standard library will exhibit behavior that is not portable + and may not even be predictable, because they tread into + implementation-specific or undefined behavior. To detect some of + these errors before they can become problematic, libstdc++ offers a + debug mode that provides additional checking of library facilities, + and will report errors in the use of libstdc++ as soon as they can + be detected by emitting a description of the problem to standard + error and aborting the program. This debug mode is available with + GCC 3.4.0 and later versions.

+ +

The libstdc++ debug mode performs checking for many areas of the C++ + standard, but the focus is on checking interactions among standard + iterators, containers, and algorithms, including:

+ +
    +
  • Safe iterators: Iterators keep track of the + container whose elements they reference, so errors such as + incrementing a past-the-end iterator or dereferencing an iterator + that points to a container that has been destructed are diagnosed + immediately.
  • + +
  • Algorithm preconditions: Algorithms attempt to + validate their input parameters to detect errors as early as + possible. For instance, the set_intersection + algorithm requires that its iterator + parameters first1 and last1 form a valid + iterator range, and that the sequence + [first1, last1) is sorted according to + the same predicate that was passed + to set_intersection; the libstdc++ debug mode will + detect an error if the sequence is not sorted or was sorted by a + different predicate.
  • +
+ +

Using the libstdc++ debug mode

+

To use the libstdc++ debug mode, compile your application with the + compiler flag -D_GLIBCXX_DEBUG. Note that this flag + changes the sizes and behavior of standard class templates such + as std::vector, and therefore you can only link code + compiled with debug mode and code compiled without debug mode if no + instantiation of a container is passed between the two translation + units.

+ +

By default, error messages are formatted to fit on lines of about + 78 characters. The environment variable + GLIBCXX_DEBUG_MESSAGE_LENGTH can be used to request a + different length.

+ +

For information about the design of the libstdc++ debug mode, + please see the libstdc++ debug mode design + document.

+ +

Using the debugging containers without debug + mode

+

When it is not feasible to recompile your entire application, or + only specific containers need checking, debugging containers are + available as GNU extensions. These debugging containers are + functionally equivalent to the standard drop-in containers used in + debug mode, but they are available in a separate namespace as GNU + extensions and may be used in programs compiled with either release + mode or with debug mode. The + following table provides the names and headers of the debugging + containers: +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ContainerHeaderDebug containerDebug header
std::bitset<bitset>__gnu_debug::bitset<debug/bitset>
std::deque<deque>__gnu_debug::deque<debug/deque>
std::list<list>__gnu_debug::list<debug/list>
std::map<map>__gnu_debug::map<debug/map>
std::multimap<map>__gnu_debug::multimap<debug/map>
std::multiset<set>__gnu_debug::multiset<debug/set>
std::set<set>__gnu_debug::set<debug/set>
std::string<string>__gnu_debug::string<debug/string>
std::wstring<string>__gnu_debug::wstring<debug/string>
std::basic_string<string>__gnu_debug::basic_string<debug/string>
std::vector<vector>__gnu_debug::vector<debug/vector>
+ +

In addition, when compiling in C++0x mode, these additional +containers have additional debug capability. +

+ + + + + + + + + + + + + + + + + + + + + + + + + + +
std::unordered_map<unordered_map>__gnu_debug::unordered_map<debug/unordered_map>
std::unordered_multimap<unordered_map>__gnu_debug::unordered_multimap<debug/unordered_map>
std::unordered_set<unordered_set>__gnu_debug::unordered_set<debug/unordered_set>
std::unordered_multiset<unordered_set>__gnu_debug::unordered_multiset<debug/unordered_set>
+ +

Debug mode semantics

+

A program that uses the C++ standard library correctly + will maintain the same semantics under debug mode as it had with + the normal (release) library. All functional and exception-handling + guarantees made by the normal library also hold for the debug mode + library, with one exception: performance guarantees made by the + normal library may not hold in the debug mode library. For + instance, erasing an element in a std::list is a + constant-time operation in normal library, but in debug mode it is + linear in the number of iterators that reference that particular + list. So while your (correct) program won't change its results, it + is likely to execute more slowly.

+ +

libstdc++ includes many extensions to the C++ standard library. In + some cases the extensions are obvious, such as the hashed + associative containers, whereas other extensions give predictable + results to behavior that would otherwise be undefined, such as + throwing an exception when a std::basic_string is + constructed from a NULL character pointer. This latter category also + includes implementation-defined and unspecified semantics, such as + the growth rate of a vector. Use of these extensions is not + considered incorrect, so code that relies on them will not be + rejected by debug mode. However, use of these extensions may affect + the portability of code to other implementations of the C++ standard + library, and is therefore somewhat hazardous. For this reason, the + libstdc++ debug mode offers a "pedantic" mode (similar to + GCC's -pedantic compiler flag) that attempts to emulate + the semantics guaranteed by the C++ standard. For + instance, constructing a std::basic_string with a NULL + character pointer would result in an exception under normal mode or + non-pedantic debug mode (this is a libstdc++ extension), whereas + under pedantic debug mode libstdc++ would signal an error. To enable + the pedantic debug mode, compile your program with + both -D_GLIBCXX_DEBUG + and -D_GLIBCXX_DEBUG_PEDANTIC . + (N.B. In GCC 3.4.x and 4.0.0, due to a bug, + -D_GLIBXX_DEBUG_PEDANTIC was also needed. The problem has + been fixed in GCC 4.0.1 and later versions.)

+ +

The following library components provide extra debugging + capabilities in debug mode:

+
    +
  • std::basic_string (no safe iterators and see note below)
  • +
  • std::bitset
  • +
  • std::deque
  • +
  • std::list
  • +
  • std::map
  • +
  • std::multimap
  • +
  • std::multiset
  • +
  • std::set
  • +
  • std::vector
  • +
  • std::unordered_map
  • +
  • std::unordered_multimap
  • +
  • std::unordered_set
  • +
  • std::unordered_multiset
  • +
+ +

N.B. although there are precondition checks for some string operations, +e.g. operator[], +they will not always be run when using the char and +wchar_t specialisations (std::string and +std::wstring). This is because libstdc++ uses GCC's +extern template extension to provide explicit instantiations +of std::string and std::wstring, and those +explicit instantiations don't include the debug-mode checks. If the +containing functions are inlined then the checks will run, so compiling +with -O1 might be enough to enable them. Alternatively +-D_GLIBCXX_EXTERN_TEMPLATE=0 will suppress the declarations +of the explicit instantiations and cause the functions to be instantiated +with the debug-mode checks included, but this is unsupported and not +guaranteed to work. For full debug-mode support you can use the +__gnu_debug::basic_string debugging container directly, +which always works correctly. +

+ +

Tips for memory leak hunting

+ +

There are various third party memory tracing and debug utilities + that can be used to provide detailed memory allocation information + about C++ code. An exhaustive list of tools is not going to be + attempted, but includes mtrace, valgrind, + mudflap, and the non-free commercial product + purify. In addition, libcwd has a + replacement for the global new and delete operators that can track + memory allocation and deallocation and provide useful memory + statistics. +

+ +

Regardless of the memory debugging tool being used, there is one + thing of great importance to keep in mind when debugging C++ code + that uses new and delete: + there are different kinds of allocation schemes that can be used by + std::allocator . For implementation details, see the + mt allocator documentation and + look specifically for GLIBCXX_FORCE_NEW. +

+ +

In a nutshell, the default allocator used by + std::allocator is a high-performance pool allocator, and can + give the mistaken impression that in a suspect executable, memory + is being leaked, when in reality the memory "leak" is a pool being + used by the library's allocator and is reclaimed after program + termination. +

+ +

For valgrind, there are some specific items to keep in mind. First + of all, use a version of valgrind that will work with current GNU + C++ tools: the first that can do this is valgrind 1.0.4, but later + versions should work at least as well. Second of all, use a + completely unoptimized build to avoid confusing valgrind. Third, + use GLIBCXX_FORCE_NEW to keep extraneous pool allocation noise from + cluttering debug information. +

+ +

Fourth, it may be necessary to force deallocation in other + libraries as well, namely the "C" library. On linux, this can be + accomplished with the appropriate use of the + __cxa_atexit or atexit functions. +

+ +
+   #include <cstdlib>
+
+   extern "C" void __libc_freeres(void);
+
+   void do_something() { }
+
+   int main()
+   {
+     atexit(__libc_freeres);
+     do_something();
+     return 0;
+   }
+
+ + +

or, using __cxa_atexit:

+ +
+   extern "C" void __libc_freeres(void);
+   extern "C" int __cxa_atexit(void (*func) (void *), void *arg, void *d);
+
+   void do_something() { }
+
+   int main()
+   {
+      extern void* __dso_handle __attribute__ ((__weak__));
+      __cxa_atexit((void (*) (void *)) __libc_freeres, NULL, 
+                   &__dso_handle ? __dso_handle : NULL);
+      do_test();
+      return 0;
+   }
+
+ +

Suggested valgrind flags, given the suggestions above about setting + up the runtime environment, library, and test file, might be: +

+
 
+   valgrind -v --num-callers=20 --leak-check=yes --leak-resolution=high --show-reachable=yes a.out
+
+ + +

Some gdb strategies

+

Many options are available for gdb itself: please see + "GDB features for C++" in the gdb documentation. Also + recommended: the other parts of this manual. +

+ +

These settings can either be switched on in at the gdb command + line, or put into a .gdbint file to establish default debugging + characteristics, like so: +

+ +
+   set print pretty on
+   set print object on
+   set print static-members on
+   set print vtbl on
+   set print demangle on
+   set demangle-style gnu-v3
+
+ + +

Tracking uncaught exceptions

+

The verbose termination handler + gives information about uncaught exceptions which are killing the + program. It is described in the linked-to page. +

+ + +

Return to the top of the page or + to the libstdc++ homepage. +

+ + + + +
+

+See license.html for copying conditions. +Comments and suggestions are welcome, and may be sent to +the libstdc++ mailing list. +

+ + + + diff --git a/libstdc++-v3/doc/html/documentation.html b/libstdc++-v3/doc/html/documentation.html new file mode 100644 index 00000000000..c5413decd27 --- /dev/null +++ b/libstdc++-v3/doc/html/documentation.html @@ -0,0 +1,361 @@ + + + + + + + The GNU C++ Library + + + + + + +

The GNU C++ Library

+ + +

Table of Contents

+ +

+The GNU Standard C++ Library is an ongoing project to implement the ISO +14882 Standard C++ library as described in chapters 17 through 27 and +annex D, extensions as described by TR1, and future C++ library +standards still in progress. For those who want to see exactly how far +the project has come, or just want the latest bleeding-edge code, the +up-to-date source is always publicly available over anonymous SVN, +and can be browsed over the web. +

+ +

Stable versions of libstdc++ are included with releases of + the GCC compilers. +

+ + + + +
+
+

Source-Level Documentation

+

The library sources have been specially formatted so that with the + proper invocation of another tool (Doxygen), a set of HTML pages + are generated from the sources files themselves. The resultant + documentation is referred to as Source-Level Documentation, and is + useful for examining the signatures of public member functions for + the library classes, finding out what is in a particular include + file, looking at inheritance diagrams, etc. +

+

The source-level documentation for the most recent releases can + be viewed online: +

+ +

This generated HTML collection, as above, is also available for download in + the libstdc++ snapshots directory at + <URL:ftp://gcc.gnu.org/pub/gcc/libstdc++/doxygen/>. + You will almost certainly need to use one of the + mirror sites to download + the tarball. After unpacking, simply load libstdc++-html-*/index.html + into a browser. +

+

Documentation for older releases is available for download only, not + online viewing. +

+

In addition, an initial set of man pages are also available in the + same place as the HTML collections. Start with C++Intro(3). +

+ +
+
+

Frequently Asked Questions

+ +
+
+

All of these documents (in fact, this entire homepage set) + are bundled with the library source, under the docs + subdirectory, for releases and snapshots. The sole exception is the + automatically-generated source documentation, available separately. +

+ + +

Return to the libstdc++ homepage.

+ + +
+

+See license.html for copying conditions. +Comments and suggestions are welcome, and may be sent to +the libstdc++ mailing list. +

+ + + diff --git a/libstdc++-v3/doc/html/ext/ballocator_doc.html b/libstdc++-v3/doc/html/ext/ballocator_doc.html new file mode 100644 index 00000000000..064f5935e72 --- /dev/null +++ b/libstdc++-v3/doc/html/ext/ballocator_doc.html @@ -0,0 +1,426 @@ + + + + + Bitmap Allocator + + + + +

Bitmap Allocator

+
+The latest version of this document is always available +at +http://gcc.gnu.org/onlinedocs/libstdc++/ext/ballocator_doc.html.

+
+ To the libstdc++ +homepage.
+
+

+As this name suggests, this allocator uses a bit-map to keep track of +the used and unused memory locations for it's book-keeping purposes.
+
+This allocator will make use of 1 single bit to keep track of whether +it has been allocated or not. A bit 1 indicates free, while 0 indicates +allocated. This has been done so that you can easily check a collection +of bits for a free block. This kind of Bitmapped strategy works best +for single object allocations, and with the STL type parameterized +allocators, we do not need to choose any size for the block which will +be represented by a single bit. This will be the size of the parameter +around which the allocator has been parameterized. Thus, close to +optimal performance will result. Hence, this should be used for node +based containers which call the allocate function with an argument of 1.
+
+The bitmapped allocator's internal pool is exponentially growing. +Meaning that internally, the blocks acquired from the Free List Store +will double every time the bitmapped allocator runs out of memory.
+
+

+The macro __GTHREADS decides whether to use Mutex Protection around +every allocation/deallocation. The state of the macro is picked up +automatically from the gthr abstraction layer.
+
+
+

What is the Free List Store?

+
+The Free List Store (referred to as FLS for the remaining part of this +document) is the Global memory pool that is shared by all instances of +the bitmapped allocator instantiated for any type. This maintains a +sorted order of all free memory blocks given back to it by the +bitmapped allocator, and is also responsible for giving memory to the +bitmapped allocator when it asks for more.
+
+Internally, there is a Free List threshold which indicates the Maximum +number of free lists that the FLS can hold internally (cache). +Currently, this value is set at 64. So, if there are more than 64 free +lists coming in, then some of them will be given back to the OS using +operator delete so that at any given time the Free List's size does not +exceed 64 entries. This is done because a Binary Search is used to +locate an entry in a free list when a request for memory comes along. +Thus, the run-time complexity of the search would go up given an +increasing size, for 64 entries however, lg(64) == 6 comparisons are +enough to locate the correct free list if it exists.
+
+Suppose the free list size has reached it's threshold, then the largest +block from among those in the list and the new block will be selected +and given back to the OS. This is done because it reduces external +fragmentation, and allows the OS to use the larger blocks later in an +orderly fashion, possibly merging them later. Also, on some systems, +large blocks are obtained via calls to mmap, so giving them back to +free system resources becomes most important.
+
+The function _S_should_i_give decides the policy that determines +whether the current block of memory should be given to the allocator +for the request that it has made. That's because we may not always have +exact fits for the memory size that the allocator requests. We do this +mainly to prevent external fragmentation at the cost of a little +internal fragmentation. Now, the value of this internal fragmentation +has to be decided by this function. I can see 3 possibilities right +now. Please add more as and when you find better strategies.
+
+
    +
  1. Equal size check. Return true only when the 2 blocks are of equal +size.
  2. +
  3. Difference Threshold: Return true only when the _block_size is +greater than or equal to the _required_size, and if the _BS is > _RS +by a difference of less than some THRESHOLD value, then return true, +else return false.
  4. +
  5. Percentage Threshold. Return true only when the _block_size is +greater than or equal to the _required_size, and if the _BS is > _RS +by a percentage of less than some THRESHOLD value, then return true, +else return false.
  6. +
+
+Currently, (3) is being used with a value of 36% Maximum wastage per +Super Block.
+
+
1) +What is a super block? Why is it needed?
+
+A super block is the block of memory acquired from the FLS from which +the bitmap allocator carves out memory for single objects and satisfies +the user's requests. These super blocks come in sizes that are powers +of 2 and multiples of 32 (_Bits_Per_Block). Yes both at the same time! +That's because the next super block acquired will be 2 times the +previous one, and also all super blocks have to be multiples of the +_Bits_Per_Block value.
+
+2) How does it interact with the free +list store?
+
+The super block is contained in the FLS, and the FLS is responsible for +getting / returning Super Bocks to and from the OS using operator new +as defined by the C++ standard.
+
+
+

How does the allocate function Work?

+
+The allocate function is specialized for single object allocation ONLY. +Thus, ONLY if n == 1, will the bitmap_allocator's specialized algorithm +be used. Otherwise, the request is satisfied directly by calling +operator new.
+
+Suppose n == 1, then the allocator does the following:
+
+
    +
  1. Checks to see whether a free block exists somewhere in a +region of memory close to the last satisfied request. If so, then that +block is marked as allocated in the bit map and given to the user. If +not, then (2) is executed.
  2. +
  3. Is there a free block anywhere after the current block right up to +the end of the memory that we have? If so, that block is found, and the +same procedure is applied as above, and returned to the user. If not, +then (3) is executed.
  4. +
  5. Is there any block in whatever region of memory that we own free? +This is done by checking
    +
    +
      +
    • The use count for each super block, and if that fails then
    • +
    • The individual bit-maps for each super block.
    • +
    +
    +Note: Here we are never touching any of the memory that the user will +be given, and we are confining all memory accesses to a small region of +memory! This helps reduce cache misses. If this succeeds then we apply +the same procedure on that bit-map as (1), and return that block of +memory to the user. However, if this process fails, then we resort to +(4).
  6. +
  7. This process involves Refilling the internal exponentially +growing memory pool. The said effect is achieved by calling +_S_refill_pool which does the following:
    +
    +
      +
    • Gets more memory from the Global Free List of the Required +size.
    • +
    • Adjusts the size for the next call to itself.
    • +
    • Writes the appropriate headers in the bit-maps.
    • +
    • Sets the use count for that super-block just allocated to 0 +(zero).
    • +
    • All of the above accounts to maintaining the basic invariant +for the allocator. If the invariant is maintained, we are sure that all +is well. Now, the same process is applied on the newly acquired free +blocks, which are dispatched accordingly.
    • +
    +
    +
  8. +
+
+Thus, you can clearly see that the allocate function is nothing but a +combination of the next-fit and first-fit algorithm optimized ONLY for +single object allocations.
+
+
+
+

How does the deallocate function work?

+
+The deallocate function again is specialized for single objects ONLY. +For all n belonging to > 1, the operator delete is called without +further ado, and the deallocate function returns.
+
+However for n == 1, a series of steps are performed:
+
+
    +
  1. We first need to locate that super-block which holds the memory +location given to us by the user. For that purpose, we maintain a +static variable _S_last_dealloc_index, which holds the index into the +vector of block pairs which indicates the index of the last super-block +from which memory was freed. We use this strategy in the hope that the +user will deallocate memory in a region close to what he/she +deallocated the last time around. If the check for belongs_to succeeds, +then we determine the bit-map for the given pointer, and locate the +index into that bit-map, and mark that bit as free by setting it.
  2. +
  3. If the _S_last_dealloc_index does not point to the memory block +that we're looking for, then we do a linear search on the block stored +in the vector of Block Pairs. This vector in code is called +_S_mem_blocks. When the corresponding super-block is found, we apply +the same procedure as we did for (1) to mark the block as free in the +bit-map.
  4. +
+
+Now, whenever a block is freed, the use count of that particular super +block goes down by 1. When this use count hits 0, we remove that super +block from the list of all valid super blocks stored in the vector. +While doing this, we also make sure that the basic invariant is +maintained by making sure that _S_last_request and +_S_last_dealloc_index point to valid locations within the vector.
+
+

+

Data Layout for a Super Block:

+
+Each Super Block will be of some size that is a multiple of the number +of Bits Per Block. Typically, this value is chosen as Bits_Per_Byte x +sizeof(size_t). On an x86 system, this gives the figure  8 x +4 = 32. Thus, each Super Block will be of size 32 x Some_Value. This +Some_Value is sizeof(value_type). For now, let it be called 'K'. Thus, +finally, Super Block size is 32 x K bytes.
+
+This value of 32 has been chosen because each size_t has 32-bits +and Maximum use of these can be made with such a figure.
+
+Consider a block of size 64 ints. In memory, it would look like this: +(assume a 32-bit system where, size_t is a 32-bit entity).
+
+ + + + + + + + + + +
268
+
0
+
4294967295
+
4294967295
+
Data -> +Space for 64 ints
+
+
+
+The first Column(268) represents the size of the Block in bytes as seen +by +the Bitmap Allocator. Internally, a global free list is used to keep +track of the free blocks used and given back by the bitmap allocator. +It is this Free List Store that is responsible for writing and managing +this information. Actually the number of bytes allocated in this case +would be: 4 + 4 + (4x2) + (64x4) = 272 bytes, but the first 4 bytes are +an +addition by the Free List Store, so the Bitmap Allocator sees only 268 +bytes. These first 4 bytes about which the bitmapped allocator is not +aware hold the value 268.
+
+What do the remaining values represent?
+
+The 2nd 4 in the expression is the sizeof(size_t) because the +Bitmapped Allocator maintains a used count for each Super Block, which +is initially set to 0 (as indicated in the diagram). This is +incremented every time a block is removed from this super block +(allocated), and decremented whenever it is given back. So, when the +used count falls to 0, the whole super block will be given back to the +Free List Store.
+
+The value 4294967295 represents the integer corresponding to the bit +representation of all bits set: 11111111111111111111111111111111.
+
+The 3rd 4x2 is size of the bitmap itself, which is the size of 32-bits +x 2, +which is 8-bytes, or 2 x sizeof(size_t).
+
+

+Another issue would be whether to keep the all bitmaps in a separate +area in memory, or to keep them near the actual blocks that will be +given out or allocated for the client. After some testing, I've decided +to keep these bitmaps close to the actual blocks. This will help in 2 +ways.
+
+
    +
  1. Constant time access for the bitmap themselves, since no kind of +look up will be needed to find the correct bitmap list or it's +equivalent.
  2. +
  3. And also this would preserve the cache as far as possible.
  4. +
+
+So in effect, this kind of an allocator might prove beneficial from a +purely cache point of view. But this allocator has been made to try and +roll out the defects of the node_allocator, wherein the nodes get +skewed about in memory, if they are not returned in the exact reverse +order or in the same order in which they were allocated. Also, the +new_allocator's book keeping overhead is too much for small objects and +single object allocations, though it preserves the locality of blocks +very well when they are returned back to the allocator.
+
+

+Expected overhead per block would be 1 bit in memory. Also, once the +address of the free list has been found, the cost for +allocation/deallocation would be negligible, and is supposed to be +constant time. For these very reasons, it is very important to minimize +the linear time costs, which include finding a free list with a free +block while allocating, and finding the corresponding free list for a +block while deallocating. Therefore, I have decided that the growth of +the internal pool for this allocator will be exponential as compared to +linear for node_allocator. There, linear time works well, because we +are mainly concerned with speed of allocation/deallocation and memory +consumption, whereas here, the allocation/deallocation part does have +some linear/logarithmic complexity components in it. Thus, to try and +minimize them would be a good thing to do at the cost of a little bit +of memory.
+
+Another thing to be noted is the pool size will double every time +the internal pool gets exhausted, and all the free blocks have been +given away. The initial size of the pool would be sizeof(size_t) x 8 +which is the number of bits in an integer, which can fit exactly +in a CPU register. Hence, the term given is exponential growth of the +internal pool.
+
+
After reading all this, you may +still have a few questions about the internal working of this +allocator, like my friend had!
+
+Well here are the exact questions that he posed:
+
+Q1) The "Data Layout" section is +cryptic. I have no idea of what you are trying to say. Layout of what? +The free-list? Each bitmap? The Super Block?
+
+
The layout of a Super Block of a given +size. In the example, a super block of size 32 x 1 is taken. The +general formula for calculating the size of a super block is +32 x sizeof(value_type) x 2^n, where n ranges from 0 to 32 for 32-bit +systems.
+
+
+Q2) And since I just mentioned the +term `each bitmap', what in the world is meant by it? What does each +bitmap manage? How does it relate to the super block? Is the Super +Block a bitmap as well?
+
+
Good question! Each bitmap is part of +a +Super Block which is made up of 3 parts as I have mentioned earlier. +Re-iterating, 1. The use count, 2. The bit-map for that Super Block. 3. +The actual memory that will be eventually given to the user. Each +bitmap is a multiple of 32 in size. If there are 32 x (2^3) blocks of +single objects to be given, there will be '32 x (2^3)' bits present. +Each +32 bits managing the allocated / free status for 32 blocks. Since each +size_t contains 32-bits, one size_t can manage up to 32 +blocks' status. Each bit-map is made up of a number of size_t, +whose exact number for a super-block of a given size I have just +mentioned.
+
+
+Q3) How do the allocate and deallocate +functions work in regard to bitmaps?
+
+
The allocate and deallocate functions +manipulate the bitmaps and have nothing to do with the memory that is +given to the user. As I have earlier mentioned, a 1 in the bitmap's bit +field indicates free, while a 0 indicates allocated. This lets us check +32 bits at a time to check whether there is at lease one free block in +those 32 blocks by testing for equality with (0). Now, the allocate +function will given a memory block find the corresponding bit in the +bitmap, and will reset it (i.e., make it re-set (0)). And when the +deallocate function is called, it will again set that bit after +locating it to indicate that that particular block corresponding to +this bit in the bit-map is not being used by anyone, and may be used to +satisfy future requests.
+
+e.g.: Consider a bit-map of 64-bits as represented below:
+1111111111111111111111111111111111111111111111111111111111111111
+
+Now, when the first request for allocation of a single object comes +along, the first block in address order is returned. And since the +bit-maps in the reverse order to that of the address order, the last +bit (LSB if the bit-map is considered as a binary word of 64-bits) is +re-set to 0.
+
+The bit-map now looks like this:
+1111111111111111111111111111111111111111111111111111111111111110
+
+
+
+

+(Tech-Stuff, Please stay out if you are not interested in the selection +of certain constants. This has nothing to do with the algorithm per-se, +only with some vales that must be chosen correctly to ensure that the +allocator performs well in a real word scenario, and maintains a good +balance between the memory consumption and the allocation/deallocation +speed).
+
+The formula for calculating the maximum wastage as a percentage:
+
+(32 x k + 1) / (2 x (32 x k + 1 + 32 x c)) x 100.
+
+Where,
+k => The constant overhead per node. eg. for list, it is 8 bytes, +and for map it is 12 bytes.
+c => The size of the base type on which the map/list is +instantiated. Thus, suppose the type1 is int and type2 is double, +they are related by the relation sizeof(double) == 2*sizeof(int). Thus, +all types must have this double size relation for this formula to work +properly.
+
+Plugging-in: For List: k = 8 and c = 4 (int and double), we get:
+33.376%
+
+For map/multimap: k = 12, and c = 4 (int and double), we get:
+37.524%
+
+Thus, knowing these values, and based on the sizeof(value_type), we may +create a function that returns the Max_Wastage_Percentage for us to use.
+
+
See license.html +for copying conditions. Comments and suggestions are welcome, and may +be +sent to the libstdc++ mailing +list.
+

+
+ + diff --git a/libstdc++-v3/doc/html/ext/concurrence.html b/libstdc++-v3/doc/html/ext/concurrence.html new file mode 100644 index 00000000000..e6bf4438f63 --- /dev/null +++ b/libstdc++-v3/doc/html/ext/concurrence.html @@ -0,0 +1,342 @@ + + + + + + + + + + Concurrency Support + + + + + + +

Concurrency Support

+ +

+ The latest version of this document is always available at + + http://gcc.gnu.org/onlinedocs/libstdc++/17_intro/concurrence.html. +

+ +

+ To the libstdc++ homepage. +

+ + + + +
+ + +

The interface for concurrency support is divided into two files: +<ext/atomicity.h> which provides support for atomic operations, +and <ext/concurrence.h>, which provides mutex and lock objects +as well as compile-time data structures for querying thread +support.

+ +

It is expected that support for concurrence will evolve into what +is specified in the draft C++0x standard.

+ +

+ Atomics Interface +

+ +

+Two functions and one type form the base of atomic support. +

+ + +

The type _Atomic_word is a signed integral type +supporting atomic operations. +

+ +

+The two functions functions are: +

+ +
+_Atomic_word
+__exchange_and_add_dispatch(volatile _Atomic_word*, int);
+
+void
+__atomic_add_dispatch(volatile _Atomic_word*, int);
+
+ +

Both of these functions are declared in the header file +<ext/atomicity.h>, and are in namespace __gnu_cxx. +

+ +
    +
  • + +__exchange_and_add_dispatch + +

    Adds the second argument's value to the first argument. Returns the old value. +

    +
  • +
  • + +__atomic_add_dispatch + +

    Adds the second argument's value to the first argument. Has no return value. +

    +
  • +
+ +

+These functions forward to one of several specialized helper +functions, depending on the circumstances. For instance, +

+ +

+ +__exchange_and_add_dispatch + +

+ +

+Calls through to either of: +

+ +
    +
  • __exchange_and_add +

    Multi-thread version. Inlined if compiler-generated builtin atomics +can be used, otherwise resolved at link time to a non-builtin code +sequence. +

    +
  • + +
  • __exchange_and_add_single +

    Single threaded version. Inlined.

    +
  • +
+ +

However, only __exchange_and_add_dispatch +and __atomic_add_dispatch should be used. These functions +can be used in a portable manner, regardless of the specific +environment. They are carefully designed to provide optimum efficiency +and speed, abstracting out atomic accesses when they are not required +(even on hosts that support compiler intrinsics for atomic +operations.) +

+ +

+In addition, there are two macros +

+ +

+ +_GLIBCXX_READ_MEM_BARRIER + +

+

+ +_GLIBCXX_WRITE_MEM_BARRIER + +

+ +

+Which expand to the appropriate write and read barrier required by the +host hardware and operating system. +

+ +

+ Pthread Interface +

+ +

A thin layer above IEEE 1003.1 (ie pthreads) is used to abstract +the thread interface for GCC. This layer is called "gthread," and is +comprised of one header file that wraps the host's default thread layer with +a POSIX-like interface. +

+ +

The file <gthr-default.h> points to the deduced wrapper for +the current host. In libstdc++ implementation files, +<bits/gthr.h> is used to select the proper gthreads file. +

+ +

Within libstdc++ sources, all calls to underlying thread functionality +use this layer. More detail as to the specific interface can be found in the source documentation. +

+ +

By design, the gthread layer is interoperable with the types, +functions, and usage found in the usual <pthread.h> file, +including pthread_t, pthread_once_t, pthread_create, +etc. +

+ +

+ Concurrence Interface +

+ +

The file <ext/concurrence.h> contains all the higher-level +constructs for playing with threads. In contrast to the atomics layer, +the concurrence layer consists largely of types. All types are defined within namespace __gnu_cxx. +

+ +

+These types can be used in a portable manner, regardless of the +specific environment. They are carefully designed to provide optimum +efficiency and speed, abstracting out underlying thread calls and +accesses when compiling for single-threaded situations (even on hosts +that support multiple threads.) +

+ +

The enumerated type _Lock_policy details the set of +available locking +policies: _S_single, _S_mutex, +and _S_atomic. +

+ +
    +
  • _S_single +

    Indicates single-threaded code that does not need locking. +

    + +
  • +
  • _S_mutex +

    Indicates multi-threaded code using thread-layer abstractions. +

    +
  • +
  • _S_atomic +

    Indicates multi-threaded code using atomic operations. +

    +
  • +
+ +

The compile-time constant __default_lock_policy is set +to one of the three values above, depending on characteristics of the +host environment and the current compilation flags. +

+ +

Two more datatypes make up the rest of the +interface: __mutex, and __scoped_lock. +

+ +

+

+ +

The scoped lock idiom is well-discussed within the C++ +community. This version takes a __mutex reference, and +locks it during construction of __scoped_locke and +unlocks it during destruction. This is an efficient way of locking +critical sections, while retaining exception-safety. +

+ +

Typical usage of the last two constructs is demonstrated as follows: +

+ +
+#include <ext/concurrence.h>
+
+namespace
+{
+  __gnu_cxx::__mutex safe_base_mutex;
+} // anonymous namespace
+
+namespace other
+{
+  void
+  foo()
+  {
+    __gnu_cxx::__scoped_lock sentry(safe_base_mutex);
+    for (int i = 0; i < max;  ++i)
+      {
+	_Safe_iterator_base* __old = __iter;
+	__iter = __iter-<_M_next;
+	__old-<_M_detach_single();
+      }
+}
+
+ +

In this sample code, an anonymous namespace is used to keep +the __mutex private to the compilation unit, +and __scoped_lock is used to guard access to the critical +section within the for loop, locking the mutex on creation and freeing +the mutex as control moves out of this block. +

+ +

Several exception classes are used to keep track of +concurrence-related errors. These classes +are: __concurrence_lock_error, __concurrence_unlock_error, __concurrence_wait_error, +and __concurrence_broadcast_error. +

+ + + +

+ Details on builtin atomic support and library fallbacks +

+ +

The functions for atomic operations described above are either +implemented via compiler intrinsics (if the underlying host is +capable) or by library fallbacks.

+ +

Compiler intrinsics (builtins) are always preferred. However, as +the compiler builtins for atomics are not universally implemented, +using them directly is problematic, and can result in undefined +function calls. (An example of an undefined symbol from the use +of __sync_fetch_and_add on an unsupported host is a +missing reference to __sync_fetch_and_add_4.) +

+ +

In addition, on some hosts the compiler intrinsics are enabled +conditionally, via the -march command line flag. This makes +usage vary depending on the target hardware and the flags used during +compile. +

+ +

If builtins are possible, _GLIBCXX_ATOMIC_BUILTINS +will be defined. +

+ + +

For the following hosts, intrinsics are enabled by default. +

+ +
    +
  • alpha
  • +
  • ia64
  • +
  • powerpc
  • +
  • s390
  • +
+ +

For others, some form of -march may work. On +non-ancient x86 hardware, -march=native usually does the +trick.

+ +

For hosts without compiler intrinsics, but with capable +hardware, hand-crafted assembly is selected. This is the case for the following hosts: +

+ +
    +
  • cris
  • +
  • hppa
  • +
  • i386
  • +
  • i486
  • +
  • m48k
  • +
  • mips
  • +
  • sparc
  • +
+ +

And for the rest, a simulated atomic lock via pthreads. +

+ +

Detailed information about compiler intrinsics for atomic operations can be found in the GCC documentation. +

+ +

More details on the library fallbacks from the porting section. +

+ + + + + + diff --git a/libstdc++-v3/doc/html/ext/debug_mode.html b/libstdc++-v3/doc/html/ext/debug_mode.html new file mode 100644 index 00000000000..7e9d9bafae9 --- /dev/null +++ b/libstdc++-v3/doc/html/ext/debug_mode.html @@ -0,0 +1,578 @@ + + + + + + + + + + Design of the libstdc++ debug mode + + + + +

Design of the libstdc++ debug mode

+ +

+ The latest version of this document is always available at + + http://gcc.gnu.org/onlinedocs/libstdc++/debug_mode.html. +

+ +

+ To the libstdc++ homepage. +

+ + + + +
+

Debug mode design

+

The libstdc++ debug mode replaces unsafe (but efficient) standard + containers and iterators with semantically equivalent safe standard + containers and iterators to aid in debugging user programs. The + following goals directed the design of the libstdc++ debug mode:

+ +
    + +
  • Correctness: the libstdc++ debug mode must not change + the semantics of the standard library for all cases specified in + the ANSI/ISO C++ standard. The essence of this constraint is that + any valid C++ program should behave in the same manner regardless + of whether it is compiled with debug mode or release mode. In + particular, entities that are defined in namespace std in release + mode should remain defined in namespace std in debug mode, so that + legal specializations of namespace std entities will remain + valid. A program that is not valid C++ (e.g., invokes undefined + behavior) is not required to behave similarly, although the debug + mode will abort with a diagnostic when it detects undefined + behavior.
  • + +
  • Performance: the additional of the libstdc++ debug mode + must not affect the performance of the library when it is compiled + in release mode. Performance of the libstdc++ debug mode is + secondary (and, in fact, will be worse than the release + mode).
  • + +
  • Usability: the libstdc++ debug mode should be easy to + use. It should be easily incorporated into the user's development + environment (e.g., by requiring only a single new compiler switch) + and should produce reasonable diagnostics when it detects a + problem with the user program. Usability also involves detection + of errors when using the debug mode incorrectly, e.g., by linking + a release-compiled object against a debug-compiled object if in + fact the resulting program will not run correctly.
  • + +
  • Minimize recompilation: While it is expected that + users recompile at least part of their program to use debug + mode, the amount of recompilation affects the + detect-compile-debug turnaround time. This indirectly affects the + usefulness of the debug mode, because debugging some applications + may require rebuilding a large amount of code, which may not be + feasible when the suspect code may be very localized. There are + several levels of conformance to this requirement, each with its + own usability and implementation characteristics. In general, the + higher-numbered conformance levels are more usable (i.e., require + less recompilation) but are more complicated to implement than + the lower-numbered conformance levels. +
      +
    1. Full recompilation: The user must recompile his or + her entire application and all C++ libraries it depends on, + including the C++ standard library that ships with the + compiler. This must be done even if only a small part of the + program can use debugging features.
    2. + +
    3. Full user recompilation: The user must recompile + his or her entire application and all C++ libraries it depends + on, but not the C++ standard library itself. This must be done + even if only a small part of the program can use debugging + features. This can be achieved given a full recompilation + system by compiling two versions of the standard library when + the compiler is installed and linking against the appropriate + one, e.g., a multilibs approach.
    4. + +
    5. Partial recompilation: The user must recompile the + parts of his or her application and the C++ libraries it + depends on that will use the debugging facilities + directly. This means that any code that uses the debuggable + standard containers would need to be recompiled, but code + that does not use them (but may, for instance, use IOStreams) + would not have to be recompiled.
    6. + +
    7. Per-use recompilation: The user must recompile the + parts of his or her application and the C++ libraries it + depends on where debugging should occur, and any other code + that interacts with those containers. This means that a set of + translation units that accesses a particular standard + container instance may either be compiled in release mode (no + checking) or debug mode (full checking), but must all be + compiled in the same way; a translation unit that does not see + that standard container instance need not be recompiled. This + also means that a translation unit A that contains a + particular instantiation + (say, std::vector<int>) compiled in release + mode can be linked against a translation unit B that + contains the same instantiation compiled in debug mode (a + feature not present with partial recompilation). While this + behavior is technically a violation of the One Definition + Rule, this ability tends to be very important in + practice. The libstdc++ debug mode supports this level of + recompilation.
    8. + +
    9. Per-unit recompilation: The user must only + recompile the translation units where checking should occur, + regardless of where debuggable standard containers are + used. This has also been dubbed "-g mode", + because the -g compiler switch works in this way, + emitting debugging information at a per--translation-unit + granularity. We believe that this level of recompilation is in + fact not possible if we intend to supply safe iterators, leave + the program semantics unchanged, and not regress in + performance under release mode because we cannot associate + extra information with an iterator (to form a safe iterator) + without either reserving that space in release mode + (performance regression) or allocating extra memory associated + with each iterator with new (changes the program + semantics).
    10. +
    +
  • +
+ +

Other implementations

+

There are several existing implementations of debug modes for C++ + standard library implementations, although none of them directly + supports debugging for programs using libstdc++. The existing + implementations include:

+
    +
  • SafeSTL: + SafeSTL was the original debugging version of the Standard Template + Library (STL), implemented by Cay S. Horstmann on top of the + Hewlett-Packard STL. Though it inspired much work in this area, it + has not been kept up-to-date for use with modern compilers or C++ + standard library implementations.
  • + +
  • STLport: STLport is a free + implementation of the C++ standard library derived from the SGI implementation, and + ported to many other platforms. It includes a debug mode that uses a + wrapper model (that in some way inspired the libstdc++ debug mode + design), although at the time of this writing the debug mode is + somewhat incomplete and meets only the "Full user recompilation" (2) + recompilation guarantee by requiring the user to link against a + different library in debug mode vs. release mode.
  • + +
  • Metrowerks + CodeWarrior: The C++ standard library that ships with Metrowerks + CodeWarrior includes a debug mode. It is a full debug-mode + implementation (including debugging for CodeWarrior extensions) and + is easy to use, although it meets only the "Full recompilation" (1) + recompilation guarantee.
  • +
+ +

Debug mode design methodology

+

This section provides an overall view of the design of the + libstdc++ debug mode and details the relationship between design + decisions and the stated design goals.

+ +

The wrapper model

+

The libstdc++ debug mode uses a wrapper model where the debugging + versions of library components (e.g., iterators and containers) form + a layer on top of the release versions of the library + components. The debugging components first verify that the operation + is correct (aborting with a diagnostic if an error is found) and + will then forward to the underlying release-mode container that will + perform the actual work. This design decision ensures that we cannot + regress release-mode performance (because the release-mode + containers are left untouched) and partially enables mixing debug and release code at link time, + although that will not be discussed at this time.

+ +

Two types of wrappers are used in the implementation of the debug + mode: container wrappers and iterator wrappers. The two types of + wrappers interact to maintain relationships between iterators and + their associated containers, which are necessary to detect certain + types of standard library usage errors such as dereferencing + past-the-end iterators or inserting into a container using an + iterator from a different container.

+ +

Safe iterators

+

Iterator wrappers provide a debugging layer over any iterator that + is attached to a particular container, and will manage the + information detailing the iterator's state (singular, + dereferenceable, etc.) and tracking the container to which the + iterator is attached. Because iterators have a well-defined, common + interface the iterator wrapper is implemented with the iterator + adaptor class template __gnu_debug::_Safe_iterator, + which takes two template parameters:

+ +
    +
  • Iterator: The underlying iterator type, which must + be either the iterator or const_iterator + typedef from the sequence type this iterator can reference.
  • + +
  • Sequence: The type of sequence that this iterator + references. This sequence must be a safe sequence (discussed below) + whose iterator or const_iterator typedef + is the type of the safe iterator.
  • +
+ +

Safe sequences (containers)

+

Container wrappers provide a debugging layer over a particular + container type. Because containers vary greatly in the member + functions they support and the semantics of those member functions + (especially in the area of iterator invalidation), container + wrappers are tailored to the container they reference, e.g., the + debugging version of std::list duplicates the entire + interface of std::list, adding additional semantic + checks and then forwarding operations to the + real std::list (a public base class of the debugging + version) as appropriate. However, all safe containers inherit from + the class template __gnu_debug::_Safe_sequence, + instantiated with the type of the safe container itself (an instance + of the curiously recurring template pattern).

+ +

The iterators of a container wrapper will be + safe iterators that reference sequences + of this type and wrap the iterators provided by the release-mode + base class. The debugging container will use only the safe + iterators within its own interface (therefore requiring the user to + use safe iterators, although this does not change correct user + code) and will communicate with the release-mode base class with + only the underlying, unsafe, release-mode iterators that the base + class exports.

+ +

The debugging version of std::list will have the + following basic structure:

+ +
+template<typename _Tp, typename _Allocator = allocator<_Tp>
+  class debug-list :
+    public release-list<_Tp, _Allocator>,
+    public __gnu_debug::_Safe_sequence<debug-list<_Tp, _Allocator> >
+  {
+    typedef release-list<_Tp, _Allocator> _Base;
+    typedef debug-list<_Tp, _Allocator>   _Self;
+
+  public:
+    typedef __gnu_debug::_Safe_iterator<typename _Base::iterator, _Self>       iterator;
+    typedef __gnu_debug::_Safe_iterator<typename _Base::const_iterator, _Self> const_iterator;
+
+    // duplicate std::list interface with debugging semantics
+  };
+
+ +

Precondition checking

+

The debug mode operates primarily by checking the preconditions of + all standard library operations that it supports. Preconditions that + are always checked (regardless of whether or not we are in debug + mode) are checked via the __check_xxx macros defined + and documented in the source + file include/debug/debug.h. Preconditions that may or + may not be checked, depending on the debug-mode + macro _GLIBCXX_DEBUG, are checked via + the __requires_xxx macros defined and documented in the + same source file. Preconditions are validated using any additional + information available at run-time, e.g., the containers that are + associated with a particular iterator, the position of the iterator + within those containers, the distance between two iterators that may + form a valid range, etc. In the absence of suitable information, + e.g., an input iterator that is not a safe iterator, these + precondition checks will silently succeed.

+ +

The majority of precondition checks use the aforementioned macros, + which have the secondary benefit of having prewritten debug + messages that use information about the current status of the + objects involved (e.g., whether an iterator is singular or what + sequence it is attached to) along with some static information + (e.g., the names of the function parameters corresponding to the + objects involved). When not using these macros, the debug mode uses + either the debug-mode assertion + macro _GLIBCXX_DEBUG_ASSERT , its pedantic + cousin _GLIBCXX_DEBUG_PEDASSERT, or the assertion + check macro that supports more advance formulation of error + messages, _GLIBCXX_DEBUG_VERIFY. These macros are + documented more thoroughly in the debug mode source code.

+ +

Release- and debug-mode coexistence

+

The libstdc++ debug mode is the first debug mode we know of that + is able to provide the "Per-use recompilation" (4) guarantee, that + allows release-compiled and debug-compiled code to be linked and + executed together without causing unpredictable behavior. This + guarantee minimizes the recompilation that users are required to + perform, shortening the detect-compile-debug bughunting cycle + and making the debug mode easier to incorporate into development + environments by minimizing dependencies.

+ +

Achieving link- and run-time coexistence is not a trivial + implementation task. To achieve this goal we required a small + extension to the GNU C++ compiler (described in the GCC Manual for + C++ Extensions, see strong + using), and a complex organization of debug- and + release-modes. The end result is that we have achieved per-use + recompilation but have had to give up some checking of the + std::basic_string class template (namely, safe + iterators). +

+ +

Compile-time coexistence of release- and + debug-mode components

+

Both the release-mode components and the debug-mode + components need to exist within a single translation unit so that + the debug versions can wrap the release versions. However, only one + of these components should be user-visible at any particular + time with the standard name, e.g., std::list.

+ +

In release mode, we define only the release-mode version of the + component with its standard name and do not include the debugging + component at all. The release mode version is defined within the + namespace std. Minus the namespace associations, this + method leaves the behavior of release mode completely unchanged from + its behavior prior to the introduction of the libstdc++ debug + mode. Here's an example of what this ends up looking like, in + C++.

+ +
+namespace std
+{
+  template<typename _Tp, typename _Alloc = allocator<_Tp> >
+    class list
+    {
+      // ...
+     };
+} // namespace std
+
+ +

In debug mode we include the release-mode container (which is now +defined in in the namespace __norm) and also the +debug-mode container. The debug-mode container is defined within the +namespace __debug, which is associated with namespace +std via the GNU namespace association extension. This +method allows the debug and release versions of the same component to +coexist at compile-time and link-time without causing an unreasonable +maintenance burden, while minimizing confusion. Again, this boils down +to C++ code as follows:

+ +
+namespace std
+{
+  namespace __norm
+  {
+    template<typename _Tp, typename _Alloc = allocator<_Tp> >
+      class list
+      {
+        // ...
+      };
+  } // namespace __gnu_norm
+
+  namespace __debug
+  {
+    template<typename _Tp, typename _Alloc = allocator<_Tp> >
+      class list
+      : public __norm::list<_Tp, _Alloc>,
+        public __gnu_debug::_Safe_sequence<list<_Tp, _Alloc> >
+      {
+        // ...
+      };
+  } // namespace __norm
+
+  using namespace __debug __attribute__ ((strong));
+}
+
+ +

Link- and run-time coexistence of release- and + debug-mode components

+ +

Because each component has a distinct and separate release and +debug implementation, there are are no issues with link-time +coexistence: the separate namespaces result in different mangled +names, and thus unique linkage.

+ +

However, components that are defined and used within the C++ +standard library itself face additional constraints. For instance, +some of the member functions of std::moneypunct return +std::basic_string. Normally, this is not a problem, but +with a mixed mode standard library that could be using either +debug-mode or release-mode basic_string objects, things +get more complicated. As the return value of a function is not +encoded into the mangled name, there is no way to specify a +release-mode or a debug-mode string. In practice, this results in +runtime errors. A simplified example of this problem is as follows. +

+ +

Take this translation unit, compiled in debug-mode:

+
+// -D_GLIBCXX_DEBUG
+#include <string>
+
+std::string test02();
+ 
+std::string test01()
+{
+  return test02();
+}
+ 
+int main()
+{
+  test01();
+  return 0;
+}
+
+ +

... and linked to this translation unit, compiled in release mode:

+ +
+#include <string>
+ 
+std::string
+test02()
+{
+  return std::string("toast");
+}
+
+ +

For this reason we cannot easily provide safe iterators for + the std::basic_string class template, as it is present + throughout the C++ standard library. For instance, locale facets + define typedefs that include basic_string: in a mixed + debug/release program, should that typedef be based on the + debug-mode basic_string or the + release-mode basic_string? While the answer could be + "both", and the difference hidden via renaming a la the + debug/release containers, we must note two things about locale + facets:

+ +
    +
  1. They exist as shared state: one can create a facet in one + translation unit and access the facet via the same type name in a + different translation unit. This means that we cannot have two + different versions of locale facets, because the types would not be + the same across debug/release-mode translation unit barriers.
  2. + +
  3. They have virtual functions returning strings: these functions + mangle in the same way regardless of the mangling of their return + types (see above), and their precise signatures can be relied upon + by users because they may be overridden in derived classes.
  4. +
+ +

With the design of libstdc++ debug mode, we cannot effectively hide + the differences between debug and release-mode strings from the + user. Failure to hide the differences may result in unpredictable + behavior, and for this reason we have opted to only + perform basic_string changes that do not require ABI + changes. The effect on users is expected to be minimal, as there are + simple alternatives (e.g., __gnu_debug::basic_string), + and the usability benefit we gain from the ability to mix debug- and + release-compiled translation units is enormous.

+ +

Alternatives for Coexistence

+

The coexistence scheme above was chosen over many alternatives, + including language-only solutions and solutions that also required + extensions to the C++ front end. The following is a partial list of + solutions, with justifications for our rejection of each.

+ +
    +
  • Completely separate debug/release libraries: This is by + far the simplest implementation option, where we do not allow any + coexistence of debug- and release-compiled translation units in a + program. This solution has an extreme negative affect on usability, + because it is quite likely that some libraries an application + depends on cannot be recompiled easily. This would not meet + our usability or minimize recompilation criteria + well.
  • + +
  • Add a Debug boolean template parameter: + Partial specialization could be used to select the debug + implementation when Debug == true, and the state + of _GLIBCXX_DEBUG could decide whether the + default Debug argument is true + or false. This option would break conformance with the + C++ standard in both debug and release modes. This would + not meet our correctness criteria.
  • + +
  • Packaging a debug flag in the allocators: We could + reuse the Allocator template parameter of containers + by adding a sentinel wrapper debug<> that + signals the user's intention to use debugging, and pick up + the debug<> allocator wrapper in a partial + specialization. However, this has two drawbacks: first, there is a + conformance issue because the default allocator would not be the + standard-specified std::allocator<T>. Secondly + (and more importantly), users that specify allocators instead of + implicitly using the default allocator would not get debugging + containers. Thus this solution fails the correctness + criteria.
  • + +
  • Define debug containers in another namespace, and employ + a using declaration (or directive): This is an + enticing option, because it would eliminate the need for + the link_name extension by aliasing the + templates. However, there is no true template aliasing mechanism + is C++, because both using directives and using + declarations disallow specialization. This method fails + the correctness criteria.
  • + +
  • Use implementation-specific properties of anonymous + namespaces. + See this post + + This method fails the correctness criteria.
  • + +
  • Extension: allow reopening on namespaces: This would + allow the debug mode to effectively alias the + namespace std to an internal namespace, such + as __gnu_std_debug, so that it is completely + separate from the release-mode std namespace. While + this will solve some renaming problems and ensure that + debug- and release-compiled code cannot be mixed unsafely, it ensures that + debug- and release-compiled code cannot be mixed at all. For + instance, the program would have two std::cout + objects! This solution would fails the minimize + recompilation requirement, because we would only be able to + support option (1) or (2).
  • + +
  • Extension: use link name: This option involves + complicated re-naming between debug-mode and release-mode + components at compile time, and then a g++ extension called + link name to recover the original names at link time. There + are two drawbacks to this approach. One, it's very verbose, + relying on macro renaming at compile time and several levels of + include ordering. Two, ODR issues remained with container member + functions taking no arguments in mixed-mode settings resulting in + equivalent link names, vector::push_back() being + one example. + See link + name
  • +
+ +

Other options may exist for implementing the debug mode, many of + which have probably been considered and others that may still be + lurking. This list may be expanded over time to include other + options that we could have implemented, but in all cases the full + ramifications of the approach (as measured against the design goals + for a libstdc++ debug mode) should be considered first. The DejaGNU + testsuite includes some testcases that check for known problems with + some solutions (e.g., the using declaration solution + that breaks user specialization), and additional testcases will be + added as we are able to identify other typical problem cases. These + test cases will serve as a benchmark by which we can compare debug + mode implementations.

+ + + +
+

+See license.html for copying conditions. +Comments and suggestions are welcome, and may be sent to +the libstdc++ mailing list. +

+ + + + diff --git a/libstdc++-v3/doc/html/ext/howto.html b/libstdc++-v3/doc/html/ext/howto.html new file mode 100644 index 00000000000..2e88c660a61 --- /dev/null +++ b/libstdc++-v3/doc/html/ext/howto.html @@ -0,0 +1,675 @@ + + + + + + + + + + + libstdc++ HOWTO: Extensions + + + + + + + + + +

Extensions

+ +

Here we will make an attempt at describing the non-Standard extensions to + the library. Some of these are from SGI's STL, some of these are GNU's, + and some just seemed to appear on the doorstep. +

+

Before you leap in and use these, be aware of two things: +

+
    +
  1. Non-Standard means exactly that. The behavior, and the very + existence, of these extensions may change with little or no + warning. (Ideally, the really good ones will appear in the next + revision of C++.) Also, other platforms, other compilers, other + versions of g++ or libstdc++ may not recognize these names, or + treat them differently, or...
  2. +
  3. You should know how to access + these headers properly.
  4. +
+ + + +
+

Contents

+ + +
+ + + +

Ropes and trees and hashes, oh my!

+

The SGI headers

+
+     <hash_map>
+     <hash_set>
+     <rope>
+     <slist>
+     <rb_tree>
+   
+

are all here; + <hash_map> and <hash_set> + are deprecated but available as backwards-compatible extensions, + as discussed further below. <rope> is the + SGI specialization for large strings ("rope," + "large strings," get it? Love that geeky humor.) + <slist> is a singly-linked list, for when the + doubly-linked list<> is too much space + overhead, and <rb_tree> exposes the red-black + tree classes used in the implementation of the standard maps and + sets. +

+

Each of the associative containers map, multimap, set, and multiset + have a counterpart which uses a + hashing + function to do the arranging, instead of a strict weak ordering + function. The classes take as one of their template parameters a + function object that will return the hash value; by default, an + instantiation of + hash. + You should specialize this functor for your class, or define your own, + before trying to use one of the hashing classes. +

+

The hashing classes support all the usual associative container + functions, as well as some extra constructors specifying the number + of buckets, etc. +

+

Why would you want to use a hashing class instead of the + "normal" implementations? Matt Austern writes: +

+
[W]ith a well chosen hash function, hash tables + generally provide much better average-case performance than binary + search trees, and much worse worst-case performance. So if your + implementation has hash_map, if you don't mind using nonstandard + components, and if you aren't scared about the possibility of + pathological cases, you'll probably get better performance from + hash_map.
+ +

Okay, about the SGI hashing classes... these classes have been + deprecated by the unordered_set, unordered_multiset, unordered_map, + unordered_multimap containers in TR1 and the upcoming C++0x, and + may be removed in future releases. +

+ +

Return to top of page or + to the FAQ. +

+ +
+

Added members and types

+

Some of the classes in the Standard Library have additional + publicly-available members, and some classes are themselves not in + the standard. Of those, some are intended purely for the implementors, + for example, additional typedefs. Those won't be described here + (or anywhere else). +

+
    +
  • The extensions added by SGI are so numerous that they have + their own page. Since the SGI STL is no + longer actively maintained, we will try and keep this code working + ourselves.
  • +
  • Extensions allowing filebufs to be constructed from + stdio types are described in the + chapter 27 notes.
  • +
  • The C++ Standard Library Technical Report adds many new features + to the library, see FAQ 5.5.
  • +
+

Return to top of page or + to the FAQ. +

+ +
+

Compile-time checks

+

Currently libstdc++ uses the concept checkers from the Boost + library to perform optional + compile-time checking of template instantiations of the standard + containers. They are described in the linked-to page. +

+

Return to top of page or + to the FAQ. +

+ +
+

LWG Issues

+

Everybody's got issues. Even the C++ Standard Library. +

+

The Library Working Group, or LWG, is the ISO subcommittee responsible + for making changes to the library. They periodically publish an + Issues List containing problems and possible solutions. As they reach + a consensus on proposed solutions, we often incorporate the solution + into libstdc++. +

+

Here are the issues which have resulted in code changes to the library. + The links are to the specific defect reports from a partial + copy of the Issues List. You can read the full version online + at the ISO C++ + Committee homepage, linked to on the + GCC "Readings" + page. If + you spend a lot of time reading the issues, we recommend downloading + the ZIP file and reading them locally. +

+

(NB: partial copy means that not all links within + the lwg-*.html pages will work. + Specifically, links to defect reports that have not been accorded full + DR status will probably break. Rather than trying to mirror the + entire issues list on our overworked web server, we recommend you go + to the LWG homepage instead.) +

+

+ If a DR is not listed here, we may simply not have gotten to it yet; + feel free to submit a patch. Search the include/bits and src + directories for appearances of _GLIBCXX_RESOLVE_LIB_DEFECTS for + examples of style. Note that we usually do not make changes to the code + until an issue has reached DR status. +

+
+
5: + string::compare specification questionable +
+
This should be two overloaded functions rather than a single function. +
+ +
17: + Bad bool parsing +
+
Apparently extracting Boolean values was messed up... +
+ +
19: + "Noconv" definition too vague +
+
If codecvt::do_in returns noconv there are + no changes to the values in [to, to_limit). +
+ +
22: + Member open vs flags +
+
Re-opening a file stream does not clear the state flags. +
+ +
25: + String operator<< uses width() value wrong +
+
Padding issues. +
+ +
48: + Use of non-existent exception constructor +
+
An instance of ios_base::failure is constructed instead. +
+ +
49: + Underspecification of ios_base::sync_with_stdio +
+
The return type is the previous state of synchronization. +
+ +
50: + Copy constructor and assignment operator of ios_base +
+
These members functions are declared private and are + thus inaccessible. Specifying the correct semantics of + "copying stream state" was deemed too complicated. +
+ +
60: + What is a formatted input function? +
+
This DR made many widespread changes to basic_istream + and basic_ostream all of which have been implemented. +
+ +
63: + Exception-handling policy for unformatted output +
+
Make the policy consistent with that of formatted input, unformatted + input, and formatted output. +
+ +
68: + Extractors for char* should store null at end +
+
And they do now. An editing glitch in the last item in the list of + [27.6.1.2.3]/7. +
+ +
74: + Garbled text for codecvt::do_max_length +
+
The text of the standard was gibberish. Typos gone rampant. +
+ +
75: + Contradiction in codecvt::length's argument types +
+
Change the first parameter to stateT& and implement + the new effects paragraph. +
+ +
83: + string::npos vs. string::max_size() +
+
Safety checks on the size of the string should test against + max_size() rather than npos. +
+ +
90: + Incorrect description of operator>> for strings +
+
The effect contain isspace(c,getloc()) which must be + replaced by isspace(c,is.getloc()). +
+ +
91: + Description of operator>> and getline() for string<> + might cause endless loop +
+
They behave as a formatted input function and as an unformatted + input function, respectively (except that getline is + not required to set gcount). +
+ +
103: + set::iterator is required to be modifiable, but this allows + modification of keys. +
+
For associative containers where the value type is the same as + the key type, both iterator and const_iterator + are constant iterators. +
+ +
109: + Missing binders for non-const sequence elements +
+
The binder1st and binder2nd didn't have an + operator() taking a non-const parameter. +
+ +
110: + istreambuf_iterator::equal not const +
+
This was not a const member function. Note that the DR says to + replace the function with a const one; we have instead provided an + overloaded version with identical contents. +
+ +
117: + basic_ostream uses nonexistent num_put member functions +
+
num_put::put() was overloaded on the wrong types. +
+ +
118: + basic_istream uses nonexistent num_get member functions +
+
Same as 117, but for num_get::get(). +
+ +
129: + Need error indication from seekp() and seekg() +
+
These functions set failbit on error now. +
+ +
136: + seekp, seekg setting wrong streams? +
+
seekp should only set the output stream, and + seekg should only set the input stream. +
+ + + +
167: + Improper use of traits_type::length() +
+
op<< with a const char* was + calculating an incorrect number of characters to write. +
+ +
169: + Bad efficiency of overflow() mandated +
+
Grow efficiently the internal array object. +
+ +
171: + Strange seekpos() semantics due to joint position +
+
Quite complex to summarize... +
+ +
181: + make_pair() unintended behavior +
+
This function used to take its arguments as reference-to-const, now + it copies them (pass by value). +
+ +
195: + Should basic_istream::sentry's constructor ever set eofbit? +
+
Yes, it can, specifically if EOF is reached while skipping whitespace. +
+ +
211: + operator>>(istream&, string&) doesn't set failbit +
+
If nothing is extracted into the string, op>> now + sets failbit (which can cause an exception, etc., etc.). +
+ +
214: + set::find() missing const overload +
+
Both set and multiset were missing + overloaded find, lower_bound, upper_bound, and equal_range functions + for const instances. +
+ +
231: + Precision in iostream? +
+
For conversion from a floating-point type, str.precision() + is specified in the conversion specification. +
+ +
233: + Insertion hints in associative containers +
+
Implement N1780, first check before then check after, insert as close + to hint as possible. +
+ +
235: + No specification of default ctor for reverse_iterator +
+
The declaration of reverse_iterator lists a default constructor. + However, no specification is given what this constructor should do. +
+ +
241: + Does unique_copy() require CopyConstructible and Assignable? +
+
Add a helper for forward_iterator/output_iterator, fix the existing + one for input_iterator/output_iterator to not rely on Assignability. +
+ +
243: + get and getline when sentry reports failure +
+
Store a null character only if the character array has a non-zero size. +
+ +
251: + basic_stringbuf missing allocator_type +
+
This nested typedef was originally not specified. +
+ +
253: + valarray helper functions are almost entirely useless +
+
Make the copy constructor and copy-assignment operator declarations + public in gslice_array, indirect_array, mask_array, slice_array; provide + definitions. +
+ +
265: + std::pair::pair() effects overly restrictive +
+
The default ctor would build its members from copies of temporaries; + now it simply uses their respective default ctors. +
+ +
266: + bad_exception::~bad_exception() missing Effects clause +
+
The bad_* classes no longer have destructors (they + are trivial), since no description of them was ever given. +
+ +
271: + basic_iostream missing typedefs +
+
The typedefs it inherits from its base classes can't be used, since + (for example) basic_iostream<T>::traits_type is ambiguous. +
+ +
275: + Wrong type in num_get::get() overloads +
+
Similar to 118. +
+ +
280: + Comparison of reverse_iterator to const reverse_iterator +
+
Add global functions with two template parameters. + (NB: not added for now a templated assignment operator) +
+ +
292: + Effects of a.copyfmt (a) +
+
If (this == &rhs) do nothing. +
+ +
300: + List::merge() specification incomplete +
+
If (this == &x) do nothing. +
+ +
303: + Bitset input operator underspecified +
+
Basically, compare the input character to is.widen(0) + and is.widen(1). +
+ +
305: + Default behavior of codecvt<wchar_t, char, mbstate_t>::length() +
+
Do not specify what codecvt<wchar_t, char, mbstate_t>::do_length + must return. +
+ +
328: + Bad sprintf format modifier in money_put<>::do_put() +
+
Change the format string to "%.0Lf". +
+ +
365: + Lack of const-qualification in clause 27 +
+
Add const overloads of is_open. +
+ +
389: + Const overload of valarray::operator[] returns by value +
+
Change it to return a const T&. +
+ +
402: + Wrong new expression in [some_]allocator::construct +
+
Replace "new" with "::new". +
+ +
409: + Closing an fstream should clear the error state +
+
Have open clear the error flags. +
+ +
431: + Swapping containers with unequal allocators +
+
Implement Option 3, as per N1599. +
+ +
432: + stringbuf::overflow() makes only one write position + available +
+
Implement the resolution, beyond DR 169. +
+ +
434: + bitset::to_string() hard to use +
+
Add three overloads, taking fewer template arguments. +
+ +
438: + Ambiguity in the "do the right thing" clause +
+
Implement the resolution, basically cast less. +
+ +
453: + basic_stringbuf::seekoff need not always fail for an empty stream +
+
Don't fail if the next pointer is null and newoff is zero. +
+ +
455: + cerr::tie() and wcerr::tie() are overspecified +
+
Initialize cerr tied to cout and wcerr tied to wcout. +
+ +
464: + Suggestion for new member functions in standard containers +
+
Add data() to std::vector and + at(const key_type&) to std::map. +
+ +
508: + Bad parameters for ranlux64_base_01 +
+
Fix the parameters. +
+ +
512: + Seeding subtract_with_carry_01 from a single unsigned long +
+
Construct a linear_congruential engine and seed with it. +
+ +
526: + Is it undefined if a function in the standard changes in + parameters? +
+
Use &value. +
+ +
538: + 241 again: Does unique_copy() require CopyConstructible + and Assignable? +
+
In case of input_iterator/output_iterator rely on Assignability of + input_iterator' value_type. +
+ +
541: + shared_ptr template assignment and void +
+
Add an auto_ptr<void> specialization. +
+ +
543: + valarray slice default constructor +
+
Follow the straightforward proposed resolution. +
+ +
586: + string inserter not a formatted function +
+
Change it to be a formatted output function (i.e. catch exceptions). +
+ +
596: + 27.8.1.3 Table 112 omits "a+" and "a+b" modes +
+
Add the missing modes to fopen_mode. +
+ +
660: + Missing bitwise operations +
+
Add the missing operations. +
+ +
693: + std::bitset::all() missing +
+
Add it, consistently with the discussion. +
+ +
695: + ctype<char>::classic_table() not accessible +
+
Make the member functions table and classic_table public. +
+ +
+

Return to top of page or + to the FAQ. +

+ + + + +
+

+See license.html for copying conditions. +Comments and suggestions are welcome, and may be sent to +the libstdc++ mailing list. +

+ + + + diff --git a/libstdc++-v3/doc/html/ext/lwg-active.html b/libstdc++-v3/doc/html/ext/lwg-active.html new file mode 100644 index 00000000000..29e0d775bf3 --- /dev/null +++ b/libstdc++-v3/doc/html/ext/lwg-active.html @@ -0,0 +1,14696 @@ + +C++ Standard Library Active Issues List + + + + + + + + + + + + + + + + + + + + + +
Doc. no.N2456=07-0326
Date:2007-10-20
Project:Programming Language C++
Reply to:Howard Hinnant <howard.hinnant@gmail.com>
+

C++ Standard Library Active Issues List (Revision R52)

+ +

Reference ISO/IEC IS 14882:1998(E)

+

Also see:

+ +

The purpose of this document is to record the status of issues + which have come before the Library Working Group (LWG) of the ANSI + (J16) and ISO (WG21) C++ Standards Committee. Issues represent + potential defects in the ISO/IEC IS 14882:1998(E) document. Issues + are not to be used to request new features.

+ +

This document contains only library issues which are actively being + considered by the Library Working Group. That is, issues which have a + status of New, Open, + Ready, and Review. See + Library Defect Reports List for issues considered defects and + Library Closed Issues List for issues considered closed.

+ +

The issues in these lists are not necessarily formal ISO Defect + Reports (DR's). While some issues will eventually be elevated to + official Defect Report status, other issues will be disposed of in + other ways. See Issue Status.

+ +

This document is in an experimental format designed for both + viewing via a world-wide web browser and hard-copy printing. It + is available as an HTML file for browsing or PDF file for + printing.

+ +

Prior to Revision 14, library issues lists existed in two slightly + different versions; a Committee Version and a Public + Version. Beginning with Revision 14 the two versions were combined + into a single version.

+ +

This document includes [bracketed italicized notes] as a + reminder to the LWG of current progress on issues. Such notes are + strictly unofficial and should be read with caution as they may be + incomplete or incorrect. Be aware that LWG support for a particular + resolution can quickly change if new viewpoints or killer examples are + presented in subsequent discussions.

+ +

For the most current official version of this document see + http://www.open-std.org/jtc1/sc22/wg21/. + Requests for further information about this document should include + the document number above, reference ISO/IEC 14882:1998(E), and be + submitted to Information Technology Industry Council (ITI), 1250 Eye + Street NW, Washington, DC 20005.

+ +

Public information as to how to obtain a copy of the C++ Standard, + join the standards committee, submit an issue, or comment on an issue + can be found in the comp.std.c++ FAQ. + Public discussion of C++ Standard related issues occurs on news:comp.std.c++. +

+ +

For committee members, files available on the committee's private + web site include the HTML version of the Standard itself. HTML + hyperlinks from this issues list to those files will only work for + committee members who have downloaded them into the same disk + directory as the issues list files.

+ +

Revision History

+
    +
  • R52: +2007-10-19 post-Kona mailing. + +
  • +
  • R51: +2007-09-09 pre-Kona mailing. + +
  • +
  • R50: +2007-08-05 post-Toronto mailing. +
      +
    • Summary:
        +
      • 153 open issues, down by 5.
      • +
      • 555 closed issues, up by 17.
      • +
      • 708 issues total, up by 12.
      • +
    • +
    • Details:
        +
      • Added the following New issues: 697, 698, 699, 700, 701, 702, 703, 704, 705, 706, 707, 708.
      • +
      • Changed the following issues from New to NAD: 583, 584, 662.
      • +
      • Changed the following issues from Open to NAD: 528.
      • +
      • Changed the following issues from New to NAD Editorial: 637, 647, 658, 690.
      • +
      • Changed the following issues from Open to NAD Editorial: 525.
      • +
      • Changed the following issues from Pending NAD Editorial to NAD Editorial: 553, 571, 591, 633, 636, 641, 642, 648, 649, 656.
      • +
      • Changed the following issues from New to Open: 579, 631, 680.
      • +
      • Changed the following issues from Pending WP to Open: 258.
      • +
      • Changed the following issues from Ready to Pending WP: 644.
      • +
      • Changed the following issues from New to Ready: 577, 660.
      • +
      • Changed the following issues from Open to Ready: 488.
      • +
      • Changed the following issues from Open to Review: 518.
      • +
      • Changed the following issues from Ready to TRDec: 604.
      • +
      • Changed the following issues from DR to WP: 453.
      • +
      • Changed the following issues from Ready to WP: 531, 551, 566, 628, 640, 643, 646.
      • +
    • +
    +
  • +
  • R49: +2007-06-23 pre-Toronto mailing. +
      +
    • Summary:
        +
      • 158 open issues, up by 13.
      • +
      • 538 closed issues, up by 7.
      • +
      • 696 issues total, up by 20.
      • +
    • +
    • Details:
        +
      • Added the following New issues: 677, 678, 679, 680, 681, 682, 684, 685, 686, 687, 688, 689, 690, 691, 692, 693, 694, 695, 696.
      • +
      • Added the following Pending NAD Editorial issues: 683.
      • +
      • Changed the following issues from New to NAD Editorial: 587.
      • +
      • Changed the following issues from Open to NAD Editorial: 590.
      • +
      • Changed the following issues from New to Pending NAD Editorial: 636, 642, 648, 649.
      • +
    • +
    +
  • +
  • R48: +2007-05-06 post-Oxford mailing. + +
  • +
  • R47: +2007-03-09 pre-Oxford mailing. + +
  • +
  • R46: +2007-01-12 mid-term mailing. +
      +
    • Summary:
        +
      • 141 open issues, up by 11.
      • +
      • 478 closed issues, down by 1.
      • +
      • 619 issues total, up by 10.
      • +
    • +
    • Details:
    • +
    +
  • +
  • R45: +2006-11-03 post-Portland mailing. + +
  • +
  • R44: +2006-09-08 pre-Portland mailing. +
      +
    • Summary:
        +
      • 130 open issues, up by 6.
      • +
      • 462 closed issues, down by 1.
      • +
      • 592 issues total, up by 5.
      • +
    • +
    • Details:
    • +
    +
  • +
  • R43: +2006-06-23 mid-term mailing. +
      +
    • Summary:
        +
      • 124 open issues, up by 14.
      • +
      • 463 closed issues, down by 1.
      • +
      • 587 issues total, up by 13.
      • +
    • +
    • Details:
    • +
    +
  • +
  • R42: +2006-04-21 post-Berlin mailing. + +
  • +
  • R41: +2006-02-24 pre-Berlin mailing. +
      +
    • Summary:
        +
      • 126 open issues, up by 31.
      • +
      • 440 closed issues, up by 0.
      • +
      • 566 issues total, up by 31.
      • +
    • +
    • Details:
        +
      • Added new issues 536-566.
      • +
      • Moved 342 from Ready to Open.
      • +
      • Reopened 309.
      • +
    • +
    +
  • +
  • R40: +2005-12-16 mid-term mailing. +
      +
    • Summary:
        +
      • 95 open issues.
      • +
      • 440 closed issues.
      • +
      • 535 issues total.
      • +
    • +
    • Details:
    • +
    +
  • +
  • R39: +2005-10-14 post-Mont Tremblant mailing. +Added new issues 526-528. +Moved issues 280, 461, 464, 465, 467, 468, 474, 496 from Ready to WP as per the vote from Mont Tremblant. +Moved issues 247, 294, 342, 362, 369, 371, 376, 384, 475, 478, 495, 497 from Review to Ready. +Moved issues 498, 504, 506, 509, 510, 511, 512, 513, 514 from New to Open. +Moved issues 505, 507, 508, 519 from New to Ready. +Moved issue 500 from New to NAD. +Moved issue 518 from New to Review. +
  • +
  • R38: +2005-07-03 pre-Mont Tremblant mailing. +Merged open TR1 issues in 504-522. +Added new issues 523-523 +
  • +
  • R37: +2005-06 mid-term mailing. +Added new issues 498-503. +
  • +
  • R36: +2005-04 post-Lillehammer mailing. All issues in "ready" status except +for 454 were moved to "DR" status, and all issues +previously in "DR" status were moved to "WP". +
  • +
  • R35: +2005-03 pre-Lillehammer mailing. +
  • +
  • R34: +2005-01 mid-term mailing. Added new issues 488-494. +
  • +
  • R33: +2004-11 post-Redmond mailing. Reflects actions taken in Redmond. +
  • +
  • R32: +2004-09 pre-Redmond mailing: reflects new proposed resolutions and +new issues received after the 2004-07 mailing. Added +new issues 479-481. +
  • +
  • R31: +2004-07 mid-term mailing: reflects new proposed resolutions and +new issues received after the post-Sydney mailing. Added +new issues 463-478. +
  • +
  • R30: +Post-Sydney mailing: reflects decisions made at the Sydney meeting. +Voted all "Ready" issues from R29 into the working paper. +Added new issues 460-462. +
  • +
  • R29: +Pre-Sydney mailing. Added new issues 441-457. +
  • +
  • R28: +Post-Kona mailing: reflects decisions made at the Kona meeting. +Added new issues 432-440. +
  • +
  • R27: +Pre-Kona mailing. Added new issues 404-431. +
  • +
  • R26: +Post-Oxford mailing: reflects decisions made at the Oxford meeting. +All issues in Ready status were voted into DR status. All issues in +DR status were voted into WP status. +
  • +
  • R25: +Pre-Oxford mailing. Added new issues 390-402. +
  • +
  • R24: +Post-Santa Cruz mailing: reflects decisions made at the Santa Cruz +meeting. All Ready issues from R23 with the exception of 253, which has been given a new proposed resolution, were +moved to DR status. Added new issues 383-389. (Issues 387-389 were discussed +at the meeting.) Made progress on issues 225, 226, 229: 225 and 229 have been moved to Ready status, and the only remaining +concerns with 226 involve wording. +
  • +
  • R23: +Pre-Santa Cruz mailing. Added new issues 367-382. +Moved issues in the TC to TC status. +
  • +
  • R22: +Post-Curaçao mailing. Added new issues 362-366. +
  • +
  • R21: +Pre-Curaçao mailing. Added new issues 351-361. +
  • +
  • R20: +Post-Redmond mailing; reflects actions taken in Redmond. Added +new issues 336-350, of which issues +347-350 were added since Redmond, hence +not discussed at the meeting. + +All Ready issues were moved to DR status, with the exception of issues +284, 241, and 267. + +Noteworthy issues discussed at Redmond include +120 202, 226, 233, +270, 253, 254, 323. +
  • +
  • R19: +Pre-Redmond mailing. Added new issues +323-335. +
  • +
  • R18: +Post-Copenhagen mailing; reflects actions taken in Copenhagen. +Added new issues 312-317, and discussed +new issues 271-314. + +Changed status of issues +103 118 136 153 +165 171 183 184 +185 186 214 221 +234 237 243 248 +251 252 256 260 +261 262 263 265 +268 +to DR. + +Changed status of issues +49 109 117 182 +228 230 232 235 +238 241 242 250 +259 264 266 267 +271 272 273 275 +281 284 285 286 +288 292 295 297 +298 301 303 306 +307 308 312 +to Ready. + +Closed issues +111 277 279 287 +289 293 302 313 +314 +as NAD. + +
  • +
  • R17: +Pre-Copenhagen mailing. Converted issues list to XML. Added proposed +resolutions for issues 49, 76, 91, 235, 250, 267. +Added new issues 278-311. +
  • +
  • R16: +post-Toronto mailing; reflects actions taken in Toronto. Added new +issues 265-277. Changed status of issues +3, 8, 9, 19, +26, 31, 61, +63, 86, 108, +112, 114, 115, +122, 127, 129, +134, 137, 142, +144, 146, 147, +159, 164, 170, +181, 199, 208, +209, 210, 211, +212, 217, 220, +222, 223, 224, +227 to "DR". Reopened issue 23. Reopened +issue 187. Changed issues 2 and +4 to NAD. Fixed a typo in issue 17. Fixed +issue 70: signature should be changed both places it +appears. Fixed issue 160: previous version didn't fix +the bug in enough places. +
  • +
  • R15: +pre-Toronto mailing. Added issues +233-264. Some small HTML formatting +changes so that we pass Weblint tests. +
  • +
  • R14: +post-Tokyo II mailing; reflects committee actions taken in +Tokyo. Added issues 228 to 232. (00-0019R1/N1242) +
  • +
  • R13: +pre-Tokyo II updated: Added issues 212 to 227. +
  • +
  • R12: +pre-Tokyo II mailing: Added issues 199 to +211. Added "and paragraph 5" to the proposed resolution +of issue 29. Add further rationale to issue +178. +
  • +
  • R11: +post-Kona mailing: Updated to reflect LWG and full committee actions +in Kona (99-0048/N1224). Note changed resolution of issues +4 and 38. Added issues 196 +to 198. Closed issues list split into "defects" and +"closed" documents. Changed the proposed resolution of issue +4 to NAD, and changed the wording of proposed resolution +of issue 38. +
  • +
  • R10: +pre-Kona updated. Added proposed resolutions 83, +86, 91, 92, +109. Added issues 190 to +195. (99-0033/D1209, 14 Oct 99) +
  • +
  • R9: +pre-Kona mailing. Added issues 140 to +189. Issues list split into separate "active" and +"closed" documents. (99-0030/N1206, 25 Aug 99) +
  • +
  • R8: +post-Dublin mailing. Updated to reflect LWG and full committee actions +in Dublin. (99-0016/N1193, 21 Apr 99) +
  • +
  • R7: +pre-Dublin updated: Added issues 130, 131, +132, 133, 134, +135, 136, 137, +138, 139 (31 Mar 99) +
  • +
  • R6: +pre-Dublin mailing. Added issues 127, 128, +and 129. (99-0007/N1194, 22 Feb 99) +
  • +
  • R5: +update issues 103, 112; added issues +114 to 126. Format revisions to prepare +for making list public. (30 Dec 98) +
  • +
  • R4: +post-Santa Cruz II updated: Issues 110, +111, 112, 113 added, several +issues corrected. (22 Oct 98) +
  • +
  • R3: +post-Santa Cruz II: Issues 94 to 109 +added, many issues updated to reflect LWG consensus (12 Oct 98) +
  • +
  • R2: +pre-Santa Cruz II: Issues 73 to 93 added, +issue 17 updated. (29 Sep 98) +
  • +
  • R1: +Correction to issue 55 resolution, 60 code +format, 64 title. (17 Sep 98) +
  • +
+ +

Issue Status

+ +

New - The issue has not yet been + reviewed by the LWG. Any Proposed Resolution is purely a + suggestion from the issue submitter, and should not be construed as + the view of LWG.

+ +

Open - The LWG has discussed the issue + but is not yet ready to move the issue forward. There are several + possible reasons for open status:

+
    +
  • Consensus may have not yet have been reached as to how to deal + with the issue.
  • +
  • Informal consensus may have been reached, but the LWG awaits + exact Proposed Resolution wording for review.
  • +
  • The LWG wishes to consult additional technical experts before + proceeding.
  • +
  • The issue may require further study.
  • +
+ +

A Proposed Resolution for an open issue is still not be + construed as the view of LWG. Comments on the current state of + discussions are often given at the end of open issues in an italic + font. Such comments are for information only and should not be given + undue importance.

+ +

Dup - The LWG has reached consensus that + the issue is a duplicate of another issue, and will not be further + dealt with. A Rationale identifies the duplicated issue's + issue number.

+ +

NAD - The LWG has reached consensus that + the issue is not a defect in the Standard.

+ +

NAD Editorial - The LWG has reached consensus that + the issue can either be handled editorially, or is handled by a paper (usually + linked to in the rationale).

+ +

NAD Future - In addition to the regular + status, the LWG believes that this issue should be revisited at the + next revision of the standard.

+ +

Review - Exact wording of a + Proposed Resolution is now available for review on an issue + for which the LWG previously reached informal consensus.

+ +

Tentatively Ready - The issue has + been reviewed online, but not in a meeting, and some support has been formed + for the proposed resolution. Tentatively Ready issues may be moved to Ready + and forwarded to full committee within the same meeting. Unlike Ready issues + they will be reviewed in subcommittee prior to forwarding to full committee.

+ +

Ready - The LWG has reached consensus + that the issue is a defect in the Standard, the Proposed + Resolution is correct, and the issue is ready to forward to the + full committee for further action as a Defect Report (DR).

+ +

DR - (Defect Report) - The full J16 + committee has voted to forward the issue to the Project Editor to be + processed as a Potential Defect Report. The Project Editor reviews + the issue, and then forwards it to the WG21 Convenor, who returns it + to the full committee for final disposition. This issues list + accords the status of DR to all these Defect Reports regardless of + where they are in that process.

+ +

TC - (Technical Corrigenda) - The full + WG21 committee has voted to accept the Defect Report's Proposed + Resolution as a Technical Corrigenda. Action on this issue is thus + complete and no further action is possible under ISO rules.

+ +

TRDec - (Decimal TR defect) - The + LWG has voted to accept the Defect Report's Proposed + Resolution into the Decimal TR. Action on this issue is thus + complete and no further action is expected.

+ +

WP - (Working Paper) - The proposed + resolution has not been accepted as a Technical Corrigendum, but + the full WG21 committee has voted to apply the Defect Report's Proposed + Resolution to the working paper.

+ +

Pending - This is a status qualifier. When prepended to + a status this indicates the issue has been + processed by the committee, and a decision has been made to move the issue to + the associated unqualified status. However for logistical reasons the indicated + outcome of the issue has not yet appeared in the latest working paper. + +

Issues are always given the status of New when + they first appear on the issues list. They may progress to + Open or Review while the LWG + is actively working on them. When the LWG has reached consensus on + the disposition of an issue, the status will then change to + Dup, NAD, or + Ready as appropriate. Once the full J16 committee votes to + forward Ready issues to the Project Editor, they are given the + status of Defect Report ( DR). These in turn may + become the basis for Technical Corrigenda (TC), + or are closed without action other than a Record of Response + (RR ). The intent of this LWG process is that + only issues which are truly defects in the Standard move to the + formal ISO DR status. +

+ + +

Active Issues

+
+

23. Num_get overflow result

+

Section: 22.2.2.1.2 [facet.num.get.virtuals] Status: Open + Submitter: Nathan Myers Date: 1998-08-06

+

View other active issues in [facet.num.get.virtuals].

+

View all other issues in [facet.num.get.virtuals].

+

View all issues with Open status.

+

Discussion:

+

The current description of numeric input does not account for the +possibility of overflow. This is an implicit result of changing the +description to rely on the definition of scanf() (which fails to +report overflow), and conflicts with the documented behavior of +traditional and current implementations.

+ +

Users expect, when reading a character sequence that results in a +value unrepresentable in the specified type, to have an error +reported. The standard as written does not permit this.

+ +

Further comments from Dietmar:

+ +

+I don't feel comfortable with the proposed resolution to issue 23: It +kind of simplifies the issue to much. Here is what is going on: +

+ +

+Currently, the behavior of numeric overflow is rather counter intuitive +and hard to trace, so I will describe it briefly: +

+ +
    +
  • + According to 22.2.2.1.2 [facet.num.get.virtuals] + paragraph 11 failbit is set if scanf() would + return an input error; otherwise a value is converted to the rules + of scanf. +
  • +
  • + scanf() is defined in terms of fscanf(). +
  • +
  • + fscanf() returns an input failure if during conversion no + character matching the conversion specification could be extracted + before reaching EOF. This is the only reason for fscanf() + to fail due to an input error and clearly does not apply to the case + of overflow. +
  • +
  • + Thus, the conversion is performed according to the rules of + fscanf() which basically says that strtod, + strtol(), etc. are to be used for the conversion. +
  • +
  • + The strtod(), strtol(), etc. functions consume as + many matching characters as there are and on overflow continue to + consume matching characters but also return a value identical to + the maximum (or minimum for signed types if there was a leading minus) + value of the corresponding type and set errno to ERANGE. +
  • +
  • + Thus, according to the current wording in the standard, overflows + can be detected! All what is to be done is to check errno + after reading an element and, of course, clearing errno + before trying a conversion. With the current wording, it can be + detected whether the overflow was due to a positive or negative + number for signed types. +
  • +
+ +

Further discussion from Redmond:

+ +

The basic problem is that we've defined our behavior, +including our error-reporting behavior, in terms of C90. However, +C90's method of reporting overflow in scanf is not technically an +"input error". The strto_* functions are more precise.

+ +

There was general consensus that failbit should be set +upon overflow. We considered three options based on this:

+
    +
  1. Set failbit upon conversion error (including overflow), and + don't store any value.
  2. +
  3. Set failbit upon conversion error, and also set errno to + indicated the precise nature of the error.
  4. +
  5. Set failbit upon conversion error. If the error was due to + overflow, store +-numeric_limits<T>::max() as an + overflow indication.
  6. +
+ +

Straw poll: (1) 5; (2) 0; (3) 8.

+ + +

Discussed at Lillehammer. General outline of what we want the + solution to look like: we want to say that overflow is an error, and + provide a way to distinguish overflow from other kinds of errors. + Choose candidate field the same way scanf does, but don't describe + the rest of the process in terms of format. If a finite input field + is too large (positive or negative) to be represented as a finite + value, then set failbit and assign the nearest representable value. + Bill will provide wording.

+ +

+Discussed at Toronto: +N2327 +is in alignment with the direction we wanted to go with in Lillehammer. Bill +to work on. +

+ + + +

Proposed resolution:

+ +

+Change 22.2.2.1.2 [facet.num.get.virtuals], end of p3: +

+ +
+

+Stage 3: The result of stage 2 processing can be one of +The sequence of chars accumulated in stage 2 (the field) is +converted to a numeric value by the rules of one of the functions declared +in the header <cstdlib>: +

+
    +
  • +A sequence of chars has been accumulated in stage 2 that is +converted (according to the rules of scanf) to a value of the +type of val. This value is stored in val and ios_base::goodbit is +stored in err. +For a signed integer value, the function strtoll. +
  • +
  • +The sequence of chars accumulated in stage 2 would have caused +scanf to report an input failure. ios_base::failbit is +assigned to err. +For an unsigned integer value, the function strtoull. +
  • +
  • +For a floating-point value, the function strtold. +
  • +
+

+The numeric value to be stored can be one of: +

+
    +
  • zero, if the conversion function fails to convert the entire field. +ios_base::failbit is assigned to err.
  • +
  • the most positive representable value, if the field represents a value +too large positive to be represented in val. ios_base::failbit is assigned +to err.
  • +
  • the most negative representable value (zero for unsigned integer), if +the field represents a value too large negative to be represented in val. +ios_base::failbit is assigned to err.
  • +
  • the converted value, otherwise.
  • +
+ +

+The resultant numeric value is stored in val. +

+
+ +

+Change 22.2.2.1.2 [facet.num.get.virtuals], p6-p7: +

+ +
+
iter_type do_get(iter_type in, iter_type end, ios_base& str, 
+                 ios_base::iostate& err, bool& val) const;
+
+
+

+-6- Effects: If +(str.flags()&ios_base::boolalpha)==0 then input +proceeds as it would for a long except that if a value is being +stored into val, the value is determined according to the +following: If the value to be stored is 0 then false is stored. +If the value is 1 then true is stored. Otherwise +err|=ios_base::failbit is performed and no value true is +stored. and ios_base::failbit is assigned to err. +

+

+-7- Otherwise target sequences are determined "as if" by calling the +members falsename() and truename() of the facet +obtained by use_facet<numpunct<charT> +>(str.getloc()). Successive characters in the range +[in,end) (see 23.1.1) are obtained and matched +against corresponding positions in the target sequences only as +necessary to identify a unique match. The input iterator in is +compared to end only when necessary to obtain a character. If and +only if a target sequence is uniquely matched, val is set to the +corresponding value. Otherwise false is stored and ios_base::failbit +is assigned to err. +

+
+
+ + + + + +
+

96. Vector<bool> is not a container

+

Section: 23.2.5 [vector] Status: Open + Submitter: AFNOR Date: 1998-10-07

+

View all other issues in [vector].

+

View all issues with Open status.

+

Discussion:

+

vector<bool> is not a container as its reference and +pointer types are not references and pointers.

+ +

Also it forces everyone to have a space optimization instead of a +speed one.

+ +

See also: 99-0008 == N1185 Vector<bool> is +Nonconforming, Forces Optimization Choice.

+ +

[In Santa Cruz the LWG felt that this was Not A Defect.]

+ + +

[In Dublin many present felt that failure to meet Container +requirements was a defect. There was disagreement as to whether +or not the optimization requirements constituted a defect.]

+ + +

[The LWG looked at the following resolutions in some detail: +
+     * Not A Defect.
+     * Add a note explaining that vector<bool> does not meet +Container requirements.
+     * Remove vector<bool>.
+     * Add a new category of container requirements which +vector<bool> would meet.
+     * Rename vector<bool>.
+
+No alternative had strong, wide-spread, support and every alternative +had at least one "over my dead body" response.
+
+There was also mention of a transition scheme something like (1) add +vector_bool and deprecate vector<bool> in the next standard. (2) +Remove vector<bool> in the following standard.]

+ + +

[Modifying container requirements to permit returning proxies +(thus allowing container requirements conforming vector<bool>) +was also discussed.]

+ + +

[It was also noted that there is a partial but ugly workaround in +that vector<bool> may be further specialized with a customer +allocator.]

+ + +

[Kona: Herb Sutter presented his paper J16/99-0035==WG21/N1211, +vector<bool>: More Problems, Better Solutions. Much discussion +of a two step approach: a) deprecate, b) provide replacement under a +new name. LWG straw vote on that: 1-favor, 11-could live with, 2-over +my dead body. This resolution was mentioned in the LWG report to the +full committee, where several additional committee members indicated +over-my-dead-body positions.]

+ + +

Discussed at Lillehammer. General agreement that we should + deprecate vector<bool> and introduce this functionality under + a different name, e.g. bit_vector. This might make it possible to + remove the vector<bool> specialization in the standard that comes + after C++0x. There was also a suggestion that + in C++0x we could additional say that it's implementation defined + whether vector<bool> refers to the specialization or to the + primary template, but there wasn't general agreement that this was a + good idea.

+ +

We need a paper for the new bit_vector class.

+ + + + +

Proposed resolution:

+

+We now have: +N2050 +and +N2160. +

+ +

[ +Batavia: The LWG feels we need something closer to SGI's bitvector to ease migration +from vector<bool>. Although some of the funcitonality from +N2050 +could well be used in such a template. The concern is easing the API migration for those +users who want to continue using a bit-packed container. Alan and Beman to work. +]

+ + + + + + +
+

255. Why do basic_streambuf<>::pbump() and gbump() take an int?

+

Section: 27.5.2 [streambuf] Status: Open + Submitter: Martin Sebor Date: 2000-08-12

+

View all other issues in [streambuf].

+

View all issues with Open status.

+

Discussion:

+

+The basic_streambuf members gbump() and pbump() are specified to take an +int argument. This requirement prevents the functions from effectively +manipulating buffers larger than std::numeric_limits<int>::max() +characters. It also makes the common use case for these functions +somewhat difficult as many compilers will issue a warning when an +argument of type larger than int (such as ptrdiff_t on LLP64 +architectures) is passed to either of the function. Since it's often the +result of the subtraction of two pointers that is passed to the +functions, a cast is necessary to silence such warnings. Finally, the +usage of a native type in the functions signatures is inconsistent with +other member functions (such as sgetn() and sputn()) that manipulate the +underlying character buffer. Those functions take a streamsize argument. +

+ + +

Proposed resolution:

+

+Change the signatures of these functions in the synopsis of template +class basic_streambuf (27.5.2) and in their descriptions (27.5.2.3.1, p4 +and 27.5.2.3.2, p4) to take a streamsize argument. +

+ +

+Although this change has the potential of changing the ABI of the +library, the change will affect only platforms where int is different +than the definition of streamsize. However, since both functions are +typically inline (they are on all known implementations), even on such +platforms the change will not affect any user code unless it explicitly +relies on the existing type of the functions (e.g., by taking their +address). Such a possibility is IMO quite remote. +

+ +

+Alternate Suggestion from Howard Hinnant, c++std-lib-7780: +

+ +

+This is something of a nit, but I'm wondering if streamoff wouldn't be a +better choice than streamsize. The argument to pbump and gbump MUST be +signed. But the standard has this to say about streamsize +(27.4.1/2/Footnote): +

+ +

+ [Footnote: streamsize is used in most places where ISO C would use + size_t. Most of the uses of streamsize could use size_t, except for + the strstreambuf constructors, which require negative values. It + should probably be the signed type corresponding to size_t (which is + what Posix.2 calls ssize_t). --- end footnote] +

+ +

+This seems a little weak for the argument to pbump and gbump. Should we +ever really get rid of strstream, this footnote might go with it, along +with the reason to make streamsize signed. +

+ + +

Rationale:

+

The LWG believes this change is too big for now. We may wish to +reconsider this for a future revision of the standard. One +possibility is overloading pbump, rather than changing the +signature.

+

[ +[2006-05-04: Reopened at the request of Chris (Krzysztof ?elechowski)] +]

+ + + + + +
+

290. Requirements to for_each and its function object

+

Section: 25.1.1 [alg.foreach] Status: Open + Submitter: Angelika Langer Date: 2001-01-03

+

View all other issues in [alg.foreach].

+

View all issues with Open status.

+

Discussion:

+

The specification of the for_each algorithm does not have a +"Requires" section, which means that there are no +restrictions imposed on the function object whatsoever. In essence it +means that I can provide any function object with arbitrary side +effects and I can still expect a predictable result. In particular I +can expect that the function object is applied exactly last - first +times, which is promised in the "Complexity" section. +

+ +

I don't see how any implementation can give such a guarantee +without imposing requirements on the function object. +

+ +

Just as an example: consider a function object that removes +elements from the input sequence. In that case, what does the +complexity guarantee (applies f exactly last - first times) mean? +

+ +

One can argue that this is obviously a nonsensical application and +a theoretical case, which unfortunately it isn't. I have seen +programmers shooting themselves in the foot this way, and they did not +understand that there are restrictions even if the description of the +algorithm does not say so. +

+

[Lillehammer: This is more general than for_each. We don't want + the function object in transform invalidiating iterators + either. There should be a note somewhere in clause 17 (17, not 25) + saying that user code operating on a range may not invalidate + iterators unless otherwise specified. Bill will provide wording.]

+ + + +

Proposed resolution:

+ + + + + + +
+

299. Incorrect return types for iterator dereference

+

Section: 24.1.4 [bidirectional.iterators], 24.1.5 [random.access.iterators] Status: Open + Submitter: John Potter Date: 2001-01-22

+

View all other issues in [bidirectional.iterators].

+

View all issues with Open status.

+

Discussion:

+

+In section 24.1.4 [bidirectional.iterators], +Table 75 gives the return type of *r-- as convertible to T. This is +not consistent with Table 74 which gives the return type of *r++ as +T&. *r++ = t is valid while *r-- = t is invalid. +

+ +

+In section 24.1.5 [random.access.iterators], +Table 76 gives the return type of a[n] as convertible to T. This is +not consistent with the semantics of *(a + n) which returns T& by +Table 74. *(a + n) = t is valid while a[n] = t is invalid. +

+ +

+Discussion from the Copenhagen meeting: the first part is +uncontroversial. The second part, operator[] for Random Access +Iterators, requires more thought. There are reasonable arguments on +both sides. Return by value from operator[] enables some potentially +useful iterators, e.g. a random access "iota iterator" (a.k.a +"counting iterator" or "int iterator"). There isn't any obvious way +to do this with return-by-reference, since the reference would be to a +temporary. On the other hand, reverse_iterator takes an +arbitrary Random Access Iterator as template argument, and its +operator[] returns by reference. If we decided that the return type +in Table 76 was correct, we would have to change +reverse_iterator. This change would probably affect user +code. +

+ +

+History: the contradiction between reverse_iterator and the +Random Access Iterator requirements has been present from an early +stage. In both the STL proposal adopted by the committee +(N0527==94-0140) and the STL technical report (HPL-95-11 (R.1), by +Stepanov and Lee), the Random Access Iterator requirements say that +operator[]'s return value is "convertible to T". In N0527 +reverse_iterator's operator[] returns by value, but in HPL-95-11 +(R.1), and in the STL implementation that HP released to the public, +reverse_iterator's operator[] returns by reference. In 1995, the +standard was amended to reflect the contents of HPL-95-11 (R.1). The +original intent for operator[] is unclear. +

+ +

+In the long term it may be desirable to add more fine-grained +iterator requirements, so that access method and traversal strategy +can be decoupled. (See "Improved Iterator Categories and +Requirements", N1297 = 01-0011, by Jeremy Siek.) Any decisions +about issue 299 should keep this possibility in mind. +

+ +

Further discussion: I propose a compromise between John Potter's +resolution, which requires T& as the return type of +a[n], and the current wording, which requires convertible to +T. The compromise is to keep the convertible to T +for the return type of the expression a[n], but to also add +a[n] = t as a valid expression. This compromise "saves" the +common case uses of random access iterators, while at the same time +allowing iterators such as counting iterator and caching file +iterators to remain random access iterators (iterators where the +lifetime of the object returned by operator*() is tied to the +lifetime of the iterator). +

+ +

+Note that the compromise resolution necessitates a change to +reverse_iterator. It would need to use a proxy to support +a[n] = t. +

+ +

+Note also there is one kind of mutable random access iterator that +will no longer meet the new requirements. Currently, iterators that +return an r-value from operator[] meet the requirements for a +mutable random access iterartor, even though the expression a[n] = +t will only modify a temporary that goes away. With this proposed +resolution, a[n] = t will be required to have the same +operational semantics as *(a + n) = t. +

+ + + +

Proposed resolution:

+ +

+In section 24.1.4 [lib.bidirectdional.iterators], change the return +type in table 75 from "convertible to T" to +T&. +

+ +

+In section 24.1.5 [lib.random.access.iterators], change the +operational semantics for a[n] to " the r-value of +a[n] is equivalent to the r-value of *(a + +n)". Add a new row in the table for the expression a[n] = t +with a return type of convertible to T and operational semantics of +*(a + n) = t. +

+ +

[Lillehammer: Real problem, but should be addressed as part of + iterator redesign]

+ + + + + + + + +
+

309. Does sentry catch exceptions?

+

Section: 27.6 [iostream.format] Status: Open + Submitter: Martin Sebor Date: 2001-03-19

+

View other active issues in [iostream.format].

+

View all other issues in [iostream.format].

+

View all issues with Open status.

+

Discussion:

+

+The descriptions of the constructors of basic_istream<>::sentry +(27.6.1.1.3 [istream::sentry]) and basic_ostream<>::sentry +(27.6.2.4 [ostream::sentry]) do not explain what the functions do in +case an exception is thrown while they execute. Some current +implementations allow all exceptions to propagate, others catch them +and set ios_base::badbit instead, still others catch some but let +others propagate. +

+ +

+The text also mentions that the functions may call setstate(failbit) +(without actually saying on what object, but presumably the stream +argument is meant). That may have been fine for +basic_istream<>::sentry prior to issue 195, since +the function performs an input operation which may fail. However, +issue 195 amends 27.6.1.1.3 [istream::sentry], p2 to +clarify that the function should actually call setstate(failbit | +eofbit), so the sentence in p3 is redundant or even somewhat +contradictory. +

+ +

+The same sentence that appears in 27.6.2.4 [ostream::sentry], p3 +doesn't seem to be very meaningful for basic_istream<>::sentry +which performs no input. It is actually rather misleading since it +would appear to guide library implementers to calling +setstate(failbit) when os.tie()->flush(), the only called function, +throws an exception (typically, it's badbit that's set in response to +such an event). +

+ +

Additional comments from Martin, who isn't comfortable with the + current proposed resolution (see c++std-lib-11530)

+ +

+The istream::sentry ctor says nothing about how the function +deals with exemptions (27.6.1.1.2, p1 says that the class is +responsible for doing "exception safe"(*) prefix and suffix +operations but it doesn't explain what level of exception +safety the class promises to provide). The mockup example +of a "typical implementation of the sentry ctor" given in +27.6.1.1.2, p6, removed in ISO/IEC 14882:2003, doesn't show +exception handling, either. Since the ctor is not classified +as a formatted or unformatted input function, the text in +27.6.1.1, p1 through p4 does not apply. All this would seem +to suggest that the sentry ctor should not catch or in any +way handle exceptions thrown from any functions it may call. +Thus, the typical implementation of an istream extractor may +look something like [1]. +

+ +

+The problem with [1] is that while it correctly sets ios::badbit +if an exception is thrown from one of the functions called from +the sentry ctor, if the sentry ctor reaches EOF while extracting +whitespace from a stream that has eofbit or failbit set in +exceptions(), it will cause an ios::failure to be thrown, which +will in turn cause the extractor to set ios::badbit. +

+ +

+The only straightforward way to prevent this behavior is to +move the definition of the sentry object in the extractor +above the try block (as suggested by the example in 22.2.8, +p9 and also indirectly supported by 27.6.1.3, p1). See [2]. +But such an implementation will allow exceptions thrown from +functions called from the ctor to freely propagate to the +caller regardless of the setting of ios::badbit in the stream +object's exceptions(). +

+ +

+So since neither [1] nor [2] behaves as expected, the only +possible solution is to have the sentry ctor catch exceptions +thrown from called functions, set badbit, and propagate those +exceptions if badbit is also set in exceptions(). (Another +solution exists that deals with both kinds of sentries, but +the code is non-obvious and cumbersome -- see [3].) +

+ +

+Please note that, as the issue points out, current libraries +do not behave consistently, suggesting that implementors are +not quite clear on the exception handling in istream::sentry, +despite the fact that some LWG members might feel otherwise. +(As documented by the parenthetical comment here: +http://anubis.dkuug.dk/jtc1/sc22/wg21/docs/papers/2003/n1480.html#309) +

+ +

+Also please note that those LWG members who in Copenhagen +felt that "a sentry's constructor should not catch exceptions, +because sentries should only be used within (un)formatted input +functions and that exception handling is the responsibility of +those functions, not of the sentries," as noted here +http://anubis.dkuug.dk/jtc1/sc22/wg21/docs/papers/2001/n1310.html#309 +would in effect be either arguing for the behavior described +in [1] or for extractors implemented along the lines of [3]. +

+ +

+The original proposed resolution (Revision 25 of the issues +list) clarifies the role of the sentry ctor WRT exception +handling by making it clear that extractors (both library +or user-defined) should be implemented along the lines of +[2] (as opposed to [1]) and that no exception thrown from +the callees should propagate out of either function unless +badbit is also set in exceptions(). +

+ + +

[1] Extractor that catches exceptions thrown from sentry:

+ +
+
struct S { long i; };
+
+istream& operator>> (istream &strm, S &s)
+{
+    ios::iostate err = ios::goodbit;
+    try {
+        const istream::sentry guard (strm, false);
+        if (guard) {
+            use_facet<num_get<char> >(strm.getloc ())
+                .get (istreambuf_iterator<char>(strm),
+                      istreambuf_iterator<char>(),
+                      strm, err, s.i);
+        }
+    }
+    catch (...) {
+        bool rethrow;
+        try {
+            strm.setstate (ios::badbit);
+            rethrow = false;
+        }
+        catch (...) {
+            rethrow = true;
+        }
+        if (rethrow)
+            throw;
+    }
+    if (err)
+        strm.setstate (err);
+    return strm;
+}
+
+
+ +

[2] Extractor that propagates exceptions thrown from sentry:

+ +
+
istream& operator>> (istream &strm, S &s)
+{
+    istream::sentry guard (strm, false);
+    if (guard) {
+        ios::iostate err = ios::goodbit;
+        try {
+            use_facet<num_get<char> >(strm.getloc ())
+                .get (istreambuf_iterator<char>(strm),
+                      istreambuf_iterator<char>(),
+                      strm, err, s.i);
+        }
+        catch (...) {
+            bool rethrow;
+            try {
+                strm.setstate (ios::badbit);
+                rethrow = false;
+            }
+            catch (...) {
+                rethrow = true;
+            }
+            if (rethrow)
+                throw;
+        }
+        if (err)
+            strm.setstate (err);
+    }
+    return strm;
+}
+
+
+ +

+[3] Extractor that catches exceptions thrown from sentry +but doesn't set badbit if the exception was thrown as a +result of a call to strm.clear(). +

+ +
+
istream& operator>> (istream &strm, S &s)
+{
+    const ios::iostate state = strm.rdstate ();
+    const ios::iostate except = strm.exceptions ();
+    ios::iostate err = std::ios::goodbit;
+    bool thrown = true;
+    try {
+        const istream::sentry guard (strm, false);
+        thrown = false;
+        if (guard) {
+            use_facet<num_get<char> >(strm.getloc ())
+                .get (istreambuf_iterator<char>(strm),
+                      istreambuf_iterator<char>(),
+                      strm, err, s.i);
+        }
+    }
+    catch (...) {
+        if (thrown && state & except)
+            throw;
+        try {
+            strm.setstate (ios::badbit);
+            thrown = false;
+        }
+        catch (...) {
+            thrown = true;
+        }
+        if (thrown)
+            throw;
+    }
+    if (err)
+        strm.setstate (err);
+
+    return strm;
+}
+
+
+ +

+[Pre-Berlin] Reopened at the request of Paolo Carlini and Steve Clamage. +

+ +

+[Pre-Portland] A relevant newsgroup post: +

+ +

+The current proposed resolution of issue #309 +(http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#309) is +unacceptable. I write commerical software and coding around this +makes my code ugly, non-intuitive, and requires comments referring +people to this very issue. Following is the full explanation of my +experience. +

+

+In the course of writing software for commercial use, I constructed +std::ifstream's based on user-supplied pathnames on typical POSIX +systems. +

+

+It was expected that some files that opened successfully might not read +successfully -- such as a pathname which actually refered to a +directory. Intuitively, I expected the streambuffer underflow() code +to throw an exception in this situation, and recent implementations of +libstdc++'s basic_filebuf do just that (as well as many of my own +custom streambufs). +

+

+I also intuitively expected that the istream code would convert these +exceptions to the "badbit' set on the stream object, because I had not +requested exceptions. I refer to 27.6.1.1. P4. +

+

+However, this was not the case on at least two implementations -- if +the first thing I did with an istream was call operator>>( T& ) for T +among the basic arithmetic types and std::string. Looking further I +found that the sentry's constructor was invoking the exception when it +pre-scanned for whitespace, and the extractor function (operator>>()) +was not catching exceptions in this situation. +

+

+So, I was in a situation where setting 'noskipws' would change the +istream's behavior even though no characters (whitespace or not) could +ever be successfully read. +

+

+Also, calling .peek() on the istream before calling the extractor() +changed the behavior (.peek() had the effect of setting the badbit +ahead of time). +

+

+I found this all to be so inconsistent and inconvenient for me and my +code design, that I filed a bugzilla entry for libstdc++. I was then +told that the bug cannot be fixed until issue #309 is resolved by the +committee. +

+ + + +

Proposed resolution:

+ + +

Rationale:

+

The LWG agrees there is minor variation between implementations, + but believes that it doesn't matter. This is a rarely used corner + case. There is no evidence that this has any commercial importance + or that it causes actual portability problems for customers trying + to write code that runs on multiple implementations.

+ + + + + +
+

342. seek and eofbit

+

Section: 27.6.1.3 [istream.unformatted] Status: Open + Submitter: Howard Hinnant Date: 2001-10-09

+

View all other issues in [istream.unformatted].

+

View all issues with Open status.

+

Discussion:

+

I think we have a defect.

+ +

According to lwg issue 60 which is now a dr, the +description of seekg in 27.6.1.3 [istream.unformatted] paragraph 38 now looks +like:

+ +

+Behaves as an unformatted input function (as described in 27.6.1.3, +paragraph 1), except that it does not count the number of characters +extracted and does not affect the value returned by subsequent calls to +gcount(). After constructing a sentry object, if fail() != true, +executes rdbuf()->pubseekpos( pos). +

+ +

And according to lwg issue 243 which is also now a dr, +27.6.1.3, paragraph 1 looks like:

+ +

+Each unformatted input function begins execution by constructing an +object of class sentry with the default argument noskipws (second) +argument true. If the sentry object returns true, when converted to a +value of type bool, the function endeavors to obtain the requested +input. Otherwise, if the sentry constructor exits by throwing an +exception or if the sentry object returns false, when converted to a +value of type bool, the function returns without attempting to obtain +any input. In either case the number of extracted characters is set to +0; unformatted input functions taking a character array of non-zero +size as an argument shall also store a null character (using charT()) +in the first location of the array. If an exception is thrown during +input then ios::badbit is turned on in *this'ss error state. If +(exception()&badbit)!= 0 then the exception is rethrown. It also counts +the number of characters extracted. If no exception has been thrown it +ends by storing the count in a member object and returning the value +specified. In any event the sentry object is destroyed before leaving +the unformatted input function. +

+ +

And finally 27.6.1.1.2/5 says this about sentry:

+ +

+If, after any preparation is completed, is.good() is true, ok_ != false +otherwise, ok_ == false. +

+ +

+So although the seekg paragraph says that the operation proceeds if +!fail(), the behavior of unformatted functions says the operation +proceeds only if good(). The two statements are contradictory when only +eofbit is set. I don't think the current text is clear which condition +should be respected. +

+ +

Further discussion from Redmond:

+ +

PJP: It doesn't seem quite right to say that seekg is +"unformatted". That makes specific claims about sentry that +aren't quite appropriate for seeking, which has less fragile failure +modes than actual input. If we do really mean that it's unformatted +input, it should behave the same way as other unformatted input. On +the other hand, "principle of least surprise" is that seeking from EOF +ought to be OK.

+ +

+Pre-Berlin: Paolo points out several problems with the proposed resolution in +Ready state: +

+ +
    +
  • It should apply to both overloads of seekg.
  • +
  • tellg has similar issues, except that it should not call clear().
  • +
  • The point about clear() seems to apply to seekp().
  • +
  • Depending on the outcome of 419 +if the sentry +sets failbit when it finds eofbit already set, then +you can never seek away from the end of stream.
  • +
+ + + +

Proposed resolution:

+ +

Change 27.6.1.3 [istream.unformatted] to:

+

+Behaves as an unformatted input function (as described in 27.6.1.3, +paragraph 1), except that it does not count the number of characters +extracted, does not affect the value returned by subsequent calls to +gcount(), and does not examine the value returned by the sentry +object. After constructing a sentry object, if fail() != +true, executes rdbuf()->pubseekpos(pos). In +case of success, the function calls clear(). +In case of failure, the function calls setstate(failbit) +(which may throw ios_base::failure). +

+ +

[Lillehammer: Matt provided wording.]

+ + + + +

Rationale:

+

In C, fseek does clear EOF. This is probably what most users would + expect. We agree that having eofbit set should not deter a seek, + and that a successful seek should clear eofbit. Note + that fail() is true only if failbit + or badbit is set, so using !fail(), rather + than good(), satisfies this goal.

+ + + + + +
+

343. Unspecified library header dependencies

+

Section: 21 [strings], 23 [containers], 27 [input.output] Status: Open + Submitter: Martin Sebor Date: 2001-10-09

+

View all other issues in [strings].

+

View all issues with Open status.

+

Discussion:

+

+The synopses of the C++ library headers clearly show which names are +required to be defined in each header. Since in order to implement the +classes and templates defined in these headers declarations of other +templates (but not necessarily their definitions) are typically +necessary the standard in 17.4.4, p1 permits library implementers to +include any headers needed to implement the definitions in each header. +

+ +

+For instance, although it is not explicitly specified in the synopsis of +<string>, at the point of definition of the std::basic_string template +the declaration of the std::allocator template must be in scope. All +current implementations simply include <memory> from within <string>, +either directly or indirectly, to bring the declaration of +std::allocator into scope. +

+ +

+Additionally, however, some implementation also include <istream> and +<ostream> at the top of <string> to bring the declarations of +std::basic_istream and std::basic_ostream into scope (which are needed +in order to implement the string inserter and extractor operators +(21.3.7.9 [lib.string.io])). Other implementations only include +<iosfwd>, since strictly speaking, only the declarations and not the +full definitions are necessary. +

+ +

+Obviously, it is possible to implement <string> without actually +providing the full definitions of all the templates std::basic_string +uses (std::allocator, std::basic_istream, and std::basic_ostream). +Furthermore, not only is it possible, doing so is likely to have a +positive effect on compile-time efficiency. +

+ +

+But while it may seem perfectly reasonable to expect a program that uses +the std::basic_string insertion and extraction operators to also +explicitly include <istream> or <ostream>, respectively, it doesn't seem +reasonable to also expect it to explicitly include <memory>. Since +what's reasonable and what isn't is highly subjective one would expect +the standard to specify what can and what cannot be assumed. +Unfortunately, that isn't the case. +

+ +

The examples below demonstrate the issue.

+ +

Example 1:

+ +

It is not clear whether the following program is complete:

+ +
#include <string>
+
+extern std::basic_ostream<char> &strm;
+
+int main () {
+    strm << std::string ("Hello, World!\n");
+}
+
+ +

or whether one must explicitly include <memory> or +<ostream> (or both) in addition to <string> in order for +the program to compile.

+ + +

Example 2:

+ +

Similarly, it is unclear whether the following program is complete:

+ +
#include <istream>
+
+extern std::basic_iostream<char> &strm;
+
+int main () {
+    strm << "Hello, World!\n";
+}
+
+ +

+or whether one needs to explicitly include <ostream>, and +perhaps even other headers containing the definitions of other +required templates:

+ +
#include <ios>
+#include <istream>
+#include <ostream>
+#include <streambuf>
+
+extern std::basic_iostream<char> &strm;
+
+int main () {
+    strm << "Hello, World!\n";
+}
+
+ +

Example 3:

+ +

Likewise, it seems unclear whether the program below is complete:

+
#include <iterator>
+
+bool foo (std::istream_iterator<int> a, std::istream_iterator<int> b)
+{
+    return a == b;
+}
+
+int main () { }
+
+ +

or whether one should be required to include <istream>.

+ +

There are many more examples that demonstrate this lack of a +requirement. I believe that in a good number of cases it would be +unreasonable to require that a program explicitly include all the +headers necessary for a particular template to be specialized, but I +think that there are cases such as some of those above where it would +be desirable to allow implementations to include only as much as +necessary and not more.

+ + +

Proposed resolution:

+

+For every C++ library header, supply a minimum set of other C++ library +headers that are required to be included by that header. The proposed +list is below (C++ headers for C Library Facilities, table 12 in +17.4.1.2, p3, are omitted): +

+ +
+------------+--------------------+
+| C++ header |required to include |
++============+====================+
+|<algorithm> |                    |
++------------+--------------------+
+|<bitset>    |                    |
++------------+--------------------+
+|<complex>   |                    |
++------------+--------------------+
+|<deque>     |<memory>            |
++------------+--------------------+
+|<exception> |                    |
++------------+--------------------+
+|<fstream>   |<ios>               |
++------------+--------------------+
+|<functional>|                    |
++------------+--------------------+
+|<iomanip>   |<ios>               |
++------------+--------------------+
+|<ios>       |<streambuf>         |
++------------+--------------------+
+|<iosfwd>    |                    |
++------------+--------------------+
+|<iostream>  |<istream>, <ostream>|
++------------+--------------------+
+|<istream>   |<ios>               |
++------------+--------------------+
+|<iterator>  |                    |
++------------+--------------------+
+|<limits>    |                    |
++------------+--------------------+
+|<list>      |<memory>            |
++------------+--------------------+
+|<locale>    |                    |
++------------+--------------------+
+|<map>       |<memory>            |
++------------+--------------------+
+|<memory>    |                    |
++------------+--------------------+
+|<new>       |<exception>         |
++------------+--------------------+
+|<numeric>   |                    |
++------------+--------------------+
+|<ostream>   |<ios>               |
++------------+--------------------+
+|<queue>     |<deque>             |
++------------+--------------------+
+|<set>       |<memory>            |
++------------+--------------------+
+|<sstream>   |<ios>, <string>     |
++------------+--------------------+
+|<stack>     |<deque>             |
++------------+--------------------+
+|<stdexcept> |                    |
++------------+--------------------+
+|<streambuf> |<ios>               |
++------------+--------------------+
+|<string>    |<memory>            |
++------------+--------------------+
+|<strstream> |                    |
++------------+--------------------+
+|<typeinfo>  |<exception>         |
++------------+--------------------+
+|<utility>   |                    |
++------------+--------------------+
+|<valarray>  |                    |
++------------+--------------------+
+|<vector>    |<memory>            |
++------------+--------------------+
+
+ + +

Rationale:

+

The portability problem is real. A program that works correctly on +one implementation might fail on another, because of different header +dependencies. This problem was understood before the standard was +completed, and it was a conscious design choice.

+

One possible way to deal with this, as a library extension, would +be an <all> header.

+ +

+Hinnant: It's time we dealt with this issue for C++0X. Reopened. +

+ + + + + + + +
+

382. codecvt do_in/out result

+

Section: 22.2.1.4 [locale.codecvt] Status: Open + Submitter: Martin Sebor Date: 2002-08-30

+

View all other issues in [locale.codecvt].

+

View all issues with Open status.

+

Discussion:

+

+It seems that the descriptions of codecvt do_in() and do_out() leave +sufficient room for interpretation so that two implementations of +codecvt may not work correctly with the same filebuf. Specifically, +the following seems less than adequately specified: +

+ +
    +
  1. + the conditions under which the functions terminate +
  2. +
  3. + precisely when the functions return ok +
  4. +
  5. + precisely when the functions return partial +
  6. +
  7. + the full set of conditions when the functions return error +
  8. +
+ +
    +
  1. + 22.2.1.4.2 [locale.codecvt.virtuals], p2 says this about the effects of the + function: ...Stops if it encounters a character it cannot + convert... This assumes that there *is* a character to + convert. What happens when there is a sequence that doesn't form a + valid source character, such as an unassigned or invalid UNICODE + character, or a sequence that cannot possibly form a character + (e.g., the sequence "\xc0\xff" in UTF-8)? +
  2. +
  3. + Table 53 says that the function returns codecvt_base::ok + to indicate that the function(s) "completed the conversion." + Suppose that the source sequence is "\xc0\x80" in UTF-8, + with from pointing to '\xc0' and (from_end==from + 1). + It is not clear whether the return value should be ok + or partial (see below). +
  4. +
  5. + Table 53 says that the function returns codecvt_base::partial + if "not all source characters converted." With the from pointers + set up the same way as above, it is not clear whether the return + value should be partial or ok (see above). +
  6. +
  7. + Table 53, in the row describing the meaning of error mistakenly + refers to a "from_type" character, without the symbol from_type + having been defined. Most likely, the word "source" character + is intended, although that is not sufficient. The functions + may also fail when they encounter an invalid source sequence + that cannot possibly form a valid source character (e.g., as + explained in bullet 1 above). +
  8. +
+

+Finally, the conditions described at the end of 22.2.1.4.2 [locale.codecvt.virtuals], p4 don't seem to be possible: +

+

+ "A return value of partial, if (from_next == from_end), + indicates that either the destination sequence has not + absorbed all the available destination elements, or that + additional source elements are needed before another + destination element can be produced." +

+

+If the value is partial, it's not clear to me that (from_next +==from_end) could ever hold if there isn't enough room +in the destination buffer. In order for (from_next==from_end) to +hold, all characters in that range must have been successfully +converted (according to 22.2.1.4.2 [locale.codecvt.virtuals], p2) and since there are no +further source characters to convert, no more room in the +destination buffer can be needed. +

+

+It's also not clear to me that (from_next==from_end) could ever +hold if additional source elements are needed to produce another +destination character (not element as incorrectly stated in the +text). partial is returned if "not all source characters have +been converted" according to Table 53, which also implies that +(from_next==from) does NOT hold. +

+

+Could it be that the intended qualifying condition was actually +(from_next != from_end), i.e., that the sentence was supposed +to read +

+

+ "A return value of partial, if (from_next != from_end),..." +

+

+which would make perfect sense, since, as far as I understand it, +partial can only occur if (from_next != from_end)? +

+

[Lillehammer: Defer for the moment, but this really needs to be + fixed. Right now, the description of codecvt is too vague for it to + be a useful contract between providers and clients of codecvt + facets. (Note that both vendors and users can be both providers and + clients of codecvt facets.) The major philosophical issue is whether + the standard should only describe mappings that take a single wide + character to multiple narrow characters (and vice versa), or whether + it should describe fully general N-to-M conversions. When the + original standard was written only the former was contemplated, but + today, in light of the popularity of utf8 and utf16, that doesn't + seem sufficient for C++0x. Bill supports general N-to-M conversions; + we need to make sure Martin and Howard agree.]

+ + + +

Proposed resolution:

+ + + + +
+

387. std::complex over-encapsulated

+

Section: 26.3 [complex.numbers] Status: Open + Submitter: Gabriel Dos Reis Date: 2002-11-08

+

View all other issues in [complex.numbers].

+

View all issues with Open status.

+

Discussion:

+

+The absence of explicit description of std::complex<T> layout +makes it imposible to reuse existing software developed in traditional +languages like Fortran or C with unambigous and commonly accepted +layout assumptions. There ought to be a way for practitioners to +predict with confidence the layout of std::complex<T> whenever T +is a numerical datatype. The absence of ways to access individual +parts of a std::complex<T> object as lvalues unduly promotes +severe pessimizations. For example, the only way to change, +independently, the real and imaginary parts is to write something like +

+ +
complex<T> z;
+// ...
+// set the real part to r
+z = complex<T>(r, z.imag());
+// ...
+// set the imaginary part to i
+z = complex<T>(z.real(), i);
+
+ +

+At this point, it seems appropriate to recall that a complex number +is, in effect, just a pair of numbers with no particular invariant to +maintain. Existing practice in numerical computations has it that a +complex number datatype is usually represented by Cartesian +coordinates. Therefore the over-encapsulation put in the specification +of std::complex<> is not justified. +

+ + + +

Proposed resolution:

+

Add the following requirements to 26.3 [complex.numbers] as 26.3/4:

+
+

If z is an lvalue expression of type cv std::complex<T> then

+ +
    +
  • the expression reinterpret_cast<cv T(&)[2]>(z) +is well-formed; and
  • +
  • reinterpret_cast<cvT(&)[2]>(z)[0]designates the +real part of z; and
  • +
  • reinterpret_cast<cvT(&)[2]>(z)[1]designates the +imaginary part of z.
  • +
+ +

+Moreover, if a is an expression of pointer type cv complex<T>* +and the expression a[i] is well-defined for an integer expression +i then: +

+ +
    +
  • reinterpret_cast<cvT*>(a)[2+i] designates the real +part of a[i]; and
  • +
  • reinterpret_cast<cv T*>(a)[2+i+1] designates the +imaginary part of a[i].
  • +
+
+ +

In the header synopsis in 26.3.1 [complex.synopsis], replace

+
  template<class T> T real(const complex<T>&);
+  template<class T> T imag(const complex<T>&);
+
+ +

with

+ +
  template<class T> const T& real(const complex<T>&);
+  template<class T>       T& real(      complex<T>&);
+  template<class T> const T& imag(const complex<T>&);
+  template<class T>       T& imag(      complex<T>&);
+
+ +

In 26.3.7 [complex.value.ops] paragraph 1, change

+
  template<class T> T real(const complex<T>&);
+
+

to

+
  template<class T> const T& real(const complex<T>&);
+  template<class T>       T& real(      complex<T>&);
+
+

and change the Returns clause to "Returns: The real +part of x.

+ +

In 26.3.7 [complex.value.ops] paragraph 2, change

+
  template<class T> T imag(const complex<T>&);
+
+

to

+
  template<class T> const T& imag(const complex<T>&);
+  template<class T>       T& imag(      complex<T>&);
+
+

and change the Returns clause to "Returns: The imaginary +part of x.

+ +

[Kona: The layout guarantee is absolutely necessary for C + compatibility. However, there was disagreement about the other part + of this proposal: retrieving elements of the complex number as + lvalues. An alternative: continue to have real() and imag() return + rvalues, but add set_real() and set_imag(). Straw poll: return + lvalues - 2, add setter functions - 5. Related issue: do we want + reinterpret_cast as the interface for converting a complex to an + array of two reals, or do we want to provide a more explicit way of + doing it? Howard will try to resolve this issue for the next + meeting.]

+ + +

[pre-Sydney: Howard summarized the options in n1589.]

+ + + + +

Rationale:

+

The LWG believes that C99 compatibility would be enough +justification for this change even without other considerations. All +existing implementations already have the layout proposed here.

+ + + + + +
+

394. behavior of formatted output on failure

+

Section: 27.6.2.6.1 [ostream.formatted.reqmts] Status: Open + Submitter: Martin Sebor Date: 2002-12-27

+

View all issues with Open status.

+

Discussion:

+

+There is a contradiction in Formatted output about what bit is +supposed to be set if the formatting fails. On sentence says it's +badbit and another that it's failbit. +

+

+27.6.2.5.1, p1 says in the Common Requirements on Formatted output +functions: +

+
     ... If the generation fails, then the formatted output function
+     does setstate(ios::failbit), which might throw an exception.
+
+

+27.6.2.5.2, p1 goes on to say this about Arithmetic Inserters: +

+

+ ... The formatting conversion occurs as if it performed the + following code fragment: +

+
     bool failed =
+         use_facet<num_put<charT,ostreambuf_iterator<charT,traits>
+         > >
+         (getloc()).put(*this, *this, fill(), val). failed();
+
+     ... If failed is true then does setstate(badbit) ...
+
+

+The original intent of the text, according to Jerry Schwarz (see +c++std-lib-10500), is captured in the following paragraph: +

+

+In general "badbit" should mean that the stream is unusable because +of some underlying failure, such as disk full or socket closure; +"failbit" should mean that the requested formatting wasn't possible +because of some inconsistency such as negative widths. So typically +if you clear badbit and try to output something else you'll fail +again, but if you clear failbit and try to output something else +you'll succeed. +

+

+In the case of the arithmetic inserters, since num_put cannot +report failure by any means other than exceptions (in response +to which the stream must set badbit, which prevents the kind of +recoverable error reporting mentioned above), the only other +detectable failure is if the iterator returned from num_put +returns true from failed(). +

+

+Since that can only happen (at least with the required iostream +specializations) under such conditions as the underlying failure +referred to above (e.g., disk full), setting badbit would seem +to be the appropriate response (indeed, it is required in +27.6.2.5.2, p1). It follows that failbit can never be directly +set by the arithmetic (it can only be set by the sentry object +under some unspecified conditions). +

+

+The situation is different for other formatted output functions +which can fail as a result of the streambuf functions failing +(they may do so by means other than exceptions), and which are +then required to set failbit. +

+

+The contradiction, then, is that ostream::operator<<(int) will +set badbit if the disk is full, while operator<<(ostream&, +char) will set failbit under the same conditions. To make the behavior +consistent, the Common requirements sections for the Formatted output +functions should be changed as proposed below. +

+

[Kona: There's agreement that this is a real issue. What we + decided at Kona: 1. An error from the buffer (which can be detected + either directly from streambuf's member functions or by examining a + streambuf_iterator) should always result in badbit getting set. + 2. There should never be a circumstance where failbit gets set. + That represents a formatting error, and there are no circumstances + under which the output facets are specified as signaling a + formatting error. (Even more so for string output that for numeric + because there's nothing to format.) If we ever decide to make it + possible for formatting errors to exist then the facets can signal + the error directly, and that should go in clause 22, not clause 27. + 3. The phrase "if generation fails" is unclear and should be + eliminated. It's not clear whether it's intended to mean a buffer + error (e.g. a full disk), a formatting error, or something else. + Most people thought it was supposed to refer to buffer errors; if + so, we should say so. Martin will provide wording.]

+ + + + +

Proposed resolution:

+ + +

Rationale:

+ + + + + + +
+

396. what are characters zero and one

+

Section: 23.3.5.1 [bitset.cons] Status: Open + Submitter: Martin Sebor Date: 2003-01-05

+

View all other issues in [bitset.cons].

+

View all issues with Open status.

+

Discussion:

+

+23.3.5.1, p6 [lib.bitset.cons] talks about a generic character +having the value of 0 or 1 but there is no definition of what +that means for charT other than char and wchar_t. And even for +those two types, the values 0 and 1 are not actually what is +intended -- the values '0' and '1' are. This, along with the +converse problem in the description of to_string() in 23.3.5.2, +p33, looks like a defect remotely related to DR 303. +

+

+http://anubis.dkuug.dk/jtc1/sc22/wg21/docs/lwg-defects.html#303 +

+
23.3.5.1:
+  -6-  An element of the constructed string has value zero if the
+       corresponding character in str, beginning at position pos,
+       is 0. Otherwise, the element has the value one.
+    
+
23.3.5.2:
+  -33-  Effects: Constructs a string object of the appropriate
+        type and initializes it to a string of length N characters.
+        Each character is determined by the value of its
+        corresponding bit position in *this. Character position N
+        ?- 1 corresponds to bit position zero. Subsequent decreasing
+        character positions correspond to increasing bit positions.
+        Bit value zero becomes the character 0, bit value one becomes
+        the character 1.
+    
+

+Also note the typo in 23.3.5.1, p6: the object under construction +is a bitset, not a string. +

+ + +

Proposed resolution:

+

Change the constructor's function declaration immediately before +23.3.5.1 [bitset.cons] p3 to:

+
    template <class charT, class traits, class Allocator>
+    explicit
+    bitset(const basic_string<charT, traits, Allocator>& str,
+           typename basic_string<charT, traits, Allocator>::size_type pos = 0,
+           typename basic_string<charT, traits, Allocator>::size_type n =
+             basic_string<charT, traits, Allocator>::npos,
+           charT zero = charT('0'), charT one = charT('1'))
+
+

Change the first two sentences of 23.3.5.1 [bitset.cons] p6 to: "An +element of the constructed string has value 0 if the corresponding +character in str, beginning at position pos, +is zero. Otherwise, the element has the value 1.

+ +

Change the text of the second sentence in 23.3.5.1, p5 to read: + "The function then throws invalid_argument if any of the rlen + characters in str beginning at position pos is other than zero + or one. The function uses traits::eq() to compare the character + values." +

+ +

Change the declaration of the to_string member function + immediately before 23.3.5.2 [bitset.members] p33 to:

+
    template <class charT, class traits, class Allocator>
+    basic_string<charT, traits, Allocator> 
+    to_string(charT zero = charT('0'), charT one = charT('1')) const;
+
+

Change the last sentence of 23.3.5.2 [bitset.members] p33 to: "Bit + value 0 becomes the character zero, bit value 1 becomes the + character one.

+

Change 23.3.5.3 [bitset.operators] p8 to:

+

Returns:

+
  os << x.template to_string<charT,traits,allocator<charT> >(
+      use_facet<ctype<charT> >(os.getloc()).widen('0'),
+      use_facet<ctype<charT> >(os.getloc()).widen('1'));
+
+ + +

Rationale:

+

There is a real problem here: we need the character values of '0' + and '1', and we have no way to get them since strings don't have + imbued locales. In principle the "right" solution would be to + provide an extra object, either a ctype facet or a full locale, + which would be used to widen '0' and '1'. However, there was some + discomfort about using such a heavyweight mechanism. The proposed + resolution allows those users who care about this issue to get it + right.

+

We fix the inserter to use the new arguments. Note that we already + fixed the analogous problem with the extractor in issue 303.

+ + + + + + +
+

397. ostream::sentry dtor throws exceptions

+

Section: 27.6.2.4 [ostream::sentry] Status: Open + Submitter: Martin Sebor Date: 2003-01-05

+

View other active issues in [ostream::sentry].

+

View all other issues in [ostream::sentry].

+

View all issues with Open status.

+

Discussion:

+

+17.4.4.8, p3 prohibits library dtors from throwing exceptions. +

+

+27.6.2.3, p4 says this about the ostream::sentry dtor: +

+
    -4- If ((os.flags() & ios_base::unitbuf) && !uncaught_exception())
+        is true, calls os.flush().
+    
+

+27.6.2.6, p7 that describes ostream::flush() says: +

+
    -7- If rdbuf() is not a null pointer, calls rdbuf()->pubsync().
+        If that function returns ?-1 calls setstate(badbit) (which
+        may throw ios_base::failure (27.4.4.3)).
+    
+

+That seems like a defect, since both pubsync() and setstate() can +throw an exception. +

+

[ +The contradiction is real. Clause 17 says destructors may never +throw exceptions, and clause 27 specifies a destructor that does +throw. In principle we might change either one. We're leaning +toward changing clause 17: putting in an "unless otherwise specified" +clause, and then putting in a footnote saying the sentry destructor +is the only one that can throw. PJP suggests specifying that +sentry::~sentry() should internally catch any exceptions it might cause. +]

+ + +

[ +See 418 and 622 for related issues. +]

+ + + + +

Proposed resolution:

+ + + + + +
+

398. effects of end-of-file on unformatted input functions

+

Section: 27.6.2.4 [ostream::sentry] Status: Open + Submitter: Martin Sebor Date: 2003-01-05

+

View other active issues in [ostream::sentry].

+

View all other issues in [ostream::sentry].

+

View all issues with Open status.

+

Discussion:

+

+While reviewing unformatted input member functions of istream +for their behavior when they encounter end-of-file during input +I found that the requirements vary, sometimes unexpectedly, and +in more than one case even contradict established practice (GNU +libstdc++ 3.2, IBM VAC++ 6.0, STLPort 4.5, SunPro 5.3, HP aCC +5.38, Rogue Wave libstd 3.1, and Classic Iostreams). +

+

+The following unformatted input member functions set eofbit if they +encounter an end-of-file (this is the expected behavior, and also +the behavior of all major implementations): +

+
    basic_istream<charT, traits>&
+    get (char_type*, streamsize, char_type);
+    
+

+ Also sets failbit if it fails to extract any characters. +

+
    basic_istream<charT, traits>&
+    get (char_type*, streamsize);
+    
+

+ Also sets failbit if it fails to extract any characters. +

+
    basic_istream<charT, traits>&
+    getline (char_type*, streamsize, char_type);
+    
+

+ Also sets failbit if it fails to extract any characters. +

+
    basic_istream<charT, traits>&
+    getline (char_type*, streamsize);
+    
+

+ Also sets failbit if it fails to extract any characters. +

+
    basic_istream<charT, traits>&
+    ignore (int, int_type);
+    
+
    basic_istream<charT, traits>&
+    read (char_type*, streamsize);
+    
+

+ Also sets failbit if it encounters end-of-file. +

+
    streamsize readsome (char_type*, streamsize);
+    
+ +

+The following unformated input member functions set failbit but +not eofbit if they encounter an end-of-file (I find this odd +since the functions make it impossible to distinguish a general +failure from a failure due to end-of-file; the requirement is +also in conflict with all major implementation which set both +eofbit and failbit): +

+
    int_type get();
+    
+
    basic_istream<charT, traits>&
+    get (char_type&);
+    
+

+These functions only set failbit of they extract no characters, +otherwise they don't set any bits, even on failure (I find this +inconsistency quite unexpected; the requirement is also in +conflict with all major implementations which set eofbit +whenever they encounter end-of-file): +

+
    basic_istream<charT, traits>&
+    get (basic_streambuf<charT, traits>&, char_type);
+    
+
    basic_istream<charT, traits>&
+    get (basic_streambuf<charT, traits>&);
+    
+

+This function sets no bits (all implementations except for +STLport and Classic Iostreams set eofbit when they encounter +end-of-file): +

+
    int_type peek ();
+    
+

Informally, what we want is a global statement of intent saying + that eofbit gets set if we trip across EOF, and then we can take + away the specific wording for individual functions. A full review + is necessary. The wording currently in the standard is a mishmash, + and changing it on an individual basis wouldn't make things better. + Dietmar will do this work.

+ + +

Proposed resolution:

+ + + + +
+

408. Is vector<reverse_iterator<char*> > forbidden?

+

Section: 24.1 [iterator.requirements] Status: Open + Submitter: Nathan Myers Date: 2003-06-03

+

View other active issues in [iterator.requirements].

+

View all other issues in [iterator.requirements].

+

View all issues with Open status.

+

Discussion:

+

+I've been discussing iterator semantics with Dave Abrahams, and a +surprise has popped up. I don't think this has been discussed before. +

+ +

+24.1 [iterator.requirements] says that the only operation that can be performed on "singular" +iterator values is to assign a non-singular value to them. (It +doesn't say they can be destroyed, and that's probably a defect.) +Some implementations have taken this to imply that there is no need +to initialize the data member of a reverse_iterator<> in the default +constructor. As a result, code like +

+
  std::vector<std::reverse_iterator<char*> > v(7);
+  v.reserve(1000);
+
+

+invokes undefined behavior, because it must default-initialize the +vector elements, and then copy them to other storage. Of course many +other vector operations on these adapters are also left undefined, +and which those are is not reliably deducible from the standard. +

+ +

+I don't think that 24.1 was meant to make standard-library iterator +types unsafe. Rather, it was meant to restrict what operations may +be performed by functions which take general user- and standard +iterators as arguments, so that raw pointers would qualify as +iterators. However, this is not clear in the text, others have come +to the opposite conclusion. +

+ +

+One question is whether the standard iterator adaptors have defined +copy semantics. Another is whether they have defined destructor +semantics: is +

+
  { std::vector<std::reverse_iterator<char*> >  v(7); }
+
+

+undefined too? +

+ +

+Note this is not a question of whether algorithms are allowed to +rely on copy semantics for arbitrary iterators, just whether the +types we actually supply support those operations. I believe the +resolution must be expressed in terms of the semantics of the +adapter's argument type. It should make clear that, e.g., the +reverse_iterator<T> constructor is actually required to execute +T(), and so copying is defined if the result of T() is copyable. +

+ +

+Issue 235, which defines reverse_iterator's default +constructor more precisely, has some relevance to this issue. +However, it is not the whole story. +

+ +

+The issue was whether +

+
  reverse_iterator() { }
+
+

+is allowed, vs. +

+
  reverse_iterator() : current() { }
+
+ +

+The difference is when T is char*, where the first leaves the member +uninitialized, and possibly equal to an existing pointer value, or +(on some targets) may result in a hardware trap when copied. +

+ +

+8.5 paragraph 5 seems to make clear that the second is required to +satisfy DR 235, at least for non-class Iterator argument +types. +

+ +

+But that only takes care of reverse_iterator, and doesn't establish +a policy for all iterators. (The reverse iterator adapter was just +an example.) In particular, does my function +

+
  template <typename Iterator>
+    void f() { std::vector<Iterator>  v(7); } 
+
+

+evoke undefined behavior for some conforming iterator definitions? +I think it does, now, because vector<> will destroy those singular +iterator values, and that's explicitly disallowed. +

+ +

+24.1 shouldn't give blanket permission to copy all singular iterators, +because then pointers wouldn't qualify as iterators. However, it +should allow copying of that subset of singular iterator values that +are default-initialized, and it should explicitly allow destroying any +iterator value, singular or not, default-initialized or not. +

+ +

Related issue: 407

+

[ +We don't want to require all singular iterators to be copyable, +because that is not the case for pointers. However, default +construction may be a special case. Issue: is it really default +construction we want to talk about, or is it something like value +initialization? We need to check with core to see whether default +constructed pointers are required to be copyable; if not, it would be +wrong to impose so strict a requirement for iterators. +]

+ + + + +

Proposed resolution:

+ + + + + +
+

417. what does ctype::do_widen() return on failure

+

Section: 22.2.1.1.2 [locale.ctype.virtuals] Status: Open + Submitter: Martin Sebor Date: 2003-09-18

+

View all other issues in [locale.ctype.virtuals].

+

View all issues with Open status.

+

Discussion:

+

+The Effects and Returns clauses of the do_widen() member function of +the ctype facet fail to specify the behavior of the function on failure. +That the function may not be able to simply cast the narrow character +argument to the type of the result since doing so may yield the wrong value +for some wchar_t encodings. Popular implementations of ctype<wchar_t> that +use mbtowc() and UTF-8 as the native encoding (e.g., GNU glibc) will fail +when the argument's MSB is set. There is no way for the the rest of locale +and iostream to reliably detect this failure. +

+

[Kona: This is a real problem. Widening can fail. It's unclear + what the solution should be. Returning WEOF works for the wchar_t + specialization, but not in general. One option might be to add a + default, like narrow. But that's an incompatible change. + Using traits::eof might seem like a good idea, but facets + don't have access to traits (a recurring problem). We could + have widen throw an exception, but that's a scary option; + existing library components aren't written with the assumption + that widen can throw.]

+ + + +

Proposed resolution:

+ + + + +
+

418. exceptions thrown during iostream cleanup

+

Section: 27.4.2.1.6 [ios::Init] Status: Open + Submitter: Martin Sebor Date: 2003-09-18

+

View all issues with Open status.

+

Discussion:

+

+The dtor of the ios_base::Init object is supposed to call flush() on the +6 standard iostream objects cout, cerr, clog, wcout, wcerr, and wclog. +This call may cause an exception to be thrown. +

+ +

+17.4.4.8, p3 prohibits all library destructors from throwing exceptions. +

+ +

+The question is: What should this dtor do if one or more of these calls +to flush() ends up throwing an exception? This can happen quite easily +if one of the facets installed in the locale imbued in the iostream +object throws. +

+

[Kona: We probably can't do much better than what we've got, so + the LWG is leaning toward NAD. At the point where the standard + stream objects are being cleaned up, the usual error reporting + mechanism are all unavailable. And exception from flush at this + point will definitely cause problems. A quality implementation + might reasonably swallow the exception, or call abort, or do + something even more drastic.]

+ + +

[ +See 397 and 622 for related issues. +]

+ + + + +

Proposed resolution:

+ + + + +
+

419. istream extractors not setting failbit if eofbit is already set

+

Section: 27.6.1.1.3 [istream::sentry] Status: Open + Submitter: Martin Sebor Date: 2003-09-18

+

View all other issues in [istream::sentry].

+

View all issues with Open status.

+

Discussion:

+

+ +27.6.1.1.3 [istream::sentry], p2 says that istream::sentry ctor prepares for input if is.good() +is true. p4 then goes on to say that the ctor sets the sentry::ok_ member to +true if the stream state is good after any preparation. 27.6.1.2.1 [istream.formatted.reqmts], p1 then +says that a formatted input function endeavors to obtain the requested input +if the sentry's operator bool() returns true. + +Given these requirements, no formatted extractor should ever set failbit if +the initial stream rdstate() == eofbit. That is contrary to the behavior of +all implementations I tested. The program below prints out + +eof = 1, fail = 0 +eof = 1, fail = 1 + +on all of them. +

+
+#include <sstream>
+#include <cstdio>
+
+int main()
+{
+    std::istringstream strm ("1");
+
+    int i = 0;
+
+    strm >> i;
+
+    std::printf ("eof = %d, fail = %d\n",
+                 !!strm.eof (), !!strm.fail ());
+
+    strm >> i;
+
+    std::printf ("eof = %d, fail = %d\n",
+                 !!strm.eof (), !!strm.fail ());
+}
+
+
+

+
+ +Comments from Jerry Schwarz (c++std-lib-11373): +
+ +Jerry Schwarz wrote: +
+ +I don't know where (if anywhere) it says it in the standard, but the +formatted extractors are supposed to set failbit if they don't extract +any characters. If they didn't then simple loops like +
+ +while (cin >> x); +
+ +would loop forever. +
+ +Further comments from Martin Sebor: +
+ +The question is which part of the extraction should prevent this from happening +by setting failbit when eofbit is already set. It could either be the sentry +object or the extractor. It seems that most implementations have chosen to +set failbit in the sentry [...] so that's the text that will need to be +corrected. + +

+

+Pre Berlin: This issue is related to 342. If the sentry +sets failbit when it finds eofbit already set, then +you can never seek away from the end of stream. +

+

Kona: Possibly NAD. If eofbit is set then good() will return false. We + then set ok to false. We believe that the sentry's + constructor should always set failbit when ok is false, and + we also think the standard already says that. Possibly it could be + clearer.

+ + + +

Proposed resolution:

+

+Change 27.6.1.1.3 [istream::sentry], p2 to: +

+ +
+
explicit sentry(basic_istream<charT,traits>& is , bool noskipws = false);
+

+-2- Effects: If is.good() is true +false, calls is.setstate(failbit). +Otherwise prepares for formatted or unformatted input. ... +

+
+ + + + + + +
+

421. is basic_streambuf copy-constructible?

+

Section: 27.5.2.1 [streambuf.cons] Status: Open + Submitter: Martin Sebor Date: 2003-09-18

+

View all other issues in [streambuf.cons].

+

View all issues with Open status.

+

Discussion:

+

+The reflector thread starting with c++std-lib-11346 notes that the class +template basic_streambuf, along with basic_stringbuf and basic_filebuf, +is copy-constructible but that the semantics of the copy constructors +are not defined anywhere. Further, different implementations behave +differently in this respect: some prevent copy construction of objects +of these types by declaring their copy ctors and assignment operators +private, others exhibit undefined behavior, while others still give +these operations well-defined semantics. +

+ +

+Note that this problem doesn't seem to be isolated to just the three +types mentioned above. A number of other types in the library section +of the standard provide a compiler-generated copy ctor and assignment +operator yet fail to specify their semantics. It's believed that the +only types for which this is actually a problem (i.e. types where the +compiler-generated default may be inappropriate and may not have been +intended) are locale facets. See issue 439. +

+ + +

Proposed resolution:

+

+27.5.2 [lib.streambuf]: Add into the synopsis, public section, just above the destructor declaration: +

+ +
+
basic_streambuf(const basic_streambuf& sb);
+basic_streambuf& operator=(const basic_streambuf& sb);
+
+
+ +

Insert after 27.5.2.1, paragraph 2:

+
+
basic_streambuf(const basic_streambuf& sb);
+
+ +

Constructs a copy of sb.

+

Postcondtions:

+
                eback() == sb.eback()
+                gptr()  == sb.gptr()
+                egptr() == sb.egptr()
+                pbase() == sb.pbase()
+                pptr()  == sb.pptr()
+                epptr() == sb.epptr()
+                getloc() == sb.getloc()
+
+ +
basic_streambuf& operator=(const basic_streambuf& sb);
+
+ +

Assigns the data members of sb to this.

+ +

Postcondtions:

+
                eback() == sb.eback()
+                gptr()  == sb.gptr()
+                egptr() == sb.egptr()
+                pbase() == sb.pbase()
+                pptr()  == sb.pptr()
+                epptr() == sb.epptr()
+                getloc() == sb.getloc()
+
+ +

Returns: *this.

+
+ +

27.7.1 [lib.stringbuf]:

+ +

Option A:

+ +
+

Insert into the basic_stringbuf synopsis in the private section:

+ +
basic_stringbuf(const basic_stringbuf&);             // not defined
+basic_stringbuf& operator=(const basic_stringbuf&);  // not defined
+
+
+ +

Option B:

+ +
+

Insert into the basic_stringbuf synopsis in the public section:

+ +
basic_stringbuf(const basic_stringbuf& sb);
+basic_stringbuf& operator=(const basic_stringbuf& sb);
+
+ +

27.7.1.1, insert after paragraph 4:

+ +
basic_stringbuf(const basic_stringbuf& sb);
+ +

+Constructs an independent copy of sb as if with sb.str(), and with the openmode that sb was constructed with. +

+ +

Postcondtions:

+
               str() == sb.str()
+               gptr()  - eback() == sb.gptr()  - sb.eback()
+               egptr() - eback() == sb.egptr() - sb.eback()
+               pptr()  - pbase() == sb.pptr()  - sb.pbase()
+               getloc() == sb.getloc()
+
+ +

+Note: The only requirement on epptr() is that it point beyond the +initialized range if an output sequence exists. There is no requirement +that epptr() - pbase() == sb.epptr() - sb.pbase(). +

+ +
basic_stringbuf& operator=(const basic_stringbuf& sb);
+

After assignment the basic_stringbuf has the same state as if it +were initially copy constructed from sb, except that the +basic_stringbuf is allowed to retain any excess capacity it might have, +which may in turn effect the value of epptr(). +

+
+ +

27.8.1.1 [lib.filebuf]

+ +

Insert at the bottom of the basic_filebuf synopsis:

+ +
+
private:
+  basic_filebuf(const basic_filebuf&);             // not defined
+  basic_filebuf& operator=(const basic_filebuf&);  // not defined
+
+
+

[Kona: this is an issue for basic_streambuf itself and for its + derived classes. We are leaning toward allowing basic_streambuf to + be copyable, and specifying its precise semantics. (Probably the + obvious: copying the buffer pointers.) We are less sure whether + the streambuf derived classes should be copyable. Howard will + write up a proposal.]

+ + +

[Sydney: Dietmar presented a new argument against basic_streambuf + being copyable: it can lead to an encapsulation violation. Filebuf + inherits from streambuf. Now suppose you inhert a my_hijacking_buf + from streambuf. You can copy the streambuf portion of a filebuf to a + my_hijacking_buf, giving you access to the pointers into the + filebuf's internal buffer. Perhaps not a very strong argument, but + it was strong enough to make people nervous. There was weak + preference for having streambuf not be copyable. There was weak + preference for having stringbuf not be copyable even if streambuf + is. Move this issue to open for now. +]

+ + +

[ +2007-01-12, Howard: +Rvalue Reference Recommendations for Chapter 27 +recommends protected copy constructor and assignment for basic_streambuf with the same semantics +as would be generated by the compiler. These members aid in derived classes implementing move semantics. +A protected copy constructor and copy assignment operator do not expose encapsulation more so than it is +today as each data member of a basic_streambuf is already both readable and writable by derived +classes via various get/set protected member functions (eback(), setp(), etc.). Rather +a protected copy constructor and copy assignment operator simply make the job of derived classes implementing +move semantics less tedious and error prone. +]

+ + + + +

Rationale:

+

+27.5.2 [lib.streambuf]: The proposed basic_streambuf copy constructor +and assignment operator are the same as currently implied by the lack +of declarations: public and simply copies the data members. This +resolution is not a change but a clarification of the current +standard. +

+ +

+27.7.1 [lib.stringbuf]: There are two reasonable options: A) Make +basic_stringbuf not copyable. This is likely the status-quo of +current implementations. B) Reasonable copy semantics of +basic_stringbuf can be defined and implemented. A copyable +basic_streambuf is arguably more useful than a non-copyable one. This +should be considered as new functionality and not the fixing of a +defect. If option B is chosen, ramifications from issue 432 are taken +into account. +

+ +

+27.8.1.1 [lib.filebuf]: There are no reasonable copy semantics for +basic_filebuf. +

+ + + + + + +
+

423. effects of negative streamsize in iostreams

+

Section: 27 [input.output] Status: Open + Submitter: Martin Sebor Date: 2003-09-18

+

View all other issues in [input.output].

+

View all issues with Open status.

+

Discussion:

+ +

+A third party test suite tries to exercise istream::ignore(N) with +a negative value of N and expects that the implementation will treat +N as if it were 0. Our implementation asserts that (N >= 0) holds and +aborts the test. +

+ +

+I can't find anything in section 27 that prohibits such values but I don't +see what the effects of such calls should be, either (this applies to +a number of unformatted input functions as well as some member functions +of the basic_streambuf template). +

+ + +

Proposed resolution:

+

+I propose that we add to each function in clause 27 that takes an argument, +say N, of type streamsize a Requires clause saying that "N >= 0." The intent +is to allow negative streamsize values in calls to precision() and width() +but disallow it in calls to streambuf::sgetn(), istream::ignore(), or +ostream::write(). +

+ +

[Kona: The LWG agreed that this is probably what we want. However, we + need a review to find all places where functions in clause 27 take + arguments of type streamsize that shouldn't be allowed to go + negative. Martin will do that review.]

+ + + + + + +
+

424. normative notes

+

Section: 17.3.1.1 [structure.summary] Status: Open + Submitter: Martin Sebor Date: 2003-09-18

+

View all issues with Open status.

+

Discussion:

+ +

+The text in 17.3.1.1, p1 says: +
+ +"Paragraphs labelled "Note(s):" or "Example(s):" are informative, other +paragraphs are normative." +
+ +The library section makes heavy use of paragraphs labeled "Notes(s)," +some of which are clearly intended to be normative (see list 1), while +some others are not (see list 2). There are also those where the intent +is not so clear (see list 3). +

+ +List 1 -- Examples of (presumably) normative Notes: +
+ +20.6.1.1 [allocator.members], p3,
+20.6.1.1 [allocator.members], p10,
+21.3.2 [string.cons], p11,
+22.1.1.2 [locale.cons], p11,
+23.2.2.3 [deque.modifiers], p2,
+25.3.7 [alg.min.max], p3,
+26.3.6 [complex.ops], p15,
+27.5.2.4.3 [streambuf.virt.get], p7.
+
+ +List 2 -- Examples of (presumably) informative Notes: +
+ +18.5.1.3 [new.delete.placement], p3,
+21.3.6.6 [string::replace], p14,
+22.2.1.4.2 [locale.codecvt.virtuals], p3,
+25.1.1 [alg.foreach], p4,
+26.3.5 [complex.member.ops], p1,
+27.4.2.5 [ios.base.storage], p6.
+
+ +List 3 -- Examples of Notes that are not clearly either normative +or informative: +
+ +22.1.1.2 [locale.cons], p8,
+22.1.1.5 [locale.statics], p6,
+27.5.2.4.5 [streambuf.virt.put], p4.
+
+ +None of these lists is meant to be exhaustive. +

+ +

[Definitely a real problem. The big problem is there's material + that doesn't quite fit any of the named paragraph categories + (e.g. Effects). Either we need a new kind of named + paragraph, or we need to put more material in unnamed paragraphs + jsut after the signature. We need to talk to the Project Editor + about how to do this. +]

+ + + +

Proposed resolution:

+

[Pete: I changed the paragraphs marked "Note" and "Notes" to use "Remark" and "Remarks". +Fixed as editorial. This change has been in the WD since the post-Redmond mailing, in 2004. +Recommend NAD.]

+ +

[ +Batavia: We feel that the references in List 2 above should be changed from Remarks +to Notes. We also feel that those items in List 3 need to be double checked for +the same change. Alan and Pete to review. +]

+ + + + + +
+

427. stage 2 and rationale of DR 221

+

Section: 22.2.2.1.2 [facet.num.get.virtuals] Status: Open + Submitter: Martin Sebor Date: 2003-09-18

+

View other active issues in [facet.num.get.virtuals].

+

View all other issues in [facet.num.get.virtuals].

+

View all issues with Open status.

+

Discussion:

+

+The requirements specified in Stage 2 and reiterated in the rationale +of DR 221 (and echoed again in DR 303) specify that num_get<charT>:: +do_get() compares characters on the stream against the widened elements +of "012...abc...ABCX+-" +

+ +

+An implementation is required to allow programs to instantiate the num_get +template on any charT that satisfies the requirements on a user-defined +character type. These requirements do not include the ability of the +character type to be equality comparable (the char_traits template must +be used to perform tests for equality). Hence, the num_get template cannot +be implemented to support any arbitrary character type. The num_get template +must either make the assumption that the character type is equality-comparable +(as some popular implementations do), or it may use char_traits<charT> to do +the comparisons (some other popular implementations do that). This diversity +of approaches makes it difficult to write portable programs that attempt to +instantiate the num_get template on user-defined types. +

+ +

[Kona: the heart of the problem is that we're theoretically + supposed to use traits classes for all fundamental character + operations like assignment and comparison, but facets don't have + traits parameters. This is a fundamental design flaw and it + appears all over the place, not just in this one place. It's not + clear what the correct solution is, but a thorough review of facets + and traits is in order. The LWG considered and rejected the + possibility of changing numeric facets to use narrowing instead of + widening. This may be a good idea for other reasons (see issue + 459), but it doesn't solve the problem raised by this + issue. Whether we use widen or narrow the num_get facet + still has no idea which traits class the user wants to use for + the comparison, because only streams, not facets, are passed traits + classes. The standard does not require that two different + traits classes with the same char_type must necessarily + have the same behavior.]

+ + +

Informally, one possibility: require that some of the basic +character operations, such as eq, lt, +and assign, must behave the same way for all traits classes +with the same char_type. If we accept that limitation on +traits classes, then the facet could reasonably be required to +use char_traits<charT>.

+ + +

Proposed resolution:

+ + + + +
+

430. valarray subset operations

+

Section: 26.5.2.4 [valarray.sub] Status: Open + Submitter: Martin Sebor Date: 2003-09-18

+

View all issues with Open status.

+

Discussion:

+

+The standard fails to specify the behavior of valarray::operator[](slice) +and other valarray subset operations when they are passed an "invalid" +slice object, i.e., either a slice that doesn't make sense at all (e.g., +slice (0, 1, 0) or one that doesn't specify a valid subset of the valarray +object (e.g., slice (2, 1, 1) for a valarray of size 1). +

+

[Kona: the LWG believes that invalid slices should invoke + undefined behavior. Valarrays are supposed to be designed for high + performance, so we don't want to require specific checking. We + need wording to express this decision.]

+ + + +

Proposed resolution:

+ + + + +
+

431. Swapping containers with unequal allocators

+

Section: 20.1.2 [allocator.requirements], 25 [algorithms] Status: Open + Submitter: Matt Austern Date: 2003-09-20

+

View other active issues in [allocator.requirements].

+

View all other issues in [allocator.requirements].

+

View all issues with Open status.

+

Discussion:

+

Clause 20.1.2 [allocator.requirements] paragraph 4 says that implementations + are permitted to supply containers that are unable to cope with + allocator instances and that container implementations may assume + that all instances of an allocator type compare equal. We gave + implementers this latitude as a temporary hack, and eventually we + want to get rid of it. What happens when we're dealing with + allocators that don't compare equal? +

+ +

In particular: suppose that v1 and v2 are both + objects of type vector<int, my_alloc> and that + v1.get_allocator() != v2.get_allocator(). What happens if + we write v1.swap(v2)? Informally, three possibilities:

+ +

1. This operation is illegal. Perhaps we could say that an + implementation is required to check and to throw an exception, or + perhaps we could say it's undefined behavior.

+

2. The operation performs a slow swap (i.e. using three + invocations of operator=, leaving each allocator with its + original container. This would be an O(N) operation.

+

3. The operation swaps both the vectors' contents and their + allocators. This would be an O(1) operation. That is:

+
+
    my_alloc a1(...);
+    my_alloc a2(...);
+    assert(a1 != a2);
+
+    vector<int, my_alloc> v1(a1);
+    vector<int, my_alloc> v2(a2);
+    assert(a1 == v1.get_allocator());
+    assert(a2 == v2.get_allocator());
+
+    v1.swap(v2);
+    assert(a1 == v2.get_allocator());
+    assert(a2 == v1.get_allocator());
+  
+
+ +

[Kona: This is part of a general problem. We need a paper + saying how to deal with unequal allocators in general.]

+ + +

[pre-Sydney: Howard argues for option 3 in +N1599. +]

+ + +

[ +2007-01-12, Howard: This issue will now tend to come up more often with move constructors +and move assignment operators. For containers, these members transfer resources (i.e. +the allocated memory) just like swap. +]

+ + +

[ +Batavia: There is agreement to overload the container swap on the allocator's Swappable +requirement using concepts. If the allocator supports Swappable, then container's swap will +swap allocators, else it will perform a "slow swap" using copy construction and copy assignment. +]

+ + + + +

Proposed resolution:

+ + + + + +
+

446. Iterator equality between different containers

+

Section: 24.1 [iterator.requirements], 23.1 [container.requirements] Status: Open + Submitter: Andy Koenig Date: 2003-12-16

+

View other active issues in [iterator.requirements].

+

View all other issues in [iterator.requirements].

+

View all issues with Open status.

+

Discussion:

+

+What requirements does the standard place on equality comparisons between +iterators that refer to elements of different containers. For example, if +v1 and v2 are empty vectors, is v1.end() == v2.end() allowed to yield true? +Is it allowed to throw an exception? +

+ +

+The standard appears to be silent on both questions. +

+

[Sydney: The intention is that comparing two iterators from +different containers is undefined, but it's not clear if we say that, +or even whether it's something we should be saying in clause 23 or in +clause 24. Intuitively we might want to say that equality is defined +only if one iterator is reachable from another, but figuring out how +to say it in any sensible way is a bit tricky: reachability is defined +in terms of equality, so we can't also define equality in terms of +reachability. +]

+ + + + +

Proposed resolution:

+ + + + + + +
+

454. basic_filebuf::open should accept wchar_t names

+

Section: 27.8.1.4 [filebuf.members] Status: Open + Submitter: Bill Plauger Date: 2004-01-30

+

View other active issues in [filebuf.members].

+

View all other issues in [filebuf.members].

+

View all issues with Open status.

+

Discussion:

+
    basic_filebuf *basic_filebuf::open(const char *, ios_base::open_mode);
+
+ +

should be supplemented with the overload:

+ +
    basic_filebuf *basic_filebuf::open(const wchar_t *, ios_base::open_mode);
+
+ +

+Depending on the operating system, one of these forms is fundamental and +the other requires an implementation-defined mapping to determine the +actual filename. +

+ +

[Sydney: Yes, we want to allow wchar_t filenames. Bill will + provide wording.]

+ + +

[ +In Toronto we noted that this is issue 5 from +N1569. +]

+ +

+How does this interact with the newly-defined character types, and how +do we avoid interface explosion considering std::string overloads that +were added? Propose another solution that is different than the +suggestion proposed by PJP. +

+

+Suggestion is to make a member template function for basic_string (for +char, wchar_t, u16char, u32char instantiations), and then just keep a +const char* member. +

+

+Goal is to do implicit conversion between character string literals to +appropriate basic_string type. Not quite sure if this is possible. +

+

+Implementors are free to add specific overloads for non-char character +types. +

+ + + +

Proposed resolution:

+ +

Change from:

+
+
basic_filebuf<charT,traits>* open(
+	const char* s,
+	ios_base::openmode mode );
+
+ +

+Effects: If is_open() != false, returns a null pointer. +Otherwise, initializes the filebuf as required. It then +opens a file, if possible, whose name is the NTBS s ("as if" +by calling std::fopen(s,modstr)).

+
+ +

to:

+ +
+
basic_filebuf<charT,traits>* open(
+	const char* s,
+	ios_base::openmode mode );
+
+basic_filebuf<charT,traits>* open(
+	const wchar_t* ws,
+	ios_base::openmode mode );
+
+ +

+Effects: If is_open() != false, returns a null pointer. +Otherwise, initializes the filebuf as required. It then +opens a file, if possible, whose name is the NTBS s ("as if" +by calling std::fopen(s,modstr)). +For the second signature, the NTBS s is determined from the +WCBS ws in an implementation-defined manner. +

+ +

+(NOTE: For a system that "naturally" represents a filename +as a WCBS, the NTBS s in the first signature may instead +be mapped to a WCBS; if so, it follows the same mapping +rules as the first argument to open.) +

+
+ + + +

Rationale:

+

+Slightly controversial, but by a 7-1 straw poll the LWG agreed to move +this to Ready. The controversy was because the mapping between wide +names and files in a filesystem is implementation defined. The +counterargument, which most but not all LWG members accepted, is that +the mapping between narrow files names and files is also +implemenation defined.

+ +

[Lillehammer: Moved back to "open" status, at Beman's urging. +(1) Why just basic_filebuf, instead of also basic_fstream (and +possibly other things too). (2) Why not also constructors that take +std::basic_string? (3) We might want to wait until we see Beman's +filesystem library; we might decide that it obviates this.]

+ + + + + + + + + +
+

458. 24.1.5 contains unintented limitation for operator-

+

Section: 24.1.5 [random.access.iterators] Status: Open + Submitter: Daniel Frey Date: 2004-02-27

+

View all other issues in [random.access.iterators].

+

View all issues with Open status.

+

Discussion:

+

+In 24.1.5 [lib.random.access.iterators], table 76 the operational +semantics for the expression "r -= n" are defined as "return r += -n". +This means, that the expression -n must be valid, which is not the case +for unsigned types. +

+ +

[ +Sydney: Possibly not a real problem, since difference type is required +to be a signed integer type. However, the wording in the standard may +be less clear than we would like. +]

+ + + + +

Proposed resolution:

+

+To remove this limitation, I suggest to change the +operational semantics for this column to: +

+
    { Distance m = n; 
+      if (m >= 0) 
+        while (m--) --r; 
+      else 
+        while (m++) ++r;
+      return r; }
+
+ + + + + + +
+

459. Requirement for widening in stage 2 is overspecification

+

Section: 22.2.2.1.2 [facet.num.get.virtuals] Status: Open + Submitter: Martin Sebor Date: 2004-03-16

+

View other active issues in [facet.num.get.virtuals].

+

View all other issues in [facet.num.get.virtuals].

+

View all issues with Open status.

+

Discussion:

+

When parsing strings of wide-character digits, the standard + requires the library to widen narrow-character "atoms" and compare + the widened atoms against the characters that are being parsed. + Simply narrowing the wide characters would be far simpler, and + probably more efficient. The two choices are equivalent except in + convoluted test cases, and many implementations already ignore the + standard and use narrow instead of widen.

+ +

+First, I disagree that using narrow() instead of widen() would +necessarily have unfortunate performance implications. A possible +implementation of narrow() that allows num_get to be implemented +in a much simpler and arguably comparably efficient way as calling +widen() allows, i.e. without making a virtual call to do_narrow every +time, is as follows: +

+ +
  inline char ctype<wchar_t>::narrow (wchar_t wc, char dflt) const
+  {
+      const unsigned wi = unsigned (wc);
+
+      if (wi > UCHAR_MAX)
+          return typeid (*this) == typeid (ctype<wchar_t>) ?
+                 dflt : do_narrow (wc, dflt);
+
+      if (narrow_ [wi] < 0) {
+         const char nc = do_narrow (wc, dflt);
+         if (nc == dflt)
+             return dflt;
+         narrow_ [wi] = nc;
+      }
+
+      return char (narrow_ [wi]);
+  }
+
+ +

+Second, I don't think the change proposed in the issue (i.e., to use +narrow() instead of widen() during Stage 2) would be at all +drastic. Existing implementations with the exception of libstdc++ +currently already use narrow() so the impact of the change on programs +would presumably be isolated to just a single implementation. Further, +since narrow() is not required to translate alternate wide digit +representations such as those mentioned in issue 303 +to +their narrow equivalents (i.e., the portable source characters '0' +through '9'), the change does not necessarily imply that these +alternate digits would be treated as ordinary digits and accepted as +part of numbers during parsing. In fact, the requirement in 22.2.1.1.2 +[locale.ctype.virtuals], p13 forbids narrow() to translate an alternate +digit character, wc, to an ordinary digit in the basic source +character set unless the expression +(ctype<charT>::is(ctype_base::digit, wc) == true) holds. This in +turn is prohibited by the C standard (7.25.2.1.5, 7.25.2.1.5, and +5.2.1, respectively) for charT of either char or wchar_t. +

+ +

[Sydney: To a large extent this is a nonproblem. As long as +you're only trafficking in char and wchar_t we're only dealing with a +stable character set, so you don't really need either 'widen' or +'narrow': can just use literals. Finally, it's not even clear whether +widen-vs-narrow is the right question; arguably we should be using +codecvt instead.]

+ + + + +

Proposed resolution:

+

Change stage 2 so that implementations are permitted to use either +technique to perform the comparison:

+
    +
  1. call widen on the atoms and compare (either by using + operator== or char_traits<charT>::eq) the input with + the widened atoms, or
  2. +
  3. call narrow on the input and compare the narrow input + with the atoms
  4. +
  5. do (1) or (2) only if charT is not char or wchar_t, + respectively; i.e., avoid calling widen or narrow + if it the source and destination types are the same
  6. +
+ + + + + +
+

462. Destroying objects with static storage duration

+

Section: 3.6.3 [basic.start.term], 18.3 [cstdint] Status: Open + Submitter: Bill Plauger Date: 2004-03-23

+

View all issues with Open status.

+

Discussion:

+

+3.6.3 Termination spells out in detail the interleaving of static +destructor calls and calls to functions registered with atexit. To +match this behavior requires intimate cooperation between the code +that calls destructors and the exit/atexit machinery. The former +is tied tightly to the compiler; the latter is a primitive mechanism +inherited from C that traditionally has nothing to do with static +construction and destruction. The benefits of intermixing destructor +calls with atexit handler calls is questionable at best, and very +difficult to get right, particularly when mixing third-party C++ +libraries with different third-party C++ compilers and C libraries +supplied by still other parties. +

+ +

+I believe the right thing to do is defer all static destruction +until after all atexit handlers are called. This is a change in +behavior, but one that is likely visible only to perverse test +suites. At the very least, we should permit deferred destruction +even if we don't require it. +

+ +

[If this is to be changed, it should probably be changed by CWG. + At this point, however, the LWG is leaning toward NAD. Implementing + what the standard says is hard work, but it's not impossible and + most vendors went through that pain years ago. Changing this + behavior would be a user-visible change, and would break at least + one real application.]

+ + +

[ +Batavia: Send to core with our recommendation that we should permit deferred +destruction but not require it. +]

+ + +

[ +Howard: The course of action recommended in Batavia would undo LWG +issue 3 and break current code implementing the "phoenix +singleton". Search the net for "phoenix singleton atexit" to get a feel +for the size of the adverse impact this change would have. Below is +sample code which implements the phoenix singleton and would break if +atexit is changed in this way: +]

+ + +
#include <cstdlib>
+#include <iostream>
+#include <type_traits>
+#include <new>
+
+class A
+{
+    bool alive_;
+    A(const A&);
+    A& operator=(const A&);
+public:
+    A() : alive_(true) {std::cout << "A()\n";}
+    ~A() {alive_ = false; std::cout << "~A()\n";}
+    void use()
+    {
+        if (alive_)
+            std::cout << "A is alive\n";
+        else
+            std::cout << "A is dead\n";
+    }
+};
+
+void deallocate_resource();
+
+// This is the phoenix singleton pattern
+A& get_resource(bool create = true)
+{
+    static std::aligned_storage<sizeof(A), std::alignment_of<A>::value>::type buf;
+    static A* a;
+    if (create)
+    {
+        if (a != (A*)&buf)
+        {
+            a = ::new (&buf) A;
+            std::atexit(deallocate_resource);
+        }
+    }
+    else
+    {
+        a->~A();
+        a = (A*)&buf + 1;
+    }
+    return *a;
+}
+
+void deallocate_resource()
+{
+    get_resource(false);
+}
+
+void use_A(const char* message)
+{
+    A& a = get_resource();
+    std::cout << "Using A " << message << "\n";
+    a.use();
+}
+
+struct B
+{
+    ~B() {use_A("from ~B()");}
+};
+
+B b;
+
+int main()
+{
+    use_A("from main()");
+}
+
+ +

+The correct output is: +

+ +
A()
+Using A from main()
+A is alive
+~A()
+A()
+Using A from ~B()
+A is alive
+~A()
+
+ + + +

Proposed resolution:

+

+

+ + + + + +
+

471. result of what() implementation-defined

+

Section: 18.6.1 [type.info] Status: Open + Submitter: Martin Sebor Date: 2004-06-28

+

View all other issues in [type.info].

+

View all issues with Open status.

+

Discussion:

+ +

[lib.exception] specifies the following:

+
    exception (const exception&) throw();
+    exception& operator= (const exception&) throw();
+
+    -4- Effects: Copies an exception object.
+    -5- Notes: The effects of calling what() after assignment
+        are implementation-defined.
+
+ +

+First, does the Note only apply to the assignment operator? If so, +what are the effects of calling what() on a copy of an object? Is +the returned pointer supposed to point to an identical copy of +the NTBS returned by what() called on the original object or not? +

+ +

+Second, is this Note intended to extend to all the derived classes +in section 19? I.e., does the standard provide any guarantee for +the effects of what() called on a copy of any of the derived class +described in section 19? +

+ +

+Finally, if the answer to the first question is no, I believe it +constitutes a defect since throwing an exception object typically +implies invoking the copy ctor on the object. If the answer is yes, +then I believe the standard ought to be clarified to spell out +exactly what the effects are on the copy (i.e., after the copy +ctor was called). +

+ +

[Redmond: Yes, this is fuzzy. The issue of derived classes is + fuzzy too.]

+ + +

[ +Batavia: Howard provided wording. +]

+ + + + +

Proposed resolution:

+ +

+Change 18.7.1 [exception] to: +

+ +
+
exception(const exception& e) throw();
+exception& operator=(const exception& e) throw();
+
+

+-4- Effects: Copies an exception object. +

+

+ -5- Remarks: The effects of calling what() after assignment are implementation-defined. +

+

+-5- Throws: Nothing. This also applies +to all standard library-defined classes that derive from exception. +

+

+-7- Postcondition: strcmp(what(), e.what()) == 0. This also applies +to all standard library-defined classes that derive from exception. +

+ +
+
+ + + + +
+

473. underspecified ctype calls

+

Section: 22.2.1.1 [locale.ctype] Status: Open + Submitter: Martin Sebor Date: 2004-07-01

+

View all issues with Open status.

+

Discussion:

+

+Most ctype member functions come in two forms: one that operates +on a single character at a time and another form that operates +on a range of characters. Both forms are typically described by +a single Effects and/or Returns clause. +

+

+The Returns clause of each of the single-character non-virtual forms +suggests that the function calls the corresponding single character +virtual function, and that the array form calls the corresponding +virtual array form. Neither of the two forms of each virtual member +function is required to be implemented in terms of the other. +

+

+There are three problems: +

+

+1. One is that while the standard does suggest that each non-virtual +member function calls the corresponding form of the virtual function, +it doesn't actually explicitly require it. +

+

+Implementations that cache results from some of the virtual member +functions for some or all values of their arguments might want to +call the array form from the non-array form the first time to fill +the cache and avoid any or most subsequent virtual calls. Programs +that rely on each form of the virtual function being called from +the corresponding non-virtual function will see unexpected behavior +when using such implementations. +

+

+2. The second problem is that either form of each of the virtual +functions can be overridden by a user-defined function in a derived +class to return a value that is different from the one produced by +the virtual function of the alternate form that has not been +overriden. +

+

+Thus, it might be possible for, say, ctype::widen(c) to return one +value, while for ctype::widen(&c, &c + 1, &wc) to set +wc to another value. This is almost certainly not intended. Both +forms of every function should be required to return the same result +for the same character, otherwise the same program using an +implementation that calls one form of the functions will behave +differently than when using another implementation that calls the +other form of the function "under the hood." +

+

+3. The last problem is that the standard text fails to specify whether +one form of any of the virtual functions is permitted to be implemented +in terms of the other form or not, and if so, whether it is required +or permitted to call the overridden virtual function or not. +

+

+Thus, a program that overrides one of the virtual functions so that +it calls the other form which then calls the base member might end +up in an infinite loop if the called form of the base implementation +of the function in turn calls the other form. +

+

+Lillehammer: Part of this isn't a real problem. We already talk about +caching. 22.1.1/6 But part is a real problem. ctype virtuals may call +each other, so users don't know which ones to override to avoid avoid +infinite loops.

+ +

This is a problem for all facet virtuals, not just ctype virtuals, +so we probably want a blanket statement in clause 22 for all +facets. The LWG is leaning toward a blanket prohibition, that a +facet's virtuals may never call each other. We might want to do that +in clause 27 too, for that matter. A review is necessary. Bill will +provide wording.

+ + +

Proposed resolution:

+ + + + +
+

484. Convertible to T

+

Section: 24.1.1 [input.iterators] Status: Open + Submitter: Chris Jefferson Date: 2004-09-16

+

View all other issues in [input.iterators].

+

View all issues with Open status.

+

Discussion:

+

From comp.std.c++:

+ +

+I note that given an input iterator a for type T, +then *a only has to be "convertable to T", not actually of type T. +

+ +

Firstly, I can't seem to find an exact definition of "convertable to T". +While I assume it is the obvious definition (an implicit conversion), I +can't find an exact definition. Is there one?

+ +

Slightly more worryingly, there doesn't seem to be any restriction on +the this type, other than it is "convertable to T". Consider two input +iterators a and b. I would personally assume that most people would +expect *a==*b would perform T(*a)==T(*b), however it doesn't seem that +the standard requires that, and that whatever type *a is (call it U) +could have == defined on it with totally different symantics and still +be a valid inputer iterator.

+ +

Is this a correct reading? When using input iterators should I write +T(*a) all over the place to be sure that the object i'm using is the +class I expect?

+ +

This is especially a nuisance for operations that are defined to be + "convertible to bool". (This is probably allowed so that + implementations could return say an int and avoid an unnessary + conversion. However all implementations I have seen simply return a + bool anyway. Typical implemtations of STL algorithms just write + things like while(a!=b && *a!=0). But strictly + speaking, there are lots of types that are convertible to T but + that also overload the appropriate operators so this doesn't behave + as expected.

+ +

If we want to make code like this legal (which most people seem to + expect), then we'll need to tighten up what we mean by "convertible + to T".

+ +

[Lillehammer: The first part is NAD, since "convertible" is + well-defined in core. The second part is basically about pathological + overloads. It's a minor problem but a real one. So leave open for + now, hope we solve it as part of iterator redesign.]

+ + + +

Proposed resolution:

+ + + + + +
+

485. output iterator insufficently constrained

+

Section: 24.1.2 [output.iterators] Status: Open + Submitter: Chris Jefferson Date: 2004-10-13

+

View all other issues in [output.iterators].

+

View all issues with Open status.

+

Discussion:

+

+The note on 24.1.2 Output iterators insufficently limits what can be +performed on output iterators. While it requires that each iterator is +progressed through only once and that each iterator is written to only +once, it does not require the following things:

+ +

Note: Here it is assumed that x is an output iterator of type X which +has not yet been assigned to.

+ +

a) That each value of the output iterator is written to: +The standard allows: +++x; ++x; ++x; +

+ +

+b) That assignments to the output iterator are made in order +X a(x); ++a; *a=1; *x=2; is allowed +

+ +

+c) Chains of output iterators cannot be constructed: +X a(x); ++a; X b(a); ++b; X c(b); ++c; is allowed, and under the current +wording (I believe) x,a,b,c could be written to in any order. +

+ +

I do not believe this was the intension of the standard?

+

[Lillehammer: Real issue. There are lots of constraints we + intended but didn't specify. Should be solved as part of iterator + redesign.]

+ + + +

Proposed resolution:

+ + + + + +
+

492. Invalid iterator arithmetic expressions

+

Section: 23 [containers], 24 [iterators], 25 [algorithms] Status: Open + Submitter: Thomas Mang Date: 2004-12-12

+

View all other issues in [containers].

+

View all issues with Open status.

+

Discussion:

+

Various clauses other than clause 25 make use of iterator arithmetic not +supported by the iterator category in question. +Algorithms in clause 25 are exceptional because of 25 [lib.algorithms], +paragraph 9, but this paragraph does not provide semantics to the +expression "iterator - n", where n denotes a value of a distance type +between iterators.

+ +

1) Examples of current wording:

+ +

Current wording outside clause 25:

+ +

+23.2.2.4 [lib.list.ops], paragraphs 19-21: "first + 1", "(i - 1)", +"(last - first)" +23.3.1.1 [lib.map.cons], paragraph 4: "last - first" +23.3.2.1 [lib.multimap.cons], paragraph 4: "last - first" +23.3.3.1 [lib.set.cons], paragraph 4: "last - first" +23.3.4.1 [lib.multiset.cons], paragraph 4: "last - first" +24.4.1 [lib.reverse.iterators], paragraph 1: "(i - 1)" +

+ +

+[Important note: The list is not complete, just an illustration. The +same issue might well apply to other paragraphs not listed here.]

+ +

None of these expressions is valid for the corresponding iterator +category.

+ +

Current wording in clause 25:

+ +

+25.1.1 [lib.alg.foreach], paragraph 1: "last - 1" +25.1.3 [lib.alg.find.end], paragraph 2: "[first1, last1 - +(last2-first2))" +25.2.8 [lib.alg.unique], paragraph 1: "(i - 1)" +25.2.8 [lib.alg.unique], paragraph 5: "(i - 1)" +

+ +

+However, current wording of 25 [lib.algorithms], paragraph 9 covers +neither of these four cases:

+ +

Current wording of 25 [lib.algorithms], paragraph 9:

+ +

+"In the description of the algorithms operator + and - are used for some +of the iterator categories for which they do not have to be defined. In +these cases the semantics of a+n is the same as that of

+
{X tmp = a;
+advance(tmp, n);
+return tmp;
+}
+
+

and that of b-a is the same as of return distance(a, b)"

+ +

+This paragrpah does not take the expression "iterator - n" into account, +where n denotes a value of a distance type between two iterators [Note: +According to current wording, the expression "iterator - n" would be +resolved as equivalent to "return distance(n, iterator)"]. Even if the +expression "iterator - n" were to be reinterpreted as equivalent to +"iterator + -n" [Note: This would imply that "a" and "b" were +interpreted implicitly as values of iterator types, and "n" as value of +a distance type], then 24.3.4/2 interfers because it says: "Requires: n +may be negative only for random access and bidirectional iterators.", +and none of the paragraphs quoted above requires the iterators on which +the algorithms operate to be of random access or bidirectional category. +

+ +

2) Description of intended behavior:

+ +

+For the rest of this Defect Report, it is assumed that the expression +"iterator1 + n" and "iterator1 - iterator2" has the semantics as +described in current 25 [lib.algorithms], paragraph 9, but applying to +all clauses. The expression "iterator1 - n" is equivalent to an +result-iterator for which the expression "result-iterator + n" yields an +iterator denoting the same position as iterator1 does. The terms +"iterator1", "iterator2" and "result-iterator" shall denote the value of +an iterator type, and the term "n" shall denote a value of a distance +type between two iterators.

+ +

+All implementations known to the author of this Defect Report comply +with these assumptions. +No impact on current code is expected.

+ +

3) Proposed fixes:

+ + +

Change 25 [lib.algorithms], paragraph 9 to:

+ +

+"In the description of the algorithms operator + and - are used for some +of the iterator categories for which they do not have to be defined. In +this paragraph, a and b denote values of an iterator type, and n denotes +a value of a distance type between two iterators. In these cases the +semantics of a+n is the same as that of

+
{X tmp = a;
+advance(tmp, n);
+return tmp;
+}
+
+

,the semantics of a-n denotes the value of an iterator i for which the +following condition holds: +advance(i, n) == a, +and that of b-a is the same as of +return distance(a, b)". +

+ +

Comments to the new wording:

+ +

+a) The wording " In this paragraph, a and b denote values of an iterator +type, and n denotes a value of a distance type between two iterators." +was added so the expressions "b-a" and "a-n" are distinguished regarding +the types of the values on which they operate. +b) The wording ",the semantics of a-n denotes the value of an iterator i +for which the following condition holds: advance(i, n) == a" was added +to cover the expression 'iterator - n'. The wording "advance(i, n) == a" +was used to avoid a dependency on the semantics of a+n, as the wording +"i + n == a" would have implied. However, such a dependency might well +be deserved. +c) DR 225 is not considered in the new wording. +

+ +

+Proposed fixes regarding invalid iterator arithmetic expressions outside +clause 25:

+ +

+Either +a) Move modified 25 [lib.algorithms], paragraph 9 (as proposed above) +before any current invalid iterator arithmetic expression. In that case, +the first sentence of 25 [lib.algorithms], paragraph 9, need also to be +modified and could read: "For the rest of this International Standard, +...." / "In the description of the following clauses including this +...." / "In the description of the text below ..." etc. - anyways +substituting the wording "algorithms", which is a straight reference to +clause 25. +In that case, 25 [lib.algorithms] paragraph 9 will certainly become +obsolete. +Alternatively, +b) Add an appropiate paragraph similar to resolved 25 [lib.algorithms], +paragraph 9, to the beginning of each clause containing invalid iterator +arithmetic expressions. +Alternatively, +c) Fix each paragraph (both current wording and possible resolutions of +DRs) containing invalid iterator arithmetic expressions separately. +

+ +

5) References to other DRs:

+ +

+See DR 225. +See DR 237. The resolution could then also read "Linear in last - +first". +

+ +

Proposed resolution:

+ +

[Lillehammer: Minor issue, but real. We have a blanket statement +about this in 25/11. But (a) it should be in 17, not 25; and (b) it's +not quite broad enough, because there are some arithmetic expressions +it doesn't cover. Bill will provide wording.]

+ + + + + + + +
+

498. Requirements for partition() and stable_partition() too strong

+

Section: 25.2.13 [alg.partitions] Status: Open + Submitter: Sean Parent, Joe Gottman Date: 2005-05-04

+

View all issues with Open status.

+

Discussion:

+

+Problem: +The iterator requirements for partition() and stable_partition() [25.2.12] +are listed as BidirectionalIterator, however, there are efficient algorithms +for these functions that only require ForwardIterator that have been known +since before the standard existed. The SGI implementation includes these (see +http://www.sgi.com/tech/stl/partition.html +and +http://www.sgi.com/tech/stl/stable_partition.html). +

+ + +

Proposed resolution:

+

+Change 25.2.12 from

+
template<class BidirectionalIterator, class Predicate> 
+BidirectionalIterator partition(BidirectionalIterato r first, 
+                                BidirectionalIterator last, 
+                                Predicate pred); 
+
+

to

+
template<class ForwardIterator, class Predicate> 
+ForwardIterator partition(ForwardIterator first, 
+                          ForwardIterator last, 
+                          Predicate pred); 
+
+

Change the complexity from

+ +

+At most (last - first)/2 swaps are done. Exactly (last - first) +applications of the predicate are done. +

+ +

to

+ +

+If ForwardIterator is a bidirectional_iterator, at most (last - first)/2 +swaps are done; otherwise at most (last - first) swaps are done. Exactly +(last - first) applications of the predicate are done. +

+ + + +

Rationale:

+

+Partition is a "foundation" algorithm useful in many contexts (like sorting +as just one example) - my motivation for extending it to include forward +iterators is slist - without this extension you can't partition an slist +(without writing your own partition). Holes like this in the standard +library weaken the argument for generic programming (ideally I'd be able +to provide a library that would refine std::partition() to other concepts +without fear of conflicting with other libraries doing the same - but +that is a digression). I consider the fact that partition isn't defined +to work for ForwardIterator a minor embarrassment. +

+ +

[Mont Tremblant: Moved to Open, request motivation and use cases +by next meeting. Sean provided further rationale by post-meeting +mailing.]

+ + + + + + + +
+

502. Proposition: Clarification of the interaction between a facet and an iterator

+

Section: 22.1.1.1.1 [locale.category] Status: Open + Submitter: Christopher Conrade Zseleghovski Date: 2005-06-07

+

View all other issues in [locale.category].

+

View all issues with Open status.

+

Discussion:

+

+Motivation: +

+ +

+This requirement seems obvious to me, it is the essence of code modularity. +I have complained to Mr. Plauger that the Dinkumware library does not +observe this principle but he objected that this behaviour is not covered in +the standard. +

+ + +

Proposed resolution:

+

+Append the following point to 22.1.1.1.1: +

+ +

+6. The implementation of a facet of Table 52 parametrized with an +InputIterator/OutputIterator should use that iterator only as character +source/sink respectively. +For a *_get facet, it means that the value received depends only on the +sequence of input characters and not on how they are accessed. +For a *_put facet, it means that the sequence of characters output depends +only on the value to be formatted and not of how the characters are stored. +

+ +

[ +Berlin: Moved to Open, Need to clean up this area to make it clear +locales don't have to contain open ended sets of facets. Jack, Howard, +Bill. +]

+ + + + + + + +
+

503. more on locales

+

Section: 22.2 [locale.categories] Status: Open + Submitter: P.J. Plauger Date: 2005-06-20

+

View other active issues in [locale.categories].

+

View all other issues in [locale.categories].

+

View all issues with Open status.

+

Discussion:

+

+a) In 22.2.1.1 para. 2 we refer to "the instantiations required in Table +51" to refer to the facet *objects* associated with a locale. And we +almost certainly mean just those associated with the default or "C" +locale. Otherwise, you can't switch to a locale that enforces a different +mapping between narrow and wide characters, or that defines additional +uppercase characters. +

+ +

+b) 22.2.1.5 para. 3 (codecvt) has the same issues. +

+ +

+c) 22.2.1.5.2 (do_unshift) is even worse. It *forbids* the generation of +a homing sequence for the basic character set, which might very well need +one. +

+ +

+d) 22.2.1.5.2 (do_length) likewise dictates that the default mapping +between wide and narrow characters be taken as one-for-one. +

+ +

+e) 22.2.2 para. 2 (num_get/put) is both muddled and vacuous, as far as +I can tell. The muddle is, as before, calling Table 51 a list of +instantiations. But the constraint it applies seems to me to cover +*all* defined uses of num_get/put, so why bother to say so? +

+ +

+f) 22.2.3.1.2 para. 1(do_decimal_point) says "The required instantiations +return '.' or L'.'.) Presumably this means "as appropriate for the +character type. But given the vague definition of "required" earlier, +this overrules *any* change of decimal point for non "C" locales. +Surely we don't want to do that. +

+ +

+g) 22.2.3.1.2 para. 2 (do_thousands_sep) says "The required instantiations +return ',' or L','.) As above, this probably means "as appropriate for the +character type. But this overrules the "C" locale, which requires *no* +character ('\0') for the thousands separator. Even if we agree that we +don't mean to block changes in decimal point or thousands separator, +we should also eliminate this clear incompatibility with C. +

+ +

+h) 22.2.3.1.2 para. 2 (do_grouping) says "The required instantiations +return the empty string, indicating no grouping." Same considerations +as for do_decimal_point. +

+ +

+i) 22.2.4.1 para. 1 (collate) refers to "instantiations required in Table +51". Same bad jargon. +

+ +

+j) 22.2.4.1.2 para. 1 (do_compare) refers to "instantiations required +in Table 51". Same bad jargon. +

+ +

+k) 22.2.5 para. 1 (time_get/put) uses the same muddled and vacuous +as num_get/put. +

+ +

+l) 22.2.6 para. 2 (money_get/put) uses the same muddled and vacuous +as num_get/put. +

+ +

+m) 22.2.6.3.2 (do_pos/neg_format) says "The instantiations required +in Table 51 ... return an object of type pattern initialized to +{symbol, sign, none, value}." This once again *overrides* the "C" +locale, as well as any other locale." +

+ +

+3) We constrain the use_facet calls that can be made by num_get/put, +so why don't we do the same for money_get/put? Or for any of the +other facets, for that matter? +

+ +

+4) As an almost aside, we spell out when a facet needs to use the ctype +facet, but several also need to use a codecvt facet and we don't say so. +

+

[ +Berlin: Bill to provide wording. +]

+ + + +

Proposed resolution:

+

+

+ + + + + +
+

518. Are insert and erase stable for unordered_multiset and unordered_multimap?

+

Section: 23.1.3 [unord.req], TR1 6.3.1 [tr.unord.req] Status: Review + Submitter: Matt Austern Date: 2005-07-03

+

View other active issues in [unord.req].

+

View all other issues in [unord.req].

+

View all issues with Review status.

+

Discussion:

+

+Issue 371 deals with stability of multiset/multimap under insert and erase +(i.e. do they preserve the relative order in ranges of equal elements). +The same issue applies to unordered_multiset and unordered_multimap. +

+

[ +Moved to open (from review): There is no resolution. +]

+ + +

[ +Toronto: We have a resolution now. Moved to Review. Some concern was noted +as to whether this conflicted with existing practice or not. An additional +concern was in specifying (partial) ordering for an unordered container. +]

+ + + + +

Proposed resolution:

+

+Wording for the proposed resolution is taken from the equivalent text for associative containers. +

+ +

+Change 23.1.3 [unord.req], Unordered associative containers, paragraph 6 to: +

+ +

+An unordered associative container supports unique keys if it may +contain at most one element for each key. Otherwise, it supports equivalent +keys. unordered_set and unordered_map support +unique keys. unordered_multiset and unordered_multimap +support equivalent keys. In containers that support equivalent keys, elements +with equivalent keys are adjacent to each other. For +unordered_multiset +and unordered_multimap, insert and erase +preserve the relative ordering of equivalent elements. +

+ +

+Change 23.1.3 [unord.req], Unordered associative containers, paragraph 8 to: +

+ +
+

The elements of an unordered associative container are organized into +buckets. Keys with the same hash code appear in the same bucket. The number +of buckets is automatically increased as elements are added to an unordered +associative container, so that the average number of elements per bucket is kept +below a bound. Rehashing invalidates iterators, changes ordering between +elements, and changes which buckets elements appear in, but does not invalidate +pointers or references to elements. For unordered_multiset +and unordered_multimap, rehashing +preserves the relative ordering of equivalent elements.

+
+ + + + + + +
+

522. Tuple doesn't define swap

+

Section: 20.3 [tuple], TR1 6.1 [tr.tuple] Status: Open + Submitter: Andy Koenig Date: 2005-07-03

+

View all issues with Open status.

+

Discussion:

+

+Tuple doesn't define swap(). It should. +

+

[ +Berlin: Doug to provide wording. +]

+ +

[ +Batavia: Howard to provide wording. +]

+ +

[ +Toronto: Howard to provide wording (really this time). +]

+ + + + +

Proposed resolution:

+ + + + + +
+

523. regex case-insensitive character ranges are unimplementable as specified

+

Section: 28 [re] Status: Open + Submitter: Eric Niebler Date: 2005-07-01

+

View all other issues in [re].

+

View all issues with Open status.

+

Discussion:

+

+A problem with TR1 regex is currently being discussed on the Boost +developers list. It involves the handling of case-insensitive matching +of character ranges such as [Z-a]. The proper behavior (according to the +ECMAScript standard) is unimplementable given the current specification +of the TR1 regex_traits<> class template. John Maddock, the author of +the TR1 regex proposal, agrees there is a problem. The full discussion +can be found at http://lists.boost.org/boost/2005/06/28850.php (first +message copied below). We don't have any recommendations as yet. +

+

+-- Begin original message -- +

+

+The situation of interest is described in the ECMAScript specification +(ECMA-262), section 15.10.2.15: +

+

+"Even if the pattern ignores case, the case of the two ends of a range +is significant in determining which characters belong to the range. +Thus, for example, the pattern /[E-F]/i matches only the letters E, F, +e, and f, while the pattern /[E-f]/i matches all upper and lower-case +ASCII letters as well as the symbols [, \, ], ^, _, and `." +

+

+A more interesting case is what should happen when doing a +case-insentitive match on a range such as [Z-a]. It should match z, Z, +a, A and the symbols [, \, ], ^, _, and `. This is not what happens with +Boost.Regex (it throws an exception from the regex constructor). +

+

+The tough pill to swallow is that, given the specification in TR1, I +don't think there is any effective way to handle this situation. +According to the spec, case-insensitivity is handled with +regex_traits<>::translate_nocase(CharT) -- two characters are equivalent +if they compare equal after both are sent through the translate_nocase +function. But I don't see any way of using this translation function to +make character ranges case-insensitive. Consider the difficulty of +detecting whether "z" is in the range [Z-a]. Applying the transformation +to "z" has no effect (it is essentially std::tolower). And we're not +allowed to apply the transformation to the ends of the range, because as +ECMA-262 says, "the case of the two ends of a range is significant." +

+

+So AFAICT, TR1 regex is just broken, as is Boost.Regex. One possible fix +is to redefine translate_nocase to return a string_type containing all +the characters that should compare equal to the specified character. But +this function is hard to implement for Unicode, and it doesn't play nice +with the existing ctype facet. What a mess! +

+

+-- End original message -- +

+ +

[ +John Maddock adds: +]

+ + +

+One small correction, I have since found that ICU's regex package does +implement this correctly, using a similar mechanism to the current +TR1.Regex. +

+

+Given an expression [c1-c2] that is compiled as case insensitive it: +

+

+Enumerates every character in the range c1 to c2 and converts it to it's +case folded equivalent. That case folded character is then used a key to a +table of equivalence classes, and each member of the class is added to the +list of possible matches supported by the character-class. This second step +isn't possible with our current traits class design, but isn't necessary if +the input text is also converted to a case-folded equivalent on the fly. +

+

+ICU applies similar brute force mechanisms to character classes such as +[[:lower:]] and [[:word:]], however these are at least cached, so the impact +is less noticeable in this case. +

+

+Quick and dirty performance comparisons show that expressions such as +"[X-\\x{fff0}]+" are indeed very slow to compile with ICU (about 200 times +slower than a "normal" expression). For an application that uses a lot of +regexes this could have a noticeable performance impact. ICU also has an +advantage in that it knows the range of valid characters codes: code points +outside that range are assumed not to require enumeration, as they can not +be part of any equivalence class. I presume that if we want the TR1.Regex +to work with arbitrarily large character sets enumeration really does become +impractical. +

+

+Finally note that Unicode has: +

+

+Three cases (upper, lower and title). +One to many, and many to one case transformations. +Character that have context sensitive case translations - for example an +uppercase sigma has two different lowercase forms - the form chosen depends +on context(is it end of a word or not), a caseless match for an upper case +sigma should match either of the lower case forms, which is why case folding +is often approximated by tolower(toupper(c)). +

+

+Probably we need some way to enumerate character equivalence classes, +including digraphs (either as a result or an input), and some way to tell +whether the next character pair is a valid digraph in the current locale. +

+

+Hoping this doesn't make this even more complex that it was already, +

+ +

[ +Portland: Alisdair: Detect as invalid, throw an exception. +Pete: Possible general problem with case insensitive ranges. +]

+ + + + +

Proposed resolution:

+ + + + + +
+

527. tr1::bind has lost its Throws clause

+

Section: 20.5.11.1.3 [func.bind.bind], TR1 3.6.3 [tr.func.bind.bind] Status: Open + Submitter: Peter Dimov Date: 2005-10-01

+

View all issues with Open status.

+

Discussion:

+

+The original bind proposal gives the guarantee that tr1::bind(f, t1, +..., tN) does not throw when the copy constructors of f, t1, ..., tN +don't. +

+ +

+This guarantee is not present in the final version of TR1. +

+ +

+I'm pretty certain that we never removed it on purpose. Editorial omission? :-) +

+ +

[ +Berlin: not quite editorial, needs proposed wording. +]

+ +

[ +Batavia: Doug to translate wording to variadic templates. +]

+ + +

[ +Toronto: We agree but aren't quite happy with the wording. The "t"'s no +longer refer to anything. Alan to provide improved wording. +]

+ + + + +

Proposed resolution:

+

+In 20.5.10.1.3 [lib.func.bind.bind] ([tr.func.bind.bind]), add a new paragraph after p2: +

+

+Throws: Nothing unless one of the copy constructors of f, t1, t2, ..., tN +throws an exception. +

+ +

+Add a new paragraph after p4: +

+

+Throws: nothing unless one of the copy constructors of f, t1, t2, ..., tN +throws an exception. +

+ + + + + +
+

529. The standard encourages redundant and confusing preconditions

+

Section: 17.4.3.8 [res.on.required] Status: Open + Submitter: David Abrahams Date: 2005-10-25

+

View all issues with Open status.

+

Discussion:

+

+17.4.3.8/1 says: +

+ +

+Violation of the preconditions specified in a function's +Required behavior: paragraph results in undefined behavior unless the +function's Throws: paragraph specifies throwing an exception when the +precondition is violated. +

+ +

+This implies that a precondition violation can lead to defined +behavior. That conflicts with the only reasonable definition of +precondition: that a violation leads to undefined behavior. Any other +definition muddies the waters when it comes to analyzing program +correctness, because precondition violations may be routinely done in +correct code (e.g. you can use std::vector::at with the full +expectation that you'll get an exception when your index is out of +range, catch the exception, and continue). Not only is it a bad +example to set, but it encourages needless complication and redundancy +in the standard. For example: +

+ +
  21 Strings library 
+  21.3.3 basic_string capacity
+
+  void resize(size_type n, charT c);
+
+  5 Requires: n <= max_size()
+  6 Throws: length_error if n > max_size().
+  7 Effects: Alters the length of the string designated by *this as follows:
+
+ +

+The Requires clause is entirely redundant and can be dropped. We +could make that simplifying change (and many others like it) even +without changing 17.4.3.8/1; the wording there just seems to encourage +the redundant and error-prone Requires: clause. +

+ +

[ +Batavia: Alan and Pete to work. +]

+ + + +

Proposed resolution:

+

+1. Change 17.4.3.8/1 to read: +

+ +

+Violation of the preconditions specified in a function's +Required behavior: paragraph results in undefined behavior +unless the function's Throws: paragraph specifies throwing +an exception when the precondition is violated. +

+ +

+2. Go through and remove redundant Requires: clauses. Specifics to be + provided by Dave A. +

+ +

[ +Berlin: The LWG requests a detailed survey of part 2 of the proposed resolution. +]

+ + +

[ +Alan provided the survey +N2121. +]

+ + + + + + + +
+

539. partial_sum and adjacent_difference should mention requirements

+

Section: 26.6.3 [partial.sum] Status: Open + Submitter: Marc Schoolderman Date: 2006-02-06

+

View all issues with Open status.

+

Discussion:

+

+There are some problems in the definition of partial_sum and +adjacent_difference in 26.4 [lib.numeric.ops] +

+ +

+Unlike accumulate and inner_product, these functions are not +parametrized on a "type T", instead, 26.4.3 [lib.partial.sum] simply +specifies the effects clause as; +

+ +

+Assigns to every element referred to by iterator i in the range +[result,result + (last - first)) a value correspondingly equal to +

+
((...(* first + *( first + 1)) + ...) + *( first + ( i - result )))
+
+
+ +

+And similarly for BinaryOperation. Using just this definition, it seems +logical to expect that: +

+ + +
char i_array[4] = { 100, 100, 100, 100 };
+int  o_array[4];
+
+std::partial_sum(i_array, i_array+4, o_array);
+
+ +

+Is equivalent to +

+ +
int o_array[4] = { 100, 100+100, 100+100+100, 100+100+100+100 };
+
+ +

+i.e. 100, 200, 300, 400, with addition happening in the result type, +int. +

+ +

+Yet all implementations I have tested produce 100, -56, 44, -112, +because they are using an accumulator of the InputIterator's +value_type, which in this case is char, not int. +

+ +

+The issue becomes more noticeable when the result of the expression *i + +*(i+1) or binary_op(*i, *i-1) can't be converted to the +value_type. In a contrived example: +

+ +
enum not_int { x = 1, y = 2 };
+...
+not_int e_array[4] = { x, x, y, y };
+std::partial_sum(e_array, e_array+4, o_array);
+
+ +

+Is it the intent that the operations happen in the input type, or in +the result type? +

+ +

+If the intent is that operations happen in the result type, something +like this should be added to the "Requires" clause of 26.4.3/4 +[lib.partial.sum]: +

+ +

+The type of *i + *(i+1) or binary_op(*i, *(i+1)) shall meet the +requirements of CopyConstructible (20.1.3) and Assignable +(23.1) types. +

+ +

+(As also required for T in 26.4.1 [lib.accumulate] and 26.4.2 +[lib.inner.product].) +

+ +

+The "auto initializer" feature proposed in +N1894 +is not required to +implement partial_sum this way. The 'narrowing' behaviour can still be +obtained by using the std::plus<> function object. +

+ +

+If the intent is that operations happen in the input type, then +something like this should be added instead; +

+ +

+The type of *first shall meet the requirements of +CopyConstructible (20.1.3) and Assignable (23.1) types. +The result of *i + *(i+1) or binary_op(*i, *(i+1)) shall be +convertible to this type. +

+ +

+The 'widening' behaviour can then be obtained by writing a custom proxy +iterator, which is somewhat involved. +

+ +

+In both cases, the semantics should probably be clarified. +

+ +

+26.4.4 [lib.adjacent.difference] is similarly underspecified, although +all implementations seem to perform operations in the 'result' type: +

+ +
unsigned char i_array[4] = { 4, 3, 2, 1 };
+int o_array[4];
+
+std::adjacent_difference(i_array, i_array+4, o_array);
+
+ +

+o_array is 4, -1, -1, -1 as expected, not 4, 255, 255, 255. +

+ +

+In any case, adjacent_difference doesn't mention the requirements on the +value_type; it can be brought in line with the rest of 26.4 +[lib.numeric.ops] by adding the following to 26.4.4/2 +[lib.adjacent.difference]: +

+ +

+The type of *first shall meet the requirements of +CopyConstructible (20.1.3) and Assignable (23.1) types." +

+

[ +Berlin: Giving output iterator's value_types very controversial. Suggestion of +adding signatures to allow user to specify "accumulator". +]

+ + + + +

Proposed resolution:

+

+

+ + + + + +
+

546. _Longlong and _ULonglong are integer types

+

Section: TR1 5.1.1 [tr.rand.req] Status: Open + Submitter: Matt Austern Date: 2006-01-10

+

View all issues with Open status.

+

Discussion:

+

+The TR sneaks in two new integer types, _Longlong and _Ulonglong, in [tr.c99]. +The rest of the TR should use that type. I believe this affects two places. +First, the random number requirements, 5.1.1/10-11, lists all of the types with +which template parameters named IntType and UIntType may be instantiated. +_Longlong (or "long long", assuming it is added to C++0x) should be added to the +IntType list, and UIntType (again, or "unsigned long long") should be added to +the UIntType list. Second, 6.3.2 lists the types for which hash<> is +required to be instantiable. _Longlong and _Ulonglong should be added to that +list, so that people may use long long as a hash key. +

+ + +

Proposed resolution:

+

+

+ + + + + +
+

550. What should the return type of pow(float,int) be?

+

Section: 26.7 [c.math] Status: Open + Submitter: Howard Hinnant Date: 2006-01-12

+

View other active issues in [c.math].

+

View all other issues in [c.math].

+

View all issues with Open status.

+

Discussion:

+

+Assuming we adopt the +C +compatibility package from C99 what should be the return type of the +following signature be: +

+
?  pow(float, int);
+
+

+C++03 says that the return type should be float. + +TR1 and C90/99 say the return type should be double. This can put +clients into a situation where C++03 provides answers that are not as high +quality as C90/C99/TR1. For example: +

+
#include <math.h>
+
+int main()
+{
+    float x = 2080703.375F;
+    double y = pow(x, 2);
+}
+
+

+Assuming an IEEE 32 bit float and IEEE 64 bit double, C90/C99/TR1 all suggest: +

+ +
y = 4329326534736.390625
+
+ +

+which is exactly right. While C++98/C++03 demands: +

+ +
y = 4329326510080.
+
+ +

+which is only approximately right. +

+ +

+I recommend that C++0X adopt the mixed mode arithmetic already adopted by +Fortran, C and TR1 and make the return type of pow(float,int) be +double. +

+ +

[ +Kona (2007): Other functions that are affected by this issue include +ldexp, scalbln, and scalbn. We also believe that there is a typo in +26.7/10: float nexttoward(float, long double); [sic] should be float +nexttoward(float, float); Proposed Disposition: Review (the proposed +resolution appears above, rather than below, the heading "Proposed +resolution") +]

+ + +

[ +

+Howard, post Kona: +

+
+

+Unfortunately I strongly disagree with a part of the resolution +from Kona. I am moving from New to Open instead of to Review because I do not believe +we have consensus on the intent of the resolution. +

+

+This issue does not include ldexp, scalbln, and scalbn because +the second integral parameter in each of these signatures (from C99) is not a +generic parameter according to C99 7.22p2. The corresponding C++ overloads are +intended (as far as I know) to correspond directly to C99's definition of generic parameter. +

+

+For similar reasons, I do not believe that the second long double parameter of +nexttoward, nor the return type of this function, is in error. I believe the +correct signature is: +

+
+
float nexttoward(float, long double);
+
+
+

+which is what both the C++0X working paper and C99 state (as far as I currently understand). +

+

+This is really only about pow(float, int). And this is because C++98 took one +route (with pow only) and C99 took another (with many math functions in <tgmath.h>. +The proposed resolution basically says: C++98 got it wrong and C99 got it right; let's go with C99. +

+
+] + + + + +

Proposed resolution:

+

+Change 26.7 [c.math] +

+ +
float pow(float, float); 
+float double pow(float, int);
+
+ + + + + + +
+

556. is Compare a BinaryPredicate?

+

Section: 25.3 [alg.sorting] Status: Open + Submitter: Martin Sebor Date: 2006-02-05

+

View all other issues in [alg.sorting].

+

View all issues with Open status.

+

Discussion:

+

+In 25, p8 we allow BinaryPredicates to return a type that's convertible +to bool but need not actually be bool. That allows predicates to return +things like proxies and requires that implementations be careful about +what kinds of expressions they use the result of the predicate in (e.g., +the expression in if (!pred(a, b)) need not be well-formed since the +negation operator may be inaccessible or return a type that's not +convertible to bool). +

+

+Here's the text for reference: +

+

+ ...if an algorithm takes BinaryPredicate binary_pred as its argument + and first1 and first2 as its iterator arguments, it should work + correctly in the construct if (binary_pred(*first1, first2)){...}. +

+ +

+In 25.3, p2 we require that the Compare function object return true +of false, which would seem to preclude such proxies. The relevant text +is here: +

+

+ Compare is used as a function object which returns true if the first + argument is less than the second, and false otherwise... +

+ + +

Proposed resolution:

+

+I think we could fix this by rewording 25.3, p2 to read somthing like: +

+

+-2- Compare is used as a function object which returns +true if the first argument a BinaryPredicate. The +return value of the function call operator applied to an object of type +Compare, when converted to type bool, yields true +if the first argument of the call is less than the second, and +false otherwise. Compare comp is used throughout for +algorithms assuming an ordering relation. It is assumed that comp +will not apply any non-constant function through the dereferenced iterator. +

+ + +

[ +Portland: Jack to define "convertible to bool" such that short circuiting isn't +destroyed. +]

+ + + + + +
+

557. TR1: div(_Longlong, _Longlong) vs div(intmax_t, intmax_t)

+

Section: 18.3 [cstdint], TR1 8.22 [tr.c99.cstdint] Status: Open + Submitter: Paolo Carlini Date: 2006-02-06

+

View all other issues in [cstdint].

+

View all issues with Open status.

+

Discussion:

+

+I'm seeing a problem with such overloads: when, _Longlong == intmax_t == +long long we end up, essentially, with the same arguments and different +return types (lldiv_t and imaxdiv_t, respectively). Similar issue with +abs(_Longlong) and abs(intmax_t), of course. +

+

+Comparing sections 8.25 and 8.11, I see an important difference, +however: 8.25.3 and 8.25.4 carefully describe div and abs for _Longlong +types (rightfully, because not moved over directly from C99), whereas +there is no equivalent in 8.11: the abs and div overloads for intmax_t +types appear only in the synopsis and are not described anywhere, in +particular no mention in 8.11.2 (at variance with 8.25.2). +

+

+I'm wondering whether we really, really, want div and abs for intmax_t... +

+ + + +

Proposed resolution:

+ + + +

[ +Portland: no consensus. +]

+ + +

Rationale:

+

[ +Batavia, Bill: The <cstdint> synopsis in TR1 8.11.1 [tr.c99.cinttypes.syn] contains: +]

+ +
intmax_t imaxabs(intmax_t i);
+intmax_t abs(intmax_t i);
+
+imaxdiv_t imaxdiv(intmax_t numer, intmax_t denom);
+imaxdiv_t div(intmax_t numer, intmax_t denom);
+
+ +

[ +and in TR1 8.11.2 [tr.c99.cinttypes.def]: +]

+ + +

+The header defines all functions, types, and macros the same as C99 +subclause 7.8. +

+ +

[ +This is as much definition as we give for most other C99 functions, +so nothing need change. We might, however, choose to add the footnote: +]

+ + +

+[Note: These overloads for abs and div may well be equivalent to +those that take long long arguments. If so, the implementation is +responsible for avoiding conflicting declarations. -- end note] +

+ + + + + + +
+

561. inserter overly generic

+

Section: 24.4.2.6.5 [inserter] Status: Ready + Submitter: Howard Hinnant Date: 2006-02-21

+

View all issues with Ready status.

+

Discussion:

+

+The declaration of std::inserter is: +

+ +
template <class Container, class Iterator>
+insert_iterator<Container>
+inserter(Container& x, Iterator i);
+
+ +

+The template parameter Iterator in this function is completely unrelated +to the template parameter Container when it doesn't need to be. This +causes the code to be overly generic. That is, any type at all can be deduced +as Iterator, whether or not it makes sense. Now the same is true of +Container. However, for every free (unconstrained) template parameter +one has in a signature, the opportunity for a mistaken binding grows geometrically. +

+ +

+It would be much better if inserter had the following signature instead: +

+ +
template <class Container>
+insert_iterator<Container>
+inserter(Container& x, typename Container::iterator i);
+
+ +

+Now there is only one free template parameter. And the second argument to +inserter must be implicitly convertible to the container's iterator, +else the call will not be a viable overload (allowing other functions in the +overload set to take precedence). Furthermore, the first parameter must have a +nested type named iterator, or again the binding to std::inserter +is not viable. Contrast this with the current situation +where any type can bind to Container or Iterator and those +types need not be anything closely related to containers or iterators. +

+ +

+This can adversely impact well written code. Consider: +

+ +
#include <iterator>
+#include <string>
+
+namespace my
+{
+
+template <class String>
+struct my_type {};
+
+struct my_container
+{
+template <class String>
+void push_back(const my_type<String>&);
+};
+
+template <class String>
+void inserter(const my_type<String>& m, my_container& c) {c.push_back(m);}
+
+}  // my
+
+int main()
+{
+    my::my_container c;
+    my::my_type<std::string> m;
+    inserter(m, c);
+}
+
+ +

+Today this code fails because the call to inserter binds to +std::inserter instead of to my::inserter. However with the +proposed change std::inserter will no longer be a viable function which +leaves only my::inserter in the overload resolution set. Everything +works as the client intends. +

+ +

+To make matters a little more insidious, the above example works today if you +simply change the first argument to an rvalue: +

+ +
    inserter(my::my_type(), c);
+
+ +

+It will also work if instantiated with some string type other than +std::string (or any other std type). It will also work if +<iterator> happens to not get included. +

+ +

+And it will fail again for such inocuous reaons as my_type or +my_container privately deriving from any std type. +

+ +

+It seems unfortunate that such simple changes in the client's code can result +in such radically differing behavior. +

+ + + +

Proposed resolution:

+

+Change 24.2: +

+ +

+24.2 Header <iterator> synopsis +

+
...
+template <class Container, class Iterator>
+   insert_iterator<Container> inserter(Container& x, Iterator typename Container::iterator i);
+...
+
+
+ +

+Change 24.4.2.5: +

+ +

+24.4.2.5 Class template insert_iterator

+
...
+template <class Container, class Iterator>
+   insert_iterator<Container> inserter(Container& x, Iterator typename Container::iterator i);
+...
+
+
+ +

+Change 24.4.2.6.5: +

+ +
+

+24.4.2.6.5 inserter +

+
template <class Container, class Inserter>
+   insert_iterator<Container> inserter(Container& x, Inserter typename Container::iterator i);
+
+

+-1- Returns: insert_iterator<Container>(x,typename Container::iterator(i)). +

+
+ + + +

[ +Kona (2007): This issue will probably be addressed as a part of the +concepts overhaul of the library anyway, but the proposed resolution is +correct in the absence of concepts. Proposed Disposition: Ready +]

+ + + + + +
+

562. stringbuf ctor inefficient

+

Section: 27.7 [string.streams] Status: Ready + Submitter: Martin Sebor Date: 2006-02-23

+

View all other issues in [string.streams].

+

View all issues with Ready status.

+

Discussion:

+

+ +For better efficiency, the requirement on the stringbuf ctor that +takes a string argument should be loosened up to let it set +epptr() beyond just one past the last initialized +character just like overflow() has been changed to be +allowed to do (see issue 432). That way the first call to +sputc() on an object won't necessarily cause a call to +overflow. The corresponding change should be made to the +string overload of the str() member function. + +

+ + +

Proposed resolution:

+

+ +Change 27.7.1.1, p3 of the Working Draft, N1804, as follows: + +

+ +
explicit basic_stringbuf(const basic_string<charT,traits,Allocator>& str,
+               ios_base::openmode which = ios_base::in | ios_base::out);
+
+ +

+-3- Effects: Constructs an object of class basic_stringbuf, +initializing the base class with basic_streambuf() +(27.5.2.1), and initializing mode with which. +Then calls str(s). copies the content of +str into the basic_stringbuf underlying character +sequence. If which & ios_base::out is true, initializes the +output sequence such that pbase() points to the first underlying +character, epptr() points one past the last underlying character, and +pptr() is equal to epptr() if which & ios_base::ate +is true, otherwise pptr() is equal to pbase(). If +which & ios_base::in is true, initializes the input sequence such +that eback() and gptr() point to the first underlying +character and egptr() points one past the last underlying character. +

+
+ +

+ +Change the Effects clause of the str() in 27.7.1.2, p2 to +read: + +

+
+

+-2- Effects: Copies the contents of s into the +basic_stringbuf underlying character sequence and +initializes the input and output sequences according to mode. +If +mode & ios_base::out is true, initializes the output +sequence such that pbase() points to the first underlying character, +epptr() points one past the last underlying character, and pptr() +is equal to epptr() if mode & ios_base::in +is true, otherwise pptr() is equal to pbase(). If +mode & ios_base::in is true, initializes the input sequence +such that eback() and gptr() point to the first underlying +character and egptr() points one past the last underlying character. +

+ +

+ +-3- Postconditions: If mode & ios_base::out is true, +pbase() points to the first underlying character and +(epptr() >= pbase() + s.size()) holds; in addition, if +mode & ios_base::in is true, (pptr() == pbase() ++ s.data()) holds, otherwise (pptr() == pbase()) +is true. If mode & ios_base::in is true, +eback() points to the first underlying character, and +(gptr() == eback()) and (egptr() == eback() + +s.size()) hold. + +

+
+ + +

[ +Kona (2007) Moved to Ready. +]

+ + + + + +
+

563. stringbuf seeking from end

+

Section: 27.7.1.4 [stringbuf.virtuals] Status: Ready + Submitter: Martin Sebor Date: 2006-02-23

+

View other active issues in [stringbuf.virtuals].

+

View all other issues in [stringbuf.virtuals].

+

View all issues with Ready status.

+

Discussion:

+

+According to Table 92 (unchanged by issue 432), when (way == +end) the newoff value in out mode is computed as +the difference between epptr() and pbase(). +

+

+ +This value isn't meaningful unless the value of epptr() +can be precisely controlled by a program. That used to be possible +until we accepted the resolution of issue 432, but since then the +requirements on overflow() have been relaxed to allow it +to make more than 1 write position available (i.e., by setting +epptr() to some unspecified value past +pptr()). So after the first call to +overflow() positioning the output sequence relative to +end will have unspecified results. + +

+

+ +In addition, in in|out mode, since (egptr() == +epptr()) need not hold, there are two different possible values +for newoff: epptr() - pbase() and +egptr() - eback(). + +

+ + +

Proposed resolution:

+

+ +Change the newoff column in the last row of Table 94 to +read: + +

+

+ +the end high mark pointer minus the beginning +pointer (xend high_mark - xbeg). + +

+ + +

[ +Kona (2007) Moved to Ready. +]

+ + + + + +
+

564. stringbuf seekpos underspecified

+

Section: 27.7.1.4 [stringbuf.virtuals] Status: Open + Submitter: Martin Sebor Date: 2006-02-23

+

View other active issues in [stringbuf.virtuals].

+

View all other issues in [stringbuf.virtuals].

+

View all issues with Open status.

+

Discussion:

+

+The effects of the seekpos() member function of +basic_stringbuf simply say that the function positions +the input and/or output sequences but fail to spell out exactly +how. This is in contrast to the detail in which seekoff() +is described. +

+ + +

Proposed resolution:

+

+ +Change 27.7.1.3, p13 to read: + +

+
+

+-13- Effects: Same as seekoff(off_type(sp), ios_base::beg, +which). Alters the stream position within the controlled sequences, +if possible, to correspond to the stream position stored in sp +(as described below). +

+
    +
  • If (which & ios_base::in) != 0, positions the input sequence.
  • +
  • If (which & ios_base::out) != 0, positions the output sequence.
  • +
  • If sp is an invalid stream position, or if the function +positions neither sequence, the positioning operation fails. If sp +has not been obtained by a previous successful call to one of the positioning +functions (seekoff, seekpos, tellg, tellp) +the effect is undefined.
  • +
+
+ + +

[ +Kona (2007): A pos_type is a position in a stream by +definition, so there is no ambiguity as to what it means. Proposed +Disposition: NAD +]

+ + +

[ +Post-Kona Martin adds: +I'm afraid I disagree +with the Kona '07 rationale for marking it NAD. The only text +that describes precisely what it means to position the input +or output sequence is in seekoff(). The seekpos() Effects +clause is inadequate in comparison and the proposed resolution +plugs the hole by specifying seekpos() in terms of seekoff(). +]

+ + + + + +
+

565. xsputn inefficient

+

Section: 27.5.2.4.5 [streambuf.virt.put] Status: Open + Submitter: Martin Sebor Date: 2006-02-23

+

View all issues with Open status.

+

Discussion:

+

+ +streambuf::xsputn() is specified to have the effect of +"writing up to n characters to the output sequence as if by +repeated calls to sputc(c)." + +

+

+ +Since sputc() is required to call overflow() when +(pptr() == epptr()) is true, strictly speaking +xsputn() should do the same. However, doing so would be +suboptimal in some interesting cases, such as in unbuffered mode or +when the buffer is basic_stringbuf. + +

+

+ +Assuming calling overflow() is not really intended to be +required and the wording is simply meant to describe the general +effect of appending to the end of the sequence it would be worthwhile +to mention in xsputn() that the function is not actually +required to cause a call to overflow(). + +

+ + +

Proposed resolution:

+

+ +Add the following sentence to the xsputn() Effects clause in +27.5.2.4.5, p1 (N1804): + +

+
+

+-1- Effects: Writes up to n characters to the output +sequence as if by repeated calls to sputc(c). The characters +written are obtained from successive elements of the array whose first element +is designated by s. Writing stops when either n +characters have been written or a call to sputc(c) would return +traits::eof(). It is uspecified whether the function calls +overflow() when (pptr() == epptr()) becomes true or whether +it achieves the same effects by other means. +

+
+

+ +In addition, I suggest to add a footnote to this function with the +same text as Footnote 292 to make it extra clear that derived classes +are permitted to override xsputn() for efficiency. + +

+ + +

[ +Kona (2007): We want to permit a streambuf that streams output directly +to a device without making calls to sputc or overflow. We believe that +has always been the intention of the committee. We believe that the +proposed wording doesn't accomplish that. Proposed Disposition: Open +]

+ + + + + +
+

567. streambuf inserter and extractor should be unformatted

+

Section: 27.6 [iostream.format] Status: Ready + Submitter: Martin Sebor Date: 2006-02-25

+

View other active issues in [iostream.format].

+

View all other issues in [iostream.format].

+

View all issues with Ready status.

+

Discussion:

+

+ +Issue 60 explicitly made the extractor and inserter operators that +take a basic_streambuf* argument formatted input and output +functions, respectively. I believe that's wrong, certainly in the +case of the extractor, since formatted functions begin by extracting +and discarding whitespace. The extractor should not discard any +characters. + +

+ + +

Proposed resolution:

+

+ +I propose to change each operator to behave as unformatted input and +output function, respectively. The changes below are relative to the +working draft document number N1804. + +

+

+ +Specifically, change 27.6.1.2.3, p14 as follows: + +

+ +
+

+ +Effects: Behaves as an unformatted input function +(as described in 27.6.1.2.127.6.1.3, paragraph +1). + +

+
+

+ +And change 27.6.2.5.3, p7 as follows: + +

+ +
+

+ +Effects: Behaves as an unformatted output function +(as described in 27.6.2.5.127.6.2.6, paragraph +1). + +

+
+ + +

[ +Kona (2007): Proposed Disposition: Ready +]

+ + + + + +
+

568. log2 overloads missing

+

Section: TR1 8.16.4 [tr.c99.cmath.over] Status: New + Submitter: Paolo Carlini Date: 2006-03-07

+

View all issues with New status.

+

Discussion:

+

+log2 is missing from the list of "additional overloads" in TR1 8.16.4 [tr.c99.cmath.over] p1. +

+ +

+Hinnant: This is a TR1 issue only. It is fixed in the current (N2135) WD. +

+ + +

Proposed resolution:

+

+Add log2 to the list of functions in TR1 8.16.4 [tr.c99.cmath.over] p1. +

+ + + + + +
+

570. Request adding additional explicit specializations of char_traits

+

Section: 21.1 [char.traits] Status: Open + Submitter: Jack Reeves Date: 2006-04-06

+

View all issues with Open status.

+

Discussion:

+

+Currently, the Standard Library specifies only a declaration for template class +char_traits<> and requires the implementation provide two explicit +specializations: char_traits<char> and char_traits<wchar_t>. I feel the Standard +should require explicit specializations for all built-in character types, i.e. +char, wchar_t, unsigned char, and signed char. +

+

+I have put together a paper +(N1985) +that describes this in more detail and +includes all the necessary wording. +

+

[ +Portland: Jack will rewrite +N1985 +to propose a primary template that will work with other integral types. +]

+ +

[ +Toronto: issue has grown with addition of char16_t and char32_t. +]

+ + + +

Proposed resolution:

+ + + + + +
+

573. C++0x file positioning should handle modern file sizes

+

Section: 27.4.3 [fpos] Status: Open + Submitter: Beman Dawes Date: 2006-04-12

+

View all other issues in [fpos].

+

View all issues with Open status.

+

Discussion:

+

+There are two deficiencies related to file sizes: +

+
    +
  1. It doesn't appear that the Standard Library is specified in + a way that handles modern file sizes, which are often too + large to be represented by an unsigned long.
  2. + +
  3. The std::fpos class does not currently have the ability to + set/get file positions.
  4. +
+

+The Dinkumware implementation of the Standard Library as shipped with the Microsoft compiler copes with these issues by: +

+
    +
  1. Defining fpos_t be long long, which is large enough to + represent any file position likely in the foreseeable future.
  2. + +
  3. Adding member functions to class fpos. For example, +
    fpos_t seekpos() const;
    +
    +
  4. +
+

+Because there are so many types relating to file positions and offsets (fpos_t, +fpos, pos_type, off_type, streamoff, streamsize, streampos, wstreampos, and +perhaps more), it is difficult to know if the Dinkumware extensions are +sufficient. But they seem a useful starting place for discussions, and they do +represent existing practice. +

+ +

[ +Kona (2007): We need a paper. It would be nice if someone proposed +clarifications to the definitions of pos_type and off_type. Currently +these definitions are horrible. Proposed Disposition: Open +]

+ + + +

Proposed resolution:

+

+

+ + + + + +
+

574. DR 369 Contradicts Text

+

Section: 27.3 [iostream.objects] Status: Review + Submitter: Pete Becker Date: 2006-04-18

+

View all other issues in [iostream.objects].

+

View all issues with Review status.

+

Discussion:

+

+lib.iostream.objects requires that the standard stream objects are never +destroyed, and it requires that they be destroyed. +

+

+DR 369 adds words to say that we really mean for ios_base::Init objects to force +construction of standard stream objects. It ends, though, with the phrase "these +stream objects shall be destroyed after the destruction of dynamically ...". +However, the rule for destruction is stated in the standard: "The objects are +not destroyed during program execution." +

+ + +

Proposed resolution:

+

+Change 27.3 [iostream.objects]/1: +

+ +
+

+-2- The objects are constructed and the associations are established at +some time prior to or during the first time an object of class +ios_base::Init is constructed, and in any case before the body of main +begins execution.290) The objects are not destroyed during program +execution.291) If a translation unit includes <iostream&t; or explicitly +constructs an ios_base::Init object, these stream objects shall be +constructed before dynamic initialization of non-local objects defined +later in that translation unit, and these stream objects shall be +destroyed after the destruction of dynamically initialized non-local +objects defined later in that translation unit. +

+
+ + +

[ +Kona (2007): From 27.3 [iostream.objects]/2, strike the words "...and these stream objects +shall be destroyed after the destruction of dynamically initialized +non-local objects defined later in that translation unit." Proposed +Disposition: Review +]

+ + + + + +
+

579. erase(iterator) for unordered containers should not return an iterator

+

Section: 23.1.3 [unord.req] Status: Open + Submitter: Joaquín M López Muñoz Date: 2006-06-13

+

View other active issues in [unord.req].

+

View all other issues in [unord.req].

+

View all issues with Open status.

+

Discussion:

+

+See +N2023 +for full discussion. +

+ + +

Proposed resolution:

+

+Option 1: +

+ +

+The problem can be eliminated by omitting the requirement that a.erase(q) return an +iterator. This is, however, in contrast with the equivalent requirements for other +standard containers. +

+ +

+Option 2: +

+ +

+a.erase(q) can be made to compute the next iterator only when explicitly requested: +the technique consists in returning a proxy object implicitly convertible to iterator, so +that +

+ +
iterator q1=a.erase(q);
+
+ +

+works as expected, while +

+ +
a.erase(q);
+
+ +

+does not ever invoke the conversion-to-iterator operator, thus avoiding the associated +computation. To allow this technique, some sections of TR1 along the line "return value +is an iterator..." should be changed to "return value is an unspecified object implicitly +convertible to an iterator..." Although this trick is expected to work transparently, it can +have some collateral effects when the expression a.erase(q) is used inside generic +code. +

+ + + +

Rationale:

+

+N2023 +was discussed in Portland and the consensus was that there appears to be +no need for either change proposed in the paper. The consensus opinion +was that since the iterator could serve as its own proxy, there appears +to be no need for the change. In general, "converts to" is undesirable +because it interferes with template matching. +

+ +

+Post Toronto: There does not at this time appear to be consensus with the Portland consensus. +

+ + + + + +
+

580. unused allocator members

+

Section: 20.1.2 [allocator.requirements] Status: Open + Submitter: Martin Sebor Date: 2006-06-14

+

View other active issues in [allocator.requirements].

+

View all other issues in [allocator.requirements].

+

View all issues with Open status.

+

Duplicate of: 479

+

Discussion:

+

+ +C++ Standard Library templates that take an allocator as an argument +are required to call the allocate() and +deallocate() members of the allocator object to obtain +storage. However, they do not appear to be required to call any other +allocator members such as construct(), +destroy(), address(), and +max_size(). This makes these allocator members less than +useful in portable programs. + +

+

+ +It's unclear to me whether the absence of the requirement to use these +allocator members is an unintentional omission or a deliberate +choice. However, since the functions exist in the standard allocator +and since they are required to be provided by any user-defined +allocator I believe the standard ought to be clarified to explictly +specify whether programs should or should not be able to rely on +standard containers calling the functions. + +

+

+ +I propose that all containers be required to make use of these +functions. + +

+

[ +Batavia: We support this resolution. Martin to provide wording. +]

+ +

[ +pre-Oxford: Martin provided wording. +]

+ + + +

Proposed resolution:

+       

+ +Specifically, I propose to change 23.1 [container.requirements], +p9 as follows: + +       

+           
+

+-9- Copy constructors  for all container types defined  in this clause +that   are  parametrized  on   Allocator  copy +anthe  allocator argument from  their respective +first parameters. + +All other  constructors for  these container types  take an +const  Allocator&  argument  (20.1.6),  an +allocator whose value_type is the same as the container's +value_type. + +A copy of this  argument isshall be used for any +memory  allocation and  deallocation performed, +by these  constructors and by all  member functions, during +the  lifetime  of each  container  object.   Allocation shall  be +performed  "as  if"  by  calling  the  allocate()  member +function on  a copy  of the allocator  object of the  appropriate type +New  Footnote),   and  deallocation  "as   if"  by  calling +deallocate() on  a copy of  the same allocator  object of +the corresponding type. + +A  copy of  this argument  shall also  be used  to  construct and +destroy objects whose lifetime  is managed by the container, including +but not  limited to those of  the container's value_type, +and  to  obtain  their  address.   All  objects  residing  in  storage +allocated by a  container's allocator shall be constructed  "as if" by +calling the construct() member  function on a copy of the +allocator object of  the appropriate type.  The same  objects shall be +destroyed "as if"  by calling destroy() on a  copy of the +same allocator object  of the same type.  The  address of such objects +shall be obtained "as if" by calling the address() member +function  on  a  copy  of  the allocator  object  of  the  appropriate +type. + +Finally, a copy  of this argument shall be  used by its container +object to determine  the maximum number of objects  of the container's +value_type the container may  store at the same time. The +container  member function max_size() +obtains  this number +from      the +     value +     returned      by +    a      call +     to +get_allocator().max_size(). + +In   all  container   types  defined   in  this   clause that  are +parametrized     on    Allocator,     the    member +get_allocator()     returns +    a     copy +    of     the +Allocator     object +    used     to +   construct     the +container.258) +

+

+New Footnote: This type  may be different from Allocator: +it     may    be +    derived    from +    Allocator    via +Allocator::rebind<U>::other   for  the  appropriate +type U. +

+           
+       

+The proposed wording seems cumbersome but I couldn't think of a better +way   to  describe   the +  requirement  that   containers  use +  their +Allocator  to manage  only objects  (regardless  of their +type)  that  persist  over  their  lifetimes  and  not,  for  example, +temporaries  created on the  stack. That  is, containers  shouldn't be +required  to  call  Allocator::construct(Allocator::allocate(1), +elem)  just to  construct a  temporary copy  of an  element, or +Allocator::destroy(Allocator::address(temp),     1)    to +destroy temporaries. + +       

+ + +

[ +Howard: This same paragraph will need some work to accommodate 431. +]

+ + +

[ +post Oxford: This would be rendered NAD Editorial by acceptance of +N2257. +]

+ + + + + +
+

581. flush() not unformatted function

+

Section: 27.6.2.7 [ostream.unformatted] Status: Ready + Submitter: Martin Sebor Date: 2006-06-14

+

View all other issues in [ostream.unformatted].

+

View all issues with Ready status.

+

Discussion:

+

+ +The resolution of issue 60 changed basic_ostream::flush() +so as not to require it to behave as an unformatted output function. +That has at least two in my opinion problematic consequences: + +

+

+ +First, flush() now calls rdbuf()->pubsync() +unconditionally, without regard to the state of the stream. I can't +think of any reason why flush() should behave differently +from the vast majority of stream functions in this respect. + +

+

+ +Second, flush() is not required to catch exceptions from +pubsync() or set badbit in response to such +events. That doesn't seem right either, as most other stream functions +do so. + +

+ + +

Proposed resolution:

+

+ +I propose to revert the resolution of issue 60 with respect to +flush(). Specifically, I propose to change 27.6.2.6, p7 +as follows: + +

+ +

+Effects: Behaves as an unformatted output function (as described +in 27.6.2.6, paragraph 1). If rdbuf() is not a null +pointer, constructs a sentry object. If this object returns +true when converted to a value of type bool the function +calls rdbuf()->pubsync(). If that function returns +-1 calls setstate(badbit) (which may throw +ios_base::failure (27.4.4.3)). Otherwise, if the +sentry object returns false, does nothing.Does +not behave as an unformatted output function (as described in +27.6.2.6, paragraph 1). +

+ + + +

[ +Kona (2007): Proposed Disposition: Ready +]

+ + + + + +
+

582. specialized algorithms and volatile storage

+

Section: 20.6.4.1 [uninitialized.copy] Status: Open + Submitter: Martin Sebor Date: 2006-06-14

+

View other active issues in [uninitialized.copy].

+

View all other issues in [uninitialized.copy].

+

View all issues with Open status.

+

Discussion:

+

+ +The specialized algorithms [lib.specialized.algorithms] are specified +as having the general effect of invoking the following expression: + +

+
+new (static_cast<void*>(&*i))
+    typename iterator_traits<ForwardIterator>::value_type (x)
+
+            
+

+ +This expression is ill-formed when the type of the subexpression +&*i is some volatile-qualified T. + +

+ +

[ +Batavia: Lack of support for proposed resolution but agree there is a +defect. Howard to look at wording. Concern that move semantics +properly expressed if iterator returns rvalue. +]

+ + + + +

Proposed resolution:

+

+ +In order to allow these algorithms to operate on volatile storage I +propose to change the expression so as to make it well-formed even for +pointers to volatile types. Specifically, I propose the following +changes to clauses 20 and 24. Change 20.6.4.1, p1 to read: + +

+
+Effects:
+
+typedef typename iterator_traits<ForwardIterator>::pointer    pointer;
+typedef typename iterator_traits<ForwardIterator>::value_type value_type;
+
+for (; first != last; ++result, ++first)
+    new (static_cast<void*>(const_cast<pointer>(&*result))
+        value_type (*first);
+
+            
+

+ +change 20.6.4.2, p1 to read + +

+
+Effects:
+
+typedef typename iterator_traits<ForwardIterator>::pointer    pointer;
+typedef typename iterator_traits<ForwardIterator>::value_type value_type;
+
+for (; first != last; ++result, ++first)
+    new (static_cast<void*>(const_cast<pointer>(&*first))
+        value_type (*x);
+
+            
+

+ +and change 20.6.4.3, p1 to read + +

+
+Effects:
+
+typedef typename iterator_traits<ForwardIterator>::pointer    pointer;
+typedef typename iterator_traits<ForwardIterator>::value_type value_type;
+
+for (; n--; ++first)
+    new (static_cast<void*>(const_cast<pointer>(&*first))
+        value_type (*x);
+
+            
+

+ +In addition, since there is no partial specialization for +iterator_traits<volatile T*> I propose to add one +to parallel such specialization for <const T*>. Specifically, I +propose to add the following text to the end of 24.3.1, p3: + +

+

+ +and for pointers to volatile as + +

+
+namespace std {
+template<class T> struct iterator_traits<volatile T*> {
+typedef ptrdiff_t difference_type;
+typedef T value_type;
+typedef volatile T* pointer;
+typedef volatile T& reference;
+typedef random_access_iterator_tag iterator_category;
+};
+}
+
+            
+

+ +Note that the change to iterator_traits isn't necessary +in order to implement the specialized algorithms in a way that allows +them to operate on volatile strorage. It is only necesassary in order +to specify their effects in terms of iterator_traits as +is done here. Implementations can (and some do) achieve the same +effect by means of function template overloading. + +

+ + + + +
+

585. facet error reporting

+

Section: 22.2 [locale.categories] Status: Open + Submitter: Martin Sebor, Paolo Carlini Date: 2006-06-22

+

View other active issues in [locale.categories].

+

View all other issues in [locale.categories].

+

View all issues with Open status.

+

Discussion:

+

+ +Section 22.2, paragraph 2 requires facet get() members +that take an ios_base::iostate& argument, +err, to ignore the (initial) value of the +argument, but to set it to ios_base::failbit in case of a +parse error. + +

+

+ +We believe there are a few minor problems with this blanket +requirement in conjunction with the wording specific to each +get() member function. + +

+

+ +First, besides get() there are other member functions +with a slightly different name (for example, +get_date()). It's not completely clear that the intent of +the paragraph is to include those as well, and at least one +implementation has interpreted the requirement literally. + +

+

+ +Second, the requirement to "set the argument to +ios_base::failbit suggests that the functions are not +permitted to set it to any other value (such as +ios_base::eofbit, or even ios_base::eofbit | +ios_base::failbit). + +

+

+ +However, 22.2.2.1.2, p5 (Stage 3 of num_get parsing) and +p6 (bool parsing) specifies that the do_get +functions perform err |= ios_base::eofbit, which +contradicts the earlier requirement to ignore err's initial +value. + +

+

+ +22.2.6.1.2, p1 (the Effects clause of the money_get +facet's do_get member functions) also specifies that +err's initial value be used to compute the final +value by ORing it with either ios_base::failbit or +withios_base::eofbit | ios_base::failbit. + +

+ + +

Proposed resolution:

+

+ +We believe the intent is for all facet member functions that take an +ios_base::iostate& argument to: + +

+
    +
  • + +ignore the initial value of the err argument, + +
  • +
  • + +reset err to ios_base::goodbit prior +to any further processing, + +
  • +
  • + +and set either ios_base::eofbit, or +ios_base::failbit, or both in err, as +appropriate, in response to reaching the end-of-file or on parse +error, or both. + +
  • +
+

+ +To that effect we propose to change 22.2, p2 as follows: + +

+

+ +The put() members make no provision for error +reporting. (Any failures of the OutputIterator argument must be +extracted from the returned iterator.) Unless otherwise +specified, the get() members that +take an ios_base::iostate& argument whose value +they ignore, but set to ios_base::failbit in case of a parse +error., err, start by evaluating +err = ios_base::goodbit, and may subsequently set +err to either ios_base::eofbit, or +ios_base::failbit, or ios_base::eofbit | +ios_base::failbit in response to reaching the end-of-file or in +case of a parse error, or both, respectively. + +

+ + +

[ +Kona (2007): We need to change the proposed wording to clarify that the +phrase "the get members" actually denotes get(), get_date(), etc. +Proposed Disposition: Open +]

+ + + + +
+

588. requirements on zero sized tr1::arrays and other details

+

Section: 23.2.1 [array] Status: Open + Submitter: Gennaro Prota Date: 2006-07-18

+

View other active issues in [array].

+

View all other issues in [array].

+

View all issues with Open status.

+

Discussion:

+

+The wording used for section 23.2.1 [lib.array] seems to be subtly +ambiguous about zero sized arrays (N==0). Specifically: +

+

+* "An instance of array<T, N> stores N elements of type T, so that +[...]" +

+

+Does this imply that a zero sized array object stores 0 elements, i.e. +that it cannot store any element of type T? The next point clarifies +the rationale behind this question, basically how to implement begin() +and end(): +

+

+* 23.2.1.5 [lib.array.zero], p2: "In the case that N == 0, begin() == +end() == unique value." +

+

+What does "unique" mean in this context? Let's consider the following +possible implementations, all relying on a partial specialization: +

+
a)
+    template< typename T >
+    class array< T, 0 > {
+    
+        ....
+
+        iterator begin()
+        { return iterator( reinterpret_cast< T * >( this ) ); }
+        ....
+
+    };
+
+

+This has been used in boost, probably intending that the return value +had to be unique to the specific array object and that array couldn't +store any T. Note that, besides relying on a reinterpret_cast, has +(more than potential) alignment problems. +

+
b)
+    template< typename T >
+    class array< T, 0 > {
+    
+        T t;
+
+        iterator begin()
+        { return iterator( &t ); }
+        ....
+
+    };
+
+

+This provides a value which is unique to the object and to the type of +the array, but requires storing a T. Also, it would allow the user to +mistakenly provide an initializer list with one element. +

+

+A slight variant could be returning *the* null pointer of type T +

+
    return static_cast<T*>(0);
+
+

+In this case the value would be unique to the type array<T, 0> but not +to the objects (all objects of type array<T, 0> with the same value +for T would yield the same pointer value). +

+

+Furthermore this is inconsistent with what the standard requires from +allocation functions (see library issue 9). +

+

+c) same as above but with t being a static data member; again, the +value would be unique to the type, not to the object. +

+

+d) to avoid storing a T *directly* while disallowing the possibility +to use a one-element initializer list a non-aggregate nested class +could be defined +

+
    struct holder { holder() {} T t; } h;
+
+

+and then begin be defined as +

+
 iterator begin() { return &h.t; }
+
+

+But then, it's arguable whether the array stores a T or not. +Indirectly it does. +

+

+----------------------------------------------------- +

+

+Now, on different issues: +

+

+* what's the effect of calling assign(T&) on a zero-sized array? There +seems to be only mention of front() and back(), in 23.2.1 [lib.array] +p4 (I would also suggest to move that bullet to section 23.2.1.5 +[lib.array.zero], for locality of reference) +

+

+* (minor) the opening paragraph of 23.2.1 [lib.array] wording is a bit +inconsistent with that of other sequences: that's not a problem in +itself, but compare it for instance with "A vector is a kind of +sequence that supports random access iterators"; though the intent is +obvious one might argue that the wording used for arrays doesn't tell +what an array is, and relies on the reader to infer that it is what +the <array> header defines. +

+

+* it would be desiderable to have a static const data member of type +std::size_t, with value N, for usage as integral constant expression +

+

+* section 23.1 [lib.container.requirements] seem not to consider +fixed-size containers at all, as it says: "[containers] control +allocation and deallocation of these objects [the contained objects] +through constructors, destructors, *insert and erase* operations" +

+

+* max_size() isn't specified: the result is obvious but, technically, +it relies on table 80: "size() of the largest possible container" +which, again, doesn't seem to consider fixed size containers +

+ + +

Proposed resolution:

+

+

+ + +

[ +Kona (2007): requirements on zero sized tr1::arrays and other details +Issue 617: std::array is a sequence that doesn't satisfy the sequence +requirements? Alisdair will prepare a paper. Proposed Disposition: Open +]

+ + + + + +
+

595. TR1/C++0x: fabs(complex<T>) redundant / wrongly specified

+

Section: 26.3.7 [complex.value.ops] Status: Ready + Submitter: Stefan Große Pawig Date: 2006-09-24

+

View all issues with Ready status.

+

Discussion:

+

+TR1 introduced, in the C compatibility chapter, the function +fabs(complex<T>): +

+
----- SNIP -----
+8.1.1 Synopsis                                [tr.c99.cmplx.syn]
+
+  namespace std {
+  namespace tr1 {
+[...]
+  template<class T> complex<T> fabs(const complex<T>& x);
+  } // namespace tr1
+  } // namespace std
+
+[...]
+
+8.1.8 Function fabs                          [tr.c99.cmplx.fabs]
+
+1 Effects: Behaves the same as C99 function cabs, defined in
+  subclause 7.3.8.1.
+----- SNIP -----
+
+ +

+The current C++0X draft document (n2009.pdf) adopted this +definition in chapter 26.3.1 (under the comment // 26.3.7 values) +and 26.3.7/7. +

+

+But in C99 (ISO/IEC 9899:1999 as well as the 9899:TC2 draft document +n1124), the referenced subclause reads +

+ +
----- SNIP -----
+7.3.8.1 The cabs functions
+
+  Synopsis
+
+1 #include <complex.h>
+  double cabs(double complex z);
+  float cabsf(float complex z);
+  long double cabsl(long double z);
+
+  Description
+
+2 The cabs functions compute the complex absolute value (also called
+  norm, modulus, or magnitude) of z.
+
+  Returns
+
+3 The cabs functions return the complex absolute value.
+----- SNIP -----
+
+ +

+Note that the return type of the cabs*() functions is not a complex +type. Thus, they are equivalent to the already well established + template<class T> T abs(const complex<T>& x); +(26.2.7/2 in ISO/IEC 14882:1998, 26.3.7/2 in the current draft +document n2009.pdf). +

+

+So either the return value of fabs() is specified wrongly, or fabs() +does not behave the same as C99's cabs*(). +

+ +Possible Resolutions + +

+This depends on the intention behind the introduction of fabs(). +

+

+If the intention was to provide a /complex/ valued function that +calculates the magnitude of its argument, this should be +explicitly specified. In TR1, the categorization under "C +compatibility" is definitely wrong, since C99 does not provide +such a complex valued function. +

+

+Also, it remains questionable if such a complex valued function +is really needed, since complex<T> supports construction and +assignment from real valued arguments. There is no difference +in observable behaviour between +

+
  complex<double> x, y;
+  y = fabs(x);
+  complex<double> z(fabs(x));
+
+

+and +

+
  complex<double> x, y;
+  y = abs(x);
+  complex<double> z(abs(x));
+
+

+If on the other hand the intention was to provide the intended +functionality of C99, fabs() should be either declared deprecated +or (for C++0X) removed from the standard, since the functionality +is already provided by the corresponding overloads of abs(). +

+ + + +

Proposed resolution:

+ +

+Change the synopsis in 26.3.1 [complex.synopsis]: +

+ +
template<class T> complex<T> fabs(const complex<T>&);
+
+ +

+Change 26.3.7 [complex.value.ops], p7: +

+ +
+
template<class T> complex<T> fabs(const complex<T>& x);
+
+
+

+-7- Effects: Behaves the same as C99 function cabs, defined in subclause 7.3.8.1. +

+
+
+ + + +

[ +Kona (2007): Change the return type of fabs(complex) to T. +Proposed Disposition: Ready +]

+ + + + + +
+

596. 27.8.1.3 Table 112 omits "a+" and "a+b" modes

+

Section: 27.8.1.4 [filebuf.members] Status: Review + Submitter: Thomas Plum Date: 2006-09-26

+

View other active issues in [filebuf.members].

+

View all other issues in [filebuf.members].

+

View all issues with Review status.

+

Discussion:

+

+In testing 27.8.1.4 [filebuf.members], Table 112 (in the latest N2009 draft), we invoke +

+
   ostr.open("somename", ios_base::out | ios_base::in | ios_base::app)
+
+

+and we expect the open to fail, because out|in|app is not listed in +Table 92, and just before the table we see very specific words: +

+

+ If mode is not some combination of flags shown in the table + then the open fails. +

+

+But the corresponding table in the C standard, 7.19.5.3, provides two +modes "a+" and "a+b", to which the C++ modes out|in|app and +out|in|app|binary would presumably apply. +

+

+We would like to argue that the intent of Table 112 was to match the +semantics of 7.19.5.3 and that the omission of "a+" and "a+b" was +unintentional. (Otherwise there would be valid and useful behaviors +available in C file I/O which are unavailable using C++, for no +valid functional reason.) +

+

+We further request that the missing modes be explicitly restored to +the WP, for inclusion in C++0x. +

+ +

[ +Martin adds: +]

+ + +

+...besides "a+" and "a+b" the C++ table is also missing a row +for a lone app bit which in at least two current implementation +as well as in Classic Iostreams corresponds to the C stdio "a" +mode and has been traditionally documented as implying ios::out. +Which means the table should also have a row for in|app meaning +the same thing as "a+" already proposed in the issue. +

+ + +

Proposed resolution:

+

+Add to the table "File open modes" in 27.8.1.4 [filebuf.members]: +

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
File open modes
ios_base Flag combinationstdio equivalent
binaryinouttruncapp 
    +     "w"
    +   + "a"
        + "a"
    + +   "w"
  +       "r"
  + +     "r+"
  + + +   "w+"
  + +   + "a+"
  +     + "a+"
+   +     "wb"
+   +   + "ab"
+       + "ab"
+   + +   "wb"
+ +       "rb"
+ + +     "r+b"
+ + + +   "w+b"
+ + +   + "a+b"
+ +     + "a+b"
+
+ + + +

[ +Kona (2007) Added proposed wording and moved to Review. +]

+ + + + + +
+

597. Decimal: The notion of 'promotion' cannot be emulated by user-defined types.

+

Section: TRDecimal 3.2 [trdec.types.types] Status: Open + Submitter: Daveed Vandevoorde Date: 2006-04-05

+

View other active issues in [trdec.types.types].

+

View all other issues in [trdec.types.types].

+

View all issues with Open status.

+

Discussion:

+

+In a private email, Daveed writes: +

+
+

+I am not familiar with the C TR, but my guess is that the +class type approach still won't match a built-in type +approach because the notion of "promotion" cannot be +emulated by user-defined types. +

+

+Here is an example: +

+
+
+		 struct S {
+		   S(_Decimal32 const&);  // Converting constructor
+		 };
+		 void f(S);
+
+		 void f(_Decimal64);
+
+		 void g(_Decimal32 d) {
+		   f(d);
+		 }
+
+ +
+

+If _Decimal32 is a built-in type, the call f(d) will likely +resolve to f(_Decimal64) because that requires only a +promotion, whereas f(S) requires a user-defined conversion. +

+

+If _Decimal32 is a class type, I think the call f(d) will be +ambiguous because both the conversion to _Decimal64 and the +conversion to S will be user-defined conversions with neither +better than the other. +

+
+

+Robert comments: +

+

In general, a library of arithmetic types cannot exactly emulate the +behavior of the intrinsic numeric types. There are several ways to tell +whether an implementation of the decimal types uses compiler +intrinisics or a library. For example: +

+
                 _Decimal32 d1;
+                 d1.operator+=(5);  // If d1 is a builtin type, this won't compile.
+
+

+In preparing the decimal TR, we have three options: +

+
    +
  1. require that the decimal types be class types
  2. +
  3. require that the decimal types be builtin types, like float and double
  4. +
  5. specify a library of class types, but allow enough implementor +latitude that a conforming implementation could instead provide builtin +types
  6. +
+

+We decided as a group to pursue option #3, but that approach implies +that implementations may not agree on the semantics of certain use +cases (first example, above), or on whether certain other cases are +well-formed (second example). Another potentially important problem is +that, under the present definition of POD, the decimal classes are not +POD types, but builtins will be. +

+

Note that neither example above implies any problems with respect to +C-to-C++ compatibility, since neither example can be expressed in C. +

+ + +

Proposed resolution:

+ + + + + +
+

606. Decimal: allow narrowing conversions

+

Section: TRDecimal 3.2 [trdec.types.types] Status: Open + Submitter: Martin Sebor Date: 2006-06-15

+

View other active issues in [trdec.types.types].

+

View all other issues in [trdec.types.types].

+

View all issues with Open status.

+

Discussion:

+

+In c++std-lib-17205, Martin writes: +

+

...was it a deliberate design choice to make narrowing +assignments ill-formed while permitting narrowing compound assignments? +For instance: +

+
      decimal32 d32;
+      decimal64 d64;
+
+      d32 = 64;     // error
+      d32 += 64;    // okay
+
+

+In c++std-lib-17229, Robert responds: +

+

It is a vestige of an old idea that I forgot to remove +from the paper. Narrowing assignments should be permitted. The bug is +that the converting constructors that cause narrowing should not be +explicit. Thanks for pointing this out. +

+ +

Proposed resolution:

+

+1. In "3.2.2 Class decimal32" synopsis, remove the explicit specifier from the narrowing conversions: +

+
                // 3.2.2.2 conversion from floating-point type:
+                explicit decimal32(decimal64 d64);
+                explicit decimal32(decimal128 d128);
+
+

+2. Do the same thing in "3.2.2.2. Conversion from floating-point type." +

+

+3. In "3.2.3 Class decimal64" synopsis, remove the explicit specifier from the narrowing conversion: +

+
                // 3.2.3.2 conversion from floating-point type:
+                explicit decimal64(decimal128 d128);
+
+

+4. Do the same thing in "3.2.3.2. Conversion from floating-point type." +

+ +

[ +Redmond: We prefer explicit conversions for narrowing and implicit for widening. +]

+ + + + + + +
+

612. numeric_limits::is_modulo insufficently defined

+

Section: 18.2.1.2 [numeric.limits.members] Status: Open + Submitter: Chris Jefferson Date: 2006-11-10

+

View all other issues in [numeric.limits.members].

+

View all issues with Open status.

+

Discussion:

+

+18.2.1.2 55 states that "A type is modulo if it is possible to add two +positive numbers together and have a result that wraps around to a +third number that is less". +This seems insufficent for the following reasons: +

+ +
    +
  1. Doesn't define what that value recieved is.
  2. +
  3. Doesn't state the result is repeatable
  4. +
  5. Doesn't require that doing addition, subtraction and other +operations on all values is defined behaviour.
  6. +
+ +

[ +Batavia: Related to +N2144. +Pete: is there an ISO definition of modulo? Underflow on signed behavior is undefined. +]

+ + + +

Proposed resolution:

+

+Suggest 18.2.1.2 [numeric.limits.members[numeric.limits.members], paragraph 57 is ammeded to: +

+ +

+A type is modulo if, it is possible to add two positive numbers +and have a result that wraps around to a third number that is less. +given any operation involving +,- or * on values of that type whose value +would fall outside the range [min(), max()], then the value returned +differs from the true value by an integer multiple of (max() - min() + +1). +

+ + + + + + +
+

614. std::string allocator requirements still inconsistent

+

Section: 21.3 [basic.string] Status: Open + Submitter: Bo Persson Date: 2006-12-05

+

View other active issues in [basic.string].

+

View all other issues in [basic.string].

+

View all issues with Open status.

+

Discussion:

+

+This is based on N2134, where 21.3.1/2 states: +"... The Allocator object used shall be a copy of the Allocator object +passed to the basic_string object's constructor or, if the constructor does +not take an Allocator argument, a copy of a default-constructed Allocator +object." +

+

+Section 21.3.2/1 lists two constructors: +

+
basic_string(const basic_string<charT,traits,Allocator>& str );
+
+basic_string(const basic_string<charT,traits,Allocator>& str ,
+             size_type pos , size_type n = npos,
+             const Allocator& a = Allocator());
+
+

+and then says "In the first form, the Allocator value used is copied from +str.get_allocator().", which isn't an option according to 21.3.1. +

+

[ +Batavia: We need blanket statement to the effect of: +]

+ + +
    +
  1. If an allocator is passed in, use it, or,
  2. +
  3. If a string is passed in, use its allocator.
  4. +
+

[ +Review constructors and functions that return a string; make sure we follow these +rules (substr, operator+, etc.). Howard to supply wording. +]

+ + +

[ +Bo adds: The new container constructor which takes only a size_type is not +consistent with 23.1 [container.requirements], p9 which says in part: + +

+All other constructors for these container types take an +Allocator& argument (20.1.2), an allocator whose value type +is the same as the container's value type. A copy of this argument is +used for any memory allocation performed, by these constructors and by +all member functions, during the lifetime of each container object. +
+]

+ + + +

Proposed resolution:

+

+

+ + + + + +
+

617. std::array is a sequence that doesn't satisfy the sequence requirements?

+

Section: 23.2.1 [array] Status: New + Submitter: Bo Persson Date: 2006-12-30

+

View other active issues in [array].

+

View all other issues in [array].

+

View all issues with New status.

+

Discussion:

+

+The <array> header is given under 23.2 [sequences]. +23.2.1 [array]/paragraph 3 says: +

+

+"Unless otherwise specified, all array operations are as described in +23.1 [container.requirements]". +

+

+However, array isn't mentioned at all in section 23.1 [container.requirements]. +In particular, Table 82 "Sequence requirements" lists several operations (insert, erase, clear) +that std::array does not have in 23.2.1 [array]. +

+

+Also, Table 83 "Optional sequence operations" lists several operations that +std::array does have, but array isn't mentioned. +

+ + +

Proposed resolution:

+

+

+ + + + + +
+

618. valarray::cshift() effects on empty array

+

Section: 26.5.2.7 [valarray.members] Status: Review + Submitter: Gabriel Dos Reis Date: 2007-01-10

+

View all issues with Review status.

+

Discussion:

+

+I would respectfully request an issue be opened with the intention to +clarify the wording for size() == 0 for cshift. +

+ + +

Proposed resolution:

+

+Change 26.5.2.7 [valarray.members], paragraph 10: +

+ +
+ +
valarray<T> cshift(int n) const;
+
+ +
+

+This function returns an object of class valarray<T>, of +length size(), each of whose elements I is +(*this)[(I + n ) % size()]. Thus, if element zero is taken as +the leftmost element, a positive value of n shifts the elements +circularly left n places. that is a circular shift of *this. If +element zero is taken as the leftmost element, a non-negative value of +n shifts the elements circularly left n places and a +negative value of n shifts the elements circularly right +-n places. +

+
+
+ + + +

Rationale:

+

+We do not believe that there is any real ambiguity about what happens +when size() == 0, but we do believe that spelling this out as a C++ +expression causes more trouble that it solves. The expression is +certainly wrong when n < 0, since the sign of % with negative arguments +is implementation defined. +

+ + +

[ +Kona (2007) Changed proposed wording, added rationale and set to Review. +]

+ + + + + +
+

620. valid uses of empty valarrays

+

Section: 26.5.2.1 [valarray.cons] Status: Ready + Submitter: Martin Sebor Date: 2007-01-20

+

View other active issues in [valarray.cons].

+

View all other issues in [valarray.cons].

+

View all issues with Ready status.

+

Discussion:

+

+ +The Effects clause for the default valarray ctor +suggests that it is possible to increase the size of an empty +valarray object by calling other non-const member +functions of the class besides resize(). However, such an +interpretation would be contradicted by the requirement on the copy +assignment operator (and apparently also that on the computed +assignments) that the assigned arrays be the same size. See the +reflector discussion starting with c++std-lib-17871. + +

+

+ +In addition, Footnote 280 uses some questionable normative +language. + +

+ + +

Proposed resolution:

+

+ +Reword the Effects clause and Footnote 280 as follows (26.5.2.1 [valarray.cons]): + +

+
+

+ +valarray(); + +

+

+ +Effects: Constructs an object of class +valarray<T>,279) which has zero +length until it is passed into a library function as a modifiable +lvalue or through a non-constant this pointer.280) + +

+

+ +Postcondition: size() == 0. + +

+

+ +Footnote 280: This default constructor is essential, since +arrays of valarray are likely to prove useful. +There shall also be a way to change the size of an array after +initialization; this is supplied by the semantics may be +useful. The length of an empty array can be increased after +initialization by means of the resize() member +function. + +

+
+ + + + + +
+

621. non-const copy assignment operators of helper arrays

+

Section: 26.5 [numarray] Status: Ready + Submitter: Martin Sebor Date: 2007-01-20

+

View all other issues in [numarray].

+

View all issues with Ready status.

+

Discussion:

+

+ +The computed and "fill" assignment operators of valarray +helper array class templates (slice_array, +gslice_array, mask_array, and +indirect_array) are const member functions of each class +template (the latter by the resolution of 123 +since they have reference semantics and thus do not affect +the state of the object on which they are called. However, the copy +assignment operators of these class templates, which also have +reference semantics, are non-const. The absence of constness opens +the door to speculation about whether they really are intended to have +reference semantics (existing implementations vary widely). + +

+ +

+Pre-Kona, Martin adds: +

+ +

+I realized that adding the const qualifier to the +functions as I suggested would break the const correctness of the +classes. A few possible solutions come to mind: +

+ +
    +
  1. Add the const qualifier to the return types of these functions.
  2. +
  3. Change the return type of all the functions to void to match +the signatures of all the other assignment operators these classes +define.
  4. +
  5. Prohibit the copy assignment of these classes by declaring the +copy assignment operators private (as is done and documented by +some implementations).
  6. +
+ + + +

Proposed resolution:

+

+ +Declare the copy assignment operators of all four helper array +class templates const. + +

+

+ +Specifically, make the following edits: + +

+

+ +Change the signature in 26.5.5 [template.slice.array] and +26.5.5.1 [slice.arr.assign] as follows: + +

+
+const slice_array& operator= (const slice_array&) const;
+
+        
+

+ +Change the signature in 26.5.7 [template.gslice.array] and +26.5.7.1 [gslice.array.assign] as follows: + +

+
+const gslice_array& operator= (const gslice_array&) const;
+
+        
+

+ +Change the signature in 26.5.8 [template.mask.array] and 26.5.8.1 [mask.array.assign] as +follows: + +

+
+const mask_array& operator= (const mask_array&) const;
+
+        
+

+ +Change the signature in 26.5.9 [template.indirect.array] and +26.5.9.1 [indirect.array.assign] as follows: + +

+
+const indirect_array& operator= (const indirect_array&) const;
+
+        
+ + +

[ +Kona (2007) Added const qualification to the return types and set to Ready. +]

+ + + + + +
+

622. behavior of filebuf dtor and close on error

+

Section: 27.8.1.17 [fstream.members] Status: Ready + Submitter: Martin Sebor Date: 2007-01-20

+

View all issues with Ready status.

+

Discussion:

+

+ +basic_filebuf dtor is specified to have the following +straightforward effects: + +

+

+ +Effects: Destroys an object of class +basic_filebuf. Calls close(). + +

+

+ +close() does a lot of potentially complicated processing, +including calling overflow() to write out the termination +sequence (to bring the output sequence to its initial shift +state). Since any of the functions called during the processing can +throw an exception, what should the effects of an exception be on the +dtor? Should the dtor catch and swallow it or should it propagate it +to the caller? The text doesn't seem to provide any guidance in this +regard other than the general restriction on throwing (but not +propagating) exceptions from destructors of library classes in +17.4.4.8 [res.on.exception.handling]. + +

+

+ +Further, the last thing close() is specified to do is +call fclose() to close the FILE pointer. The +last sentence of the Effects clause reads: + +

+

+ +... If any of the calls to overflow or +std::fclose fails then close fails. + +

+

+ +This suggests that close() might be required to call +fclose() if and only if none of the calls to +overflow() fails, and avoid closing the FILE +otherwise. This way, if overflow() failed to flush out +the data, the caller would have the opportunity to try to flush it +again (perhaps after trying to deal with whatever problem may have +caused the failure), rather than losing it outright. + +

+

+ +On the other hand, the function's Postcondition specifies that +is_open() == false, which suggests that it should call +fclose() unconditionally. However, since +Postcondition clauses are specified for many functions in the +standard, including constructors where they obviously cannot apply +after an exception, it's not clear whether this Postcondition +clause is intended to apply even after an exception. + +

+

+ +It might be worth noting that the traditional behavior (Classic +Iostreams fstream::close() and C fclose()) +is to close the FILE unconditionally, regardless of +errors. + +

+ +

[ +See 397 and 418 for related issues. +]

+ + + + +

Proposed resolution:

+

+ +After discussing this on the reflector (see the thread starting with +c++std-lib-17650) we propose that close() be clarified to +match the traditional behavior, that is to close the FILE +unconditionally, even after errors or exceptions. In addition, we +propose the dtor description be amended so as to explicitly require it +to catch and swallow any exceptions thrown by close(). + +

+

+ +Specifically, we propose to make the following edits in +27.8.1.4 [filebuf.members]: + +

+
+
+basic_filebuf<charT,traits>* close();
+
+            
+

+ +Effects: If is_open() == false, returns a null +pointer. If a put area exists, calls +overflow(traits::eof()) to flush characters. If the last +virtual member function called on *this (between +underflow, overflow, seekoff, +and seekpos) was overflow then calls +a_codecvt.unshift (possibly several times) to determine a +termination sequence, inserts those characters and calls +overflow(traits::eof()) again. Finally, regardless +of whether any of the preceding calls fails or throws an exception, +the function it closes the file ("as if" by calling +std::fclose(file)).334) If any of the calls +made by the functionto overflow +or, including std::fclose, +fails then close fails by returning a null pointer. +If one of these calls throws an exception, the exception is caught and +rethrown after closing the file. + +

+
+

+ +And to make the following edits in 27.8.1.2 [filebuf.cons]. + +

+
+
+virtual ~basic_filebuf();
+
+            
+

+ +Effects: Destroys an object of class +basic_filebuf<charT,traits>. Calls +close(). If an exception occurs during the +destruction of the object, including the call to close(), +the exception is caught but not rethrown (see +17.4.4.8 [res.on.exception.handling]). + +

+
+ + + + + +
+

623. pubimbue forbidden to call imbue

+

Section: 27.1.1 [iostream.limits.imbue] Status: Ready + Submitter: Martin Sebor Date: 2007-01-20

+

View all issues with Ready status.

+

Discussion:

+

+ +27.1.1 [iostream.limits.imbue] specifies that "no function described in +clause 27 except for ios_base::imbue causes any instance +of basic_ios::imbue or +basic_streambuf::imbue to be called." + +

+

+ +That contradicts the Effects clause for +basic_streambuf::pubimbue() which requires the function +to do just that: call basic_streambuf::imbue(). + +

+ + +

Proposed resolution:

+

+ +To fix this, rephrase the sentence above to allow +pubimbue to do what it was designed to do. Specifically. +change 27.1.1 [iostream.limits.imbue], p1 to read: + +

+

+ +No function described in clause 27 except for +ios_base::imbue and basic_filebuf::pubimbue +causes any instance of basic_ios::imbue or +basic_streambuf::imbue to be called. ... + +

+ + + + + +
+

624. valarray assignment and arrays of unequal length

+

Section: 26.5.2.2 [valarray.assign] Status: Ready + Submitter: Martin Sebor Date: 2007-01-20

+

View all issues with Ready status.

+

Discussion:

+

+ +The behavior of the valarray copy assignment operator is +defined only when both sides have the same number of elements and the +spec is explicit about assignments of arrays of unequal lengths having +undefined behavior. + +

+

+ +However, the generalized subscripting assignment operators overloaded +on slice_array et al (26.5.2.2 [valarray.assign]) don't have any +such restriction, leading the reader to believe that the behavior of +these overloads is well defined regardless of the lengths of the +arguments. + +

+

+ +For example, based on the reading of the spec the behavior of the +snippet below can be expected to be well-defined: + +

+
    const std::slice from_0_to_3 (0, 3, 1);   // refers to elements 0, 1, 2
+    const std::valarray<int> a (1, 3);        // a = { 1, 1, 1 }
+    std::valarray<int>       b (2, 4);        // b = { 2, 2, 2, 2 }
+
+    b = a [from_0_to_3];
+        
+

+ +In practice, b may end up being { 1, 1, 1 }, +{ 1, 1, 1, 2 }, or anything else, indicating that +existing implementations vary. + +

+ +

+Quoting from Section 3.4, Assignment operators, of Al Vermeulen's +Proposal for Standard C++ Array Classes (see c++std-lib-704; +N0308): +

+

+ ...if the size of the array on the right hand side of the equal + sign differs from the size of the array on the left, a run time + error occurs. How this error is handled is implementation + dependent; for compilers which support it, throwing an exception + would be reasonable. +

+ +

+And see more history in +N0280. +

+ +

+ +It has been argued in discussions on the committee's reflector that +the semantics of all valarray assignment operators should +be permitted to be undefined unless the length of the arrays being +assigned is the same as the length of the one being assigned from. See +the thread starting at c++std-lib-17786. + +

+

+ +In order to reflect such views, the standard must specify that the +size of the array referred to by the argument of the assignment must +match the size of the array under assignment, for example by adding a +Requires clause to 26.5.2.2 [valarray.assign] as follows: + +

+

+ +Requires: The length of the array to which the argument refers +equals size(). + +

+ +

+ +Note that it's far from clear that such leeway is necessary in order +to implement valarray efficiently. + +

+ + +

Proposed resolution:

+

+Insert new paragraph into 26.5.2.2 [valarray.assign]: +

+ +
+
valarray<T>& operator=(const slice_array<T>&); 
+valarray<T>& operator=(const gslice_array<T>&); 
+valarray<T>& operator=(const mask_array<T>&); 
+valarray<T>& operator=(const indirect_array<T>&);
+
+
+

+Requires: The length of the array to which the argument refers +equals size(). +

+

+These operators allow the results of a generalized subscripting operation to be assigned directly to a valarray. +

+
+
+ + + + + +
+

625. mixed up Effects and Returns clauses

+

Section: 17 [library] Status: Open + Submitter: Martin Sebor Date: 2007-01-20

+

View all other issues in [library].

+

View all issues with Open status.

+

Discussion:

+

+ +Many member functions of basic_string are overloaded, +with some of the overloads taking a string argument, +others value_type*, others size_type, and +others still iterators. Often, the requirements on one of +the overloads are expressed in the form of Effects, +Throws, and in the Working Paper +(N2134) +also Remark clauses, while those on the rest of the overloads +via a reference to this overload and using a Returns clause. + +

+

+ +The difference between the two forms of specification is that per +17.3.1.3 [structure.specifications], p3, an Effects clause specifies +"actions performed by the functions," i.e., its observable +effects, while a Returns clause is "a description of the +return value(s) of a function" that does not impose any +requirements on the function's observable effects. + +

+

+ +Since only Notes are explicitly defined to be informative and +all other paragraphs are explicitly defined to be normative, like +Effects and Returns, the new Remark clauses also +impose normative requirements. + +

+

+ +So by this strict reading of the standard there are some member +functions of basic_string that are required to throw an +exception under some conditions or use specific traits members while +many other otherwise equivalent overloads, while obliged to return the +same values, aren't required to follow the exact same requirements +with regards to the observable effects. + +

+

+ +Here's an example of this problem that was precipitated by the change +from informative Notes to normative Remarks (presumably made to +address 424): + +

+

+ +In the Working Paper, find(string, size_type) contains a +Remark clause (which is just a Note in the current +standard) requiring it to use traits::eq(). + +

+

+ +find(const charT *s, size_type pos) is specified to +return find(string(s), pos) by a Returns clause +and so it is not required to use traits::eq(). However, +the Working Paper has replaced the original informative Note +about the function using traits::length() with a +normative requirement in the form of a Remark. Calling +traits::length() may be suboptimal, for example when the +argument is a very long array whose initial substring doesn't appear +anywhere in *this. + +

+

+ +Here's another similar example, one that existed even prior to the +introduction of Remarks: + +

+

+ + insert(size_type pos, string, size_type, size_type) is +required to throw out_of_range if pos > +size(). + +

+

+ +insert(size_type pos, string str) is specified to return +insert(pos, str, 0, npos) by a Returns clause and +so its effects when pos > size() are strictly speaking +unspecified. + + +

+ +I believe a careful review of the current Effects and +Returns clauses is needed in order to identify all such +problematic cases. In addition, a review of the Working Paper should +be done to make sure that the newly introduced normative Remark +clauses do not impose any undesirable normative requirements in place +of the original informative Notes. + +

+

[ +Batavia: Alan and Pete to work. +]

+ + + +

Proposed resolution:

+

+

+ + + + + +
+

626. new Remark clauses not documented

+

Section: 17.3.1.3 [structure.specifications] Status: Open + Submitter: Martin Sebor Date: 2007-01-20

+

View all other issues in [structure.specifications].

+

View all issues with Open status.

+

Discussion:

+

+ +The Remark clauses newly introduced into the Working Paper +(N2134) +are not mentioned in 17.3.1.3 [structure.specifications] where we list the +meaning of Effects, Requires, and other clauses (with +the exception of Notes which are documented as informative in +17.3.1.1 [structure.summary], p2, and which they replace in many cases). + +

+

+ +Propose add a bullet for Remarks along with a brief description. + +

+

[ +Batavia: Alan and Pete to work. +]

+ + + +

Proposed resolution:

+

+

+ + + + + +
+

627. Low memory and exceptions

+

Section: 18.5.1.1 [new.delete.single] Status: Open + Submitter: P.J. Plauger Date: 2007-01-23

+

View all other issues in [new.delete.single].

+

View all issues with Open status.

+

Discussion:

+

+I recognize the need for nothrow guarantees in the exception reporting +mechanism, but I strongly believe that implementors also need an escape hatch +when memory gets really low. (Like, there's not enough heap to construct and +copy exception objects, or not enough stack to process the throw.) I'd like to +think we can put this escape hatch in 18.5.1.1 [new.delete.single], +operator new, but I'm not sure how to do it. We need more than a +footnote, but the wording has to be a bit vague. The idea is that if +new can't allocate something sufficiently small, it has the right to +abort/call terminate/call unexpected. +

+ + +

Proposed resolution:

+

+

+ + + + + +
+

629. complex insertion and locale dependence

+

Section: 26.3.6 [complex.ops] Status: Open + Submitter: Gabriel Dos Reis Date: 2007-01-28

+

View all other issues in [complex.ops].

+

View all issues with Open status.

+

Discussion:

+

+is there an issue opened for (0,3) as complex number with +the French local? With the English local, the above parses as an +imaginery complex number. With the French locale it parses as a +real complex number. +

+ +

+Further notes/ideas from the lib-reflector, messages 17982-17984: +

+ +
+

+Add additional entries in num_punct to cover the complex separator (French would be ';'). +

+

+Insert a space before the comma, which should eliminate the ambiguity. +

+

+Solve the problem for ordered sequences in general, perhaps with a +dedicated facet. Then complex should use that solution. +

+
+ + + +

Proposed resolution:

+

+

+ + + + + +
+

630. arrays of valarray

+

Section: 26.5.2.1 [valarray.cons] Status: Open + Submitter: Martin Sebor Date: 2007-01-28

+

View other active issues in [valarray.cons].

+

View all other issues in [valarray.cons].

+

View all issues with Open status.

+

Discussion:

+

+ +Section 26.1 [numeric.requirements], p1 suggests that a +valarray specialization on a type T that +satisfies the requirements enumerated in the paragraph is itself a +valid type on which valarray may be instantiated +(Footnote 269 makes this clear). I.e., +valarray<valarray<T> > is valid as long as +T is valid. However, since implementations of +valarray are permitted to initialize storage allocated by +the class by invoking the default ctor of T followed by +the copy assignment operator, such implementations of +valarray wouldn't work with (perhaps user-defined) +specializations of valarray whose assignment operator had +undefined behavior when the size of its argument didn't match the size +of *this. By "wouldn't work" I mean that it would +be impossible to resize such an array of arrays by calling the +resize() member function on it if the function used the +copy assignment operator after constructing all elements using the +default ctor (e.g., by invoking new value_type[N]) to +obtain default-initialized storage) as it's permitted to do. + +

+

+ +Stated more generally, the problem is that +valarray<valarray<T> >::resize(size_t) isn't +required or guaranteed to have well-defined semantics for every type +T that satisfies all requirements in +26.1 [numeric.requirements]. + +

+

+ +I believe this problem was introduced by the adoption of the +resolution outlined in N0857, +Assignment of valarrays, from 1996. The copy assignment +operator of the original numerical array classes proposed in N0280, +as well as the one proposed in N0308 +(both from 1993), had well-defined semantics for arrays of unequal +size (the latter explicitly only when *this was empty; +assignment of non empty arrays of unequal size was a runtime error). + +

+

+ +The justification for the change given in N0857 was the "loss of +performance [deemed] only significant for very simple operations on +small arrays or for architectures with very few registers." + +

+

+ +Since tiny arrays on a limited subset of hardware architectures are +likely to be an exceedingly rare case (despite the continued +popularity of x86) I propose to revert the resolution and make the +behavior of all valarray assignment operators +well-defined even for non-conformal arrays (i.e., arrays of unequal +size). I have implemented this change and measured no significant +degradation in performance in the common case (non-empty arrays of +equal size). I have measured a 50% (and in some cases even greater) +speedup in the case of assignments to empty arrays versus calling +resize() first followed by an invocation of the copy +assignment operator. + +

+ + +

Proposed resolution:

+

+ +Change 26.5.2.2 [valarray.assign], p1 as follows: + +

+
+

+ + +valarray<T>& operator=(const valarray<T>& x); + + +

+

+ +-1- Each element of the *this array is assigned the value +of the corresponding element of the argument array. The +resulting behavior is undefined if When the length of +the argument array is not equal to the length of the *this +array. resizes *this to make the two +arrays the same length, as if by calling +resize(x.size()), before performing the assignment. + +

+
+

+ +And add a new paragraph just below paragraph 1 with the following +text: + +

+
+

+ +-2- Postcondition: size() == x.size(). + +

+
+

+ +Also add the following paragraph to 26.5.2.2 [valarray.assign], immediately after p4: + +

+
+

+ +-?- When the length, N of the array referred +to by the argument is not equal to the length of *this, +the operator resizes *this to make the two arrays the +same length, as if by calling resize(N), before +performing the assignment. + +

+
+ + +

[ +Kona (2007): Gaby to propose wording for an alternative resolution in +which you can assign to a valarray of size 0, but not to any other +valarray whose size is unequal to the right hand side of the assignment. +]

+ + + + + +
+

631. conflicting requirements for BinaryPredicate

+

Section: 25 [algorithms] Status: Open + Submitter: James Kanze Date: 2007-01-31

+

View all other issues in [algorithms].

+

View all issues with Open status.

+

Discussion:

+

+The general requirements for BinaryPredicate (in 25 [algorithms]/8) contradict the implied specific requirements for +some functions. In particular, it says that: +

+ +

+[...] if an algorithm takes BinaryPredicate binary_pred +as its argument and first1 and first2 as its +iterator arguments, it should work correctly in the construct if +(binary_pred (*first1 , *first2 )){...}. +BinaryPredicate always takes the first iterator type as its +first argument, that is, in those cases when T value is +part of the signature, it should work correctly in the context of if +(binary_pred (*first1 , value)){...}. +

+ +

+In the description of upper_bound (25.3.3.2 [upper.bound]/2), however, the use is described as +"!comp(value, e)", where e is an +element of the sequence (a result of dereferencing +*first). +

+ +

+In the description of lexicographical_compare, we have both +"*first1 < *first2" and "*first2 +< *first1" (which presumably implies "comp( +*first1, *first2 )" and "comp( *first2, +*first1 )". +

+ +

[ +Toronto: Moved to Open. ConceptGCC seems to get lower_bound +and upper_bound to work withoutt these changes. +]

+ + + + +

Proposed resolution:

+

+Logically, the BinaryPredicate is used as an ordering +relationship, with the semantics of "less than". Depending on the +function, it may be used to determine equality, or any of the inequality +relationships; doing this requires being able to use it with either +parameter first. I would thus suggest that the requirement be: +

+ +

+[...] BinaryPredicate always takes the first iterator +value_type as one of its arguments, it is unspecified which. If +an algorithm takes BinaryPredicate binary_pred as its +argument and first1 and first2 as its +iterator arguments, it should work correctly both in the construct +if (binary_pred (*first1 , *first2 )){...} and +if (binary_pred (*first2, *first1)){...}. In +those cases when T value is part of the signature, it +should work correctly in the context of if (binary_pred +(*first1 , value)){...} and of if (binary_pred +(value, *first1)){...}. [Note: if the two +types are not identical, and neither is convertable to the other, this +may require that the BinaryPredicate be a functional object +with two overloaded operator()() functions. --end note] +

+ +

+Alternatively, one could specify an order for each function. IMHO, this +would be more work for the committee, more work for the implementors, +and of no real advantage for the user: some functions, such as +lexicographical_compare or equal_range, will still require both +functions, and it seems like a much easier rule to teach that both +functions are always required, rather than to have a complicated list of +when you only need one, and which one. +

+ + + + + +
+

632. Time complexity of size() for std::set

+

Section: 23.1 [container.requirements] Status: Open + Submitter: Lionel B Date: 2007-02-01

+

View other active issues in [container.requirements].

+

View all other issues in [container.requirements].

+

View all issues with Open status.

+

Discussion:

+

+A recent news group discussion: +

+
+

+Anyone know if the Standard has anything to say about the time complexity +of size() for std::set? I need to access a set's size (/not/ to know if it is empty!) heavily +during an algorithm and was thus wondering whether I'd be better off +tracking the size "manually" or whether that'd be pointless. +

+

+That would be pointless. size() is O(1). +

+

+Nit: the standard says "should" have constant time. Implementations may take +license to do worse. I know that some do this for std::list<> as a part of +some trade-off with other operation. +

+ +

+I was aware of that, hence my reluctance to use size() for std::set. +

+

+However, this reason would not apply to std::set<> as far as I can see. +

+

+Ok, I guess the only option is to try it and see... +

+
+ +

+If I have any recommendation to the C++ Standards Committee it is that +implementations must (not "should"!) document clearly[1], where known, the +time complexity of *all* container access operations. +

+

+[1] In my case (gcc 4.1.1) I can't swear that the time complexity of size() +for std::set is not documented... but if it is it's certainly well hidden +away. +

+ + +

Proposed resolution:

+

+

+ + +

[ +Kona (2007): This issue affects all the containers. We'd love to see a +paper dealing with the broad issue. We think that the complexity of the +size() member of every container -- except possibly list -- should be +O(1). Alan has volunteered to provide wording. +]

+ + + + + +
+

635. domain of allocator::address

+

Section: 20.1.2 [allocator.requirements] Status: Open + Submitter: Howard Hinnant Date: 2007-02-08

+

View other active issues in [allocator.requirements].

+

View all other issues in [allocator.requirements].

+

View all issues with Open status.

+

Discussion:

+

+The table of allocator requirements in 20.1.2 [allocator.requirements] describes +allocator::address as: +

+
a.address(r)
+a.address(s)
+
+

+where r and s are described as: +

+

+a value of type X::reference obtained by the expression *p. +

+ +

+and p is +

+ +

+a value of type X::pointer, obtained by calling a1.allocate, +where a1 == a +

+ +

+This all implies that to get the address of some value of type T that +value must have been allocated by this allocator or a copy of it. +

+ +

+However sometimes container code needs to compare the address of an external value of +type T with an internal value. For example list::remove(const T& t) +may want to compare the address of the external value t with that of a value +stored within the list. Similarly vector or deque insert may +want to make similar comparisons (to check for self-referencing calls). +

+ +

+Mandating that allocator::address can only be called for values which the +allocator allocated seems overly restrictive. +

+ + + +

Proposed resolution:

+

+Change 20.1.2 [allocator.requirements]: +

+ +
+

+r : a value of type X::reference obtained by the expression *p. +

+

+s : a value of type X::const_reference obtained by the +expression *q or by conversion from a value r. +

+
+ +

[ +post Oxford: This would be rendered NAD Editorial by acceptance of +N2257. +]

+ + +

[ +Kona (2007): This issue is section 8 of N2387. There was some discussion of it but +no resolution to this issue was recorded. Moved to Open. +]

+ + + + + + + +
+

638. deque end invalidation during erase

+

Section: 23.2.2.3 [deque.modifiers] Status: Review + Submitter: Steve LoBasso Date: 2007-02-17

+

View all issues with Review status.

+

Discussion:

+

+The standard states at 23.2.2.3 [deque.modifiers]/4: +

+
deque erase(...)
+
+

+Effects: ... An erase at either end of the deque invalidates only +the iterators and the references to the erased elements. +

+
+

+This does not state that iterators to end will be invalidated. +It needs to be amended in such a way as to account for end invalidation. +

+

+Something like: +

+

+Any time the last element is erased, iterators to end are invalidated. +

+ +

+This would handle situations like: +

+
erase(begin(), end())
+erase(end() - 1)
+pop_back()
+resize(n, ...) where n < size()
+pop_front() with size() == 1
+
+
+ + + +

Proposed resolution:

+

+Change 23.2.2.3 [deque.modifiers], p4: +

+ +
+
iterator erase(const_iterator position); 
+iterator erase(const_iterator first, const_iterator last);
+
+ +
+

+-4- Effects: An erase in the middle of the deque +invalidates all the iterators and references to elements of the +deque and the past-the-end iterator. An erase at +either end of the deque invalidates only the iterators and the +references to the erased elements, except that erasing at the end +also invalidates the past-the-end iterator. +

+
+
+ + + +

[ +Kona (2007): Proposed wording added and moved to Review. +]

+ + + + + +
+

645. Missing members in match_results

+

Section: 28.10 [re.results] Status: Review + Submitter: Daniel Krügler Date: 2007-02-26

+

View other active issues in [re.results].

+

View all other issues in [re.results].

+

View all issues with Review status.

+

Discussion:

+

+According to the description given in 28.10 [re.results]/2 the class template +match_results "shall satisfy the requirements of a Sequence, [..], +except that only operations defined for const-qualified Sequences +are supported". +Comparing the provided operations from 28.10 [re.results]/3 with the +sequence/container tables 80 and 81 one recognizes the following +missing operations: +

+ +

+1) The members +

+ +
const_iterator rbegin() const;
+const_iterator rend() const;
+
+ +

+should exists because 23.1/10 demands these for containers +(all sequences are containers) which support bidirectional +iterators. Aren't these supported by match_result? This is not +explicitely expressed, but it's somewhat implied by two arguments: +

+

+(a) Several typedefs delegate to +iterator_traits<BidirectionalIterator>. +

+

+(b) The existence of const_reference operator[](size_type n) const +implies even random-access iteration. +I also suggest, that match_result should explicitly mention, +which minimum iterator category is supported and if this does +not include random-access the existence of operator[] is +somewhat questionable. +

+

+2) The new "convenience" members +

+
const_iterator cbegin() const;
+const_iterator cend() const;
+const_iterator crbegin() const;
+const_iterator crend() const;
+
+

+should be added according to tables 80/81. +

+ + +

Proposed resolution:

+

+Add the following members to the match_results synopsis after end() in 28.10 [re.results] +para 3: +

+ +
const_iterator cbegin() const; 
+const_iterator cend() const;
+
+ +

+In section 28.10.3 [re.results.acc] change: +

+ +
+
const_iterator begin() const;
+const_iterator cbegin() const;
+
+
+

+-7- Returns: A starting iterator that enumerates over all the sub-expressions stored in *this. +

+
+ +
const_iterator end() const;
+const_iterator cend() const;
+
+
+

+-8- Returns: A terminating iterator that enumerates over all the sub-expressions stored in *this. +

+
+
+ + + +

[ +Kona (2007): Voted to adopt proposed wording in +N2409 +except removing the entry in the table container requirements. Moved to Review. +]

+ + + + + +
+

653. Library reserved names

+

Section: 1.2 [intro.refs] Status: Open + Submitter: Alisdair Meredith Date: 2007-03-08

+

View all other issues in [intro.refs].

+

View all issues with Open status.

+

Discussion:

+

+

+
+

+1.2 [intro.refs] Normative references +

+ +

+The following standards contain provisions which, through reference in +this text, constitute provisions of this Interna- tional Standard. At +the time of publication, the editions indicated were valid. All +standards are subject to revision, and parties to agreements based on +this International Standard are encouraged to investigate the +possibility of applying the most recent editions of the standards +indicated below. Members of IEC and ISO maintain registers of currently +valid International Standards. +

+ +
    +
  • Ecma International, ECMAScript Language Specification, Standard +Ecma-262, third edition, 1999.
  • +
  • ISO/IEC 2382 (all parts), Information technology - Vocabulary
  • +
  • ISO/IEC 9899:1990, Programming languages - C
  • +
  • ISO/IEC 9899/Amd.1:1995, Programming languages - C, AMENDMENT 1: C +Integrity
  • +
  • ISO/IEC 9899:1999, Programming languages - C
  • +
  • ISO/IEC 9899:1999/Cor.1:2001 Programming languages - C
  • +
  • ISO/IEC 9899:1999/Cor.2:2004 Programming languages - C
  • +
  • ISO/IEC 9945:2003, Information Technology-Portable Operating System +Interface (POSIX)
  • +
  • ISO/IEC 10646-1:1993 Information technology - Universal Multiple-Octet +Coded Character Set (UCS) - Part 1: Architecture and Basic Multilingual +Plane
  • +
+
+ +

+I'm not sure how many of those reserve naming patterns that might affect +us, but I am equally sure I don't own a copy of any of these to check! +

+

+The point is to list the reserved naming patterns, rather than the +individual names themselves - although we may want to list C keywords +that are valid identifiers in C++ but likely to cause trouble in shared +headers (e.g. restrict) +

+ +

[ +Kona (2007): Recommend NAD. No one has identified a specific defect, just the possibility of one. +]

+ + +

[ +Post-Kona: Alisdair request Open. A good example of the problem was a +discussion of the system error proposal, where it was pointed out an all-caps +identifier starting with a capital E conflicted with reserved macro names for +both Posix and C. I had absolutely no idea of this rule, and suspect I was +not the only one in the room.
+
+Resolution will require someone with access to all the listed documents to +research their respective name reservation rules, or people with access to +specific documents add their rules to this issue until the list is complete. +]

+ + + + +

Proposed resolution:

+ + + + + +
+

659. istreambuf_iterator should have an operator->()

+

Section: 24.5.3 [istreambuf.iterator] Status: Open + Submitter: Niels Dekker Date: 2007-03-25

+

View all other issues in [istreambuf.iterator].

+

View all issues with Open status.

+

Discussion:

+

+Greg Herlihy has clearly demonstrated that a user defined input +iterator should have an operator->(), even if its +value type is a built-in type (comp.std.c++, "Re: Should any iterator +have an operator->() in C++0x?", March 2007).  And as Howard +Hinnant remarked in the same thread that the input iterator +istreambuf_iterator doesn't have one, this must be a +defect! +

+

+Based on Greg's example, the following code demonstrates the issue: +

 #include <iostream> 
+ #include <fstream>
+ #include <streambuf> 
+
+ typedef char C;
+ int main ()
+ {
+   std::ifstream s("filename", std::ios::in);
+   std::istreambuf_iterator<char> i(s);
+
+   (*i).~C();  // This is well-formed...
+   i->~C();  // ... so this should be supported!
+ }
+
+ +

+Of course, operator-> is also needed when the value_type of +istreambuf_iterator is a class. +

+

+The operator-> could be implemented in various ways.  For instance, +by storing the current value inside the iterator, and returning its +address.  Or by returning a proxy, like operator_arrow_proxy, from +http://www.boost.org/boost/iterator/iterator_facade.hpp +

+

+I hope that the resolution of this issue will contribute to getting a +clear and consistent definition of iterator concepts. +

+ + +

Proposed resolution:

+

+Add to the synopsis in 24.5.3 [istreambuf.iterator]: +

+ +
charT operator*() const;
+pointer operator->() const;
+istreambuf_iterator<charT,traits>& operator++();
+
+ +

+Change 24.5.3 [istreambuf.iterator], p1: +

+ +

+The class template istreambuf_iterator reads successive +characters from the streambuf for which it was constructed. +operator* provides access to the current input character, if +any. operator-> may return a proxy. Each time +operator++ is evaluated, the iterator advances to the next +input character. If the end of stream is reached +(streambuf_type::sgetc() returns traits::eof()), the +iterator becomes equal to the end of stream iterator value. The default +constructor istreambuf_iterator() and the constructor +istreambuf_iterator(0) both construct an end of stream iterator +object suitable for use as an end-of-range. +

+ + + +

[ +Kona (2007): The proposed resolution is inconsistent because the return +type of istreambuf_iterator::operator->() is specified to be pointer, +but the proposed text also states that "operator-> may return a proxy." +]

+ + +

[ +Niels Dekker (mailed to Howard Hinnant): +]

+ +
+

+The proposed resolution does +not seem inconsistent to me. istreambuf_iterator::operator->() should +have istreambuf_iterator::pointer as return type, and this return type +may in fact be a proxy. +

+

+AFAIK, the resolution of 445 ("iterator_traits::reference +unspecified for some iterator categories") implies that for any iterator +class Iter, the return type of operator->() is Iter::pointer, by +definition.  I don't think Iter::pointer needs to be a raw pointer. +

+

+Still I wouldn't mind if the text "operator-> may return a proxy" would +be removed from the resolution. I think it's up to the library +implementation, how to implement istreambuf_iterator::operator->().  As +longs as it behaves as expected: i->m should have the same effect as +(*i).m. Even for an explicit destructor call, i->~C().  The main issue +is just: istreambuf_iterator should have an operator->()! +

+
+ + + + +
+

661. New 27.6.1.2.2 changes make special extractions useless

+

Section: 27.6.1.2.2 [istream.formatted.arithmetic] Status: Ready + Submitter: Daniel Krügler Date: 2007-04-01

+

View other active issues in [istream.formatted.arithmetic].

+

View all other issues in [istream.formatted.arithmetic].

+

View all issues with Ready status.

+

Discussion:

+

+To the more drastic changes of 27.6.1.2.2 [istream.formatted.arithmetic] in the current draft N2134 belong +the explicit description of the extraction of the types short and int in +terms of as-if code fragments. +

+ +
    +
  1. +The corresponding as-if extractions in paragraph 2 and 3 will never +result in a change of the operator>> argument val, because the +contents of the local variable lval is in no case written into val. +Furtheron both fragments need a currently missing parentheses in the +beginning of the if-statement to be valid C++. +
  2. +
  3. I would like to ask whether the omission of a similar explicit +extraction of unsigned short and unsigned int in terms of long - +compared to their corresponding new insertions, as described in +27.6.2.6.2 [ostream.inserters.arithmetic], is a deliberate decision or +an +oversight. +
  4. +
+ + +

Proposed resolution:

+
    +
  1. +

    +In 27.6.1.2.2 [istream.formatted.arithmetic]/2 change the current as-if code fragment +

    +
    typedef num_get<charT,istreambuf_iterator<charT,traits> > numget;
    +iostate err = 0;
    +long lval;
    +use_facet<numget>(loc).get(*this, 0, *this, err, lval );
    +if (err == 0) {
    +  && if (lval < numeric_limits<short>::min() || numeric_limits<short>::max() < lval))
    +      err = ios_base::failbit;
    +  else
    +    val = static_cast<short>(lval);
    +}
    +setstate(err);
    +
    + +

    +Similarily in 27.6.1.2.2 [istream.formatted.arithmetic]/3 change the current as-if fragment +

    + +
    typedef num_get<charT,istreambuf_iterator<charT,traits> > numget;
    +iostate err = 0;
    +long lval;
    +use_facet<numget>(loc).get(*this, 0, *this, err, lval );
    +if (err == 0) {
    +  && if (lval < numeric_limits<int>::min() || numeric_limits<int>::max() < lval))
    +      err = ios_base::failbit;
    +  else
    +    val = static_cast<int>(lval);
    +}
    +setstate(err);
    +
    +
  2. +
  3. +--- +
  4. +
+ + +

[ +Kona (2007): Note to the editor: the name lval in the call to use_facet +is incorrectly italicized in the code fragments corresponding to +operator>>(short &) and operator >>(int &). Also, val -- which appears +twice on the line with the static_cast in the proposed resolution -- +should be italicized. Also, in response to part two of the issue: this +is deliberate. +]

+ + + + + +
+

664. do_unshift for codecvt<char, char, mbstate_t>

+

Section: 22.2.1.4.2 [locale.codecvt.virtuals] Status: Ready + Submitter: Thomas Plum Date: 2007-04-16

+

View other active issues in [locale.codecvt.virtuals].

+

View all other issues in [locale.codecvt.virtuals].

+

View all issues with Ready status.

+

Discussion:

+

+22.2.1.4.2 [locale.codecvt.virtuals], para 7 says (regarding do_unshift): +

+ +

+Effects: Places characters starting at to that should be appended to +terminate a sequence when the current stateT is given by +state.237) Stores no more than (to_limit - +to) destination elements, and leaves the to_next +pointer pointing one beyond the last element successfully stored. +codecvt<char, char, mbstate_t> stores no characters. +

+ +

+The following objection has been raised: +

+ +

+Since the C++ Standard permits a nontrivial conversion for the required +instantiations of codecvt, it is overly restrictive to say that +do_unshift must store no characters and return noconv. +

+ +

+[Plum ref _222152Y50] +

+ + +

Proposed resolution:

+

+Change 22.2.1.4.2 [locale.codecvt.virtuals], p7: +

+ +
+

+Effects: Places characters starting at to that should be +appended to terminate a sequence when the current stateT is +given by state.237) Stores no more than (to_limit -to) +destination elements, and leaves the to_next pointer pointing one +beyond the last element successfully stored. codecvt<char, char, +mbstate_t> stores no characters. +

+
+ + + + + +
+

665. do_unshift return value

+

Section: 22.2.1.4.2 [locale.codecvt.virtuals] Status: Ready + Submitter: Thomas Plum Date: 2007-04-16

+

View other active issues in [locale.codecvt.virtuals].

+

View all other issues in [locale.codecvt.virtuals].

+

View all issues with Ready status.

+

Discussion:

+

+22.2.1.4.2 [locale.codecvt.virtuals], para 8 says: +

+ +

+codecvt<char,char,mbstate_t>, returns noconv. +

+ +

+The following objection has been raised: +

+ +

+Despite what the C++ Standard  +says, unshift can't always return noconv for the default facets, since  +they can be nontrivial. At least one implementation does whatever the  +C functions do. +

+ +

+[Plum ref _222152Y62] +

+ + +

Proposed resolution:

+

+Change 22.2.1.4.2 [locale.codecvt.virtuals], p8: +

+ +
+

Returns: An enumeration value, as summarized in Table 76:

+

...

+

+codecvt<char,char,mbstate_t>, returns noconv. +

+
+ + + + + + +
+

666. moneypunct::do_curr_symbol()

+

Section: 22.2.6.3.2 [locale.moneypunct.virtuals] Status: Ready + Submitter: Thomas Plum Date: 2007-04-16

+

View all other issues in [locale.moneypunct.virtuals].

+

View all issues with Ready status.

+

Discussion:

+

+22.2.6.3.2 [locale.moneypunct.virtuals], para 4 footnote 257 says +

+ +

+257) For international  +specializations (second template parameter true) this is always four  +characters long, usually three letters and a space. +

+ +

+The following objection has been raised: +

+ +

+The international currency  +symbol is whatever the underlying locale says it is, not necessarily  +four characters long. +

+ +

+[Plum ref _222632Y41] +

+ + +

Proposed resolution:

+

+Change footnote 253 in 22.2.6.3.2 [locale.moneypunct.virtuals]: +

+ +
+

+253) For international specializations (second template +parameter true) this is always typically +four characters long, usually three letters and a space. +

+
+ + + + + +
+

667. money_get's widened minus sign

+

Section: 22.2.6.1.2 [locale.money.get.virtuals] Status: Open + Submitter: Thomas Plum Date: 2007-04-16

+

View other active issues in [locale.money.get.virtuals].

+

View all other issues in [locale.money.get.virtuals].

+

View all issues with Open status.

+

Discussion:

+

+22.2.6.1.2 [locale.money.get.virtuals], para 1 says: +

+ +

+The result is returned as an integral value  +stored in units or as a sequence of digits possibly preceded by a  +minus sign (as produced by ct.widen(c) where c is '-' or in the range  +from '0' through '9', inclusive) stored in digits. +

+ +

+The following +objection has been raised: +

+ +

+Some implementations interpret this to mean that a facet derived from +ctype<wchar_t> can provide its own member do_widen(char) +which produces e.g. L'@' for the "widened" minus sign, and that the +'@' symbol will appear in the resulting sequence of digits.  Other +implementations have assumed that one or more places in the standard permit the +implementation to "hard-wire" L'-' as the "widened" minus sign.  Are +both interpretations permissible, or only  one? +

+ +

+[Plum ref _222612Y14] +

+ +

+Furthermore: if ct.widen('9') produces L'X' (a non-digit), does a +parse fail if a '9' appears in the subject string? [Plum ref _22263Y33] +

+ +

[ +Kona (2007): Bill and Dietmar to provide proposed wording. +]

+ + + +

Proposed resolution:

+

+

+ + + + + +
+

668. money_get's empty minus sign

+

Section: 22.2.6.1.2 [locale.money.get.virtuals] Status: Open + Submitter: Thomas Plum Date: 2007-04-16

+

View other active issues in [locale.money.get.virtuals].

+

View all other issues in [locale.money.get.virtuals].

+

View all issues with Open status.

+

Discussion:

+

+22.2.6.1.2 [locale.money.get.virtuals], para 3 says: +

+ +

+If pos or neg is empty, the sign component is +optional, and if no sign is detected, the result is given the sign  +that corresponds to the source of the empty string. +

+ +

+The following +objection has been raised: +

+ +

+A negative_sign of "" means "there is no  +way to write a negative sign" not "any null sequence is a negative  +sign, so it's always there when you look for it". +

+ +

+[Plum ref _222612Y32] +

+ +

[ +Kona (2007): Bill to provide proposed wording and interpretation of existing wording. +]

+ + + + +

Proposed resolution:

+

+

+ + + + + +
+

669. Equivalent postive and negative signs in money_get

+

Section: 22.2.6.1.2 [locale.money.get.virtuals] Status: Open + Submitter: Thomas Plum Date: 2007-04-16

+

View other active issues in [locale.money.get.virtuals].

+

View all other issues in [locale.money.get.virtuals].

+

View all issues with Open status.

+

Discussion:

+

+22.2.6.1.2 [locale.money.get.virtuals], para 3 sentence 4 says: +

+ +

+If the first character of pos is equal to the first character of neg,  +or if both strings are empty, the result is given a positive sign. +

+ +

+One interpretation is that an input sequence must match either the +positive pattern or the negative pattern, and then in either event it +is interpreted as positive.  The following objections has been raised: +

+ +

+The input can successfully match only a positive sign, so the negative +pattern is an unsuccessful match. +

+ +

+[Plum ref _222612Y34, 222612Y51b] +

+ +

[ +Bill to provide proposed wording and interpretation of existing wording. +]

+ + + + +

Proposed resolution:

+

+

+ + + + + +
+

670. money_base::pattern and space

+

Section: 22.2.6.3 [locale.moneypunct] Status: Open + Submitter: Thomas Plum Date: 2007-04-16

+

View all issues with Open status.

+

Discussion:

+

+22.2.6.3 [locale.moneypunct], para 2 says: +

+ +

+The value space indicates that at least one space is required at  +that position. +

+ +

+The following objection has been raised: +

+ +

+Whitespace is optional when matching space. (See 22.2.6.1.2 [locale.money.get.virtuals], para 2.) +

+ +

+[Plum ref _22263Y22] +

+ +

[ +Kona (2007): Bill to provide proposed wording. We agree that C++03 is +ambiguous, and that we want C++0X to say "space" means 0 or more +whitespace characters on input. +]

+ + + + +

Proposed resolution:

+

+

+ + + + + +
+

671. precision of hexfloat

+

Section: 22.2.2.2.2 [facet.num.put.virtuals] Status: Open + Submitter: John Salmon Date: 2007-04-20

+

View all other issues in [facet.num.put.virtuals].

+

View all issues with Open status.

+

Discussion:

+

+I am trying to understand how TR1 supports hex float (%a) output. +

+

+As far as I can tell, it does so via the following: +

+

+8.15 Additions to header <locale> [tr.c99.locale] +

+

+In subclause 22.2.2.2.2 [facet.num.put.virtuals], Table 58 Floating-point conversions, after +the line: +floatfield == ios_base::scientific %E +

+

+add the two lines: +

+
floatfield == ios_base::fixed | ios_base::scientific && !uppercase %a
+floatfield == ios_base::fixed | ios_base::scientific %A 2
+
+

+[Note: The additional requirements on print and scan functions, later +in this clause, ensure that the print functions generate hexadecimal +floating-point fields with a %a or %A conversion specifier, and that +the scan functions match hexadecimal floating-point fields with a %g +conversion specifier.  end note] +

+

+Following the thread, in 22.2.2.2.2 [facet.num.put.virtuals], we find: +

+

+For conversion from a floating-point type, if (flags & fixed) != 0 or +if str.precision() > 0, then str.precision() is specified in the +conversion specification. +

+

+This would seem to imply that when floatfield == fixed|scientific, the +precision of the conversion specifier is to be taken from +str.precision().  Is this really what's intended?  I sincerely hope +that I'm either missing something or this is an oversight.  Please +tell me that the committee did not intend to mandate that hex floats +(and doubles) should by default be printed as if by %.6a. +

+ +

[ +Howard: I think the fundamental issue we overlooked was that with %f, +%e, %g, the default precision was always 6.  With %a the default +precision is not 6, it is infinity.  So for the first time, we need to +distinguish between the default value of precision, and the precision +value 6. +]

+ + + + +

Proposed resolution:

+

+

+ + +

[ +Kona (2007): Robert volunteers to propose wording. +]

+ + + + + +
+

672. Swappable requirements need updating

+

Section: 20.1.1 [utility.arg.requirements] Status: Review + Submitter: Howard Hinnant Date: 2007-05-04

+

View other active issues in [utility.arg.requirements].

+

View all other issues in [utility.arg.requirements].

+

View all issues with Review status.

+

Discussion:

+

+The current Swappable is: +

+ +
+ + + + + +
Table 37: Swappable requirements [swappable]
expressionreturn typepost-condition
swap(s,t)voidt has the value originally held by u, and u has the value originally +held by t
+

+The Swappable requirement is met by satisfying one or more of the following conditions: +

+
    +
  • +T is Swappable if T satisfies the CopyConstructible requirements (Table 34) +and the CopyAssignable requirements (Table 36); +
  • +
  • +T is Swappable if a namespace scope function named swap exists in the same +namespace as the definition of T, such that the expression swap(t,u) is valid +and has the semantics described in this table. +
  • +
+
+
+ +

+With the passage of rvalue reference into the language, Swappable needs to be updated to +require only MoveConstructible and MoveAssignable. This is a minimum. +

+ +

+Additionally we may want to support proxy references such that the following code is acceptable: +

+ +
namespace Mine {
+
+template <class T>
+struct proxy {...};
+
+template <class T>
+struct proxied_iterator
+{
+   typedef T value_type;
+   typedef proxy<T> reference;
+   reference operator*() const;
+   ...
+};
+
+struct A
+{
+   // heavy type, has an optimized swap, maybe isn't even copyable or movable, just swappable
+   void swap(A&);
+   ...
+};
+
+void swap(A&, A&);
+void swap(proxy<A>, A&);
+void swap(A&, proxy<A>);
+void swap(proxy<A>, proxy<A>);
+
+}  // Mine
+
+...
+
+Mine::proxied_iterator<Mine::A> i(...)
+Mine::A a;
+swap(*i1, a);
+
+ +

+I.e. here is a call to swap which the user enables swapping between a proxy to a class and the class +itself. We do not need to anything in terms of implementation except not block their way with overly +constrained concepts. That is, the Swappable concept should be expanded to allow swapping +between two different types for the case that one is binding to a user-defined swap. +

+ + + +

Proposed resolution:

+ +

+Change 20.1.1 [utility.arg.requirements]: +

+ +
+ +

+-1- The template definitions in the C++ Standard Library refer to various +named requirements whose details are set out in tables 31-38. In these +tables, T is a type to be supplied by a C++ program +instantiating a template; a, b, and c are +values of type const T; s and t are modifiable +lvalues of type T; u is a value of type (possibly +const) T; and rv is a non-const +rvalue of type T. +

+ + + + + + + +
Table 37: Swappable requirements [swappable]
expressionreturn typepost-condition
swap(s,t)voidt has the value originally +held by u, and +u has the value originally held +by t
+

+The Swappable requirement is met by satisfying one or more of the following conditions: +

+
    +
  • +T is Swappable if T satisfies the +CopyConstructible MoveConstructible +requirements (Table 34 33) and the CopyAssignable MoveAssignable +requirements (Table 36 35); +
  • +
  • +T is Swappable if a namespace scope function named +swap exists in the same namespace as the definition of +T, such that the expression +swap(t,u) is valid and has the +semantics described in this table. +
  • +
+
+
+ + + +

[ +Kona (2007): We like the change to the Swappable requirements to use +move semantics. The issue relating to the support of proxies is +separable from the one relating to move semantics, and it's bigger than +just swap. We'd like to address only the move semantics changes under +this issue, and open a separated issue (742) to handle proxies. Also, there +may be a third issue, in that the current definition of Swappable does +not permit rvalues to be operands to a swap operation, and Howard's +proposed resolution would allow the right-most operand to be an rvalue, +but it would not allow the left-most operand to be an rvalue (some swap +functions in the library have been overloaded to permit left operands to +swap to be rvalues). +]

+ + + + + +
+

673. unique_ptr update

+

Section: 20.6.5 [unique.ptr] Status: Open + Submitter: Howard Hinnant Date: 2007-05-04

+

View all issues with Open status.

+

Discussion:

+

+Since the publication of +N1856 +there have been a few small but significant advances which should be included into +unique_ptr. There exists a +reference implmenation +for all of these changes. +

+ +
    + +
  • +

    +Even though unique_ptr<void> is not a valid use case (unlike for shared_ptr<void>), +unexpected cases to crop up which require the instantiation of the interface of unique_ptr<void> +even if it is never used. For example see +LWG 541 for how this accidently +happened to auto_ptr. I believe the most robust way to protect unique_ptr against this +type of failure is to augment the return type of unique_ptr<T>:operator*() with +add_lvalue_reference<T>::type. This means that given an instantiated unique_ptr<void> +the act of dereferencing it will simply return void instead of causing a compile time failure. +This is simpler than creating a unique_ptr<void> specialization which isn't robust in the +face of cv-qualified void types. +

    + +

    +This resolution also supports instantiations such as unique_ptr<void, free_deleter> +which could be very useful to the client. +

    + +
  • + +
  • +

    +Efforts have been made to better support containers and smart pointers in shared +memory contexts. One of the key hurdles in such support is not assuming that a +pointer type is actually a T*. This can easily be accomplished +for unique_ptr by having the deleter define the pointer type: +D::pointer. Furthermore this type can easily be defaulted to +T* should the deleter D choose not to define a pointer +type (reference implementation +here). +This change has no run time overhead. It has no interface overhead on +authors of custom delter types. It simply allows (but not requires) +authors of custom deleter types to define a smart pointer for the +storage type of unique_ptr if they find such functionality +useful. std::default_delete is an example of a deleter which +defaults pointer to T* by simply ignoring this issue +and not including a pointer typedef. +

    +
  • + +
  • +

    +When the deleter type is a function pointer then it is unsafe to construct +a unique_ptr without specifying the function pointer in the constructor. +This case is easy to check for with a static_assert assuring that the +deleter is not a pointer type in those constructors which do not accept deleters. +

    + +
    unique_ptr<A, void(*)(void*)> p(new A);  // error, no function given to delete the pointer!
    +
    + +
  • + +
+ +

[ +Kona (2007): We don't like the solution given to the first bullet in +light of concepts. The second bullet solves the problem of supporting +fancy pointers for one library component only. The full LWG needs to +decide whether to solve the problem of supporting fancy pointers +piecemeal, or whether a paper addressing the whole library is needed. We +think that the third bullet is correct. +]

+ + +

[ +Post Kona: Howard adds example user code related to the first bullet: +]

+ + +
+
void legacy_code(void*, std::size_t);
+
+void foo(std::size_t N)
+{
+    std::unique_ptr<void, void(*)(void*)> ptr(std::malloc(N), std::free);
+    legacy_code(ptr.get(), N);
+}   // unique_ptr used for exception safety purposes
+
+
+ +

+I.e. unique_ptr<void> is a useful tool that we don't want +to disable with concepts. The only part of unique_ptr<void> we +want to disable (with concepts or by other means) are the two member functions: +

+ +
T& operator*() const;
+T* operator->() const;
+
+ + + +

Proposed resolution:

+ +

[ +I am grateful for the generous aid of Peter Dimov and Ion Gaztañaga in helping formulate and review +the proposed resolutions below. +]

+ + +
    +
  • + +

    +Change 20.6.5.2 [unique.ptr.single]: +

    + +
    template <class T, class D = default_delete<T>> class unique_ptr {
    +   ...
    +   T& typename add_lvalue_reference<T>::type operator*() const;
    +   ...
    +};
    +
    + +

    +Change 20.6.5.2.4 [unique.ptr.single.observers]: +

    + +
    T& typename add_lvalue_reference<T>::type operator*() const;
    +
    + +
  • + +
  • +

    +Change 20.6.5.2 [unique.ptr.single]: +

    + +
    template <class T, class D = default_delete<T>> class unique_ptr {
    +public:
    +  typedef implementation (see description below) pointer;
    +   ...
    +   explicit unique_ptr(T* pointer p);
    +   ...
    +   unique_ptr(T* pointer p, implementation defined (see description below) d);
    +   unique_ptr(T* pointer p, implementation defined (see description below) d);
    +   ...
    +   T* pointer operator->() const;
    +   T* pointer get() const;
    +   ...
    +   T* pointer release();
    +   void reset(T* pointer p = 0 pointer());
    +};
    +
    + +

    + +-3- If the type remove_reference<D>::type::pointer +exists, then unique_ptr<T, D>::pointer is a typedef to +remove_reference<D>::type::pointer. Otherwise +unique_ptr<T, D>::pointer is a typedef to T*. +The type unique_ptr<T, D>::pointer must be CopyConstructible +and CopyAssignable. + +

    + +

    +Change 20.6.5.2.1 [unique.ptr.single.ctor]: +

    + +
    unique_ptr(T* pointer p);
    +...
    +unique_ptr(T* pointer p, implementation defined d); 
    +unique_ptr(T* pointer p, implementation defined d); 
    +...
    +unique_ptr(T* pointer p, const A& d);
    +unique_ptr(T* pointer p, A&& d);
    +...
    +unique_ptr(T* pointer p, A& d); 
    +unique_ptr(T* pointer p, A&& d);
    +...
    +unique_ptr(T* pointer p, const A& d); 
    +unique_ptr(T* pointer p, const A&& d);
    +...
    +
    + +

    +-23- Requires: If D is not a reference type, +construction of the deleter D from an rvalue of type E +must be well formed and not throw an exception. If D is a +reference type, then E must be the same type as D +(diagnostic required). U* unique_ptr<U,E>::pointer +must be implicitly convertible to T* +pointer. +

    + +

    +-25- Postconditions: get() == value u.get() had before +the construction, modulo any required offset adjustments resulting from +the cast from U* +unique_ptr<U,E>::pointer to T* +pointer. get_deleter() returns a reference to the +internally stored deleter which was constructed from +u.get_deleter(). +

    + +

    +Change 20.6.5.2.3 [unique.ptr.single.asgn]: +

    + +
    +

    +-8- Requires: Assignment of the deleter D from an rvalue +D must not throw an exception. U* +unique_ptr<U,E>::pointer must be implicitly +convertible to T* pointer. +

    +
    + +

    +Change 20.6.5.2.4 [unique.ptr.single.observers]: +

    + +
    +
    T* pointer operator->() const;
    +... +
    T* pointer get() const;
    +
    + +

    +Change 20.6.5.2.5 [unique.ptr.single.modifiers]: +

    + +
    +
    T* pointer release();
    +... +
    void reset(T* pointer p = 0 pointer());
    +
    + +

    +Change 20.6.5.3 [unique.ptr.runtime]: +

    + +
    template <class T, class D> class unique_ptr<T[], D> {
    +public:
    +  typedef implementation pointer;
    +   ...
    +   explicit unique_ptr(T* pointer p);
    +   ...
    +   unique_ptr(T* pointer p, implementation defined d);
    +   unique_ptr(T* pointer p, implementation defined d);
    +   ...
    +   T* pointer get() const;
    +   ...
    +   T* pointer release();
    +   void reset(T* pointer p = 0 pointer());
    +};
    +
    + +

    +Change 20.6.5.3.1 [unique.ptr.runtime.ctor]: +

    + +
    +
    unique_ptr(T* pointer p);
    +unique_ptr(T* pointer p, implementation defined d);
    +unique_ptr(T* pointer p, implementation defined d);
    +
    + +

    +These constructors behave the same as in the primary template except +that they do not accept pointer types which are convertible to +T* pointer. [Note: One +implementation technique is to create private templated overloads of +these members. -- end note] +

    +
    + +

    +Change 20.6.5.3.3 [unique.ptr.runtime.modifiers]: +

    + +
    +
    void reset(T* pointer p = 0 pointer());
    +
    + +

    +-1- Requires: Does not accept pointer types which are convertible +to T* pointer (diagnostic +required). [Note: One implementation technique is to create a private +templated overload. -- end note] +

    +
    + +

    +Change 20.6.5.4 [unique.ptr.compiletime]: +

    + +
    template <class T, class D,  size_t N> class unique_ptr<T[N], D> {
    +public:
    +  typedef implementation pointer;
    +   ...
    +   explicit unique_ptr(T* pointer p);
    +   ...
    +   unique_ptr(T* pointer p, implementation defined d);
    +   unique_ptr(T* pointer p, implementation defined d);
    +   ...
    +   T* pointer get() const;
    +   ...
    +   T* pointer release();
    +   void reset(T* pointer p = 0 pointer());
    +};
    +
    + +

    +Change 20.6.5.4.3 [unique.ptr.compiletime.modifiers]: +

    + +
    +
    void reset(T* pointer p = 0 pointer());
    +
    + +

    +-1- Requires: Does not accept pointer types which are convertible +to T* pointer (dignostic required). [Note: One implementation +technique is to create a private templated overload. --end note] +

    + +
    + +
  • + +
  • + +

    +Change 20.6.5.2.1 [unique.ptr.single.ctor]: +

    + +
    +
    unique_ptr();
    +
    +

    +Requires: D must be default constructible, and that +construction must not throw an exception. D must not be a +reference type or pointer type (diagnostic required). +

    +
    +
    unique_ptr(T* pointer p);
    +
    +

    +Requires: The expression D()(p) must be well formed. +The default constructor of D must not throw an exception. +D must not be a reference type or pointer type (diagnostic +required). +

    +
    +
    + +

    +Change 20.6.5.2.1 [unique.ptr.single.ctor]: +

    + +
    +
    unique_ptr();
    +
    +

    +Requires: D must be default constructible, and that +construction must not throw an exception. D must not be a +reference type or pointer type (diagnostic required). +

    +
    +
    unique_ptr(T* pointer p);
    +
    +

    +Requires: The expression D()(p) must be well formed. +The default constructor of D must not throw an exception. +D must not be a reference type or pointer type (diagnostic +required). +

    +
    +
    + +
  • + +
+ + + + + + +
+

674. shared_ptr interface changes for consistency with N1856

+

Section: 20.6.6.2 [util.smartptr.shared] Status: Ready + Submitter: Peter Dimov Date: 2007-05-05

+

View other active issues in [util.smartptr.shared].

+

View all other issues in [util.smartptr.shared].

+

View all issues with Ready status.

+

Discussion:

+

+N1856 does not propose +any changes to shared_ptr. It needs to be updated to use a rvalue reference where appropriate +and to interoperate with unique_ptr as it does with auto_ptr. +

+ + +

Proposed resolution:

+ +

+Change 20.6.6.2 [util.smartptr.shared] as follows: +

+ +
+
template<class Y> explicit shared_ptr(auto_ptr<Y>&&& r);
+template<class Y, class D> explicit shared_ptr(const unique_ptr<Y,D>& r) = delete;
+template<class Y, class D> explicit shared_ptr(unique_ptr<Y,D>&& r);
+...
+template<class Y> shared_ptr& operator=(auto_ptr<Y>&&& r);
+template<class Y, class D> shared_ptr& operator=(const unique_ptr<Y,D>& r) = delete;
+template<class Y, class D> shared_ptr& operator=(unique_ptr<Y,D>&& r);
+
+ +

+Change 20.6.6.2.1 [util.smartptr.shared.const] as follows: +

+ +
+
template<class Y> shared_ptr(auto_ptr<Y>&&& r);
+
+ +

+Add to 20.6.6.2.1 [util.smartptr.shared.const]: +

+ +
+
template<class Y, class D> shared_ptr(unique_ptr<Y, D>&& r);
+
+ +

+Effects: Equivalent to shared_ptr( r.release(), r.get_deleter() ) when D is + not a reference type, shared_ptr( r.release(), ref( r.get_deleter() ) ) + otherwise. +

+ +

+Exception safety: If an exception is thrown, the constructor has no effect. +

+
+ +
+ +

+Change 20.6.6.2.3 [util.smartptr.shared.assign] as follows: +

+ +
+
template<class Y> shared_ptr& operator=(auto_ptr<Y>&&& r);
+
+ +

+Add to 20.6.6.2.3 [util.smartptr.shared.assign]: +

+ +
+
template<class Y, class D> shared_ptr& operator=(unique_ptr<Y,D>&& r);
+ +
+

+-4- Effects: Equivalent to shared_ptr(std::move(r)).swap(*this). +

+

+-5- Returns: *this. +

+
+ +
+ + + +

[ +Kona (2007): We may need to open an issue (743) to deal with the question of +whether shared_ptr needs an rvalue swap. +]

+ + + + + +
+

675. Move assignment of containers

+

Section: 23.1 [container.requirements] Status: Ready + Submitter: Howard Hinnant Date: 2007-05-05

+

View other active issues in [container.requirements].

+

View all other issues in [container.requirements].

+

View all issues with Ready status.

+

Discussion:

+

+James Hopkin pointed out to me that if vector<T> move assignment is O(1) +(just a swap) then containers such as vector<shared_ptr<ostream>> might have +the wrong semantics under move assignment when the source is not truly an rvalue, but a +moved-from lvalue (destructors could run late). +

+ +
vector<shared_ptr<ostream>> v1;
+vector<shared_ptr<ostream>> v2;
+...
+v1 = v2;               // #1
+v1 = std::move(v2);    // #2
+
+ +

+Move semantics means not caring what happens to the source (v2 in this example). +It doesn't mean not caring what happens to the target (v1). In the above example +both assignments should have the same effect on v1. Any non-shared ostream's +v1 owns before the assignment should be closed, whether v1 is undergoing +copy assignment or move assignment. +

+ +

+This implies that the semantics of move assignment of a generic container should be +clear, swap instead of just swap. An alternative which could achieve the same +effect would be to move assign each element. In either case, the complexity of move +assignment needs to be relaxed to O(v1.size()). +

+ +

+The performance hit of this change is not nearly as drastic as it sounds. +In practice, the target of a move assignment has always just been move constructed +or move assigned from. Therefore under clear, swap semantics (in +this common use case) we are still achieving O(1) complexity. +

+ + + +

Proposed resolution:

+

+Change 23.1 [container.requirements]: +

+ +
+ + + + + + + + + + + + +
Table 86: Container requirements
expressionreturn typeoperational semanticsassertion/note pre/post-conditioncomplexity
a = rv;X&All existing elements of a are either move assigned or destructeda shall be equal to the +value that rv had +before this construction +constant linear in a.size()
+
+ + + + + + +
+

676. Moving the unordered containers

+

Section: 23.4 [unord] Status: Ready + Submitter: Howard Hinnant Date: 2007-05-05

+

View other active issues in [unord].

+

View all other issues in [unord].

+

View all issues with Ready status.

+

Discussion:

+

+Move semantics are missing from the unordered containers. The proposed +resolution below adds move-support consistent with +N1858 +and the current working draft. +

+ +

+The current proposed resolution simply lists the requirements for each function. +These might better be hoisted into the requirements table for unordered associative containers. +Futhermore a mild reorganization of the container requirements could well be in order. +This defect report is purposefully ignoring these larger issues and just focusing +on getting the unordered containers "moved". +

+ + + +

Proposed resolution:

+ +

+Add to 23.4 [unord]: +

+ +
template <class Key, class T, class Hash, class Pred, class Alloc> 
+  void swap(unordered_map<Key, T, Hash, Pred, Alloc>& x, 
+            unordered_map<Key, T, Hash, Pred, Alloc>& y); 
+
+template <class Key, class T, class Hash, class Pred, class Alloc> 
+  void swap(unordered_map<Key, T, Hash, Pred, Alloc>& x, 
+            unordered_map<Key, T, Hash, Pred, Alloc>&& y);
+
+template <class Key, class T, class Hash, class Pred, class Alloc> 
+  void swap(unordered_map<Key, T, Hash, Pred, Alloc>&& x, 
+            unordered_map<Key, T, Hash, Pred, Alloc>& y);
+
+template <class Key, class T, class Hash, class Pred, class Alloc> 
+  void swap(unordered_multimap<Key, T, Hash, Pred, Alloc>& x, 
+            unordered_multimap<Key, T, Hash, Pred, Alloc>& y);
+
+template <class Key, class T, class Hash, class Pred, class Alloc> 
+  void swap(unordered_multimap<Key, T, Hash, Pred, Alloc>& x, 
+            unordered_multimap<Key, T, Hash, Pred, Alloc>&& y);
+
+template <class Key, class T, class Hash, class Pred, class Alloc> 
+  void swap(unordered_multimap<Key, T, Hash, Pred, Alloc>&& x, 
+            unordered_multimap<Key, T, Hash, Pred, Alloc>& y);
+
+...
+
+template <class Value, class Hash, class Pred, class Alloc> 
+  void swap(unordered_set<Value, Hash, Pred, Alloc>& x, 
+            unordered_set<Value, Hash, Pred, Alloc>& y); 
+
+template <class Value, class Hash, class Pred, class Alloc> 
+  void swap(unordered_set<Value, Hash, Pred, Alloc>& x, 
+            unordered_set<Value, Hash, Pred, Alloc>&& y);
+
+template <class Value, class Hash, class Pred, class Alloc> 
+  void swap(unordered_set<Value, Hash, Pred, Alloc>&& x, 
+            unordered_set<Value, Hash, Pred, Alloc>& y);
+
+template <class Value, class Hash, class Pred, class Alloc> 
+  void swap(unordered_multiset<Value, Hash, Pred, Alloc>& x, 
+            unordered_multiset<Value, Hash, Pred, Alloc>& y);
+
+template <class Value, class Hash, class Pred, class Alloc> 
+  void swap(unordered_multiset<Value, Hash, Pred, Alloc>& x, 
+            unordered_multiset<Value, Hash, Pred, Alloc>&& y);
+
+template <class Value, class Hash, class Pred, class Alloc> 
+  void swap(unordered_multiset<Value, Hash, Pred, Alloc>&& x, 
+            unordered_multiset<Value, Hash, Pred, Alloc>& y);
+
+ +

unordered_map

+ +

+Change 23.4.1 [unord.map]: +

+ +
class unordered_map
+{
+    ...
+    unordered_map(const unordered_map&);
+    unordered_map(unordered_map&&);
+    ~unordered_map();
+    unordered_map& operator=(const unordered_map&);
+    unordered_map& operator=(unordered_map&&);
+    ...
+    // modifiers 
+    std::pair<iterator, bool> insert(const value_type& obj); 
+    template <class P> pair<iterator, bool> insert(P&& obj);
+    iterator       insert(iterator hint, const value_type& obj);
+    template <class P> iterator       insert(iterator hint, P&& obj);
+    const_iterator insert(const_iterator hint, const value_type& obj);
+    template <class P> const_iterator insert(const_iterator hint, P&& obj);
+    ...
+    void swap(unordered_map&&);
+    ...
+    mapped_type& operator[](const key_type& k);
+    mapped_type& operator[](key_type&& k);
+    ...
+};
+
+template <class Key, class T, class Hash, class Pred, class Alloc> 
+  void swap(unordered_map<Key, T, Hash, Pred, Alloc>& x, 
+            unordered_map<Key, T, Hash, Pred, Alloc>& y);
+
+template <class Key, class T, class Hash, class Pred, class Alloc> 
+  void swap(unordered_map<Key, T, Hash, Pred, Alloc>& x, 
+            unordered_map<Key, T, Hash, Pred, Alloc>&& y);
+
+template <class Key, class T, class Hash, class Pred, class Alloc> 
+  void swap(unordered_map<Key, T, Hash, Pred, Alloc>&& x, 
+            unordered_map<Key, T, Hash, Pred, Alloc>& y);
+
+ +

+Add to 23.4.1.1 [unord.map.cnstr]: +

+ +
+
template <class InputIterator>
+  unordered_map(InputIterator f, InputIterator l, 
+                size_type n = implementation-defined, 
+                const hasher& hf = hasher(), 
+                const key_equal& eql = key_equal(), 
+                const allocator_type& a = allocator_type());
+
+ +

+ +Requires: If the iterator's dereference operator returns an +lvalue or a const rvalue pair<key_type, mapped_type>, +then both key_type and mapped_type shall be +CopyConstructible. + +

+
+ +

+Add to 23.4.1.2 [unord.map.elem]: +

+ +
+ +
mapped_type& operator[](const key_type& k);
+ +
+

...

+

+Requires: key_type shall be CopyConstructible +and mapped_type shall be DefaultConstructible. +

+
+ +
mapped_type& operator[](key_type&& k);
+ +
+

+Effects: If the unordered_map does not already contain an +element whose key is equivalent to k , inserts the value +std::pair<const key_type, mapped_type>(std::move(k), mapped_type()). +

+ +

+Requires: mapped_type shall be DefaultConstructible. +

+ +

+Returns: A reference to x.second, where x is the +(unique) element whose key is equivalent to k. +

+ +
+ +
+ +

+Add new section [unord.map.modifiers]: +

+ +
+
pair<iterator, bool> insert(const value_type& x);
+template <class P> pair<iterator, bool> insert(P&& x);
+iterator       insert(iterator hint, const value_type& x);
+template <class P> iterator       insert(iterator hint, P&& x);
+const_iterator insert(const_iterator hint, const value_type& x);
+template <class P> const_iterator insert(const_iterator hint, P&& x);
+template <class InputIterator>
+  void insert(InputIterator first, InputIterator last);
+
+ +
+

+Requires: Those signatures taking a const value_type& parameter +requires both the key_type and the mapped_type to be +CopyConstructible. +

+ +

+P shall be convertible to value_type. + If P is instantiated as a reference +type, then the argument x is copied from. Otherwise x +is considered to be an rvalue as it is converted to value_type +and inserted into the unordered_map. Specifically, in such +cases CopyConstructible is not required of key_type or +mapped_type unless the conversion from P specifically +requires it (e.g. if P is a tuple<const key_type, +mapped_type>, then key_type must be +CopyConstructible). +

+ +

+The signature taking InputIterator +parameters requires CopyConstructible of both +key_type and mapped_type if the dereferenced +InputIterator returns an lvalue or const rvalue +value_type. +

+ +
+ +
+ +

+Add to 23.4.1.3 [unord.map.swap]: +

+ +
+
template <class Key, class T, class Hash, class Pred, class Alloc> 
+  void swap(unordered_map<Key, T, Hash, Pred, Alloc>& x, 
+            unordered_map<Key, T, Hash, Pred, Alloc>& y);
+template <class Key, class T, class Hash, class Pred, class Alloc> 
+  void swap(unordered_map<Key, T, Hash, Pred, Alloc>& x, 
+            unordered_map<Key, T, Hash, Pred, Alloc>&& y);
+template <class Key, class T, class Hash, class Pred, class Alloc> 
+  void swap(unordered_map<Key, T, Hash, Pred, Alloc>&& x, 
+            unordered_map<Key, T, Hash, Pred, Alloc>& y);
+
+
+ +

unordered_multimap

+ +

+Change 23.4.2 [unord.multimap]: +

+ +
class unordered_multimap
+{
+    ...
+    unordered_multimap(const unordered_multimap&);
+    unordered_multimap(unordered_multimap&&);
+    ~unordered_multimap();
+    unordered_multimap& operator=(const unordered_multimap&);
+    unordered_multimap& operator=(unordered_multimap&&);
+    ...
+    // modifiers 
+    iterator insert(const value_type& obj); 
+    template <class P> iterator insert(P&& obj);
+    iterator       insert(iterator hint, const value_type& obj);
+    template <class P> iterator       insert(iterator hint, P&& obj);
+    const_iterator insert(const_iterator hint, const value_type& obj);
+    template <class P> const_iterator insert(const_iterator hint, P&& obj);
+    ...
+    void swap(unordered_multimap&&);
+    ...
+};
+
+template <class Key, class T, class Hash, class Pred, class Alloc> 
+  void swap(unordered_multimap<Key, T, Hash, Pred, Alloc>& x, 
+            unordered_multimap<Key, T, Hash, Pred, Alloc>& y);
+
+template <class Key, class T, class Hash, class Pred, class Alloc> 
+  void swap(unordered_multimap<Key, T, Hash, Pred, Alloc>& x, 
+            unordered_multimap<Key, T, Hash, Pred, Alloc>&& y);
+
+template <class Key, class T, class Hash, class Pred, class Alloc> 
+  void swap(unordered_multimap<Key, T, Hash, Pred, Alloc>&& x, 
+            unordered_multimap<Key, T, Hash, Pred, Alloc>& y);
+
+ +

+Add to 23.4.2.1 [unord.multimap.cnstr]: +

+ +
+
template <class InputIterator>
+  unordered_multimap(InputIterator f, InputIterator l, 
+                size_type n = implementation-defined, 
+                const hasher& hf = hasher(), 
+                const key_equal& eql = key_equal(), 
+                const allocator_type& a = allocator_type());
+
+ +

+ +Requires: If the iterator's dereference operator returns an +lvalue or a const rvalue pair<key_type, mapped_type>, +then both key_type and mapped_type shall be +CopyConstructible. + +

+
+ +

+Add new section [unord.multimap.modifiers]: +

+ +
+
iterator insert(const value_type& x);
+template <class P> iterator       insert(P&& x);
+iterator       insert(iterator hint, const value_type& x);
+template <class P> iterator       insert(iterator hint, P&& x);
+const_iterator insert(const_iterator hint, const value_type& x);
+template <class P> const_iterator insert(const_iterator hint, P&& x);
+template <class InputIterator>
+  void insert(InputIterator first, InputIterator last);
+
+ +
+

+Requires: Those signatures taking a const value_type& parameter +requires both the key_type and the mapped_type to be +CopyConstructible. +

+ +

+P shall be convertible to value_type. + If P is instantiated as a reference +type, then the argument x is copied from. Otherwise x +is considered to be an rvalue as it is converted to value_type +and inserted into the unordered_multimap. Specifically, in such +cases CopyConstructible is not required of key_type or +mapped_type unless the conversion from P specifically +requires it (e.g. if P is a tuple<const key_type, +mapped_type>, then key_type must be +CopyConstructible). +

+ +

+The signature taking InputIterator +parameters requires CopyConstructible of both +key_type and mapped_type if the dereferenced +InputIterator returns an lvalue or const rvalue +value_type. +

+
+ +
+ +

+Add to 23.4.2.2 [unord.multimap.swap]: +

+ +
+
template <class Key, class T, class Hash, class Pred, class Alloc> 
+  void swap(unordered_multimap<Key, T, Hash, Pred, Alloc>& x, 
+            unordered_multimap<Key, T, Hash, Pred, Alloc>& y);
+template <class Key, class T, class Hash, class Pred, class Alloc> 
+  void swap(unordered_multimap<Key, T, Hash, Pred, Alloc>& x, 
+            unordered_multimap<Key, T, Hash, Pred, Alloc>&& y);
+template <class Key, class T, class Hash, class Pred, class Alloc> 
+  void swap(unordered_multimap<Key, T, Hash, Pred, Alloc>&& x, 
+            unordered_multimap<Key, T, Hash, Pred, Alloc>& y);
+
+
+ +

unordered_set

+ +

+Change 23.4.3 [unord.set]: +

+ +
class unordered_set
+{
+    ...
+    unordered_set(const unordered_set&);
+    unordered_set(unordered_set&&);
+    ~unordered_set();
+    unordered_set& operator=(const unordered_set&);
+    unordered_set& operator=(unordered_set&&);
+    ...
+    // modifiers 
+    std::pair<iterator, bool> insert(const value_type& obj); 
+    pair<iterator, bool> insert(value_type&& obj);
+    iterator       insert(iterator hint, const value_type& obj);
+    iterator       insert(iterator hint, value_type&& obj);
+    const_iterator insert(const_iterator hint, const value_type& obj);
+    const_iterator insert(const_iterator hint, value_type&& obj);
+    ...
+    void swap(unordered_set&&);
+    ...
+};
+
+template <class Key, class T, class Hash, class Pred, class Alloc> 
+  void swap(unordered_set<Key, T, Hash, Pred, Alloc>& x, 
+            unordered_set<Key, T, Hash, Pred, Alloc>& y);
+
+template <class Key, class T, class Hash, class Pred, class Alloc> 
+  void swap(unordered_set<Key, T, Hash, Pred, Alloc>& x, 
+            unordered_set<Key, T, Hash, Pred, Alloc>&& y);
+
+template <class Key, class T, class Hash, class Pred, class Alloc> 
+  void swap(unordered_set<Key, T, Hash, Pred, Alloc>&& x, 
+            unordered_set<Key, T, Hash, Pred, Alloc>& y);
+
+ +

+Add to 23.4.3.1 [unord.set.cnstr]: +

+ +
+
template <class InputIterator>
+  unordered_set(InputIterator f, InputIterator l, 
+                size_type n = implementation-defined, 
+                const hasher& hf = hasher(), 
+                const key_equal& eql = key_equal(), 
+                const allocator_type& a = allocator_type());
+
+ +

+ +Requires: If the iterator's dereference operator returns an +lvalue or a const rvalue value_type, then the +value_type shall be CopyConstructible. + +

+
+ +

+Add new section [unord.set.modifiers]: +

+ +
+
pair<iterator, bool> insert(const value_type& x);
+pair<iterator, bool> insert(value_type&& x);
+iterator       insert(iterator hint, const value_type& x);
+iterator       insert(iterator hint, value_type&& x);
+const_iterator insert(const_iterator hint, const value_type& x);
+const_iterator insert(const_iterator hint, value_type&& x);
+template <class InputIterator>
+  void insert(InputIterator first, InputIterator last);
+
+ +
+ +

+Requires: Those signatures taking a const +value_type& parameter requires the value_type to +be CopyConstructible. +

+ +

+The signature taking InputIterator parameters requires +CopyConstructible of value_type if the dereferenced +InputIterator returns an lvalue or const rvalue +value_type. +

+ +
+ +
+ +

+Add to 23.4.3.2 [unord.set.swap]: +

+ +
+
template <class Key, class T, class Hash, class Pred, class Alloc> 
+  void swap(unordered_set<Key, T, Hash, Pred, Alloc>& x, 
+            unordered_set<Key, T, Hash, Pred, Alloc>& y);
+template <class Key, class T, class Hash, class Pred, class Alloc> 
+  void swap(unordered_set<Key, T, Hash, Pred, Alloc>& x, 
+            unordered_set<Key, T, Hash, Pred, Alloc>&& y);
+template <class Key, class T, class Hash, class Pred, class Alloc> 
+  void swap(unordered_set<Key, T, Hash, Pred, Alloc>&& x, 
+            unordered_set<Key, T, Hash, Pred, Alloc>& y);
+
+
+ +

unordered_multiset

+ +

+Change 23.4.4 [unord.multiset]: +

+ +
class unordered_multiset
+{
+    ...
+    unordered_multiset(const unordered_multiset&);
+    unordered_multiset(unordered_multiset&&);
+    ~unordered_multiset();
+    unordered_multiset& operator=(const unordered_multiset&);
+    unordered_multiset& operator=(unordered_multiset&&);
+    ...
+    // modifiers 
+    iterator insert(const value_type& obj); 
+    iterator insert(value_type&& obj);
+    iterator       insert(iterator hint, const value_type& obj);
+    iterator       insert(iterator hint, value_type&& obj);
+    const_iterator insert(const_iterator hint, const value_type& obj);
+    const_iterator insert(const_iterator hint, value_type&& obj);
+    ...
+    void swap(unordered_multiset&&);
+    ...
+};
+
+template <class Key, class T, class Hash, class Pred, class Alloc> 
+  void swap(unordered_multiset<Key, T, Hash, Pred, Alloc>& x, 
+            unordered_multiset<Key, T, Hash, Pred, Alloc>& y);
+
+template <class Key, class T, class Hash, class Pred, class Alloc> 
+  void swap(unordered_multiset<Key, T, Hash, Pred, Alloc>& x, 
+            unordered_multiset<Key, T, Hash, Pred, Alloc>&& y);
+
+template <class Key, class T, class Hash, class Pred, class Alloc> 
+  void swap(unordered_multiset<Key, T, Hash, Pred, Alloc>&& x, 
+            unordered_multiset<Key, T, Hash, Pred, Alloc>& y);
+
+ +

+Add to 23.4.4.1 [unord.multiset.cnstr]: +

+ +
+
template <class InputIterator>
+  unordered_multiset(InputIterator f, InputIterator l, 
+                size_type n = implementation-defined, 
+                const hasher& hf = hasher(), 
+                const key_equal& eql = key_equal(), 
+                const allocator_type& a = allocator_type());
+
+ +

+ +Requires: If the iterator's dereference operator returns an +lvalue or a const rvalue value_type, then the +value_type shall be CopyConstructible. + +

+
+ +

+Add new section [unord.multiset.modifiers]: +

+ +
+
iterator insert(const value_type& x);
+iterator insert(value_type&& x);
+iterator       insert(iterator hint, const value_type& x);
+iterator       insert(iterator hint, value_type&& x);
+const_iterator insert(const_iterator hint, const value_type& x);
+const_iterator insert(const_iterator hint, value_type&& x);
+template <class InputIterator>
+  void insert(InputIterator first, InputIterator last);
+
+ +
+ +

+Requires: Those signatures taking a const +value_type& parameter requires the value_type to +be CopyConstructible. +

+ +

+The signature taking InputIterator parameters requires +CopyConstructible of value_type if the dereferenced +InputIterator returns an lvalue or const rvalue +value_type. +

+ +
+ +
+ +

+Add to 23.4.4.2 [unord.multiset.swap]: +

+ +
+
template <class Key, class T, class Hash, class Pred, class Alloc> 
+  void swap(unordered_multiset<Key, T, Hash, Pred, Alloc>& x, 
+            unordered_multiset<Key, T, Hash, Pred, Alloc>& y);
+template <class Key, class T, class Hash, class Pred, class Alloc> 
+  void swap(unordered_multiset<Key, T, Hash, Pred, Alloc>& x, 
+            unordered_multiset<Key, T, Hash, Pred, Alloc>&& y);
+template <class Key, class T, class Hash, class Pred, class Alloc> 
+  void swap(unordered_multiset<Key, T, Hash, Pred, Alloc>&& x, 
+            unordered_multiset<Key, T, Hash, Pred, Alloc>& y);
+
+
+ + + + + + +
+

679. resize parameter by value

+

Section: 23.2 [sequences] Status: Ready + Submitter: Howard Hinnant Date: 2007-06-11

+

View all issues with Ready status.

+

Discussion:

+

+The C++98 standard specifies that one member function alone of the containers +passes its parameter (T) by value instead of by const reference: +

+ +
void resize(size_type sz, T c = T());
+
+ +

+This fact has been discussed / debated repeatedly over the years, the first time +being even before C++98 was ratified. The rationale for passing this parameter by +value has been: +

+ +
+

+So that self referencing statements are guaranteed to work, for example: +

+
v.resize(v.size() + 1, v[0]);
+
+
+ +

+However this rationale is not convincing as the signature for push_back is: +

+ +
void push_back(const T& x);
+
+ +

+And push_back has similar semantics to resize (append). +And push_back must also work in the self referencing case: +

+ +
v.push_back(v[0]);  // must work
+
+ +

+The problem with passing T by value is that it can be significantly more +expensive than passing by reference. The converse is also true, however when it is +true it is usually far less dramatic (e.g. for scalar types). +

+ +

+Even with move semantics available, passing this parameter by value can be expensive. +Consider for example vector<vector<int>>: +

+ +
std::vector<int> x(1000);
+std::vector<std::vector<int>> v;
+...
+v.resize(v.size()+1, x);
+
+ +

+In the pass-by-value case, x is copied once to the parameter of +resize. And then internally, since the code can not know at compile +time by how much resize is growing the vector, x is +usually copied (not moved) a second time from resize's parameter into its proper place +within the vector. +

+ +

+With pass-by-const-reference, the x in the above example need be copied +only once. In this case, x has an expensive copy constructor and so any +copies that can be saved represents a significant savings. +

+ +

+If we can be efficient for push_back, we should be efficient for resize +as well. The resize taking a reference parameter has been coded and shipped in the +CodeWarrior library with no reports of problems which I am aware of. +

+ + + +

Proposed resolution:

+

+Change 23.2.2 [deque], p2: +

+ +
class deque {
+   ...
+   void resize(size_type sz, const T& c);
+
+ +

+Change 23.2.2.2 [deque.capacity], p3: +

+ +
void resize(size_type sz, const T& c);
+
+ +

+Change 23.2.3 [list], p2: +

+ +
class list {
+   ...
+   void resize(size_type sz, const T& c);
+
+ +

+Change 23.2.3.2 [list.capacity], p3: +

+ +
void resize(size_type sz, const T& c);
+
+ +

+Change 23.2.5 [vector], p2: +

+ +
class vector {
+   ...
+   void resize(size_type sz, const T& c);
+
+ +

+Change 23.2.5.2 [vector.capacity], p11: +

+ +
void resize(size_type sz, const T& c);
+
+ + + + + + +
+

680. move_iterator operator-> return

+

Section: 24.4.3.1 [move.iterator] Status: Ready + Submitter: Howard Hinnant Date: 2007-06-11

+

View all issues with Ready status.

+

Discussion:

+

+move_iterator's operator-> return type pointer +does not consistently match the type which is returned in the description +in 24.4.3.3.5 [move.iter.op.ref]. +

+ +
template <class Iterator>
+class move_iterator {
+public:
+    ...
+    typedef typename iterator_traits<Iterator>::pointer pointer;
+    ...
+    pointer operator->() const {return current;}
+    ...
+private: 
+    Iterator current; // exposition only
+};
+
+ + +

+There are two possible fixes. +

+ +
    +
  1. pointer operator->() const {return &*current;}
  2. +
  3. typedef Iterator pointer;
  4. +
+ +

+The first solution is the one chosen by reverse_iterator. A potential +disadvantage of this is it may not work well with iterators which return a +proxy on dereference and that proxy has overloaded operator&(). Proxy +references often need to overloaad operator&() to return a proxy +pointer. That proxy pointer may or may not be the same type as the iterator's +pointer type. +

+ +

+By simply returning the Iterator and taking advantage of the fact that +the language forwards calls to operator-> automatically until it +finds a non-class type, the second solution avoids the issue of an overloaded +operator&() entirely. +

+ +

Proposed resolution:

+

+Change the synopsis in 24.4.3.1 [move.iterator]: +

+ +
typedef typename iterator_traits<Iterator>::pointer pointer;
+
+ + + + + + +
+

684. Unclear which members of match_results should be used in comparison

+

Section: 28.10 [re.results] Status: Review + Submitter: Nozomu Katoo Date: 2007-05-27

+

View other active issues in [re.results].

+

View all other issues in [re.results].

+

View all issues with Review status.

+

Discussion:

+

+In 28.4 [re.syn] of N2284, two template functions +are declared here: +

+
// 28.10, class template match_results: 
+  <snip>
+// match_results comparisons 
+  template <class BidirectionalIterator, class Allocator> 
+    bool operator== (const match_results<BidirectionalIterator, Allocator>& m1, 
+                     const match_results<BidirectionalIterator, Allocator>& m2); 
+  template <class BidirectionalIterator, class Allocator> 
+    bool operator!= (const match_results<BidirectionalIterator, Allocator>& m1, 
+                     const match_results<BidirectionalIterator, Allocator>& m2); 
+
+// 28.10.6, match_results swap:
+
+ +

+But the details of these two bool operator functions (i.e., which members of +match_results should be used in comparison) are not described in any +following sections. +

+ +

[ +John adds: +]

+ + +

+That looks like a bug: operator== should return true only if +the two objects refer to the same match - ie if one object was constructed as a +copy of the other. +

+ +

[ +Kona (2007): Bill and Pete to add minor wording to that proposed in +N2409. +]

+ + + +

Proposed resolution:

+

+Add a new section after 28.10.6 [re.results.swap], which reads: +

+

+28.10.7 match_results non-member functions. +

+ +
+
template<class BidirectionalIterator, class Allocator> 
+  bool operator==(const match_results<BidirectionalIterator, Allocator>& m1, 
+                  const match_results<BidirectionalIterator, Allocator>& m2);
+
+
+

+Returns: true only if the two objects refer to the same match. +

+
+
+ +
+
template<class BidirectionalIterator, class Allocator> 
+  bool operator!=(const match_results<BidirectionalIterator, Allocator>& m1, 
+                  const match_results<BidirectionalIterator, Allocator>& m2);
+
+
+

+Returns: !(m1 == m2). +

+
+
+ +
+
template<class BidirectionalIterator, class Allocator> 
+  void swap(match_results<BidirectionalIterator, Allocator>& m1, 
+            match_results<BidirectionalIterator, Allocator>& m2);
+
+
+

+Returns: m1.swap(m2). +

+
+
+ + + + + +
+

685. reverse_iterator/move_iterator difference has invalid signatures

+

Section: 24.4.1.3.19 [reverse.iter.opdiff], 24.4.3.3.14 [move.iter.nonmember] Status: Review + Submitter: Bo Persson Date: 2007-06-10

+

View all issues with Review status.

+

Discussion:

+

+In C++03 the difference between two reverse_iterators +

+
ri1 - ri2
+
+

+is possible to compute only if both iterators have the same base +iterator. The result type is the difference_type of the base iterator. +

+

+In the current draft, the operator is defined as 24.4.1.3.19 [reverse.iter.opdiff] +

+
template<class Iterator1, class Iterator2> 
+typename reverse_iterator<Iterator>::difference_type 
+   operator-(const reverse_iterator<Iterator1>& x, 
+                    const reverse_iterator<Iterator2>& y);
+
+

+The return type is the same as the C++03 one, based on the no longer +present Iterator template parameter. +

+

+Besides being slightly invalid, should this operator work only when +Iterator1 and Iterator2 has the same difference_type? Or should the +implementation choose one of them? Which one? +

+

+The same problem now also appears in operator-() for move_iterator +24.4.3.3.14 [move.iter.nonmember]. +

+ + +

Proposed resolution:

+

+Change the synopsis in 24.4.1.1 [reverse.iterator]: +

+ +
+
template <class Iterator1, class Iterator2> 
+  typename reverse_iterator<Iterator>::difference_type auto operator-( 
+    const reverse_iterator<Iterator1>& x, 
+    const reverse_iterator<Iterator2>& y) -> decltype(operator-(Iterator1, Iterator2));
+
+
+

+Returns: y.current - x.current. +

+
+
+ +

+Change 24.4.1.3.19 [reverse.iter.opdiff]: +

+ +
+
template <class Iterator1, class Iterator2> 
+  typename reverse_iterator<Iterator>::difference_type auto operator-( 
+    const reverse_iterator<Iterator1>& x, 
+    const reverse_iterator<Iterator2>& y) -> decltype(operator-(Iterator1, Iterator2));
+
+
+

+Returns: y.current - x.current. +

+
+
+ + +

+Change the synopsis in 24.4.3.1 [move.iterator]: +

+ +
+
template <class Iterator1, class Iterator2> 
+  typename move_iterator<Iterator>::difference_type auto operator-( 
+    const move_iterator<Iterator1>& x, 
+    const move_iterator<Iterator2>& y) -> decltype(operator-(Iterator1, Iterator2));
+
+
+

+Returns: y.current - x.current. +

+
+
+ +

+Change 24.4.3.3.14 [move.iter.nonmember]: +

+ +
+
template <class Iterator1, class Iterator2> 
+  typename move_iterator<Iterator>::difference_type auto operator-( 
+    const move_iterator<Iterator1>& x, 
+    const move_iterator<Iterator2>& y) -> decltype(operator-(Iterator1, Iterator2));
+
+
+

+Returns: x.base() - y.base(). +

+
+
+ + + + + +
+

686. Unique_ptr and shared_ptr fail to specify non-convertibility to int for unspecified-bool-type

+

Section: 20.6.5.2.4 [unique.ptr.single.observers], 20.6.6.2.5 [util.smartptr.shared.obs] Status: Open + Submitter: Beman Dawes Date: 2007-06-14

+

View all issues with Open status.

+

Discussion:

+

+The standard library uses the operator unspecified-bool-type() const idiom in +five places. In three of those places (20.5.15.2.3 [func.wrap.func.cap], function capacity +for example) the returned value is constrained to disallow +unintended conversions to int. The standardese is +

+

+The return type shall not be convertible to int. +

+

+This constraint is omitted for unique_ptr and shared_ptr. It should be added for those. +

+ + +

Proposed resolution:

+

+To the Returns paragraph for operator unspecified-bool-type() +const +of 20.6.5.2.4 [unique.ptr.single.observers] paragraph 11 and 20.6.6.2.5 +[util.smartptr.shared.obs] paragraph 16, add the sentence: +

+

+The return type shall not be convertible to int. +

+ + +

[ +Kona (2007): Uncertain if nullptr will address this issue. +]

+ + + + + +
+

687. shared_ptr conversion constructor not constrained

+

Section: 20.6.6.2.1 [util.smartptr.shared.const], 20.6.6.3.1 [util.smartptr.weak.const] Status: Ready + Submitter: Peter Dimov Date: 2007-05-10

+

View all issues with Ready status.

+

Discussion:

+

+Since all conversions from shared_ptr<T> to shared_ptr<U> have the same +rank regardless of the relationship between T and U, reasonable user +code that works with raw pointers fails with shared_ptr: +

+ +
void f( shared_ptr<void> );
+void f( shared_ptr<int> );
+
+int main()
+{
+  f( shared_ptr<double>() ); // ambiguous
+}
+
+ +

+Now that we officially have enable_if, we can constrain the constructor +and the corresponding assignment operator to only participate in the +overload resolution when the pointer types are compatible. +

+ + +

Proposed resolution:

+

+In 20.6.6.2.1 [util.smartptr.shared.const], change: +

+ +

+-14- Requires: For the second constructor The +second constructor shall not participate in the overload resolution +unless Y* shall be is implicitly convertible +to T*. +

+ +

+In 20.6.6.3.1 [util.smartptr.weak.const], change: +

+ +
+
template<class Y> weak_ptr(shared_ptr<Y> const& r);
+weak_ptr(weak_ptr const& r);
+template<class Y> weak_ptr(weak_ptr<Y> const& r);
+weak_ptr(weak_ptr const& r);
+template<class Y> weak_ptr(weak_ptr<Y> const& r);
+template<class Y> weak_ptr(shared_ptr<Y> const& r);
+
+

+-4- Requires: For tThe second and +third constructors, shall not participate in the +overload resolution unless Y* shall be +is implicitly convertible to T*. +

+
+ + + + + + +
+

688. reference_wrapper, cref unsafe, allow binding to rvalues

+

Section: 20.5.5.1 [refwrap.const] Status: Ready + Submitter: Peter Dimov Date: 2007-05-10

+

View other active issues in [refwrap.const].

+

View all other issues in [refwrap.const].

+

View all issues with Ready status.

+

Discussion:

+

+A reference_wrapper can be constructed from an rvalue, either by using +the constructor, or via cref (and ref in some corner cases). This leads +to a dangling reference being stored into the reference_wrapper object. +Now that we have a mechanism to detect an rvalue, we can fix them to +disallow this source of undefined behavior. +

+ +

+Also please see the thread starting at c++std-lib-17398 for some good discussion on this subject. +

+ + + +

Proposed resolution:

+

+In 20.5.5 [refwrap], add: +

+ +
private:
+  explicit reference_wrapper(T&&);
+
+ +

+In 20.5.5.1 [refwrap.const], add: +

+ +
+
explicit reference_wrapper(T&&);
+
+

+-?- Not defined to disallow creating a reference_wrapper from an rvalue. +

+
+ +

+In the synopsis of <functional> (20.5.5 [refwrap]), change the declarations +of ref and cref to: +

+ +
template<class T> reference_wrapper<T> ref(T&&);
+template<class T> reference_wrapper<const T> cref(const T&&);
+
+ +

+In 20.5.5.5 [refwrap.helpers], change: +

+ +
+
template<class T> reference_wrapper<T> ref(T&& t);
+
+
+

+-1- Requires: t shall be an lvalue. +

+
+
+ +

and change:

+ +
+
template<class T> reference_wrapper<const T> cref(const T&& t);
+
+
+

+-6- Requires: t shall be an lvalue. +

+
+
+ + + +

[ +N2292 +addresses the first part of the resolution but not the second. +]

+ + + + + +
+

689. reference_wrapper constructor overly constrained

+

Section: 20.5.5.1 [refwrap.const] Status: Ready + Submitter: Peter Dimov Date: 2007-05-10

+

View other active issues in [refwrap.const].

+

View all other issues in [refwrap.const].

+

View all issues with Ready status.

+

Discussion:

+

+The constructor of reference_wrapper is currently explicit. The primary +motivation behind this is the safety problem with respect to rvalues, +which is addressed by the proposed resolution of the previous issue. +Therefore we should consider relaxing the requirements on the +constructor since requests for the implicit conversion keep resurfacing. +

+

+Also please see the thread starting at c++std-lib-17398 for some good discussion on this subject. +

+ + +

Proposed resolution:

+

+Remove the explicit from the constructor of reference_wrapper. If the +proposed resolution of the previous issue is accepted, remove the +explicit from the T&& constructor as well to keep them in sync. +

+ + + + + +
+

691. const_local_iterator cbegin, cend missing from TR1

+

Section: 23.4 [unord], TR1 6.3 [tr.hash] Status: Review + Submitter: Joaquín M López Muñoz Date: 2007-06-14

+

View other active issues in [unord].

+

View all other issues in [unord].

+

View all issues with Review status.

+

Discussion:

+

+The last version of TR1 does not include the following member +functions +for unordered containers: +

+ +
const_local_iterator cbegin(size_type n) const;
+const_local_iterator cend(size_type n) const;
+
+ +

+which looks like an oversight to me. I've checked th TR1 issues lists +and the latest working draft of the C++0x std (N2284) and haven't +found any mention to these menfuns or to their absence. +

+

+Is this really an oversight, or am I missing something? +

+ + + +

Proposed resolution:

+

+Add the following two rows to table 93 (unordered associative container +requirements) in section 23.1.3 [unord.req]: +

+ +
+ + + + + + + + + + + +
Unordered associative container requirements (in addition to container)
expression return type assertion/note pre/post-condition complexity
b.cbegin(n) const_local_iterator n shall be in the range [0, bucket_count()). Note: [b.cbegin(n), b.cend(n)) is a valid range containing all of the elements in the nth bucket. Constant
b.cend(n) const_local_iterator n shall be in the range [0, bucket_count()). Constant
+
+ +

+Add to the synopsis in 23.4.1 [unord.map]: +

+ +
const_local_iterator cbegin(size_type n) const;
+const_local_iterator cend(size_type n) const;
+
+ +

+Add to the synopsis in 23.4.2 [unord.multimap]: +

+ +
const_local_iterator cbegin(size_type n) const;
+const_local_iterator cend(size_type n) const;
+
+ +

+Add to the synopsis in 23.4.3 [unord.set]: +

+ +
const_local_iterator cbegin(size_type n) const;
+const_local_iterator cend(size_type n) const;
+
+ +

+Add to the synopsis in 23.4.4 [unord.multiset]: +

+ +
const_local_iterator cbegin(size_type n) const;
+const_local_iterator cend(size_type n) const;
+
+ + + + + + +
+

692. get_money and put_money should be formatted I/O functions

+

Section: 27.6.4 [ext.manip] Status: New + Submitter: Martin Sebor Date: 2007-06-22

+

View all other issues in [ext.manip].

+

View all issues with New status.

+

Discussion:

+

+In a private email Bill Plauger notes: +

+

+I  believe that  the function  that  implements get_money +[from N2072] +should behave  as a  formatted input function,  and the  function that +implements put_money should  behave as a formatted output +function. This  has implications regarding the  skipping of whitespace +and the handling of errors, among other things. +

+

+The words  don't say that  right now and  I'm far from  convinced that +such a change is editorial. +

+

+Martin's response: +

+

+I agree that the manipulators should handle exceptions the same way as +formatted I/O functions do. The text in N2072 assumes so but the +Returns clause explicitly omits exception handling for the sake +of brevity. The spec should be clarified to that effect. +

+

+As for dealing  with whitespace, I also agree it  would make sense for +the extractors  and inserters involving the new  manipulators to treat +it the same way as formatted I/O. +

+ + +

Proposed resolution:

+

+Add  a new  paragraph immediately  above  p4 of 27.6.4 [ext.manip] with  the +following text: +

+

+Effects:  The   expression  in >> get_money(mon, intl) +described below behaves as a formatted input function (as +described in 27.6.1.2.1 [istream.formatted.reqmts]). +

+

+Also change p4 of 27.6.4 [ext.manip] as follows: +

+

+Returns: An object s of unspecified type such that +if in is  an object of type basic_istream<charT, +traits>    then    the    expression   in >> get_money(mon, intl) behaves as a formatted input function +that    calls    f(in, mon, intl)    were +called. The function f can be defined as... +

+ + + + + +
+

693. std::bitset::all() missing

+

Section: 23.3.5 [template.bitset] Status: Ready + Submitter: Martin Sebor Date: 2007-06-22

+

View other active issues in [template.bitset].

+

View all other issues in [template.bitset].

+

View all issues with Ready status.

+

Discussion:

+

+The bitset class template provides the member function +any() to determine whether an object of the type has any +bits set, and the member function none() to determine +whether all of an object's bits are clear. However, the template does +not provide a corresponding function to discover whether a +bitset object has all its bits set. While it is +possible, even easy, to obtain this information by comparing the +result of count() with the result of size() +for equality (i.e., via b.count() == b.size()) the +operation is less efficient than a member function designed +specifically for that purpose could be. (count() must +count all non-zero bits in a bitset a word at a time +while all() could stop counting as soon as it encountered +the first word with a zero bit). +

+ + +

Proposed resolution:

+

+Add a declaration of the new member function all() to the +defintion of the bitset template in 23.3.5 [template.bitset], p1, +right above the declaration of any() as shown below: +

+ +
bool operator!=(const bitset<N>& rhs) const;
+bool test(size_t pos) const;
+bool all() const;
+bool any() const;
+bool none() const;
+
+ +

+Add a description of the new member function to the end of 23.3.5.2 [bitset.members] with the following text: +

+

+bool all() const; +

+
+Returns: count() == size(). +
+
+ +

+In addition, change the description of any() and +none() for consistency with all() as +follows: +

+

+bool any() const; +

+
+

+Returns: true if any bit in *this +is onecount() != 0. +

+
+

+bool none() const; +

+
+

+Returns: true if no bit in *this +is onecount() == 0. +

+
+
+ + + + + +
+

694. std::bitset and long long

+

Section: 23.3.5 [template.bitset] Status: Ready + Submitter: Martin Sebor Date: 2007-06-22

+

View other active issues in [template.bitset].

+

View all other issues in [template.bitset].

+

View all issues with Ready status.

+

Discussion:

+

+Objects of the bitset class template specializations can +be constructed from and explicitly converted to values of the widest +C++ integer type, unsigned long. With the introduction +of long long into the language the template should be +enhanced to make it possible to interoperate with values of this type +as well, or perhaps uintmax_t. See c++std-lib-18274 for +a brief discussion in support of this change. +

+ + +

Proposed resolution:

+

+For simplicity, instead of adding overloads for unsigned long +long and dealing with possible ambiguities in the spec, replace +the bitset ctor that takes an unsigned long +argument with one taking unsigned long long in the +definition of the template as shown below. (The standard permits +implementations to add overloads on other integer types or employ +template tricks to achieve the same effect provided they don't cause +ambiguities or changes in behavior.) +

+
+
// [bitset.cons] constructors:
+bitset();
+bitset(unsigned long long val);
+template<class charT, class traits, class Allocator>
+explicit bitset(
+                const basic_string<charT,traits,Allocator>& str,
+                typename basic_string<charT,traits,Allocator>::size_type pos = 0,
+                typename basic_string<charT,traits,Allocator>::size_type n =
+                    basic_string<charT,traits,Allocator>::npos);
+
+
+

+Make a corresponding change in 23.3.5.1 [bitset.cons], p2: +

+
+

+bitset(unsigned long long val); +

+
+Effects: Constructs an object of class bitset<N>, +initializing the first M bit positions to the +corresponding bit values in val. +M is the smaller of N and the +number of bits in the value representation (section [basic.types]) of +unsigned long long. If M < +N is true, the remaining bit +positions are initialized to zero. +
+
+ +

+Additionally, introduce a new member function to_ullong() +to make it possible to convert bitset to values of the +new type. Add the following declaration to the definition of the +template, immediate after the declaration of to_ulong() +in 23.3.5 [template.bitset], p1, as shown below: +

+
+
// element access:
+bool operator[](size_t pos) const; // for b[i];
+reference operator[](size_t pos); // for b[i];
+unsigned long to_ulong() const;
+unsigned long long to_ullong() const;
+template <class charT, class traits, class Allocator>
+basic_string<charT, traits, Allocator> to_string() const;
+
+
+

+And add a description of the new member function to 23.3.5.2 [bitset.members], +below the description of the existing to_ulong() (if +possible), with the following text: +

+
+

+unsigned long long to_ullong() const; +

+
+Throws: overflow_error if the integral value +x corresponding to the bits in *this +cannot be represented as type unsigned long long. +
+
+Returns: x. +
+
+ + + + + +
+

695. ctype<char>::classic_table() not accessible

+

Section: 22.2.1.3 [facet.ctype.special] Status: Ready + Submitter: Martin Sebor Date: 2007-06-22

+

View all issues with Ready status.

+

Discussion:

+

+The ctype<char>::classic_table() static member +function returns a pointer to an array of const +ctype_base::mask objects (enums) that contains +ctype<char>::table_size elements. The table +describes the properties of the character set in the "C" locale (i.e., +whether a character at an index given by its value is alpha, digit, +punct, etc.), and is typically used to initialize the +ctype<char> facet in the classic "C" locale (the +protected ctype<char> member function +table() then returns the same value as +classic_table()). +

+

+However, while ctype<char>::table_size (the size of +the table) is a public static const member of the +ctype<char> specialization, the +classic_table() static member function is protected. That +makes getting at the classic data less than convenient (i.e., one has +to create a whole derived class just to get at the masks array). It +makes little sense to expose the size of the table in the public +interface while making the table itself protected, especially when the +table is a constant object. +

+

+The same argument can be made for the non-static protected member +function table(). +

+ + +

Proposed resolution:

+

+Make the ctype<char>::classic_table() and +ctype<char>::table() member functions public by +moving their declarations into the public section of the definition of +specialization in 22.2.1.3 [facet.ctype.special] as shown below: +

+
+
  static locale::id id;
+  static const size_t table_size = IMPLEMENTATION_DEFINED;
+protected:
+  const mask* table() const throw();
+  static const mask* classic_table() throw();
+protected:
+
+~ctype(); // virtual
+virtual char do_toupper(char c) const;
+
+
+ + + + + +
+

696. istream::operator>>(int&) broken

+

Section: 27.6.1.2.2 [istream.formatted.arithmetic] Status: New + Submitter: Martin Sebor Date: 2007-06-23

+

View other active issues in [istream.formatted.arithmetic].

+

View all other issues in [istream.formatted.arithmetic].

+

View all issues with New status.

+

Discussion:

+

+From message c++std-lib-17897: +

+

+The code shown in 27.6.1.2.2 [istream.formatted.arithmetic] as the "as if" +implementation of the two arithmetic extractors that don't have a +corresponding num_get interface (i.e., the +short and int overloads) is subtly buggy in +how it deals with EOF, overflow, and other similar +conditions (in addition to containing a few typos). +

+

+One problem is that if num_get::get() reaches the EOF +after reading in an otherwise valid value that exceeds the limits of +the narrower type (but not LONG_MIN or +LONG_MAX), it will set err to +eofbit. Because of the if condition testing for +(err == 0), the extractor won't set +failbit (and presumably, return a bogus value to the +caller). +

+

+Another problem with the code is that it never actually sets the +argument to the extracted value. It can't happen after the call to +setstate() since the function may throw, so we need to +show when and how it's done (we can't just punt as say: "it happens +afterwards"). However, it turns out that showing how it's done isn't +quite so easy since the argument is normally left unchanged by the +facet on error except when the error is due to a misplaced thousands +separator, which causes failbit to be set but doesn't +prevent the facet from storing the value. +

+ + +

Proposed resolution:

+

+

+ + + + + +
+

697. New <system_error> header leads to name clashes

+

Section: 19.4 [syserr] Status: New + Submitter: Daniel Krügler Date: 2007-06-24

+

View all issues with New status.

+

Discussion:

+

+The most recent state of +N2241 +as well as the current draft +N2284 +(section 19.4 [syserr], p.2) proposes a +new +enumeration type posix_errno immediatly in the namespace std. One of +the enumerators has the name invalid_argument, or fully qualified: +std::invalid_argument. This name clashes with the exception type +std::invalid_argument, see 19.1 [std.exceptions]/p.3. This clash makes +e.g. the following snippet invalid: +

+ +
#include <system_error>
+#include <stdexcept>
+
+void foo() { throw std::invalid_argument("Don't call us - we call you!"); }
+
+ +

+I propose that this enumeration type (and probably the remaining parts +of +<system_error> as well) should be moved into one additional inner +namespace, e.g. sys or system to reduce foreseeable future clashes +due +to the great number of members that std::posix_errno already contains +(Btw.: Why has the already proposed std::sys sub-namespace from +N2066 +been rejected?). A further clash candidate seems to be +std::protocol_error +(a reasonable name for an exception related to a std network library, +I guess). +

+ +

+Another possible resolution would rely on the proposed strongly typed +enums, +as described in N2213. +But maybe the forbidden implicit conversion to integral types would +make +these enumerators less attractive in this special case? +

+ + +

Proposed resolution:

+

+

+ + + + + + +
+

698. Some system_error issues

+

Section: 19.4.5.1 [syserr.syserr.overview] Status: New + Submitter: Daniel Krügler Date: 2007-06-24

+

View all issues with New status.

+

Discussion:

+

+In 19.4.5.1 [syserr.syserr.overview] we have the class definition of +std::system_error. In contrast to all exception classes, which +are constructible with a what_arg string (see 19.1 [std.exceptions], +or ios_base::failure in 27.4.2.1.1 [ios::failure]), only overloads with with +const string& are possible. For consistency with the re-designed +remaining exception classes this class should also provide +c'tors which accept a const char* what_arg string. +

+

+Please note that this proposed addition makes sense even +considering the given implementation hint for what(), because +what_arg is required to be set as what_arg of the base class +runtime_error, which now has the additional c'tor overload +accepting a const char*. +

+ + +

Proposed resolution:

+

+

+ + + + + +
+

700. N1856 defines struct identity

+

Section: 20.2.2 [forward] Status: Ready + Submitter: P.J. Plauger Date: 2007-07-01

+

View all issues with Ready status.

+

Discussion:

+

+N1856 +defines struct identity in <utility> which clashes with +the traditional definition of struct identity in <functional> +(not standard, but a common extension from old STL). Be nice +if we could avoid this name clash for backward compatibility. +

+ + +

Proposed resolution:

+

+Change 20.2.2 [forward]: +

+ +
+
template <class T> struct identity
+{
+    typedef T type;
+    const T& operator()(const T& x) const;
+};
+
+
+
const T& operator()(const T& x) const;
+
+
+

+Returns: x. +

+
+
+ +
+ + + + + + +
+

701. assoc laguerre poly's

+

Section: TR1 5.2.1.1 [tr.num.sf.Lnm] Status: New + Submitter: Christopher Crawford Date: 2007-06-30

+

View all issues with New status.

+

Discussion:

+

+I see that the definition the associated Laguerre +polynomials TR1 5.2.1.1 [tr.num.sf.Lnm] has been corrected since +N1687. +However, the draft standard only specifies ranks of integer value m, +while the associated Laguerre polynomials are actually valid for real +values of m > -1.  In the case of non-integer values of m, the +definition  Ln(m) = (1/n!)exx-m (d/dx)n (e-xxm+n) +must be used, which also holds for integer values of m.  See +Abramowitz & Stegun, 22.11.6 for the general case, and 22.5.16-17 for +the integer case.  In fact fractional values are most commonly used in +physics, for example to m = +/- 1/2 to describe the harmonic +oscillator in 1 dimension, and 1/2, 3/2, 5/2, ... in 3 +dimensions. +

+

+If I am correct, the calculation of the more general case is no +more difficult, and is in fact the function implemented in the GNU +Scientific Library.  I would urge you to consider upgrading the +standard, either adding extra functions for real m or switching the +current ones to double. +

+ + +

Proposed resolution:

+

+

+ + + + + +
+

702. Restriction in associated Legendre functions

+

Section: TR1 5.2.1.2 [tr.num.sf.Plm] Status: New + Submitter: Christopher Crawford Date: 2007-06-30

+

View all issues with New status.

+

Discussion:

+

+One other small thing, in TR1 5.2.1.2 [tr.num.sf.Plm], the restriction should  be +|x| <= 1, not x >= 0.

+ + +

Proposed resolution:

+

+

+ + + + + +
+

703. map::at() need a complexity specification

+

Section: 23.3.1.2 [map.access] Status: Ready + Submitter: Joe Gottman Date: 2007-07-03

+

View all other issues in [map.access].

+

View all issues with Ready status.

+

Discussion:

+

+map::at() need a complexity specification. +

+ + +

Proposed resolution:

+

+Add the following to the specification of map::at(), 23.3.1.2 [map.access]: +

+
+

+Complexity: logarithmic. +

+
+ + + + + +
+

704. MoveAssignable requirement for container value type overly strict

+

Section: 23.1 [container.requirements] Status: Open + Submitter: Howard Hinnant Date: 2007-05-20

+

View other active issues in [container.requirements].

+

View all other issues in [container.requirements].

+

View all issues with Open status.

+

Discussion:

+

+The move-related changes inadvertently overwrote the intent of 276. +Issue 276 removed the requirement of CopyAssignable from +most of the member functions of node-based containers. But the move-related changes +unnecessarily introduced the MoveAssignable requirement for those members which used to +require CopyAssignable. +

+ +

+We also discussed (c++std-lib-18722) the possibility of dropping MoveAssignable +from some of the sequence requirements. Additionally the in-place construction +work may further reduce requirements. For purposes of an easy reference, here are the +minimum sequence requirements as I currently understand them. Those items in requirements +table in the working draft which do not appear below have been purposefully omitted for +brevity as they do not have any requirements of this nature. Some items which do not +have any requirements of this nature are included below just to confirm that they were +not omitted by mistake. +

+ + + + + + + + +
Container Requirements
X u(a)value_type must be CopyConstructible
X u(rv)array requires value_type to be MoveConstructible
a = uSequences require value_type to be CopyConstructible and CopyAssignable. + Associative containers require value_type to be CopyConstructible.
a = rvarray requires value_type to be MoveAssignable. + Sequences with non-Swappable allocators require value_type to be MoveConstructible and MoveAssignable. + Associative containers with non-Swappable allocators require value_type to be MoveConstructible.
swap(a,u)array requires value_type to be Swappable. + Sequences with non-Swappable allocators require value_type to be Swappable, MoveConstructible and MoveAssignable. + Associative containers with non-Swappable allocators require value_type to be MoveConstructible.
+ +

+

+ + + + + + + + + + + + + + + + + +
Sequence Requirements
X(n)value_type must be DefaultConstructible
X(n, t)value_type must be CopyConstructible
X(i, j)If the iterators return an lvalue the value_type must be CopyConstructible. + If the iterators return an rvalue the value_type must be MoveConstructible.
a.insert(p, t)The value_type must be CopyConstructible. + The sequences vector and deque also require the value_type to be CopyAssignable.
a.insert(p, rv)The value_type must be MoveConstructible. + The sequences vector and deque also require the value_type to be MoveAssignable.
a.insert(p, n, t)The value_type must be CopyConstructible. + The sequences vector and deque also require the value_type to be CopyAssignable.
a.insert(p, i, j)If the iterators return an lvalue the value_type must be CopyConstructible. + The sequences vector and deque also require the value_type to be CopyAssignable when the iterators return an lvalue. + If the iterators return an rvalue the value_type must be MoveConstructible. + The sequences vector and deque also require the value_type to be MoveAssignable when the iterators return an rvalue.
a.erase(p)The sequences vector and deque require the value_type to be MoveAssignable.
a.erase(q1, q2)The sequences vector and deque require the value_type to be MoveAssignable.
a.clear()
a.assign(i, j)If the iterators return an lvalue the value_type must be CopyConstructible and CopyAssignable. + If the iterators return an rvalue the value_type must be MoveConstructible and MoveAssignable.
a.assign(n, t)The value_type must be CopyConstructible and CopyAssignable.
a.resize(n)The value_type must be DefaultConstructible. + The sequences vector and deque also require the value_type to be MoveConstructible.
a.resize(n, t)The value_type must be CopyConstructible.
+ +

+

+ + + + + + + + + + + + + +
Optional Sequence Requirements
a.front()
a.back()
a.push_front(t)The value_type must be CopyConstructible.
a.push_front(rv)The value_type must be MoveConstructible.
a.push_back(t)The value_type must be CopyConstructible.
a.push_back(rv)The value_type must be MoveConstructible.
a.pop_front()
a.pop_back()
a[n]
a.at[n]
+ +

+

+ + + + + + + + + + + +
Associative Container Requirements
X(i, j)If the iterators return an lvalue the value_type must be CopyConstructible. + If the iterators return an rvalue the value_type must be MoveConstructible.
a_uniq.insert(t)The value_type must be CopyConstructible.
a_uniq.insert(rv)The key_type and the mapped_type (if it exists) must be MoveConstructible.
a_eq.insert(t)The value_type must be CopyConstructible.
a_eq.insert(rv)The key_type and the mapped_type (if it exists) must be MoveConstructible.
a.insert(p, t)The value_type must be CopyConstructible.
a.insert(p, rv)The key_type and the mapped_type (if it exists) must be MoveConstructible.
a.insert(i, j)If the iterators return an lvalue the value_type must be CopyConstructible. + If the iterators return an rvalue the key_type and the mapped_type (if it exists) must be MoveConstructible..
+ +

+

+ + + + + + + + + + + +
Unordered Associative Container Requirements
X(i, j, n, hf, eq)If the iterators return an lvalue the value_type must be CopyConstructible. + If the iterators return an rvalue the value_type must be MoveConstructible.
a_uniq.insert(t)The value_type must be CopyConstructible.
a_uniq.insert(rv)The key_type and the mapped_type (if it exists) must be MoveConstructible.
a_eq.insert(t)The value_type must be CopyConstructible.
a_eq.insert(rv)The key_type and the mapped_type (if it exists) must be MoveConstructible.
a.insert(p, t)The value_type must be CopyConstructible.
a.insert(p, rv)The key_type and the mapped_type (if it exists) must be MoveConstructible.
a.insert(i, j)If the iterators return an lvalue the value_type must be CopyConstructible. + If the iterators return an rvalue the key_type and the mapped_type (if it exists) must be MoveConstructible..
+ +

+

+ + + + + +
Miscellaneous Requirements
map[lvalue-key]The key_type must be CopyConstructible. + The mapped_type must be DefaultConstructible and MoveConstructible.
map[rvalue-key]The key_type must be MoveConstructible. + The mapped_type must be DefaultConstructible and MoveConstructible.
+ +

[ +Kona (2007): Howard and Alan to update requirements table in issue with emplace signatures. +]

+ + + + +

Proposed resolution:

+ + + + + + +
+

705. type-trait decay incompletely specified

+

Section: 20.4.7 [meta.trans.other] Status: Ready + Submitter: Thorsten Ottosen Date: 2007-07-08

+

View all issues with Ready status.

+

Discussion:

+

+The current working draft has a type-trait decay in 20.4.7 [meta.trans.other]. +

+ +

+Its use is to turn C++03 pass-by-value parameters into efficient C++0x +pass-by-rvalue-reference parameters. However, the current definition +introduces an incompatible change where the cv-qualification of the +parameter type is retained. The deduced type should loose such +cv-qualification, as pass-by-value does. +

+ + +

Proposed resolution:

+

+In 20.4.7 [meta.trans.other] change the last sentence: +

+ +

+Otherwise the member typedef type equals remove_cv<U>::type. +

+ +

+In 20.3.1.2 [tuple.creation]/1 change: +

+ +

+where each Vi in VTypes is X& if, for the +corresponding type Ti in Types, +remove_cv<remove_reference<Ti>::type>::type equals +reference_wrapper<X>, otherwise Vi is +decay<Ti>::type. +Let Ui be decay<Ti>::type for each +Ti in Types. Then each Vi in VTypes +is X& if Ui equals +reference_wrapper<X>, otherwise Vi is +Ui. +

+ + + + + + +
+

706. make_pair() should behave as make_tuple() wrt. reference_wrapper()

+

Section: 20.2.3 [pairs] Status: Ready + Submitter: Thorsten Ottosen Date: 2007-07-08

+

View all other issues in [pairs].

+

View all issues with Ready status.

+

Discussion:

+

+The current draft has make_pair() in 20.2.3 [pairs]/16 +and make_tuple() in 20.3.1.2 [tuple.creation]. +make_tuple() detects the presence of +reference_wrapper<X> arguments and "unwraps" the reference in +such cases. make_pair() would OTOH create a +reference_wrapper<X> member. I suggest that the two +functions are made to behave similar in this respect to minimize +confusion. +

+ + +

Proposed resolution:

+

+In 20.2 [utility] change the synopsis for make_pair() to read +

+ +
template <class T1, class T2>
+  pair<typename decay<T1>::type V1, typename decay<T2>::type V2> make_pair(T1&&, T2&&);
+
+ +

+In 20.2.3 [pairs]/16 change the declaration to match the above synopsis. +Then change the 20.2.3 [pairs]/17 to: +

+ +
+

+Returns: pair<typename decay<T1>::type V1,typename decay<T2>::type V2>(forward<T1>(x),forward<T2>(y)) where V1 and +V2 are determined as follows: Let Ui be +decay<Ti>::type for each Ti. Then each +Vi is X& if Ui equals +reference_wrapper<X>, otherwise Vi is +Ui. +

+
+ + + + + + +
+

707. null pointer constant for exception_ptr

+

Section: 18.7.1 [exception] Status: Open + Submitter: Jens Maurer Date: 2007-07-20

+

View all issues with Open status.

+

Discussion:

+ +

+From the Toronto Core wiki: +

+ +

+What do you mean by "null pointer constant"? How do you guarantee that +exception_ptr() == 1 doesn't work?  Do you even want to prevent that? +What's the semantics?  What about void *p = 0; exception_ptr() == p? +Maybe disallow those in the interface, but how do you do that with +portable C++? Could specify just "make it work". +

+ +

+Peter's response: +

+ +

+null pointer constant as defined in 4.10 [conv.ptr]. Intent is "just make it +work", can be implemented as assignment operator taking a unique pointer +to member, as in the unspecified bool type idiom. +

+ + + +

Proposed resolution:

+

+

+ + + + + +
+

708. Locales need to be per thread and updated for POSIX changes

+

Section: 22 [localization] Status: Open + Submitter: Peter Dimov Date: 2007-07-28

+

View all other issues in [localization].

+

View all issues with Open status.

+

Discussion:

+

+The POSIX "Extended API Set Part 4," +

+

+http://www.opengroup.org/sib/details.tpl?id=C065 +

+

+introduces extensions to the C locale mechanism that +allow multiple concurrent locales to be used in the same application +by introducing a type locale_t that is very similar to +std::locale, and a number of _l functions that make use of it. +

+

+The global locale (set by setlocale) is now specified to be per- +process. If a thread does not call uselocale, the global locale is +in effect for that thread. It can install a per-thread locale by +using uselocale. +

+

+There is also a nice querylocale mechanism by which one can obtain +the name (such as "de_DE") for a specific facet, even for combined +locales, with no std::locale equivalent. +

+

+std::locale should be harmonized with the new POSIX locale_t +mechanism and provide equivalents for uselocale and querylocale. +

+ +

[ +Kona (2007): Bill and Nick to provide wording. +]

+ + + + +

Proposed resolution:

+

+

+ + + + + +
+

709. char_traits::not_eof has wrong signature

+

Section: 21.1.3 [char.traits.specializations] Status: New + Submitter: Bo Persson Date: 2007-08-13

+

View all issues with New status.

+

Discussion:

+

+The changes made for constexpr in 21.1.3 [char.traits.specializations] have +not only changed the not_eof function from pass by const reference to +pass by value, it has also changed the parameter type from int_type to +char_type. +

+

+This doesn't work for type char, and is inconsistent with the +requirements in Table 56, Traits requirements, 21.1.1 [char.traits.require]. +

+ +

+Pete adds: +

+ +

+For what it's worth, that may not have been an intentional change. +N2349, which detailed the changes for adding constant expressions to +the library, has strikeout bars through the const and the & that +surround the char_type argument, but none through char_type itself. +So the intention may have been just to change to pass by value, with +text incorrectly copied from the standard. +

+ + + +

Proposed resolution:

+

+Change the signature in 21.1.3.1 [char.traits.specializations.char], +21.1.3.2 [char.traits.specializations.char16_t], 21.1.3.3 [char.traits.specializations.char32_t], +and 21.1.3.4 [char.traits.specializations.wchar.t] to +

+ +
static constexpr int_type not_eof(char_type int_type c);
+
+ + + + + + +
+

710. Missing postconditions

+

Section: 20.6.6.2 [util.smartptr.shared] Status: New + Submitter: Peter Dimov Date: 2007-08-24

+

View other active issues in [util.smartptr.shared].

+

View all other issues in [util.smartptr.shared].

+

View all issues with New status.

+

Discussion:

+

+A discussion on +comp.std.c++ +has identified a contradiction in the shared_ptr specification. +The shared_ptr move constructor and the cast functions are +missing postconditions for the get() accessor. +

+ + +

Proposed resolution:

+

+Add to 20.6.6.2.1 [util.smartptr.shared.const]: +

+ +
+
shared_ptr(shared_ptr&& r);
+template<class Y> shared_ptr(shared_ptr<Y>&& r);
+
+
+

+Postconditions: *this shall contain the old value of r. r +shall be empty. r.get() == 0. +

+
+
+ +

+Add to 20.6.6.2.10 [util.smartptr.shared.cast]: +

+ +
+
template<class T, class U> shared_ptr<T> static_pointer_cast(shared_ptr<U> const& r);
+
+
+

+Postconditions: If w is the return value, +w.get() == static_cast<T*>(r.get()) && w.use_count() == r.use_count(). +

+
+
+ +
+
template<class T, class U> shared_ptr<T> dynamic_pointer_cast(shared_ptr<U> const& r);
+
+
+

+Postconditions: If w is the return value, w.get() == dynamic_cast<T*>(r.get()). +

+
+
+ +
+
template<class T, class U> shared_ptr<T> const_pointer_cast(shared_ptr<U> const& r);
+
+
+

+Postconditions: If w is the return value, +w.get() == const_cast<T*>(r.get()) && w.use_count() == r.use_count(). +

+
+
+ +

+Alberto Ganesh Barbati has written an +alternative proposal +where he suggests (among other things) that the casts be respecified in terms of +the aliasing constructor as follows: +

+ +

+Change 20.6.6.2.10 [util.smartptr.shared.cast]: +

+ +
+

+-2- Returns: If r is empty, an empty +shared_ptr<T>; otherwise, a shared_ptr<T> +object that stores static_cast<T*>(r.get()) and shares ownership with +r. shared_ptr<T>(r, static_cast<T*>(r.get()). +

+
+ +
+

+-6- Returns: +

+
    +
  • When dynamic_cast<T*>(r.get()) returns a nonzero value, +a shared_ptr<T> object that stores a copy +of it and shares ownership with r;
  • +
  • Otherwise, an empty shared_ptr<T> object.
  • +
  • If p = dynamic_cast<T*>(r.get()) is a non-null pointer, shared_ptr<T>(r, p);
  • +
  • Otherwise, shared_ptr<T>().
  • +
+
+ +
+

+-10- Returns: If r is empty, an empty +shared_ptr<T>; otherwise, a shared_ptr<T> +object that stores const_cast<T*>(r.get()) and shares ownership with +r. shared_ptr<T>(r, const_cast<T*>(r.get()). +

+
+ +

+This takes care of the missing postconditions for the casts by bringing +in the aliasing constructor postcondition "by reference". +

+ + + + + + +
+

711. Contradiction in empty shared_ptr

+

Section: 20.6.6.2.5 [util.smartptr.shared.obs] Status: New + Submitter: Peter Dimov Date: 2007-08-24

+

View all other issues in [util.smartptr.shared.obs].

+

View all issues with New status.

+

Discussion:

+

+A discussion on +comp.std.c++ +has identified a contradiction in the shared_ptr specification. +The note: +

+ +

+[ Note: this constructor allows creation of an empty shared_ptr instance with a non-NULL stored pointer. +-end note ] +

+ +

+after the aliasing constructor +

+ +
template<class Y> shared_ptr(shared_ptr<Y> const& r, T *p);
+
+ +

+reflects the intent of +N2351 +to, well, allow the creation of an empty shared_ptr +with a non-NULL stored pointer. +

+ +

+This is contradicted by the second sentence in the Returns clause of 20.6.6.2.5 [util.smartptr.shared.obs]: +

+ +
+
T* get() const;
+
+

+Returns: the stored pointer. Returns a null pointer if *this is empty. +

+
+ + + +

Proposed resolution:

+

+In keeping the N2351 spirit and obviously my preference, change 20.6.6.2.5 [util.smartptr.shared.obs]: +

+ +
+
T* get() const;
+
+

+Returns: the stored pointer. Returns a null pointer if *this is empty. +

+
+ +

+Alternative proposed resolution: (I won't be happy if we do this, but it's possible): +

+ +

+Change 20.6.6.2.1 [util.smartptr.shared.const]: +

+ +
+
template<class Y> shared_ptr(shared_ptr<Y> const& r, T *p);
+
+
+

+Requires: If r is empty, p shall be 0. +

+

+[ Note: this constructor allows creation of an empty shared_ptr +instance with a non-NULL stored pointer. +-- end note ] +

+
+
+ + + + + + +
+

713. sort() complexity is too lax

+

Section: 25.3.1.1 [sort] Status: New + Submitter: Matt Austern Date: 2007-08-30

+

View all issues with New status.

+

Discussion:

+

+The complexity of sort() is specified as "Approximately N +log(N) (where N == last - first ) comparisons on the +average", with no worst case complicity specified. The intention was to +allow a median-of-three quicksort implementation, which is usually O(N +log N) but can be quadratic for pathological inputs. However, there is +no longer any reason to allow implementers the freedom to have a +worst-cast-quadratic sort algorithm. Implementers who want to use +quicksort can use a variant like David Musser's "Introsort" (Software +Practice and Experience 27:983-993, 1997), which is guaranteed to be O(N +log N) in the worst case without incurring additional overhead in the +average case. Most C++ library implementers already do this, and there +is no reason not to guarantee it in the standard. +

+ + +

Proposed resolution:

+

+In 25.3.1.1 [sort], change the complexity to "O(N log N)", and remove footnote 266: +

+ +
+

+Complexity: Approximately O(N log(N)) (where N == last - first ) +comparisons on the average.266) +

+

+266) +If the worst case behavior is important stable_sort() (25.3.1.2) or partial_sort() +(25.3.1.3) should be used. +

+
+ + + + + + +
+

714. search_n complexity is too lax

+

Section: 25.1.9 [alg.search] Status: New + Submitter: Matt Austern Date: 2007-08-30

+

View all other issues in [alg.search].

+

View all issues with New status.

+

Discussion:

+

+The complexity for search_n (25.1.9 [alg.search] par 7) is specified as "At most +(last - first ) * count applications of the corresponding predicate if +count is positive, or 0 otherwise." This is unnecessarily pessimistic. +Regardless of the value of count, there is no reason to examine any +element in the range more than once. +

+ + +

Proposed resolution:

+

+Change the complexity to "At most (last - first) applications of the corresponding predicate". +

+ +
+
template<class ForwardIterator, class Size, class T> 
+  ForwardIterator 
+    search_n(ForwardIterator first , ForwardIterator last , Size count , 
+             const T& value ); 
+
+template<class ForwardIterator, class Size, class T, 
+         class BinaryPredicate> 
+  ForwardIterator 
+    search_n(ForwardIterator first , ForwardIterator last , Size count , 
+             const T& value , BinaryPredicate pred );
+
+
+

+Complexity: At most (last - first ) * count applications of the corresponding predicate +if count is positive, or 0 otherwise. +

+
+
+ + + + + + +
+

715. minmax_element complexity is too lax

+

Section: 25.3.7 [alg.min.max] Status: New + Submitter: Matt Austern Date: 2007-08-30

+

View all other issues in [alg.min.max].

+

View all issues with New status.

+

Discussion:

+

+The complexity for minmax_element (25.3.7 [alg.min.max] par 16) says "At most max(2 * +(last - first ) - 2, 0) applications of the corresponding comparisons", +i.e. the worst case complexity is no better than calling min_element and +max_element separately. This is gratuitously inefficient. There is a +well known technique that does better: see section 9.1 of CLRS +(Introduction to Algorithms, by Cormen, Leiserson, Rivest, and Stein). +

+ + +

Proposed resolution:

+

+Change 25.3.7 [alg.min.max] to: +

+ +
+
template<class ForwardIterator> 
+  pair<ForwardIterator, ForwardIterator> 
+    minmax_element(ForwardIterator first , ForwardIterator last); 
+template<class ForwardIterator, class Compare> 
+  pair<ForwardIterator, ForwardIterator> 
+    minmax_element(ForwardIterator first , ForwardIterator last , Compare comp);
+
+
+

+Returns: make_pair(m, M), where m is +min_element(first, last) or min_element(first, last, +comp) the first iterator i in [first, +last) such that no other element in the range is smaller, and +where M is max_element(first, last) or +max_element(first, last, comp) the last iterator +i in [first, last) such that no other element in the +range is larger. +

+

+Complexity: At most max(2 * (last - first ) - 2, 0) +max(⌊(3/2) (N-1)⌋, 0) applications of the +corresponding comparisons predicate, where N is distance(first, last). +

+
+
+ + + + + + +
+

716. Production in [re.grammar] not actually modified

+

Section: 28.13 [re.grammar] Status: New + Submitter: Stephan T. Lavavej Date: 2007-08-31

+

View all issues with New status.

+

Discussion:

+

+TR1 7.13 [tr.re.grammar]/3 and C++0x WP 28.13 [re.grammar]/3 say: +

+ +
+

+The following productions within the ECMAScript grammar are modified as follows: +

+ +
CharacterClass ::
+[ [lookahead ∉ {^}] ClassRanges ]
+[ ^ ClassRanges ]
+
+ +
+ +

+This definition for CharacterClass appears to be exactly identical to that in ECMA-262. +

+ +

+Was an actual modification intended here and accidentally omitted, or was this production accidentally included? +

+ + +

Proposed resolution:

+

+Remove this mention of the CharacterClass production. +

+ +
CharacterClass ::
+[ [lookahead ∉ {^}] ClassRanges ]
+[ ^ ClassRanges ]
+
+ + + + + + +
+

717. Incomplete valarray::operator[] specification in [valarray.access]

+

Section: 26.5.2.3 [valarray.access] Status: New + Submitter: Daniel Krügler Date: 2007-08-27

+

View all other issues in [valarray.access].

+

View all issues with New status.

+

Discussion:

+

+Since the return type of valarray's operator[] const overload has been +changed to const T& as described in 389 several paragraphs of +the section 26.5.2.3 [valarray.access] are now +incompletely +specified, because many requirements and guarantees should now also +apply to the const overload. Most notably, the address and reference +guarantees should be extended to the const overload case. +

+ + +

Proposed resolution:

+

+Change 26.5.2.3 [valarray.access]: +

+ +
+

+-1- When applied to a constant array, the subscript operator returns a +reference to the corresponding element of the array. When applied to a +non-constant array, tThe subscript operator returns a +reference to the corresponding element of the array. +

+ +

+-3- The expression &a[i+j] == &a[i] + j evaluates as true for all size_t i +and size_t j such that i+j is less +than the length of the non-constant array a. +

+ +

+-4- Likewise, the expression &a[i] != &b[j] evaluates +as true for any two non-constant arrays a and +b and for any size_t i and size_t j such that +i is less than the length of a and j is less +than the length of b. This property indicates an absence of +aliasing and may be used to advantage by optimizing +compilers.281) +

+ +

+-5- The reference returned by the subscript operator for an non-constant array is guaranteed to be valid until +the member function resize(size_t, T) (26.5.2.7) is called for that array or until the lifetime +of that array ends, whichever happens first. +

+ +
+ + + + + + +
+

718. basic_string is not a sequence

+

Section: 21.3 [basic.string] Status: New + Submitter: Bo Persson Date: 2007-08-18

+

View other active issues in [basic.string].

+

View all other issues in [basic.string].

+

View all issues with New status.

+

Discussion:

+

+Paragraph 21.3 [basic.string]/3 states: +

+ +
+

+The class template basic_string conforms to the requirements for a +Sequence (23.1.1) and for a Reversible Container (23.1). +

+
+ +

+First of all, 23.1.1 [sequence.reqmts] is no longer "Sequence" but "Sequence container". +Secondly, after the resent changes to containers (emplace, push_back, +const_iterator parameters to insert and erase), basic_string is not +even close to conform to the current requirements. +

+ + +

Proposed resolution:

+

+Remove this sentence, in recognition of the fact that basic_string is +not just a vector-light for literal types, but something quite +different, a string abstraction in its own right. +

+ + + + + +
+

719. std::is_literal type traits should be provided

+

Section: 20.4 [meta] Status: New + Submitter: Daniel Krügler Date: 2007-08-25

+

View all other issues in [meta].

+

View all issues with New status.

+

Discussion:

+

+Since the inclusion of constexpr in the standard draft N2369 we have +a new type category "literal", which is defined in 3.9 [basic.types]/p.11: +

+ +
+

+-11- A type is a literal type if it is: +

+
    +
  • a scalar type; or
  • +
  • a class type (clause 9) with

    +
      +
    • a trivial copy constructor,
    • +
    • a trivial destructor,
    • +
    • at least one constexpr constructor other than the copy constructor,
    • +
    • no virtual base classes, and
    • +
    • all non-static data members and base classes of literal types; or
    • +
    +
  • +
  • an array of literal type.
  • +
+
+ +

+I strongly suggest that the standard provides a type traits for +literal types in 20.4.4.3 [meta.unary.prop] for several reasons: +

+ +
    +
  1. To keep the traits in sync with existing types.
  2. +
  3. I see many reasons for programmers to use this trait in template + code to provide optimized template definitions for these types, + see below.
  4. +
  5. A user-provided definition of this trait is practically impossible +to write portably.
  6. +
+ +

+The special problem of reason (c) is that I don't see currently a +way to portably test the condition for literal class types: +

+ +
+
    +
  • at least one constexpr constructor other than the copy constructor,
  • +
+
+ +

+Here follows a simply example to demonstrate it's usefulness: +

+ +
template <typename T>
+constexpr typename std::enable_if<std::is_literal<T>::value, T>::type
+abs(T x) {
+  return x < T() ? -x : x;
+}
+
+template <typename T>
+typename std::enable_if<!std::is_literal<T>::value, T>::type
+abs(const T& x) {
+  return x < T() ? -x : x;
+}
+
+ +

+Here we have the possibility to provide a general abs function +template that can be used in ICE's if it's argument is a literal +type which's value is a constant expression, otherwise we +have an optimized version for arguments which are expensive +to copy and therefore need the usage of arguments of +reference type (instead of const T& we could decide to +use T&&, but that is another issue). +

+ + + +

Proposed resolution:

+

+In 20.4.2 [meta.type.synop] in the group "type properties", +just below the line +

+ +
template <class T> struct is_pod;
+
+ +

+add a new one: +

+ +
template <class T> struct is_literal;
+
+ +

+In 20.4.4.3 [meta.unary.prop], table Type Property Predicates, just +below the line for the is_pod property add a new line: +

+ + + + + + + + + + +
TemplateConditionPreconditions
template <class T> struct is_literal;T is a literal type (3.9)T shall be a complete type, an +array of unknown bound, or +(possibly cv-qualified) void.
+ + + + + + +
+

720. Omissions in constexpr usages

+

Section: 23.2.1 [array], 23.3.5 [template.bitset] Status: New + Submitter: Daniel Krügler Date: 2007-08-25

+

View other active issues in [array].

+

View all other issues in [array].

+

View all issues with New status.

+

Discussion:

+
    +
  1. +The member function bool array<T,N>::empty() const should be a +constexpr because this is easily to proof and to implement following it's operational +semantics defined by Table 87 (Container requirements) which says: a.size() == 0. +
  2. +
  3. +The member function bool bitset<N>::test() const must be a +constexpr (otherwise it would violate the specification of constexpr +bitset<N>::operator[](size_t) const, because it's return clause delegates to test()). +
  4. +
  5. +I wonder how the constructor bitset<N>::bitset(unsigned long) can +be declared as a constexpr. Current implementations usually have no such bitset +c'tor which would fulfill the requirements of a constexpr c'tor because they have a +non-empty c'tor body that typically contains for-loops or memcpy to compute the +initialisation. What have I overlooked here? +
  6. +
+ + +

Proposed resolution:

+
    +
  1. +

    In the class template definition of 23.2.1 [array]/p. 3 change

    +
    constexpr bool empty() const;
    +
    +
  2. + +
  3. +

    In the class template definition of 23.3.5 [template.bitset]/p. 1 change

    +
    constexpr bool test(size_t pos ) const;
    +
    + +

    +and in 23.3.5.2 [bitset.members] change +

    + +
    constexpr bool test(size_t pos ) const;
    +
    + +
  4. +
+ + + + + +
+

721. wstring_convert inconsistensies

+

Section: 22.1.3.2.2 [conversions.string] Status: New + Submitter: Bo Persson Date: 2007-08-27

+

View all issues with New status.

+

Discussion:

+

+Paragraph 3 says that the Codecvt template parameter shall meet the +requirements of std::codecvt, even though std::codecvt itself cannot +be used (because of a protected destructor). +

+ +

+How are we going to explain this code to beginning programmers? +

+ +
template<class I, class E, class S>
+struct codecvt : std::codecvt<I, E, S>
+{
+    ~codecvt()
+    { }
+};
+
+void main()
+{
+    std::wstring_convert<codecvt<wchar_t, char, std::mbstate_t> > compiles_ok;
+    
+    std::wstring_convert<std::codecvt<wchar_t, char, std::mbstate_t> >   not_ok;
+}
+
+ + + +

Proposed resolution:

+

+

+ + + + + +
+

722. Missing [c.math] functions nanf and nanl

+

Section: 26.7 [c.math] Status: New + Submitter: Daniel Krügler Date: 2007-08-27

+

View other active issues in [c.math].

+

View all other issues in [c.math].

+

View all issues with New status.

+

Discussion:

+

+In the listing of 26.7 [c.math], table 108: Header <cmath> synopsis I miss +the following C99 functions (from 7.12.11.2): +

+ +
float nanf(const char *tagp);
+long double nanl(const char *tagp);
+
+ +

+(Note: These functions cannot be overloaded and they are also not +listed anywhere else) +

+ + +

Proposed resolution:

+

+In 26.7 [c.math], table 108, section "Functions", add nanf and nanl +just after the existing entry nan. +

+ + + + + +
+

723. basic_regex should be moveable

+

Section: 28.8 [re.regex] Status: New + Submitter: Daniel Krügler Date: 2007-08-29

+

View all other issues in [re.regex].

+

View all issues with New status.

+

Discussion:

+

+According to the current state of the standard draft, the class +template basic_regex, as described in 28.8 [re.regex]/3, is +neither MoveConstructible nor MoveAssignable. +IMO it should be, because typical regex state machines tend +to have a rather large data quantum and I have seen several +use cases, where a factory function returns regex values, +which would take advantage of moveabilities. +

+ + +

Proposed resolution:

+
    +
  1. +

    +In the header <regex> synopsis 28.4 [re.syn], just below the function +template swap add two further overloads: +

    +
    template <class charT, class traits> 
    +  void swap(basic_regex<charT, traits>& e1,  basic_regex<charT, traits>& e2);
    +template <class charT, class traits>
    +  void swap(basic_regex<charT, traits>&& e1, basic_regex<charT, traits>& e2);
    +template <class charT, class traits>
    +  void swap(basic_regex<charT, traits>& e1,  basic_regex<charT, traits>&& e2);
    +
    +

    +In the class definition of basic_regex, just below 28.8 [re.regex]/3, +perform the following changes: +

    +
  2. + +
  3. +

    Just after the copy c'tor:

    +
    basic_regex(basic_regex&&);
    +
    +
  4. + +
  5. +

    Just after the copy-assignment op.:

    +
    basic_regex& operator=(basic_regex&&);
    +
    +
  6. + +
  7. +

    Just after the first assign overload insert:

    +
    basic_regex& assign(basic_regex&& that);
    +
    +
  8. + +
  9. +

    Change the current swap function to read:

    +
    void swap(basic_regex&&);
    +
    +
  10. + +
  11. +

    In 28.8.2 [re.regex.construct], just below the copy c'tor add a +corresponding member definition of:

    +
    basic_regex(basic_regex&&);
    +
    +
  12. + +
  13. +

    Also in 28.8.2 [re.regex.construct], just below the copy assignment +c'tor add a corresponding member definition of:

    +
    basic_regex& operator=(basic_regex&&);
    +
    +
  14. + +
  15. +

    In 28.8.3 [re.regex.assign], just below the first assign overload add +a corresponding member definition of:

    +
    basic_regex& assign(basic_regex&& that);
    +
    +
  16. + +
  17. +

    In 28.8.6 [re.regex.swap], change the signature of swap to +say:

    +
    void swap(basic_regex&& e);
    +
    +
  18. + +
  19. +

    In 28.8.7.1 [re.regex.nmswap], just below the single binary swap +function, add the two missing overloads:

    +
    template <class charT, class traits>
    +  void swap(basic_regex<charT, traits>&& e1, basic_regex<charT, traits>& e2);
    +template <class charT, class traits>
    +  void swap(basic_regex<charT, traits>& e1, basic_regex<charT, traits>&& e2);
    +
    +
  20. +
+ +

+Of course there would be need of corresponding proper standardese +to describe these additions. +

+ + + + + + +
+

724. DefaultConstructible is not defined

+

Section: 20.1.1 [utility.arg.requirements] Status: New + Submitter: Pablo Halpern Date: 2007-09-12

+

View other active issues in [utility.arg.requirements].

+

View all other issues in [utility.arg.requirements].

+

View all issues with New status.

+

Discussion:

+

+The DefaultConstructible requirement is referenced in +several places in the August 2007 working draft +N2369, +but is not defined anywhere. +

+ + +

Proposed resolution:

+

+In section 20.1.1 [utility.arg.requirements], before table 33, add the +following table: +

+ +

Table 33: DefaultConstructible requirements

+ +
+ + + + + + + + + + +
+

expression

+
+

post-condition

+
+

T + t;
+ T()

+
+

T + is default constructed.

+
+ +
+ + + + + + +
+

725. Optional sequence container requirements column label

+

Section: 23.1.1 [sequence.reqmts] Status: New + Submitter: David Abrahams Date: 2007-09-16

+

View all other issues in [sequence.reqmts].

+

View all issues with New status.

+

Discussion:

+

+Table 90: (Optional sequence container operations) states the +"assertion note pre/post-condition" of operator[] to be +

+ +
*(a.begin() + n)
+
+ +

+Surely that's meant to be "operational semantics?" +

+ + + +

Proposed resolution:

+
+ + + + + +
Table 90: Optional sequence container operations
expression return type assertion/note
pre/post-condition

operational semantics
container
+
+ + + + + + +
+

726. Missing regex_replace() overloads

+

Section: 28.11.4 [re.alg.replace] Status: New + Submitter: Stephan T. Lavavej Date: 2007-09-22

+

View other active issues in [re.alg.replace].

+

View all other issues in [re.alg.replace].

+

View all issues with New status.

+

Discussion:

+

+Two overloads of regex_replace() are currently provided: +

+ +
template <class OutputIterator, class BidirectionalIterator, 
+    class traits, class charT> 
+  OutputIterator 
+  regex_replace(OutputIterator out, 
+                BidirectionalIterator first, BidirectionalIterator last, 
+                const basic_regex<charT, traits>& e, 
+                const basic_string<charT>& fmt, 
+                regex_constants::match_flag_type flags = 
+                  regex_constants::match_default);
+ 
+template <class traits, class charT> 
+  basic_string<charT> 
+  regex_replace(const basic_string<charT>& s, 
+                const basic_regex<charT, traits>& e, 
+                const basic_string<charT>& fmt, 
+                regex_constants::match_flag_type flags = 
+                  regex_constants::match_default);
+
+ +
    +
  1. Overloads taking const charT * are provided for regex_match() and +regex_search(), but not regex_replace().  This is inconsistent.
  2. +
  3. +

    The absence of const charT * overloads prevents ordinary-looking code from compiling, such as:

    + +
    const string s("kitten");
    +const regex r("en");
    +cout << regex_replace(s, r, "y") << endl;
    +
    + +

    +The compiler error message will be something like "could not deduce +template argument for 'const std::basic_string<_Elem> &' from 'const +char[1]'". +

    + +

    +Users expect that anything taking a basic_string<charT> can also take a +const charT *.  In their own code, when they write a function taking +std::string (or std::wstring), they can pass a const char * (or const +wchar_t *), thanks to basic_string's implicit constructor.  Because the +regex algorithms are templated on charT, they can't rely on +basic_string's implicit constructor (as the compiler error message +indicates, template argument deduction fails first). +

    + +

    +If a user figures out what the compiler error message means, workarounds +are available - but they are all verbose.  Explicit template arguments +could be given to regex_replace(), allowing basic_string's implicit +constructor to be invoked - but charT is the last template argument, not +the first, so this would be extremely verbose.  Therefore, constructing +a basic_string from each C string is the simplest workaround. +

    +
  4. + +
  5. +There is an efficiency consideration: constructing basic_strings can +impose performance costs that could be avoided by a library +implementation taking C strings and dealing with them directly.  +(Currently, for replacement sources, C strings can be converted into +iterator pairs at the cost of verbosity, but for format strings, there +is no way to avoid constructing a basic_string.) +
  6. +
+ + + +

Proposed resolution:

+

+Provide additional overloads for regex_replace(): one additional +overload of the iterator-based form (taking const charT* fmt), and three +additional overloads of the convenience form (one taking const charT* +str, another taking const charT* fmt, and the third taking both const +charT* str and const charT* fmt). 28.11.4 [re.alg.replace]: +

+ +
+
template <class OutputIterator, class BidirectionalIterator, 
+    class traits, class charT> 
+  OutputIterator 
+  regex_replace(OutputIterator out, 
+                BidirectionalIterator first, BidirectionalIterator last, 
+                const basic_regex<charT, traits>& e, 
+                const basic_string<charT>& fmt, 
+                regex_constants::match_flag_type flags = 
+                  regex_constants::match_default);
+
+template <class OutputIterator, class BidirectionalIterator, 
+    class traits, class charT> 
+  OutputIterator 
+  regex_replace(OutputIterator out, 
+                BidirectionalIterator first, BidirectionalIterator last, 
+                const basic_regex<charT, traits>& e, 
+                const charT* fmt, 
+                regex_constants::match_flag_type flags = 
+                  regex_constants::match_default);
+
+

...

+
template <class traits, class charT> 
+  basic_string<charT> 
+  regex_replace(const basic_string<charT>& s, 
+                const basic_regex<charT, traits>& e, 
+                const basic_string<charT>& fmt, 
+                regex_constants::match_flag_type flags = 
+                  regex_constants::match_default);
+
+template <class traits, class charT> 
+  basic_string<charT> 
+  regex_replace(const basic_string<charT>& s, 
+                const basic_regex<charT, traits>& e, 
+                const charT* fmt, 
+                regex_constants::match_flag_type flags = 
+                  regex_constants::match_default);
+
+template <class traits, class charT> 
+  basic_string<charT> 
+  regex_replace(const charT* s, 
+                const basic_regex<charT, traits>& e, 
+                const basic_string<charT>& fmt, 
+                regex_constants::match_flag_type flags = 
+                  regex_constants::match_default);
+
+template <class traits, class charT> 
+  basic_string<charT> 
+  regex_replace(const charT* s, 
+                const basic_regex<charT, traits>& e, 
+                const charT* fmt, 
+                regex_constants::match_flag_type flags = 
+                  regex_constants::match_default);
+
+
+ + + + + + +
+

727. regex_replace() doesn't accept basic_strings with custom traits and allocators

+

Section: 28.11.4 [re.alg.replace] Status: New + Submitter: Stephan T. Lavavej Date: 2007-09-22

+

View other active issues in [re.alg.replace].

+

View all other issues in [re.alg.replace].

+

View all issues with New status.

+

Discussion:

+

+regex_match() and regex_search() take const basic_string<charT, ST, +SA>&regex_replace() takes const basic_string<charT>&.  This prevents +regex_replace() from accepting basic_strings with custom traits and +allocators. +

+ + +

Proposed resolution:

+

+Overloads of regex_replace() taking basic_string should be additionally +templated on class ST, class SA and take const basic_string<charT, ST, +SA>&.  Consistency with regex_match() and regex_search() would place +class ST, class SA as the first template arguments; compatibility with +existing code using TR1 and giving explicit template arguments to +regex_replace() would place class ST, class SA as the last template +arguments. +

+ + + + + +
+

728. Problem in [rand.eng.mers]/6

+

Section: 26.4.3.2 [rand.eng.mers] Status: New + Submitter: Stephan Tolksdorf Date: 2007-09-21

+

View all issues with New status.

+

Discussion:

+

+The mersenne_twister_engine is required to use a seeding method that is given +as an algorithm parameterized over the number of bits W. I doubt whether the given generalization +of an algorithm that was originally developed only for unsigned 32-bit integers is appropriate +for other bit widths. For instance, W could be theoretically 16 and UIntType a 16-bit integer, in +which case the given multiplier would not fit into the UIntType. Moreover, T. Nishimura and M. +Matsumoto have chosen a dif ferent multiplier for their 64 bit Mersenne Twister +[reference]. +

+ +

+I see two possible resolutions: +

+ +
    +
  1. Restrict the parameter W of the mersenne_twister_template to values of 32 or 64 and use the +multiplier from [the above reference] for the 64-bit case (my preference)
  2. +
  3. Interpret the state array for any W as a 32-bit array of appropriate length (and a specified byte +order) and always employ the 32-bit algorithm for seeding +
  4. +
+ +

+See N2423 +for further discussion. +

+ + + +

Proposed resolution:

+ +

+See N2423 +for the proposed resolution. +

+ + + + + + +
+

729. Problem in [rand.req.eng]/3

+

Section: 26.4.1.3 [rand.req.eng] Status: New + Submitter: Stephan Tolksdorf Date: 2007-09-21

+

View all other issues in [rand.req.eng].

+

View all issues with New status.

+

Discussion:

+

+The 3rd table row in 26.4.1.3 [rand.req.eng]/3 requires random number engines to accept any +arithmetic type as a seed, which is then casted to the engine's result_type and subsequently +used for seeding the state of the engine. The requirement stated as "Creates an engine with +initial state determined by static_cast<X::result_type>(s)" forces random number engines +to either use a seeding method that completely depends on the result_type (see the discussion +of seeding for the mersenne_twister_engine in point T2 above) or at least to throw away "bits +of randomness" in the seed value if the result_type is smaller than the seed type. This seems +to be inappropriate for many modern random number generators, in particular F2-linear or +cryptographic ones, which operate on an internal bit array that in principle is independent of the +type of numbers returned. +

+ +

+Posible resolution: I propose to change the wording to a version similar to "Creates an +engine with initial state determined by static_cast<UintType>(s), where UintType is an +implementation specific unsigned integer type." +

+ +

+Additionally, the definition of s in 26.4.1.3 [rand.req.eng]/1 c) could be restricted to unsigned integer types. +

+ +

+Similarly, the type of the seed in 26.4.1.4 [rand.req.adapt]/3 e) could be left unspecified. +

+ +

+See N2423 +for further discussion. +

+ + + +

Proposed resolution:

+

+See N2423 +for further discussion. +

+ + + + + + +
+

730. Comment on [rand.req.adapt]/3 e)

+

Section: 26.4.1.4 [rand.req.adapt] Status: New + Submitter: Stephan Tolksdorf Date: 2007-09-21

+

View all issues with New status.

+

Discussion:

+

+If an engine adaptor is invoked with an argument of type seed_seq, then all base +engines are specified to be seeded with this seed_seq. As seed_seq's randomization method is +qualified as constant, this procedure will ef fectively initialize all base engines with the same seed +(though the resulting state might still dif fer to a certain degree if the engines are of different types). +It is not clear whether this mode of operation is in general appropriate, hence -- as far as the +stated requirements are of general nature and not just specific to the engine adaptors provided by +the library -- it might be better to leave the behaviour unspecified, since the current definition of +seed_seq does not allow for a generally satisfying specification. +

+ +

+Posssible resolution: [As above] +

+ +

+See N2423 +for further discussion. +

+ + + +

Proposed resolution:

+

+See N2423 +for the proposed resolution. +

+ + + + + +
+

731. proposal for a customizable seed_seq

+

Section: 26.4.7.1 [rand.util.seedseq] Status: New + Submitter: Stephan Tolksdorf Date: 2007-09-21

+

View all other issues in [rand.util.seedseq].

+

View all issues with New status.

+

Discussion:

+

+The proper way to seed random number engines seems to be the most frequently +discussed issue of the 26.4 [rand] proposal. While the new seed_seq approach is already rather +general and probably sufficient for most situations, it is unlikely to be optimal in every case (one +problem was pointed out in point T5 above). In some situations it might, for instance, be better to +seed the state with a cryptographic generator. +

+

+In my opinion this is a pretty strong argument for extending the standard with a simple facility to +customize the seeding procedure. This could, for example, be done with the following minimal +changes: +

+ +

+Possible resolution: +

+ +
    +
  1. +Turn the interface specification of 26.4.7.1 [rand.util.seedseq]/2 into a "SeedSeq" requirement, where the +exact behaviour of the constructors and the randomize method are left unspecified and where the +const qualification for randomize is removed. Classes implementing this interface are additionally +required to specialize the traits class in c). +
  2. +
  3. +Provide the class seed_seq as a default implementation of the SeedSeq interface. +
  4. +
  5. +

    +Supplement the seed_seq with a traits class +

    +
    template <typename T> 
    +struct is_seed_seq { static const bool value = false; }
    +
    +

    and the specialization

    +
    template <> 
    +struct is_seed_seq<seed_seq> { static const bool value = true; }
    +
    +

    which users can supplement with further specializations.

    +
  6. +
  7. +Change 26.4.1.3 [rand.req.eng]/1 d) to "q is an lvalue of a type that fulfils the SeedSeq requirements", and +modify the constructors and seed methods in 26.4.3 [rand.eng] appropriately (the actual implementation +could be done using the SFINAE technique). +
  8. +
+ + +

Proposed resolution:

+

+See N2423 +for the proposed resolution. +

+ + + + + +
+

732. Defect in [rand.dist.samp.genpdf]

+

Section: 26.4.8.5.3 [rand.dist.samp.genpdf] Status: New + Submitter: Stephan Tolksdorf Date: 2007-09-21

+

View all issues with New status.

+

Discussion:

+

+26.4.8.5.3 [rand.dist.samp.genpdf] describes the interface for a distribution template that is +meant to simulate random numbers from any general distribution given only the density and the +support of the distribution. I'm not aware of any general purpose algorithm that would be capable +of correctly and efficiently implementing the described functionality. From what I know, this is +essentially an unsolved research problem. Existing algorithms either require more knowledge +about the distribution and the problem domain or work only under very limited circumstances. +Even the state of the art special purpose library UNU.RAN does not solve the problem in full +generality, and in any case, testing and customer support for such a library feature would be a +nightmare. +

+ +

+Possible resolution: For these reasons, I propose to delete section 26.4.8.5.3 [rand.dist.samp.genpdf]. +

+ + +

Proposed resolution:

+

+See N2423 +for the proposed resolution. +

+ + + + + +
+

733. Comment on [rand.req.dist]/9

+

Section: 26.4.1.5 [rand.req.dist] Status: New + Submitter: Stephan Tolksdorf Date: 2007-09-21

+

View all issues with New status.

+

Discussion:

+

+The requirement "P shall have a declaration of the form typedef X distribution_- +type" effectively makes the use of inheritance for implementing distributions very inconvenient, +because the child of a distribution class in general will not satisfy this requirement. In my opinion +the benefits of having a typedef in the parameter class pointing back to the distribution class are +not worth the hassle this requirement causes. [In my code base I never made use of the nested +typedef but on several occasions could have profited from being able to use simple inheritance for +the implementation of a distribution class.] +

+ +

+Proposed resolution: I propose to drop this requirement. +

+ + +

Proposed resolution:

+

+See N2423 +for the proposed resolution. +

+ + + + + +
+

734. Unnecessary restriction in [rand.dist.norm.chisq]

+

Section: 26.4.8.4.3 [rand.dist.norm.chisq] Status: New + Submitter: Stephan Tolksdorf Date: 2007-09-21

+

View all issues with New status.

+

Discussion:

+

+chi_squared_distribution, fisher_f_distribution and student_t_distribution +have parameters for the "degrees of freedom" n and m that are specified as integers. For the +following two reasons this is an unnecessary restriction: First, in many applications such as +Bayesian inference or Monte Carlo simulations it is more convenient to treat the respective param- +eters as continuous variables. Second, the standard non-naive algorithms (i.e. +O(1) algorithms) +for simulating from these distributions work with floating-point parameters anyway (all three +distributions could be easily implemented using the Gamma distribution, for instance). +

+ +

+Similar arguments could in principle be made for the parameters t and k of the discrete +binomial_distribution and negative_binomial_distribution, though in both cases continuous +parameters are less frequently used in practice and in case of the binomial_distribution +the implementation would be significantly complicated by a non-discrete parameter (in most +implementations one would need an approximation of the log-gamma function instead of just the +log-factorial function). +

+ +

+Possible resolution: For these reasons, I propose to change the type of the respective parameters +to double. +

+ + +

Proposed resolution:

+

+See N2423 +for the proposed resolution. +

+ + + + + +
+

735. Unfortunate naming

+

Section: 26.4.8.2.2 [rand.dist.bern.bin], 26.4.8.2.4 [rand.dist.bern.negbin] Status: New + Submitter: Stephan Tolksdorf Date: 2007-09-21

+

View all issues with New status.

+

Discussion:

+

+In my opinion the choice of name for the t parameter of the binomial_distribution +is very unfortunate. In virtually every internet reference, book and software implementation +this parameter is called n instead, see for example Wikipedia, Mathworld, Evans et al. (1993) +Statistical Distributions, 2nd E., Wiley, p. 38, the R statistical computing language, p. 926, +Mathematica and Matlab. +

+ +

+Similarly, the choice of k for the parameter of the negative binomial distributions is rather unusual. +The most common choice for the negative binomial distribution seems to be r instead. +

+ +

+Choosing unusual names for the parameters causes confusion among users and makes the +interface unnecessarily inconvenient to use. +

+ +

+Possible resolution: For these reasons, I propose to change the name of the respective parameters +to n and r. +

+ + +

Proposed resolution:

+

+See N2423 +for the proposed resolution. +

+ + + + + +
+

736. Comment on [rand.dist.samp.discrete]

+

Section: 26.4.8.5.1 [rand.dist.samp.discrete] Status: New + Submitter: Stephan Tolksdorf Date: 2007-09-21

+

View all issues with New status.

+

Discussion:

+
    +
  1. +The specification for discrete_distribution requires the member probabilities() +to return a vector of standardized probabilities, which forces the implementation every time to +divide each probability by the sum of all probabilities, as the sum will in practice almost never be +exactly 1.0. This is unnecessarily inef ficient as the implementation would otherwise not need to +compute the standardized probabilities at all and could instead work with the non-standardized +probabilities and the sum. If there was no standardization the user would just get back the +probabilities that were previously supplied to the distribution object, which to me seems to be the +more obvious solution. +
  2. +
  3. +The behaviour of discrete_distribution is not specified in case the number of given +probabilities is larger than the maximum number representable by the IntType. +
  4. +
+ +

+Possible resolution: I propose to change the specification such that the non-standardized +probabilities need to be returned and that an additional requirement is included for the number +of probabilities to be smaller than the maximum of IntType. +

+ + +

Proposed resolution:

+

+See N2423 +for the proposed resolution. +

+ + + + + +
+

737. Comment on [rand.dist.samp.pconst]

+

Section: 26.4.8.5.2 [rand.dist.samp.pconst] Status: New + Submitter: Stephan Tolksdorf Date: 2007-09-21

+

View all issues with New status.

+

Discussion:

+
    +
  1. +The discussion in point T11 above regarding probabilities() similarly applies +to the method densities() of piecewise_constant_distribution. +
  2. +
  3. +

    +The design of the constructor +

    +
    template <class InputIteratorB, class InputIteratorW> 
    +piecewise_constant_distribution( InputIteratorB firstB, InputIteratorB lastB, 
    +                                 InputIteratorW firstW);
    +
    +

    +is unnecessarily unsafe, as there is no separate end-iterator given for the weights. I can't see +any performance or convenience reasons that would justify the risks inherent in such a function +interface, in particular the risk that input error might go unnoticed. +

    +
  4. +
+ +

+Possible resolution: I propose to add an InputIteratorW lastW argument to the interface. +

+ + +

Proposed resolution:

+

+See N2423 +for the proposed resolution. +

+ + + + + +
+

738. Editorial issue in [rand.adapt.disc]/3

+

Section: 26.4.4.1 [rand.adapt.disc] Status: New + Submitter: Stephan Tolksdorf Date: 2007-09-21

+

View all issues with New status.

+

Discussion:

+

+Since the template parameter p and r are of type size_t, the member n in the class +exposition should have type size_t, too. +

+ + +

Proposed resolution:

+

+See N2423 +for the proposed resolution. +

+ + + + + +
+

739. Defect in [rand.util.canonical]/3

+

Section: 26.4.7.2 [rand.util.canonical] Status: New + Submitter: Stephan Tolksdorf Date: 2007-09-21

+

View all other issues in [rand.util.canonical].

+

View all issues with New status.

+

Discussion:

+

+The complexity of generate_canonical is specified to be "exactly k=max(1, ceil(b/log2 +R)) invocations of g". This terms involves a logarithm that is not rounded and hence can not (in +general) be computed at compile time. As this function template is performance critical, I propose +to replace ceil(b/log2 R) with ceil(b/floor(log2 R)). +

+ +

+See N2423 +for further discussion. +

+ + + +

Proposed resolution:

+

+See N2423 +for the proposed resolution. +

+ + + + + +
+

740. Please remove *_ptr<T[N]>

+

Section: 20.6.5.4 [unique.ptr.compiletime] Status: New + Submitter: Herb Sutter Date: 2007-10-04

+

View all issues with New status.

+

Discussion:

+

+Please don't provide *_ptr<T[N]>. It doesn't enable any useful +bounds-checking (e.g., you could imagine that doing op++ on a +shared_ptr<T[N]> yields a shared_ptr<T[N-1]>, but that promising path +immediately falters on op-- which can't reliably dereference because we +don't know the lower bound). Also, most buffers you'd want to point to +don't have a compile-time known size. +

+ +

+To enable any bounds-checking would require run-time information, with +the usual triplet: base (lower bound), current offset, and max offset +(upper bound). And I can sympathize with the point of view that you +wouldn't want to require this on *_ptr itself. But please let's not +follow the <T[N]> path, especially not with additional functions to +query the bounds etc., because this sets wrong user expectations by +embarking on a path that doesn't go all the way to bounds checking as it +seems to imply. +

+ +

+If bounds checking is desired, consider a checked_*_ptr instead (e.g., +checked_shared_ptr). And make the interfaces otherwise identical so that +user code could easily #define/typedef between prepending checked_ on +debug builds and not doing so on release builds (for example). +

+ +

+Note that some may object that checked_*_ptr may seem to make the smart +pointer more like vector, and we don't want two ways to spell vector. I +don't agree, but if that were true that would be another reason to +remove *_ptr<T[N]> which equally makes the smart pointer more like +std::array. :-) +

+ + +

Proposed resolution:

+

+Change the synopsis under 20.6.5 [unique.ptr] p2: +

+ +
...
+template<class T> struct default_delete; 
+template<class T> struct default_delete<T[]>; 
+template<class T, size_t N> struct default_delete<T[N]>;
+
+template<class T, class D = default_delete<T>> class unique_ptr; 
+template<class T, class D> class unique_ptr<T[], D>; 
+template<class T, class D, size_t N> class unique_ptr<T[N], D>;
+...
+
+ +

+Remove the entire section 20.6.5.1.3 [unique.ptr.dltr.dflt2] default_delete<T[N]>. +

+ +

+Remove the entire section 20.6.5.4 [unique.ptr.compiletime] unique_ptr for array objects with a compile time length +and its subsections: 20.6.5.4.1 [unique.ptr.compiletime.dtor], 20.6.5.4.2 [unique.ptr.compiletime.observers], +20.6.5.4.3 [unique.ptr.compiletime.modifiers]. +

+ + + + + + +
+

741. Const-incorrect get_deleter function for shared_ptr

+

Section: 20.6.6.2.11 [util.smartptr.getdeleter] Status: New + Submitter: Daniel Krügler Date: 2007-09-27

+

View all other issues in [util.smartptr.getdeleter].

+

View all issues with New status.

+

Discussion:

+

+The following issue was raised by Alf P. Steinbach in c.l.c++.mod: +

+ +

+According to the recent draft N2369, both the header memory synopsis +of 20.6 [memory] and 20.6.6.2.11 [util.smartptr.getdeleter] declare: +

+ +
template<class D, class T> D* get_deleter(shared_ptr<T> const& p);
+
+ +

+This allows to retrieve the pointer to a mutable deleter of a const +shared_ptr (if that owns one) and therefore contradicts the usual +philosophy that associated functors are either read-only (e.g. +key_comp or value_comp of std::map) or do at least reflect +the mutability of the owner (as seen for the both overloads of +unique_ptr::get_deleter). +Even the next similar counter-part of get_deleter - the two +overloads of function::target in the class template function +synopsis 20.5.15.2 [func.wrap.func] or in 20.5.15.2.5 [func.wrap.func.targ] - do +properly mirror the const-state of the owner. +

+ +Possible proposed resolutions: + +

+Replace the declarations of get_deleter in the header <memory> +synopsis of 20.6 [memory] and in 20.6.6.2.11 [util.smartptr.getdeleter] by one of the +following alternatives (A) or (B): +

+ +
    +
  1. +Provide only the immutable variant. This would reflect the +current praxis of container::get_allocator(), map::key_comp(), or +map::value_comp. + +
    template<class D, class T> const D* get_deleter(shared_ptr<T> const& p);
    +
    +
  2. +
  3. +Just remove the function. +
  4. +
+ +

+Alberto Ganesh Barbati adds: +

+ +
    +
  1. +

    +Replace it with two functions: +

    +
    template <class D, class T> D get_deleter(shared_ptr<T> const&);
    +template <class D, class T> bool has_deleter(shared_ptr<T> const&);
    +
    + +

    +The first one would throw if D is the wrong type, while the latter would +never throw. This approach would reflect the current praxis of +use_facet/has_facet, with the twist of returning the deleter by value as +container::get_allocator() do. +

    +
  2. +
+ +

+Peter Dimov adds: +

+ +
+

+My favorite option is "not a defect". A, B and C break useful code. +

+
+ + + +

Proposed resolution:

+

+

+ + + + + +
+

742. Enabling swap for proxy iterators

+

Section: 20.1.1 [utility.arg.requirements] Status: New + Submitter: Howard Hinnant Date: 2007-10-10

+

View other active issues in [utility.arg.requirements].

+

View all other issues in [utility.arg.requirements].

+

View all issues with New status.

+

Discussion:

+

+This issue was split from 672. 672 now just +deals with changing the requirements of T in the Swappable +requirement from CopyConstructible and CopyAssignable to +MoveConstructible and MoveAssignable. +

+ +

+This issue seeks to widen the Swappable requirement to support proxy iterators. Here +is example code: +

+ +
namespace Mine {
+
+template <class T>
+struct proxy {...};
+
+template <class T>
+struct proxied_iterator
+{
+   typedef T value_type;
+   typedef proxy<T> reference;
+   reference operator*() const;
+   ...
+};
+
+struct A
+{
+   // heavy type, has an optimized swap, maybe isn't even copyable or movable, just swappable
+   void swap(A&);
+   ...
+};
+
+void swap(A&, A&);
+void swap(proxy<A>, A&);
+void swap(A&, proxy<A>);
+void swap(proxy<A>, proxy<A>);
+
+}  // Mine
+
+...
+
+Mine::proxied_iterator<Mine::A> i(...)
+Mine::A a;
+swap(*i1, a);
+
+ +

+The key point to note in the above code is that in the call to swap, *i1 +and a are different types (currently types can only be Swappable with the +same type). A secondary point is that to support proxies, one must be able to pass rvalues +to swap. But note that I am not stating that the general purpose std::swap +should accept rvalues! Only that overloaded swaps, as in the example above, be allowed +to take rvalues. +

+ +

+That is, no standard library code needs to change. We simply need to have a more flexible +definition of Swappable. +

+ + + +

Proposed resolution:

+

+Change 20.1.1 [utility.arg.requirements]: +

+ +
+ +

+-1- The template definitions in the C++ Standard Library refer to various +named requirements whose details are set out in tables 31-38. In these +tables, T and V are is a types to be supplied by a C++ program +instantiating a template; a, b, and c are +values of type const T; s and t are modifiable +lvalues of type T; u is a value of type (possibly +const) T; and rv is a non-const +rvalue of type T; w is a value of type T; and v is a value of type V. +

+ + + + + + + +
Table 37: Swappable requirements [swappable]
expressionreturn typepost-condition
swap(sw,tv)voidtw has the value originally +held by uv, and +uv has the value originally held +by tw
+

+The Swappable requirement is met by satisfying one or more of the following conditions: +

+
    +
  • +T is Swappable if T and V are +the same type and T satisfies the +CopyConstructible +MoveConstructible requirements (Table 34 +33) and the CopyAssignable +MoveAssignable requirements (Table 36 +35); +
  • +
  • +T is Swappable with V if a namespace scope function named +swap exists in the same namespace as the definition of +T or V, such that the expression +swap(tw,u v) is valid and has the +semantics described in this table. +
  • +
+
+
+ + + + + + +
+

743. rvalue swap for shared_ptr

+

Section: 20.6.6.2.9 [util.smartptr.shared.spec] Status: New + Submitter: Howard Hinnant Date: 2007-10-10

+

View all issues with New status.

+

Discussion:

+

+When the LWG looked at 674 in Kona the following note was made: +

+ +

+We may need to open an issue to deal with the question of +whether shared_ptr needs an rvalue swap. +

+ +

+This issue was opened in response to that note. +

+ +

+I believe allowing rvalue shared_ptrs to swap is both +appropriate, and consistent with how other library components are currently specified. +

+ + + +

Proposed resolution:

+

+Change the synopsis in 20.6.6.2 [util.smartptr.shared]: +

+ +
void swap(shared_ptr&& r);
+...
+template<class T> void swap(shared_ptr<T>& a, shared_ptr<T>& b);
+template<class T> void swap(shared_ptr<T>&& a, shared_ptr<T>& b);
+template<class T> void swap(shared_ptr<T>& a, shared_ptr<T>&& b);
+
+ +

+Change 20.6.6.2.4 [util.smartptr.shared.mod]: +

+ +
void swap(shared_ptr&& r);
+
+ +

+Change 20.6.6.2.9 [util.smartptr.shared.spec]: +

+ +
template<class T> void swap(shared_ptr<T>& a, shared_ptr<T>& b);
+template<class T> void swap(shared_ptr<T>&& a, shared_ptr<T>& b);
+template<class T> void swap(shared_ptr<T>& a, shared_ptr<T>&& b);
+
+ + + + + +
+

744. What is the lifetime of an exception pointed to by an exception_ptr?

+

Section: 18.7.5 [propagation] Status: New + Submitter: Alisdair Meredith Date: 2007-10-10

+

View other active issues in [propagation].

+

View all other issues in [propagation].

+

View all issues with New status.

+

Discussion:

+

+Without some lifetime guarantee, it is hard to know how this type can be +used.  Very specifically, I don't see how the current wording would +guarantee and exception_ptr caught at the end of one thread could be safely +stored and rethrown in another thread - the original motivation for this +API. +

+

+(Peter Dimov agreed it should be clearer, maybe a non-normative note to +explain?) +

+ + +

Proposed resolution:

+

+

+ + + + + +
+

745. copy_exception API slices.

+

Section: 18.7.5 [propagation] Status: New + Submitter: Alisdair Meredith Date: 2007-10-10

+

View other active issues in [propagation].

+

View all other issues in [propagation].

+

View all issues with New status.

+

Discussion:

+

+It could be I did not understand the design rationale, but I thought +copy_exception would produce an exception_ptr to the most-derived (dynamic) +type of the passed exception.  Instead it slices, which appears to be less +useful, and a likely source of FAQ questions in the future. +

+

+(Peter Dimov suggests NAD) +

+ + +

Proposed resolution:

+

+

+ + + + + +
+

746. current_exception may fail with bad_alloc

+

Section: 18.7.5 [propagation] Status: New + Submitter: Alisdair Meredith Date: 2007-10-10

+

View other active issues in [propagation].

+

View all other issues in [propagation].

+

View all issues with New status.

+

Discussion:

+

+I understand that the attempt to copy an exception may run out of memory, +but I believe this is the only part of the standard that mandates failure +with specifically bad_alloc, as opposed to allowing an +implementation-defined type derived from bad_alloc.  For instance, the Core +language for a failed new expression is: +

+
+

+Any other allocation function that fails to allocate storage shall indicate +failure only by throwing an exception of a type that would match a handler +(15.3) of type std::bad_alloc (18.5.2.1). +

+
+

+I think we should allow similar freedom here (or add a blanket +compatible-exception freedom paragraph in 17) +

+

+I prefer the clause 17 approach myself, and maybe clean up any outstanding +wording that could also rely on it. +

+ + +

Proposed resolution:

+

+

+ + + + + +
+

747. We have 3 separate type traits to identify classes supporting no-throw operations

+

Section: 20.4.4.3 [meta.unary.prop] Status: New + Submitter: Alisdair Meredith Date: 2007-10-10

+

View other active issues in [meta.unary.prop].

+

View all other issues in [meta.unary.prop].

+

View all issues with New status.

+

Discussion:

+

+We have 3 separate type traits to identify classes supporting no-throw +operations, which are very useful when trying to provide exception safety +guarantees.  However, I'm not entirely clear on what the current wording +requires of a conforming implementation.  To quote from +has_nothrow_default_constructor: +

+

+or T is a class type with a default constructor that is known not to throw +any exceptions +

+

+What level of magic do we expect to deduce if this is known? +

+

+E.g. +

+ +
struct test{
+ int x;
+ test() : x() {}
+};
+
+

+Should I expect a conforming compiler to + assert( has_nothrow_constructor<test>::value ) +

+

+Is this a QoI issue? +

+

+Should I expect to 'know' only if-and-only-if there is an inline definition +available? +

+

+Should I never expect that to be true, and insist that the user supplies an +empty throw spec if they want to assert the no-throw guarantee? +

+

+It would be helpful to maybe have a footnote explaining what is required, +but right now I don't know what to suggest putting in the footnote. +

+

+(agreement since is that trivial ops and explicit no-throws are required. +Open if QoI should be allowed to detect further) +

+ + +

Proposed resolution:

+

+

+ + + + + +
+

748. The is_abstract type trait is defined by reference to 10.4.

+

Section: 20.4.4.3 [meta.unary.prop] Status: New + Submitter: Alisdair Meredith Date: 2007-10-10

+

View other active issues in [meta.unary.prop].

+

View all other issues in [meta.unary.prop].

+

View all issues with New status.

+

Discussion:

+

+I am trying to decide is a pure virtual function is a necessary as well as +sufficient requirement to be classified as abstract? +

+

+For instance, is the following (non-polymorphic) type considered abstract? +

+
struct abstract {
+protected:
+ abstract(){}
+ abstract( abstract const & ) {}
+ ~abstract() {}
+};
+
+

+(Suggested that this may be NAD, with an editorial fix-up from Pete on the +core wording to make clear that abstract requires a pure virtual function) +

+ + +

Proposed resolution:

+

+

+ + + + + +
+

749. Currently has_nothrow_copy_constructor<T>::value is true if T has 'a' nothrow copy constructor.

+

Section: 20.4.4.3 [meta.unary.prop] Status: New + Submitter: Alisdair Meredith Date: 2007-10-10

+

View other active issues in [meta.unary.prop].

+

View all other issues in [meta.unary.prop].

+

View all issues with New status.

+

Discussion:

+

+Unfortunately a class can have multiple copy constructors, and I believe to +be useful this trait should only return true is ALL copy constructors are +no-throw. +

+

+For instance: +

+
+
struct awkward {
+ awkward( const awkward & ) throw() {}
+ awkward( awkward & ) { throw "oops"; } };
+
+
+ + +

Proposed resolution:

+

+

+ + + + + +
+

750. The current definition for is_convertible requires that the type be +implicitly convertible, so explicit constructors are ignored.

+

Section: 20.4.5 [meta.rel] Status: New + Submitter: Alisdair Meredith Date: 2007-10-10

+

View all issues with New status.

+

Discussion:

+

+With the pending arrival of explicit conversion functions though, I'm +wondering if we want an additional trait, is_explictly_convertible? +

+ + +

Proposed resolution:

+

+

+ + + + + +
+

751. change pass-by-reference members of vector<bool> to pass-by-value?

+

Section: 23.2.6 [vector.bool] Status: New + Submitter: Alisdair Meredith Date: 2007-10-10

+

View all issues with New status.

+

Discussion:

+

+A number of vector<bool> members take const bool& as arguments. +Is there any chance we could change them to pass-by-value or would I +be wasting everyone's time if wrote up an issue? +

+ + +

Proposed resolution:

+

+

+ + + + + +
+

752. Allocator complexity requirement

+

Section: 20.1.2 [allocator.requirements] Status: New + Submitter: Hans Boehm Date: 2007-10-11

+

View other active issues in [allocator.requirements].

+

View all other issues in [allocator.requirements].

+

View all issues with New status.

+

Discussion:

+

+Did LWG recently discuss 20.1.2 [allocator.requirements]-2, which states that "All the operations +on the allocators are expected to be amortized constant time."? +

+

+As I think I pointed out earlier, this is currently fiction for +allocate() if it has to obtain memory from the OS, and it's unclear to +me how to interpret this for construct() and destroy() if they deal with +large objects.  Would it be controversial to officially let these take +time linear in the size of the object, as they already do in real life? +

+

+Allocate() more blatantly takes time proportional to the size of the +object if you mix in GC.  But it's not really a new problem, and I think +we'd be confusing things by leaving the bogus requirements there.  The +current requirement on allocate() is generally not important anyway, +since it takes O(size) to construct objects in the resulting space. +There are real performance issues here, but they're all concerned with +the constants, not the asymptotic complexity. +

+ + +

Proposed resolution:

+

+Change 20.1.2 [allocator.requirements]/2: +

+ +
+

+-2- Table 39 describes the requirements on types manipulated through +allocators. All the operations on the allocators are expected to be +amortized constant time, except that allocate and +construct may require time proportional to the size of the +object allocated or constructed. Table 40 describes the +requirements on allocator types. +

+
+ + + + + +
+

753. Move constructor in draft

+

Section: 20.1.1 [utility.arg.requirements] Status: New + Submitter: Yechezkel Mett Date: 2007-10-14

+

View other active issues in [utility.arg.requirements].

+

View all other issues in [utility.arg.requirements].

+

View all issues with New status.

+

Discussion:

+

+The draft standard n2369 uses the term move constructor in a few +places, but doesn't seem to define it. +

+ +

+MoveConstructible requirements are defined in Table 33 in 20.1.1 [utility.arg.requirements] as +follows: +

+ +
+ + + + + + + + + + + +
MoveConstructible requirements
expression post-condition
T t = rv t is equivalent to the value of rv before the construction
[Note: There is no requirement on the value of rv after the +construction. -- end note]
+
+ +

+(where rv is a non-const rvalue of type T). +

+ +

+So I assume the move constructor is the constructor that would be used +in filling the above requirement. +

+ +

+For vector::reserve, vector::resize and the vector modifiers given in +23.2.5.4 [vector.modifiers] we have +

+ +
+Requires: If value_type has a move constructor, that constructor shall +not throw any exceptions. +
+ +

+Firstly "If value_type has a move constructor" is superfluous; every +type which can be put into a vector has a move constructor (a copy +constructor is also a move constructor). Secondly it means that for +any value_type which has a throwing copy constructor and no other move +constructor these functions cannot be used -- which I think will come +as a shock to people who have been using such types in vector until +now! +

+ +

+I can see two ways to correct this. The simpler, which is presumably +what was intended, is to say "If value_type has a move constructor and +no copy constructor, the move constructor shall not throw any +exceptions" or "If value_type has a move constructor which changes the +value of its parameter,". +

+ +

+The other alternative is add to MoveConstructible the requirement that +the expression does not throw. This would mean that not every type +that satisfies the CopyConstructible requirements also satisfies the +MoveConstructible requirements. It would mean changing requirements in +various places in the draft to allow either MoveConstructible or +CopyConstructible, but I think the result would be clearer and +possibly more concise too. +

+ + +

Proposed resolution:

+

+

+ + + + + +
+

754. Ambiguous return clause for std::uninitialized_copy

+

Section: 20.6.4.1 [uninitialized.copy] Status: New + Submitter: Daniel Krügler Date: 2007-10-15

+

View other active issues in [uninitialized.copy].

+

View all other issues in [uninitialized.copy].

+

View all issues with New status.

+

Discussion:

+

+14882-2003, [lib.uninitialized.copy] is currently written as follows: +

+ +
+
template <class InputIterator, class ForwardIterator>
+  ForwardIterator uninitialized_copy(InputIterator first, InputIterator last,
+                                     ForwardIterator result);
+
+
+

+-1- Effects: +

+
for (; first != last; ++result, ++first)
+  new (static_cast<void*>(&*result))
+    typename iterator_traits<ForwardIterator>::value_type(*first);
+
+

+-2- Returns: result +

+
+
+ +

+similarily for N2369, and its corresponding section +20.6.4.1 [uninitialized.copy]. +

+ +

+It's not clear to me what the return clause is supposed to mean, I see +two +possible interpretations: +

+ +
    +
  1. +The notion of result is supposed to mean the value given by the +function parameter result [Note to the issue editor: Please use italics for +result]. +This seems somewhat implied by recognizing that both the function +parameter +and the name used in the clause do have the same italic font. +
  2. +
  3. +The notion of "result" is supposed to mean the value of result +after the +preceding effects clause. This is in fact what all implementations I +checked +do (and which is probably it's intend, because it matches the +specification of std::copy). +
  4. +
+ +

+The problem is: I see nothing in the standard which grants that this +interpretation +is correct, specifically [lib.structure.specifications] or +17.3.1.3 [structure.specifications] +resp. do not clarify which "look-up" rules apply for names found in +the elements +of the detailed specifications - Do they relate to the corresponding +synopsis or +to the effects clause (or possibly other elements)? Fortunately most +detailed +descriptions are unambigious in this regard, e.g. this problem does +not apply +for std::copy. +

+ + + +

Proposed resolution:

+

+Change the wording of the return clause to say (20.6.4.1 [uninitialized.copy]): +

+ +
+

+-2- Returns: The value of result after effects have taken place. +

+
+ + + + + + + \ No newline at end of file diff --git a/libstdc++-v3/doc/html/ext/lwg-closed.html b/libstdc++-v3/doc/html/ext/lwg-closed.html new file mode 100644 index 00000000000..52184fb805e --- /dev/null +++ b/libstdc++-v3/doc/html/ext/lwg-closed.html @@ -0,0 +1,10627 @@ + +C++ Standard Library Closed Issues List + + + + + + + + + + + + + + + + + + + + + +
Doc. no.N2458=07-0328
Date:2007-10-20
Project:Programming Language C++
Reply to:Howard Hinnant <howard.hinnant@gmail.com>
+

C++ Standard Library Closed Issues List (Revision R52)

+ +

Reference ISO/IEC IS 14882:1998(E)

+

Also see:

+ + +

This document contains only library issues which have been closed + by the Library Working Group as duplicates or not defects. That is, + issues which have a status of Dup or + NAD. See the Library Active Issues List active issues and more + information. See the Library Defect Reports List for issues considered + defects. The introductory material in that document also applies to + this document.

+ +

Revision History

+
    +
  • R52: +2007-10-19 post-Kona mailing. + +
  • +
  • R51: +2007-09-09 pre-Kona mailing. + +
  • +
  • R50: +2007-08-05 post-Toronto mailing. +
      +
    • Summary:
        +
      • 153 open issues, down by 5.
      • +
      • 555 closed issues, up by 17.
      • +
      • 708 issues total, up by 12.
      • +
    • +
    • Details:
        +
      • Added the following New issues: 697, 698, 699, 700, 701, 702, 703, 704, 705, 706, 707, 708.
      • +
      • Changed the following issues from New to NAD: 583, 584, 662.
      • +
      • Changed the following issues from Open to NAD: 528.
      • +
      • Changed the following issues from New to NAD Editorial: 637, 647, 658, 690.
      • +
      • Changed the following issues from Open to NAD Editorial: 525.
      • +
      • Changed the following issues from Pending NAD Editorial to NAD Editorial: 553, 571, 591, 633, 636, 641, 642, 648, 649, 656.
      • +
      • Changed the following issues from New to Open: 579, 631, 680.
      • +
      • Changed the following issues from Pending WP to Open: 258.
      • +
      • Changed the following issues from Ready to Pending WP: 644.
      • +
      • Changed the following issues from New to Ready: 577, 660.
      • +
      • Changed the following issues from Open to Ready: 488.
      • +
      • Changed the following issues from Open to Review: 518.
      • +
      • Changed the following issues from Ready to TRDec: 604.
      • +
      • Changed the following issues from DR to WP: 453.
      • +
      • Changed the following issues from Ready to WP: 531, 551, 566, 628, 640, 643, 646.
      • +
    • +
    +
  • +
  • R49: +2007-06-23 pre-Toronto mailing. +
      +
    • Summary:
        +
      • 158 open issues, up by 13.
      • +
      • 538 closed issues, up by 7.
      • +
      • 696 issues total, up by 20.
      • +
    • +
    • Details:
        +
      • Added the following New issues: 677, 678, 679, 680, 681, 682, 684, 685, 686, 687, 688, 689, 690, 691, 692, 693, 694, 695, 696.
      • +
      • Added the following Pending NAD Editorial issues: 683.
      • +
      • Changed the following issues from New to NAD Editorial: 587.
      • +
      • Changed the following issues from Open to NAD Editorial: 590.
      • +
      • Changed the following issues from New to Pending NAD Editorial: 636, 642, 648, 649.
      • +
    • +
    +
  • +
  • R48: +2007-05-06 post-Oxford mailing. + +
  • +
  • R47: +2007-03-09 pre-Oxford mailing. + +
  • +
  • R46: +2007-01-12 mid-term mailing. +
      +
    • Summary:
        +
      • 141 open issues, up by 11.
      • +
      • 478 closed issues, down by 1.
      • +
      • 619 issues total, up by 10.
      • +
    • +
    • Details:
    • +
    +
  • +
  • R45: +2006-11-03 post-Portland mailing. + +
  • +
  • R44: +2006-09-08 pre-Portland mailing. +
      +
    • Summary:
        +
      • 130 open issues, up by 6.
      • +
      • 462 closed issues, down by 1.
      • +
      • 592 issues total, up by 5.
      • +
    • +
    • Details:
    • +
    +
  • +
  • R43: +2006-06-23 mid-term mailing. +
      +
    • Summary:
        +
      • 124 open issues, up by 14.
      • +
      • 463 closed issues, down by 1.
      • +
      • 587 issues total, up by 13.
      • +
    • +
    • Details:
    • +
    +
  • +
  • R42: +2006-04-21 post-Berlin mailing. + +
  • +
  • R41: +2006-02-24 pre-Berlin mailing. +
      +
    • Summary:
        +
      • 126 open issues, up by 31.
      • +
      • 440 closed issues, up by 0.
      • +
      • 566 issues total, up by 31.
      • +
    • +
    • Details:
        +
      • Added new issues 536-566.
      • +
      • Moved 342 from Ready to Open.
      • +
      • Reopened 309.
      • +
    • +
    +
  • +
  • R40: +2005-12-16 mid-term mailing. +
      +
    • Summary:
        +
      • 95 open issues.
      • +
      • 440 closed issues.
      • +
      • 535 issues total.
      • +
    • +
    • Details:
    • +
    +
  • +
  • R39: +2005-10-14 post-Mont Tremblant mailing. +Added new issues 526-528. +Moved issues 280, 461, 464, 465, 467, 468, 474, 496 from Ready to WP as per the vote from Mont Tremblant. +Moved issues 247, 294, 342, 362, 369, 371, 376, 384, 475, 478, 495, 497 from Review to Ready. +Moved issues 498, 504, 506, 509, 510, 511, 512, 513, 514 from New to Open. +Moved issues 505, 507, 508, 519 from New to Ready. +Moved issue 500 from New to NAD. +Moved issue 518 from New to Review. +
  • +
  • R38: +2005-07-03 pre-Mont Tremblant mailing. +Merged open TR1 issues in 504-522. +Added new issues 523-523 +
  • +
  • R37: +2005-06 mid-term mailing. +Added new issues 498-503. +
  • +
  • R36: +2005-04 post-Lillehammer mailing. All issues in "ready" status except +for 454 were moved to "DR" status, and all issues +previously in "DR" status were moved to "WP". +
  • +
  • R35: +2005-03 pre-Lillehammer mailing. +
  • +
  • R34: +2005-01 mid-term mailing. Added new issues 488-494. +
  • +
  • R33: +2004-11 post-Redmond mailing. Reflects actions taken in Redmond. +
  • +
  • R32: +2004-09 pre-Redmond mailing: reflects new proposed resolutions and +new issues received after the 2004-07 mailing. Added +new issues 479-481. +
  • +
  • R31: +2004-07 mid-term mailing: reflects new proposed resolutions and +new issues received after the post-Sydney mailing. Added +new issues 463-478. +
  • +
  • R30: +Post-Sydney mailing: reflects decisions made at the Sydney meeting. +Voted all "Ready" issues from R29 into the working paper. +Added new issues 460-462. +
  • +
  • R29: +Pre-Sydney mailing. Added new issues 441-457. +
  • +
  • R28: +Post-Kona mailing: reflects decisions made at the Kona meeting. +Added new issues 432-440. +
  • +
  • R27: +Pre-Kona mailing. Added new issues 404-431. +
  • +
  • R26: +Post-Oxford mailing: reflects decisions made at the Oxford meeting. +All issues in Ready status were voted into DR status. All issues in +DR status were voted into WP status. +
  • +
  • R25: +Pre-Oxford mailing. Added new issues 390-402. +
  • +
  • R24: +Post-Santa Cruz mailing: reflects decisions made at the Santa Cruz +meeting. All Ready issues from R23 with the exception of 253, which has been given a new proposed resolution, were +moved to DR status. Added new issues 383-389. (Issues 387-389 were discussed +at the meeting.) Made progress on issues 225, 226, 229: 225 and 229 have been moved to Ready status, and the only remaining +concerns with 226 involve wording. +
  • +
  • R23: +Pre-Santa Cruz mailing. Added new issues 367-382. +Moved issues in the TC to TC status. +
  • +
  • R22: +Post-Curaçao mailing. Added new issues 362-366. +
  • +
  • R21: +Pre-Curaçao mailing. Added new issues 351-361. +
  • +
  • R20: +Post-Redmond mailing; reflects actions taken in Redmond. Added +new issues 336-350, of which issues +347-350 were added since Redmond, hence +not discussed at the meeting. + +All Ready issues were moved to DR status, with the exception of issues +284, 241, and 267. + +Noteworthy issues discussed at Redmond include +120 202, 226, 233, +270, 253, 254, 323. +
  • +
  • R19: +Pre-Redmond mailing. Added new issues +323-335. +
  • +
  • R18: +Post-Copenhagen mailing; reflects actions taken in Copenhagen. +Added new issues 312-317, and discussed +new issues 271-314. + +Changed status of issues +103 118 136 153 +165 171 183 184 +185 186 214 221 +234 237 243 248 +251 252 256 260 +261 262 263 265 +268 +to DR. + +Changed status of issues +49 109 117 182 +228 230 232 235 +238 241 242 250 +259 264 266 267 +271 272 273 275 +281 284 285 286 +288 292 295 297 +298 301 303 306 +307 308 312 +to Ready. + +Closed issues +111 277 279 287 +289 293 302 313 +314 +as NAD. + +
  • +
  • R17: +Pre-Copenhagen mailing. Converted issues list to XML. Added proposed +resolutions for issues 49, 76, 91, 235, 250, 267. +Added new issues 278-311. +
  • +
  • R16: +post-Toronto mailing; reflects actions taken in Toronto. Added new +issues 265-277. Changed status of issues +3, 8, 9, 19, +26, 31, 61, +63, 86, 108, +112, 114, 115, +122, 127, 129, +134, 137, 142, +144, 146, 147, +159, 164, 170, +181, 199, 208, +209, 210, 211, +212, 217, 220, +222, 223, 224, +227 to "DR". Reopened issue 23. Reopened +issue 187. Changed issues 2 and +4 to NAD. Fixed a typo in issue 17. Fixed +issue 70: signature should be changed both places it +appears. Fixed issue 160: previous version didn't fix +the bug in enough places. +
  • +
  • R15: +pre-Toronto mailing. Added issues +233-264. Some small HTML formatting +changes so that we pass Weblint tests. +
  • +
  • R14: +post-Tokyo II mailing; reflects committee actions taken in +Tokyo. Added issues 228 to 232. (00-0019R1/N1242) +
  • +
  • R13: +pre-Tokyo II updated: Added issues 212 to 227. +
  • +
  • R12: +pre-Tokyo II mailing: Added issues 199 to +211. Added "and paragraph 5" to the proposed resolution +of issue 29. Add further rationale to issue +178. +
  • +
  • R11: +post-Kona mailing: Updated to reflect LWG and full committee actions +in Kona (99-0048/N1224). Note changed resolution of issues +4 and 38. Added issues 196 +to 198. Closed issues list split into "defects" and +"closed" documents. Changed the proposed resolution of issue +4 to NAD, and changed the wording of proposed resolution +of issue 38. +
  • +
  • R10: +pre-Kona updated. Added proposed resolutions 83, +86, 91, 92, +109. Added issues 190 to +195. (99-0033/D1209, 14 Oct 99) +
  • +
  • R9: +pre-Kona mailing. Added issues 140 to +189. Issues list split into separate "active" and +"closed" documents. (99-0030/N1206, 25 Aug 99) +
  • +
  • R8: +post-Dublin mailing. Updated to reflect LWG and full committee actions +in Dublin. (99-0016/N1193, 21 Apr 99) +
  • +
  • R7: +pre-Dublin updated: Added issues 130, 131, +132, 133, 134, +135, 136, 137, +138, 139 (31 Mar 99) +
  • +
  • R6: +pre-Dublin mailing. Added issues 127, 128, +and 129. (99-0007/N1194, 22 Feb 99) +
  • +
  • R5: +update issues 103, 112; added issues +114 to 126. Format revisions to prepare +for making list public. (30 Dec 98) +
  • +
  • R4: +post-Santa Cruz II updated: Issues 110, +111, 112, 113 added, several +issues corrected. (22 Oct 98) +
  • +
  • R3: +post-Santa Cruz II: Issues 94 to 109 +added, many issues updated to reflect LWG consensus (12 Oct 98) +
  • +
  • R2: +pre-Santa Cruz II: Issues 73 to 93 added, +issue 17 updated. (29 Sep 98) +
  • +
  • R1: +Correction to issue 55 resolution, 60 code +format, 64 title. (17 Sep 98) +
  • +
+ +

Closed Issues

+
+

2. Auto_ptr conversions effects incorrect

+

Section: D.9.1.3 [auto.ptr.conv] Status: NAD + Submitter: Nathan Myers Date: 1997-12-04

+

View all issues with NAD status.

+

Discussion:

+

Paragraph 1 in "Effects", says "Calls +p->release()" where it clearly must be "Calls +p.release()". (As it is, it seems to require using +auto_ptr<>::operator-> to refer to X::release, assuming that +exists.)

+ + +

Proposed resolution:

+

Change 20.4.4.3 [meta.unary.prop] paragraph 1 Effects from +"Calls p->release()" to "Calls p.release()".

+ + +

Rationale:

+

Not a defect: the proposed change is already found in the standard. +[Originally classified as a defect, later reclassified.]

+ + + + + +
+

4. Basic_string size_type and difference_type should be implementation defined

+

Section: 21.3 [basic.string] Status: NAD + Submitter: Beman Dawes Date: 1997-11-16

+

View other active issues in [basic.string].

+

View all other issues in [basic.string].

+

View all issues with NAD status.

+

Discussion:

+

In Morristown we changed the size_type and difference_type typedefs +for all the other containers to implementation defined with a +reference to 23.1 [container.requirements]. This should probably also have been +done for strings.

+ + +

Rationale:

+

Not a defect. [Originally classified as a defect, later +reclassified.] basic_string, unlike the other standard library +template containers, is severely constrained by its use of +char_traits. Those types are dictated by the traits class, and are far +from implementation defined.

+ + + + + +
+

6. File position not an offset unimplementable

+

Section: 27.4.3 [fpos] Status: NAD + Submitter: Matt Austern Date: 1997-12-15

+

View all other issues in [fpos].

+

View all issues with NAD status.

+

Discussion:

+

Table 88, in I/O, is too strict; it's unimplementable on systems +where a file position isn't just an offset. It also never says just +what fpos<> is really supposed to be. [Here's my summary, which +Jerry agrees is more or less accurate. "I think I now know what +the class really is, at this point: it's a magic cookie that +encapsulates an mbstate_t and a file position (possibly represented as +an fpos_t), it has syntactic support for pointer-like arithmetic, and +implementors are required to have real, not just syntactic, support +for arithmetic." This isn't standardese, of course.]

+ + +

Rationale:

+

Not a defect. The LWG believes that the Standard is already clear, +and that the above summary is what the Standard in effect says.

+ + + + + +
+

10. Codecvt<>::do unclear

+

Section: 22.2.1.5 [locale.codecvt.byname] Status: Dup + Submitter: Matt Austern Date: 1998-01-14

+

View all other issues in [locale.codecvt.byname].

+

View all issues with Dup status.

+

Duplicate of: 19

+

Discussion:

+

Section 22.2.1.5.2 says that codecvt<>::do_in and do_out +should return the value noconv if "no conversion was +needed". However, I don't see anything anywhere that defines what +it means for a conversion to be needed or not needed. I can think of +several circumstances where one might plausibly think that a +conversion is not "needed", but I don't know which one is +intended here.

+ + +

Rationale:

+ + + + + + +
+

12. Way objects hold allocators unclear

+

Section: 20.1.2 [allocator.requirements] Status: NAD + Submitter: Angelika Langer Date: 1998-02-23

+

View other active issues in [allocator.requirements].

+

View all other issues in [allocator.requirements].

+

View all issues with NAD status.

+

Discussion:

+

I couldn't find a statement in the standard saying whether the allocator object held by +a container is held as a copy of the constructor argument or whether a pointer of +reference is maintained internal. There is an according statement for compare objects and +how they are maintained by the associative containers, but I couldn't find anything +regarding allocators.

+ +

Did I overlook it? Is it an open issue or known defect? Or is it deliberately left +unspecified?

+ + +

Rationale:

+

Not a defect. The LWG believes that the Standard is already +clear.  See 23.1 [container.requirements], paragraph 8.

+ + + + + +
+

43. Locale table correction

+

Section: 22.2.1.5 [locale.codecvt.byname] Status: Dup + Submitter: Brendan Kehoe Date: 1998-06-01

+

View all other issues in [locale.codecvt.byname].

+

View all issues with Dup status.

+

Duplicate of: 33

+

Discussion:

+ + +

Rationale:

+ + + + + + +
+

45. Stringstreams read/write pointers initial position unclear

+

Section: 27.7.3 [ostringstream] Status: NAD + Submitter: Matthias Mueller Date: 1998-05-27

+

View all issues with NAD status.

+

Discussion:

+

In a comp.lang.c++.moderated Matthias Mueller wrote:

+ +

"We are not sure how to interpret the CD2 (see 27.2 +[iostream.forward], 27.7.3.1 [ostringstream.cons], 27.7.1.1 +[stringbuf.cons]) +with respect to the question as to what the correct initial positions +of the write and  read pointers of a stringstream should +be."

+ +

"Is it the same to output two strings or to initialize the stringstream with the +first and to output the second?"

+ +

[PJ Plauger, Bjarne Stroustrup, Randy Smithey, Sean Corfield, and +Jerry Schwarz have all offered opinions; see reflector messages +lib-6518, 6519, 6520, 6521, 6523, 6524.]

+ + + + +

Rationale:

+

The LWG believes the Standard is correct as written. The behavior +of stringstreams is consistent with fstreams, and there is a +constructor which can be used to obtain the desired effect. This +behavior is known to be different from strstreams.

+ + + + + +
+

58. Extracting a char from a wide-oriented stream

+

Section: 27.6.1.2.3 [istream::extractors] Status: NAD + Submitter: Matt Austern Date: 1998-07-01

+

View all other issues in [istream::extractors].

+

View all issues with NAD status.

+

Discussion:

+

27.6.1.2.3 has member functions for extraction of signed char and +unsigned char, both singly and as strings. However, it doesn't say +what it means to extract a char from a +basic_streambuf<charT, Traits>.

+ +

basic_streambuf, after all, has no members to extract a char, so +basic_istream must somehow convert from charT to signed char or +unsigned char. The standard doesn't say how it is to perform that +conversion.

+ + +

Rationale:

+

The Standard is correct as written. There is no such extractor and +this is the intent of the LWG.

+ + + + +
+

65. Underspecification of strstreambuf::seekoff

+

Section: D.7.1.3 [depr.strstreambuf.virtuals] Status: NAD + Submitter: Matt Austern Date: 1998-08-18

+

View all other issues in [depr.strstreambuf.virtuals].

+

View all issues with NAD status.

+

Discussion:

+

The standard says how this member function affects the current +stream position. (gptr or pptr) However, it does not +say how this member function affects the beginning and end of the +get/put area.

+ +

This is an issue when seekoff is used to position the get pointer +beyond the end of the current read area. (Which is legal. This is +implicit in the definition of seekhigh in D.7.1, paragraph 4.) +

+ + +

Rationale:

+

The LWG agrees that seekoff() is underspecified, but does not wish +to invest effort in this deprecated feature.

+ + + + + +
+

67. Setw useless for strings

+

Section: 21.3.8.9 [string.io] Status: Dup + Submitter: Steve Clamage Date: 1998-07-09

+

View all other issues in [string.io].

+

View all issues with Dup status.

+

Duplicate of: 25

+

Discussion:

+

In a comp.std.c++ posting Michel Michaud wrote: What +should be output by:

+ +
   string text("Hello");
+   cout << '[' << setw(10) << right << text << ']';
+
+ +

Shouldn't it be:

+ +
   [     Hello]
+ +

Another person replied: Actually, according to the FDIS, the width +of the field should be the minimum of width and the length of the +string, so the output shouldn't have any padding. I think that this is +a typo, however, and that what is wanted is the maximum of the +two. (As written, setw is useless for strings. If that had been the +intent, one wouldn't expect them to have mentioned using its value.) +

+ +

It's worth pointing out that this is a recent correction anyway; +IIRC, earlier versions of the draft forgot to mention formatting +parameters whatsoever.

+ + +

Rationale:

+ + + + + + +
+

72. Do_convert phantom member function

+

Section: 22.2.1.4 [locale.codecvt] Status: Dup + Submitter: Nathan Myers Date: 1998-08-24

+

View all other issues in [locale.codecvt].

+

View all issues with Dup status.

+

Duplicate of: 24

+

Discussion:

+

In 22.2.1.4 [locale.codecvt] par 3, and in 22.2.1.4.2 [locale.codecvt.virtuals] par 8, a nonexistent member function +"do_convert" is mentioned. This member was replaced with +"do_in" and "do_out", the proper referents in the +contexts above.

+ + +

Rationale:

+ + + + + +
+

73. is_open should be const

+

Section: 27.8.1 [fstreams] Status: NAD + Submitter: Matt Austern Date: 1998-08-27

+

View all other issues in [fstreams].

+

View all issues with NAD status.

+

Discussion:

+

Classes basic_ifstream, basic_ofstream, and +basic_fstream all have a member function is_open. It +should be a const member function, since it does nothing but +call one of basic_filebuf's const member functions.

+ + +

Rationale:

+

Not a defect. This is a deliberate feature; const streams would be +meaningless.

+ + + + +
+

77. Valarray operator[] const returning value

+

Section: 26.5.2.3 [valarray.access] Status: Dup + Submitter: Levente Farkas Date: 1998-09-09

+

View all other issues in [valarray.access].

+

View all issues with Dup status.

+

Duplicate of: 389

+

Discussion:

+

valarray:
+
+    T operator[] (size_t) const;
+
+why not
+
+    const T& operator[] (size_t) const;
+
+as in vector ???
+
+One can't copy even from a const valarray eg:
+
+    memcpy(ptr, &v[0], v.size() * sizeof(double));
+

+[I] find this bug in valarray is very difficult.

+ + +

Rationale:

+

The LWG believes that the interface was deliberately designed that +way. That is what valarray was designed to do; that's where the +"value array" name comes from. LWG members further comment +that "we don't want valarray to be a full STL container." +26.5.2.3 [valarray.access] specifies properties that indicate "an +absence of aliasing" for non-constant arrays; this allows +optimizations, including special hardware optimizations, that are not +otherwise possible.

+ + + + + +
+

81. Wrong declaration of slice operations

+

Section: 26.5.5 [template.slice.array], 26.5.7 [template.gslice.array], 26.5.8 [template.mask.array], 26.5.9 [template.indirect.array] Status: NAD + Submitter: Nico Josuttis Date: 1998-09-29

+

View all other issues in [template.slice.array].

+

View all issues with NAD status.

+

Discussion:

+

Isn't the definition of copy constructor and assignment operators wrong? +       Instead of

+ +
      slice_array(const slice_array&); 
+      slice_array& operator=(const slice_array&);
+ +

IMHO they have to be

+ +
      slice_array(const slice_array<T>&); 
+      slice_array& operator=(const slice_array<T>&);
+ +

Same for gslice_array.

+ + +

Rationale:

+

Not a defect. The Standard is correct as written.

+ + + + +
+

82. Missing constant for set elements

+

Section: 23.1.2 [associative.reqmts] Status: NAD + Submitter: Nico Josuttis Date: 1998-09-29

+

View all other issues in [associative.reqmts].

+

View all issues with NAD status.

+

Discussion:

+

Paragraph 5 specifies:

+ +

+For set and multiset the value type is the same as the key type. For +map and multimap it is equal to pair<const Key, T>. +

+ +

Strictly speaking, this is not correct because for set and multiset +the value type is the same as the constant key type.

+ + +

Rationale:

+

Not a defect. The Standard is correct as written; it uses a +different mechanism (const &) for set and +multiset. See issue 103 for a related +issue.

+ + + + +
+

84. Ambiguity with string::insert()

+

Section: 21.3.5 [string.access] Status: NAD + Submitter: Nico Josuttis Date: 1998-09-29

+

View all issues with NAD status.

+

Discussion:

+

If I try

+
    s.insert(0,1,' ');
+ +

  I get an nasty ambiguity. It might be

+
    s.insert((size_type)0,(size_type)1,(charT)' ');
+ +

which inserts 1 space character at position 0, or

+
    s.insert((char*)0,(size_type)1,(charT)' ')
+ +

which inserts 1 space character at iterator/address 0 (bingo!), or

+
    s.insert((char*)0, (InputIterator)1, (InputIterator)' ')
+ +

which normally inserts characters from iterator 1 to iterator ' +'. But according to 23.1.1.9 (the "do the right thing" fix) +it is equivalent to the second. However, it is still ambiguous, +because of course I mean the first!

+ + +

Rationale:

+

Not a defect. The LWG believes this is a "genetic +misfortune" inherent in the design of string and thus not a +defect in the Standard as such .

+ + + + +
+

85. String char types

+

Section: 21 [strings] Status: NAD + Submitter: Nico Josuttis Date: 1998-09-29

+

View all other issues in [strings].

+

View all issues with NAD status.

+

Discussion:

+

The standard seems not to require that charT is equivalent to +traits::char_type. So, what happens if charT is not equivalent to +traits::char_type?

+ + +

Rationale:

+

There is already wording in 21.1 [char.traits] paragraph 3 that +requires them to be the same.

+ + + + +
+

87. Error in description of string::compare()

+

Section: 21.3.6.8 [string::swap] Status: Dup + Submitter: Nico Josuttis Date: 1998-09-29

+

View all other issues in [string::swap].

+

View all issues with Dup status.

+

Duplicate of: 5

+

Discussion:

+

The following compare() description is obviously a bug:

+ +
int compare(size_type pos, size_type n1, 
+            charT *s, size_type n2 = npos) const;
+
+ +

because without passing n2 it should compare up to the end of the +string instead of comparing npos characters (which throws an +exception)

+ + +

Rationale:

+ + + + + +
+

88. Inconsistency between string::insert() and string::append()

+

Section: 21.3.6.4 [string::insert], 21.3.6.2 [string::append] Status: NAD + Submitter: Nico Josuttis Date: 1998-09-29

+

View all other issues in [string::insert].

+

View all issues with NAD status.

+

Discussion:

+

Why does

+
  template<class InputIterator> 
+       basic_string& append(InputIterator first, InputIterator last);
+ +

return a string, while

+
  template<class InputIterator> 
+       void insert(iterator p, InputIterator first, InputIterator last);
+ +

returns nothing ?

+ + +

Rationale:

+

The LWG believes this stylistic inconsistency is not sufficiently +serious to constitute a defect.

+ + + + +
+

89. Missing throw specification for string::insert() and string::replace()

+

Section: 21.3.6.4 [string::insert], 21.3.6.6 [string::replace] Status: Dup + Submitter: Nico Josuttis Date: 1998-09-29

+

View all other issues in [string::insert].

+

View all issues with Dup status.

+

Duplicate of: 83

+

Discussion:

+

All insert() and replace() members for strings with an iterator as +first argument lack a throw specification. The throw +specification should probably be: length_error if size exceeds +maximum.

+ + +

Rationale:

+

Considered a duplicate because it will be solved by the resolution +of issue 83.

+ + + + + +
+

93. Incomplete Valarray Subset Definitions

+

Section: 26.5 [numarray] Status: NAD + Submitter: Nico Josuttis Date: 1998-09-29

+

View all other issues in [numarray].

+

View all issues with NAD status.

+

Discussion:

+

You can easily create subsets, but you can't easily combine them +with other subsets. Unfortunately, you almost always needs an +explicit type conversion to valarray. This is because the standard +does not specify that valarray subsets provide the same operations as +valarrays.

+ +

For example, to multiply two subsets and assign the result to a third subset, you can't +write the following:

+ +
va[slice(0,4,3)] = va[slice(1,4,3)] * va[slice(2,4,3)];
+ +

Instead, you have to code as follows:

+ +
va[slice(0,4,3)] = static_cast<valarray<double> >(va[slice(1,4,3)]) * 
+                   static_cast<valarray<double> >(va[slice(2,4,3)]);
+ +

This is tedious and error-prone. Even worse, it costs performance because each cast +creates a temporary objects, which could be avoided without the cast.

+ + +

Proposed resolution:

+

Extend all valarray subset types so that they offer all valarray operations.

+ + +

Rationale:

+

This is not a defect in the Standard; it is a request for an extension.

+ + + + +
+

94. May library implementors add template parameters to Standard Library classes?

+

Section: 17.4.4 [conforming] Status: NAD + Submitter: Matt Austern Date: 1998-01-22

+

View all issues with NAD status.

+

Discussion:

+

Is it a permitted extension for library implementors to add template parameters to +standard library classes, provided that those extra parameters have defaults? For example, +instead of defining template <class T, class Alloc = allocator<T> > class +vector; defining it as template <class T, class Alloc = allocator<T>, +int N = 1> class vector;

+ +

The standard may well already allow this (I can't think of any way that this extension +could break a conforming program, considering that users are not permitted to +forward-declare standard library components), but it ought to be explicitly permitted or +forbidden.

+ +

comment from Steve Cleary via comp.std.c++:

+
+

I disagree [with the proposed resolution] for the following reason: +consider user library code with template template parameters. For +example, a user library object may be templated on the type of +underlying sequence storage to use (deque/list/vector), since these +classes all take the same number and type of template parameters; this +would allow the user to determine the performance tradeoffs of the +user library object. A similar example is a user library object +templated on the type of underlying set storage (set/multiset) or map +storage (map/multimap), which would allow users to change (within +reason) the semantic meanings of operations on that object.

+

I think that additional template parameters should be forbidden in +the Standard classes. Library writers don't lose any expressive power, +and can still offer extensions because additional template parameters +may be provided by a non-Standard implementation class:

+
 
+   template <class T, class Allocator = allocator<T>, int N = 1>
+   class __vector
+   { ... };
+   template <class T, class Allocator = allocator<T> >
+   class vector: public __vector<T, Allocator>
+   { ... };
+
+ +
+ + + +

Proposed resolution:

+

Add a new subclause [presumably 17.4.4.9] following 17.4.4.8 [res.on.exception.handling]:

+ +
+

17.4.4.9 Template Parameters

A specialization of a + template class described in the C++ Standard Library behaves the + same as if the implementation declares no additional template + parameters.

Footnote: Additional template parameters with + default values are thus permitted.

+
+ +

Add "template parameters" to the list of subclauses at +the end of 17.4.4 [conforming] paragraph 1.

+ +

[Kona: The LWG agreed the standard needs clarification. After +discussion with John Spicer, it seems added template parameters can be +detected by a program using template-template parameters. A straw vote +- "should implementors be allowed to add template +parameters?" found no consensus ; 5 - yes, 7 - no.]

+ + + + +

Rationale:

+

+There is no ambiguity; the standard is clear as written. Library +implementors are not permitted to add template parameters to standard +library classes. This does not fall under the "as if" rule, +so it would be permitted only if the standard gave explicit license +for implementors to do this. This would require a change in the +standard. +

+ +

+The LWG decided against making this change, because it would break +user code involving template template parameters or specializations +of standard library class templates. +

+ + + + + +
+

95. Members added by the implementation

+

Section: 17.4.4.4 [member.functions] Status: NAD + Submitter: AFNOR Date: 1998-10-07

+

View all issues with NAD status.

+

Discussion:

+

In 17.3.4.4/2 vs 17.3.4.7/0 there is a hole; an implementation could add virtual +members a base class and break user derived classes.

+ +

Example:

+ +
+
// implementation code:
+struct _Base { // _Base is in the implementer namespace
+        virtual void foo ();
+};
+class vector : _Base // deriving from a class is allowed
+{ ... };
+
+// user code:
+class vector_checking : public vector 
+{
+        void foo (); // don't want to override _Base::foo () as the 
+                     // user doesn't know about _Base::foo ()
+};
+
+ + +

Proposed resolution:

+

Clarify the wording to make the example illegal.

+ + +

Rationale:

+

This is not a defect in the Standard.  The example is already +illegal.  See 17.4.4.4 [member.functions] paragraph 2.

+ + + + +
+

97. Insert inconsistent definition

+

Section: 23 [containers] Status: NAD + Submitter: AFNOR Date: 1998-10-07

+

View all other issues in [containers].

+

View all issues with NAD status.

+

Discussion:

+

insert(iterator, const value_type&) is defined both on +sequences and on set, with unrelated semantics: insert here (in +sequences), and insert with hint (in associative containers). They +should have different names (B.S. says: do not abuse overloading).

+ + +

Rationale:

+

This is not a defect in the Standard. It is a genetic misfortune of +the design, for better or for worse.

+ + + + +
+

99. Reverse_iterator comparisons completely wrong

+

Section: 24.4.1.3.13 [reverse.iter.op==] Status: NAD + Submitter: AFNOR Date: 1998-10-07

+

View all issues with NAD status.

+

Discussion:

+

The <, >, <=, >= comparison operator are wrong: they +return the opposite of what they should.

+ +

Note: same problem in CD2, these were not even defined in CD1. SGI +STL code is correct; this problem is known since the Morristown +meeting but there it was too late

+ + +

Rationale:

+

This is not a defect in the Standard. A careful reading shows the Standard is correct +as written. A review of several implementations show that they implement +exactly what the Standard says.

+ + + + +
+

100. Insert iterators/ostream_iterators overconstrained

+

Section: 24.4.2 [insert.iterators], 24.5.4 [ostreambuf.iterator] Status: NAD + Submitter: AFNOR Date: 1998-10-07

+

View all issues with NAD status.

+

Discussion:

+

Overspecified For an insert iterator it, the expression *it is +required to return a reference to it. This is a simple possible +implementation, but as the SGI STL documentation says, not the only +one, and the user should not assume that this is the case.

+ + +

Rationale:

+

The LWG believes this causes no harm and is not a defect in the +standard. The only example anyone could come up with caused some +incorrect code to work, rather than the other way around.

+ + + + + +
+

101. No way to free storage for vector and deque

+

Section: 23.2.5 [vector], 23.2.1 [array] Status: NAD + Submitter: AFNOR Date: 1998-10-07

+

View all other issues in [vector].

+

View all issues with NAD status.

+

Discussion:

+

Reserve can not free storage, unlike string::reserve

+ + +

Rationale:

+

This is not a defect in the Standard. The LWG has considered this +issue in the past and sees no need to change the Standard. Deque has +no reserve() member function. For vector, shrink-to-fit can be +expressed in a single line of code (where v is +vector<T>): +

+ +
+

vector<T>(v).swap(v);  // shrink-to-fit v

+
+ + + + + +
+

102. Bug in insert range in associative containers

+

Section: 23.1.2 [associative.reqmts] Status: Dup + Submitter: AFNOR Date: 1998-10-07

+

View all other issues in [associative.reqmts].

+

View all issues with Dup status.

+

Duplicate of: 264

+

Discussion:

+

Table 69 of Containers say that a.insert(i,j) is linear if [i, j) is ordered. It seems +impossible to implement, as it means that if [i, j) = [x], insert in an associative +container is O(1)!

+ + +

Proposed resolution:

+

N+log (size()) if [i,j) is sorted according to value_comp()

+ + +

Rationale:

+

Subsumed by issue 264.

+ + + + + +
+

104. Description of basic_string::operator[] is unclear

+

Section: 21.3.4 [string.capacity] Status: NAD + Submitter: AFNOR Date: 1998-10-07

+

View all other issues in [string.capacity].

+

View all issues with NAD status.

+

Discussion:

+

It is not clear that undefined behavior applies when pos == size () +for the non const version.

+ + +

Proposed resolution:

+

Rewrite as: Otherwise, if pos > size () or pos == size () and +the non-const version is used, then the behavior is undefined.

+ + +

Rationale:

+

The Standard is correct. The proposed resolution already appears in +the Standard.

+ + + + +
+

105. fstream ctors argument types desired

+

Section: 27.8 [file.streams] Status: NAD Future + Submitter: AFNOR Date: 1998-10-07

+

View all issues with NAD Future status.

+

Discussion:

+

fstream ctors take a const char* instead of string.
+fstream ctors can't take wchar_t

+ +

An extension to add a const wchar_t* to fstream would make the +implementation non conforming.

+ + +

Rationale:

+

This is not a defect in the Standard. It might be an +interesting extension for the next Standard.

+ + + + +
+

107. Valarray constructor is strange

+

Section: 26.5.2 [template.valarray] Status: NAD + Submitter: AFNOR Date: 1998-10-07

+

View all other issues in [template.valarray].

+

View all issues with NAD status.

+

Discussion:

+

The order of the arguments is (elem, size) instead of the normal +(size, elem) in the rest of the library. Since elem often has an +integral or floating point type, both types are convertible to each +other and reversing them leads to a well formed program.

+ + +

Proposed resolution:

+

Inverting the arguments could silently break programs. Introduce +the two signatures (const T&, size_t) and (size_t, const T&), +but make the one we do not want private so errors result in a +diagnosed access violation. This technique can also be applied to STL +containers.

+ + +

Rationale:

+

The LWG believes that while the order of arguments is unfortunate, +it does not constitute a defect in the standard. The LWG believes that +the proposed solution will not work for valarray<size_t> and +perhaps other cases.

+ + + + +
+

111. istreambuf_iterator::equal overspecified, inefficient

+

Section: 24.5.3.5 [istreambuf.iterator::equal] Status: NAD Future + Submitter: Nathan Myers Date: 1998-10-15

+

View all issues with NAD Future status.

+

Discussion:

+

The member istreambuf_iterator<>::equal is specified to be +unnecessarily inefficient. While this does not affect the efficiency +of conforming implementations of iostreams, because they can +"reach into" the iterators and bypass this function, it does +affect users who use istreambuf_iterators.

+ +

The inefficiency results from a too-scrupulous definition, which +requires a "true" result if neither iterator is at eof. In +practice these iterators can only usefully be compared with the +"eof" value, so the extra test implied provides no benefit, +but slows down users' code.

+ +

The solution is to weaken the requirement on the function to return +true only if both iterators are at eof.

+ + +

Proposed resolution:

+

Replace 24.5.3.5 [istreambuf.iterator::equal], +paragraph 1,

+ +
+

-1- Returns: true if and only if both iterators are at end-of-stream, or neither is at + end-of-stream, regardless of what streambuf object they use.

+
+ +

with

+ +
+

-1- Returns: true if and only if both iterators are at + end-of-stream, regardless of what streambuf object they use.

+
+ + + +

Rationale:

+

It is not clear that this is a genuine defect. Additionally, the +LWG was reluctant to make a change that would result in +operator== not being a equivalence relation. One consequence of +this change is that an algorithm that's passed the range [i, i) +would no longer treat it as an empty range.

+ + + + + +
+

113. Missing/extra iostream sync semantics

+

Section: 27.6.1.1 [istream], 27.6.1.3 [istream.unformatted] Status: NAD + Submitter: Steve Clamage Date: 1998-10-13

+

View all other issues in [istream].

+

View all issues with NAD status.

+

Discussion:

+

In 27.6.1.1, class basic_istream has a member function sync, described in 27.6.1.3, +paragraph 36.

+ +

Following the chain of definitions, I find that the various sync functions have defined +semantics for output streams, but no semantics for input streams. On the other hand, +basic_ostream has no sync function.

+ +

The sync function should at minimum be added to basic_ostream, for internal +consistency.

+ +

A larger question is whether sync should have assigned semantics for input streams.

+ +

Classic iostreams said streambuf::sync flushes pending output and attempts to return +unread input characters to the source. It is a protected member function. The filebuf +version (which is public) has that behavior (it backs up the read pointer). Class +strstreambuf does not override streambuf::sync, and so sync can't be called on a +strstream.

+ +

If we can add corresponding semantics to the various sync functions, we should. If not, +we should remove sync from basic_istream.

+ + +

Rationale:

+

A sync function is not needed in basic_ostream because the flush function provides the +desired functionality.

+ +

As for the other points, the LWG finds the standard correct as written.

+ + + + + +
+

116. bitset cannot be constructed with a const char*

+

Section: 23.3.5 [template.bitset] Status: NAD Future + Submitter: Judy Ward Date: 1998-11-06

+

View other active issues in [template.bitset].

+

View all other issues in [template.bitset].

+

View all issues with NAD Future status.

+

Discussion:

+

The following code does not compile with the EDG compiler:

+ +
+
#include <bitset>
+using namespace std;
+bitset<32> b("111111111");
+
+ +

If you cast the ctor argument to a string, i.e.:

+ +
+
bitset<32> b(string("111111111"));
+
+ +

then it will compile. The reason is that bitset has the following templatized +constructor:

+ +
+
template <class charT, class traits, class Allocator>
+explicit bitset (const basic_string<charT, traits, Allocator>& str, ...);
+
+ +

According to the compiler vendor, Steve Adamcyk at EDG, the user +cannot pass this template constructor a const char* and +expect a conversion to basic_string. The reason is +"When you have a template constructor, it can get used in +contexts where type deduction can be done. Type deduction basically +comes up with exact matches, not ones involving conversions." +

+ +

I don't think the intention when this constructor became +templatized was for construction from a const char* to no +longer work.

+ + +

Proposed resolution:

+

Add to 23.3.5 [template.bitset] a bitset constructor declaration

+ +
+
explicit bitset(const char*);
+
+ +

and in Section 23.3.5.1 [bitset.cons] add:

+ +
+
explicit bitset(const char* str);
+

Effects:
+     Calls bitset((string) str, 0, string::npos);

+
+ + +

Rationale:

+

Although the problem is real, the standard is designed that way so +it is not a defect. Education is the immediate workaround. A future +standard may wish to consider the Proposed Resolution as an +extension.

+ + + + + +
+

121. Detailed definition for ctype<wchar_t> specialization

+

Section: 22.1.1.1.1 [locale.category] Status: NAD + Submitter: Judy Ward Date: 1998-12-15

+

View all other issues in [locale.category].

+

View all issues with NAD status.

+

Discussion:

+

Section 22.1.1.1.1 has the following listed in Table 51: ctype<char> , +ctype<wchar_t>.

+ +

Also Section 22.2.1.1 [locale.ctype] says:

+ +
+

The instantiations required in Table 51 (22.1.1.1.1) namely ctype<char> and + ctype<wchar_t> , implement character classing appropriate to the implementation's + native character set.

+
+ +

However, Section 22.2.1.3 [facet.ctype.special] +only has a detailed description of the ctype<char> specialization, not the +ctype<wchar_t> specialization.

+ + +

Proposed resolution:

+

Add the ctype<wchar_t> detailed class description to Section +22.2.1.3 [facet.ctype.special].

+ + +

Rationale:

+

Specialization for wchar_t is not needed since the default is acceptable.

+ + + + + +
+

128. Need open_mode() function for file stream, string streams, file buffers, and string  buffers

+

Section: 27.7 [string.streams], 27.8 [file.streams] Status: NAD Future + Submitter: Angelika Langer Date: 1999-02-22

+

View all other issues in [string.streams].

+

View all issues with NAD Future status.

+

Discussion:

+

The following question came from Thorsten Herlemann:

+ +
+

You can set a mode when constructing or opening a file-stream or + filebuf, e.g. ios::in, ios::out, ios::binary, ... But how can I get + that mode later on, e.g. in my own operator << or operator + >> or when I want to check whether a file-stream or + file-buffer object passed as parameter is opened for input or output + or binary? Is there no possibility? Is this a design-error in the + standard C++ library?

+
+ +

It is indeed impossible to find out what a stream's or stream +buffer's open mode is, and without that knowledge you don't know +how certain operations behave. Just think of the append mode.

+ +

Both streams and stream buffers should have a mode() function that returns the +current open mode setting.

+ + +

Proposed resolution:

+

For stream buffers, add a function to the base class as a non-virtual function +qualified as const to 27.5.2 [streambuf]:

+ +

    openmode mode() const;

+ +

    Returns the current open mode.

+ +

With streams, I'm not sure what to suggest. In principle, the mode +could already be returned by ios_base, but the mode is only +initialized for file and string stream objects, unless I'm overlooking +anything. For this reason it should be added to the most derived +stream classes. Alternatively, it could be added to basic_ios +and would be default initialized in basic_ios<>::init().

+ + +

Rationale:

+

This might be an interesting extension for some future, but it is +not a defect in the current standard. The Proposed Resolution is +retained for future reference.

+ + + + + +
+

131. list::splice throws nothing

+

Section: 23.2.3.4 [list.ops] Status: NAD + Submitter: Howard Hinnant Date: 1999-03-06

+

View all other issues in [list.ops].

+

View all issues with NAD status.

+

Discussion:

+

What happens if a splice operation causes the size() of a list to grow +beyond max_size()?

+ + +

Rationale:

+

Size() cannot grow beyond max_size(). 

+ + + + + +
+

135. basic_iostream doubly initialized

+

Section: 27.6.1.5.1 [iostream.cons] Status: NAD + Submitter: Howard Hinnant Date: 1999-03-06

+

View all issues with NAD status.

+

Discussion:

+

-1- Effects Constructs an object of class basic_iostream, assigning +initial values to the base classes by calling +basic_istream<charT,traits>(sb) (lib.istream) and +basic_ostream<charT,traits>(sb) (lib.ostream)

+ +

The called for basic_istream and basic_ostream constructors call +init(sb). This means that the basic_iostream's virtual base class is +initialized twice.

+ + +

Proposed resolution:

+

Change 27.6.1.5.1, paragraph 1 to:

+ +

-1- Effects Constructs an object of class basic_iostream, assigning +initial values to the base classes by calling +basic_istream<charT,traits>(sb) (lib.istream).

+ + +

Rationale:

+

The LWG agreed that the init() function is called +twice, but said that this is harmless and so not a defect in the +standard.

+ + + + +
+

138. Class ctype_byname<char> redundant and misleading

+

Section: 22.2.1.4 [locale.codecvt] Status: NAD Future + Submitter: Angelika Langer Date: 1999-03-18

+

View all other issues in [locale.codecvt].

+

View all issues with NAD Future status.

+

Discussion:

+

Section 22.2.1.4 [locale.codecvt] specifies that +ctype_byname<char> must be a specialization of the ctype_byname +template.

+ +

It is common practice in the standard that specializations of class templates are only +mentioned where the interface of the specialization deviates from the interface of the +template that it is a specialization of. Otherwise, the fact whether or not a required +instantiation is an actual instantiation or a specialization is left open as an +implementation detail.

+ +

Clause 22.2.1.4 deviates from that practice and for that reason is misleading. The +fact, that ctype_byname<char> is specified as a specialization suggests that there +must be something "special" about it, but it has the exact same interface as the +ctype_byname template. Clause 22.2.1.4 does not have any explanatory value, is at best +redundant, at worst misleading - unless I am missing anything.

+ +

Naturally, an implementation will most likely implement ctype_byname<char> as a +specialization, because the base class ctype<char> is a specialization with an +interface different from the ctype template, but that's an implementation detail and need +not be mentioned in the standard.

+ + +

Rationale:

+

The standard as written is mildly misleading, but the correct fix +is to deal with the underlying problem in the ctype_byname base class, +not in the specialization. See issue 228.

+ + + + +
+

140. map<Key, T>::value_type does not satisfy the assignable requirement

+

Section: 23.3.1 [map] Status: NAD Future + Submitter: Mark Mitchell Date: 1999-04-14

+

View all other issues in [map].

+

View all issues with NAD Future status.

+

Discussion:

+
+

23.1 [container.requirements]
+
+ expression         return type +      pre/post-condition
+ -------------     -----------      + -------------------
+ X::value_type    T +                    + T is assignable
+
+ 23.3.1 [map]
+
+ A map satisfies all the requirements of a container.
+
+ For a map<Key, T> ... the value_type is pair<const Key, T>.

+
+ +

There's a contradiction here. In particular, `pair<const Key, +T>' is not assignable; the `const Key' cannot be assigned +to. So,  map<Key, T>::value_type does not satisfy the +assignable requirement imposed by a container.

+ +

[See issue 103 for the slightly related issue of +modification of set keys.]

+ + + +

Rationale:

+

The LWG believes that the standard is inconsistent, but that this +is a design problem rather than a strict defect. May wish to +reconsider for the next standard.

+ + + + +
+

143. C .h header wording unclear

+

Section: D.5 [depr.c.headers] Status: NAD + Submitter: Christophe de Dinechin Date: 1999-05-04

+

View all issues with NAD status.

+

Discussion:

+

[depr.c.headers] paragraph 2 reads:

+ +
+ +

Each C header, whose name has the form name.h, behaves as if each +name placed in the Standard library namespace by the corresponding +cname header is also placed within the namespace scope of the +namespace std and is followed by an explicit using-declaration +(_namespace.udecl_)

+ +
+ +

I think it should mention the global name space somewhere...  +Currently, it indicates that name placed in std is also placed in +std...

+ +

I don't know what is the correct wording. For instance, if struct +tm is defined in time.h, ctime declares std::tm. However, the current +wording seems ambiguous regarding which of the following would occur +for use of both ctime and time.h:

+ +
+
// version 1:
+namespace std {
+        struct tm { ... };
+}
+using std::tm;
+
+// version 2:
+struct tm { ... };
+namespace std {
+        using ::tm;
+}
+
+// version 3:
+struct tm { ... };
+namespace std {
+        struct tm { ... };
+}
+
+ +

I think version 1 is intended.

+ +

[Kona: The LWG agreed that the wording is not clear. It also +agreed that version 1 is intended, version 2 is not equivalent to +version 1, and version 3 is clearly not intended. The example below +was constructed by Nathan Myers to illustrate why version 2 is not +equivalent to version 1.

+ +

Although not equivalent, the LWG is unsure if (2) is enough of +a problem to be prohibited. Points discussed in favor of allowing +(2):

+ +
+
    +
  • It may be a convenience to implementors.
  • +
  • The only cases that fail are structs, of which the C library + contains only a few.
  • +
+
+ +

]

+ +

Example:

+ +
+ +
#include <time.h>
+#include <utility>
+
+int main() {
+    std::tm * t;
+    make_pair( t, t ); // okay with version 1 due to Koenig lookup
+                       // fails with version 2; make_pair not found
+    return 0;
+}
+ +
+ + +

Proposed resolution:

+ +

Replace D.5 [depr.c.headers] paragraph 2 with:

+ +
+ +

Each C header, whose name has the form name.h, behaves as if each +name placed in the Standard library namespace by the corresponding +cname header is also placed within the namespace scope of the +namespace std by name.h and is followed by an explicit +using-declaration (_namespace.udecl_) in global scope.

+ +
+ + + +

Rationale:

+

The current wording in the standard is the result of a difficult +compromise that averted delay of the standard. Based on discussions +in Tokyo it is clear that there is no still no consensus on stricter +wording, so the issue has been closed. It is suggested that users not +write code that depends on Koenig lookup of C library functions.

+ + + + +
+

145. adjustfield lacks default value

+

Section: 27.4.4.1 [basic.ios.cons] Status: NAD + Submitter: Angelika Langer Date: 1999-05-12

+

View all other issues in [basic.ios.cons].

+

View all issues with NAD status.

+

Discussion:

+

There is no initial value for the adjustfield defined, although +many people believe that the default adjustment were right. This is a +common misunderstanding. The standard only defines that, if no +adjustment is specified, all the predefined inserters must add fill +characters before the actual value, which is "as if" the +right flag were set. The flag itself need not be set.

+ +

When you implement a user-defined inserter you cannot rely on right +being the default setting for the adjustfield. Instead, you must be +prepared to find none of the flags set and must keep in mind that in +this case you should make your inserter behave "as if" the +right flag were set. This is surprising to many people and complicates +matters more than necessary.

+ +

Unless there is a good reason why the adjustfield should not be +initialized I would suggest to give it the default value that +everybody expects anyway.

+ + + +

Rationale:

+

This is not a defect. It is deliberate that the default is no bits +set. Consider Arabic or Hebrew, for example. See 22.2.2.2.2 [facet.num.put.virtuals] paragraph 19, Table 61 - Fill padding.

+ + + + +
+

149. Insert should return iterator to first element inserted

+

Section: 23.1.1 [sequence.reqmts] Status: NAD Future + Submitter: Andrew Koenig Date: 1999-06-28

+

View all other issues in [sequence.reqmts].

+

View all issues with NAD Future status.

+

Discussion:

+

Suppose that c and c1 are sequential containers and i is an +iterator that refers to an element of c. Then I can insert a copy of +c1's elements into c ahead of element i by executing

+ +
+ +
c.insert(i, c1.begin(), c1.end());
+ +
+ +

If c is a vector, it is fairly easy for me to find out where the +newly inserted elements are, even though i is now invalid:

+ +
+ +
size_t i_loc = i - c.begin();
+c.insert(i, c1.begin(), c1.end());
+ +
+ +

and now the first inserted element is at c.begin()+i_loc and one +past the last is at c.begin()+i_loc+c1.size().
+
+But what if c is a list? I can still find the location of one past the +last inserted element, because i is still valid. To find the location +of the first inserted element, though, I must execute something like

+ +
+ +
for (size_t n = c1.size(); n; --n)
+   --i;
+ +
+ +

because i is now no longer a random-access iterator.
+
+Alternatively, I might write something like

+ +
+ +
bool first = i == c.begin();
+list<T>::iterator j = i;
+if (!first) --j;
+c.insert(i, c1.begin(), c1.end());
+if (first)
+   j = c.begin();
+else
+   ++j;
+ +
+ +

which, although wretched, requires less overhead.
+
+But I think the right solution is to change the definition of insert +so that instead of returning void, it returns an iterator that refers +to the first element inserted, if any, and otherwise is a copy of its +first argument. 

+ + +

Rationale:

+

The LWG believes this was an intentional design decision and so is +not a defect. It may be worth revisiting for the next standard.

+ + + + +
+

157. Meaningless error handling for pword() and iword()

+

Section: 27.4.2.5 [ios.base.storage] Status: Dup + Submitter: Dietmar Kühl Date: 1999-07-20

+

View all other issues in [ios.base.storage].

+

View all issues with Dup status.

+

Duplicate of: 41

+

Discussion:

+

According to paragraphs 2 and 4 of 27.4.2.5 [ios.base.storage], the +functions iword() and pword() "set the +badbit (which might throw an exception)" on +failure. ... but what does it mean for ios_base to set the +badbit? The state facilities of the IOStream library are +defined in basic_ios, a derived class! It would be possible +to attempt a down cast but then it would be necessary to know the +character type used...

+ + +

Rationale:

+ + + + + +
+

162. Really "formatted input functions"?

+

Section: 27.6.1.2.3 [istream::extractors] Status: Dup + Submitter: Dietmar Kühl Date: 1999-07-20

+

View all other issues in [istream::extractors].

+

View all issues with Dup status.

+

Duplicate of: 60

+

Discussion:

+

It appears to be somewhat nonsensical to consider the functions +defined in the paragraphs 1 to 5 to be "Formatted input +function" but since these functions are defined in a section +labeled "Formatted input functions" it is unclear to me +whether these operators are considered formatted input functions which +have to conform to the "common requirements" from 27.6.1.2.1 +[istream.formatted.reqmts]: If this is the case, all manipulators, not +just +ws, would skip whitespace unless noskipws is set +(... but setting noskipws using the manipulator syntax would +also skip whitespace :-)

+ +

See also issue 166 for the same problem in formatted +output

+ + +

Rationale:

+ + + + + +
+

163. Return of gcount() after a call to gcount

+

Section: 27.6.1.3 [istream.unformatted] Status: Dup + Submitter: Dietmar Kühl Date: 1999-07-20

+

View all other issues in [istream.unformatted].

+

View all issues with Dup status.

+

Duplicate of: 60

+

Discussion:

+

It is not clear which functions are to be considered unformatted +input functions. As written, it seems that all functions in 27.6.1.3 +[istream.unformatted] are unformatted input functions. However, it does +not +really make much sense to construct a sentry object for +gcount(), sync(), ... Also it is unclear what +happens to the gcount() if eg. gcount(), +putback(), unget(), or sync() is called: +These functions don't extract characters, some of them even +"unextract" a character. Should this still be reflected in +gcount()? Of course, it could be read as if after a call to +gcount() gcount() return 0 (the last +unformatted input function, gcount(), didn't extract any +character) and after a call to putback() gcount() +returns -1 (the last unformatted input function +putback() did "extract" back into the +stream). Correspondingly for unget(). Is this what is +intended? If so, this should be clarified. Otherwise, a corresponding +clarification should be used.

+ + +

Rationale:

+ + + + + +
+

166. Really "formatted output functions"?

+

Section: 27.6.2.6.3 [ostream.inserters] Status: Dup + Submitter: Dietmar Kühl Date: 1999-07-20

+

View all issues with Dup status.

+

Duplicate of: 60

+

Discussion:

+

From 27.6.2.6.1 [ostream.formatted.reqmts] it appears that all the functions +defined in 27.6.2.6.3 [ostream.inserters] have to construct a +sentry object. Is this really intended?

+ +

This is basically the same problem as issue 162 but +for output instead of input.

+ + +

Rationale:

+ + + + + +
+

177. Complex operators cannot be explicitly instantiated

+

Section: 26.3.6 [complex.ops] Status: NAD + Submitter: Judy Ward Date: 1999-07-02

+

View all other issues in [complex.ops].

+

View all issues with NAD status.

+

Discussion:

+

A user who tries to explicitly instantiate a complex non-member operator will +get compilation errors. Below is a simplified example of the reason why. The +problem is that iterator_traits cannot be instantiated on a non-pointer type +like float, yet when the compiler is trying to decide which operator+ needs to +be instantiated it must instantiate the declaration to figure out the first +argument type of a reverse_iterator operator.

+
namespace std {
+template <class Iterator> 
+struct iterator_traits
+{
+    typedef typename Iterator::value_type value_type;
+};
+
+template <class T> class reverse_iterator;
+
+// reverse_iterator operator+
+template <class T> 
+reverse_iterator<T> operator+
+(typename iterator_traits<T>::difference_type, const reverse_iterator<T>&);
+
+template <class T> struct complex {};
+
+// complex operator +
+template <class T>
+complex<T> operator+ (const T& lhs, const complex<T>& rhs) 
+{ return complex<T>();} 
+}
+
+// request for explicit instantiation
+template std::complex<float> std::operator+<float>(const float&, 
+     const std::complex<float>&);
+

See also c++-stdlib reflector messages: lib-6814, 6815, 6816.

+ + +

Rationale:

+

Implementors can make minor changes and the example will +work. Users are not affected in any case.

According to John +Spicer, It is possible to explicitly instantiate these operators using +different syntax: change "std::operator+<float>" to +"std::operator+".

+ +

The proposed resolution of issue 120 is that users will not be able +to explicitly instantiate standard library templates. If that +resolution is accepted then library implementors will be the only ones +that will be affected by this problem, and they must use the indicated +syntax.

+ + + + +
+

178. Should clog and cerr initially be tied to cout?

+

Section: 27.3.1 [narrow.stream.objects] Status: NAD + Submitter: Judy Ward Date: 1999-07-02

+

View all other issues in [narrow.stream.objects].

+

View all issues with NAD status.

+

Discussion:

+

+Section 27.3.1 says "After the object cerr is initialized, +cerr.flags() & unitbuf is nonzero. Its state is otherwise the same as +required for ios_base::init (lib.basic.ios.cons). It doesn't say +anything about the the state of clog. So this means that calling +cerr.tie() and clog.tie() should return 0 (see Table 89 for +ios_base::init effects). +

+

+Neither of the popular standard library implementations +that I tried does this, they both tie cerr and clog +to &cout. I would think that would be what users expect. +

+ + +

Rationale:

+

The standard is clear as written.

+

27.3.1/5 says that "After the object cerr is initialized, cerr.flags() +& unitbuf is nonzero. Its state is otherwise the same as required for +ios_base::init (27.4.4.1)." Table 89 in 27.4.4.1, which gives the +postconditions of basic_ios::init(), says that tie() is 0. (Other issues correct +ios_base::init to basic_ios::init().)

+ + + + +
+

180. Container member iterator arguments constness has unintended consequences

+

Section: 23 [containers] Status: NAD Future + Submitter: Dave Abrahams Date: 1999-07-01

+

View all other issues in [containers].

+

View all issues with NAD Future status.

+

Discussion:

+

It is the constness of the container which should control whether +it can be modified through a member function such as erase(), not the +constness of the iterators. The iterators only serve to give +positioning information.

+ +

Here's a simple and typical example problem which is currently very +difficult or impossible to solve without the change proposed +below.

+ +

Wrap a standard container C in a class W which allows clients to +find and read (but not modify) a subrange of (C.begin(), C.end()]. The +only modification clients are allowed to make to elements in this +subrange is to erase them from C through the use of a member function +of W.

+ + +

Proposed resolution:

+

Change all non-const iterator parameters of standard library +container member functions to accept const_iterator parameters. +Note that this change applies to all library clauses, including +strings.

+ +

For example, in 21.3.5.5 change:
+
+       iterator erase(iterator p);
+
+to:
+       iterator erase(const_iterator p); +

+ + +

Rationale:

+

The issue was discussed at length. It was generally agreed that 1) +There is no major technical argument against the change (although +there is a minor argument that some obscure programs may break), and +2) Such a change would not break const correctness. The concerns about +making the change were 1) it is user detectable (although only in +boundary cases), 2) it changes a large number of signatures, and 3) it +seems more of a design issue that an out-and-out defect.

+ +

The LWG believes that this issue should be considered as part of a +general review of const issues for the next revision of the +standard. Also see issue 200.

+ + + + +
+

188. valarray helpers missing augmented assignment operators

+

Section: 26.5.2.6 [valarray.cassign] Status: NAD Future + Submitter: Gabriel Dos Reis Date: 1999-08-15

+

View all issues with NAD Future status.

+

Discussion:

+

26.5.2.6 defines augmented assignment operators +valarray<T>::op=(const T&), but fails to provide +corresponding versions for the helper classes. Thus making the +following illegal:

+
+
#include <valarray>
+
+int main()
+{
+std::valarray<double> v(3.14, 1999);
+
+v[99] *= 2.0; // Ok
+
+std::slice s(0, 50, 2);
+
+v[s] *= 2.0; // ERROR
+}
+
+

I can't understand the intent of that omission. It makes the +valarray library less intuitive and less useful.

+ + +

Rationale:

+

Although perhaps an unfortunate +design decision, the omission is not a defect in the current +standard.  A future standard may wish to add the missing +operators.

+ + + + +
+

190. min() and max() functions should be std::binary_functions

+

Section: 25.3.7 [alg.min.max] Status: NAD Future + Submitter: Mark Rintoul Date: 1999-08-26

+

View all other issues in [alg.min.max].

+

View all issues with NAD Future status.

+

Discussion:

+

Both std::min and std::max are defined as template functions. This +is very different than the definition of std::plus (and similar +structs) which are defined as function objects which inherit +std::binary_function.
+
+ This lack of inheritance leaves std::min and std::max somewhat useless in standard library algorithms which require +a function object that inherits std::binary_function.

+ + +

Rationale:

+

Although perhaps an unfortunate design decision, the omission is not a defect +in the current standard.  A future standard may wish to consider additional +function objects.

+ + + + +
+

191. Unclear complexity for algorithms such as binary search

+

Section: 25.3.3 [alg.binary.search] Status: NAD + Submitter: Nico Josuttis Date: 1999-10-10

+

View all other issues in [alg.binary.search].

+

View all issues with NAD status.

+

Discussion:

+

The complexity of binary_search() is stated as "At most +log(last-first) + 2 comparisons", which seems to say that the +algorithm has logarithmic complexity. However, this algorithms is +defined for forward iterators. And for forward iterators, the need to +step element-by-element results into linear complexity. But such a +statement is missing in the standard. The same applies to +lower_bound(), upper_bound(), and equal_range(). 
+
+However, strictly speaking the standard contains no bug here. So this +might considered to be a clarification or improvement. +

+ + +

Rationale:

+

The complexity is expressed in terms of comparisons, and that +complexity can be met even if the number of iterators accessed is +linear. Paragraph 1 already says exactly what happens to +iterators.

+ + + + +
+

192. a.insert(p,t) is inefficient and overconstrained

+

Section: 23.1.2 [associative.reqmts] Status: NAD + Submitter: Ed Brey Date: 1999-06-06

+

View all other issues in [associative.reqmts].

+

View all issues with NAD status.

+

Duplicate of: 233

+

Discussion:

+

As defined in 23.1.2, paragraph 7 (table 69), a.insert(p,t) suffers from +several problems:

+ + + + + + + + + + + + + +
expressionreturn typepre/post-conditioncomplexity
a.insert(p,t)iteratorinserts t if and only if there is no element with key equivalent to the key of + t in containers with unique keys; always inserts t in containers with equivalent + keys. always returns the iterator pointing to the element with key equivalent to + the key of t . iterator p is a hint pointing to where the insert should start to search.logarithmic in general, but amortized constant if t is inserted right after p .
+

1. For a container with unique keys, only logarithmic complexity is +guaranteed if no element is inserted, even though constant complexity is always +possible if p points to an element equivalent to t.

+

2. For a container with equivalent keys, the amortized constant complexity +guarantee is only useful if no key equivalent to t exists in the container. +Otherwise, the insertion could occur in one of multiple locations, at least one +of which would not be right after p.

+

3. By guaranteeing amortized constant complexity only when t is inserted +after p, it is impossible to guarantee constant complexity if t is inserted at +the beginning of the container. Such a problem would not exist if amortized +constant complexity was guaranteed if t is inserted before p, since there is +always some p immediately before which an insert can take place.

+

4. For a container with equivalent keys, p does not allow specification of +where to insert the element, but rather only acts as a hint for improving +performance. This negates the added functionality that p would provide if it +specified where within a sequence of equivalent keys the insertion should occur. +Specifying the insert location provides more control to the user, while +providing no disadvantage to the container implementation.

+ + +

Proposed resolution:

+

In 23.1.2 [associative.reqmts] paragraph 7, replace the row in table 69 +for a.insert(p,t) with the following two rows:

+ + + + + + + + + + + + + + + + + + + +
expressionreturn typepre/post-conditioncomplexity
a_uniq.insert(p,t)iteratorinserts t if and only if there is no element with key equivalent to the + key of t. returns the iterator pointing to the element with key equivalent + to the key of t.logarithmic in general, but amortized constant if t is inserted right + before p or p points to an element with key equivalent to t.
a_eq.insert(p,t)iteratorinserts t and returns the iterator pointing to the newly inserted + element. t is inserted right before p if doing so preserves the container + ordering.logarithmic in general, but amortized constant if t is inserted right + before p.
+ + + +

Rationale:

+

Too big a change.  Furthermore, implementors report checking +both before p and after p, and don't want to change this behavior.

+ + + + + +
+

194. rdbuf() functions poorly specified

+

Section: 27.4.4 [ios] Status: NAD + Submitter: Steve Clamage Date: 1999-09-07

+

View all issues with NAD status.

+

Discussion:

+

In classic iostreams, base class ios had an rdbuf function that returned a +pointer to the associated streambuf. Each derived class had its own rdbuf +function that returned a pointer of a type reflecting the actual type derived +from streambuf. Because in ARM C++, virtual function overrides had to have the +same return type, rdbuf could not be virtual.

+

In standard iostreams, we retain the non-virtual rdbuf function design, and +in addition have an overloaded rdbuf function that sets the buffer pointer. +There is no need for the second function to be virtual nor to be implemented in +derived classes.

+

Minor question: Was there a specific reason not to make the original rdbuf +function virtual?

+

Major problem: Friendly compilers warn about functions in derived classes +that hide base-class overloads. Any standard implementation of iostreams will +result in such a warning on each of the iostream classes, because of the +ill-considered decision to overload rdbuf only in a base class.

+

In addition, users of the second rdbuf function must use explicit +qualification or a cast to call it from derived classes. An explicit +qualification or cast to basic_ios would prevent access to any later overriding +version if there was one.

+

What I'd like to do in an implementation is add a using- declaration for the +second rdbuf function in each derived class. It would eliminate warnings about +hiding functions, and would enable access without using explicit qualification. +Such a change I don't think would change the behavior of any valid program, but +would allow invalid programs to compile:

+
+
 filebuf mybuf;
+ fstream f;
+ f.rdbuf(mybuf); // should be an error, no visible rdbuf
+
+

I'd like to suggest this problem as a defect, with the proposed resolution to +require the equivalent of a using-declaration for the rdbuf function that is not +replaced in a later derived class. We could discuss whether replacing the +function should be allowed.

+ + +

Rationale:

+

For historical reasons, the standard is correct as written. There is a subtle difference between the base +class rdbuf() and derived class rdbuf(). The derived +class rdbuf() always returns the original streambuf, whereas the base class + rdbuf() will return the "current streambuf" if that has been changed by the variant you mention.

+ +

Permission is not required to add such an extension. See +17.4.4.4 [member.functions].

+ + + + +
+

196. Placement new example has alignment problems

+

Section: 18.5.1.3 [new.delete.placement] Status: Dup + Submitter: Herb Sutter Date: 1998-12-15

+

View all other issues in [new.delete.placement].

+

View all issues with Dup status.

+

Duplicate of: 114

+

Discussion:

+

The example in 18.5.1.3 [new.delete.placement] paragraph 4 reads:

+ +
+ +

[Example: This can be useful for constructing an object at a known address:
+
+   char place[sizeof(Something)];
+   Something* p = new (place) Something();
+
+
end example]

+ +
+ +

This example has potential alignment problems.

+ + +

Rationale:

+ + + + + +
+

197. max_size() underspecified

+

Section: 20.1.2 [allocator.requirements], 23.1 [container.requirements] Status: NAD + Submitter: Andy Sawyer Date: 1999-10-21

+

View other active issues in [allocator.requirements].

+

View all other issues in [allocator.requirements].

+

View all issues with NAD status.

+

Discussion:

+

Must the value returned by max_size() be unchanged from call to call?

+ +

Must the value returned from max_size() be meaningful?

+ +

Possible meanings identified in lib-6827:

+ +

1) The largest container the implementation can support given "best +case" conditions - i.e. assume the run-time platform is "configured to +the max", and no overhead from the program itself. This may possibly +be determined at the point the library is written, but certainly no +later than compile time.
+
+2) The largest container the program could create, given "best case" +conditions - i.e. same platform assumptions as (1), but take into +account any overhead for executing the program itself. (or, roughly +"storage=storage-sizeof(program)"). This does NOT include any resource +allocated by the program. This may (or may not) be determinable at +compile time.
+
+3) The largest container the current execution of the program could +create, given knowledge of the actual run-time platform, but again, +not taking into account any currently allocated resource. This is +probably best determined at program start-up.
+
+4) The largest container the current execution program could create at +the point max_size() is called (or more correctly at the point +max_size() returns :-), given it's current environment (i.e. taking +into account the actual currently available resources). This, +obviously, has to be determined dynamically each time max_size() is +called.

+ + +

Proposed resolution:

+ + +

Rationale:

+

max_size() isn't useful for very many things, and the existing + wording is sufficiently clear for the few cases that max_size() can + be used for. None of the attempts to change the existing wording + were an improvement.

+ +

It is clear to the LWG that the value returned by max_size() can't + change from call to call.

+ + + + + + +
+

203. basic_istream::sentry::sentry() is uninstantiable with ctype<user-defined type>

+

Section: 27.6.1.1.3 [istream::sentry] Status: NAD + Submitter: Matt McClure and Dietmar Kühl Date: 2000-01-01

+

View all other issues in [istream::sentry].

+

View all issues with NAD status.

+

Discussion:

+

27.6.1.1.2 Paragraph 4 states:

+
+

To decide if the character c is a whitespace character, the constructor + performs ''as if'' it executes the following code fragment: 

+
const ctype<charT>& ctype = use_facet<ctype<charT> >(is.getloc());
+if (ctype.is(ctype.space,c)!=0)
+// c is a whitespace character.
+
+ +

But Table 51 in 22.1.1.1.1 only requires an implementation to +provide specializations for ctype<char> and +ctype<wchar_t>. If sentry's constructor is implemented using +ctype, it will be uninstantiable for a user-defined character type +charT, unless the implementation has provided non-working (since it +would be impossible to define a correct ctype<charT> specialization +for an arbitrary charT) definitions of ctype's virtual member +functions.

+ +

+It seems the intent the standard is that sentry should behave, in +every respect, not just during execution, as if it were implemented +using ctype, with the burden of providing a ctype specialization +falling on the user. But as it is written, nothing requires the +translation of sentry's constructor to behave as if it used the above +code, and it would seem therefore, that sentry's constructor should be +instantiable for all character types. +

+ +

+Note: If I have misinterpreted the intent of the standard with +respect to sentry's constructor's instantiability, then a note should +be added to the following effect: +

+ +

+An implementation is forbidden from using the above code if it renders +the constructor uninstantiable for an otherwise valid character +type. +

+ +

In any event, some clarification is needed.

+ + + +

Rationale:

+

It is possible but not easy to instantiate on types other than char +or wchar_t; many things have to be done first. That is by intention +and is not a defect.

+ + + + +
+

204. distance(first, last) when "last" is before "first"

+

Section: 24.3.4 [iterator.operations] Status: NAD + Submitter: Rintala Matti Date: 2000-01-28

+

View all issues with NAD status.

+

Discussion:

+

Section 24.3.4 describes the function distance(first, last) (where first and +last are iterators) which calculates "the number of increments or +decrements needed to get from 'first' to 'last'".

+

The function should work for forward, bidirectional and random access +iterators, and there is a requirement 24.3.4.5 which states that "'last' +must be reachable from 'first'".

+

With random access iterators the function is easy to implement as "last +- first".

+

With forward iterators it's clear that 'first' must point to a place before +'last', because otherwise 'last' would not be reachable from 'first'.

+

But what about bidirectional iterators? There 'last' is reachable from +'first' with the -- operator even if 'last' points to an earlier position than +'first'. However, I cannot see how the distance() function could be implemented +if the implementation does not know which of the iterators points to an earlier +position (you cannot use ++ or -- on either iterator if you don't know which +direction is the "safe way to travel").

+

The paragraph 24.3.4.1 states that "for ... bidirectional iterators they +use ++ to provide linear time implementations". However, the ++ operator is +not mentioned in the reachability requirement. Furthermore 24.3.4.4 explicitly +mentions that distance() returns the number of increments _or decrements_, +suggesting that it could return a negative number also for bidirectional +iterators when 'last' points to a position before 'first'.

+

Is a further requirement is needed to state that for forward and +bidirectional iterators "'last' must be reachable from 'first' using the ++ +operator". Maybe this requirement might also apply to random access +iterators so that distance() would work the same way for every iterator +category?

+ + +

Rationale:

+

"Reachable" is defined in the standard in 24.1 [iterator.requirements] paragraph 6. +The definition is only in terms of operator++(). The LWG sees no defect in +the standard.

+ + + + +
+

205. numeric_limits unclear on how to determine floating point types

+

Section: 18.2.1.2 [numeric.limits.members] Status: NAD + Submitter: Steve Cleary Date: 2000-01-28

+

View all other issues in [numeric.limits.members].

+

View all issues with NAD status.

+

Discussion:

+

In several places in 18.2.1.2 [numeric.limits.members], a member is +described as "Meaningful for all floating point types." +However, no clear method of determining a floating point type is +provided.

+ +

In 18.2.1.5 [numeric.special], paragraph 1 states ". . . (for +example, epsilon() is only meaningful if is_integer is +false). . ." which suggests that a type is a floating point type +if is_specialized is true and is_integer is false; however, this is +unclear.

+ +

When clarifying this, please keep in mind this need of users: what +exactly is the definition of floating point? Would a fixed point or +rational representation be considered one? I guess my statement here +is that there could also be types that are neither integer or +(strictly) floating point.

+ + +

Rationale:

+

It is up to the implementor of a user define type to decide if it is a +floating point type.

+ + + + +
+

207. ctype<char> members return clause incomplete

+

Section: 22.2.1.3.2 [facet.ctype.char.members] Status: Dup + Submitter: Robert Klarer Date: 1999-11-02

+

View all other issues in [facet.ctype.char.members].

+

View all issues with Dup status.

+

Duplicate of: 153

+

Discussion:

+

+The widen and narrow member functions are described +in 22.2.1.3.2, paragraphs 9-11. In each case we have two overloaded +signatures followed by a Returns clause. The Returns +clause only describes one of the overloads. +

+ + +

Proposed resolution:

+

Change the returns clause in 22.2.1.3.2 [facet.ctype.char.members] +paragraph 10 from:

+

    Returns: do_widen(low, high, to).

+ +

to:

+

    Returns: do_widen(c) or do_widen(low, high, to), +respectively.

+ +

Change the returns clause in 22.2.1.3.2 [facet.ctype.char.members] paragraph 11 +from:

+

    Returns: do_narrow(low, high, to).

+ +

to:

+

    Returns: do_narrow(c) or do_narrow(low, high, to), +respectively.

+ + +

Rationale:

+

Subsumed by issue 153, which addresses the same +paragraphs.

+ + + + + + +
+

213. Math function overloads ambiguous

+

Section: 26.7 [c.math] Status: NAD + Submitter: Nico Josuttis Date: 2000-02-26

+

View other active issues in [c.math].

+

View all other issues in [c.math].

+

View all issues with NAD status.

+

Discussion:

+

Due to the additional overloaded versions of numeric functions for +float and long double according to Section 26.5, calls such as int x; +std::pow (x, 4) are ambiguous now in a standard conforming +implementation. Current implementations solve this problem very +different (overload for all types, don't overload for float and long +double, use preprocessor, follow the standard and get +ambiguities).

This behavior should be standardized or at least +identified as implementation defined.

+ + +

Rationale:

+

These math issues are an +understood and accepted consequence of the design. They have +been discussed several times in the past. Users must write casts +or write floating point expressions as arguments.

+ + + + +
+

215. Can a map's key_type be const?

+

Section: 23.1.2 [associative.reqmts] Status: NAD + Submitter: Judy Ward Date: 2000-02-29

+

View all other issues in [associative.reqmts].

+

View all issues with NAD status.

+

Discussion:

+

A user noticed that this doesn't compile with the Rogue Wave library because +the rb_tree class declares a key_allocator, and allocator<const int> is +not legal, I think:

+
+
map < const int, ... > // legal?
+
+

which made me wonder whether it is legal for a map's key_type to be const. In +email from Matt Austern he said:

+
+

I'm not sure whether it's legal to declare a map with a const key type. I +hadn't thought about that question until a couple weeks ago. My intuitive +feeling is that it ought not to be allowed, and that the standard ought to say +so. It does turn out to work in SGI's library, though, and someone in the +compiler group even used it. Perhaps this deserves to be written up as an issue +too.

+
+ + +

Rationale:

+

The "key is assignable" requirement from table 69 in +23.1.2 [associative.reqmts] already implies the key cannot be const.

+ + + + +
+

216. setbase manipulator description flawed

+

Section: 27.6.3 [std.manip] Status: Dup + Submitter: Hyman Rosen Date: 2000-02-29

+

View all other issues in [std.manip].

+

View all issues with Dup status.

+

Duplicate of: 193

+

Discussion:

+

27.6.3 [std.manip] paragraph 5 says:

+
+
smanip setbase(int base);
+

Returns: An object s of unspecified type such that if out is an +(instance of) basic_ostream then the expression out<<s behaves +as if f(s) were called, in is an (instance of) basic_istream then the +expression in>>s behaves as if f(s) were called. Where f can be +defined as:

+
ios_base& f(ios_base& str, int base)
+{
+  // set basefield
+  str.setf(n == 8 ? ios_base::oct :
+                n == 10 ? ios_base::dec :
+                n == 16 ? ios_base::hex :
+                  ios_base::fmtflags(0), ios_base::basefield);
+  return str;
+}
+
+

There are two problems here. First, f takes two parameters, so the +description needs to say that out<<s and in>>s behave as if f(s,base) +had been called. Second, f is has a parameter named base, but is written as if +the parameter was named n.

+

Actually, there's a third problem. The paragraph has grammatical errors. +There needs to be an "and" after the first comma, and the "Where +f" sentence fragment needs to be merged into its preceding sentence. You +may also want to format the function a little better. The formatting above is +more-or-less what the Standard contains.

+ + +

Rationale:

+

The resolution of this defect is subsumed by the proposed resolution for +issue 193.

+ +

[Tokyo: The LWG agrees that this is a defect and notes that it +occurs additional places in the section, all requiring fixes.]

+ + + + + + + + +
+

218. Algorithms do not use binary predicate objects for default comparisons

+

Section: 25.3 [alg.sorting] Status: NAD + Submitter: Pablo Halpern Date: 2000-03-06

+

View all other issues in [alg.sorting].

+

View all issues with NAD status.

+

Discussion:

+

Many of the algorithms take an argument, pred, of template parameter type +BinaryPredicate or an argument comp of template parameter type Compare. These +algorithms usually have an overloaded version that does not take the predicate +argument. In these cases pred is usually replaced by the use of operator== and +comp is replaced by the use of operator<.

+

This use of hard-coded operators is inconsistent with other parts of the +library, particularly the containers library, where equality is established +using equal_to<> and ordering is established using less<>. Worse, +the use of operator<, would cause the following innocent-looking code to have +undefined behavior:

+
+
vector<string*> vec;
+sort(vec.begin(), vec.end());
+
+

The use of operator< is not defined for pointers to unrelated objects. If +std::sort used less<> to compare elements, then the above code would be +well-defined, since less<> is explicitly specialized to produce a total +ordering of pointers.

+ + +

Rationale:

+

This use of operator== and operator< was a very deliberate, conscious, and +explicitly made design decision; these operators are often more efficient. The +predicate forms are available for users who don't want to rely on operator== and +operator<.

+ + + + +
+

219. find algorithm missing version that takes a binary predicate argument

+

Section: 25.1.2 [alg.find] Status: NAD Future + Submitter: Pablo Halpern Date: 2000-03-06

+

View all other issues in [alg.find].

+

View all issues with NAD Future status.

+

Discussion:

+

The find function always searches for a value using operator== to compare the +value argument to each element in the input iterator range. This is inconsistent +with other find-related functions such as find_end and find_first_of, which +allow the caller to specify a binary predicate object to be used for determining +equality. The fact that this can be accomplished using a combination of find_if +and bind_1st or bind_2nd does not negate the desirability of a consistent, +simple, alternative interface to find.

+ + +

Proposed resolution:

+
+

In section 25.1.2 [alg.find], add a second prototype for find +(between the existing prototype and the prototype for find_if), as +follows:

+
    template<class InputIterator, class T, class BinaryPredicate>
+      InputIterator find(InputIterator first, InputIterator last,
+                         const T& value, BinaryPredicate bin_pred);
+

Change the description of the return from:

+
+

Returns: The first iterator i in the range [first, last) for which the following corresponding + conditions hold: *i == value, pred(*i) != false. Returns last if no such iterator is found.

+
+

 to:

+
+

Returns: The first iterator i in the range [first, last) for which the following  + corresponding condition holds: *i == value, bin_pred(*i,value) != false, pred(*) + != false. Return last if no such iterator is found.

+
+
+ + +

Rationale:

+

This is request for a pure extension, so it is not a defect in the +current standard.  As the submitter pointed out, "this can +be accomplished using a combination of find_if and bind_1st or +bind_2nd".

+ + + + +
+

236. ctype<char>::is() member modifies facet

+

Section: 22.2.1.3.2 [facet.ctype.char.members] Status: Dup + Submitter: Dietmar Kühl Date: 2000-04-24

+

View all other issues in [facet.ctype.char.members].

+

View all issues with Dup status.

+

Duplicate of: 28

+

Discussion:

+

The description of the is() member in paragraph 4 of 22.2.1.3.2 [facet.ctype.char.members] is broken: According to this description, the +second form of the is() method modifies the masks in the +ctype object. The correct semantics if, of course, to obtain +an array of masks. The corresponding method in the general case, +ie. the do_is() method as described in 22.2.1.1.2 [locale.ctype.virtuals] paragraph 1 does the right thing.

+ + +

Proposed resolution:

+

Change paragraph 4 from

+

+ The second form, for all *p in the range [low, high), assigns + vec[p-low] to table()[(unsigned char)*p]. +

+

to become

+

+ The second form, for all *p in the range [low, high), assigns + table()[(unsigned char)*p] to vec[p-low]. +

+ + +

Rationale:

+ + + + + +
+

244. Must find's third argument be CopyConstructible?

+

Section: 25.1.2 [alg.find] Status: NAD + Submitter: Andrew Koenig Date: 2000-05-02

+

View all other issues in [alg.find].

+

View all issues with NAD status.

+

Discussion:

+

Is the following implementation of find acceptable?

+ +
        template<class Iter, class X>
+        Iter find(Iter begin, Iter end, const X& x)
+        {
+            X x1 = x;           // this is the crucial statement
+            while (begin != end && *begin != x1)
+                ++begin;
+            return begin;
+        }
+
+ +

If the answer is yes, then it is implementation-dependent as to +whether the following fragment is well formed:

+ +
        vector<string> v;
+
+        find(v.begin(), v.end(), "foo");
+
+ +

At issue is whether there is a requirement that the third argument +of find be CopyConstructible. There may be no problem here, but +analysis is necessary.

+ + +

Rationale:

+

There is no indication in the standard that find's third argument +is required to be Copy Constructible. The LWG believes that no such +requirement was intended. As noted above, there are times when a user +might reasonably pass an argument that is not Copy Constructible.

+ + + + +
+

245. Which operations on istream_iterator trigger input operations?

+

Section: 24.5.1 [istream.iterator] Status: NAD + Submitter: Andrew Koenig Date: 2000-05-02

+

View all issues with NAD status.

+

Discussion:

+

I do not think the standard specifies what operation(s) on istream +iterators trigger input operations. So, for example:

+ +
        istream_iterator<int> i(cin);
+
+        int n = *i++;
+
+ +

I do not think it is specified how many integers have been read +from cin. The number must be at least 1, of course, but can it be 2? +More?

+ + +

Rationale:

+

The standard is clear as written: the stream is read every time +operator++ is called, and it is also read either when the iterator is +constructed or when operator* is called for the first time. In the +example above, exactly two integers are read from cin.

+ +

There may be a problem with the interaction between istream_iterator +and some STL algorithms, such as find. There are no guarantees about +how many times find may invoke operator++.

+ + + + +
+

246. a.insert(p,t) is incorrectly specified

+

Section: 23.1.2 [associative.reqmts] Status: Dup + Submitter: Mark Rodgers Date: 2000-05-19

+

View all other issues in [associative.reqmts].

+

View all issues with Dup status.

+

Duplicate of: 233

+

Discussion:

+

Closed issue 192 raised several problems with the specification of +this function, but was rejected as Not A Defect because it was too big +a change with unacceptable impacts on existing implementations. +However, issues remain that could be addressed with a smaller change +and with little or no consequent impact.

+ +
    +
  1. The specification is inconsistent with the original + proposal and with several implementations.

    + +

    The initial implementation by Hewlett Packard only ever looked + immediately before p, and I do not believe there was any + intention to standardize anything other than this behavior. + Consequently, current implementations by several leading + implementors also look immediately before p, and will only insert + after p in logarithmic time. I am only aware of one implementation + that does actually look after p, and it looks before p as well. It + is therefore doubtful that existing code would be relying on the + behavior defined in the standard, and it would seem that fixing + this defect as proposed below would standardize existing + practice.

  2. + +
  3. + The specification is inconsistent with insertion for sequence + containers.

    + +

    This is difficult and confusing to teach to newcomers. All + insert operations that specify an iterator as an insertion location + should have a consistent meaning for the location represented by + that iterator.

  4. + +
  5. As specified, there is no way to hint that the insertion + should occur at the beginning of the container, and the way to hint + that it should occur at the end is long winded and unnatural.

    + +

    For a container containing n elements, there are n+1 possible + insertion locations and n+1 valid iterators. For there to be a + one-to-one mapping between iterators and insertion locations, the + iterator must represent an insertion location immediately before + the iterator.

  6. + +
  7. When appending sorted ranges using insert_iterators, + insertions are guaranteed to be sub-optimal.

    + +

    In such a situation, the optimum location for insertion is + always immediately after the element previously inserted. The + mechanics of the insert iterator guarantee that it will try and + insert after the element after that, which will never be correct. + However, if the container first tried to insert before the hint, + all insertions would be performed in amortized constant + time.

  8. +
+ + +

Proposed resolution:

+

In 23.1.2 [lib.associative.reqmts] paragraph 7, table 69, make +the following changes in the row for a.insert(p,t):

+ +

assertion/note pre/post condition: +
Change the last sentence from

+

+ "iterator p is a hint pointing to where the insert should + start to search." +

+

to

+

+ "iterator p is a hint indicating that immediately before p + may be a correct location where the insertion could occur." +

+ +

complexity:
+Change the words "right after" to "immediately before".

+ + +

Rationale:

+ + + + + +
+

249. Return Type of auto_ptr::operator=

+

Section: D.9.1 [auto.ptr] Status: NAD + Submitter: Joseph Gottman Date: 2000-06-30

+

View all other issues in [auto.ptr].

+

View all issues with NAD status.

+

Discussion:

+

According to section 20.4.5, the function +auto_ptr::operator=() returns a reference to an auto_ptr. +The reason that operator=() usually returns a reference is to +facilitate code like

+ +
    int x,y,z;
+    x = y = z = 1;
+
+ +

However, given analogous code for auto_ptrs,

+
    auto_ptr<int> x, y, z;
+    z.reset(new int(1));
+    x = y = z;
+
+ +

the result would be that z and y would both be set to +NULL, instead of all the auto_ptrs being set to the same value. +This makes such cascading assignments useless and counterintuitive for +auto_ptrs.

+ + +

Proposed resolution:

+

Change auto_ptr::operator=() to return void instead +of an auto_ptr reference.

+ + +

Rationale:

+

The return value has uses other than cascaded assignments: a user can +call an auto_ptr member function, pass the auto_ptr to a +function, etc. Removing the return value could break working user +code.

+ + + + +
+

257. STL functional object and iterator inheritance.

+

Section: 20.5.3 [base], 24.3.2 [iterator.basic] Status: NAD + Submitter: Robert Dick Date: 2000-08-17

+

View all other issues in [base].

+

View all issues with NAD status.

+

Discussion:

+

+According to the November 1997 Draft Standard, the results of deleting an +object of a derived class through a pointer to an object of its base class are +undefined if the base class has a non-virtual destructor. Therefore, it is +potentially dangerous to publicly inherit from such base classes. +

+ +

Defect: +
+The STL design encourages users to publicly inherit from a number of classes +which do nothing but specify interfaces, and which contain non-virtual +destructors. +

+ +

Attribution: +
+Wil Evers and William E. Kempf suggested this modification for functional +objects. +

+ + +

Proposed resolution:

+

+When a base class in the standard library is useful only as an interface +specifier, i.e., when an object of the class will never be directly +instantiated, specify that the class contains a protected destructor. This +will prevent deletion through a pointer to the base class without performance, +or space penalties (on any implementation I'm aware of). +

+ +

+As an example, replace... +

+ +
    template <class Arg, class Result>
+    struct unary_function {
+            typedef Arg    argument_type;
+            typedef Result result_type;
+    };
+
+ +

+... with... +

+ +
    template <class Arg, class Result>
+    struct unary_function {
+            typedef Arg    argument_type;
+            typedef Result result_type;
+    protected:
+            ~unary_function() {}
+    };
+
+ +

+Affected definitions: +
+  20.3.1 [lib.function.objects] -- unary_function, binary_function +
+  24.3.2 [lib.iterator.basic] -- iterator +

+ + +

Rationale:

+

+The standard is clear as written; this is a request for change, not a +defect in the strict sense. The LWG had several different objections +to the proposed change. One is that it would prevent users from +creating objects of type unary_function and +binary_function. Doing so can sometimes be legitimate, if users +want to pass temporaries as traits or tag types in generic code. +

+ + + + + +
+

267. interaction of strstreambuf::overflow() and seekoff()

+

Section: D.7.1.3 [depr.strstreambuf.virtuals] Status: NAD + Submitter: Martin Sebor Date: 2000-10-05

+

View all other issues in [depr.strstreambuf.virtuals].

+

View all issues with NAD status.

+

Discussion:

+

+It appears that the interaction of the strstreambuf members overflow() +and seekoff() can lead to undefined behavior in cases where defined +behavior could reasonably be expected. The following program +demonstrates this behavior: +

+ +
    #include <strstream>
+
+    int main ()
+    {
+         std::strstreambuf sb;
+         sb.sputc ('c');
+
+         sb.pubseekoff (-1, std::ios::end, std::ios::in);
+         return !('c' == sb.sgetc ());
+    }
+
+ +

+D.7.1.1, p1 initializes strstreambuf with a call to basic_streambuf<>(), +which in turn sets all pointers to 0 in 27.5.2.1, p1. +

+ +

+27.5.2.2.5, p1 says that basic_streambuf<>::sputc(c) calls +overflow(traits::to_int_type(c)) if a write position isn't available (it +isn't due to the above). +

+ +

+D.7.1.3, p3 says that strstreambuf::overflow(off, ..., ios::in) makes at +least one write position available (i.e., it allows the function to make +any positive number of write positions available). +

+ +

+D.7.1.3, p13 computes newoff = seekhigh - eback(). In D.7.1, p4 we see +seekhigh = epptr() ? epptr() : egptr(), or seekhigh = epptr() in this +case. newoff is then epptr() - eback(). +

+ +

+D.7.1.4, p14 sets gptr() so that gptr() == eback() + newoff + off, or +gptr() == epptr() + off holds. +

+ +

+If strstreambuf::overflow() made exactly one write position available +then gptr() will be set to just before epptr(), and the program will +return 0. Buf if the function made more than one write position +available, epptr() and gptr() will both point past pptr() and the +behavior of the program is undefined. +

+ + +

Proposed resolution:

+ + +

Change the last sentence of D.7.1 [depr.strstreambuf] paragraph 4 from

+ +

+ Otherwise, seeklow equals gbeg and seekhigh is either pend, if + pend is not a null pointer, or gend. +

+ +

to become

+ +

+ Otherwise, seeklow equals gbeg and seekhigh is either gend if + 0 == pptr(), or pbase() + max where max is the maximum value of + pptr() - pbase() ever reached for this stream. +

+ +

[ + pre-Copenhagen: Dietmar provided wording for proposed resolution. +]

+ + +

[ + post-Copenhagen: Fixed a typo: proposed resolution said to fix + 4.7.1, not D.7.1. +]

+ + + + +

Rationale:

+

This is related to issue 65: it's not clear what it +means to seek beyond the current area. Without resolving issue 65 we can't resolve this. As with issue 65, +the library working group does not wish to invest time nailing down +corner cases in a deprecated feature.

+ + + + + +
+

269. cstdarg and unnamed parameters

+

Section: 18.7 [support.exception] Status: NAD + Submitter: J. Stephen Adamczyk Date: 2000-10-10

+

View all other issues in [support.exception].

+

View all issues with NAD status.

+

Discussion:

+

+One of our customers asks whether this is valid C++: +

+ +
   #include <cstdarg>
+
+   void bar(const char *, va_list);
+
+   void
+   foo(const char *file, const char *, ...)
+   {
+     va_list ap;
+     va_start(ap, file);
+     bar(file, ap);
+     va_end(ap);
+   }
+
+ +

+The issue being whether it is valid to use cstdarg when the final +parameter before the "..." is unnamed. cstdarg is, as far +as I can tell, inherited verbatim from the C standard. and the +definition there (7.8.1.1 in the ISO C89 standard) refers to "the +identifier of the rightmost parameter". What happens when there +is no such identifier? +

+ +

+My personal opinion is that this should be allowed, but some tweak +might be required in the C++ standard. +

+ + +

Rationale:

+

+Not a defect, the C and C++ standards are clear. It is impossible to +use varargs if the parameter immediately before "..." has no +name, because that is the parameter that must be passed to va_start. +The example given above is broken, because va_start is being passed +the wrong parameter. +

+ +

+There is no support for extending varargs to provide additional +functionality beyond what's currently there. For reasons of C/C++ +compatibility, it is especially important not to make gratuitous +changes in this part of the C++ standard. The C committee has already +been requested not to touch this part of the C standard unless +necessary. +

+ + + + +
+

277. Normative encouragement in allocator requirements unclear

+

Section: 20.1.2 [allocator.requirements] Status: NAD + Submitter: Matt Austern Date: 2000-11-07

+

View other active issues in [allocator.requirements].

+

View all other issues in [allocator.requirements].

+

View all issues with NAD status.

+

Discussion:

+

+In 20.1.5, paragraph 5, the standard says that "Implementors are +encouraged to supply libraries that can accept allocators that +encapsulate more general memory models and that support non-equal +instances." This is intended as normative encouragement to +standard library implementors. However, it is possible to interpret +this sentence as applying to nonstandard third-party libraries. +

+ + +

Proposed resolution:

+

+In 20.1.5, paragraph 5, change "Implementors" to +"Implementors of the library described in this International +Standard". +

+ + +

Rationale:

+

The LWG believes the normative encouragement is already +sufficiently clear, and that there are no important consequences +even if it is misunderstood.

+ + + + + +
+

279. const and non-const iterators should have equivalent typedefs

+

Section: 23.1 [container.requirements] Status: NAD + Submitter: Steve Cleary Date: 2000-11-27

+

View other active issues in [container.requirements].

+

View all other issues in [container.requirements].

+

View all issues with NAD status.

+

Discussion:

+ +

+This came from an email from Steve Cleary to Fergus in reference to +issue 179. The library working group briefly discussed +this in Toronto and believes it should be a separate issue. +

+ +

+Steve said: "We may want to state that the const/non-const iterators must have +the same difference type, size_type, and category." +

+ +

+(Comment from Judy) +I'm not sure if the above sentence should be true for all +const and non-const iterators in a particular container, or if it means +the container's iterator can't be compared with the container's +const_iterator unless the above it true. I suspect the former. +

+ + +

Proposed resolution:

+

+In Section: 23.1 [container.requirements], +table 65, in the assertion/note pre/post condition for X::const_iterator, +add the following: +

+ +
+

+typeid(X::const_iterator::difference_type) == typeid(X::iterator::difference_type) +

+ +

+typeid(X::const_iterator::size_type) == typeid(X::iterator::size_type) +

+ +

+typeid(X::const_iterator::category) == typeid(X::iterator::category) +

+
+ + +

Rationale:

+

Going through the types one by one: Iterators don't have a +size_type. We already know that the difference types are +identical, because the container requirements already say that the +difference types of both X::iterator and X::const_iterator are both +X::difference_type. The standard does not require that X::iterator +and X::const_iterator have the same iterator category, but the LWG +does not see this as a defect: it's possible to imagine cases in which +it would be useful for the categories to be different.

+ +

It may be desirable to require X::iterator and X::const_iterator to +have the same value type, but that is a new issue. (Issue 322.)

+ + + + + + +
+

287. conflicting ios_base fmtflags

+

Section: 27.4.2.2 [fmtflags.state] Status: NAD + Submitter: Judy Ward Date: 2000-12-30

+

View all other issues in [fmtflags.state].

+

View all issues with NAD status.

+

Discussion:

+

+The Effects clause for ios_base::setf(fmtflags fmtfl) says +"Sets fmtfl in flags()". What happens if the user first calls +ios_base::scientific and then calls ios_base::fixed or vice-versa? +This is an issue for all of the conflicting flags, i.e. ios_base::left +and ios_base::right or ios_base::dec, ios_base::hex and ios_base::oct. +

+ +

+I see three possible solutions: +

+ +
    +
  1. Set ios_base::failbit whenever the user specifies a conflicting +flag with one previously explicitly set. If the constructor is +supposed to set ios_base::dec (see discussion below), then +the user setting hex or oct format after construction will not +set failbit.
  2. +
  3. The last call to setf "wins", i.e. it clears any conflicting +previous setting.
  4. +
  5. All the flags that the user specifies are set, but when actually +interpreting them, fixed always override scientific, right always +overrides left, dec overrides hex which overrides oct.
  6. +
+ +

+Most existing implementations that I tried seem to conform to resolution #3, +except that when using the iomanip manipulator hex or oct then that always +overrides dec, but calling setf(ios_base::hex) doesn't. +

+ +

+There is a sort of related issue, which is that although the ios_base +constructor says that each ios_base member has an indeterminate value +after construction, all the existing implementations I tried explicitly set +ios_base::dec. +

+ + +

Proposed resolution:

+ + +

Rationale:

+

+adjustfield, basefield, and floatfield +are each multi-bit fields. It is possible to set multiple bits within +each of those fields. (For example, dec and +oct). These fields are used by locale facets. The LWG +reviewed the way in which each of those three fields is used, and +believes that in each case the behavior is well defined for any +possible combination of bits. See for example Table 58, in 22.2.2.2.2 +[facet.num.put.virtuals], noting the requirement in paragraph 6 of that +section. +

+

+Users are advised to use manipulators, or else use the two-argument +version of setf, to avoid unexpected behavior. +

+ + + + + +
+

289. <cmath> requirements missing C float and long double versions

+

Section: 26.7 [c.math] Status: NAD + Submitter: Judy Ward Date: 2000-12-30

+

View other active issues in [c.math].

+

View all other issues in [c.math].

+

View all issues with NAD status.

+

Discussion:

+

+ In ISO/IEC 9899:1990 Programming Languages C we find the following + concerning <math.h>: +

+ +

+ 7.13.4 Mathematics <math.h> +
+ The names of all existing functions declared in the <math.h> + header, suffixed with f or l, are reserved respectively for + corresponding functions with float and long double arguments + are return values. +

+ +

+ For example, float sinf(float) + is reserved. +

+ +

+ In the C99 standard, <math.h> must contain declarations + for these functions. +

+ +

+So, is it acceptable for an implementor to add these prototypes to the +C++ versions of the math headers? Are they required? +

+ + +

Proposed resolution:

+

+Add these Functions to Table 80, section 26.5 and to Table 99, +section C.2: +

+ +
    acosf asinf atanf atan2f ceilf cosf coshf 
+    expf fabsf floorf fmodf frexpf ldexpf 
+    logf log10f modff powf sinf sinhf sqrtf 
+    tanf tanhf 
+    acosl asinl atanl atan2l ceill cosl coshl 
+    expl fabsl floorl fmodl frexpl ldexpl 
+    logl log10l modfl powl sinl sinhl sqrtl 
+    tanl tanhl
+
+ +

+There should probably be a note saying that these functions +are optional and, if supplied, should match the description in +the 1999 version of the C standard. In the next round +of C++ standardization they can then become mandatory. +

+ + +

Rationale:

+

The C90 standard, as amended, already permits (but does not +require) these functions, and the C++ standard incorporates the +C90 standard by reference. C99 is not an issue, because it is +never referred to by the C++ standard.

+ + + + + +
+

293. Order of execution in transform algorithm

+

Section: 25.2.4 [alg.transform] Status: NAD + Submitter: Angelika Langer Date: 2001-01-04

+

View all other issues in [alg.transform].

+

View all issues with NAD status.

+

Discussion:

+

This issue is related to issue 242. In case that the resolution +proposed for issue 242 is accepted, we have have the following +situation: The 4 numeric algorithms (accumulate and consorts) as well +as transform would allow a certain category of side effects. The +numeric algorithms specify that they invoke the functor "for +every iterator i in the range [first, last) in order". transform, +in contrast, would not give any guarantee regarding order of +invocation of the functor, which means that the functor can be invoked +in any arbitrary order. +

+ +

Why would that be a problem? Consider an example: say the +transformator that is a simple enumerator ( or more generally +speaking, "is order-sensitive" ). Since a standard +compliant implementation of transform is free to invoke the enumerator +in no definite order, the result could be a garbled enumeration. +Strictly speaking this is not a problem, but it is certainly at odds +with the prevalent understanding of transform as an algorithms that +assigns "a new _corresponding_ value" to the output +elements. +

+ +

All implementations that I know of invoke the transformator in +definite order, namely starting from first and proceeding to last - +1. Unless there is an optimization conceivable that takes advantage of +the indefinite order I would suggest to specify the order, because it +eliminate the uncertainty that users would otherwise have regarding +the order of execution of their potentially order-sensitive function +objects. +

+ + +

Proposed resolution:

+

In section 25.2.3 - Transform [lib.alg.transform] change:

+

+-1- Effects: Assigns through every iterator i in the range [result, +result + (last1 - first1)) a new corresponding +value equal to op(*(first1 + (i - result)) or binary_op(*(first1 + +(i - result), *(first2 + (i - result))). +

+

to:

+

+-1- Effects: Computes values by invoking the operation op or binary_op +for every iterator in the range [first1, last1) in order. Assigns through +every iterator i in the range [result, result + (last1 - first1)) a new +corresponding +value equal to op(*(first1 + (i - result)) or binary_op(*(first1 + +(i - result), *(first2 + (i - result))). +

+ + +

Rationale:

+

For Input Iterators an order is already guaranteed, because +only one order is possible. If a user who passes a Forward +Iterator to one of these algorithms really needs a specific +order of execution, it's possible to achieve that effect by +wrapping it in an Input Iterator adaptor.

+ + + + + +
+

296. Missing descriptions and requirements of pair operators

+

Section: 20.2.3 [pairs] Status: NAD + Submitter: Martin Sebor Date: 2001-01-14

+

View all other issues in [pairs].

+

View all issues with NAD status.

+

Discussion:

+

The synopsis of the header <utility> in 20.2 [utility] +lists the complete set of equality and relational operators for pair +but the section describing the template and the operators only describes +operator==() and operator<(), and it fails to mention +any requirements on the template arguments. The remaining operators are +not mentioned at all. +

+ + +

Rationale:

+

20.2.1 [operators] paragraph 10 already specifies the semantics. +That paragraph says that, if declarations of operator!=, operator>, +operator<=, and operator>= appear without definitions, they are +defined as specified in 20.2.1 [operators]. There should be no user +confusion, since that paragraph happens to immediately precede the +specification of pair.

+ + + + + +
+

302. Need error indication from codecvt<>::do_length

+

Section: 22.2.1.5 [locale.codecvt.byname] Status: NAD + Submitter: Gregory Bumgardner Date: 2001-01-25

+

View all other issues in [locale.codecvt.byname].

+

View all issues with NAD status.

+

Discussion:

+

+The effects of codecvt<>::do_length() are described in +22.2.1.5.2, paragraph 10. As implied by that paragraph, and clarified +in issue 75, codecvt<>::do_length() must +process the source data and update the stateT argument just +as if the data had been processed by codecvt<>::in(). +However, the standard does not specify how do_length() would +report a translation failure, should the source sequence contain +untranslatable or illegal character sequences. +

+ +

+The other conversion methods return an "error" result value +to indicate that an untranslatable character has been encountered, but +do_length() already has a return value (the number of source +characters that have been processed by the method). +

+ + +

Proposed resolution:

+

+This issue cannot be resolved without modifying the interface. An exception +cannot be used, as there would be no way to determine how many characters +have been processed and the state object would be left in an indeterminate +state. +

+ +

+A source compatible solution involves adding a fifth argument to length() +and do_length() that could be used to return position of the offending +character sequence. This argument would have a default value that would +allow it to be ignored: +

+ +
  int length(stateT& state, 
+             const externT* from, 
+             const externT* from_end, 
+             size_t max,
+             const externT** from_next = 0);
+
+  virtual
+  int do_length(stateT& state, 
+                const externT* from, 
+                const externT* from_end, 
+                size_t max,
+                const externT** from_next);
+
+ +

+Then an exception could be used to report any translation errors and +the from_next argument, if used, could then be used to retrieve the +location of the offending character sequence. +

+ + +

Rationale:

+

The standard is already clear: the return value is the number of +"valid complete characters". If it encounters an invalid sequence of +external characters, it stops.

+ + + + + +
+

304. Must *a return an lvalue when a is an input iterator?

+

Section: 24.1 [iterator.requirements] Status: NAD + Submitter: Dave Abrahams Date: 2001-02-05

+

View other active issues in [iterator.requirements].

+

View all other issues in [iterator.requirements].

+

View all issues with NAD status.

+

Discussion:

+

+We all "know" that input iterators are allowed to produce +values when dereferenced of which there is no other in-memory copy. +

+ +

+But: Table 72, with a careful reading, seems to imply that this can only be +the case if the value_type has no members (e.g. is a built-in type). +

+ +

The problem occurs in the following entry:

+ +
  a->m     pre: (*a).m is well-defined
+           Equivalent to (*a).m
+
+ +

+*a.m can be well-defined if *a is not a reference +type, but since operator->() must return a pointer for +a->m to be well-formed, it needs something to return a +pointer to. This seems to indicate that *a must be +buffered somewhere to make a legal input iterator. +

+ +

I don't think this was intentional.

+ + +

Rationale:

+

The current standard is clear and consistent. Input iterators that + return rvalues are in fact implementable. They may in some cases + require extra work, but it is still possible to define an operator-> + in such cases: it doesn't have to return a T*, but may return a + proxy type. No change to the standard is justified.

+ + + + + +
+

313. set_terminate and set_unexpected question

+

Section: 18.7.3.3 [terminate] Status: NAD + Submitter: Judy Ward Date: 2001-04-03

+

View all other issues in [terminate].

+

View all issues with NAD status.

+

Discussion:

+

+According to section 18.7.3.3 of the standard, std::terminate() is +supposed to call the terminate_handler in effect immediately after +evaluating the throw expression. +

+ +

+Question: what if the terminate_handler in effect is itself +std::terminate? +

+ +

For example:

+ +
  #include <exception>
+
+  int main () {
+      std::set_terminate(std::terminate);
+      throw 5;
+      return 0;
+  }
+
+ +

+Is the implementation allowed to go into an infinite loop? +

+ +

+I think the same issue applies to std::set_unexpected. +

+ + +

Proposed resolution:

+ + +

Rationale:

+

Infinite recursion is to be expected: users who set the terminate +handler to terminate are explicitly asking for terminate +to call itself.

+ + + + + +
+

314. Is the stack unwound when terminate() is called?

+

Section: 18.7.3.3 [terminate] Status: NAD + Submitter: Detlef Vollmann Date: 2001-04-11

+

View all other issues in [terminate].

+

View all issues with NAD status.

+

Discussion:

+ +

+The standard appears to contradict itself about whether the stack is +unwound when the implementation calls terminate(). +

+ +

From 18.7.3.3p2:

+

+ Calls the terminate_handler function in effect immediately + after evaluating the throw-expression (lib.terminate.handler), + if called by the implementation [...] +

+ +

So the stack is guaranteed not to be unwound.

+ +

But from 15.3p9:

+

+ [...]whether or not the stack is unwound before this call + to terminate() is implementation-defined (except.terminate). +

+ +

+And 15.5.1 actually defines that in most cases the stack is unwound. +

+ + +

Proposed resolution:

+ + +

Rationale:

+

There is definitely no contradiction between the core and library +clauses; nothing in the core clauses says that stack unwinding happens +after terminate is called. 18.7.3.3p2 does not say anything +about when terminate() is called; it merely specifies which +terminate_handler is used.

+ + + + + +
+

323. abs() overloads in different headers

+

Section: 26.7 [c.math] Status: NAD Future + Submitter: Dave Abrahams Date: 2001-06-04

+

View other active issues in [c.math].

+

View all other issues in [c.math].

+

View all issues with NAD Future status.

+

Discussion:

+

Currently the standard mandates the following overloads of +abs():

+ +
    abs(long), abs(int) in <cstdlib>
+
+    abs(float), abs(double), abs(long double) in <cmath>
+
+    template<class T> T abs(const complex<T>&) in <complex>
+
+    template<class T> valarray<T> abs(const valarray<T>&); in <valarray>
+
+ +

+The problem is that having only some overloads visible of a function +that works on "implicitly inter-convertible" types is dangerous in +practice. The headers that get included at any point in a translation +unit can change unpredictably during program +development/maintenance. The wrong overload might be unintentionally +selected. +

+ +

+Currently, there is nothing that mandates the simultaneous visibility +of these overloads. Indeed, some vendors have begun fastidiously +reducing dependencies among their (public) headers as a QOI issue: it +helps people to write portable code by refusing to compile unless all +the correct headers are #included. +

+ +

The same issue may exist for other functions in the library.

+ +

Redmond: PJP reports that C99 adds two new kinds of abs: complex, +and int_max_abs.

+ +

Related issue: 343.

+ + + +

Rationale:

+

The programs that could potentially be broken by this situation are + already fragile, and somewhat contrived: For example, a user-defined + class that has conversion overloads both to long and + to float. If x is a value of such a class, then + abs(x) would give the long version if the user + included <cstdlib>, the float version if the user + included <cmath>, and would be diagnosed as ambiguous at + compile time if the user included both headers. The LWG couldn't + find an example of a program whose meaning would be changed (as + opposed to changing it from well-formed to ill-formed) simply by + adding another standard header.

+ +

Since the harm seems minimal, and there don't seem to be any simple + and noninvasive solutions, this is being closed as NAD. It is + marked as "Future" for two reasons. First, it might be useful to + define an <all> header that would include all + Standard Library headers. Second, we should at least make sure that + future library extensions don't make this problem worse.

+ + + + + +
+

326. Missing typedef in moneypunct_byname

+

Section: 22.2.6.4 [locale.moneypunct.byname] Status: NAD + Submitter: Martin Sebor Date: 2001-07-05

+

View all issues with NAD status.

+

Discussion:

+

The definition of the moneypunct facet contains the typedefs char_type +and string_type. Only one of these names, string_type, is defined in +the derived facet, moneypunct_byname.

+ + +

Proposed resolution:

+

For consistency with the numpunct facet, add a typedef for +char_type to the definition of the moneypunct_byname facet in +22.2.6.4 [locale.moneypunct.byname].

+ + +

Rationale:

+

The absence of the typedef is irrelevant. Users can still access +the typedef, because it is inherited from the base class.

+ + + + + +
+

330. Misleading "exposition only" value in class locale definition

+

Section: 22.1.1 [locale] Status: NAD + Submitter: Martin Sebor Date: 2001-07-15

+

View all other issues in [locale].

+

View all issues with NAD status.

+

Discussion:

+

+The "exposition only" value of the std::locale::none constant shown in +the definition of class locale is misleading in that it on many +systems conflicts with the value assigned to one if the LC_XXX +constants (specifically, LC_COLLATE on AIX, LC_ALL on HP-UX, LC_CTYPE +on Linux and SunOS). This causes incorrect behavior when such a +constant is passed to one of the locale member functions that accept a +locale::category argument and interpret it as either the C LC_XXX +constant or a bitmap of locale::category values. At least three major +implementations adopt the suggested value without a change and +consequently suffer from this problem. +

+ +

+For instance, the following code will (presumably) incorrectly copy facets +belonging to the collate category from the German locale on AIX: +

+ +
  std::locale l (std::locale ("C"), "de_DE", std::locale::none);
+
+ + +

Rationale:

+

The LWG agrees that it may be difficult to implement locale member +functions in such a way that they can take either category +arguments or the LC_ constants defined in <cctype>. In light of +this requirement (22.1.1.1.1 [locale.category], paragraph 2), and in light +of the requirement in the preceding paragraph that it is possible to +combine category bitmask elements with bitwise operations, +defining the category elements is delicate, +particularly if an implementor is constrained to work with a +preexisting C library. (Just using the existing LC_ constants would +not work in general.) There's no set of "exposition only" values that +could give library implementors proper guidance in such a delicate +matter. The non-normative example we're giving is no worse than +any other choice would be.

+ +

See issue 347.

+ + + + + +
+

332. Consider adding increment and decrement operators to std::fpos< T >

+

Section: 27.4.3 [fpos] Status: NAD + Submitter: PremAnand M. Rao Date: 2001-08-27

+

View all other issues in [fpos].

+

View all issues with NAD status.

+

Discussion:

+

+Increment and decrement operators are missing from +Table 88 -- Position type requirements in 27.4.3 [fpos]. +

+ + +

Proposed resolution:

+

+Table 88 (section 27.4.3) -- Position type requirements +be updated to include increment and decrement operators. +

+ +
expression        return type     operational    note
+
+++p               fpos&           p += O(1)
+p++               fpos            { P tmp = p;
+                                    ++p;
+                                    return tmp; }
+--p               fpos&           p -= O(1)
+p--               fpos            { P tmp = p;
+                                    --p;
+                                    return tmp; }
+
+ + + +

Rationale:

+

The LWG believes this is a request for extension, not a defect +report. Additionally, nobody saw a clear need for this extension; +fpos is used only in very limited ways.

+ + + + + +
+

344. grouping + showbase

+

Section: 22.2.2 [category.numeric] Status: NAD + Submitter: Howard Hinnant Date: 2001-10-13

+

View all issues with NAD status.

+

Discussion:

+

+When both grouping and showbase are active and the basefield is octal, +does the leading 0 participate in the grouping or not? For example, +should one format as: 0,123,456 or 0123,456? +

+

+An analogy can be drawn with hexadecimal. It appears that 0x123,456 is +preferred over 0x,123,456. However, this analogy is not universally +accepted to apply to the octal base. The standard is not clear on how +to format (or parse) in this manner. +

+ +

Proposed resolution:

+

+Insert into 22.2.3.1.2 [facet.numpunct.virtuals] paragraph 3, just before the last +sentence: +

+

+The leading hexadecimal base specifier "0x" does not participate in +grouping. The leading '0' octal base specifier may participate in +grouping. It is unspecified if the leading '0' participates in +formatting octal numbers. In parsing octal numbers, the implementation +is encouraged to accept both the leading '0' participating in the +grouping, and not participating (e.g. 0123,456 or 0,123,456). +

+ +

Rationale:

+

+The current behavior may be unspecified, but it's not clear that it +matters. This is an obscure corner case, since grouping is usually +intended for the benefit of humans and oct/hex prefixes are usually +intended for the benefit of machines. There is not a strong enough +consensus in the LWG for action. +

+ + + + +
+

348. Minor issue with std::pair operator<

+

Section: 20.2.3 [pairs] Status: NAD Future + Submitter: Andy Sawyer Date: 2001-10-23

+

View all other issues in [pairs].

+

View all issues with NAD Future status.

+

Discussion:

+

+The current wording of 20.2.2 [lib.pairs] p6 precludes the use of +operator< on any pair type which contains a pointer. +

+ + +

Proposed resolution:

+

In 20.2.3 [pairs] paragraph 6, replace:

+
    Returns: x.first < y.first || (!(y.first < x.first) && x.second <
+        y.second).
+
+

With:

+
    Returns: std::less<T1>()( x.first, y.first ) ||
+             (!std::less<T1>()( y.first, x.first) && 
+             std::less<T2>()( x.second, y.second ) )
+
+ + + +

Rationale:

+

This is an instance of a much more general problem. If we want + operator< to translate to std::less for pairs of pointers, where + do we draw the line? The same issue applies to individual + pointers, smart pointer wrappers, std::vector<T*>, and so + on.

+ +

Andy Koenig suggests that the real issue here is that we aren't + distinguishing adequately between two different orderings, a + "useful ordering" and a "canonical ordering" that's used just + because we sometimes need some ordering without caring much + which ordering it is. Another example of the later is typeinfo's + before.

+ + + + + + +
+

350. allocator<>::address

+

Section: 20.6.1.1 [allocator.members], 20.1.2 [allocator.requirements], 17.4.1.1 [contents] Status: Dup + Submitter: Nathan Myers Date: 2001-10-25

+

View all other issues in [allocator.members].

+

View all issues with Dup status.

+

Duplicate of: 634

+

Discussion:

+

See c++std-lib-9006 and c++std-lib-9007. This issue is taken +verbatim from -9007.

+ +

+The core language feature allowing definition of operator&() applied +to any non-builtin type makes that operator often unsafe to use in +implementing libraries, including the Standard Library. The result +is that many library facilities fail for legal user code, such as +the fragment

+
  class A { private: A* operator&(); };
+  std::vector<A> aa;
+
+  class B { };
+  B* operator&(B&) { return 0; }
+  std::vector<B> ba;
+
+ +

+In particular, the requirements table for Allocator (Table 32) specifies +no semantics at all for member address(), and allocator<>::address is +defined in terms of unadorned operator &. +

+ + + +

Proposed resolution:

+

+In 20.6.1.1, Change the definition of allocator<>::address from:

+

+ Returns: &x +

+ +

to:

+ +

+ Returns: The value that the built in operator&(x) would return if not + overloaded. +

+ +

+In 20.1.6, Table 32, add to the Notes column of the a.address(r) and +a.address(s) lines, respectively: +

+ +
  allocator<T>::address(r)
+  allocator<T>::address(s)
+
+ +

In addition, in clause 17.4.1.1, add a statement:

+ +

+ The Standard Library does not apply operator& to any type for which + operator& may be overloaded. +

+ + + +

Rationale:

+

The LWG believes both examples are ill-formed. The contained type +is required to be CopyConstructible (20.1.1 [utility.arg.requirements]), and that +includes the requirement that &t return the usual types and +values. Since allocators are intended to be used in conjunction with +containers, and since the CopyConstructible requirements appear to +have been written to deal with the concerns of this issue, the LWG +feels it is NAD unless someone can come up with a well-formed example +exhibiting a problem.

+ +

It may well be that the CopyConstructible requirements are too + restrictive and that either the container requirements or the + CopyConstructive requirements should be relaxed, but that's a far + larger issue. Marking this issue as "future" as a pointer to that + larger issue.

+ + + + + +
+

351. unary_negate and binary_negate: struct or class?

+

Section: 20.5 [function.objects] Status: NAD Editorial + Submitter: Dale Riley Date: 2001-11-12

+

View all other issues in [function.objects].

+

View all issues with NAD Editorial status.

+

Discussion:

+

+In 20.5 [function.objects] the header <functional> synopsis declares +the unary_negate and binary_negate function objects as struct. +However in 20.5.10 [negators] the unary_negate and binary_negate +function objects are defined as class. Given the context, they are +not "basic function objects" like negate, so this is either a typo or +an editorial oversight. +

+ +

[Taken from comp.std.c++]

+ + + +

Proposed resolution:

+

Change the synopsis to reflect the useage in 20.5.10 [negators]

+ +

[Curaçao: Since the language permits "struct", the LWG +views this as NAD. They suggest, however, that the Project Editor +might wish to make the change as editorial.]

+ + + + + + + +
+

353. std::pair missing template assignment

+

Section: 20.2.3 [pairs] Status: NAD Future + Submitter: Martin Sebor Date: 2001-12-02

+

View all other issues in [pairs].

+

View all issues with NAD Future status.

+

Discussion:

+

+The class template std::pair defines a template ctor (20.2.2, p4) but +no template assignment operator. This may lead to inefficient code since +assigning an object of pair<C, D> to pair<A, B> +where the types C and D are distinct from but convertible to +A and B, respectively, results in a call to the template copy +ctor to construct an unnamed temporary of type pair<A, B> +followed by an ordinary (perhaps implicitly defined) assignment operator, +instead of just a straight assignment. +

+ + +

Proposed resolution:

+

+Add the following declaration to the definition of std::pair: +

+
    template<class U, class V>
+    pair& operator=(const pair<U, V> &p);
+
+

+And also add a paragraph describing the effects of the function template to the +end of 20.2.2: +

+
    template<class U, class V>
+    pair& operator=(const pair<U, V> &p);
+
+

+ Effects: first = p.first; + second = p.second; + Returns: *this +

+ +

[Curaçao: There is no indication this is was anything other than +a design decision, and thus NAD.  May be appropriate for a future +standard.]

+ + + + + + +
+

356. Meaning of ctype_base::mask enumerators

+

Section: 22.2.1 [category.ctype] Status: NAD + Submitter: Matt Austern Date: 2002-01-23

+

View all other issues in [category.ctype].

+

View all issues with NAD status.

+

Discussion:

+ +

What should the following program print?

+ +
  #include <locale>
+  #include <iostream>
+
+  class my_ctype : public std::ctype<char>
+  {
+    typedef std::ctype<char> base;
+  public:
+    my_ctype(std::size_t refs = 0) : base(my_table, false, refs)
+    {
+      std::copy(base::classic_table(), base::classic_table() + base::table_size,
+                my_table);
+      my_table[(unsigned char) '_'] = (base::mask) (base::print | base::space);
+    }
+  private:
+    mask my_table[base::table_size];
+  };
+
+  int main()
+  {
+    my_ctype ct;
+    std::cout << "isspace: " << ct.is(std::ctype_base::space, '_') << "    "
+              << "isalpha: " << ct.is(std::ctype_base::alpha, '_') << std::endl;
+  }
+
+ +

The goal is to create a facet where '_' is treated as whitespace.

+ +

On gcc 3.0, this program prints "isspace: 1 isalpha: 0". On +Microsoft C++ it prints "isspace: 1 isalpha: 1".

+ +

+I believe that both implementations are legal, and the standard does not +give enough guidance for users to be able to use std::ctype's +protected interface portably.

+ +

+The above program assumes that ctype_base::mask enumerators like +space and print are disjoint, and that the way to +say that a character is both a space and a printing character is to or +those two enumerators together. This is suggested by the "exposition +only" values in 22.2.1 [category.ctype], but it is nowhere specified in +normative text. An alternative interpretation is that the more +specific categories subsume the less specific. The above program +gives the results it does on the Microsoft compiler because, on that +compiler, print has all the bits set for each specific +printing character class. +

+ +

From the point of view of std::ctype's public interface, there's no +important difference between these two techniques. From the point of +view of the protected interface, there is. If I'm defining a facet +that inherits from std::ctype<char>, I'm the one who defines the +value that table()['a'] returns. I need to know what combination of +mask values I should use. This isn't so very esoteric: it's exactly +why std::ctype has a protected interface. If we care about users +being able to write their own ctype facets, we have to give them a +portable way to do it. +

+ +

+Related reflector messages: +lib-9224, lib-9226, lib-9229, lib-9270, lib-9272, lib-9273, lib-9274, +lib-9277, lib-9279. +

+ +

Issue 339 is related, but not identical. The +proposed resolution if issue 339 says that +ctype_base::mask must be a bitmask type. It does not say that the +ctype_base::mask elements are bitmask elements, so it doesn't +directly affect this issue.

+ +

More comments from Benjamin Kosnik, who believes that +that C99 compatibility essentially requires what we're +calling option 1 below.

+ +
+
I think the C99 standard is clear, that isspace -> !isalpha.
+--------
+
+#include <locale>
+#include <iostream>
+
+class my_ctype : public std::ctype<char>
+{
+private:
+  typedef std::ctype<char> base;
+  mask my_table[base::table_size];
+
+public:
+  my_ctype(std::size_t refs = 0) : base(my_table, false, refs)
+  {
+    std::copy(base::classic_table(), base::classic_table() + base::table_size,
+              my_table);
+    mask both = base::print | base::space;
+    my_table[static_cast<mask>('_')] = both;
+  }
+};
+
+int main()
+{
+  using namespace std;
+  my_ctype ct;
+  cout << "isspace: " << ct.is(ctype_base::space, '_') << endl;
+  cout << "isprint: " << ct.is(ctype_base::print, '_') << endl;
+
+  // ISO C99, isalpha iff upper | lower set, and !space.
+  // 7.5, p 193
+  // -> looks like g++ behavior is correct.
+  // 356 -> bitmask elements are required for ctype_base
+  // 339 -> bitmask type required for mask
+  cout << "isalpha: " << ct.is(ctype_base::alpha, '_') << endl;
+}
+
+
+ + + +

Proposed resolution:

+

Informally, we have three choices:

+
    +
  1. Require that the enumerators are disjoint (except for alnum and +graph)
  2. +
  3. Require that the enumerators are not disjoint, and specify which +of them subsume which others. (e.g. mandate that lower includes alpha +and print)
  4. +
  5. Explicitly leave this unspecified, which the result that the above +program is not portable.
  6. +
+ +

Either of the first two options is just as good from the standpoint +of portability. Either one will require some implementations to +change.

+ + +

Rationale:

+

The LWG agrees that this is a real ambiguity, and that both +interpretations are conforming under the existing standard. However, +there's no evidence that it's causing problems for real users. Users +who want to define ctype facets portably can test the ctype_base masks +to see which interpretation is being used.

+ + + + + +
+

357. <cmath> float functions cannot return HUGE_VAL

+

Section: 26.7 [c.math] Status: NAD Editorial + Submitter: Ray Lischner Date: 2002-02-26

+

View other active issues in [c.math].

+

View all other issues in [c.math].

+

View all issues with NAD Editorial status.

+

Discussion:

+

+The float versions of the math functions have no meaningful value to return +for a range error. The long double versions have a value they can return, +but it isn't necessarily the most reasonable value. +

+ +

+Section 26.5 [lib.c.math], paragraph 5, says that C++ "adds float and long +double overloaded versions of these functions, with the same semantics," +referring to the math functions from the C90 standard. +

+ +

+The C90 standard, in section 7.5.1, paragraph 3, says that functions return +"the value of the macro HUGE_VAL" when they encounter a range error. +Section 7.5, paragraph 2, defines HUGE_VAL as a macro that "expands to a +positive double expression, not necessarily representable as a float." +

+ +

+Therefore, the float versions of the math functions have no way to +signal a range error. [Curaçao: The LWG notes that this isn't +strictly correct, since errno is set.] The semantics require that they +return HUGE_VAL, but they cannot because HUGE_VAL might not be +representable as a float. +

+ +

+The problem with long double functions is less severe because HUGE_VAL is +representable as a long double. On the other hand, it might not be a "huge" +long double value, and might fall well within the range of normal return +values for a long double function. Therefore, it does not make sense for a +long double function to return a double (HUGE_VAL) for a range error. +

+ + +

Proposed resolution:

+

Curaçao: C99 was faced with a similar problem, which they fixed by +adding HUGE_VALF and HUGE_VALL in addition to HUGE_VAL.

+ +

C++ must also fix, but it should be done in the context of the +general C99 based changes to C++, not via DR. Thus the LWG in Curaçao +felt the resolution should be NAD, FUTURE, but the issue is being held +open for one more meeting to ensure LWG members not present during the +discussion concur.

+ + +

Rationale:

+

Will be fixed as part of more general work in the TR.

+ + + + + +
+

361. num_get<>::do_get (..., void*&) checks grouping

+

Section: 22.2.2.2.2 [facet.num.put.virtuals] Status: NAD + Submitter: Martin Sebor Date: 2002-03-12

+

View all other issues in [facet.num.put.virtuals].

+

View all issues with NAD status.

+

Discussion:

+

+22.2.2.2.2, p12 specifies that thousands_sep is to be inserted only +for integral types (issue 282 suggests that this should be done for +all arithmetic types). +

+ +

+22.2.2.1.2, p12 requires that grouping be checked for all extractors +including that for void*. +

+ +

+I don't think that's right. void* values should not be checked for +grouping, should they? (Although if they should, then num_put needs +to write them out, otherwise their extraction will fail.) +

+ + +

Proposed resolution:

+

+Change the first sentence of 22.2.2.2.2, p12 from +

+

+ Digit grouping is checked. That is, the positions of discarded + separators is examined for consistency with + use_facet<numpunct<charT> >(loc).grouping(). + If they are not consistent then ios_base::failbit is assigned + to err. +

+ +

to

+

+ Except for conversions to void*, digit grouping is checked... +

+ + + +

Rationale:

+

This would be a change: as it stands, the standard clearly + specifies that grouping applies to void*. A survey of existing + practice shows that most existing implementations do that, as they + should.

+ + + + + +
+

366. Excessive const-qualification

+

Section: 27 [input.output] Status: NAD + Submitter: Walter Brown, Marc Paterno Date: 2002-05-10

+

View all other issues in [input.output].

+

View all issues with NAD status.

+

Discussion:

+

+The following member functions are declared const, yet return non-const +pointers. We believe they are should be changed, because they allow code +that may surprise the user. See document N1360 for details and +rationale. +

+ +

[Santa Cruz: the real issue is that we've got const member +functions that return pointers to non-const, and N1360 proposes +replacing them by overloaded pairs. There isn't a consensus about +whether this is a real issue, since we've never said what our +constness policy is for iostreams. N1360 relies on a distinction +between physical constness and logical constness; that distinction, or +those terms, does not appear in the standard.]

+ + + + +

Proposed resolution:

+

In 27.4.4 and 27.4.4.2

+

Replace

+
  basic_ostream<charT,traits>* tie() const;
+
+

with

+
  basic_ostream<charT,traits>* tie();
+  const basic_ostream<charT,traits>* tie() const;
+
+ +

and replace

+
  basic_streambuf<charT,traits>* rdbuf() const;
+
+

with

+
  basic_streambuf<charT,traits>* rdbuf();
+  const basic_streambuf<charT,traits>* rdbuf() const;
+
+ +

In 27.5.2 and 27.5.2.3.1

+

Replace

+
  char_type* eback() const;
+
+

with

+
  char_type* eback();
+  const char_type* eback() const;
+
+ +

Replace

+
  char_type gptr() const;
+
+

with

+
  char_type* gptr();
+  const char_type* gptr() const;
+
+ +

Replace

+
  char_type* egptr() const;
+
+

with

+
  char_type* egptr();
+  const char_type* egptr() const;
+
+ +

In 27.5.2 and 27.5.2.3.2

+

Replace

+
  char_type* pbase() const;
+
+

with

+
  char_type* pbase();
+  const char_type* pbase() const;
+
+ +

Replace

+
  char_type* pptr() const;
+
+

with

+
  char_type* pptr();
+  const char_type* pptr() const;
+
+ +

Replace

+
  char_type* epptr() const;
+
+

with

+
  char_type* epptr();
+  const char_type* epptr() const;
+
+ +

In 27.7.2, 27.7.2.2, 27.7.3 27.7.3.2, 27.7.4, and 27.7.6

+

Replace

+
  basic_stringbuf<charT,traits,Allocator>* rdbuf() const;
+
+

with

+
  basic_stringbuf<charT,traits,Allocator>* rdbuf();
+  const basic_stringbuf<charT,traits,Allocator>* rdbuf() const;
+
+ +

In 27.8.1.5, 27.8.1.7, 27.8.1.8, 27.8.1.10, 27.8.1.11, and 27.8.1.13

+

Replace

+
  basic_filebuf<charT,traits>* rdbuf() const;
+
+

with

+
  basic_filebuf<charT,traits>* rdbuf();
+  const basic_filebuf<charT,traits>* rdbuf() const;
+
+ + +

Rationale:

+

The existing specification is a bit sloppy, but there's no + particular reason to change this other than tidiness, and there are + a number of ways in which streams might have been designed + differently if we were starting today. There's no evidence that the + existing constness policy is harming users. We might consider + a different constness policy as part of a full stream redesign.

+ + + + + +
+

367. remove_copy/remove_copy_if and Input Iterators

+

Section: 25.2.8 [alg.remove] Status: NAD + Submitter: Anthony Williams Date: 2002-05-13

+

View all other issues in [alg.remove].

+

View all issues with NAD status.

+

Discussion:

+

+remove_copy and remove_copy_if (25.2.8 [alg.remove]) permit their +input range to be marked with Input Iterators. However, since two +operations are required against the elements to copy (comparison and +assigment), when the input range uses Input Iterators, a temporary +copy must be taken to avoid dereferencing the iterator twice. This +therefore requires the value type of the InputIterator to be +CopyConstructible. If the iterators are at least Forward Iterators, +then the iterator can be dereferenced twice, or a reference to the +result maintained, so the temporary is not required. +

+ + +

Proposed resolution:

+

+Add "If InputIterator does not meet the requirements of forward +iterator, then the value type of InputIterator must be copy +constructible. Otherwise copy constructible is not required." to +25.2.8 [alg.remove] paragraph 6. +

+ + +

Rationale:

+

The assumption is that an input iterator can't be dereferenced + twice. There's no basis for that assumption in the Standard.

+ + + + + +
+

368. basic_string::replace has two "Throws" paragraphs

+

Section: 21.3.6.6 [string::replace] Status: NAD Editorial + Submitter: Beman Dawes Date: 2002-06-03

+

View all issues with NAD Editorial status.

+

Discussion:

+

+21.3.6.6 [string::replace] basic_string::replace, second +signature, given in paragraph 1, has two "Throws" paragraphs (3 and +5). +

+ +

+In addition, the second "Throws" paragraph (5) includes specification +(beginning with "Otherwise, the function replaces ...") that should be +part of the "Effects" paragraph. +

+ + +

Proposed resolution:

+ + +

Rationale:

+

This is editorial. Both "throws" statements are true. The bug is + just that the second one should be a sentence, part of the "Effects" + clause, not a separate "Throws". The project editor has been + notified.

+ + + + + +
+

372. Inconsistent description of stdlib exceptions

+

Section: 17.4.4.8 [res.on.exception.handling], 18.6.1 [type.info] Status: NAD + Submitter: Randy Maddox Date: 2002-07-22

+

View all other issues in [res.on.exception.handling].

+

View all issues with NAD status.

+

Discussion:

+ +

Paragraph 3 under clause 17.4.4.8 [res.on.exception.handling], Restrictions on +Exception Handling, states that "Any other functions defined in the +C++ Standard Library that do not have an exception-specification may +throw implementation-defined exceptions unless otherwise specified." +This statement is followed by a reference to footnote 178 at the +bottom of that page which states, apparently in reference to the C++ +Standard Library, that "Library implementations are encouraged (but +not required) to report errors by throwing exceptions from (or derived +from) the standard exceptions."

+ +

These statements appear to be in direct contradiction to clause +18.6.1 [type.info], which states "The class exception defines the +base class for the types of objects thrown as exceptions by the C++ +Standard library components ...".

+ +

Is this inconsistent?

+ + + +

Proposed resolution:

+ + +

Rationale:

+

Clause 17 is setting the overall library requirements, and it's + clear and consistent. This sentence from Clause 18 is descriptive, + not setting a requirement on any other class. +

+ + + + + +
+

374. moneypunct::frac_digits returns int not unsigned

+

Section: 22.2.6.3.1 [locale.moneypunct.members], 22.2.6.3.2 [locale.moneypunct.virtuals] Status: NAD + Submitter: Ray Lischner Date: 2002-08-08

+

View all issues with NAD status.

+

Discussion:

+

+In section 22.2.6.3.1 [locale.moneypunct.members], frac_digits() returns type +"int". This implies that frac_digits() might return a negative value, +but a negative value is nonsensical. It should return "unsigned". +

+ +

+Similarly, in section 22.2.6.3.2 [locale.moneypunct.virtuals], do_frac_digits() +should return "unsigned". +

+ + + +

Proposed resolution:

+ + +

Rationale:

+

Regardless of whether the return value is int or unsigned, it's +always conceivable that frac_digits might return a nonsensical +value. (Is 4294967295 really any better than -1?) The clients of +moneypunct, the get and put facets, can and do perform range +checks.

+ + + + + +
+

377. basic_string::insert and length_error

+

Section: 21.3.6.4 [string::insert] Status: NAD + Submitter: Ray Lischner Date: 2002-08-16

+

View all other issues in [string::insert].

+

View all issues with NAD status.

+

Discussion:

+

+Section 21.3.6.4 [string::insert], paragraph 4, contains the following, +"Then throws length_error if size() >= npos - rlen." +

+ +

+Related to DR 83, this sentence should probably be removed. +

+ + +

Proposed resolution:

+ + +

Rationale:

This requirement is redundant but correct. No change is +needed.

+ + + + +
+

378. locale immutability and locale::operator=()

+

Section: 22.1.1 [locale] Status: Dup + Submitter: Martin Sebor Date: 2002-09-06

+

View all other issues in [locale].

+

View all issues with Dup status.

+

Duplicate of: 31

+

Discussion:

+

+I think there is a problem with 22.1.1, p6 which says that +

+
    -6- An instance of locale is immutable; once a facet reference
+        is obtained from it, that reference remains usable as long
+        as the locale value itself exists.
+
+

+and 22.1.1.2, p4: +

+
    const locale& operator=(const locale& other) throw();
+
+    -4- Effects: Creates a copy of other, replacing the current value.
+
+

+How can a reference to a facet obtained from a locale object remain +valid after an assignment that clearly must replace all the facets +in the locale object? Imagine a program such as this +

+
    std::locale loc ("de_DE");
+    const std::ctype<char> &r0 = std::use_facet<std::ctype<char> >(loc);
+    loc = std::locale ("en_US");
+    const std::ctype<char> &r1 = std::use_facet<std::ctype<char> >(loc);
+
+

+Is r0 really supposed to be preserved and destroyed only when loc goes +out of scope? +

+ + +

Proposed resolution:

+

[Summer '04 mid-meeting mailing: Martin and Dietmar believe this + is a duplicate of issue 31 and recommend that it be + closed. +]

+ + + + + + +
+

385. Does call by value imply the CopyConstructible requirement?

+

Section: 17 [library] Status: NAD + Submitter: Matt Austern Date: 2002-10-23

+

View all other issues in [library].

+

View all issues with NAD status.

+

Discussion:

+

+Many function templates have parameters that are passed by value; +a typical example is find_if's pred parameter in +25.1.2 [alg.find]. Are the corresponding template parameters +(Predicate in this case) implicitly required to be +CopyConstructible, or does that need to be spelled out explicitly? +

+ +

+This isn't quite as silly a question as it might seem to be at first +sight. If you call find_if in such a way that template +argument deduction applies, then of course you'll get call by value +and you need to provide a copy constructor. If you explicitly provide +the template arguments, however, you can force call by reference by +writing something like find_if<my_iterator, +my_predicate&>. The question is whether implementation +are required to accept this, or whether this is ill-formed because +my_predicate& is not CopyConstructible. +

+ +

+The scope of this problem, if it is a problem, is unknown. Function +object arguments to generic algorithms in clauses 25 [algorithms] +and 26 [numerics] are obvious examples. A review of the whole +library is necessary. +

+

[ +This is really two issues. First, predicates are typically passed by +value but we don't say they must be Copy Constructible. They should +be. Second: is specialization allowed to transform value arguments +into references? References aren't copy constructible, so this should +not be allowed. +]

+ +

[ +2007-01-12, Howard: First, despite the note above, references are +copy constructible. They just aren't assignable. Second, this is very +closely related to 92 and should be consistent with that. +That issue already says that implementations are allowed to copy +function objects. If one passes in a reference, it is copyable, but +susceptible to slicing if one passes in a reference to a base. Third, +with rvalue reference in the language one only needs to satisfy +MoveConstructible to pass an rvalue "by value". Though the function +might still copy the function object internally (requiring +CopyConstructible). Finally (and fwiw), if we wanted to, it is easy to +code all of the std::algorithms such that they do not copy function +objects internally. One merely passes them by reference internally if +desired (this has been fully implemented and shipped for several years). + If this were mandated, it would reverse 92, allowing +function objects to reliably maintain state. E.g. the example in 92 would reliably remove only the third element. +]

+ + + +

Proposed resolution:

+

+Recommend NAD. +

+ + +

Rationale:

+

+Generic algorithms will be marked with concepts and these will imply a requirement +of MoveConstructible (not CopyConstructible). The signature of the function will +then precisely describe and enforce the precise requirements. +

+ + + + + +
+

388. Use of complex as a key in associative containers

+

Section: 26.3 [complex.numbers] Status: NAD Future + Submitter: Gabriel Dos Reis Date: 2002-11-08

+

View all other issues in [complex.numbers].

+

View all issues with NAD Future status.

+

Discussion:

+

+Practice with std::complex<> and the associative containers +occasionally reveals artificial and distracting issues with constructs +resembling: std::set<std::complex<double> > s; +

+ +

+The main reason for the above to fail is the absence of an approriate +definition for std::less<std::complex<T> >. That in turn comes from +the definition of the primary template std::less<> in terms of +operator<. +

+ +

+The usual argument goes as follows: Since there is no ordering over +the complex field compatible with field operations it makes little +sense to define a function operator< operating on the datatype +std::complex<T>. That is fine. However, that reasoning does not carry +over to std::less<T> which is used, among other things, by associative +containers as an ordering useful to meet complexity requirements. +

+ +

Related issue: 348.

+ + + +

Proposed resolution:

+

Informally: Add a specialization of std::less for std::complex.

+ + +

Rationale:

+

Discussed in Santa Cruz. An overwhelming majority of the LWG +believes this should not be treated a DR: it's a request for a design +change, not a defect in the existing standard. Most people (10-3) +believed that we probably don't want this change, period: as with +issue 348, it's hard to know where to draw the line. +The LWG noted that users who want to put objects into an associative +container for which operator< isn't defined can simply +provide their own comparison function object.

+ + + + + +
+

390. CopyConstructible requirements too strict

+

Section: 20.1.1 [utility.arg.requirements] Status: NAD Future + Submitter: Doug Gregor Date: 2002-10-24

+

View other active issues in [utility.arg.requirements].

+

View all other issues in [utility.arg.requirements].

+

View all issues with NAD Future status.

+

Discussion:

+

+The CopyConstructible requirements in Table 30 state that for an +object t of type T (where T is CopyConstructible), the expression &t +returns the address of t (with type T*). This requirement is overly +strict, in that it disallows types that overload operator& to not +return a value of type T*. This occurs, for instance, in the Boost.Lambda library, where +operator& is overloaded for a Boost.Lambda function object to return +another function object. +

+ +

Example:

+ +
  std::vector<int> u, v;
+  int x;
+  // ...
+  std::transform(u.begin(), u.end(), std::back_inserter(v), _1 * x);
+
+ +

+_1 * x returns an unnamed function object with operator& overloaded to +not return T* , therefore rendering the std::transform call ill-formed. +However, most standard library implementations will compile this code +properly, and the viability of such binder libraries is severely hindered +by the unnecessary restriction in the CopyConstructible requirements. +

+ +

+For reference, the address of an object can be retrieved without using +the address-of operator with the following function template: +

+ +
  template <typename T> T* addressof(T& v)
+  {
+    return reinterpret_cast<T*>(
+         &const_cast<char&>(reinterpret_cast<const volatile char &>(v)));
+  }
+
+ +

+Note: this relates directly to library issue 350, which +will need to be reexamined if the CopyConstructible requirements +change. +

+ + +

Proposed resolution:

+

+Remove the last two rows of Table 30, eliminating the requirements +that &t and &u return the address of t and u, respectively. +

+ + +

Rationale:

+

This was a deliberate design decision. Perhaps it should be + reconsidered for C++0x.

+ + + + + +
+

392. 'equivalence' for input iterators

+

Section: 24.1.1 [input.iterators] Status: NAD + Submitter: Corwin Joy Date: 2002-12-11

+

View all other issues in [input.iterators].

+

View all issues with NAD status.

+

Discussion:

+ +

+In section 24.1.1 [input.iterators] table 72 - +'Input Iterator Requirements' we have as a postcondition of *a: +"If a==b and (a, b) is in the domain of == then *a is equivalent to *b". +

+ +

+In section 24.5.3.5 [istreambuf.iterator::equal] it states that +"istreambuf_iterator::equal returns true if and only if both iterators +are at end-of-stream, or neither is at end-of-stream, regardless of +what streambuf object they use." (My emphasis). +

+ +

+The defect is that either 'equivalent' needs to be more precisely +defined or the conditions for equality in 24.5.3.5 [istreambuf.iterator::equal] +are incorrect. (Or both). +

+ +

Consider the following example:

+
   #include <iostream>
+   #include <fstream>
+   #include <iterator>
+   using namespace std;
+
+   int main() {
+    ifstream file1("file1.txt"), file2("file2.txt");
+    istreambuf_iterator<char> f1(file1), f2(file2);
+    cout << "f1 == f2 : " << boolalpha << (f1 == f2) << endl;
+    cout << "f1 = " << *f1 << endl;
+    cout << "f2 = " << *f2 << endl;
+    return 0;
+   }
+
+ +

Now assuming that neither f1 or f2 are at the end-of-stream then +f1 == f2 by 24.5.3.5 [istreambuf.iterator::equal].

+ +

However, it is unlikely that *f1 will give the same value as *f2 except +by accident.

+ +

So what does *f1 'equivalent' to *f2 mean? I think the standard should +be clearer on this point, or at least be explicit that this does not +mean that *f1 and *f2 are required to have the same value in the case +of input iterators.

+ + +

Proposed resolution:

+ + +

Rationale:

The two iterators aer not in the domain of ==

+ + + + + + +
+

393. do_in/do_out operation on state unclear

+

Section: 22.2.1.4.2 [locale.codecvt.virtuals] Status: Pending NAD Editorial + Submitter: Alberto Barbati Date: 2002-12-24

+

View other active issues in [locale.codecvt.virtuals].

+

View all other issues in [locale.codecvt.virtuals].

+

View all issues with Pending NAD Editorial status.

+

Discussion:

+

+this DR follows the discussion on the previous thread "codecvt::do_in +not consuming external characters". It's just a clarification issue +and not a request for a change. +

+

+Can do_in()/do_out() produce output characters without consuming input +characters as a result of operation on state? +

+ + +

Proposed resolution:

+

+Add a note at the end of 22.2.1.4.2 [locale.codecvt.virtuals], +paragraph 3: +

+ +

+[Note: As a result of operations on state, it can return ok or partial +and set from_next == from and to_next != to. --end note] +

+ + +

Rationale:

+

+The submitter believes that standard already provides an affirmative +answer to the question. However, the current wording has induced a few +library implementors to make the incorrect assumption that +do_in()/do_out() always consume at least one internal character when +they succeed. +

+ +

+The submitter also believes that the proposed resolution is not in +conflict with the related issue 76. Moreover, by explicitly allowing +operations on state to produce characters, a codecvt implementation +may effectively implement N-to-M translations without violating the +"one character at a time" principle described in such issue. On a side +note, the footnote in the proposed resolution of issue 76 that +informally rules out N-to-M translations for basic_filebuf should be +removed if this issue is accepted as valid. +

+ + +

[ +Kona (2007): The proposed resolution is to add a note. Since this is +non-normative, the issue is editorial, but we believe that the note is +correct. Proposed Disposition: NAD, Editorial +]

+ + + + + + +
+

399. volations of unformatted input function requirements

+

Section: 27.6.1.3 [istream.unformatted] Status: NAD + Submitter: Martin Sebor Date: 2003-01-05

+

View all other issues in [istream.unformatted].

+

View all issues with NAD status.

+

Discussion:

+

+The Effects clauses for the two functions below violate the +general requirements on unformatted input functions outlined +in 27.6.1.3: they do not begin by constructing a sentry object. +Instead, they begin by calling widen ('\n'), which may throw +an exception. The exception is then allowed to propagate from +the unformatted input function irrespective of the setting of +exceptions(). +

+

+Note that in light of 27.6.1.1, p3 and p4, the fact that the +functions allow exceptions thrown from widen() to propagate +may not strictly speaking be a defect (but the fact that the +functions do not start by constructing a sentry object still +is). However, since an exception thrown from ctype<charT> +::widen() during any other input operation (say, from within +a call to num_get<charT>::get()) will be caught and cause +badbit to be set, these two functions should not be treated +differently for the sake of consistency. +

+ + +

Proposed resolution:

+ + +

Rationale:

+

+Not a defect. The standard is consistent, and the behavior required +by the standard is unambiguous. Yes, it's theoretically possible for +widen to throw. (Not that this will happen for the default ctype +facet or for most real-world replacement ctype facets.) Users who +define ctype facets that can throw, and who care about this behavior, +can use alternative signatures that don't call widen. +

+ + + + + + +
+

429. typo in basic_ios::clear(iostate)

+

Section: 27.4.4.3 [iostate.flags] Status: Dup + Submitter: Martin Sebor Date: 2003-09-18

+

View all other issues in [iostate.flags].

+

View all issues with Dup status.

+

Duplicate of: 412

+

Discussion:

+

+ +The Effects clause in 27.4.4.3, p5 describing the effects of a call to +the ios_base member function clear(iostate state) says that the function +only throws if the respective bits are already set prior to the function +call. That's obviously not the intent. If it was, a call to clear(badbit) +on an object for which (rdstate() == goodbit && exceptions() == badbit) +holds would not result in an exception being thrown. + +

+ +

Proposed resolution:

+

+ +The text ought to be changed from +
+ +"If (rdstate() & exceptions()) == 0, returns. ..." +
+ +to +
+ +"If (state & exceptions()) == 0, returns. ..." +

+ + +

Rationale:

+ + + + + + +
+

433. Contradiction in specification of unexpected()

+

Section: 18.7.2.4 [unexpected] Status: NAD + Submitter: Vyatcheslav Sysoltsev Date: 2003-09-29

+

View all issues with NAD status.

+

Discussion:

+

+Clause 15.5.2 [except.unexpected] paragraph 1 says that "void unexpected(); +is called (18.7.2) immediately after completing the stack unwinding +for the former function", but 18.7.2.4 (Effects) says that "void +unexpected(); . . . Calls the unexpected_handler function in effect +immediately after evaluating the throwexpression (18.7.2.2),". Isn't +here a contradiction: 15.5.2 requires stack have been unwound when in +void unexpected() and therefore in unexpected_handler but 18.7.2.4 +claims that unexpected_handler is called "in effect immediately" after +evaluation of throw expression is finished, so there is no space left +for stack to be unwound therefore? I think the phrase "in effect +immediately" should be removed from the standard because it brings +ambiguity in understanding. +

+ + +

Proposed resolution:

+ + +

Rationale:

+

There is no contradiction. The phrase "in effect immediately" is + just to clarify which handler is to be called.

+ + + + + +
+

437. Formatted output of function pointers is confusing

+

Section: 27.6.2.6.2 [ostream.inserters.arithmetic] Status: NAD + Submitter: Ivan Godard Date: 2003-10-24

+

View all other issues in [ostream.inserters.arithmetic].

+

View all issues with NAD status.

+

Discussion:

+

+Given: +

+
void f(int) {}
+void(*g)(int) = f;
+cout << g;
+
+ +

+(with the expected #include and usings), the value printed is a rather +surprising "true". Rather useless too. +

+ +

The standard defines:

+ +
ostream& operator<<(ostream&, void*);
+ +

which picks up all data pointers and prints their hex value, but does +not pick up function pointers because there is no default conversion +from function pointer to void*. Absent that, we fall back to legacy +conversions from C and the function pointer is converted to bool. +

+ +

There should be an analogous inserter that prints the address of a + function pointer.

+ + +

Proposed resolution:

+ + +

Rationale:

+

This is indeed a wart, but there is no good way to solve it. C + doesn't provide a portable way of outputting the address of a + function point either.

+ + + + + +
+

439. Should facets be copyable?

+

Section: 22.2 [locale.categories] Status: NAD + Submitter: Matt Austern Date: 2003-11-02

+

View other active issues in [locale.categories].

+

View all other issues in [locale.categories].

+

View all issues with NAD status.

+

Discussion:

+

The following facets classes have no copy constructors described in + the standard, which, according to the standard, means that they are + supposed to use the compiler-generated defaults. Default copy + behavior is probably inappropriate. We should either make these + classes uncopyable or else specify exactly what their constructors do.

+ +

Related issue: 421.

+ +
        ctype_base
+        ctype
+        ctype_byname
+        ctype<char>
+        ctype_byname<char>
+        codecvt_base
+        codecvt
+        codecvt_byname
+        num_get
+        num_put
+        numpunct
+        numpunct_byname
+        collate
+        collate_byname
+        time_base
+        time_get
+        time_get_byname
+        time_put
+        time_put_byname
+        money_get
+        money_put
+        money_base
+        moneypunct
+        moneypunct_byname
+        messages_base
+        messages
+        messages_byname
+
+ + + +

Proposed resolution:

+ + +

Rationale:

+

The copy constructor in the base class is private.

+ + + + + +
+

440. Should std::complex use unqualified transcendentals?

+

Section: 26.3.8 [complex.transcendentals] Status: NAD + Submitter: Matt Austern Date: 2003-11-05

+

View all issues with NAD status.

+

Discussion:

+

+Operations like pow and exp on +complex<T> are typically implemented in terms of +operations like sin and cos on T. +Should implementations write this as std::sin, or as plain +unqualified sin? +

+ +

The issue, of course, is whether we want to use +argument-dependent lookup in the case where T is a +user-defined type. This is similar to the issue of valarray +transcendentals, as discussed in issue 226.

+ +

This issue differs from valarray transcendentals in two important +ways. First, "the effect of instantiating the template +complex for types other than float, double or long double is +unspecified." (26.3.1 [complex.synopsis]) Second, the standard does not +dictate implementation, so there is no guarantee that a particular +real math function is used in the implementation of a particular +complex function.

+ + + +

Proposed resolution:

+ + +

Rationale:

+

If you instantiate std::complex for user-defined types, all bets +are off.

+ + + + + +
+

447. Wrong template argument for time facets

+

Section: 22.1.1.1.1 [locale.category] Status: Dup + Submitter: Pete Becker Date: 2003-12-26

+

View all other issues in [locale.category].

+

View all issues with Dup status.

+

Duplicate of: 327

+

Discussion:

+

+22.1.1.1.1/4, table 52, "Required Instantiations", lists, among others: +

+
    time_get<char,InputIterator>
+    time_get_byname<char,InputIterator>
+    time_get<wchar_t,OutputIterator>
+    time_get_byname<wchar_t,OutputIterator>
+
+ +

+The second argument to the last two should be InputIterator, not +OutputIterator. +

+ + +

Proposed resolution:

+

+Change the second template argument to InputIterator. +

+ + +

Rationale:

+ + + + + + +
+

450. set::find is inconsistent with associative container requirements

+

Section: 23.3.3 [set] Status: Dup + Submitter: Bill Plauger Date: 2004-01-30

+

View all other issues in [set].

+

View all issues with Dup status.

+

Duplicate of: 214

+

Discussion:

+

map/multimap have:

+ +
	iterator find(const key_type& x) const;
+	const_iterator find(const key_type& x) const;
+
+ +

+which is consistent with the table of associative container requirements. +But set/multiset have: +

+
	iterator find(const key_type&) const;
+
+ +

+set/multiset should look like map/multimap, and honor the requirements +table, in this regard. +

+ + +

Proposed resolution:

+ + +

Rationale:

+ + + + + + +
+

451. Associative erase should return an iterator

+

Section: 23.1.2 [associative.reqmts], 23.3 [associative] Status: Dup + Submitter: Bill Plauger Date: 2004-01-30

+

View all other issues in [associative.reqmts].

+

View all issues with Dup status.

+

Duplicate of: 130

+

Discussion:

+

map/multimap/set/multiset have:

+
	void erase(iterator);
+	void erase(iterator, iterator);
+
+ +

But there's no good reason why these can't return an iterator, as for +vector/deque/list:

+
	iterator erase(iterator);
+	iterator erase(iterator, iterator);
+
+ + + +

Proposed resolution:

+

+Informally: The table of associative container requirements, and the +relevant template classes, should return an iterator designating the +first element beyond the erased subrange. +

+ + +

Rationale:

+ + + + + + +
+

452. locale::combine should be permitted to generate a named locale

+

Section: 22.1.1.3 [locale.members] Status: NAD + Submitter: Bill Plauger Date: 2004-01-30

+

View all other issues in [locale.members].

+

View all issues with NAD status.

+

Discussion:

+
template<class Facet>
+	locale::combine(const locale&) const;
+
+

+is obliged to create a locale that has no name. This is overspecification +and overkill. The resulting locale should follow the usual rules -- it +has a name if the locale argument has a name and Facet is one of the +standard facets. +

+ +

[ + Sydney and post-Sydney (see c++std-lib-13439, c++std-lib-13440, + c++std-lib-13443): agreed that it's overkill to say that the locale + is obligated to be nameless. However, we also can't require it to + have a name. At the moment, locale names are based on categories + and not on individual facets. If a locale contains two different + facets of different names from the same category, then this would + not fit into existing naming schemes. We need to give + implementations more freedom. Bill will provide wording. +]

+ + + + +

Rationale:

+

After further discussion the LWG decided to close this as NAD. + The fundamental problem is that names right now are per-category, + not per-facet. The combine member function works at the + wrong level of granularity.

+ + + + + +
+

463. auto_ptr usability issues

+

Section: D.9.1 [auto.ptr] Status: NAD + Submitter: Rani Sharoni Date: 2003-12-07

+

View all other issues in [auto.ptr].

+

View all issues with NAD status.

+

Discussion:

+ +

+TC1 CWG DR #84 effectively made the template<class Y> operator auto_ptr<Y>() +member of auto_ptr (20.4.5.3/4) obsolete. +

+ +

+The sole purpose of this obsolete conversion member is to enable copy +initialization base from r-value derived (or any convertible types like +cv-types) case: +

+
#include <memory>
+using std::auto_ptr;
+
+struct B {};
+struct D : B {};
+
+auto_ptr<D> source();
+int sink(auto_ptr<B>);
+int x1 = sink( source() ); // #1 EDG - no suitable copy constructor
+
+ +

+The excellent analysis of conversion operations that was given in the final +auto_ptr proposal +(http://anubis.dkuug.dk/jtc1/sc22/wg21/docs/papers/1997/N1128.pdf) +explicitly specifies this case analysis (case 4). DR #84 makes the analysis +wrong and actually comes to forbid the loophole that was exploited by the +auto_ptr designers. +

+ +

+I didn't encounter any compliant compiler (e.g. EDG, GCC, BCC and VC) that +ever allowed this case. This is probably because it requires 3 user defined +conversions and in fact current compilers conform to DR #84. +

+ +

+I was surprised to discover that the obsolete conversion member actually has +negative impact of the copy initialization base from l-value derived +case:

+
auto_ptr<D> dp;
+int x2 = sink(dp); // #2 EDG - more than one user-defined conversion applies
+
+ +

+I'm sure that the original intention was allowing this initialization using +the template<class Y> auto_ptr(auto_ptr<Y>& a) constructor (20.4.5.1/4) but +since in this copy initialization it's merely user defined conversion (UDC) +and the obsolete conversion member is UDC with the same rank (for the early +overloading stage) there is an ambiguity between them. +

+ +

+Removing the obsolete member will have impact on code that explicitly +invokes it: +

+
int y = sink(source().operator auto_ptr<B>());
+
+ +

+IMHO no one ever wrote such awkward code and the reasonable workaround for +#1 is: +

+
int y = sink( auto_ptr<B>(source()) );
+
+ +

+I was even more surprised to find out that after removing the obsolete +conversion member the initialization was still ill-formed: +int x3 = sink(dp); // #3 EDG - no suitable copy constructor +

+ +

+This copy initialization semantically requires copy constructor which means +that both template conversion constructor and the auto_ptr_ref conversion +member (20.4.5.3/3) are required which is what was explicitly forbidden in +DR #84. This is a bit amusing case in which removing ambiguity results with +no candidates. +

+ +

+I also found exception safety issue with auto_ptr related to auto_ptr_ref: +

+
int f(auto_ptr<B>, std::string);
+auto_ptr<B> source2();
+
+// string constructor throws while auto_ptr_ref
+// "holds" the pointer
+int x4 = f(source2(), "xyz"); // #4
+
+ +

+The theoretic execution sequence that will cause a leak: +

+
    +
  1. call auto_ptr<B>::operator auto_ptr_ref<B>()
  2. +
  3. call string::string(char const*) and throw
  4. +
+ +

+According to 20.4.5.3/3 and 20.4.5/2 the auto_ptr_ref conversion member +returns auto_ptr_ref<Y> that holds *this and this is another defect since +the type of *this is auto_ptr<X> where X might be different from Y. Several +library vendors (e.g. SGI) implement auto_ptr_ref<Y> with Y* as member which +is much more reasonable. Other vendor implemented auto_ptr_ref as +defectively required and it results with awkward and catastrophic code: +int oops = sink(auto_ptr<B>(source())); // warning recursive on all control +paths +

+ +

+Dave Abrahams noticed that there is no specification saying that +auto_ptr_ref copy constructor can't throw. +

+ +

+My proposal comes to solve all the above issues and significantly simplify +auto_ptr implementation. One of the fundamental requirements from auto_ptr +is that it can be constructed in an intuitive manner (i.e. like ordinary +pointers) but with strict ownership semantics which yield that source +auto_ptr in initialization must be non-const. My idea is to add additional +constructor template with sole propose to generate ill-formed, diagnostic +required, instance for const auto_ptr arguments during instantiation of +declaration. This special constructor will not be instantiated for other +types which is achievable using 14.8.2/2 (SFINAE). Having this constructor +in hand makes the constructor template<class Y> auto_ptr(auto_ptr<Y> const&) +legitimate since the actual argument can't be const yet non const r-value +are acceptable. +

+ +

+This implementation technique makes the "private auxiliary class" +auto_ptr_ref obsolete and I found out that modern C++ compilers (e.g. EDG, +GCC and VC) consume the new implementation as expected and allow all +intuitive initialization and assignment cases while rejecting illegal cases +that involve const auto_ptr arguments. +

+ +

The proposed auto_ptr interface:

+ +
namespace std {
+    template<class X> class auto_ptr {
+    public:
+        typedef X element_type;
+
+        // 20.4.5.1 construct/copy/destroy:
+        explicit auto_ptr(X* p=0) throw();
+        auto_ptr(auto_ptr&) throw();
+        template<class Y> auto_ptr(auto_ptr<Y> const&) throw();
+        auto_ptr& operator=(auto_ptr&) throw();
+        template<class Y> auto_ptr& operator=(auto_ptr<Y>) throw();
+        ~auto_ptr() throw();
+
+        // 20.4.5.2 members:
+        X& operator*() const throw();
+        X* operator->() const throw();
+        X* get() const throw();
+        X* release() throw();
+        void reset(X* p=0) throw();
+
+    private:
+        template<class U>
+        auto_ptr(U& rhs, typename
+unspecified_error_on_const_auto_ptr<U>::type = 0);
+    };
+}
+
+ +

+One compliant technique to implement the unspecified_error_on_const_auto_ptr +helper class is using additional private auto_ptr member class template like +the following: +

+
template<typename T> struct unspecified_error_on_const_auto_ptr;
+
+template<typename T>
+struct unspecified_error_on_const_auto_ptr<auto_ptr<T> const>
+{ typedef typename auto_ptr<T>::const_auto_ptr_is_not_allowed type; };
+
+ +

+There are other techniques to implement this helper class that might work +better for different compliers (i.e. better diagnostics) and therefore I +suggest defining its semantic behavior without mandating any specific +implementation. IMO, and I didn't found any compiler that thinks otherwise, +14.7.1/5 doesn't theoretically defeat the suggested technique but I suggest +verifying this with core language experts. +

+ +

Further changes in standard text:

+

Remove section 20.4.5.3

+ +

Change 20.4.5/2 to read something like: +Initializing auto_ptr<X> from const auto_ptr<Y> will result with unspecified +ill-formed declaration that will require unspecified diagnostic.

+ +

Change 20.4.5.1/4,5,6 to read:

+ +
template<class Y> auto_ptr(auto_ptr<Y> const& a) throw();
+

4 Requires: Y* can be implicitly converted to X*.

+

5 Effects: Calls const_cast<auto_ptr<Y>&>(a).release().

+

6 Postconditions: *this holds the pointer returned from a.release().

+ +

Change 20.4.5.1/10

+
template<class Y> auto_ptr& operator=(auto_ptr<Y> a) throw();
+
+

+10 Requires: Y* can be implicitly converted to X*. The expression delete +get() is well formed. +

+ +

LWG TC DR #127 is obsolete.

+ +

+Notice that the copy constructor and copy assignment operator should remain +as before and accept non-const auto_ptr& since they have effect on the form +of the implicitly declared copy constructor and copy assignment operator of +class that contains auto_ptr as member per 12.8/5,10: +

+
struct X {
+    // implicit X(X&)
+    // implicit X& operator=(X&)
+    auto_ptr<D> aptr_;
+};
+
+ +

+In most cases this indicates about sloppy programming but preserves the +current auto_ptr behavior. +

+ +

+Dave Abrahams encouraged me to suggest fallback implementation in case that +my suggestion that involves removing of auto_ptr_ref will not be accepted. +In this case removing the obsolete conversion member to auto_ptr<Y> and +20.4.5.3/4,5 is still required in order to eliminate ambiguity in legal +cases. The two constructors that I suggested will co exist with the current +members but will make auto_ptr_ref obsolete in initialization contexts. +auto_ptr_ref will be effective in assignment contexts as suggested in DR +#127 and I can't see any serious exception safety issues in those cases +(although it's possible to synthesize such). auto_ptr_ref<X> semantics will +have to be revised to say that it strictly holds pointer of type X and not +reference to an auto_ptr for the favor of cases in which auto_ptr_ref<Y> is +constructed from auto_ptr<X> in which X is different from Y (i.e. assignment +from r-value derived to base). +

+ + + +

Proposed resolution:

+

[Redmond: punt for the moment. We haven't decided yet whether we + want to fix auto_ptr for C++-0x, or remove it and replace it with + move_ptr and unique_ptr.]

+ + + +

Rationale:

+

+Recommend NAD. We're just going to deprecate it. It still works for simple use cases +and people know how to deal with it. Going forward unique_ptr is the recommended +tool. +

+ + + + + +
+

466. basic_string ctor should prevent null pointer error

+

Section: 21.3.1 [string.require] Status: NAD + Submitter: Daniel Frey Date: 2004-06-10

+

View all other issues in [string.require].

+

View all issues with NAD status.

+

Discussion:

+

+Today, my colleagues and me wasted a lot of time. After some time, I +found the problem. It could be reduced to the following short example: +

+ +
  #include <string>
+  int main() { std::string( 0 ); }
+
+ +

The problem is that the tested compilers (GCC 2.95.2, GCC 3.3.1 and +Comeau online) compile the above without errors or warnings! The +programs (at least for the GCC) resulted in a SEGV.

+ +

I know that the standard explicitly states that the ctor of string +requires a char* which is not zero. STLs could easily detect the above +case with a private ctor for basic_string which takes a single 'int' +argument. This would catch the above code at compile time and would not +ambiguate any other legal ctors.

+ +

[Redmond: No great enthusiasm for doing this. If we do, + however, we want to do it for all places that take charT* + pointers, not just the single-argument constructor. The other + question is whether we want to catch this at compile time (in which + case we catch the error of a literal 0, but not an expression whose + value is a null pointer), at run time, or both.]

+ + + + +

Proposed resolution:

+ + +

Rationale:

+

+Recommend NAD. Relegate this functionality to debugging implementations. +

+ + + + + +
+

470. accessing containers from their elements' special functions

+

Section: 23 [containers] Status: NAD + Submitter: Martin Sebor Date: 2004-06-28

+

View all other issues in [containers].

+

View all issues with NAD status.

+

Discussion:

+ +

+The standard doesn't prohibit the destructors (or any other special +functions) of containers' elements invoked from a member function +of the container from "recursively" calling the same (or any other) +member function on the same container object, potentially while the +container is in an intermediate state, or even changing the state +of the container object while it is being modified. This may result +in some surprising (i.e., undefined) behavior. +

+ +

Read email thread starting with c++std-lib-13637 for more.

+ + + +

Proposed resolution:

+ +

Add to Container Requirements the following new paragraph:

+ +
    Unless otherwise specified, the behavior of a program that
+    invokes a container member function f from a member function
+    g of the container's value_type on a container object c that
+    called g from its mutating member function h, is undefined.
+    I.e., if v is an element of c, directly or indirectly calling
+    c.h() from v.g() called from c.f(), is undefined.
+
+ +

[Redmond: This is a real issue, but it's probably a clause 17 + issue, not clause 23. We get the same issue, for example, if we + try to destroy a stream from one of the stream's callback functions.]

+ + + + +

Rationale:

+

+Recommend NAD. We agree this is an issue, but not a defect. +We believe that there is no wording we can put in the standard +that will cover all cases without introducing unfortunate +corner cases. +

+ + + + + +
+

472. Missing "Returns" clause in std::equal_range

+

Section: 25.3.3.3 [equal.range] Status: Dup + Submitter: Prateek R Karandikar Date: 2004-06-30

+

View all other issues in [equal.range].

+

View all issues with Dup status.

+

Duplicate of: 270

+

Discussion:

+

+There is no "Returns:" clause for std::equal_range, which returns non-void. +

+ + +

Proposed resolution:

+ + +

Rationale:

+

Fixed as part of issue 270.

+ + + + + + +
+

476. Forward Iterator implied mutability

+

Section: 24.1.3 [forward.iterators] Status: NAD + Submitter: Dave Abrahams Date: 2004-07-09

+

View all other issues in [forward.iterators].

+

View all issues with NAD status.

+

Discussion:

+ +

24.1/3 says:

+

+ Forward iterators satisfy all the requirements of the input and + output iterators and can be used whenever either kind is specified +

+ +

+The problem is that satisfying the requirements of output iterator +means that you can always assign *something* into the result of +dereferencing it. That makes almost all non-mutable forward +iterators non-conforming. I think we need to sever the refinement +relationship between forward iterator and output iterator. +

+ +

Related issue: 200. But this is not a dup.

+ + + +

Proposed resolution:

+ + +

Rationale:

+

Yes, 24.1/3 does say that. But it's introductory material. The +precise specification is in 24.1.3, and the requrements table there is +right. We don't need to fine-tune introductory wording. (Especially +since this wording is likely to be changed as part of the iterator +overhaul.)

+ + + + + +
+

477. Operator-> for const forward iterators

+

Section: 24.1.3 [forward.iterators] Status: Dup + Submitter: Dave Abrahams Date: 2004-07-11

+

View all other issues in [forward.iterators].

+

View all issues with Dup status.

+

Duplicate of: 478

+

Discussion:

+

+The Forward Iterator requirements table contains the following: +

+
 expression  return type         operational  precondition
+                                  semantics
+  ==========  ==================  ===========  ==========================
+  a->m        U& if X is mutable, (*a).m       pre: (*a).m is well-defined.
+              otherwise const U&
+
+  r->m        U&                  (*r).m       pre: (*r).m is well-defined.
+
+ +

+The first line is exactly right. The second line is wrong. Basically +it implies that the const-ness of the iterator affects the const-ness +of referenced members. But Paragraph 11 of [lib.iterator.requirements] says: +

+ +

+ In the following sections, a and b denote values of type const X, n + denotes a value of the difference type Distance, u, tmp, and m + denote identifiers, r denotes a value of X&, t denotes a value of + value type T, o denotes a value of some type that is writable to + the output iterator. +

+ +

AFAICT if we need the second line at all, it should read the same +as the first line.

+ +

Related issue: 478

+ + +

Proposed resolution:

+ + +

Rationale:

+

The LWG agrees that this is a real problem. Marked as a DUP + because the LWG chose to adopt the solution proposed in + 478. +

+ + + + + +
+

479. Container requirements and placement new

+

Section: 23.1 [container.requirements] Status: Dup + Submitter: Herb Sutter Date: 2004-08-01

+

View other active issues in [container.requirements].

+

View all other issues in [container.requirements].

+

View all issues with Dup status.

+

Duplicate of: 580

+

Discussion:

+

Nothing in the standard appears to make this program ill-formed:

+ +
  struct C {
+    void* operator new( size_t s ) { return ::operator new( s ); }
+    // NOTE: this hides in-place and nothrow new
+  };
+
+  int main() {
+    vector<C> v;
+    v.push_back( C() );
+  }
+
+ +

Is that intentional? We should clarify whether or not we intended + to require containers to support types that define their own special + versions of operator new.

+ +

[ +Lillehammer: A container will definitely never use this overridden +operator new, but whether it will fail to compile is unclear from the +standard. Are containers supposed to use qualified or unqualified +placement new? 20.4.1.1 is somewhat relevant, but the standard +doesn't make it completely clear whether containers have to use +Allocator::construct(). If containers don't use it, the details of how +containers use placement new are unspecified. That is the real bug, +but it needs to be fixed as part of the allocator overhaul. Weak +support that the eventual solution should make this code well formed. +]

+ + + + +

Proposed resolution:

+ + + + + + + +
+

480. unary_function and binary_function should have protected nonvirtual destructors

+

Section: 20.5.3 [base] Status: NAD + Submitter: Joe Gottman Date: 2004-08-19

+

View all other issues in [base].

+

View all issues with NAD status.

+

Discussion:

+

The classes std::unary_function and std::binary_function are both +designed to be inherited from but contain no virtual functions. This +makes it too easy for a novice programmer to write code like +binary_function<int, int, int> *p = new plus<int>; delete p;

+ +

There are two common ways to prevent this source of undefined +behavior: give the base class a public virtual destructor, or give it +a protected nonvirtual destructor. Since unary_function and +binary_function have no other virtual functions, (note in particular +the absence of an operator()() ), it would cost too much to give them +public virtual destructors. Therefore, they should be given protected +nonvirtual destructors.

+ + +

Proposed resolution:

+

Change Paragraph 20.3.1 of the Standard from

+
    template <class Arg, class Result>
+    struct unary_function {
+        typedef Arg argument_type;
+        typedef Result result_type;
+    };
+
+    template <class Arg1, class Arg2, class Result>
+    struct binary_function {
+        typedef Arg1 first_argument_type;
+        typedef Arg2 second_argument_type;
+        typedef Result result_type;
+    };
+
+ +

to

+
    template <class Arg, class Result>
+        struct unary_function {
+        typedef Arg argument_type;
+        typedef Result result_type;
+    protected:
+        ~unary_function() {}
+    };
+
+    template <class Arg1, class Arg2, class Result>
+    struct binary_function {
+        typedef Arg1 first_argument_type;
+        typedef Arg2 second_argument_type;
+        typedef Result result_type;
+    protected:
+        ~binary_function() {}
+    };
+
+ + +

Rationale:

+

The LWG doesn't believe the existing definition causes anybody any + concrete harm.

+ + + + + +
+

481. unique's effects on the range [result, last)

+

Section: 25.2.9 [alg.unique] Status: NAD + Submitter: Andrew Koenig Date: 2004-08-30

+

View all other issues in [alg.unique].

+

View all issues with NAD status.

+

Discussion:

+

+The standard says that unique(first, last) "eliminates all but the +first element from every consecutive group of equal elements" in +[first, last) and returns "the end of the resulting range". So a +postcondition is that [first, result) is the same as the old [first, +last) except that duplicates have been eliminated. +

+ +

What postconditions are there on the range [result, last)? One + might argue that the standard says nothing about those values, so + they can be anything. One might also argue that the standard + doesn't permit those values to be changed, so they must not be. + Should the standard say something explicit one way or the other?

+ + + +

Proposed resolution:

+

+

+ + +

Rationale:

+

We don't want to make many guarantees about what's in [result, +end). Maybe we aren't being quite explicit enough about not being +explicit, but it's hard to think that's a major problem.

+ + + + + +
+

482. Swapping pairs

+

Section: 20.2.3 [pairs], 20.3 [tuple] Status: NAD Editorial + Submitter: Andrew Koenig Date: 2004-09-14

+

View all other issues in [pairs].

+

View all issues with NAD Editorial status.

+

Discussion:

+

(Based on recent comp.std.c++ discussion)

+ +

Pair (and tuple) should specialize std::swap to work in terms of +std::swap on their components. For example, there's no obvious reason +why swapping two objects of type pair<vector<int>, +list<double> > should not take O(1).

+ +

[Lillehammer: We agree it should be swappable. Howard will + provide wording.]

+ + +

[ +Post Oxford: We got swap for pair but accidently +missed tuple. tuple::swap is being tracked by 522. +]

+ + + + +

Proposed resolution:

+

+Wording provided in +N1856. +

+ +

Rationale:

+

+Recommend NAD, fixed by +N1856. +

+ + + + + +
+

483. Heterogeneous equality and EqualityComparable

+

Section: 25.1 [alg.nonmodifying], 25.2 [alg.modifying.operations] Status: Dup + Submitter: Peter Dimov Date: 2004-09-20

+

View all issues with Dup status.

+

Duplicate of: 283

+

Discussion:

+

c++std-lib-14262

+ +

[lib.alg.find] requires T to be EqualityComparable:

+ +
template <class InputIterator, class T>
+   InputIterator find(InputIterator first, InputIterator last,
+                      const T& value);
+
+ +

+However the condition being tested, as specified in the Effects +clause, is actually *i == value, where i is an InputIterator. +

+ +

+The two clauses are in agreement only if the type of *i is T, but this +isn't necessarily the case. *i may have a heterogeneous comparison +operator that takes a T, or a T may be convertible to the type of *i. +

+ +

Further discussion (c++std-lib-14264): this problem affects a + number of algorithsm in clause 25, not just find. We + should try to resolve this problem everywhere it appears.

+ + +

Proposed resolution:

+ +

[lib.alg.find]:

+

+ Remove [lib.alg.find]/1. +

+ +

[lib.alg.count]:

+

+ Remove [lib.alg.count]/1. +

+ +

[lib.alg.search]:

+

+ Remove "Type T is EqualityComparable (20.1.1), " from [lib.alg.search]/4. +

+ +

[lib.alg.replace]:

+ +
+

+ Remove [lib.alg.replace]/1. + Replace [lb.alg.replace]/2 with: +

+ +

+ For every iterator i in the range [first, last) for which *i == value + or pred(*i) holds perform *i = new_value. +

+ +

+ Remove the first sentence of /4. + Replace the beginning of /5 with: +

+ +

+ For every iterator i in the range [result, result + (last - + first)), assign to *i either... +

+ +

(Note the defect here, current text says assign to i, not *i).

+
+ +

[lib.alg.fill]:

+ +
+

+ Remove "Type T is Assignable (23.1), " from /1. + Replace /2 with: +

+ +

+ For every iterator i in the range [first, last) or [first, first + n), + perform *i = value. +

+
+ +

[lib.alg.remove]:

+

+ Remove /1. + Remove the first sentence of /6. +

+ + + +

Rationale:

+

Duplicate of (a subset of) issue 283.

+ + + + + + +
+

486. min/max CopyConstructible requirement is too strict

+

Section: 25.3.7 [alg.min.max] Status: Dup + Submitter: Dave Abrahams Date: 2004-10-13

+

View all other issues in [alg.min.max].

+

View all issues with Dup status.

+

Duplicate of: 281

+

Discussion:

+

A straightforward implementation of these algorithms does not need to +copy T.

+ + +

Proposed resolution:

+

drop the the words "and CopyConstructible" from paragraphs 1 and 4

+ + +

Rationale:

+ + + + + + +
+

487. Allocator::construct is too limiting

+

Section: 20.1.2 [allocator.requirements] Status: NAD + Submitter: Dhruv Matani Date: 2004-10-17

+

View other active issues in [allocator.requirements].

+

View all other issues in [allocator.requirements].

+

View all issues with NAD status.

+

Discussion:

+

+The standard's version of allocator::construct(pointer, +const_reference) severely limits what you can construct using this +function. Say you can construct a socket from a file descriptor. Now, +using this syntax, I first have to manually construct a socket from +the fd, and then pass the constructed socket to the construct() +function so it will just to an uninitialized copy of the socket I +manually constructed. Now it may not always be possible to copy +construct a socket eh! So, I feel that the changes should go in the +allocator::construct(), making it: +

+
    template<typename T>
+    struct allocator{
+      template<typename T1>
+      void construct(pointer T1 const& rt1);
+    };
+
+ +

+Now, the ctor of the class T which matches the one that takes a T1 can +be called! Doesn't that sound great? +

+ + +

Proposed resolution:

+ + +

Rationale:

+

NAD. STL uses copying all the time, and making it possible for + allocators to construct noncopyable objects is useless in the + absence of corresponding container changes. We might consider this + as part of a larger redesign of STL.

+ + + + + +
+

489. std::remove / std::remove_if wrongly specified

+

Section: 25.2.8 [alg.remove] Status: NAD + Submitter: Thomas Mang Date: 2004-12-12

+

View all other issues in [alg.remove].

+

View all issues with NAD status.

+

Discussion:

+

In Section 25.2.7 [lib.alg.remove], paragraphs 1 to 5 describe the +behavior of the mutating sequence operations std::remove and +std::remove_if. However, the wording does not reflect the intended +behavior [Note: See definition of intended behavior below] of these +algorithms, as it is known to the C++ community [1]. +

+ + + +

1) Analysis of current wording:

+ + +

25.2.7 [lib.alg.remove], paragraph 2:

+ +

Current wording says: +"Effects: Eliminates all the elements referred to by iterator i in the +range [first, last) for which the following corresponding conditions +hold: *i == value, pred(*i) != false."

+ +

+This sentences expresses specifically that all elements denoted by the +(original) range [first, last) for which the corresponding condition +hold will be eliminated. Since there is no formal definition of the term +"eliminate" provided, the meaning of "eliminate" in everyday language +implies that as postcondition, no element in the range denoted by +[first, last) will hold the corresponding condition on reiteration over +the range [first, last). +

+ +

+However, this is neither the intent [Note: See definition of intended +behavior below] nor a general possible approach. It can be easily proven +that if all elements of the original range[first, last) will hold the +condition, it is not possible to substitute them by an element for which +the condition will not hold. +

+ + +

25.2.7 [lib.alg.remove], paragraph 3:

+ +

+Current wording says: +"Returns: The end of the resulting range." +

+ +

+The resulting range is not specified. In combination with 25.2.7 +[lib.alg.remove], paragraph 2, the only reasonable interpretation of +this so-called resulting range is the range [first,last) - thus +returning always the ForwardIterator 'last' parameter. +

+ + +

+25.2.7 [lib.alg.remove], paragraph 4: +

+ +

+Current wording says: +"Notes: Stable: the relative order of the elements that are not removed +is the same as their relative order in the original range" +

+ +

+This sentences makes use of the term "removed", which is neither +specified, nor used in a previous paragraph (which uses the term +"eliminate"), nor unamgiuously separated from the name of the algorithm. +

+ + +

2) Description of intended behavior:

+ +

+For the rest of this Defect Report, it is assumed that the intended +behavior was that all elements of the range [first, last) which do not +hold the condition *i == value (std::remove) or pred(*i) != false +(std::remove_if)], call them s-elements [Note: s...stay], will be placed +into a contiguous subrange of [first, last), denoted by the iterators +[first, return value). The number of elements in the resulting range +[first, return value) shall be equal to the number of s-elements in the +original range [first, last). The relative order of the elements in the +resulting subrange[first, return value) shall be the same as the +relative order of the corresponding elements in the original range. It +is undefined whether any elements in the resulting subrange [return +value, last) will hold the corresponding condition, or not. +

+ +

+All implementations known to the author of this Defect Report comply +with this intent. Since the intent of the behavior (contrary to the +current wording) is also described in various utility references serving +the C++ community [1], it is not expected that fixing the paragraphs +will influence current code - unless the code relies on the behavior as +it is described by current wording and the implementation indeed +reflects the current wording, and not the intent. +

+ + + +

3) Proposed fixes:

+ + +

Change 25.2.7 [lib.alg.remove], paragraph 2 to:

+ +

+"Effect: Places all the elements referred to by iterator i in the range +[first, last) for which the following corresponding conditions hold : +!(*i == value), pred(*i) == false into the subrange [first, k) of the +original range, where k shall denote a value of type ForwardIterator. It +is undefined whether any elements in the resulting subrange [k, last) +will hold the corresponding condition, or not." +

+ +

Comments to the new wording:

+ +

+a) "Places" has no special meaning, and the everyday language meaning +should fit. +b) The corresponding conditions were negated compared to the current +wording, becaue the new wording requires it. +c) The wording "of the original range" might be redundant, since any +subrange starting at 'first' and containing no more elements than the +original range is implicitly a subrange of the original range [first, +last). +d) The iterator k was introduced instead of "return value" in order to +avoid a cyclic dependency on 25.2.7/3. The wording ", where k shall +denote a value of type ForwardIterator" might be redundant, because it +follows implicitly by 25.2.7/3. +e) "Places" does, in the author's opinion, explicitly forbid duplicating +any element holding the corresponding condition in the original range +[first, last) within the resulting range [first, k). If there is doubt +this term might be not unambiguous regarding this, it is suggested that +k is specified more closely by the following wording: "k shall denote a +value of type ForwardIterator [Note: see d)] so that k - first is equal +to the number of elements in the original range [first, last) for which +the corresponding condition did hold". This could also be expressed as a +separate paragraph "Postcondition:" +f) The senctence "It is undefined whether any elements in the resulting +subrange [k, last) will hold the corresponding condition, or not." was +added consciously so the term "Places" does not imply if the original +range [first, last) contains n elements holding the corresponding +condition, the identical range[first, last) will also contain exactly n +elements holding the corresponding condition after application of the +algorithm. +

+ +

+Change 25.2.7 [lib.alg.remove], paragraph 3 to: + +"Returns: The iterator k." +

+ +

+Change 25.2.7 [lib.alg.remove], paragraph 4 to: + +"Notes: Stable: the relative order of the elements that are placed into +the subrange [first, return value) shall be the same as their relative +order was in the original range [first, last) prior to application of +the algorithm." +

+ +

+Comments to the new wording: +

+ +

+a) the wording "was ... prior to application of the algorithm" is used +to explicitly distinguish the original range not only by means of +iterators, but also by a 'chronological' factor from the resulting range +[first, return value). It might be redundant. +

+ +

+[1]: +The wording of these references is not always unambiguous, and provided +examples partially contradict verbal description of the algorithms, +because the verbal description resembles the problematic wording of +ISO/IEC 14882:2003. +

+ + +

Proposed resolution:

+ + +

Rationale:

+

The LWG believes that the standard is sufficiently clear, and that + there is no evidence of any real-world confusion about this point.

+ + + + + +
+

490. std::unique wrongly specified

+

Section: 25.2.9 [alg.unique] Status: NAD + Submitter: Thomas Mang Date: 2004-12-12

+

View all other issues in [alg.unique].

+

View all issues with NAD status.

+

Discussion:

+

In Section 25.2.8 [lib.alg.unique], paragraphs 1 to 3 describe the +behavior of the mutating sequence operation std::unique. However, the +wording does not reflect the intended behavior [Note: See definition of +intended behavior below] of these algorithms, as it is known to the C++ +community [1].

+ + + +

1) Analysis of current wording:

+ + +

25.2.8 [lib.alg.unique], paragraph 1:

+ +

+Current wording says: +"Effects: Eliminates all but the first element from every consecutive +group of equal elements referred to by the iterator i in the range +[first, last) for which the following corresponding conditions hold: *i +== *(i - 1) or pred(*i, *(i -1)) != false" +

+ +

+This sentences expresses specifically that all elements denoted by the +(original) range [first, last) which are not but the first element from +a consecutive group of equal elements (where equality is defined as *i +== *(i - 1) or pred(*i, *(i - 1)) ! = false) [Note: See DR 202], call +them r-elements [Note: r...remove], will be eliminated. Since there is +no formal definition of the term "eliminate" provided, it is undefined +how this "elimination" takes place. But the meaning of "eliminate" in +everyday language seems to disallow explicitly that after application of +the algorithm, any r-element will remain at any position of the range +[first, last) [2]. +

+ +

+Another defect in the current wording concerns the iterators used to +compare two elements for equality: The current wording contains the +expression "(i - 1)", which is not covered by 25/9 [Note: See DR +submitted by Thomas Mang regarding invalid iterator arithmetic +expressions]. +

+ + +

+25.2.8 [lib.alg.unique], paragraph 2: +

+

Current wording says: +"Returns: The end of the resulting range."

+ +

+The resulting range is not specified. In combination with 25.2.8 +[lib.alg.unique], paragraph 1, one reasonable interpretation (in the +author's opinion even the only possible interpretation) of this +so-called resulting range is the range [first, last) - thus returning +always the ForwardIterator 'last' parameter. +

+ +

2) Description of intended behavior:

+ +

+For the rest of this Defect Report, it is assumed that the intended +behavior was that all elements denoted by the original range [first, +last) which are the first element from a consecutive group of elements +for which the corresponding conditions: *(i-1) == *i (for the version of +unique without a predicate argument) or pred(*(i-1), *i) ! = false (for +the version of unique with a predicate argument) [Note: If such a group +of elements consists of only a single element, this is also considered +the first element] [Note: See resolutions of DR 202], call them +s-elements [Note: s...stay], will be placed into a contiguous subrange +of [first, last), denoted by the iterators [first, return value). The +number of elements in the resulting range [first, return value) shall be +equal to the number of s-elements in the original range [first, last). +Invalid iterator arithmetic expressions are expected to be resolved as +proposed in DR submitted by Thomas Mang regarding invalid iterator +arithmetic expressions. It is also assumed by the author that the +relative order of the elements in the resulting subrange [first, return +value) shall be the same as the relative order of the corresponding +elements (the s-elements) in the original range [Note: If this was not +intended behavior, the additional proposed paragraph about stable order +will certainly become obsolete]. +Furthermore, the resolutions of DR 202 are partially considered. +

+ +

+All implementations known to the author of this Defect Report comply +with this intent [Note: Except possible effects of DR 202]. Since this +intent of the behavior (contrary to the current wording) is also +described in various utility references serving the C++ community [1], +it is not expected that fixing the paragraphs will influence current +code [Note: Except possible effects of DR 202] - unless the code relies +on the behavior as it is described by current wording and the +implementation indeed reflects the current wording, and not the intent. +

+ + + +

3) Proposed fixes:

+ +

+Change 25.2.8 [lib.alg.unique], paragraph 1 to: +

+ +

+"Effect: Places the first element from every consecutive group of +elements, referred to by the iterator i in the range [first, last), for +which the following conditions hold: *(i-1) == *i (for the version of +unique without a predicate argument) or pred(*(i -1), *i) != false (for +the version of unique with a predicate argument), into the subrange +[first, k) of the original range, where k shall denote a value of type +ForwardIterator." +

+ +

Comments to the new wording:

+ +

+a) The new wording was influenced by the resolutions of DR 202. If DR +202 is resolved in another way, the proposed wording need also +additional review. +b) "Places" has no special meaning, and the everyday language meaning +should fit. +c) The expression "(i - 1)" was left, but is expected that DR submitted +by Thomas Mang regarding invalid iterator arithmetic expressions will +take this into account. +d) The wording "(for the version of unique without a predicate +argument)" and "(for the version of unique with a predicate argument)" +was added consciously for clarity and is in resemblence with current +23.2.2.4 [lib.list.ops], paragraph 19. It might be considered redundant. +e) The wording "of the original range" might be redundant, since any +subrange starting at first and containing no more elements than the +original range is implicitly a subrange of the original range [first, +last). +f) The iterator k was introduced instead of "return value" in order to +avoid a cyclic dependency on 25.2.8 [lib.alg.unique], paragraph 2. The +wording ", where k shall denote a value of type ForwardIterator" might +be redundant, because it follows implicitly by 25.2.8 [lib.alg.unique], +paragraph 2. +g) "Places" does, in the author's opinion, explicitly forbid duplicating +any s-element in the original range [first, last) within the resulting +range [first, k). If there is doubt this term might be not unambiguous +regarding this, it is suggested that k is specified more closely by the +following wording: "k shall denote a value of type ForwardIterator +[Note: See f)] so that k - first is equal to the number of elements in +the original range [first, last) being the first element from every +consecutive group of elements for which the corresponding condition did +hold". This could also be expressed as a separate paragraph +"Postcondition:". +h) If it is considered that the wording is unclear whether it declares +the element of a group which consists of only a single element +implicitly to be the first element of this group [Note: Such an +interpretation could eventually arise especially in case last - first == +1] , the following additional sentence is proposed: "If such a group of +elements consists of only a single element, this element is also +considered the first element." +

+ +

+Change 25.2.8 [lib.alg.unique], paragraph 2 to: +"Returns: The iterator k." +

+ +

+Add a separate paragraph "Notes:" as 25.2.8 [lib.alg.unique], paragraph +2a or 3a, or a separate paragraph "Postcondition:" before 25.2.8 +[lib.alg.unique], paragraph 2 (wording inside {} shall be eliminated if +the preceding expressions are used, or the preceding expressions shall +be eliminated if wording inside {} is used): +

+ +

+"Notes:{Postcondition:} Stable: the relative order of the elements that +are placed into the subrange [first, return value {k}) shall be the same +as their relative order was in the original range [first, last) prior to +application of the algorithm." +

+ +

Comments to the new wording:

+ +

+a) It is assumed by the author that the algorithm was intended to be +stable. +In case this was not the intent, this paragraph becomes certainly +obsolete. +b) The wording "was ... prior to application of the algorithm" is used +to explicitly distinguish the original range not only by means of +iterators, but also by a 'chronological' factor from the resulting range +[first, return value). It might be redundant. +

+ +

+25.2.8 [lib.alg.unique], paragraph 3: +

+

See DR 239.

+ +

+4) References to other DRs: +

+ +

+See DR 202, but which does not address any of the problems described in +this Defect Report [Note: This DR is supposed to complement DR 202]. +See DR 239. +See DR submitted by Thomas Mang regarding invalid iterator arithmetic +expressions. +

+ +

+[1]: +The wording of these references is not always unambiguous, and provided +examples partially contradict verbal description of the algorithms, +because the verbal description resembles the problematic wording of +ISO/IEC 14882:2003. +

+ +

+[2]: +Illustration of conforming implementations according to current wording: +

+ +

+One way the author of this DR considers how this "elimination" could be +achieved by a conforming implementation according to current wording is +by substituting each r-element by _any_ s-element [Note: s...stay; any +non-r-element], since all r-elements are "eliminated". +

+ +

+In case of a sequence consisting of elements being all 'equal' [Note: +See DR 202], substituting each r-element by the single s-element is the +only possible solution according to current wording. +

+ + +

Proposed resolution:

+ + +

Rationale:

+

The LWG believes the standard is sufficiently clear. No +implementers get it wrong, and changing it wouldn't cause any code to +change, so there is no real-world harm here.

+ + + + + +
+

491. std::list<>::unique incorrectly specified

+

Section: 23.2.3.4 [list.ops] Status: NAD + Submitter: Thomas Mang Date: 2004-12-12

+

View all other issues in [list.ops].

+

View all issues with NAD status.

+

Discussion:

+

In Section 23.2.3.4 [list.ops], paragraphs 19 to 21 describe the +behavior of the std::list<T, Allocator>::unique operation. However, the +current wording is defective for various reasons.

+ + + +

+1) Analysis of current wording: +

+ +

23.2.3.4 [list.ops], paragraph 19:

+ +

+Current wording says: +"Effects: Eliminates all but the first element from every consecutive +group of equal elements referred to by the iterator i in the range +[first + 1, last) for which *i == *(i - 1) (for the version of unique +with no argument) or pred(*i, *(i -1)) (for the version of unique with a +predicate argument) holds."

+ +

+This sentences makes use of the undefined term "Eliminates". Although it +is, to a certain degree, reasonable to consider the term "eliminate" +synonymous with "erase", using "Erase" in the first place, as the +wording of 23.2.3.4 [list.ops], paragraph 15 does, would be clearer.

+ +

+The range of the elements referred to by iterator i is "[first + 1, +last)". However, neither "first" nor "last" is defined.

+ +

+The sentence makes three times use of iterator arithmetic expressions ( +"first + 1", "*i == *(i - 1)", "pred(*i, *(i -1))" ) which is not +defined for bidirectional iterator [see DR submitted by Thomas Mang +regarding invalid iterator arithmetic expressions].

+ +

+The same problems as pointed out in DR 202 (equivalence relation / order +of arguments for pred()) apply to this paragraph.

+ +

+23.2.3.4 [list.ops], paragraph 20: +

+ +

+Current wording says: +"Throws: Nothing unless an exception in thrown by *i == *(i-1) or +pred(*i, *(i - 1))"

+ +

+The sentence makes two times use of invalid iterator arithmetic +expressions ( "*i == *(i - 1)", "pred(*i, *(i -1))" ). +

+

+[Note: Minor typos: "in" / missing dot at end of sentence.] +

+ +

+23.2.3.4 [list.ops], paragraph 21:

+ +

+Current wording says: +"Complexity: If the range (last - first) is not empty, exactly (last - +first) - 1 applications of the corresponding predicate, otherwise no +application of the predicate.

+ +

+See DR 315 regarding "(last - first)" not yielding a range.

+ +

+Invalid iterator arithmetic expression "(last - first) - 1" left .

+ + +

2) Description of intended behavior:

+ +

+For the rest of this Defect Report, it is assumed that "eliminate" is +supposed to be synonymous to "erase", that "first" is equivalent to an +iterator obtained by a call to begin(), "last" is equivalent to an +iterator obtained by a call to end(), and that all invalid iterator +arithmetic expressions are resolved as described in DR submitted by +Thomas Mang regarding invalid iterator arithmetic expressions.

+ +

+Furthermore, the resolutions of DR 202 are considered regarding +equivalence relation and order of arguments for a call to pred.

+ +

+All implementations known to the author of this Defect Report comply +with these assumptions, apart from the impact of the alternative +resolution of DR 202. Except for the changes implied by the resolutions +of DR 202, no impact on current code is expected.

+ +

+3) Proposed fixes:

+ +

+Change 23.2.3.4 [list.ops], paragraph 19 to:

+ +

+"Effect: Erases all but the first element from every consecutive group +of elements, referred to by the iterator i in the range [begin(), +end()), for which the following conditions hold: *(i-1) == *i (for the +version of unique with no argument) or pred(*(i-1), *i) != false (for +the version of unique with a predicate argument)."

+ +

+Comments to the new wording:

+ +

+a) The new wording was influenced by DR 202 and the resolutions +presented there. If DR 202 is resolved in another way, the proposed +wording need also additional review. +b) "Erases" refers in the author's opinion unambiguously to the member +function "erase". In case there is doubt this might not be unamgibuous, +a direct reference to the member function "erase" is suggested [Note: +This would also imply a change of 23.2.3.4 [list.ops], paragraph +15.]. +c) The expression "(i - 1)" was left, but is expected that DR submitted +by Thomas Mang regarding invalid iterator arithmetic expressions will +take this into account. +d) The wording "(for the version of unique with no argument)" and "(for +the version of unique with a predicate argument)" was kept consciously +for clarity. +e) "begin()" substitutes "first", and "end()" substitutes "last". The +range need adjustment from "[first + 1, last)" to "[begin(), end())" to +ensure a valid range in case of an empty list. +f) If it is considered that the wording is unclear whether it declares +the element of a group which consists of only a single element +implicitly to be the first element of this group [Note: Such an +interpretation could eventually arise especially in case size() == 1] , +the following additional sentence is proposed: "If such a group of +elements consists of only a single element, this element is also +considered the first element."

+ +

+Change 23.2.3.4 [list.ops], paragraph 20 to:

+ +

+"Throws: Nothing unless an exception is thrown by *(i-1) == *i or +pred(*(i-1), *i)."

+ +

+Comments to the new wording:

+ +

+a) The wording regarding the conditions is identical to proposed +23.2.3.4 [list.ops], paragraph 19. If 23.2.3.4 [list.ops], +paragraph 19 is resolved in another way, the proposed wording need also +additional review. +b) The expression "(i - 1)" was left, but is expected that DR submitted +by Thomas Mang regarding invalid iterator arithmetic expressions will +take this into account. +c) Typos fixed.

+ +

+Change 23.2.3.4 [list.ops], paragraph 21 to:

+ +

+"Complexity: If empty() == false, exactly size() - 1 applications of the +corresponding predicate, otherwise no applications of the corresponding +predicate."

+ +

+Comments to the new wording:

+ +

+a) The new wording is supposed to also replace the proposed resolution +of DR 315, which suffers from the problem of undefined "first" / "last". +

+ +

+5) References to other DRs:

+ +

See DR 202. +See DR 239. +See DR 315. +See DR submitted by Thomas Mang regarding invalid iterator arithmetic +expressions.

+ + + +

Proposed resolution:

+ + +

Rationale:

+

"All implementations known to the author of this Defect Report +comply with these assumption", and "no impact on current code is +expected", i.e. there is no evidence of real-world confusion or +harm.

+ + + + + +
+

493. Undefined Expression in Input Iterator Note Title

+

Section: 24.1.1 [input.iterators] Status: NAD + Submitter: Chris Jefferson Date: 2004-12-13

+

View all other issues in [input.iterators].

+

View all issues with NAD status.

+

Discussion:

+

1) In 24.1.1/3, the following text is currently present.

+ +

"Note: For input iterators, a==b does not imply ++a=++b (Equality does +not guarantee the substitution property or referential transparency)."

+ +

However, when in Table 72, part of the definition of ++r is given as:

+ +

"pre: r is dereferenceable. +post: any copies of the previous value of r are no longer required +either to be dereferenceable ..."

+ +

While a==b does not imply that b is a copy of a, this statement should +perhaps still be made more clear.

+ +

2) There are no changes to intended behaviour

+ +

+3) This Note should be altered to say "Note: For input iterators a==b, +when its behaviour is defined ++a==++b may still be false (Equality does +not guarantee the substitution property or referential transparency).

+ + + +

Proposed resolution:

+ + +

Rationale:

+

This is descriptive text, not normative, and the meaning is clear.

+ + + + + +
+

494. Wrong runtime complexity for associative container's insert and delete

+

Section: 23.1.2 [associative.reqmts] Status: NAD + Submitter: Hans B os Date: 2004-12-19

+

View all other issues in [associative.reqmts].

+

View all issues with NAD status.

+

Discussion:

+

According to [lib.associative.reqmts] table 69, the runtime comlexity +of insert(p, t) and erase(q) can be done in amortized constant time.

+ +

It was my understanding that an associative container could be +implemented as a balanced binary tree.

+ +

For inser(p, t), you 'll have to iterate to p's next node to see if t +can be placed next to p. Furthermore, the insertion usually takes +place at leaf nodes. An insert next to the root node will be done at +the left of the root next node

+ +

So when p is the root node you 'll have to iterate from the root to +its next node, which takes O(log(size)) time in a balanced tree.

+ +

If you insert all values with insert(root, t) (where root is the +root of the tree before insertion) then each insert takes O(log(size)) +time. The amortized complexity per insertion will be O(log(size)) +also.

+ +

For erase(q), the normal algorithm for deleting a node that has no +empty left or right subtree, is to iterate to the next (or previous), +which is a leaf node. Then exchange the node with the next and delete +the leaf node. Furthermore according to DR 130, erase should return +the next node of the node erased. Thus erasing the root node, +requires iterating to the next node.

+ +

Now if you empty a map by deleting the root node until the map is +empty, each operation will take O(log(size)), and the amortized +complexity is still O(log(size)).

+ +

The operations can be done in amortized constant time if iterating +to the next node can be done in (non amortized) constant time. This +can be done by putting all nodes in a double linked list. This +requires two extra links per node. To me this is a bit overkill since +you can already efficiently insert or erase ranges with erase(first, +last) and insert(first, last).

+ + + +

Proposed resolution:

+ + +

Rationale:

+

Only "amortized constant" in special circumstances, and we believe + that's implementable. That is: doing this N times will be O(N), not + O(log N).

+ + + + + +
+

499. Std. doesn't seem to require stable_sort() to be stable!

+

Section: 25.3.1.2 [stable.sort] Status: NAD Editorial + Submitter: Prateek Karandikar Date: 2005-04-12

+

View all issues with NAD Editorial status.

+

Discussion:

+

+17.3.1.1 Summary

+ +

+1 The Summary provides a synopsis of the category, and introduces the +first-level subclauses. Each subclause also provides a summary, listing +the headers specified in the subclause and the library entities +provided in each header. +

+

+2 Paragraphs labelled "Note(s):" or "Example(s):" are informative, +other paragraphs are normative. +

+ +

So this means that a "Notes" paragraph wouldn't be normative.

+ +

+25.3.1.2 stable_sort +

+
template<class RandomAccessIterator> 
+void stable_sort(RandomAccessIterat or first, RandomAccessIterator last); 
+
+template<class RandomAccessIterator, class Compare> 
+void stable_sort(RandomAccessIterat or first, RandomAccessIterator last, Compare comp);
+
+

+1 Effects: Sorts the elements in the range [first, last). +

+

+2 Complexity: It does at most N(log N)^2 (where N == last - first) +comparisons; if enough extra memory is available, it is N log N. +

+

+3 Notes: Stable: the relative order of the equivalent elements is +preserved. +

+ +

+The Notes para is informative, and nowhere else is stability mentioned above. +

+ +

+Also, I just searched for the word "stable" in my copy of the Standard. +and the phrase "Notes: Stable: the relative order of the elements..." +is repeated several times in the Standard library clauses for +describing various functions. How is it that stability is talked about +in the informative paragraph? Or am I missing something obvious? +

+ + +

Proposed resolution:

+

+

+ + +

Rationale:

+

+This change has already been made. +

+ + + + + +
+

500. do_length cannot be implemented correctly

+

Section: 22.2.1.5 [locale.codecvt.byname] Status: NAD + Submitter: Krzysztof Żelechowski Date: 2005-05-24

+

View all other issues in [locale.codecvt.byname].

+

View all issues with NAD status.

+

Discussion:

+
    +
  1. codecvt::do_length is of type int;
  2. +
  3. it is assumed to be sort-of returning from_next - from of type ptrdiff_t;
  4. +
  5. ptrdiff_t cannot be cast to an int without data loss.
  6. +
+

+Contradiction. +

+ + +

Proposed resolution:

+

+

+ + + + + +
+

501. Proposal: strengthen guarantees of lib.comparisons

+

Section: 20.5.3 [base] Status: NAD + Submitter: Me <anti_spam_email2003@yahoo.com> Date: 2005-06-07

+

View all other issues in [base].

+

View all issues with NAD status.

+

Discussion:

+

+"For templates greater, less, greater_equal, and less_equal, +the specializations for any pointer type yield a total order, even if +the built-in operators <, >, <=, >= do not." +

+ +

+The standard should do much better than guarantee that these provide a +total order, it should guarantee that it can be used to test if memory +overlaps, i.e. write a portable memmove. You can imagine a platform +where the built-in operators use a uint32_t comparison (this tests for +overlap on this platform) but the less<T*> functor is allowed to be +defined to use a int32_t comparison. On this platform, if you use +std::less with the intent of making a portable memmove, comparison on +an array that straddles the 0x7FFFFFFF/0x8000000 boundary can give +incorrect results. +

+ + +

Proposed resolution:

+

+Add a footnote to 20.5.3/8 saying: +

+ +

+Given a p1 and p2 such that p1 points to N objects of type T and p2 +points to M objects of type T. If [p1,p1+N) does not overlap [p2,p2+M), +less returns the same value when comparing all pointers in [p1,p1+N) to +all pointers in [p2,p2+M). Otherwise, there is a value Q and a value R +such that less returns the same value when comparing all pointers in +[p1,p1+Q) to all pointers in [p2,p2+R) and an opposite value when +comparing all pointers in [p1+Q,p1+N) to all pointers in [p2+R,p2+M). +For the sake of completeness, the null pointer value (4.10) for T is +considered to be an array of 1 object that doesn't overlap with any +non-null pointer to T. less_equal, greater, greater_equal, equal_to, +and not_equal_to give the expected results based on the total ordering +semantics of less. For T of void, treat it as having similar semantics +as T of char i.e. less<cv T*>(a, b) gives the same results as less<cv +void*>(a, b) which gives the same results as less<cv char*>((cv +char*)(cv void*)a, (cv char*)(cv void*)b). +

+ +

+I'm also thinking there should be a footnote to 20.5.3/1 saying that if +A and B are similar types (4.4/4), comp<A>(a,b) returns the same value +as comp<B>(a,b) (where comp is less, less_equal, etc.). But this might +be problematic if there is some really funky operator overloading going +on that does different things based on cv (that should be undefined +behavior if somebody does that though). This at least should be +guaranteed for all POD types (especially pointers) that use the +built-in comparison operators. +

+ + + +

Rationale:

+

+less is already required to provide a strict weak ordering which is good enough +to detect overlapping memory situations. +

+ + + + + +
+

504. Integer types in pseudo-random number engine requirements

+

Section: 26.4.1 [rand.req], TR1 5.1.1 [tr.rand.req] Status: NAD Editorial + Submitter: Walter Brown Date: 2005-07-03

+

View all other issues in [rand.req].

+

View all issues with NAD Editorial status.

+

Discussion:

+

+In [tr.rand.req], Paragraph 2 states that "... s is a value of integral type, +g is an ... object returning values of unsigned integral type ..." +

+ + +

Proposed resolution:

+

+In 5.1.1 [tr.rand.req], Paragraph 2 replace +

+ +

+... s is a value of integral type, g is an lvalue of a type other than X that +defines a zero-argument function object returning values of unsigned integral type +unsigned long int, +... +

+ +

+In 5.1.1 [tr.rand.seq], Table 16, replace in the line for X(s) +

+ +

+creates an engine with the initial internal state +determined by static_cast<unsigned long>(s) +

+ +

[ +Mont Tremblant: Both s and g should be unsigned long. +This should refer to the constructor signatures. Jens provided wording post Mont Tremblant. +]

+ + +

[ +Berlin: N1932 adopts the proposed resolution: see 26.3.1.3/1e and Table 3 row 2. Moved +to Ready. +]

+ + + + +

Rationale:

+

+Jens: Just requiring X(unsigned long) still makes it possible +for an evil library writer to also supply a X(int) that does something +unexpected. The wording above requires that X(s) always performs +as if X(unsigned long) would have been called. I believe that is +sufficient and implements our intentions from Mont Tremblant. I +see no additional use in actually requiring a X(unsigned long) +signature. u.seed(s) is covered by its reference to X(s), same +arguments. +

+ + +

[ +Portland: Subsumed by N2111. +]

+ + + + + +
+

506. Requirements of Distribution parameter for variate_generator

+

Section: 26.4 [rand], TR1 5.1.3 [tr.rand.var] Status: NAD + Submitter: Walter Brown Date: 2005-07-03

+

View all other issues in [rand].

+

View all issues with NAD status.

+

Discussion:

+

+Paragraph 3 requires that template argument U (which corresponds to template +parameter Engine) satisfy all uniform random number generator requirements. +However, there is no analogous requirement regarding the template argument +that corresponds to template parameter Distribution. We believe there should +be, and that it should require that this template argument satisfy all random +distribution requirements. +

+ + +

Proposed resolution:

+

+Consequence 1: Remove the precondition clauses [tr.rand.var]/16 and /18. +

+

+Consequence 2: Add max() and min() functions to those distributions that +do not already have them. +

+ +

[ +Mont Tremblant: Jens reccommends NAD, min/max not needed everywhere. +Marc supports having min and max to satisfy generic programming interface. +]

+ + + + +

Rationale:

+

Berlin: N1932 makes this moot: variate_generator has been eliminated.

+ + + + + +
+

509. Uniform_int template parameters

+

Section: 26.4.8.1 [rand.dist.uni], TR1 5.1.7.1 [tr.rand.dist.iunif] Status: NAD + Submitter: Walter Brown Date: 2005-07-03

+

View all issues with NAD status.

+

Discussion:

+

+In [tr.rand.dist.iunif] the uniform_int distribution currently has a single +template parameter, IntType, used as the input_type and as the result_type +of the distribution. We believe there is no reason to conflate these types +in this way. +

+ + +

Proposed resolution:

+

+We recommend that there be a second template parameter to +reflect the distribution's input_type, and that the existing first template +parameter continue to reflect (solely) the result_type: +

+
template< class IntType = int, UIntType = unsigned int >
+class uniform_int
+{
+public:
+  // types
+  typedef  UIntType  input_type;
+  typedef  IntType   result_type;
+
+ +

[ +Berlin: Moved to NAD. N1932 makes this moot: the input_type template parameter has been +eliminated. +]

+ + + + + + + +
+

510. Input_type for bernoulli_distribution

+

Section: 26.4.8.2 [rand.dist.bern], TR1 5.1.7.2 [tr.rand.dist.bern] Status: NAD + Submitter: Walter Brown Date: 2005-07-03

+

View all issues with NAD status.

+

Discussion:

+

+In [tr.rand.dist.bern] the distribution currently requires; +

+
typedef  int  input_type;
+
+ + +

Proposed resolution:

+

+We believe this is an unfortunate choice, and recommend instead: +

+
typedef  unsigned int  input_type;
+
+ +

[ +Berlin: Moved to NAD. N1932 makes this moot: the input_type template parameter has been +eliminated. +]

+ + + + + + + +
+

511. Input_type for binomial_distribution

+

Section: 26.4.8 [rand.dist], TR1 5.1.7.5 [tr.rand.dist.bin] Status: NAD + Submitter: Walter Brown Date: 2005-07-03

+

View all other issues in [rand.dist].

+

View all issues with NAD status.

+

Discussion:

+

+Unlike all other distributions in TR1, this binomial_distribution has an +implementation-defined input_type. We believe this is an unfortunate choice, +because it hinders users from writing portable code. It also hinders the +writing of compliance tests. We recommend instead: +

+
typedef  RealType  input_type;
+
+

+While this choice is somewhat arbitrary (as it was for some of the other +distributions), we make this particular choice because (unlike all other +distributions) otherwise this template would not publish its RealType +argument and so users could not write generic code that accessed this +second template parameter. In this respect, the choice is consistent with +the other distributions in TR1. +

+

+We have two reasons for recommending that a real type be specified instead. +One reason is based specifically on characteristics of binomial distribution +implementations, while the other is based on mathematical characteristics of +probability distribution functions in general. +

+

+Implementations of binomial distributions commonly use Stirling approximations +for values in certain ranges. It is far more natural to use real values to +represent these approximations than it would be to use integral values to do +so. In other ranges, implementations reply on the Bernoulli distribution to +obtain values. While TR1's bernoulli_distribution::input_type is specified as +int, we believe this would be better specified as double. +

+

+This brings us to our main point: The notion of a random distribution rests +on the notion of a cumulative distribution function, which in turn mathematically +depends on a continuous dependent variable. Indeed, such a distribution function +would be meaningless if it depended on discrete values such as integers - and this +remains true even if the distribution function were to take discrete steps. +

+

+Although this note is specifically about binomial_distribution::input_type, +we intend to recommend that all of the random distributions input_types be +specified as a real type (either a RealType template parameter, or double, +as appropriate). +

+

+Of the nine distributions in TR1, four already have this characteristic +(uniform_real, exponential_distribution, normal_distribution, and +gamma_distribution). We have already argued the case for the binomial the +remaining four distributions. +

+

+In the case of uniform_int, we believe that the calculations to produce an +integer result in a specified range from an integer in a different specified +range is best done using real arithmetic. This is because it involves a +product, one of whose terms is the ratio of the extents of the two ranges. +Without real arithmetic, the results become less uniform: some numbers become +more (or less) probable that they should be. This is, of course, undesireable +behavior in a uniform distribution. +

+

+Finally, we believe that in the case of the bernoulli_distribution (briefly +mentioned earlier), as well as the cases of the geometric_distribution and the +poisson_distribution, it would be far more natural to have a real input_type. +This is because the most natural computation involves the random number +delivered and the distribution's parameter p (in the case of bernoulli_distribution, +for example, the computation is a comparison against p), and p is already specified +in each case as having some real type. +

+ + +

Proposed resolution:

+
typedef  RealType  input_type;
+
+ +

[ +Berlin: Moved to NAD. N1932 makes this moot: the input_type template parameter has been +eliminated. +]

+ + + + + + +
+

512. Seeding subtract_with_carry_01 from a single unsigned long

+

Section: 26.4.3 [rand.eng], TR1 5.1.4.4 [tr.rand.eng.sub1] Status: NAD Editorial + Submitter: Walter Brown Date: 2005-07-03

+

View all other issues in [rand.eng].

+

View all issues with NAD Editorial status.

+

Discussion:

+

+Paragraph 8 specifies the algorithm by which a subtract_with_carry_01 engine +is to be seeded given a single unsigned long. This algorithm is seriously +flawed in the case where the engine parameter w (also known as word_size) +exceeds 31 [bits]. The key part of the paragraph reads: +

+

+sets x(-r) ... x(-1) to (lcg(1)*2**(-w)) mod 1 +

+

+and so forth. +

+

+Since the specified linear congruential engine, lcg, delivers numbers with +a maximum of 2147483563 (just a shade under 31 bits), then when w is, for +example, 48, each of the x(i) will be less than 2**-17. The consequence +is that roughly the first 400 numbers delivered will be conspicuously +close to either zero or one. +

+

+Unfortunately, this is not an innocuous flaw: One of the predefined engines +in [tr.rand.predef], namely ranlux64_base_01, has w = 48 and would exhibit +this poor behavior, while the original N1378 proposal states that these +pre-defined engines are intended to be of "known good properties." +

+ + +

Proposed resolution:

+

+In 5.1.4.4 [tr.rand.eng.sub1], replace the "effects" clause for +void seed(unsigned long value = 19780503) by +

+ +

+Effects: If value == 0, sets value to 19780503. In any +case, with a linear congruential generator lcg(i) having parameters +mlcg = 2147483563, alcg = 40014, +clcg = 0, and lcg(0) = value, +sets carry(-1) and x(-r) … x(-1) +as if executing

+ +

+linear_congruential<unsigned long, 40014, 0, 2147483563> lcg(value);
+seed(lcg);
+
+ +

+to (lcg(1) · 2-w) mod 1 +… (lcg(r) · 2-w) mod 1, +respectively. If x(-1) == 0, sets carry(-1) = 2-w, +else sets carry(-1) = 0.

+
+ +

[ +Jens provided revised wording post Mont Tremblant. +]

+ + +

[ +Berlin: N1932 adopts the originally-proposed resolution of the issue. +Jens's supplied wording is a clearer description of what is +intended. Moved to Ready. +]

+ + + + +

Rationale:

+

+Jens: I'm using an explicit type here, because fixing the +prose would probably not qualify for the (with issue 504 even +stricter) requirements we have for seed(Gen&). +

+ +

[ +Portland: Subsumed by N2111. +]

+ + + + + + +
+

513. Size of state for subtract_with_carry_01

+

Section: 26.4.3 [rand.eng], TR1 5.1.4.4 [tr.rand.eng.sub1] Status: NAD Editorial + Submitter: Walter Brown Date: 2005-07-03

+

View all other issues in [rand.eng].

+

View all issues with NAD Editorial status.

+

Discussion:

+

+Paragraph 3 begins: +

+

+The size of the state is r. +

+

+However, this is not quite consistent with the remainder of the paragraph +which specifies a total of nr+1 items in the textual representation of +the state. We recommend the sentence be corrected to match: +

+

+The size of the state is nr+1. +

+

+To give meaning to the coefficient n, it may be also desirable to move +n's definition from later in the paragraph. Either of the following +seem reasonable formulations: +

+

+With n=..., the size of the state is nr+1. +

+

+The size of the state is nr+1, where n=... . +

+ + + +

Proposed resolution:

+

[ +Jens: I plead for "NAD" on the grounds that "size of state" is only +used as an argument for big-O complexity notation, thus +constant factors and additions don't count. +]

+ + +

[ +Berlin: N1932 adopts the proposed NAD. +]

+ + + + + + + +
+

514. Size of state for subtract_with_carry

+

Section: 26.4.3.3 [rand.eng.sub], TR1 5.1.4.3 [tr.rand.eng.sub] Status: NAD Editorial + Submitter: Walter Brown Date: 2005-07-03

+

View all issues with NAD Editorial status.

+

Discussion:

+

+Paragraph 2 begins: +

+

+The size of the state is r. +

+

+However, the next sentence specifies a total of r+1 items in the textual +representation of the state, r specific x's as well as a specific carry. +This makes a total of r+1 items that constitute the size of the state, +rather than r. +

+ + +

Proposed resolution:

+

+We recommend the sentence be corrected to match: +

+

+ The size of the state is r+1. +

+ +

[ +Jens: I plead for "NAD" on the grounds that "size of state" is only +used as an argument for big-O complexity notation, thus +constant factors and additions don't count. +]

+ + +

[ +Berlin: N1932 adopts the proposed NAD. +]

+ + + + + + + +
+

515. Random number engine traits

+

Section: 26.4.2 [rand.synopsis], TR1 5.1.2 [tr.rand.synopsis] Status: NAD + Submitter: Walter Brown Date: 2005-07-03

+

View all other issues in [rand.synopsis].

+

View all issues with NAD status.

+

Discussion:

+

+To accompany the concept of a pseudo-random number engine as defined in Table 17, +we propose and recommend an adjunct template, engine_traits, to be declared in +[tr.rand.synopsis] as: +

+
template< class PSRE >
+class engine_traits;
+
+

+This template's primary purpose would be as an aid to generic programming involving +pseudo-random number engines. Given only the facilities described in tr1, it would +be very difficult to produce any algorithms involving the notion of a generic engine. +The intent of this proposal is to provide, via engine_traits<>, sufficient +descriptive information to allow an algorithm to employ a pseudo-random number engine +without regard to its exact type, i.e., as a template parameter. +

+

+For example, today it is not possible to write an efficient generic function that +requires any specific number of random bits. More specifically, consider a +cryptographic application that internally needs 256 bits of randomness per call: +

+
template< class Eng, class InIter, class OutIter >
+void crypto( Eng& e, InIter in, OutIter out );
+
+

+Without knowning the number of bits of randomness produced per call to a provided +engine, the algorithm has no means of determining how many times to call the engine. +

+

+In a new section [tr.rand.eng.traits], we proposed to define the engine_traits +template as: +

+
template< class PSRE >
+class engine_traits
+{
+  static  std::size_t  bits_of_randomness = 0u;
+  static  std::string  name()  { return "unknown_engine"; }
+  // TODO: other traits here
+};
+
+

+Further, each engine described in [tr.rand.engine] would be accompanied by a +complete specialization of this new engine_traits template. +

+ + + +

Proposed resolution:

+

[ +Berlin: Walter: While useful for implementation per TR1, N1932 has no need for this +feature. Recommend close as NAD. +]

+ + + +

Rationale:

+

+Recommend NAD, +N1932, +N2111 +covers this. Already in WP. +

+ + + + + +
+

516. Seeding subtract_with_carry_01 using a generator

+

Section: 26.4.3 [rand.eng], TR1 5.1.4.4 [tr.rand.eng.sub1] Status: NAD Editorial + Submitter: Walter Brown Date: 2005-07-03

+

View all other issues in [rand.eng].

+

View all issues with NAD Editorial status.

+

Discussion:

+

+Paragraph 6 says: +

+

+... obtained by successive invocations of g, ... +

+

+We recommend instead: +

+

+... obtained by taking successive invocations of g mod 2**32, ... +

+

+as the context seems to require only 32-bit quantities be used here. +

+ + +

Proposed resolution:

+

+Berlin: N1932 adopts the proposed resultion: see 26.3.3.4/7. Moved to Ready. +

+ +

[ +Portland: Subsumed by N2111. +]

+ + + + + + +
+

517. Should include name in external representation

+

Section: 26.4.1 [rand.req], TR1 5.1.1 [tr.rand.req] Status: NAD + Submitter: Walter Brown Date: 2005-07-03

+

View all other issues in [rand.req].

+

View all issues with NAD status.

+

Discussion:

+

+The last two rows of Table 16 deal with the i/o requirements of an engine, +specifying that the textual representation of an engine's state, +appropriately formatted, constitute the engine's external representation. +

+

+This seems adequate when an engine's type is known. However, it seems +inadequate in the context of generic code, where it becomes useful and +perhaps even necessary to determine an engine's type via input. +

+

+

+ + +

Proposed resolution:

+

+We therefore recommend that, in each of these two rows of Table 16, the +text "textual representation" be expanded so as to read "engine name +followed by the textual representation." +

+ +

[ +Berlin: N1932 considers this NAD. This is a QOI issue. +]

+ + + + + + + +
+

525. type traits definitions not clear

+

Section: 20.4.4 [meta.unary], TR1 4.5 [tr.meta.unary] Status: NAD Editorial + Submitter: Robert Klarer Date: 2005-07-11

+

View all issues with NAD Editorial status.

+

Discussion:

+

+It is not completely clear how the primary type traits deal with +cv-qualified types. And several of the secondary type traits +seem to be lacking a definition. +

+ +

[ +Berlin: Howard to provide wording. +]

+ + + +

Proposed resolution:

+

+Wording provided in N2028. +A +revision (N2157) +provides more detail for motivation. +

+ + +

Rationale:

+Solved by revision (N2157) +in the WP. + + + + + +
+

526. Is it undefined if a function in the standard changes in parameters?

+

Section: 23.1.1 [sequence.reqmts] Status: NAD + Submitter: Chris Jefferson Date: 2005-09-14

+

View all other issues in [sequence.reqmts].

+

View all issues with NAD status.

+

Discussion:

+

+Problem: There are a number of places in the C++ standard library where +it is possible to write what appear to be sensible ways of calling +functions, but which can cause problems in some (or all) +implementations, as they cause the values given to the function to be +changed in a way not specified in standard (and therefore not coded to +correctly work). These fall into two similar categories. +

+ +

+1) Parameters taken by const reference can be changed during execution +of the function +

+ +

+Examples: +

+ +

+Given std::vector<int> v: +

+

+v.insert(v.begin(), v[2]); +

+

+v[2] can be changed by moving elements of vector +

+ + +

+Given std::list<int> l: +

+

+l.remove(*l.begin()); +

+

+Will delete the first element, and then continue trying to access it. +This is particularily vicious, as it will appear to work in almost all +cases. +

+ +

+2) A range is given which changes during the execution of the function: +Similarly, +

+ +

+v.insert(v.begin(), v.begin()+4, v.begin()+6); +

+ +

+This kind of problem has been partly covered in some cases. For example +std::copy(first, last, result) states that result cannot be in the range +[first, last). However, does this cover the case where result is a +reverse_iterator built from some iterator in the range [first, last)? +Also, std::copy would still break if result was reverse_iterator(last + +1), yet this is not forbidden by the standard +

+ +

+Solution: +

+ +

+One option would be to try to more carefully limit the requirements of +each function. There are many functions which would have to be checked. +However as has been shown in the std::copy case, this may be difficult. +A simpler, more global option would be to somewhere insert text similar to: +

+ +

+If the execution of any function would change either any values passed +by reference or any value in any range passed to a function in a way not +defined in the definition of that function, the result is undefined. +

+ +

+Such code would have to at least cover chapters 23 and 25 (the sections +I read through carefully). I can see no harm on applying it to much of +the rest of the standard. +

+ +

+Some existing parts of the standard could be improved to fit with this, +for example the requires for 25.2.1 (Copy) could be adjusted to: +

+ +

+Requires: For each non-negative integer n < (last - first), assigning to +*(result + n) must not alter any value in the range [first + n, last). +

+ +

+However, this may add excessive complication. +

+ +

+One other benefit of clearly introducing this text is that it would +allow a number of small optimisations, such as caching values passed +by const reference. +

+ +

+Matt Austern adds that this issue also exists for the insert and +erase members of the ordered and unordered associative containers. +

+ +

[ +Berlin: Lots of controversey over how this should be solved. Lots of confusion +as to whether we're talking about self referencing iterators or references. +Needs a good survey as to the cases where this matters, for which +implementations, and how expensive it is to fix each case. +]

+ + + + +

Proposed resolution:

+ + +

Rationale:

+

+Recommend NAD. +

+
    +
  • vector::insert(iter, value) is required to work because the standard +doesn't give permission for it not to work.
  • +
  • list::remove(value) is required to work because the standard +doesn't give permission for it not to work.
  • +
  • vector::insert(iter, iter, iter) is not required to work because +23.1.1 [sequence.reqmts], p4 says so.
  • +
  • copy has to work, except where 25.2.1 [alg.copy] says +it doesn't have to work. While a language lawyer can tear this wording apart, +it is felt that the wording is not prone to accidental interpretation.
  • +
  • The current working draft provide exceptions for the unordered associative +containers similar to the containers requirements which exempt the member +template insert functions from self referencing.
  • +
+ + + + + +
+

528. const_iterator iterator issue when they are the same type

+

Section: 23.4 [unord], TR1 6.3.4 [tr.unord.unord] Status: NAD + Submitter: Paolo Carlini Date: 2005-10-12

+

View other active issues in [unord].

+

View all other issues in [unord].

+

View all issues with NAD status.

+

Discussion:

+

+while implementing the resolution of issue 6.19 I'm noticing the +following: according to 6.3.4.3/2 (and 6.3.4.5/2), for unordered_set and +unordered_multiset: +

+ +

+ "The iterator and const_iterator types are both const types. It is +unspecified whether they are the same type" +

+ +

+Now, according to the resolution of 6.19, we have overloads of insert +with hint and erase (single and range) both for iterator and +const_iterator, which, AFAICS, can be meaningful at the same time *only* +if iterator and const_iterator *are* in fact different types. +

+

+Then, iterator and const_iterator are *required* to be different types? +Or that is an unintended consequence? Maybe the overloads for plain +iterators should be added only to unordered_map and unordered_multimap? +Or, of course, I'm missing something? +

+ + + +

Proposed resolution:

+

+Add to 6.3.4.3p2 (and 6.3.4.5p2): +

+

+2 ... The iterator and const_iterator types are both const +constant iterator types. +It is unspecified whether they are the same type. +

+ +

+Add a new subsection to 17.4.4 [lib.conforming]: +

+ +
+

+An implementation shall not supply an overloaded function + signature specified in any library clause if such a signature + would be inherently ambiguous during overload resolution + due to two library types referring to the same type. +

+

+ [Note: For example, this occurs when a container's iterator + and const_iterator types are the same. -- end note] +

+
+ +

[ +Post-Berlin: Beman supplied wording. +]

+ + + + +

Rationale:

+Toronto: The first issue has been fixed by N2350 (the insert and erase members +are collapsed into one signature). Alisdair to open a separate issue on the +chapter 17 wording. + + + + + +
+

532. Tuple comparison

+

Section: 20.3.1.5 [tuple.rel], TR1 6.1.3.5 [tr.tuple.rel] Status: Pending NAD Editorial + Submitter: David Abrahams Date: 2005-11-29

+

View all issues with Pending NAD Editorial status.

+

Discussion:

+

+Where possible, tuple comparison operators <,<=,=>, and > ought to be +defined in terms of std::less rather than operator<, in order to +support comparison of tuples of pointers. +

+ + +

Proposed resolution:

+

+change 6.1.3.5/5 from: +

+ +

+ Returns: The result of a lexicographical comparison between t and + u. The result is defined as: (bool)(get<0>(t) < get<0>(u)) || + (!(bool)(get<0>(u) < get<0>(t)) && ttail < utail), where rtail for + some tuple r is a tuple containing all but the first element of + r. For any two zero-length tuples e and f, e < f returns false. +

+ +

+to: +

+ +
+

+ Returns: The result of a lexicographical comparison between t and + u. For any two zero-length tuples e and f, e < f returns false. + Otherwise, the result is defined as: cmp( get<0>(t), get<0>(u)) || + (!cmp(get<0>(u), get<0>(t)) && ttail < utail), where rtail for some + tuple r is a tuple containing all but the first element of r, and + cmp(x,y) is an unspecified function template defined as follows. +

+

+ Where T is the type of x and U is the type of y: +

+ +

+ if T and U are pointer types and T is convertible to U, returns + less<U>()(x,y) +

+ +

+ otherwise, if T and U are pointer types, returns less<T>()(x,y) +

+ +

+ otherwise, returns (bool)(x < y) +

+
+ +

[ +Berlin: This issue is much bigger than just tuple (pair, containers, +algorithms). Dietmar will survey and work up proposed wording. +]

+ + + + +

Rationale:

+

+Recommend NAD. This will be fixed with the next revision of concepts. +

+ + + + + +
+

536. Container iterator constructor and explicit convertibility

+

Section: 23.1 [container.requirements] Status: Dup + Submitter: Joaquín M López Muñoz Date: 2005-12-17

+

View other active issues in [container.requirements].

+

View all other issues in [container.requirements].

+

View all issues with Dup status.

+

Duplicate of: 589

+

Discussion:

+

+The iterator constructor X(i,j) for containers as defined in 23.1.1 and +23.2.2 does only require that i and j be input iterators but +nothing is said about their associated value_type. There are three +sensible +options: +

+
    +
  1. iterator's value_type is exactly X::value_type (modulo cv).
  2. +
  3. iterator's value_type is *implicitly* convertible to X::value_type.
  4. +
  5. iterator's value_type is *explicitly* convertible to X::value_type.
  6. +
+

+The issue has practical implications, and stdlib vendors have +taken divergent approaches to it: Dinkumware follows 2, +libstdc++ follows 3. +

+

+The same problem applies to the definition of insert(p,i,j) for +sequences and insert(i,j) for associative contianers, as well as +assign. +

+ +

[ +The following added by Howard and the example code was originally written by +Dietmar. +]

+ +

+Valid code below? +

+ +
#include <vector> 
+#include <iterator> 
+#include <iostream> 
+
+struct foo 
+{ 
+    explicit foo(int) {} 
+}; 
+
+int main() 
+{ 
+    std::vector<int> v_int; 
+    std::vector<foo> v_foo1(v_int.begin(), v_int.end()); 
+    std::vector<foo> v_foo2((std::istream_iterator<int>(std::cin)), 
+                             std::istream_iterator<int>()); 
+} 
+
+

[ +Berlin: Some support, not universal, for respecting the explicit qualifier. +]

+ + + + +

Proposed resolution:

+ + + + + + +
+

544. minor NULL problems in C.2

+

Section: C.2 [diff.library] Status: NAD Editorial + Submitter: Martin Sebor Date: 2005-11-25

+

View all issues with NAD Editorial status.

+

Discussion:

+

+According to C.2.2.3, p1, "the macro NULL, defined in any of <clocale>, +<cstddef>, <cstdio>, <cstdlib>, <cstring>, <ctime>, +or <cwchar>." This is consistent with the C standard. +

+

+However, Table 95 in C.2 fails to mention <clocale> and <cstdlib>. +

+

+In addition, C.2, p2 claims that "The C++ Standard library provides +54 standard macros from the C library, as shown in Table 95." While +table 95 does have 54 entries, since a couple of them (including the +NULL macro) are listed more than once, the actual number of macros +defined by the C++ Standard Library may not be 54. +

+ + +

Proposed resolution:

+

+I propose we add <clocale> and <cstdlib> to Table 96 and remove the +number of macros from C.2, p2 and reword the sentence as follows: +

+

+The C++ Standard library provides 54 standard macros from +defines a number macros corresponding to those defined by the C +Standard library, as shown in Table 96. +

+ +

[ +Portland: Resolution is considered editorial. It will be incorporated into the WD. +]

+ + + + + + + +
+

547. division should be floating-point, not integer

+

Section: 26.4 [rand], TR1 5.1 [tr.rand] Status: NAD + Submitter: Matt Austern Date: 2006-01-10

+

View all other issues in [rand].

+

View all issues with NAD status.

+

Discussion:

+

+Paragraph 10 describes how a variate generator uses numbers produced by an +engine to pass to a generator. The sentence that concerns me is: "Otherwise, if +the value for engine_value_type::result_type is true and the value for +Distribution::input_type is false [i.e. if the engine produces integers and the +engine wants floating-point values], then the numbers in s_eng are divided by +engine().max() - engine().min() + 1 to obtain the numbers in s_e." Since the +engine is producing integers, both the numerator and the denominator are +integers and we'll be doing integer division, which I don't think is what we +want. Shouldn't we be performing a conversion to a floating-point type first? +

+ + +

Proposed resolution:

+ + +

Rationale:

+

+Recommend NAD as the affected section is now gone and so the issue is moot. +N2111. +

+ + + + + +
+

548. May random_device block?

+

Section: 26.4.6 [rand.device], TR1 5.1.6 [tr.rand.device] Status: NAD + Submitter: Matt Austern Date: 2006-01-10

+

View all issues with NAD status.

+

Discussion:

+

+Class random_device "produces non-deterministic random numbers", using some +external source of entropy. In most real-world systems, the amount of available +entropy is limited. Suppose that entropy has been exhausted. What is an +implementation permitted to do? In particular, is it permitted to block +indefinitely until more random bits are available, or is the implementation +required to detect failure immediately? This is not an academic question. On +Linux a straightforward implementation would read from /dev/random, and "When +the entropy pool is empty, reads to /dev/random will block until additional +environmental noise is gathered." Programmers need to know whether random_device +is permitted to (or possibly even required to?) behave the same way. +

+ +

[ +Berlin: Walter: N1932 considers this NAD. Does the standard specify whether std::cin +may block? +]

+ + +

+See N2391 and +N2423 +for some further discussion. +

+ + +

Proposed resolution:

+

+Adopt the proposed resolution in +N2423 (NAD). +

+ + + + + +
+

549. Undefined variable in binomial_distribution

+

Section: 26.4.8 [rand.dist], TR1 5.1.7.5 [tr.rand.dist.bin] Status: NAD Editorial + Submitter: Matt Austern Date: 2006-01-10

+

View all other issues in [rand.dist].

+

View all issues with NAD Editorial status.

+

Discussion:

+

+Paragraph 1 says that "A binomial distributon random distribution produces +integer values i>0 with p(i) = (n choose i) * p*i * (1-p)^(t-i), where t and +p are the parameters of the distribution. OK, that tells us what t, p, and i +are. What's n? +

+ + +

Proposed resolution:

+

+Berlin: Typo: "n" replaced by "t" in N1932: see 26.3.7.2.2/1. +

+ +

[ +Portland: Subsumed by N2111. +]

+ + + + + + +
+

553. very minor editorial change intptr_t / uintptr_t

+

Section: 18.3.1 [cstdint.syn], TR1 8.22.1 [tr.c99.cstdint.syn] Status: NAD Editorial + Submitter: Paolo Carlini Date: 2006-01-30

+

View all issues with NAD Editorial status.

+

Discussion:

+

+In the synopsis, some types are identified as optional: int8_t, int16_t, +and so on, consistently with C99, indeed. +

+

+On the other hand, intptr_t and uintptr_t, are not marked as such and +probably should, consistently with C99, 7.18.1.4. +

+ + +

Proposed resolution:

+

+Change 18.3.1 [cstdint.syn]: +

+ +
...
+typedef signed integer type intptr_t;    // optional
+...
+typedef unsigned integer type uintptr_t;    // optional
+...
+
+ + + +

Rationale:

+Recommend NAD and fix as editorial with the proposed resolution. + + + + + +
+

554. Problem with lwg DR 184 numeric_limits<bool>

+

Section: 18.2.1.5 [numeric.special] Status: NAD + Submitter: Howard Hinnant Date: 2006-01-29

+

View all other issues in [numeric.special].

+

View all issues with NAD status.

+

Discussion:

+

+I believe we have a bug in the resolution of: +lwg 184 +(WP status). +

+ +

+The resolution spells out each member of numeric_limits<bool>. +The part I'm having a little trouble with is: +

+
static const bool traps = false;
+
+ +

+Should this not be implementation defined? Given: +

+ +
int main()
+{
+     bool b1 = true;
+     bool b2 = false;
+     bool b3 = b1/b2;
+}
+
+ +

+If this causes a trap, shouldn't numeric_limits<bool>::traps be +true? +

+ + +

Proposed resolution:

+

+Change 18.2.1.5p3: +

+ +

+-3- The specialization for bool shall be provided as follows:

+
namespace std { 
+   template <> class numeric_limits<bool> {
+      ...
+      static const bool traps = false implementation-defined;
+      ...
+   };
+}
+
+
+ +

[ +Redmond: NAD because traps refers to values, not operations. There is no bool +value that will trap. +]

+ + + + + + + +
+

555. TR1, 8.21/1: typo

+

Section: TR1 8.21 [tr.c99.boolh] Status: NAD Editorial + Submitter: Paolo Carlini Date: 2006-02-02

+

View all issues with NAD Editorial status.

+

Discussion:

+

+This one, if nobody noticed it yet, seems really editorial: +s/cstbool/cstdbool/ +

+ + +

Proposed resolution:

+

+Change 8.21p1: +

+

+-1- The header behaves as if it defines the additional macro defined in +<cstdbool> by including the header <cstdbool>. +

+ +

[ +Redmond: Editorial. +]

+ + + + + + + +
+

558. lib.input.iterators Defect

+

Section: 24.1.1 [input.iterators] Status: NAD Editorial + Submitter: David Abrahams Date: 2006-02-09

+

View all other issues in [input.iterators].

+

View all issues with NAD Editorial status.

+

Discussion:

+
+

+ 24.1.1 Input iterators [lib.input.iterators] +

+

+ 1 A class or a built-in type X satisfies the requirements of an + input iterator for the value type T if the following expressions are + valid, where U is the type of any specified member of type T, as + shown in Table 73. +

+
+

+There is no capital U used in table 73. There is a lowercase u, but +that is clearly not meant to denote a member of type T. Also, there's +no description in 24.1.1 of what lowercase a means. IMO the above +should have been...Hah, a and b are already covered in 24.1/11, so maybe it +should have just been: +

+ + +

Proposed resolution:

+

+Change 24.1.1p1: +

+

+-1- A class or a built-in type X satisfies the requirements of an +input iterator for the value type T if the following expressions +are valid, where U is the type of any specified member of type +T, as shown in Table 73. +

+ +

[ +Portland: Editorial. +]

+ + + + + + + +
+

560. User-defined allocators without default constructor

+

Section: 20.1.2 [allocator.requirements] Status: NAD + Submitter: Sergey P. Derevyago Date: 2006-02-17

+

View other active issues in [allocator.requirements].

+

View all other issues in [allocator.requirements].

+

View all issues with NAD status.

+

Discussion:

+

1. The essence of the problem.

+

+User-defined allocators without default constructor are not explicitly +supported by the standard but they can be supported just like std::vector +supports elements without default constructor. +

+

+As a result, there exist implementations that work well with such allocators +and implementations that don't. +

+ +

2. The cause of the problem.

+

+1) The standard doesn't explicitly state this intent but it should. In +particular, 20.1.5p5 explicitly state the intent w.r.t. the allocator +instances that compare non-equal. So it can similarly state the intent w.r.t. +the user-defined allocators without default constructor. +

+

+2) Some container operations are obviously underspecified. In particular, +21.3.7.1p2 tells: +

+
template<class charT, class traits, class Allocator>
+  basic_string<charT,traits,Allocator> operator+(
+    const charT* lhs,
+    const basic_string<charT,traits,Allocator>& rhs
+  );
+
+

+Returns: basic_string<charT,traits,Allocator>(lhs) + rhs. +

+
+

+That leads to the basic_string<charT,traits,Allocator>(lhs, Allocator()) call. +Obviously, the right requirement is: +

+

+Returns: basic_string<charT,traits,Allocator>(lhs, rhs.get_allocator()) + rhs. +

+

+It seems like a lot of DRs can be submitted on this "Absent call to +get_allocator()" topic. +

+ +

3. Proposed actions.

+

+1) Explicitly state the intent to allow for user-defined allocators without +default constructor in 20.1.5 Allocator requirements. +

+

+2) Correct all the places, where a correct allocator object is available +through the get_allocator() call but default Allocator() gets passed instead. +

+

4. Code sample.

+

+Let's suppose that the following memory pool is available: +

+
class mem_pool {
+      // ...
+      void* allocate(size_t size);
+      void deallocate(void* ptr, size_t size);
+};
+
+

+So the following allocator can be implemented via this pool: +

+
class stl_allocator {
+      mem_pool& pool;
+
+ public:
+      explicit stl_allocator(mem_pool& mp) : pool(mp) {}
+      stl_allocator(const stl_allocator& sa) : pool(sa.pool) {}
+      template <class U>
+      stl_allocator(const stl_allocator<U>& sa)  : pool(sa.get_pool()) {}
+      ~stl_allocator() {}
+
+      pointer allocate(size_type n, std::allocator<void>::const_pointer = 0)
+      {
+       return (n!=0) ? static_cast<pointer>(pool.allocate(n*sizeof(T))) : 0;
+      }
+
+      void deallocate(pointer p, size_type n)
+      {
+       if (n!=0) pool.deallocate(p, n*sizeof(T));
+      }
+
+      // ...
+};
+
+

+Then the following code works well on some implementations and doesn't work on +another: +

+
typedef basic_string<char, char_traits<char>, stl_allocator<char> > 
+  tl_string;
+mem_pool mp;
+tl_string s1("abc", stl_allocator<int>(mp));
+printf("(%s)\n", ("def"+s1).c_str());
+
+

+In particular, on some implementations the code can't be compiled without +default stl_allocator() constructor. +

+

+The obvious way to solve the compile-time problems is to intentionally define +a NULL pointer dereferencing default constructor +

+
stl_allocator() : pool(*static_cast<mem_pool*>(0)) {}
+
+

+in a hope that it will not be called. The problem is that it really gets +called by operator+(const char*, const string&) under the current 21.3.7.1p2 +wording. +

+ + +

Proposed resolution:

+

+

+ + +

Rationale:

+

+Recommend NAD. operator+() with string already requires the desired +semantics of copying the allocator from one of the strings (lhs when there is a choice). +

+ + + + + +
+

569. Postcondition for basic_ios::clear(iostate) incorrectly stated

+

Section: 27.4.4.3 [iostate.flags] Status: Dup + Submitter: Seungbeom Kim Date: 2006-03-10

+

View all other issues in [iostate.flags].

+

View all issues with Dup status.

+

Duplicate of: 272

+

Discussion:

+

+Section: 27.4.4.3 [lib.iostate.flags] +

+

+Paragraph 4 says: +

+
+
void clear(iostate state = goodbit);
+
+

+Postcondition: If rdbuf()!=0 then state == rdstate(); +otherwise rdstate()==state|ios_base::badbit. +

+
+ +

+The postcondition "rdstate()==state|ios_base::badbit" is parsed as +"(rdstate()==state)|ios_base::badbit", which is probably what the +committee meant. +

+ + + + +

Rationale:

+ + + + + + +
+

571. Update C90 references to C99?

+

Section: 1.2 [intro.refs] Status: NAD Editorial + Submitter: Beman Dawes Date: 2006-04-08

+

View all other issues in [intro.refs].

+

View all issues with NAD Editorial status.

+

Discussion:

+

+1.2 Normative references [intro.refs] of the WP currently refers to ISO/IEC +9899:1990, Programming languages - C. Should that be changed to ISO/IEC +9899:1999? +

+

+What impact does this have on the library? +

+ + +

Proposed resolution:

+

+In 1.2/1 [intro.refs] of the WP, change: +

+
+
    +
  • ISO/IEC 9899:19901999 + TC1 + TC2, Programming languages - C
  • +
+
+ + + +

Rationale:

+Recommend NAD, fixed editorially. + + + + + +
+

572. Oops, we gave 507 WP status

+

Section: 26.4 [rand], TR1 5.1 [tr.rand] Status: NAD + Submitter: Howard Hinnant Date: 2006-04-11

+

View all other issues in [rand].

+

View all issues with NAD status.

+

Discussion:

+

+In Berlin, as a working group, we voted in favor of N1932 which makes issue 507 moot: +variate_generator has been eliminated. Then in full committee we voted to give +this issue WP status (mistakenly). +

+ + +

Proposed resolution:

+

+Strike the proposed resolution of issue 507. +

+

[ +post-Portland: Walter and Howard recommend NAD. The proposed resolution of 507 no longer +exists in the current WD. +]

+ + + +

Rationale:

+

+NAD. Will be moot once +N2135 +is adopted. +

+ + + + + +
+

583. div() for unsigned integral types

+

Section: 26.7 [c.math] Status: NAD + Submitter: Beman Dawes Date: 2006-06-15

+

View other active issues in [c.math].

+

View all other issues in [c.math].

+

View all issues with NAD status.

+

Discussion:

+

+There is no div() function for unsigned integer types. +

+

+There are several possible resolutions. The simplest one is noted below. Other +possibilities include a templated solution. +

+ + +

Proposed resolution:

+

+Add to 26.7 [lib.c.math] paragraph 8: +

+ +
struct udiv_t div(unsigned, unsigned);
+struct uldiv_t div(unsigned long, unsigned long);
+struct ulldiv_t div(unsigned long long, unsigned long long);
+
+ + + +

Rationale:

+Toronto: C99 does not have these unsigned versions because +the signed version exist just to define the implementation-defined behavior +of signed integer division. Unsigned integer division has no implementation-defined +behavior and thus does not need this treatment. + + + + + +
+

584. missing int pow(int,int) functionality

+

Section: 26.7 [c.math] Status: NAD + Submitter: Beman Dawes Date: 2006-06-15

+

View other active issues in [c.math].

+

View all other issues in [c.math].

+

View all issues with NAD status.

+

Discussion:

+

+There is no pow() function for any integral type. +

+ + +

Proposed resolution:

+

+Add something like: +

+ +
template< typename T>
+T power( T x, int n );
+// requires: n >=0
+
+ + +

Rationale:

+Toronto: We already have double pow(integral, integral) from 26.7 [c.math] p11. + + + + + +
+

587. iststream ctor missing description

+

Section: D.7.2.1 [depr.istrstream.cons] Status: NAD Editorial + Submitter: Martin Sebor Date: 2006-06-22

+

View all issues with NAD Editorial status.

+

Discussion:

+

+ +The iststream(char*, streamsize) ctor is in the class +synopsis in D.7.2 but its signature is missing in the description +below (in D.7.2.1). + +

+ + +

Proposed resolution:

+

+ +This seems like a simple editorial issue and the missing signature can +be added to the one for const char* in paragraph 2. + +

+ +

[ +post Oxford: Noted that it is already fixed in +N2284 +]

+ + + + + + +
+

590. Type traits implementation latitude should be removed for C++0x

+

Section: 20.4 [meta], TR1 4.9 [tr.meta.req] Status: NAD Editorial + Submitter: Beman Dawes Date: 2006-08-10

+

View all other issues in [meta].

+

View all issues with NAD Editorial status.

+

Discussion:

+

+20.4.9 [lib.meta.req], Implementation requirements, provides latitude for type +traits implementers that is not needed in C++0x. It includes the wording: +

+ +

+[Note: the latitude granted to implementers in this clause is temporary, +and is expected to be removed in future revisions of this document. -- end note] +

+ +

+Note: +N2157: Minor Modifications to the type traits Wording +also has the intent of removing this wording from the WP. +

+ + + +

Proposed resolution:

+

+Remove 20.4.9 [lib.meta.req] in its entirety from the WP. +

+ +

[ +post-Oxford: Recommend NAD Editorial. This resolution is now in the +current working draft. +]

+ + + + + + + +
+

591. Misleading "built-in

+

Section: 18.2.1.2 [numeric.limits.members] Status: NAD Editorial + Submitter: whyglinux Date: 2006-08-08

+

View all other issues in [numeric.limits.members].

+

View all issues with NAD Editorial status.

+

Discussion:

+

+18.2.1.2 numeric_limits members [lib.numeric.limits.members] +Paragraph 7: +

+

+"For built-in integer types, the number of non-sign bits in the +representation." +

+ +

+26.1 Numeric type requirements [lib.numeric.requirements] +Footnote: +

+ +

+"In other words, value types. These include built-in arithmetic types, +pointers, the library class complex, and instantiations of valarray for +value types." +

+ +

+Integer types (which are bool, char, wchar_t, and the signed and +unsigned integer types) and arithmetic types (which are integer and +floating types) are all built-in types and thus there are no +non-built-in (that is, user-defined) integer or arithmetic types. Since +the redundant "built-in" in the above 2 sentences can mislead that +there may be built-in or user-defined integer and arithmetic types +(which is not correct), the "built-in" should be removed. +

+ + +

Proposed resolution:

+

+18.2.1.2 numeric_limits members [lib.numeric.limits.members] +Paragraph 7: +

+

+"For built-in integer types, the number of non-sign bits in the +representation." +

+ +

+26.1 Numeric type requirements [lib.numeric.requirements] +Footnote: +

+ +

+"In other words, value types. These include built-in arithmetic types, +pointers, the library class complex, and instantiations of valarray for +value types." +

+ + +

Rationale:

+

+Recommend NAD / Editorial. The proposed resolution is accepted as editorial. +

+ + + + + +
+

592. Incorrect treatment of rdbuf()->close() return type

+

Section: 27.8.1.9 [ifstream.members] Status: Pending NAD Editorial + Submitter: Christopher Kohlhoff Date: 2006-08-17

+

View all other issues in [ifstream.members].

+

View all issues with Pending NAD Editorial status.

+

Discussion:

+

+I just spotted a minor problem in 27.8.1.7 +[lib.ifstream.members] para 4 and also 27.8.1.13 +[lib.fstream.members] para 4. In both places it says: +

+
+
void close();
+
+

+Effects: Calls rdbuf()->close() and, if that function returns false, ... +

+
+

+However, basic_filebuf::close() (27.8.1.2) returns a pointer to the +filebuf on success, null on failure, so I think it is meant to +say "if that function returns a null pointer". Oddly, it is +correct for basic_ofstream. +

+ + +

Proposed resolution:

+

+Change 27.8.1.9 [ifstream.members], p5: +

+ +

+Effects: Calls rdbuf()->close() and, if that function +fails (returns false a null pointer), +calls setstate(failbit) (which may throw ios_base::failure +(27.4.4.3)). +

+ +

+Change 27.8.1.17 [fstream.members], p5: +

+ +

+Effects: Calls rdbuf()->close() and, if that function +fails (returns false a null pointer), +calls setstate(failbit) (which may throw ios_base::failure +(27.4.4.3)). +

+ + + +

[ +Kona (2007): Proposed Disposition: NAD, Editorial +]

+ + + + + +
+

594. Disadvantages of defining Swappable in terms of CopyConstructible and Assignable

+

Section: 20.1.1 [utility.arg.requirements] Status: Pending NAD Editorial + Submitter: Niels Dekker Date: 2006-11-02

+

View other active issues in [utility.arg.requirements].

+

View all other issues in [utility.arg.requirements].

+

View all issues with Pending NAD Editorial status.

+

Discussion:

+

+It seems undesirable to define the Swappable requirement in terms of +CopyConstructible and Assignable requirements. And likewise, once the +MoveConstructible and MoveAssignable requirements (N1860) have made it +into the Working Draft, it seems undesirable to define the Swappable +requirement in terms of those requirements. Instead, it appears +preferable to have the Swappable requirement defined exclusively in +terms of the existence of an appropriate swap function. +

+

+Section 20.1.4 [lib.swappable] of the current Working Draft (N2009) +says: +

+

+The Swappable requirement is met by satisfying one or more of the +following conditions:

+
    +
  • +T is Swappable if T satisfies the CopyConstructible requirements +(20.1.3) and the Assignable requirements (23.1); +
  • +
  • +T is Swappable if a namespace scope function named swap exists in the +same namespace as the definition of T, such that the expression +swap(t,u) is valid and has the semantics described in Table 33. +
  • +
+
+I can think of three disadvantages of this definition: +
    +
  1. +If a client's type T satisfies the first condition (T is both +CopyConstructible and Assignable), the client cannot stop T from +satisfying the Swappable requirement without stopping T from +satisfying the first condition. +

    +A client might want to stop T from satisfying the Swappable +requirement, because swapping by means of copy construction and +assignment might throw an exception, and she might find a throwing +swap unacceptable for her type. On the other hand, she might not feel +the need to fully implement her own swap function for this type. In +this case she would want to be able to simply prevent algorithms that +would swap objects of type T from being used, e.g., by declaring a +swap function for T, and leaving this function purposely undefined. +This would trigger a link error, if an attempt would be made to use +such an algorithm for this type. For most standard library +implementations, this practice would indeed have the effect of +stopping T from satisfying the Swappable requirement. +

    +
  2. +
  3. +A client's type T that does not satisfy the first condition can not be +made Swappable by providing a specialization of std::swap for T. +

    +While I'm aware about the fact that people have mixed feelings about +providing a specialization of std::swap, it is well-defined to do so. +It sounds rather counter-intuitive to say that T is not Swappable, if +it has a valid and semantically correct specialization of std::swap. +Also in practice, providing such a specialization will have the same +effect as satisfying the Swappable requirement. +

    +
  4. +
  5. +For a client's type T that satisfies both conditions of the Swappable +requirement, it is not specified which of the two conditions prevails. +After reading section 20.1.4 [lib.swappable], one might wonder whether +objects of T will be swapped by doing copy construction and +assignments, or by calling the swap function of T. +

    +I'm aware that the intention of the Draft is to prefer calling the +swap function of T over doing copy construction and assignments. Still +in my opinion, it would be better to make this clear in the wording of +the definition of Swappable. +

    +
  6. +
+

+I would like to have the Swappable requirement defined in such a way +that the following code fragment will correctly swap two objects of a +type T, if and only if T is Swappable: +

+
   using std::swap;
+   swap(t, u);  // t and u are of type T.
+
+

+This is also the way Scott Meyers recommends calling a swap function, +in Effective C++, Third Edition, item 25. +

+

+Most aspects of this issue have been dealt with in a discussion on +comp.std.c++ about the Swappable requirement, from 13 September to 4 +October 2006, including valuable input by David Abrahams, Pete Becker, +Greg Herlihy, Howard Hinnant and others. +

+ +

Proposed resolution:

+

+Change section 20.1.4 [lib.swappable] as follows: +

+

+The Swappable requirement is met by satisfying +one or more of the following conditions: +the following condition:

+
    + +
  • +T is Swappable if T satisfies the CopyConstructible requirements +(20.1.3) and the Assignable requirements (23.1); +
  • +
  • + +T is Swappable if a namespace scope function named swap exists in the +same namespace as the definition of T, such that the expression +swap(t,u) is valid and has the semantics described in Table 33. + +T is Swappable if an unqualified function call swap(t,u) is valid +within the namespace std, and has the semantics described in Table 33. +
  • +
+
+ + +

Rationale:

+

+Recommend NAD. Concepts, specifically +N2082 +and +N2084, +will essentially rewrite this section and provide the desired semantics. +

+ + + + + +
+

615. Inconsistencies in Section 21.4

+

Section: 21.5 [c.strings] Status: NAD Editorial + Submitter: Bo Persson Date: 2006-12-11

+

View all other issues in [c.strings].

+

View all issues with NAD Editorial status.

+

Discussion:

+

+In the current draft N2134, 21.4/1 says +

+

+"Tables 59,228) 60, 61, 62,and 63 229) 230) describe headers <cctype>, +<cwctype>, <cstring>, <cwchar>, and <cstdlib> (character conversions), +respectively." +

+

+Here footnote 229 applies to table 62, not table 63. +

+

+Also, footnote 230 lists the new functions in table 63, "atoll, strtoll, +strtoull, strtof, and strtold added by TR1". However, strtof is not present +in table 63. +

+ + +

Proposed resolution:

+

+

+ + +

Rationale:

+

+Recommend NAD, editorial. Send to Pete. +

+ + + + + +
+

633. Return clause mentions undefined "type()"

+

Section: 20.5.15.2.5 [func.wrap.func.targ] Status: NAD Editorial + Submitter: Daniel Krügler Date: 2007-02-03

+

View all issues with NAD Editorial status.

+

Discussion:

+

+20.5.15.2.5 [func.wrap.func.targ], p4 says: +

+

+Returns: If type() == typeid(T), a pointer to the stored +function target; otherwise a null pointer. +

+ +
    +
  1. +There exists neither a type, a typedef type, nor member +function type() in class template function nor in the global or +std namespace. +
  2. +
  3. +Assuming that type should have been target_type(), +this description would lead to false results, if T = cv +void due to returns clause 20.5.15.2.5 [func.wrap.func.targ], p1. +
  4. +
+ + + +

Proposed resolution:

+

+Change 20.5.15.2.5 [func.wrap.func.targ], p4: +

+ +

+Returns: If type() target_type() == typeid(T) && typeid(T) != +typeid(void), a pointer to the stored function target; +otherwise a null pointer. +

+ +

[ +Pete: Agreed. It's editorial, so I'll fix it. +]

+ + + + + + + +
+

636. 26.5.2.3 valarray::operator[]

+

Section: 26.5.2.3 [valarray.access] Status: NAD Editorial + Submitter: Bo Persson Date: 2007-02-11

+

View all other issues in [valarray.access].

+

View all issues with NAD Editorial status.

+

Discussion:

+

+The signature of the const operator[] has been changed to return a const +reference. +

+

+The description in paragraph 1 still says that the operator returns by +value. +

+

[ +Pete recommends editorial fix. +]

+ + + +

Proposed resolution:

+

+

+ + + + + +
+

637. [c.math]/10 inconsistent return values

+

Section: 26.7 [c.math] Status: NAD Editorial + Submitter: Bo Persson Date: 2007-02-13

+

View other active issues in [c.math].

+

View all other issues in [c.math].

+

View all issues with NAD Editorial status.

+

Discussion:

+

+26.7 [c.math], paragraph 10 has long lists of added signatures for float and long double +functions. All the signatures have float/long double return values, which is +inconsistent with some of the double functions they are supposed to +overload. +

+ + +

Proposed resolution:

+

+Change 26.7 [c.math], paragraph 10, +

+ +
float int ilogb(float);
+float long lrint(float);
+float long lround(float);
+float long long llrint(float);
+float long long llround(float);
+
+long double int ilogb(long double);
+long double long lrint(long double);
+long double long lround(long double);
+long double long long llrint(long double);
+long double long long llround(long double);
+
+ + + + + +
+

639. Still problems with exceptions during streambuf IO

+

Section: 27.6.1.2.3 [istream::extractors], 27.6.2.6.3 [ostream.inserters] Status: NAD + Submitter: Daniel Krügler Date: 2007-02-17

+

View all other issues in [istream::extractors].

+

View all issues with NAD status.

+

Discussion:

+

+There already exist two active DR's for the wording of 27.6.1.2.3 [istream::extractors]/13 +from 14882:2003(E), namely 64 and 413. +

+ +

+Even with these proposed corrections, already maintained in N2134, +I have the feeling, that the current wording does still not properly +handle the "exceptional" situation. The combination of para 14 +

+ +

+"[..] Characters are extracted and inserted until +any of the following occurs: +

+

+[..] +

+

+- an exception occurs (in which case the exception is caught)." +

+ +

+and 15 +

+ +

+"If the function inserts no characters, it calls setstate(failbit), +which +may throw ios_base::failure (27.4.4.3). If it inserted no characters +because it caught an exception thrown while extracting characters +from *this and failbit is on in exceptions() (27.4.4.3), then the +caught +exception is rethrown." +

+ +

+both in N2134 seems to imply that any exception, which occurs +*after* at least one character has been inserted is caught and lost +for +ever. It seems that even if failbit is on in exceptions() rethrow is +not +allowed due to the wording "If it inserted no characters because it +caught an exception thrown while extracting". +

+ +

+Is this behaviour by design? +

+ +

+I would like to add that its output counterpart in 27.6.2.6.3 [ostream.inserters]/7-9 +(also +N2134) does not demonstrate such an exception-loss-behaviour. +On the other side, I wonder concerning several subtle differences +compared to input:: +

+

+1) Paragraph 8 says at its end: +

+ +

+"- an exception occurs while getting a character from sb." +

+ +

+Note that there is nothing mentioned which would imply that such +an exception will be caught compared to 27.6.1.2.3 [istream::extractors]/14. +

+ +

+2) Paragraph 9 says: +

+ +

+"If the function inserts no characters, it calls setstate(failbit) +(which +may throw ios_base::failure (27.4.4.3)). If an exception was thrown +while extracting a character, the function sets failbit in error +state, +and if failbit is on in exceptions() the caught exception is +rethrown." +

+ +

+The sentence starting with "If an exception was thrown" seems to +imply that such an exception *should* be caught before. +

+ + +

Proposed resolution:

+

+(a) In 27.6.1.2.3 [istream::extractors]/15 (N2134) change the sentence +

+ +

+If the function inserts no characters, it calls +setstate(failbit), which may throw ios_base::failure +(27.4.4.3). If it inserted no characters because it caught an +exception thrown while extracting characters from *this +an exception was thrown while extracting a character from +*this, the function sets failbit in error state, +and failbit is on in exceptions() (27.4.4.3), then the +caught exception is rethrown. +

+ +

+(b) In 27.6.2.6.3 [ostream.inserters]/8 (N2134) change the sentence: +

+ +
+

+Gets characters from sb and inserts them in *this. +Characters are read from sb and inserted until any of the +following occurs: +

+
    +
  • end-of-file occurs on the input sequence;
  • +
  • inserting in the output sequence fails (in which case the character to be inserted is not extracted);
  • +
  • an exception occurs while getting a character from sb (in which +case the exception is caught).
  • +
+
+ + + +

Rationale:

+This extractor is described as a formatted input function so the +exception behavior is already specified. There is additional behavior +described in this section that applies to the case in which failbit is +set. This doesn't contradict the usual exception behavior for formatted +input functions because that applies to the case in which badbit is set. + + + + + +
+

641. Editorial fix for 27.6.4 (N2134)

+

Section: 27.6.4 [ext.manip] Status: NAD Editorial + Submitter: Daniel Krügler Date: 2007-02-18

+

View all other issues in [ext.manip].

+

View all issues with NAD Editorial status.

+

Discussion:

+

+The function f in para 4 (27.6.4 [ext.manip]) references an unknown strm +in the following line: +

+ +
mg.get(Iter(str.rdbuf()), Iter(), intl, strm, err, mon);
+
+ + +

Proposed resolution:

+

+Change 27.6.4 [ext.manip], p4: +

+ +
mg.get(Iter(str.rdbuf()), Iter(), intl, strm, err, mon);
+
+ +

[ +Oxford: Editorial. +]

+ + + + + + + +
+

642. Invalidated fstream footnotes in N2134

+

Section: 27.8.1.9 [ifstream.members], 27.8.1.13 [ofstream.members] Status: NAD Editorial + Submitter: Daniel Krügler Date: 2007-02-20

+

View all other issues in [ifstream.members].

+

View all issues with NAD Editorial status.

+

Discussion:

+

+The standard wording of N2134 has extended the 14882:2003(E) +wording for the ifstream/ofstream/fstream open function to fix +a long standing problem, see 409. +

+ +

+Now it's properly written as +

+ +

+"If that function does not return a null pointer calls clear(), +otherwise +calls setstate(failbit)[..]" +

+ +

+instead of the previous +

+ +

+"If that function returns a null pointer, calls setstate(failbit)[..] +

+ +

+While the old footnotes saying +

+ +

+"A successful open does not change the error state." +

+ +

+where correct and important, they are invalid now for ifstream and +ofstream (because clear *does* indeed modify the error state) and +should be removed (Interestingly fstream itself never had these, +although +they where needed for that time). +

+ + +

Proposed resolution:

+

+In 27.8.1.9 [ifstream.members], remove footnote: +

+ +

+334) A successful open does not change the error state. +

+ +

+In 27.8.1.13 [ofstream.members], remove footnote: +

+ +

+335) A successful open does not change the error state. +

+ + + + + + +
+

647. Inconsistent regex_search params

+

Section: 28.11.3 [re.alg.search] Status: NAD Editorial + Submitter: Daniel Krügler Date: 2007-02-26

+

View all issues with NAD Editorial status.

+

Discussion:

+

+28.11.3 [re.alg.search]/5 declares +

+ +
template <class iterator, class charT, class traits>
+bool regex_search(iterator first, iterator last,
+                  const basic_regex<charT, traits>& e,
+                  regex_constants::match_flag_type flags =
+                      regex_constants::match_default);
+
+ +

+where it's not explained, which iterator category +the parameter iterator belongs to. This is inconsistent +to the preceding declaration in the synopsis section +28.4 [re.syn], which says: +

+ +
template <class BidirectionalIterator, class charT, class traits>
+bool regex_search(BidirectionalIterator first, BidirectionalIterator last,
+                  const basic_regex<charT, traits>& e,
+                  regex_constants::match_flag_type flags =
+                      regex_constants::match_default);
+
+ + +

Proposed resolution:

+

+In 28.11.3 [re.alg.search]/5 replace all three occurences of param "iterator" with +"BidirectionalIterator" +

+ +
template <class iterator BidirectionalIterator, class charT, class traits>
+  bool regex_search(iterator BidirectionalIterator first, iterator BidirectionalIterator last, 
+                    const basic_regex<charT, traits>& e, 
+                    regex_constants::match_flag_type flags = 
+                      regex_constants::match_default);
+
+

+-6- Effects: Behaves "as if" by constructing an object what of +type match_results<iterator +BidirectionalIterator> and then returning the result +of regex_search(first, last, what, e, flags). +

+
+ + +

Rationale:

+Applied to working paper while issue was still in New status. + + + + + +
+

648. regex_iterator c'tor needs clarification/editorial fix

+

Section: 28.12.1.1 [re.regiter.cnstr] Status: NAD Editorial + Submitter: Daniel Krügler Date: 2007-03-03

+

View all issues with NAD Editorial status.

+

Discussion:

+

+In 28.12.1.1 [re.regiter.cnstr]/2 the effects paragraph starts with: +

+ +
+

+Effects: Initializes begin and end to point to the beginning and the +end of the target sequence, sets pregex to &re, sets flags to f,[..] +

+ +

+There are two issues with this description: +

+ +
    +
  1. +The meaning of very first part of this quote is unclear, because +there is no target sequence provided, instead there are given two +parameters a and b, both of type BidirectionalIterator. The mentioned +part does not explain what a and b represent. +
  2. +
  3. +There does not exist any parameter f, but instead a parameter +m in the constructor declaration, so this is actually an editorial +fix. +
  4. +
+ + +

Proposed resolution:

+

+In 28.12.1.1 [re.regiter.cnstr]/2 change the above quoted part by +

+ +

+Effects: Initializes begin and end to point to +the beginning and the end of the target sequence designated by the +iterator range [a, b), sets pregex to +&re, sets flags to f +m, then calls regex_search(begin, end, match, +*pregex, flags). If this call returns false the +constructor sets *this to the end-of-sequence iterator. +

+ + + + + +
+

649. Several typos in regex_token_iterator constructors

+

Section: 28.12.2.1 [re.tokiter.cnstr] Status: NAD Editorial + Submitter: Daniel Krügler Date: 2007-03-03

+

View all other issues in [re.tokiter.cnstr].

+

View all issues with NAD Editorial status.

+

Discussion:

+

+In 28.12.2.1 [re.tokiter.cnstr]/1+2 both the constructor declaration +and the following text shows some obvious typos: +

+

+1) The third constructor form is written as +

+
template <std::size_t N>
+  regex_token_iterator(BidirectionalIterator a, BidirectionalIterator b, 
+                       const regex_type& re, 
+                       const int (&submatches)[R], 
+                       regex_constants::match_flag_type m = 
+                         regex_constants::match_default);
+
+ +

+where the dimensions of submatches are specified by an +unknown value R, which should be N. +

+

+2) Paragraph 2 of the same section says in its last sentence: +

+ +

+The third constructor initializes the member subs to hold a +copy of the sequence of integer values pointed to by the iterator range +[&submatches, &submatches + R). +

+ +

+where again R must be replaced by N. +

+ +

+3) Paragraph 3 of the same section says in its first sentence: +

+ +

+Each constructor then sets N to 0, and +position to position_iterator(a, b, re, f). +

+ +

+where a non-existing parameter "f" is mentioned, which must be +replaced +by the parameter "m". +

+ + +

Proposed resolution:

+

+Change 28.12.2.1 [re.tokiter.cnstr]/1: +

+
template <std::size_t N>
+  regex_token_iterator(BidirectionalIterator a, BidirectionalIterator b, 
+                       const regex_type& re, 
+                       const int (&submatches)[R N], 
+                       regex_constants::match_flag_type m = 
+                         regex_constants::match_default);
+
+ +

+Change 28.12.2.1 [re.tokiter.cnstr]/2: +

+ +

+Effects: The first constructor initializes the member +subs to hold the single value submatch. The second +constructor initializes the member subs to hold a copy of the +argument submatches. The third constructor initializes the +member subs to hold a copy of the sequence of integer values +pointed to by the iterator range [&submatches, &submatches + +R N). +

+ +

+Change 28.12.2.1 [re.tokiter.cnstr]/3: +

+ +

+Each constructor then sets N to 0, and +position to position_iterator(a, b, re, f +m). If position is not an end-of-sequence +iterator the constructor sets result to the address of the +current match. Otherwise if any of the values stored in subs is +equal to -1 the constructor sets *this to a suffix +iterator that points to the range [a, b), otherwise the +constructor sets *this to an end-of-sequence iterator. +

+ + + + + + +
+

656. Typo in subtract_with_carry_engine declaration

+

Section: 26.4.2 [rand.synopsis] Status: NAD Editorial + Submitter: Daniel Krügler Date: 2007-03-08

+

View all other issues in [rand.synopsis].

+

View all issues with NAD Editorial status.

+

Discussion:

+

+26.4.2 [rand.synopsis] the header <random> synopsis +contains an unreasonable closing curly brace inside the +subtract_with_carry_engine declaration. +

+ + +

Proposed resolution:

+

+Change the current declaration in 26.4.2 [rand.synopsis] +

+ +
template <class UIntType, size_t w}, size_t s, size_t r>
+class subtract_with_carry_engine;
+
+ + +

[ +Pete: Recommends editorial. +]

+ + + + + +
+

657. unclear requirement about header inclusion

+

Section: 17.4.2.1 [using.headers] Status: NAD + Submitter: Gennaro Prota Date: 2007-03-14

+

View all issues with NAD status.

+

Discussion:

+

+17.4.2.1 [using.headers] states: +

+ +

+A translation unit shall include a header only outside of any +external declaration or definition, [...] +

+ +

+I see three problems with this requirement: +

+ +
    +
  1. The C++ standard doesn't define what an "external declaration" or +an "external definition" are (incidentally the C99 standard does, and +has a sentence very similar to the above regarding header inclusion). +

    +I think the intent is that the #include directive shall lexically +appear outside *any* declaration; instead, when the issue was pointed +out on comp.std.c++ at least one poster interpreted "external +declaration" as "declaration of an identifier with external linkage". +If this were the correct interpretation, then the two inclusions below +would be legal: +

    +
      // at global scope
    +  static void f()
    +  {
    +# include <cstddef>
    +  }
    +
    +  static void g()
    +  {
    +# include <stddef.h>
    +  }
    +
    +

    +(note that while the first example is unlikely to compile correctly, +the second one may well do) +

  2. + +
  3. as the sentence stands, violations will require a diagnostic; is +this the intent? It was pointed out on comp.std.c++ (by several +posters) that at least one way to ensure a diagnostic exists: +

    +

    + [If there is an actual file for each header,] one simple way + to implement this would be to insert a reserved identifier + such as __begin_header at the start of each standard header. + This reserved identifier would be ignored for all other + purposes, except that, at the appropriate point in phase 7, if + it is found inside an external definition, a diagnostic is + generated. There's many other similar ways to achieve the same + effect. +

    +

    --James Kuyper, on comp.std.c++ +

  4. + +
  5. is the term "header" meant to be limited to standard headers? +Clause 17 is all about the library, but still the general question is +interesting and affects one of the points in the explicit namespaces +proposal (n1691): +

    +

    + Those seeking to conveniently enable argument-dependent + lookups for all operators within an explicit namespace + could easily create a header file that does so: +

        namespace mymath::
    +    {
    +        #include "using_ops.hpp"
    +    }
    +
    +
  6. +
+ + +

Proposed resolution:

+

+

+ + +

Rationale:

+We believe that the existing language does not cause any real confusion +and any new formulation of the rules that we could come up with are +unlikely to be better than what's already in the standard. + + + + + +
+

658. Two unspecified function comparators in [function.objects]

+

Section: 20.5 [function.objects] Status: NAD Editorial + Submitter: Daniel Krügler Date: 2007-03-19

+

View all other issues in [function.objects].

+

View all issues with NAD Editorial status.

+

Discussion:

+

+The header <functional> synopsis in 20.5 [function.objects] +contains the following two free comparison operator templates +for the function class template +

+ +
template<class Function1, class Function2>
+void operator==(const function<Function1>&, const function<Function2>&);
+template<class Function1, class Function2>
+void operator!=(const function<Function1>&, const function<Function2>&);
+
+ +

+which are nowhere described. I assume that they are relicts before the +corresponding two private and undefined member templates in the function +template (see 20.5.15.2 [func.wrap.func] and X [func.wrap.func.undef]) have been introduced. The original free +function templates should be removed, because using an undefined entity +would lead to an ODR violation of the user. +

+ + +

Proposed resolution:

+

+Remove the above mentioned two function templates from +the header <functional> synopsis (20.5 [function.objects]) +

+ +
template<class Function1, class Function2>
+void operator==(const function<Function1>&, const function<Function2>&);
+template<class Function1, class Function2>
+void operator!=(const function<Function1>&, const function<Function2>&);
+
+ + + +

Rationale:

+Fixed by +N2292 +Standard Library Applications for Deleted Functions. + + + + + +
+

662. Inconsistent handling of incorrectly-placed thousands separators

+

Section: 22.2.2.1.2 [facet.num.get.virtuals] Status: NAD + Submitter: Cosmin Truta Date: 2007-04-05

+

View other active issues in [facet.num.get.virtuals].

+

View all other issues in [facet.num.get.virtuals].

+

View all issues with NAD status.

+

Discussion:

+

+From Section 22.2.2.1.2 [facet.num.get.virtuals], paragraphs 11 and 12, it is implied +that the value read from a stream must be stored +even if the placement of thousands separators does not conform to the +grouping() specification from the numpunct facet. +Since incorrectly-placed thousands separators are flagged as an extraction +failure (by the means of failbit), we believe it is better not +to store the value. A consistent strategy, in which any kind of extraction +failure leaves the input item intact, is conceptually cleaner, is able to avoid +corner-case traps, and is also more understandable from the programmer's point +of view. +

+

+Here is a quote from "The C++ Programming Language (Special Edition)" +by B. Stroustrup (Section D.4.2.3, pg. 897): +

+

+"If a value of the desired type could not be read, failbit is set in r. +[...] An input operator will use r to determine how to set the state of its +stream. If no error was encountered, the value read is assigned through v; +otherwise, v is left unchanged." +

+

+This statement implies that rdstate() alone is sufficient to +determine whether an extracted value is to be assigned to the input item +val passed to do_get. However, this is in disagreement +with the current C++ Standard. The above-mentioned assumption is true in all +cases, except when there are mismatches in digit grouping. In the latter case, +the parsed value is assigned to val, and, at the same time, err +is assigned to ios_base::failbit (essentially "lying" about the +success of the operation). Is this intentional? The current behavior raises +both consistency and usability concerns. +

+

+Although digit grouping is outside the scope of scanf (on which +the virtual methods of num_get are based), handling of grouping +should be consistent with the overall behavior of scanf. The specification of +scanf makes a distinction between input failures and matching +failures, and yet both kinds of failures have no effect on the input items +passed to scanf. A mismatch in digit grouping logically falls in +the category of matching failures, and it would be more consistent, and less +surprising to the user, to leave the input item intact whenever a failure is +being signaled. +

+

+The extraction of bool is another example outside the scope of +scanf, and yet consistent, even in the event of a successful +extraction of a long but a failed conversion from +long to bool. +

+

+Inconsistency is further aggravated by the fact that, when failbit is set, +subsequent extraction operations are no-ops until failbit is +explicitly cleared. Assuming that there is no explicit handling of +rdstate() (as in cin>>i>>j) it is +counter-intuitive to be able to extract an integer with mismatched digit +grouping, but to be unable to extract another, properly-formatted integer +that immediately follows. +

+

+Moreover, setting failbit, and selectively assigning a value to +the input item, raises usability problems. Either the strategy of +scanf (when there is no extracted value in case of failure), or +the strategy of the strtol family (when there is always an +extracted value, and there are well-defined defaults in case of a failure) are +easy to understand and easy to use. On the other hand, if failbit +alone cannot consistently make a difference between a failed extraction, and a +successful but not-quite-correct extraction whose output happens to be the same +as the previous value, the programmer must resort to implementation tricks. +Consider the following example: +

+
    int i = old_i;
+    cin >> i;
+    if (cin.fail())
+        // can the value of i be trusted?
+        // what does it mean if i == old_i?
+        // ...
+
+

+Last but not least, the current behvaior is not only confusing to the casual +reader, but it has also been confusing to some book authors. Besides +Stroustrup's book, other books (e.g. "Standard C++ IOStreams and Locales" by +Langer and Kreft) are describing the same mistaken assumption. Although books +are not to be used instead of the standard reference, the readers of these +books, as well as the people who are generally familiar to scanf, +are even more likely to misinterpret the standard, and expect the input items +to remain intact when a failure occurs. +

+ + +

Proposed resolution:

+ +

+Change 22.2.2.1.2 [facet.num.get.virtuals]: +

+ +
+

+Stage 3: The result of stage 2 processing can be one of +

+
    +
  • A sequence of chars has been accumulated in stage 2 that is converted (according to the rules of scanf) to a value of the type of val. This value is stored in val and ios_base::goodbit is stored in err.
  • + +
  • The sequence of chars accumulated in stage 2 would have caused scanf to report an input failure. ios_base::failbit is assigned to err.
  • +
+

+In the first case, Ddigit grouping is checked. That is, the positions of discarded separators is examined for consistency with use_facet<numpunct<charT> >(loc).grouping(). If they are not consistent then ios_base::failbit is assigned to err. Otherwise, the value that was converted in stage 2 is stored in val and ios_base::goodbit is stored in err. +

+
+ + +

Rationale:

+post-Toronto: Changed from New to NAD at the request of the author. The preferred solution of +N2327 +makes this resolution obsolete. + + + + + +
+

663. Complexity Requirements

+

Section: 17.3.1.3 [structure.specifications] Status: NAD + Submitter: Thomas Plum Date: 2007-04-16

+

View all other issues in [structure.specifications].

+

View all issues with NAD status.

+

Discussion:

+

+17.3.1.3 [structure.specifications] para 5 says +

+ +

+-5- Complexity requirements specified in the library  +clauses are upper bounds, and implementations that provide better +complexity guarantees satisfy the requirements. +

+ +

+The following +objection has been raised: +

+ +

+The library clauses suggest general +guidelines regarding complexity, but we have been unable to discover +any absolute hard-and-fast formulae for these requirements.  Unless +or until the Library group standardizes specific hard-and-fast +formulae, we regard all the complexity requirements as subject to a  +"fudge factor" without any intrinsic upper bound. +

+ +

+[Plum ref  +_23213Y31 etc] +

+ + +

Proposed resolution:

+

+

+ + +

Rationale:

+Kona (2007): No specific instances of underspecification have been +identified, and big-O notation always involves constant factors. + + + + + +
+

683. regex_token_iterator summary error

+

Section: 28.12.2 [re.tokiter] Status: Pending NAD Editorial + Submitter: Eric Niebler Date: 2007-06-02

+

View all other issues in [re.tokiter].

+

View all issues with Pending NAD Editorial status.

+

Discussion:

+

+28.12.2 [re.tokiter], p3 says: +

+
+

+After it is constructed, the iterator finds and stores a value +match_results<BidirectionalIterator> position and sets the +internal count N to zero. +

+
+ +

+Should read: +

+ +
+

+After it is constructed, the iterator finds and stores a value +match_resultsregex_iterator<BidirectionalIterator, charT, traits> +position and sets the internal count N to zero. +

+
+ +

[ +John adds: +]

+ + +

+Yep, looks like a typo/administrative fix to me. +

+ + + +

Proposed resolution:

+

+

+ + + + + +
+

690. abs(long long) should return long long

+

Section: 26.7 [c.math] Status: NAD Editorial + Submitter: Niels Dekker Date: 2007-06-10

+

View other active issues in [c.math].

+

View all other issues in [c.math].

+

View all issues with NAD Editorial status.

+

Discussion:

+

+Quoting the latest draft (n2135), 26.7 [c.math]: +

+ +
+

+The added signatures are: +

+
long abs(long); // labs()
+long abs(long long); // llabs()
+
+
+

+Shouldn't abs(long long) have long long as return type? +

+ + +

Proposed resolution:

+

+Change 26.7 [c.math]: +

+
long long abs(long long); // llabs()
+
+ + +

Rationale:

+Had already been fixed in the WP by the time the LWG reviewed this. + + + + + + \ No newline at end of file diff --git a/libstdc++-v3/doc/html/ext/lwg-defects.html b/libstdc++-v3/doc/html/ext/lwg-defects.html new file mode 100644 index 00000000000..cefbee652e6 --- /dev/null +++ b/libstdc++-v3/doc/html/ext/lwg-defects.html @@ -0,0 +1,24284 @@ + +C++ Standard Library Defect Report List + + + + + + + + + + + + + + + + + + + + + +
Doc. no.N2457=07-0327
Date:2007-10-20
Project:Programming Language C++
Reply to:Howard Hinnant <howard.hinnant@gmail.com>
+

C++ Standard Library Defect Report List (Revision R52)

+ +

Reference ISO/IEC IS 14882:1998(E)

+

Also see:

+ +

This document contains only library issues which have been closed + by the Library Working Group (LWG) after being found to be defects + in the standard. That is, issues which have a status of DR, + TC, or RR. See the + Library Closed Issues List for issues closed as non-defects. See the + Library Active Issues List for active issues and more information. The + introductory material in that document also applies to this + document.

+ +

Revision History

+
    +
  • R52: +2007-10-19 post-Kona mailing. + +
  • +
  • R51: +2007-09-09 pre-Kona mailing. + +
  • +
  • R50: +2007-08-05 post-Toronto mailing. +
      +
    • Summary:
        +
      • 153 open issues, down by 5.
      • +
      • 555 closed issues, up by 17.
      • +
      • 708 issues total, up by 12.
      • +
    • +
    • Details:
        +
      • Added the following New issues: 697, 698, 699, 700, 701, 702, 703, 704, 705, 706, 707, 708.
      • +
      • Changed the following issues from New to NAD: 583, 584, 662.
      • +
      • Changed the following issues from Open to NAD: 528.
      • +
      • Changed the following issues from New to NAD Editorial: 637, 647, 658, 690.
      • +
      • Changed the following issues from Open to NAD Editorial: 525.
      • +
      • Changed the following issues from Pending NAD Editorial to NAD Editorial: 553, 571, 591, 633, 636, 641, 642, 648, 649, 656.
      • +
      • Changed the following issues from New to Open: 579, 631, 680.
      • +
      • Changed the following issues from Pending WP to Open: 258.
      • +
      • Changed the following issues from Ready to Pending WP: 644.
      • +
      • Changed the following issues from New to Ready: 577, 660.
      • +
      • Changed the following issues from Open to Ready: 488.
      • +
      • Changed the following issues from Open to Review: 518.
      • +
      • Changed the following issues from Ready to TRDec: 604.
      • +
      • Changed the following issues from DR to WP: 453.
      • +
      • Changed the following issues from Ready to WP: 531, 551, 566, 628, 640, 643, 646.
      • +
    • +
    +
  • +
  • R49: +2007-06-23 pre-Toronto mailing. +
      +
    • Summary:
        +
      • 158 open issues, up by 13.
      • +
      • 538 closed issues, up by 7.
      • +
      • 696 issues total, up by 20.
      • +
    • +
    • Details:
        +
      • Added the following New issues: 677, 678, 679, 680, 681, 682, 684, 685, 686, 687, 688, 689, 690, 691, 692, 693, 694, 695, 696.
      • +
      • Added the following Pending NAD Editorial issues: 683.
      • +
      • Changed the following issues from New to NAD Editorial: 587.
      • +
      • Changed the following issues from Open to NAD Editorial: 590.
      • +
      • Changed the following issues from New to Pending NAD Editorial: 636, 642, 648, 649.
      • +
    • +
    +
  • +
  • R48: +2007-05-06 post-Oxford mailing. + +
  • +
  • R47: +2007-03-09 pre-Oxford mailing. + +
  • +
  • R46: +2007-01-12 mid-term mailing. +
      +
    • Summary:
        +
      • 141 open issues, up by 11.
      • +
      • 478 closed issues, down by 1.
      • +
      • 619 issues total, up by 10.
      • +
    • +
    • Details:
    • +
    +
  • +
  • R45: +2006-11-03 post-Portland mailing. + +
  • +
  • R44: +2006-09-08 pre-Portland mailing. +
      +
    • Summary:
        +
      • 130 open issues, up by 6.
      • +
      • 462 closed issues, down by 1.
      • +
      • 592 issues total, up by 5.
      • +
    • +
    • Details:
    • +
    +
  • +
  • R43: +2006-06-23 mid-term mailing. +
      +
    • Summary:
        +
      • 124 open issues, up by 14.
      • +
      • 463 closed issues, down by 1.
      • +
      • 587 issues total, up by 13.
      • +
    • +
    • Details:
    • +
    +
  • +
  • R42: +2006-04-21 post-Berlin mailing. + +
  • +
  • R41: +2006-02-24 pre-Berlin mailing. +
      +
    • Summary:
        +
      • 126 open issues, up by 31.
      • +
      • 440 closed issues, up by 0.
      • +
      • 566 issues total, up by 31.
      • +
    • +
    • Details:
        +
      • Added new issues 536-566.
      • +
      • Moved 342 from Ready to Open.
      • +
      • Reopened 309.
      • +
    • +
    +
  • +
  • R40: +2005-12-16 mid-term mailing. +
      +
    • Summary:
        +
      • 95 open issues.
      • +
      • 440 closed issues.
      • +
      • 535 issues total.
      • +
    • +
    • Details:
    • +
    +
  • +
  • R39: +2005-10-14 post-Mont Tremblant mailing. +Added new issues 526-528. +Moved issues 280, 461, 464, 465, 467, 468, 474, 496 from Ready to WP as per the vote from Mont Tremblant. +Moved issues 247, 294, 342, 362, 369, 371, 376, 384, 475, 478, 495, 497 from Review to Ready. +Moved issues 498, 504, 506, 509, 510, 511, 512, 513, 514 from New to Open. +Moved issues 505, 507, 508, 519 from New to Ready. +Moved issue 500 from New to NAD. +Moved issue 518 from New to Review. +
  • +
  • R38: +2005-07-03 pre-Mont Tremblant mailing. +Merged open TR1 issues in 504-522. +Added new issues 523-523 +
  • +
  • R37: +2005-06 mid-term mailing. +Added new issues 498-503. +
  • +
  • R36: +2005-04 post-Lillehammer mailing. All issues in "ready" status except +for 454 were moved to "DR" status, and all issues +previously in "DR" status were moved to "WP". +
  • +
  • R35: +2005-03 pre-Lillehammer mailing. +
  • +
  • R34: +2005-01 mid-term mailing. Added new issues 488-494. +
  • +
  • R33: +2004-11 post-Redmond mailing. Reflects actions taken in Redmond. +
  • +
  • R32: +2004-09 pre-Redmond mailing: reflects new proposed resolutions and +new issues received after the 2004-07 mailing. Added +new issues 479-481. +
  • +
  • R31: +2004-07 mid-term mailing: reflects new proposed resolutions and +new issues received after the post-Sydney mailing. Added +new issues 463-478. +
  • +
  • R30: +Post-Sydney mailing: reflects decisions made at the Sydney meeting. +Voted all "Ready" issues from R29 into the working paper. +Added new issues 460-462. +
  • +
  • R29: +Pre-Sydney mailing. Added new issues 441-457. +
  • +
  • R28: +Post-Kona mailing: reflects decisions made at the Kona meeting. +Added new issues 432-440. +
  • +
  • R27: +Pre-Kona mailing. Added new issues 404-431. +
  • +
  • R26: +Post-Oxford mailing: reflects decisions made at the Oxford meeting. +All issues in Ready status were voted into DR status. All issues in +DR status were voted into WP status. +
  • +
  • R25: +Pre-Oxford mailing. Added new issues 390-402. +
  • +
  • R24: +Post-Santa Cruz mailing: reflects decisions made at the Santa Cruz +meeting. All Ready issues from R23 with the exception of 253, which has been given a new proposed resolution, were +moved to DR status. Added new issues 383-389. (Issues 387-389 were discussed +at the meeting.) Made progress on issues 225, 226, 229: 225 and 229 have been moved to Ready status, and the only remaining +concerns with 226 involve wording. +
  • +
  • R23: +Pre-Santa Cruz mailing. Added new issues 367-382. +Moved issues in the TC to TC status. +
  • +
  • R22: +Post-Curaçao mailing. Added new issues 362-366. +
  • +
  • R21: +Pre-Curaçao mailing. Added new issues 351-361. +
  • +
  • R20: +Post-Redmond mailing; reflects actions taken in Redmond. Added +new issues 336-350, of which issues +347-350 were added since Redmond, hence +not discussed at the meeting. + +All Ready issues were moved to DR status, with the exception of issues +284, 241, and 267. + +Noteworthy issues discussed at Redmond include +120 202, 226, 233, +270, 253, 254, 323. +
  • +
  • R19: +Pre-Redmond mailing. Added new issues +323-335. +
  • +
  • R18: +Post-Copenhagen mailing; reflects actions taken in Copenhagen. +Added new issues 312-317, and discussed +new issues 271-314. + +Changed status of issues +103 118 136 153 +165 171 183 184 +185 186 214 221 +234 237 243 248 +251 252 256 260 +261 262 263 265 +268 +to DR. + +Changed status of issues +49 109 117 182 +228 230 232 235 +238 241 242 250 +259 264 266 267 +271 272 273 275 +281 284 285 286 +288 292 295 297 +298 301 303 306 +307 308 312 +to Ready. + +Closed issues +111 277 279 287 +289 293 302 313 +314 +as NAD. + +
  • +
  • R17: +Pre-Copenhagen mailing. Converted issues list to XML. Added proposed +resolutions for issues 49, 76, 91, 235, 250, 267. +Added new issues 278-311. +
  • +
  • R16: +post-Toronto mailing; reflects actions taken in Toronto. Added new +issues 265-277. Changed status of issues +3, 8, 9, 19, +26, 31, 61, +63, 86, 108, +112, 114, 115, +122, 127, 129, +134, 137, 142, +144, 146, 147, +159, 164, 170, +181, 199, 208, +209, 210, 211, +212, 217, 220, +222, 223, 224, +227 to "DR". Reopened issue 23. Reopened +issue 187. Changed issues 2 and +4 to NAD. Fixed a typo in issue 17. Fixed +issue 70: signature should be changed both places it +appears. Fixed issue 160: previous version didn't fix +the bug in enough places. +
  • +
  • R15: +pre-Toronto mailing. Added issues +233-264. Some small HTML formatting +changes so that we pass Weblint tests. +
  • +
  • R14: +post-Tokyo II mailing; reflects committee actions taken in +Tokyo. Added issues 228 to 232. (00-0019R1/N1242) +
  • +
  • R13: +pre-Tokyo II updated: Added issues 212 to 227. +
  • +
  • R12: +pre-Tokyo II mailing: Added issues 199 to +211. Added "and paragraph 5" to the proposed resolution +of issue 29. Add further rationale to issue +178. +
  • +
  • R11: +post-Kona mailing: Updated to reflect LWG and full committee actions +in Kona (99-0048/N1224). Note changed resolution of issues +4 and 38. Added issues 196 +to 198. Closed issues list split into "defects" and +"closed" documents. Changed the proposed resolution of issue +4 to NAD, and changed the wording of proposed resolution +of issue 38. +
  • +
  • R10: +pre-Kona updated. Added proposed resolutions 83, +86, 91, 92, +109. Added issues 190 to +195. (99-0033/D1209, 14 Oct 99) +
  • +
  • R9: +pre-Kona mailing. Added issues 140 to +189. Issues list split into separate "active" and +"closed" documents. (99-0030/N1206, 25 Aug 99) +
  • +
  • R8: +post-Dublin mailing. Updated to reflect LWG and full committee actions +in Dublin. (99-0016/N1193, 21 Apr 99) +
  • +
  • R7: +pre-Dublin updated: Added issues 130, 131, +132, 133, 134, +135, 136, 137, +138, 139 (31 Mar 99) +
  • +
  • R6: +pre-Dublin mailing. Added issues 127, 128, +and 129. (99-0007/N1194, 22 Feb 99) +
  • +
  • R5: +update issues 103, 112; added issues +114 to 126. Format revisions to prepare +for making list public. (30 Dec 98) +
  • +
  • R4: +post-Santa Cruz II updated: Issues 110, +111, 112, 113 added, several +issues corrected. (22 Oct 98) +
  • +
  • R3: +post-Santa Cruz II: Issues 94 to 109 +added, many issues updated to reflect LWG consensus (12 Oct 98) +
  • +
  • R2: +pre-Santa Cruz II: Issues 73 to 93 added, +issue 17 updated. (29 Sep 98) +
  • +
  • R1: +Correction to issue 55 resolution, 60 code +format, 64 title. (17 Sep 98) +
  • +
+ +

Defect Reports

+
+

1. C library linkage editing oversight

+

Section: 17.4.2.2 [using.linkage] Status: TC + Submitter: Beman Dawes Date: 1997-11-16

+

View all issues with TC status.

+

Discussion:

+

The change specified in the proposed resolution below did not make +it into the Standard. This change was accepted in principle at the +London meeting, and the exact wording below was accepted at the +Morristown meeting.

+ + +

Proposed resolution:

+

Change 17.4.2.2 [using.linkage] paragraph 2 +from:

+ +
+

It is unspecified whether a name from the Standard C library + declared with external linkage has either extern "C" or + extern "C++" linkage.

+
+ +

to:

+ +
+

Whether a name from the Standard C library declared with external + linkage has extern "C" or extern "C++" linkage + is implementation defined. It is recommended that an implementation + use extern "C++" linkage for this purpose.

+
+ + + + + +
+

3. Atexit registration during atexit() call is not described

+

Section: 18.4 [support.start.term] Status: TC + Submitter: Steve Clamage Date: 1997-12-12

+

View all issues with TC status.

+

Discussion:

+

We appear not to have covered all the possibilities of + exit processing with respect to +atexit registration.
+
+Example 1: (C and C++)

+ +
    #include <stdlib.h>
+    void f1() { }
+    void f2() { atexit(f1); }
+    
+    int main()
+    {
+        atexit(f2); // the only use of f2
+        return 0; // for C compatibility
+    }
+ +

At program exit, f2 gets called due to its registration in +main. Running f2 causes f1 to be newly registered during the exit +processing. Is this a valid program? If so, what are its +semantics?

+ +

+Interestingly, neither the C standard, nor the C++ draft standard nor +the forthcoming C9X Committee Draft says directly whether you can +register a function with atexit during exit processing.

+ +

+All 3 standards say that functions are run in reverse order of their +registration. Since f1 is registered last, it ought to be run first, +but by the time it is registered, it is too late to be first.

+ +

If the program is valid, the standards are self-contradictory about +its semantics.

+ +

Example 2: (C++ only)

+ +
    
+    void F() { static T t; } // type T has a destructor
+
+    int main()
+    {
+        atexit(F); // the only use of F
+    }
+
+ +

Function F registered with atexit has a local static variable t, +and F is called for the first time during exit processing. A local +static object is initialized the first time control flow passes +through its definition, and all static objects are destroyed during +exit processing. Is the code valid? If so, what are its semantics?

+ +

+Section 18.3 "Start and termination" says that if a function +F is registered with atexit before a static object t is initialized, F +will not be called until after t's destructor completes.

+ +

+In example 2, function F is registered with atexit before its local +static object O could possibly be initialized. On that basis, it must +not be called by exit processing until after O's destructor +completes. But the destructor cannot be run until after F is called, +since otherwise the object could not be constructed in the first +place.

+ +

If the program is valid, the standard is self-contradictory about +its semantics.

+ +

I plan to submit Example 1 as a public comment on the C9X CD, with +a recommendation that the results be undefined. (Alternative: make it +unspecified. I don't think it is worthwhile to specify the case where +f1 itself registers additional functions, each of which registers +still more functions.)

+ +

I think we should resolve the situation in the whatever way the C +committee decides.

+ +

For Example 2, I recommend we declare the results undefined.

+ +

[See reflector message lib-6500 for further discussion.]

+ + + + +

Proposed resolution:

+

Change section 18.3/8 from:

+

+ First, objects with static storage duration are destroyed and + functions registered by calling atexit are called. Objects with + static storage duration are destroyed in the reverse order of the + completion of their constructor. (Automatic objects are not + destroyed as a result of calling exit().) Functions registered with + atexit are called in the reverse order of their registration. A + function registered with atexit before an object obj1 of static + storage duration is initialized will not be called until obj1's + destruction has completed. A function registered with atexit after + an object obj2 of static storage duration is initialized will be + called before obj2's destruction starts. +

+

to:

+

+ First, objects with static storage duration are destroyed and + functions registered by calling atexit are called. Non-local objects + with static storage duration are destroyed in the reverse order of + the completion of their constructor. (Automatic objects are not + destroyed as a result of calling exit().) Functions registered with + atexit are called in the reverse order of their registration, except + that a function is called after any previously registered functions + that had already been called at the time it was registered. A + function registered with atexit before a non-local object obj1 of + static storage duration is initialized will not be called until + obj1's destruction has completed. A function registered with atexit + after a non-local object obj2 of static storage duration is + initialized will be called before obj2's destruction starts. A local + static object obj3 is destroyed at the same time it would be if a + function calling the obj3 destructor were registered with atexit at + the completion of the obj3 constructor. +

+ + +

Rationale:

+

See 99-0039/N1215, October 22, 1999, by Stephen D. Clamage for the analysis +supporting to the proposed resolution.

+ + + + + +
+

5. String::compare specification questionable

+

Section: 21.3.6.8 [string::swap] Status: TC + Submitter: Jack Reeves Date: 1997-12-11

+

View all other issues in [string::swap].

+

View all issues with TC status.

+

Duplicate of: 87

+

Discussion:

+

At the very end of the basic_string class definition is the signature: int +compare(size_type pos1, size_type n1, const charT* s, size_type n2 = npos) const; In the +following text this is defined as: returns +basic_string<charT,traits,Allocator>(*this,pos1,n1).compare( +basic_string<charT,traits,Allocator>(s,n2);

+ +

Since the constructor basic_string(const charT* s, size_type n, const Allocator& a += Allocator()) clearly requires that s != NULL and n < npos and further states that it +throws length_error if n == npos, it appears the compare() signature above should always +throw length error if invoked like so: str.compare(1, str.size()-1, s); where 's' is some +null terminated character array.

+ +

This appears to be a typo since the obvious intent is to allow either the call above or +something like: str.compare(1, str.size()-1, s, strlen(s)-1);

+ +

This would imply that what was really intended was two signatures int compare(size_type +pos1, size_type n1, const charT* s) const int compare(size_type pos1, size_type n1, const +charT* s, size_type n2) const; each defined in terms of the corresponding constructor.

+ + +

Proposed resolution:

+

Replace the compare signature in 21.3 [basic.string] +(at the very end of the basic_string synopsis) which reads:

+ +
+

int compare(size_type pos1, size_type n1,
+             const charT* s, + size_type n2 = npos) const;

+
+ +

with:

+ +
+

int compare(size_type pos1, size_type n1,
+             const charT* s) const;
+ int compare(size_type pos1, size_type n1,
+             const charT* s, + size_type n2) const;

+
+ +

Replace the portion of 21.3.6.8 [string::swap] +paragraphs 5 and 6 which read:

+ +
+

int compare(size_type pos, size_type n1,
+             charT * s, size_type n2 + = npos) const;
+
Returns:
+ basic_string<charT,traits,Allocator>(*this, pos, n1).compare(
+              + basic_string<charT,traits,Allocator>( s, n2))

+
+ +

with:

+ +
+

int compare(size_type pos, size_type n1,
+             const charT * s) const;
+
Returns:
+ basic_string<charT,traits,Allocator>(*this, pos, n1).compare(
+              + basic_string<charT,traits,Allocator>( s ))
+
+ int compare(size_type pos, size_type n1,
+             const charT * s, + size_type n2) const;
+
Returns:
+ basic_string<charT,traits,Allocator>(*this, pos, n1).compare(
+              + basic_string<charT,traits,Allocator>( s, n2))

+
+ +

Editors please note that in addition to splitting the signature, the third argument +becomes const, matching the existing synopsis.

+ + +

Rationale:

+

While the LWG dislikes adding signatures, this is a clear defect in +the Standard which must be fixed.  The same problem was also +identified in issues 7 (item 5) and 87.

+ + + + + +
+

7. String clause minor problems

+

Section: 21 [strings] Status: TC + Submitter: Matt Austern Date: 1997-12-15

+

View all other issues in [strings].

+

View all issues with TC status.

+

Discussion:

+

(1) In 21.3.6.4 [string::insert], the description of template +<class InputIterator> insert(iterator, InputIterator, +InputIterator) makes no sense. It refers to a member function that +doesn't exist. It also talks about the return value of a void +function.

+ +

(2) Several versions of basic_string::replace don't appear in the +class synopsis.

+ +

(3) basic_string::push_back appears in the synopsis, but is never +described elsewhere. In the synopsis its argument is const charT, +which doesn't makes much sense; it should probably be charT, or +possible const charT&.

+ +

(4) basic_string::pop_back is missing.

+ +

(5) int compare(size_type pos, size_type n1, charT* s, size_type n2 += npos) make no sense. First, it's const charT* in the synopsis and +charT* in the description. Second, given what it says in RETURNS, +leaving out the final argument will always result in an exception +getting thrown. This is paragraphs 5 and 6 of +21.3.6.8 [string::swap]

+ +

(6) In table 37, in section 21.1.1 [char.traits.require], +there's a note for X::move(s, p, n). It says "Copies correctly +even where p is in [s, s+n)". This is correct as far as it goes, +but it doesn't go far enough; it should also guarantee that the copy +is correct even where s in in [p, p+n). These are two orthogonal +guarantees, and neither one follows from the other. Both guarantees +are necessary if X::move is supposed to have the same sort of +semantics as memmove (which was clearly the intent), and both +guarantees are necessary if X::move is actually supposed to be +useful.

+ + +

Proposed resolution:

+

ITEM 1: In 21.3.5.4 [lib.string::insert], change paragraph 16 to
+
+    EFFECTS: Equivalent to insert(p - begin(), basic_string(first, last)).
+
+ITEM 2:  Not a defect; the Standard is clear.. There are ten versions of replace() in +the synopsis, and ten versions in 21.3.5.6 [lib.string::replace].
+
+ITEM 3: Change the declaration of push_back in the string synopsis (21.3, +[lib.basic.string]) from:

+ +

     void push_back(const charT)
+
+to
+
+     void push_back(charT)
+
+Add the following text immediately after 21.3.5.2 [lib.string::append], paragraph 10.
+
+    void basic_string::push_back(charT c);
+    EFFECTS: Equivalent to append(static_cast<size_type>(1), c);
+
+ITEM 4: Not a defect. The omission appears to have been deliberate.
+
+ITEM 5: Duplicate; see issue 5 (and 87).
+
+ITEM 6: In table 37, Replace:
+
+    "Copies correctly even where p is in [s, s+n)."
+
+with:
+
+     "Copies correctly even where the ranges [p, p+n) and [s, +s+n) overlap."

+ + + + + +
+

8. Locale::global lacks guarantee

+

Section: 22.1.1.5 [locale.statics] Status: TC + Submitter: Matt Austern Date: 1997-12-24

+

View all issues with TC status.

+

Discussion:

+

It appears there's an important guarantee missing from clause +22. We're told that invoking locale::global(L) sets the C locale if L +has a name. However, we're not told whether or not invoking +setlocale(s) sets the global C++ locale.

+ +

The intent, I think, is that it should not, but I can't find any +such words anywhere.

+ + +

Proposed resolution:

+

Add a sentence at the end of 22.1.1.5 [locale.statics], +paragraph 2: 

+ +
+

No library function other than locale::global() shall affect + the value returned by locale().

+ +
+ + + + + +
+

9. Operator new(0) calls should not yield the same pointer

+

Section: 18.5.1 [new.delete] Status: TC + Submitter: Steve Clamage Date: 1998-01-04

+

View all issues with TC status.

+

Discussion:

+

Scott Meyers, in a comp.std.c++ posting: I just noticed that +section 3.7.3.1 of CD2 seems to allow for the possibility that all +calls to operator new(0) yield the same pointer, an implementation +technique specifically prohibited by ARM 5.3.3.Was this prohibition +really lifted? Does the FDIS agree with CD2 in the regard? [Issues +list maintainer's note: the IS is the same.]

+ + +

Proposed resolution:

+

Change the last paragraph of 3.7.3 from:

+
+

Any allocation and/or deallocation functions defined in a C++ program shall + conform to the semantics specified in 3.7.3.1 and 3.7.3.2.

+
+

to:

+
+

Any allocation and/or deallocation functions defined in a C++ program, + including the default versions in the library, shall conform to the semantics + specified in 3.7.3.1 and 3.7.3.2.

+
+

Change 3.7.3.1/2, next-to-last sentence, from :

+
+

If the size of the space requested is zero, the value returned shall not be + a null pointer value (4.10).

+
+

to:

+
+

Even if the size of the space requested is zero, the request can fail. If + the request succeeds, the value returned shall be a non-null pointer value + (4.10) p0 different from any previously returned value p1, unless that value + p1 was since passed to an operator delete.

+
+

5.3.4/7 currently reads:

+
+

When the value of the expression in a direct-new-declarator is zero, the + allocation function is called to allocate an array with no elements. The + pointer returned by the new-expression is non-null. [Note: If the library + allocation function is called, the pointer returned is distinct from the + pointer to any other object.]

+
+

Retain the first sentence, and delete the remainder.

+

18.5.1 currently has no text. Add the following:

+
+

Except where otherwise specified, the provisions of 3.7.3 apply to the + library versions of operator new and operator delete.

+
+

To 18.5.1.3, add the following text:

+
+

The provisions of 3.7.3 do not apply to these reserved placement forms of + operator new and operator delete.

+
+ + +

Rationale:

+

See 99-0040/N1216, October 22, 1999, by Stephen D. Clamage for the analysis +supporting to the proposed resolution.

+ + + + + +
+

11. Bitset minor problems

+

Section: 23.3.5 [template.bitset] Status: TC + Submitter: Matt Austern Date: 1998-01-22

+

View other active issues in [template.bitset].

+

View all other issues in [template.bitset].

+

View all issues with TC status.

+

Discussion:

+

(1) bitset<>::operator[] is mentioned in the class synopsis (23.3.5), but it is +not documented in 23.3.5.2.

+ +

(2) The class synopsis only gives a single signature for bitset<>::operator[], +reference operator[](size_t pos). This doesn't make much sense. It ought to be overloaded +on const. reference operator[](size_t pos); bool operator[](size_t pos) const.

+ +

(3) Bitset's stream input function (23.3.5.3) ought to skip all whitespace before +trying to extract 0s and 1s. The standard doesn't explicitly say that, though. This should +go in the Effects clause.

+ + +

Proposed resolution:

+

ITEMS 1 AND 2:
+
+In the bitset synopsis (23.3.5 [template.bitset]), +replace the member function
+
+    reference operator[](size_t pos);
+

+with the two member functions
+
+    bool operator[](size_t pos) const;
+    reference operator[](size_t pos);
+

+Add the following text at the end of 23.3.5.2 [bitset.members], +immediately after paragraph 45:

+ +
+

bool operator[](size_t pos) const;
+ Requires: pos is valid
+ Throws: nothing
+ Returns: test(pos)
+
+ bitset<N>::reference operator[](size_t pos);
+ Requires: pos is valid
+ Throws: nothing
+ Returns: An object of type bitset<N>::reference such that (*this)[pos] + == this->test(pos), and such that (*this)[pos] = val is equivalent to this->set(pos, + val);

+
+ + +

Rationale:

+

The LWG believes Item 3 is not a defect. "Formatted +input" implies the desired semantics. See 27.6.1.2 [istream.formatted]. +

+ + + + + +
+

13. Eos refuses to die

+

Section: 27.6.1.2.3 [istream::extractors] Status: TC + Submitter: William M. Miller Date: 1998-03-03

+

View all other issues in [istream::extractors].

+

View all issues with TC status.

+

Discussion:

+

In 27.6.1.2.3, there is a reference to "eos", which is +the only one in the whole draft (at least using Acrobat search), so +it's undefined.

+ + +

Proposed resolution:

+

In 27.6.1.2.3 [istream::extractors], replace "eos" with +"charT()"

+ + + + + +
+

14. Locale::combine should be const

+

Section: 22.1.1.3 [locale.members] Status: TC + Submitter: Nathan Myers Date: 1998-08-06

+

View all other issues in [locale.members].

+

View all issues with TC status.

+

Discussion:

+

locale::combine is the only member function of locale (other than constructors and +destructor) that is not const. There is no reason for it not to be const, and good reasons +why it should have been const. Furthermore, leaving it non-const conflicts with 22.1.1 +paragraph 6: "An instance of a locale is immutable."

+ +

History: this member function originally was a constructor. it happened that the +interface it specified had no corresponding language syntax, so it was changed to a member +function. As constructors are never const, there was no "const" in the interface +which was transformed into member "combine". It should have been added at that +time, but the omission was not noticed.

+ + +

Proposed resolution:

+

In 22.1.1 [locale] and also in 22.1.1.3 [locale.members], add +"const" to the declaration of member combine:

+
+
template <class Facet> locale combine(const locale& other) const; 
+
+ + + + + +
+

15. Locale::name requirement inconsistent

+

Section: 22.1.1.3 [locale.members] Status: TC + Submitter: Nathan Myers Date: 1998-08-06

+

View all other issues in [locale.members].

+

View all issues with TC status.

+

Discussion:

+

locale::name() is described as returning a string that can be passed to a locale +constructor, but there is no matching constructor.

+ + +

Proposed resolution:

+

In 22.1.1.3 [locale.members], paragraph 5, replace +"locale(name())" with +"locale(name().c_str())". +

+ + + + + +
+

16. Bad ctype_byname<char> decl

+

Section: 22.2.1.4 [locale.codecvt] Status: TC + Submitter: Nathan Myers Date: 1998-08-06

+

View all other issues in [locale.codecvt].

+

View all issues with TC status.

+

Discussion:

+

The new virtual members ctype_byname<char>::do_widen and do_narrow did not get +edited in properly. Instead, the member do_widen appears four times, with wrong argument +lists.

+ + +

Proposed resolution:

+

The correct declarations for the overloaded members +do_narrow and do_widen should be copied +from 22.2.1.3 [facet.ctype.special].

+ + + + + +
+

17. Bad bool parsing

+

Section: 22.2.2.1.2 [facet.num.get.virtuals] Status: TC + Submitter: Nathan Myers Date: 1998-08-06

+

View other active issues in [facet.num.get.virtuals].

+

View all other issues in [facet.num.get.virtuals].

+

View all issues with TC status.

+

Discussion:

+

This section describes the process of parsing a text boolean value from the input +stream. It does not say it recognizes either of the sequences "true" or +"false" and returns the corresponding bool value; instead, it says it recognizes +only one of those sequences, and chooses which according to the received value of a +reference argument intended for returning the result, and reports an error if the other +sequence is found. (!) Furthermore, it claims to get the names from the ctype<> +facet rather than the numpunct<> facet, and it examines the "boolalpha" +flag wrongly; it doesn't define the value "loc"; and finally, it computes +wrongly whether to use numeric or "alpha" parsing.
+
+I believe the correct algorithm is "as if":

+ +
  // in, err, val, and str are arguments.
+  err = 0;
+  const numpunct<charT>& np = use_facet<numpunct<charT> >(str.getloc());
+  const string_type t = np.truename(), f = np.falsename();
+  bool tm = true, fm = true;
+  size_t pos = 0;
+  while (tm && pos < t.size() || fm && pos < f.size()) {
+    if (in == end) { err = str.eofbit; }
+    bool matched = false;
+    if (tm && pos < t.size()) {
+      if (!err && t[pos] == *in) matched = true;
+      else tm = false;
+    }
+    if (fm && pos < f.size()) {
+      if (!err && f[pos] == *in) matched = true;
+      else fm = false;
+    }
+    if (matched) { ++in; ++pos; }
+    if (pos > t.size()) tm = false;
+    if (pos > f.size()) fm = false;
+  }
+  if (tm == fm || pos == 0) { err |= str.failbit; }
+  else                      { val = tm; }
+  return in;
+ +

Notice this works reasonably when the candidate strings are both empty, or equal, or +when one is a substring of the other. The proposed text below captures the logic of the +code above.

+ + +

Proposed resolution:

+

In 22.2.2.1.2 [facet.num.get.virtuals], in the first line of paragraph 14, +change "&&" to "&".

+ +

Then, replace paragraphs 15 and 16 as follows:

+ +
+ +

Otherwise target sequences are determined "as if" by + calling the members falsename() and + truename() of the facet obtained by + use_facet<numpunct<charT> >(str.getloc()). + Successive characters in the range [in,end) (see + [lib.sequence.reqmts]) are obtained and matched against + corresponding positions in the target sequences only as necessary to + identify a unique match. The input iterator in is + compared to end only when necessary to obtain a + character. If and only if a target sequence is uniquely matched, + val is set to the corresponding value.

+ +
+ +
+

The in iterator is always left pointing one position beyond the last character + successfully matched. If val is set, then err is set to str.goodbit; or to + str.eofbit if, when seeking another character to match, it is found that + (in==end). If val is not set, then err is set to str.failbit; or to + (str.failbit|str.eofbit)if + the reason for the failure was that (in==end). [Example: for targets + true:"a" and false:"abb", the input sequence "a" yields + val==true and err==str.eofbit; the input sequence "abc" yields + err=str.failbit, with in ending at the 'c' element. For targets + true:"1" + and false:"0", the input sequence "1" yields val==true + and err=str.goodbit. For empty targets (""), any input sequence yields + err==str.failbit. --end example]

+
+ + + + + +
+

18. Get(...bool&) omitted

+

Section: 22.2.2.1.1 [facet.num.get.members] Status: TC + Submitter: Nathan Myers Date: 1998-08-06

+

View all other issues in [facet.num.get.members].

+

View all issues with TC status.

+

Discussion:

+

In the list of num_get<> non-virtual members on page 22-23, the member +that parses bool values was omitted from the list of definitions of non-virtual +members, though it is listed in the class definition and the corresponding +virtual is listed everywhere appropriate.

+ + +

Proposed resolution:

+

Add at the beginning of 22.2.2.1.1 [facet.num.get.members] +another get member for bool&, copied from the entry in +22.2.2.1 [locale.num.get].

+ + + + + +
+

19. "Noconv" definition too vague

+

Section: 22.2.1.4 [locale.codecvt] Status: TC + Submitter: Nathan Myers Date: 1998-08-06

+

View all other issues in [locale.codecvt].

+

View all issues with TC status.

+

Duplicate of: 10

+

Discussion:

+

+In the definitions of codecvt<>::do_out and do_in, they are +specified to return noconv if "no conversion is +needed". This definition is too vague, and does not say +normatively what is done with the buffers. +

+ + +

Proposed resolution:

+

+Change the entry for noconv in the table under paragraph 4 in section +22.2.1.4.2 [locale.codecvt.virtuals] to read: +

+
+

noconv: internT and externT are the same type, + and input sequence is identical to converted sequence.

+
+

Change the Note in paragraph 2 to normative text as follows:

+
+

If returns noconv, internT and externT are the + same type and the converted sequence is identical to the input sequence [from,from_next). + to_next is set equal to to, the value of state is + unchanged, and there are no changes to the values in [to, to_limit).

+
+ + + + + +
+

20. Thousands_sep returns wrong type

+

Section: 22.2.3.1.2 [facet.numpunct.virtuals] Status: TC + Submitter: Nathan Myers Date: 1998-08-06

+

View all issues with TC status.

+

Discussion:

+

The synopsis for numpunct<>::do_thousands_sep, and the +definition of numpunct<>::thousands_sep which calls it, specify +that it returns a value of type char_type. Here it is erroneously +described as returning a "string_type".

+ + +

Proposed resolution:

+

In 22.2.3.1.2 [facet.numpunct.virtuals], above paragraph 2, change +"string_type" to "char_type".

+ + + + + +
+

21. Codecvt_byname<> instantiations

+

Section: 22.1.1.1.1 [locale.category] Status: TC + Submitter: Nathan Myers Date: 1998-08-06

+

View all other issues in [locale.category].

+

View all issues with TC status.

+

Discussion:

+

In the second table in the section, captioned "Required +instantiations", the instantiations for codecvt_byname<> +have been omitted. These are necessary to allow users to construct a +locale by name from facets.

+ + +

Proposed resolution:

+

Add in 22.1.1.1.1 [locale.category] to the table captioned +"Required instantiations", in the category "ctype" +the lines

+ +
+
codecvt_byname<char,char,mbstate_t>,
+codecvt_byname<wchar_t,char,mbstate_t> 
+
+ + + + + +
+

22. Member open vs. flags

+

Section: 27.8.1.9 [ifstream.members] Status: TC + Submitter: Nathan Myers Date: 1998-08-06

+

View all other issues in [ifstream.members].

+

View all issues with TC status.

+

Discussion:

+

The description of basic_istream<>::open leaves unanswered questions about how it +responds to or changes flags in the error status for the stream. A strict reading +indicates that it ignores the bits and does not change them, which confuses users who do +not expect eofbit and failbit to remain set after a successful open. There are three +reasonable resolutions: 1) status quo 2) fail if fail(), ignore eofbit 3) clear failbit +and eofbit on call to open().

+ + +

Proposed resolution:

+

In 27.8.1.9 [ifstream.members] paragraph 3, and in 27.8.1.13 [ofstream.members] paragraph 3, under open() effects, add a footnote: +

+ +
+

A successful open does not change the error state.

+
+ + +

Rationale:

+

This may seem surprising to some users, but it's just an instance +of a general rule: error flags are never cleared by the +implementation. The only way error flags are are ever cleared is if +the user explicitly clears them by hand.

+ +

The LWG believed that preserving this general rule was +important enough so that an exception shouldn't be made just for this +one case. The resolution of this issue clarifies what the LWG +believes to have been the original intent.

+ + + + + + +
+

24. "do_convert" doesn't exist

+

Section: 22.2.1.4 [locale.codecvt] Status: TC + Submitter: Nathan Myers Date: 1998-08-06

+

View all other issues in [locale.codecvt].

+

View all issues with TC status.

+

Duplicate of: 72

+

Discussion:

+

The description of codecvt<>::do_out and do_in mentions a +symbol "do_convert" which is not defined in the +standard. This is a leftover from an edit, and should be "do_in +and do_out".

+ + +

Proposed resolution:

+

In 22.2.1.4 [locale.codecvt], paragraph 3, change +"do_convert" to "do_in or do_out". Also, in 22.2.1.4.2 [locale.codecvt.virtuals], change "do_convert()" to "do_in +or do_out".

+ + + + + +
+

25. String operator<< uses width() value wrong

+

Section: 21.3.8.9 [string.io] Status: TC + Submitter: Nathan Myers Date: 1998-08-06

+

View all other issues in [string.io].

+

View all issues with TC status.

+

Duplicate of: 67

+

Discussion:

+

In the description of operator<< applied to strings, the standard says that uses +the smaller of os.width() and str.size(), to pad "as described in stage 3" +elsewhere; but this is inconsistent, as this allows no possibility of space for padding.

+ + +

Proposed resolution:

+

Change 21.3.8.9 [string.io] paragraph 4 from:
+
+    "... where n is the smaller of os.width() and str.size(); +..."
+
+to:
+
+    "... where n is the larger of os.width() and str.size(); +..."

+ + + + + +
+

26. Bad sentry example

+

Section: 27.6.1.1.3 [istream::sentry] Status: TC + Submitter: Nathan Myers Date: 1998-08-06

+

View all other issues in [istream::sentry].

+

View all issues with TC status.

+

Discussion:

+

In paragraph 6, the code in the example:

+ +
  template <class charT, class traits = char_traits<charT> >
+  basic_istream<charT,traits>::sentry(
+           basic_istream<charT,traits>& is, bool noskipws = false) {
+      ...
+      int_type c;
+      typedef ctype<charT> ctype_type;
+      const ctype_type& ctype = use_facet<ctype_type>(is.getloc());
+      while ((c = is.rdbuf()->snextc()) != traits::eof()) {
+        if (ctype.is(ctype.space,c)==0) {
+          is.rdbuf()->sputbackc (c);
+          break;
+        }
+      }
+      ...
+   }
+ +

fails to demonstrate correct use of the facilities described. In +particular, it fails to use traits operators, and specifies incorrect +semantics. (E.g. it specifies skipping over the first character in the +sequence without examining it.)

+ + +

Proposed resolution:

+

Remove the example above from 27.6.1.1.3 [istream::sentry] +paragraph 6.

+ + +

Rationale:

+

The originally proposed replacement code for the example was not +correct. The LWG tried in Kona and again in Tokyo to correct it +without success. In Tokyo, an implementor reported that actual working +code ran over one page in length and was quite complicated. The LWG +decided that it would be counter-productive to include such a lengthy +example, which might well still contain errors.

+ + + + + +
+

27. String::erase(range) yields wrong iterator

+

Section: 21.3.6.5 [string::erase] Status: TC + Submitter: Nathan Myers Date: 1998-08-06

+

View all other issues in [string::erase].

+

View all issues with TC status.

+

Discussion:

+

The string::erase(iterator first, iterator last) is specified to return an element one +place beyond the next element after the last one erased. E.g. for the string +"abcde", erasing the range ['b'..'d') would yield an iterator for element 'e', +while 'd' has not been erased.

+ + +

Proposed resolution:

+

In 21.3.6.5 [string::erase], paragraph 10, change:

+ +
+

Returns: an iterator which points to the element immediately following _last_ prior to + the element being erased.

+
+ +

to read

+ +
+

Returns: an iterator which points to the element pointed to by _last_ prior to the + other elements being erased.

+
+ + + + + +
+

28. Ctype<char>is ambiguous

+

Section: 22.2.1.3.2 [facet.ctype.char.members] Status: TC + Submitter: Nathan Myers Date: 1998-08-06

+

View all other issues in [facet.ctype.char.members].

+

View all issues with TC status.

+

Duplicate of: 236

+

Discussion:

+

The description of the vector form of ctype<char>::is can be interpreted to mean +something very different from what was intended. Paragraph 4 says

+ +
+

Effects: The second form, for all *p in the range [low, high), assigns vec[p-low] to + table()[(unsigned char)*p].

+
+ +

This is intended to copy the value indexed from table()[] into the place identified in +vec[].

+ + +

Proposed resolution:

+

Change 22.2.1.3.2 [facet.ctype.char.members], paragraph 4, to read

+ +
+

Effects: The second form, for all *p in the range [low, high), assigns into vec[p-low] + the value table()[(unsigned char)*p].

+
+ + + + + +
+

29. Ios_base::init doesn't exist

+

Section: 27.3.1 [narrow.stream.objects] Status: TC + Submitter: Nathan Myers Date: 1998-08-06

+

View all other issues in [narrow.stream.objects].

+

View all issues with TC status.

+

Discussion:

+

Sections 27.3.1 [narrow.stream.objects] and 27.3.2 [wide.stream.objects] mention +a function ios_base::init, which is not defined. Probably they mean +basic_ios<>::init, defined in 27.4.4.1 [basic.ios.cons], +paragraph 3.

+ + +

Proposed resolution:

+

[R12: modified to include paragraph 5.]

+ +

In 27.3.1 [narrow.stream.objects] paragraph 2 and 5, change

+ +
+

ios_base::init

+
+ +

to

+ +
+

basic_ios<char>::init

+
+ +

Also, make a similar change in 27.3.2 [wide.stream.objects] except it +should read

+ +
+

basic_ios<wchar_t>::init

+
+ + + + + +
+

30. Wrong header for LC_*

+

Section: 22.1.1.1.1 [locale.category] Status: TC + Submitter: Nathan Myers Date: 1998-08-06

+

View all other issues in [locale.category].

+

View all issues with TC status.

+

Discussion:

+

Paragraph 2 implies that the C macros LC_CTYPE etc. are defined in <cctype>, +where they are in fact defined elsewhere to appear in <clocale>.

+ + +

Proposed resolution:

+

In 22.1.1.1.1 [locale.category], paragraph 2, change +"<cctype>" to read "<clocale>".

+ + + + + +
+

31. Immutable locale values

+

Section: 22.1.1 [locale] Status: TC + Submitter: Nathan Myers Date: 1998-08-06

+

View all other issues in [locale].

+

View all issues with TC status.

+

Duplicate of: 378

+

Discussion:

+

Paragraph 6, says "An instance of locale is +immutable; once a facet reference is obtained from it, +...". This has caused some confusion, because locale variables +are manifestly assignable.

+ + +

Proposed resolution:

+

In 22.1.1 [locale] replace paragraph 6

+ +
+

An instance of locale is immutable; once a facet + reference is obtained from it, that reference remains usable as long + as the locale value itself exists.

+
+ +

with

+ +
+

Once a facet reference is obtained from a locale object by + calling use_facet<>, that reference remains usable, and the + results from member functions of it may be cached and re-used, as + long as some locale object refers to that facet.

+
+ + + + + +
+

32. Pbackfail description inconsistent

+

Section: 27.5.2.4.4 [streambuf.virt.pback] Status: TC + Submitter: Nathan Myers Date: 1998-08-06

+

View all issues with TC status.

+

Discussion:

+

The description of the required state before calling virtual member +basic_streambuf<>::pbackfail requirements is inconsistent with the conditions +described in 27.5.2.2.4 [lib.streambuf.pub.pback] where member sputbackc calls it. +Specifically, the latter says it calls pbackfail if:

+ +

    traits::eq(c,gptr()[-1]) is false

+ +

where pbackfail claims to require:

+ +

    traits::eq(*gptr(),traits::to_char_type(c)) returns false

+ +

It appears that the pbackfail description is wrong.

+ + +

Proposed resolution:

+

In 27.5.2.4.4 [streambuf.virt.pback], paragraph 1, change:

+ +
+

"traits::eq(*gptr(),traits::to_char_type( c))"

+
+ +

to

+ +
+

"traits::eq(traits::to_char_type(c),gptr()[-1])" +

+
+ + +

Rationale:

+

Note deliberate reordering of arguments for clarity in addition to the correction of +the argument value.

+ + + + + +
+

33. Codecvt<> mentions from_type

+

Section: 22.2.1.4 [locale.codecvt] Status: TC + Submitter: Nathan Myers Date: 1998-08-06

+

View all other issues in [locale.codecvt].

+

View all issues with TC status.

+

Duplicate of: 43

+

Discussion:

+

In the table defining the results from do_out and do_in, the specification for the +result error says

+ +
+

encountered a from_type character it could not convert

+
+ +

but from_type is not defined. This clearly is intended to be an externT for do_in, or +an internT for do_out.

+ + +

Proposed resolution:

+

In 22.2.1.4.2 [locale.codecvt.virtuals] paragraph 4, replace the definition +in the table for the case of _error_ with

+ +
+

encountered a character in [from,from_end) that it could not convert.

+
+ + + + + +
+

34. True/falsename() not in ctype<>

+

Section: 22.2.2.2.2 [facet.num.put.virtuals] Status: TC + Submitter: Nathan Myers Date: 1998-08-06

+

View all other issues in [facet.num.put.virtuals].

+

View all issues with TC status.

+

Discussion:

+

In paragraph 19, Effects:, members truename() and falsename are used from facet +ctype<charT>, but it has no such members. Note that this is also a problem in +22.2.2.1.2, addressed in (4).

+ + +

Proposed resolution:

+

In 22.2.2.2.2 [facet.num.put.virtuals], paragraph 19, in the Effects: +clause for member put(...., bool), replace the initialization of the +string_type value s as follows:

+ +
+
const numpunct& np = use_facet<numpunct<charT> >(loc);
+string_type s = val ? np.truename() : np.falsename(); 
+
+ + + + + +
+

35. No manipulator unitbuf in synopsis

+

Section: 27.4 [iostreams.base] Status: TC + Submitter: Nathan Myers Date: 1998-08-06

+

View all issues with TC status.

+

Discussion:

+

In 27.4.5.1 [fmtflags.manip], we have a definition for a manipulator +named "unitbuf". Unlike other manipulators, it's not listed +in synopsis. Similarly for "nounitbuf".

+ + +

Proposed resolution:

+

Add to the synopsis for <ios> in 27.4 [iostreams.base], after +the entry for "nouppercase", the prototypes:

+ +
+
ios_base& unitbuf(ios_base& str);
+ios_base& nounitbuf(ios_base& str); 
+
+ + + + + +
+

36. Iword & pword storage lifetime omitted

+

Section: 27.4.2.5 [ios.base.storage] Status: TC + Submitter: Nathan Myers Date: 1998-08-06

+

View all other issues in [ios.base.storage].

+

View all issues with TC status.

+

Discussion:

+

In the definitions for ios_base::iword and pword, the lifetime of the storage is +specified badly, so that an implementation which only keeps the last value stored appears +to conform. In particular, it says:

+ +

The reference returned may become invalid after another call to the object's iword +member with a different index ...

+ +

This is not idle speculation; at least one implementation was done this way.

+ + +

Proposed resolution:

+

Add in 27.4.2.5 [ios.base.storage], in both paragraph 2 and also in +paragraph 4, replace the sentence:

+ +
+

The reference returned may become invalid after another call to the object's iword + [pword] member with a different index, after a call to its copyfmt member, or when the + object is destroyed.

+
+ +

with:

+ +
+

The reference returned is invalid after any other operations on the object. However, + the value of the storage referred to is retained, so that until the next call to copyfmt, + calling iword [pword] with the same index yields another reference to the same value.

+
+ +

substituting "iword" or "pword" as appropriate.

+ + + + + +
+

37. Leftover "global" reference

+

Section: 22.1.1 [locale] Status: TC + Submitter: Nathan Myers Date: 1998-08-06

+

View all other issues in [locale].

+

View all issues with TC status.

+

Discussion:

+

In the overview of locale semantics, paragraph 4, is the sentence

+ +
+

If Facet is not present in a locale (or, failing that, in the global locale), it throws + the standard exception bad_cast.

+
+ +

This is not supported by the definition of use_facet<>, and represents semantics +from an old draft.

+ + +

Proposed resolution:

+

In 22.1.1 [locale], paragraph 4, delete the parenthesized +expression

+ +
+

(or, failing that, in the global locale)

+
+ + + + + +
+

38. Facet definition incomplete

+

Section: 22.1.2 [locale.global.templates] Status: TC + Submitter: Nathan Myers Date: 1998-08-06

+

View all issues with TC status.

+

Discussion:

+

It has been noticed by Esa Pulkkinen that the definition of +"facet" is incomplete. In particular, a class derived from +another facet, but which does not define a member id, cannot +safely serve as the argument F to use_facet<F>(loc), +because there is no guarantee that a reference to the facet instance +stored in loc is safely convertible to F.

+ + +

Proposed resolution:

+

In the definition of std::use_facet<>(), replace the text in paragraph 1 which +reads:

+ +
+

Get a reference to a facet of a locale.

+
+ +

with:

+ +
+

Requires: Facet is a facet class whose definition + contains the public static member id as defined in 22.1.1.1.2 [locale.facet].

+
+ +

[ +Kona: strike as overspecification the text "(not inherits)" +from the original resolution, which read "... whose definition +contains (not inherits) the public static member +id..." +]

+ + + + + + + +
+

39. istreambuf_iterator<>::operator++(int) definition garbled

+

Section: 24.5.3.4 [istreambuf.iterator::op++] Status: TC + Submitter: Nathan Myers Date: 1998-08-06

+

View all issues with TC status.

+

Discussion:

+

Following the definition of istreambuf_iterator<>::operator++(int) in paragraph +3, the standard contains three lines of garbage text left over from a previous edit.

+ +
+
istreambuf_iterator<charT,traits> tmp = *this;
+sbuf_->sbumpc();
+return(tmp); 
+
+ + +

Proposed resolution:

+

In 24.5.3.4 [istreambuf.iterator::op++], delete the three lines of code at the +end of paragraph 3.

+ + + + + +
+

40. Meaningless normative paragraph in examples

+

Section: 22.2.8 [facets.examples] Status: TC + Submitter: Nathan Myers Date: 1998-08-06

+

View all other issues in [facets.examples].

+

View all issues with TC status.

+

Discussion:

+

Paragraph 3 of the locale examples is a description of part of an +implementation technique that has lost its referent, and doesn't mean +anything.

+ + +

Proposed resolution:

+

Delete 22.2.8 [facets.examples] paragraph 3 which begins "This +initialization/identification system depends...", or (at the +editor's option) replace it with a place-holder to keep the paragraph +numbering the same.

+ + + + + +
+

41. Ios_base needs clear(), exceptions()

+

Section: 27.4.2 [ios.base] Status: TC + Submitter: Nathan Myers Date: 1998-08-06

+

View all other issues in [ios.base].

+

View all issues with TC status.

+

Duplicate of: 157

+

Discussion:

+

The description of ios_base::iword() and pword() in 27.4.2.4 [ios.members.static], say that if they fail, they "set badbit, +which may throw an exception". However, ios_base offers no +interface to set or to test badbit; those interfaces are defined in +basic_ios<>.

+ + +

Proposed resolution:

+

Change the description in 27.4.2.5 [ios.base.storage] in +paragraph 2, and also in paragraph 4, as follows. Replace

+ +
+

If the function fails it sets badbit, which may throw an exception.

+
+ +

with

+ +
+

If the function fails, and *this is a base sub-object of + a basic_ios<> object or sub-object, the effect is + equivalent to calling basic_ios<>::setstate(badbit) + on the derived object (which may throw failure).

+
+ +

[Kona: LWG reviewed wording; setstate(failbit) changed to +setstate(badbit).]

+ + + + + + + +
+

42. String ctors specify wrong default allocator

+

Section: 21.3 [basic.string] Status: TC + Submitter: Nathan Myers Date: 1998-08-06

+

View other active issues in [basic.string].

+

View all other issues in [basic.string].

+

View all issues with TC status.

+

Discussion:

+

The basic_string<> copy constructor:

+ +
basic_string(const basic_string& str, size_type pos = 0,
+             size_type n = npos, const Allocator& a = Allocator()); 
+ +

specifies an Allocator argument default value that is +counter-intuitive. The natural choice for a the allocator to copy from +is str.get_allocator(). Though this cannot be expressed in +default-argument notation, overloading suffices.

+ +

Alternatively, the other containers in Clause 23 (deque, list, +vector) do not have this form of constructor, so it is inconsistent, +and an evident source of confusion, for basic_string<> to have +it, so it might better be removed.

+ + +

Proposed resolution:

+

In 21.3 [basic.string], replace the declaration of the copy +constructor as follows:

+ +
+
basic_string(const basic_string& str);
+basic_string(const basic_string& str, size_type pos, size_type n = npos,
+             const Allocator& a = Allocator());
+
+ +

In 21.3.1 [string.require], replace the copy constructor declaration +as above. Add to paragraph 5, Effects:

+ +
+

In the first form, the Allocator value used is copied from + str.get_allocator().

+
+ + +

Rationale:

+

The LWG believes the constructor is actually broken, rather than +just an unfortunate design choice.

+ +

The LWG considered two other possible resolutions:

+ +

A. In 21.3 [basic.string], replace the declaration of the copy +constructor as follows:

+ +
+
basic_string(const basic_string& str, size_type pos = 0,
+             size_type n = npos);
+basic_string(const basic_string& str, size_type pos,
+             size_type n, const Allocator& a); 
+
+ +

In 21.3.1 [string.require], replace the copy constructor declaration +as above. Add to paragraph 5, Effects:

+ +
+

When no Allocator argument is provided, the string is constructed using the + value str.get_allocator().

+
+ +

B. In 21.3 [basic.string], and also in 21.3.1 [string.require], replace +the declaration of the copy constructor as follows:

+ +
+
basic_string(const basic_string& str, size_type pos = 0,
+             size_type n = npos); 
+
+ +

The proposed resolution reflects the original intent of the LWG. It +was also noted by Pete Becker that this fix "will cause +a small amount of existing code to now work correctly."

+ +

[ +Kona: issue editing snafu fixed - the proposed resolution now correctly +reflects the LWG consensus. +]

+ + + + + + +
+

44. Iostreams use operator== on int_type values

+

Section: 27 [input.output] Status: WP + Submitter: Nathan Myers Date: 1998-08-06

+

View all other issues in [input.output].

+

View all issues with WP status.

+

Discussion:

+

Many of the specifications for iostreams specify that character +values or their int_type equivalents are compared using operators == +or !=, though in other places traits::eq() or traits::eq_int_type is +specified to be used throughout. This is an inconsistency; we should +change uses of == and != to use the traits members instead.

+ + +

Proposed resolution:

+ +

[Pre-Kona: Dietmar supplied wording]

+ + +

List of changes to clause 27:

+
    +
  1. + In lib.basic.ios.members paragraph 13 (postcondition clause for + 'fill(cT)') change + +
         fillch == fill()
    +
    + + to + +
         traits::eq(fillch, fill())
    +
    + + +
  2. +
  3. + In lib.istream.unformatted paragraph 7 (effects clause for + 'get(cT,streamsize,cT)'), third bullet, change + +
         c == delim for the next available input character c
    +
    + + to + +
         traits::eq(c, delim) for the next available input character c
    +
    + +
  4. +
  5. + In lib.istream.unformatted paragraph 12 (effects clause for + 'get(basic_streambuf<cT,Tr>&,cT)'), third bullet, change + +
         c == delim for the next available input character c
    +
    + + to + +
         traits::eq(c, delim) for the next available input character c
    +
    + +
  6. +
  7. + In lib.istream.unformatted paragraph 17 (effects clause for + 'getline(cT,streamsize,cT)'), second bullet, change + +
         c == delim for the next available input character c
    +
    + + to + +
         traits::eq(c, delim) for the next available input character c
    +  
    + +
  8. +
  9. + In lib.istream.unformatted paragraph 24 (effects clause for + 'ignore(int,int_type)'), second bullet, change + +
         c == delim for the next available input character c
    +
    + + to + +
         traits::eq_int_type(c, delim) for the next available input
    +     character c
    +
    + +
  10. +
  11. + In lib.istream.unformatted paragraph 25 (notes clause for + 'ignore(int,int_type)'), second bullet, change + +
         The last condition will never occur if delim == traits::eof()
    +
    + + to + +
         The last condition will never occur if
    +     traits::eq_int_type(delim, traits::eof()).
    +
    + +
  12. +
  13. + In lib.istream.sentry paragraph 6 (example implementation for the + sentry constructor) change + +
         while ((c = is.rdbuf()->snextc()) != traits::eof()) {
    +
    + + to + +
         while (!traits::eq_int_type(c = is.rdbuf()->snextc(), traits::eof())) {
    +
    + +
  14. +
+ +

List of changes to Chapter 21:

+ +
    +
  1. + In lib.string::find paragraph 1 (effects clause for find()), + second bullet, change + +
         at(xpos+I) == str.at(I) for all elements ...
    +
    + + to + +
         traits::eq(at(xpos+I), str.at(I)) for all elements ...
    +
    + +
  2. +
  3. + In lib.string::rfind paragraph 1 (effects clause for rfind()), + second bullet, change + +
         at(xpos+I) == str.at(I) for all elements ...
    +
    + + to + +
         traits::eq(at(xpos+I), str.at(I)) for all elements ...
    +
    + +
  4. +
  5. + In lib.string::find.first.of paragraph 1 (effects clause for + find_first_of()), second bullet, change + +
         at(xpos+I) == str.at(I) for all elements ...
    +
    + + to + +
         traits::eq(at(xpos+I), str.at(I)) for all elements ...
    +
    + +
  6. +
  7. + In lib.string::find.last.of paragraph 1 (effects clause for + find_last_of()), second bullet, change + +
         at(xpos+I) == str.at(I) for all elements ...
    +
    + + to + +
         traits::eq(at(xpos+I), str.at(I)) for all elements ...
    +
    + +
  8. +
  9. + In lib.string::find.first.not.of paragraph 1 (effects clause for + find_first_not_of()), second bullet, change + +
         at(xpos+I) == str.at(I) for all elements ...
    +
    + + to + +
         traits::eq(at(xpos+I), str.at(I)) for all elements ...
    +
    +
  10. + +
  11. + In lib.string::find.last.not.of paragraph 1 (effects clause for + find_last_not_of()), second bullet, change + +
         at(xpos+I) == str.at(I) for all elements ...
    +
    + + to + +
         traits::eq(at(xpos+I), str.at(I)) for all elements ...
    +
    +
  12. + +
  13. + In lib.string.ios paragraph 5 (effects clause for getline()), + second bullet, change + +
         c == delim for the next available input character c 
    +
    + + to + +
         traits::eq(c, delim) for the next available input character c 
    +
    +
  14. + +
+ +

Notes:

+
    +
  • + Fixing this issue highlights another sloppyness in + lib.istream.unformatted paragraph 24: this clause mentions a "character" + which is then compared to an 'int_type' (see item 5. in the list + below). It is not clear whether this requires explicit words and + if so what these words are supposed to be. A similar issue exists, + BTW, for operator*() of istreambuf_iterator which returns the result + of sgetc() as a character type (see lib.istreambuf.iterator::op* + paragraph 1), and for operator++() of istreambuf_iterator which + passes the result of sbumpc() to a constructor taking a char_type + (see lib.istreambuf.iterator::operator++ paragraph 3). Similarily, the + assignment operator ostreambuf_iterator passes a char_type to a function + taking an int_type (see lib.ostreambuf.iter.ops paragraph 1). +
  • +
  • + It is inconsistent to use comparisons using the traits functions in + Chapter 27 while not using them in Chapter 21, especially as some + of the inconsistent uses actually involve streams (eg. getline() on + streams). To avoid leaving this issue open still longer due to this + inconsistency (it is open since 1998), a list of changes to Chapter + 21 is below. +
  • +
  • + In Chapter 24 there are several places with statements like "the end + of stream is reached (streambuf_type::sgetc() returns traits::eof())" + (lib.istreambuf.iterator paragraph 1, lib.ostreambuf.iter.ops + paragraph 5). It is unclear whether these should be clarified to use + traits::eq_int_type() for detecting traits::eof(). +
  • +
+ + + + + + +
+

46. Minor Annex D errors

+

Section: D.7 [depr.str.strstreams] Status: TC + Submitter: Brendan Kehoe Date: 1998-06-01

+

View all issues with TC status.

+

Discussion:

See lib-6522 and edit-814.

+ +

Proposed resolution:

+

Change D.7.1 [depr.strstreambuf] (since streambuf is a typedef of +basic_streambuf<char>) from:

+ +
         virtual streambuf<char>* setbuf(char* s, streamsize n);
+ +

to:

+ +
         virtual streambuf* setbuf(char* s, streamsize n);
+ +

In D.7.4 [depr.strstream] insert the semicolon now missing after +int_type:

+ +
     namespace std {
+       class strstream
+         : public basic_iostream<char> {
+       public:
+         // Types
+         typedef char                                char_type;
+         typedef typename char_traits<char>::int_type int_type
+         typedef typename char_traits<char>::pos_type pos_type;
+ + + + + +
+

47. Imbue() and getloc() Returns clauses swapped

+

Section: 27.4.2.3 [ios.base.locales] Status: TC + Submitter: Matt Austern Date: 1998-06-21

+

View all other issues in [ios.base.locales].

+

View all issues with TC status.

+

Discussion:

+

Section 27.4.2.3 specifies how imbue() and getloc() work. That +section has two RETURNS clauses, and they make no sense as +stated. They make perfect sense, though, if you swap them. Am I +correct in thinking that paragraphs 2 and 4 just got mixed up by +accident?

+ + +

Proposed resolution:

+

In 27.4.2.3 [ios.base.locales] swap paragraphs 2 and 4.

+ + + + + +
+

48. Use of non-existent exception constructor

+

Section: 27.4.2.1.1 [ios::failure] Status: TC + Submitter: Matt Austern Date: 1998-06-21

+

View all other issues in [ios::failure].

+

View all issues with TC status.

+

Discussion:

+

27.4.2.1.1, paragraph 2, says that class failure initializes the +base class, exception, with exception(msg). Class exception (see +18.6.1) has no such constructor.

+ + +

Proposed resolution:

+

Replace 27.4.2.1.1 [ios::failure], paragraph 2, with

+ +
+

EFFECTS: Constructs an object of class failure.

+
+ + + + + +
+

49. Underspecification of ios_base::sync_with_stdio

+

Section: 27.4.2.4 [ios.members.static] Status: WP + Submitter: Matt Austern Date: 1998-06-21

+

View all issues with WP status.

+

Discussion:

+

Two problems

+ +

(1) 27.4.2.4 doesn't say what ios_base::sync_with_stdio(f) +returns. Does it return f, or does it return the previous +synchronization state? My guess is the latter, but the standard +doesn't say so.

+ +

(2) 27.4.2.4 doesn't say what it means for streams to be +synchronized with stdio. Again, of course, I can make some +guesses. (And I'm unhappy about the performance implications of those +guesses, but that's another matter.)

+ + +

Proposed resolution:

+

Change the following sentence in 27.4.2.4 [ios.members.static] +returns clause from:

+ +
+

true if the standard iostream objects (27.3) are + synchronized and otherwise returns false.

+
+ +

to:

+ +
+

true if the previous state of the standard iostream + objects (27.3) was synchronized and otherwise returns + false.

+
+ +

Add the following immediately after 27.4.2.4 [ios.members.static], +paragraph 2:

+ +
+

When a standard iostream object str is synchronized with a +standard stdio stream f, the effect of inserting a character c by

+
  fputc(f, c);
+
+ +

is the same as the effect of

+
  str.rdbuf()->sputc(c);
+
+ +

for any sequence of characters; the effect of extracting a +character c by

+
  c = fgetc(f);
+
+ +

is the same as the effect of:

+
  c = str.rdbuf()->sbumpc(c);
+
+ +

for any sequences of characters; and the effect of pushing +back a character c by

+
  ungetc(c, f);
+
+ +

is the same as the effect of

+
  str.rdbuf()->sputbackc(c);
+
+ +

for any sequence of characters. [Footnote: This implies +that operations on a standard iostream object can be mixed arbitrarily +with operations on the corresponding stdio stream. In practical +terms, synchronization usually means that a standard iostream object +and a standard stdio object share a buffer. --End Footnote]

+
+ +

[pre-Copenhagen: PJP and Matt contributed the definition +of "synchronization"]

+ + +

[post-Copenhagen: proposed resolution was revised slightly: +text was added in the non-normative footnote to say that operations +on the two streams can be mixed arbitrarily.]

+ + + + + + +
+

50. Copy constructor and assignment operator of ios_base

+

Section: 27.4.2 [ios.base] Status: TC + Submitter: Matt Austern Date: 1998-06-21

+

View all other issues in [ios.base].

+

View all issues with TC status.

+

Discussion:

+

As written, ios_base has a copy constructor and an assignment +operator. (Nothing in the standard says it doesn't have one, and all +classes have copy constructors and assignment operators unless you +take specific steps to avoid them.) However, nothing in 27.4.2 says +what the copy constructor and assignment operator do.

+ +

My guess is that this was an oversight, that ios_base is, like +basic_ios, not supposed to have a copy constructor or an assignment +operator.

+ +

+Jerry Schwarz comments: Yes, its an oversight, but in the opposite +sense to what you're suggesting. At one point there was a definite +intention that you could copy ios_base. It's an easy way to save the +entire state of a stream for future use. As you note, to carry out +that intention would have required a explicit description of the +semantics (e.g. what happens to the iarray and parray stuff). +

+ + +

Proposed resolution:

+

In 27.4.2 [ios.base], class ios_base, specify the copy +constructor and operator= members as being private.

+ + +

Rationale:

+

The LWG believes the difficulty of specifying correct semantics +outweighs any benefit of allowing ios_base objects to be copyable.

+ + + + + +
+

51. Requirement to not invalidate iterators missing

+

Section: 23.1 [container.requirements] Status: TC + Submitter: David Vandevoorde Date: 1998-06-23

+

View other active issues in [container.requirements].

+

View all other issues in [container.requirements].

+

View all issues with TC status.

+

Discussion:

+

The std::sort algorithm can in general only sort a given sequence +by moving around values. The list<>::sort() member on the other +hand could move around values or just update internal pointers. Either +method can leave iterators into the list<> dereferencable, but +they would point to different things.

+ +

Does the FDIS mandate anywhere which method should be used for +list<>::sort()?

+ +

Matt Austern comments:

+ +

I think you've found an omission in the standard.

+ +

The library working group discussed this point, and there was +supposed to be a general requirement saying that list, set, map, +multiset, and multimap may not invalidate iterators, or change the +values that iterators point to, except when an operation does it +explicitly. So, for example, insert() doesn't invalidate any iterators +and erase() and remove() only invalidate iterators pointing to the +elements that are being erased.

+ +

I looked for that general requirement in the FDIS, and, while I +found a limited form of it for the sorted associative containers, I +didn't find it for list. It looks like it just got omitted.

+ +

The intention, though, is that list<>::sort does not +invalidate any iterators and does not change the values that any +iterator points to. There would be no reason to have the member +function otherwise.

+ + +

Proposed resolution:

+

Add a new paragraph at the end of 23.1:

+ +
+

Unless otherwise specified (either explicitly or by defining a function in terms of + other functions), invoking a container member function or passing a container as an + argument to a library function shall not invalidate iterators to, or change the values of, + objects within that container.

+
+ + +

Rationale:

+

This was US issue CD2-23-011; it was accepted in London but the +change was not made due to an editing oversight. The wording in the +proposed resolution below is somewhat updated from CD2-23-011, +particularly the addition of the phrase "or change the values +of"

+ + + + + +
+

52. Small I/O problems

+

Section: 27.4.3.2 [fpos.operations] Status: TC + Submitter: Matt Austern Date: 1998-06-23

+

View all issues with TC status.

+

Discussion:

+

First, 27.4.4.1 [basic.ios.cons], table 89. This is pretty obvious: +it should be titled "basic_ios<>() effects", not +"ios_base() effects".

+ +

[The second item is a duplicate; see issue 6 for +resolution.]

+ +

Second, 27.4.3.2 [fpos.operations] table 88 . There are a couple +different things wrong with it, some of which I've already discussed +with Jerry, but the most obvious mechanical sort of error is that it +uses expressions like P(i) and p(i), without ever defining what sort +of thing "i" is. +

+ +

(The other problem is that it requires support for streampos +arithmetic. This is impossible on some systems, i.e. ones where file +position is a complicated structure rather than just a number. Jerry +tells me that the intention was to require syntactic support for +streampos arithmetic, but that it wasn't actually supposed to do +anything meaningful except on platforms, like Unix, where genuine +arithmetic is possible.)

+ + +

Proposed resolution:

+

Change 27.4.4.1 [basic.ios.cons] table 89 title from +"ios_base() effects" to "basic_ios<>() +effects".

+ + + + + +
+

53. Basic_ios destructor unspecified

+

Section: 27.4.4.1 [basic.ios.cons] Status: TC + Submitter: Matt Austern Date: 1998-06-23

+

View all other issues in [basic.ios.cons].

+

View all issues with TC status.

+

Discussion:

+

There's nothing in 27.4.4 saying what basic_ios's destructor does. +The important question is whether basic_ios::~basic_ios() destroys +rdbuf().

+ + +

Proposed resolution:

+

Add after 27.4.4.1 [basic.ios.cons] paragraph 2:

+ +
+

virtual ~basic_ios();

+

Notes: The destructor does not destroy rdbuf().

+
+ + +

Rationale:

+

The LWG reviewed the additional question of whether or not +rdbuf(0) may set badbit. The answer is +clearly yes; it may be set via clear(). See 27.4.4.2 [basic.ios.members], paragraph 6. This issue was reviewed at length +by the LWG, which removed from the original proposed resolution a +footnote which incorrectly said "rdbuf(0) does not set +badbit".

+ + + + + +
+

54. Basic_streambuf's destructor

+

Section: 27.5.2.1 [streambuf.cons] Status: TC + Submitter: Matt Austern Date: 1998-06-25

+

View all other issues in [streambuf.cons].

+

View all issues with TC status.

+

Discussion:

+

The class synopsis for basic_streambuf shows a (virtual) +destructor, but the standard doesn't say what that destructor does. My +assumption is that it does nothing, but the standard should say so +explicitly.

+ + +

Proposed resolution:

+

Add after 27.5.2.1 [streambuf.cons] paragraph 2:

+ +
+

virtual  ~basic_streambuf();

+

Effects: None.

+
+ + + + + +
+

55. Invalid stream position is undefined

+

Section: 27 [input.output] Status: TC + Submitter: Matt Austern Date: 1998-06-26

+

View all other issues in [input.output].

+

View all issues with TC status.

+

Discussion:

+

Several member functions in clause 27 are defined in certain +circumstances to return an "invalid stream position", a term +that is defined nowhere in the standard. Two places (27.5.2.4.2, +paragraph 4, and 27.8.1.4, paragraph 15) contain a cross-reference to +a definition in _lib.iostreams.definitions_, a nonexistent +section.

+ +

I suspect that the invalid stream position is just supposed to be +pos_type(-1). Probably best to say explicitly in (for example) +27.5.2.4.2 that the return value is pos_type(-1), rather than to use +the term "invalid stream position", define that term +somewhere, and then put in a cross-reference.

+ +

The phrase "invalid stream position" appears ten times in +the C++ Standard. In seven places it refers to a return value, and it +should be changed. In three places it refers to an argument, and it +should not be changed. Here are the three places where "invalid +stream position" should not be changed:

+ +
+

27.7.1.4 [stringbuf.virtuals], paragraph 14
+ 27.8.1.5 [filebuf.virtuals], paragraph 14
+ D.7.1.3 [depr.strstreambuf.virtuals], paragraph 17 +

+
+ + +

Proposed resolution:

+

In 27.5.2.4.2 [streambuf.virt.buffer], paragraph 4, change "Returns an +object of class pos_type that stores an invalid stream position +(_lib.iostreams.definitions_)" to "Returns +pos_type(off_type(-1))". +

+ +

In 27.5.2.4.2 [streambuf.virt.buffer], paragraph 6, change "Returns +an object of class pos_type that stores an invalid stream +position" to "Returns pos_type(off_type(-1))".

+ +

In 27.7.1.4 [stringbuf.virtuals], paragraph 13, change "the object +stores an invalid stream position" to "the return value is +pos_type(off_type(-1))".

+ +

In 27.8.1.5 [filebuf.virtuals], paragraph 13, change "returns an +invalid stream position (27.4.3)" to "returns +pos_type(off_type(-1))"

+ +

In 27.8.1.5 [filebuf.virtuals], paragraph 15, change "Otherwise +returns an invalid stream position (_lib.iostreams.definitions_)" +to "Otherwise returns pos_type(off_type(-1))" +

+ +

In D.7.1.3 [depr.strstreambuf.virtuals], paragraph 15, change "the object +stores an invalid stream position" to "the return value is +pos_type(off_type(-1))"

+ +

In D.7.1.3 [depr.strstreambuf.virtuals], paragraph 18, change "the object +stores an invalid stream position" to "the return value is +pos_type(off_type(-1))"

+ + + + + +
+

56. Showmanyc's return type

+

Section: 27.5.2 [streambuf] Status: TC + Submitter: Matt Austern Date: 1998-06-29

+

View all other issues in [streambuf].

+

View all issues with TC status.

+

Discussion:

+

The class summary for basic_streambuf<>, in 27.5.2, says that +showmanyc has return type int. However, 27.5.2.4.3 says that its +return type is streamsize.

+ + +

Proposed resolution:

+

Change showmanyc's return type in the +27.5.2 [streambuf] class summary to streamsize.

+ + + + + +
+

57. Mistake in char_traits

+

Section: 21.1.3.4 [char.traits.specializations.wchar.t] Status: TC + Submitter: Matt Austern Date: 1998-07-01

+

View all issues with TC status.

+

Discussion:

+

21.1.3.2, paragraph 3, says "The types streampos and +wstreampos may be different if the implementation supports no shift +encoding in narrow-oriented iostreams but supports one or more shift +encodings in wide-oriented streams".

+ +

That's wrong: the two are the same type. The <iosfwd> summary +in 27.2 says that streampos and wstreampos are, respectively, synonyms +for fpos<char_traits<char>::state_type> and +fpos<char_traits<wchar_t>::state_type>, and, flipping back +to clause 21, we see in 21.1.3.1 and 21.1.3.2 that +char_traits<char>::state_type and +char_traits<wchar_t>::state_type must both be mbstate_t.

+ + +

Proposed resolution:

+

Remove the sentence in 21.1.3.4 [char.traits.specializations.wchar.t] paragraph 3 which +begins "The types streampos and wstreampos may be +different..." .

+ + + + + +
+

59. Ambiguity in specification of gbump

+

Section: 27.5.2.3.2 [streambuf.get.area] Status: TC + Submitter: Matt Austern Date: 1998-07-28

+

View all issues with TC status.

+

Discussion:

+

27.5.2.3.1 says that basic_streambuf::gbump() "Advances the +next pointer for the input sequence by n."

+ +

The straightforward interpretation is that it is just gptr() += +n. An alternative interpretation, though, is that it behaves as if it +calls sbumpc n times. (The issue, of course, is whether it might ever +call underflow.) There is a similar ambiguity in the case of +pbump.

+ +

(The "classic" AT&T implementation used the +former interpretation.)

+ + +

Proposed resolution:

+

Change 27.5.2.3.2 [streambuf.get.area] paragraph 4 gbump effects from:

+ +
+

Effects: Advances the next pointer for the input sequence by n.

+
+ +

to:

+ +
+

Effects: Adds n to the next pointer for the input sequence.

+
+ +

Make the same change to 27.5.2.3.3 [streambuf.put.area] paragraph 4 pbump +effects.

+ + + + + +
+

60. What is a formatted input function?

+

Section: 27.6.1.2.1 [istream.formatted.reqmts] Status: TC + Submitter: Matt Austern Date: 1998-08-03

+

View all other issues in [istream.formatted.reqmts].

+

View all issues with TC status.

+

Duplicate of: 162, 163, 166

+

Discussion:

+

Paragraph 1 of 27.6.1.2.1 contains general requirements for all +formatted input functions. Some of the functions defined in section +27.6.1.2 explicitly say that those requirements apply ("Behaves +like a formatted input member (as described in 27.6.1.2.1)"), but +others don't. The question: is 27.6.1.2.1 supposed to apply to +everything in 27.6.1.2, or only to those member functions that +explicitly say "behaves like a formatted input member"? Or +to put it differently: are we to assume that everything that appears +in a section called "Formatted input functions" really is a +formatted input function? I assume that 27.6.1.2.1 is intended to +apply to the arithmetic extractors (27.6.1.2.2), but I assume that it +is not intended to apply to extractors like

+ +
    basic_istream& operator>>(basic_istream& (*pf)(basic_istream&));
+ +

and

+ +
    basic_istream& operator>>(basic_streammbuf*);
+ +

There is a similar ambiguity for unformatted input, formatted output, and unformatted +output.

+ +

Comments from Judy Ward: It seems like the problem is that the +basic_istream and basic_ostream operator <<()'s that are used +for the manipulators and streambuf* are in the wrong section and +should have their own separate section or be modified to make it clear +that the "Common requirements" listed in section 27.6.1.2.1 +(for basic_istream) and section 27.6.2.5.1 (for basic_ostream) do not +apply to them.

+ +

Additional comments from Dietmar Kühl: It appears to be somewhat +nonsensical to consider the functions defined in 27.6.1.2.3 +[istream::extractors] paragraphs 1 to 5 to be "Formatted input +function" but since these functions are defined in a section +labeled "Formatted input functions" it is unclear to me +whether these operators are considered formatted input functions which +have to conform to the "common requirements" from 27.6.1.2.1 +[istream.formatted.reqmts]: If this is the case, all manipulators, not +just ws, would skip whitespace unless noskipws is +set (... but setting noskipws using the manipulator syntax +would also skip whitespace :-)

It is not clear which functions +are to be considered unformatted input functions. As written, it seems +that all functions in 27.6.1.3 [istream.unformatted] are unformatted input +functions. However, it does not really make much sense to construct a +sentry object for gcount(), sync(), ... Also it is +unclear what happens to the gcount() if +eg. gcount(), putback(), unget(), or +sync() is called: These functions don't extract characters, +some of them even "unextract" a character. Should this still +be reflected in gcount()? Of course, it could be read as if +after a call to gcount() gcount() return 0 +(the last unformatted input function, gcount(), didn't +extract any character) and after a call to putback() +gcount() returns -1 (the last unformatted input +function putback() did "extract" back into the +stream). Correspondingly for unget(). Is this what is +intended? If so, this should be clarified. Otherwise, a corresponding +clarification should be used.

+ + +

Proposed resolution:

+

+In 27.6.1.2.2 [lib.istream.formatted.arithmetic], paragraph 1. +Change the beginning of the second sentence from "The conversion +occurs" to "These extractors behave as formatted input functions (as +described in 27.6.1.2.1). After a sentry object is constructed, +the conversion occurs" +

+ +

+In 27.6.1.2.3, [lib.istream::extractors], before paragraph 1. +Add an effects clause. "Effects: None. This extractor does +not behave as a formatted input function (as described in +27.6.1.2.1). +

+ +

+In 27.6.1.2.3, [lib.istream::extractors], paragraph 2. Change the +effects clause to "Effects: Calls pf(*this). This extractor does not +behave as a formatted input function (as described in 27.6.1.2.1). +

+ +

+In 27.6.1.2.3, [lib.istream::extractors], paragraph 4. Change the +effects clause to "Effects: Calls pf(*this). This extractor does not +behave as a formatted input function (as described in 27.6.1.2.1). +

+ +

+In 27.6.1.2.3, [lib.istream::extractors], paragraph 12. Change the +first two sentences from "If sb is null, calls setstate(failbit), +which may throw ios_base::failure (27.4.4.3). Extracts characters +from *this..." to "Behaves as a formatted input function (as described +in 27.6.1.2.1). If sb is null, calls setstate(failbit), which may +throw ios_base::failure (27.4.4.3). After a sentry object is +constructed, extracts characters from *this...". +

+ +

+In 27.6.1.3, [lib.istream.unformatted], before paragraph 2. Add an +effects clause. "Effects: none. This member function does not behave +as an unformatted input function (as described in 27.6.1.3, paragraph 1)." +

+ +

+In 27.6.1.3, [lib.istream.unformatted], paragraph 3. Change the +beginning of the first sentence of the effects clause from "Extracts a +character" to "Behaves as an unformatted input function (as described +in 27.6.1.3, paragraph 1). After constructing a sentry object, extracts a +character" +

+ +

+In 27.6.1.3, [lib.istream.unformatted], paragraph 5. Change the +beginning of the first sentence of the effects clause from "Extracts a +character" to "Behaves as an unformatted input function (as described +in 27.6.1.3, paragraph 1). After constructing a sentry object, extracts a +character" +

+ +

+In 27.6.1.3, [lib.istream.unformatted], paragraph 7. Change the +beginning of the first sentence of the effects clause from "Extracts +characters" to "Behaves as an unformatted input function (as described +in 27.6.1.3, paragraph 1). After constructing a sentry object, extracts +characters" +

+ +

+[No change needed in paragraph 10, because it refers to paragraph 7.] +

+ +

+In 27.6.1.3, [lib.istream.unformatted], paragraph 12. Change the +beginning of the first sentence of the effects clause from "Extracts +characters" to "Behaves as an unformatted input function (as described +in 27.6.1.3, paragraph 1). After constructing a sentry object, extracts +characters" +

+ +

+[No change needed in paragraph 15.] +

+ +

+In 27.6.1.3, [lib.istream.unformatted], paragraph 17. Change the +beginning of the first sentence of the effects clause from "Extracts +characters" to "Behaves as an unformatted input function (as described +in 27.6.1.3, paragraph 1). After constructing a sentry object, extracts +characters" +

+ +

+[No change needed in paragraph 23.] +

+ +

+In 27.6.1.3, [lib.istream.unformatted], paragraph 24. Change the +beginning of the first sentence of the effects clause from "Extracts +characters" to "Behaves as an unformatted input function (as described +in 27.6.1.3, paragraph 1). After constructing a sentry object, extracts +characters" +

+ +

+In 27.6.1.3, [lib.istream.unformatted], before paragraph 27. Add an +Effects clause: "Effects: Behaves as an unformatted input function (as +described in 27.6.1.3, paragraph 1). After constructing a sentry +object, reads but does not extract the current input character." +

+ +

+In 27.6.1.3, [lib.istream.unformatted], paragraph 28. Change the +first sentence of the Effects clause from "If !good() calls" to +Behaves as an unformatted input function (as described in 27.6.1.3, +paragraph 1). After constructing a sentry object, if !good() calls" +

+ +

+In 27.6.1.3, [lib.istream.unformatted], paragraph 30. Change the +first sentence of the Effects clause from "If !good() calls" to +"Behaves as an unformatted input function (as described in 27.6.1.3, +paragraph 1). After constructing a sentry object, if !good() calls" +

+ +

+In 27.6.1.3, [lib.istream.unformatted], paragraph 32. Change the +first sentence of the Effects clause from "If !good() calls..." to +"Behaves as an unformatted input function (as described in 27.6.1.3, +paragraph 1). After constructing a sentry object, if !good() +calls..." Add a new sentence to the end of the Effects clause: +"[Note: this function extracts no characters, so the value returned +by the next call to gcount() is 0.]" +

+ +

+In 27.6.1.3, [lib.istream.unformatted], paragraph 34. Change the +first sentence of the Effects clause from "If !good() calls" to +"Behaves as an unformatted input function (as described in 27.6.1.3, +paragraph 1). After constructing a sentry object, if !good() calls". +Add a new sentence to the end of the Effects clause: "[Note: this +function extracts no characters, so the value returned by the next +call to gcount() is 0.]" +

+ +

+In 27.6.1.3, [lib.istream.unformatted], paragraph 36. Change the +first sentence of the Effects clause from "If !rdbuf() is" to "Behaves +as an unformatted input function (as described in 27.6.1.3, paragraph +1), except that it does not count the number of characters extracted +and does not affect the value returned by subsequent calls to +gcount(). After constructing a sentry object, if rdbuf() is" +

+ +

+In 27.6.1.3, [lib.istream.unformatted], before paragraph 37. Add an +Effects clause: "Effects: Behaves as an unformatted input function (as +described in 27.6.1.3, paragraph 1), except that it does not count the +number of characters extracted and does not affect the value returned +by subsequent calls to gcount()." Change the first sentence of +paragraph 37 from "if fail()" to "after constructing a sentry object, +if fail()". +

+ +

+In 27.6.1.3, [lib.istream.unformatted], paragraph 38. Change the +first sentence of the Effects clause from "If fail()" to "Behaves +as an unformatted input function (as described in 27.6.1.3, paragraph +1), except that it does not count the number of characters extracted +and does not affect the value returned by subsequent calls to +gcount(). After constructing a sentry object, if fail() +

+ +

+In 27.6.1.3, [lib.istream.unformatted], paragraph 40. Change the +first sentence of the Effects clause from "If fail()" to "Behaves +as an unformatted input function (as described in 27.6.1.3, paragraph +1), except that it does not count the number of characters extracted +and does not affect the value returned by subsequent calls to +gcount(). After constructing a sentry object, if fail() +

+ +

+In 27.6.2.5.2 [lib.ostream.inserters.arithmetic], paragraph 1. Change +the beginning of the third sentence from "The formatting conversion" +to "These extractors behave as formatted output functions (as +described in 27.6.2.5.1). After the sentry object is constructed, the +conversion occurs". +

+ +

+In 27.6.2.5.3 [lib.ostream.inserters], before paragraph 1. Add an +effects clause: "Effects: None. Does not behave as a formatted output +function (as described in 27.6.2.5.1).". +

+ +

+In 27.6.2.5.3 [lib.ostream.inserters], paragraph 2. Change the +effects clause to "Effects: calls pf(*this). This extractor does not +behave as a formatted output function (as described in 27.6.2.5.1).". +

+ +

+In 27.6.2.5.3 [lib.ostream.inserters], paragraph 4. Change the +effects clause to "Effects: calls pf(*this). This extractor does not +behave as a formatted output function (as described in 27.6.2.5.1).". +

+ +

+In 27.6.2.5.3 [lib.ostream.inserters], paragraph 6. Change the first +sentence from "If sb" to "Behaves as a formatted output function (as +described in 27.6.2.5.1). After the sentry object is constructed, if +sb". +

+ +

+In 27.6.2.6 [lib.ostream.unformatted], paragraph 2. Change the first +sentence from "Inserts the character" to "Behaves as an unformatted +output function (as described in 27.6.2.6, paragraph 1). After +constructing a sentry object, inserts the character". +

+ +

+In 27.6.2.6 [lib.ostream.unformatted], paragraph 5. Change the first +sentence from "Obtains characters" to "Behaves as an unformatted +output function (as described in 27.6.2.6, paragraph 1). After +constructing a sentry object, obtains characters". +

+ +

+In 27.6.2.6 [lib.ostream.unformatted], paragraph 7. Add a new +sentence at the end of the paragraph: "Does not behave as an +unformatted output function (as described in 27.6.2.6, paragraph 1)." +

+ + +

Rationale:

+

See J16/99-0043==WG21/N1219, Proposed Resolution to Library Issue 60, +by Judy Ward and Matt Austern. This proposed resolution is section +VI of that paper.

+ + + + + +
+

61. Ambiguity in iostreams exception policy

+

Section: 27.6.1.3 [istream.unformatted] Status: TC + Submitter: Matt Austern Date: 1998-08-06

+

View all other issues in [istream.unformatted].

+

View all issues with TC status.

+

Discussion:

+

The introduction to the section on unformatted input (27.6.1.3) +says that every unformatted input function catches all exceptions that +were thrown during input, sets badbit, and then conditionally rethrows +the exception. That seems clear enough. Several of the specific +functions, however, such as get() and read(), are documented in some +circumstances as setting eofbit and/or failbit. (The standard notes, +correctly, that setting eofbit or failbit can sometimes result in an +exception being thrown.) The question: if one of these functions +throws an exception triggered by setting failbit, is this an exception +"thrown during input" and hence covered by 27.6.1.3, or does +27.6.1.3 only refer to a limited class of exceptions? Just to make +this concrete, suppose you have the following snippet.

+ +
  
+  char buffer[N];
+  istream is;
+  ...
+  is.exceptions(istream::failbit); // Throw on failbit but not on badbit.
+  is.read(buffer, N);
+ +

Now suppose we reach EOF before we've read N characters. What +iostate bits can we expect to be set, and what exception (if any) will +be thrown?

+ + +

Proposed resolution:

+

+In 27.6.1.3, paragraph 1, after the sentence that begins +"If an exception is thrown...", add the following +parenthetical comment: "(Exceptions thrown from +basic_ios<>::clear() are not caught or rethrown.)" +

+ + +

Rationale:

+

The LWG looked to two alternative wordings, and choose the proposed +resolution as better standardese.

+ + + + + +
+

62. Sync's return value

+

Section: 27.6.1.3 [istream.unformatted] Status: TC + Submitter: Matt Austern Date: 1998-08-06

+

View all other issues in [istream.unformatted].

+

View all issues with TC status.

+

Discussion:

+

The Effects clause for sync() (27.6.1.3, paragraph 36) says that it +"calls rdbuf()->pubsync() and, if that function returns -1 +... returns traits::eof()."

+ +

That looks suspicious, because traits::eof() is of type +traits::int_type while the return type of sync() is int.

+ + +

Proposed resolution:

+

In 27.6.1.3 [istream.unformatted], paragraph 36, change "returns +traits::eof()" to "returns -1". +

+ + + + + +
+

63. Exception-handling policy for unformatted output

+

Section: 27.6.2.7 [ostream.unformatted] Status: TC + Submitter: Matt Austern Date: 1998-08-11

+

View all other issues in [ostream.unformatted].

+

View all issues with TC status.

+

Discussion:

+

Clause 27 details an exception-handling policy for formatted input, +unformatted input, and formatted output. It says nothing for +unformatted output (27.6.2.6). 27.6.2.6 should either include the same +kind of exception-handling policy as in the other three places, or +else it should have a footnote saying that the omission is +deliberate.

+ + +

Proposed resolution:

+

+In 27.6.2.6, paragraph 1, replace the last sentence ("In any +case, the unformatted output function ends by destroying the sentry +object, then returning the value specified for the formatted output +function.") with the following text: +

+

+If an exception is thrown during output, then ios::badbit is +turned on [Footnote: without causing an ios::failure to be +thrown.] in *this's error state. If (exceptions() & +badbit) != 0 then the exception is rethrown. In any case, the +unformatted output function ends by destroying the sentry object, +then, if no exception was thrown, returning the value specified for +the formatted output function. +

+ + +

Rationale:

+

+This exception-handling policy is consistent with that of formatted +input, unformatted input, and formatted output. +

+ + + + + +
+

64. Exception handling in basic_istream::operator>>(basic_streambuf*)

+

Section: 27.6.1.2.3 [istream::extractors] Status: TC + Submitter: Matt Austern Date: 1998-08-11

+

View all other issues in [istream::extractors].

+

View all issues with TC status.

+

Discussion:

+

27.6.1.2.3, paragraph 13, is ambiguous. It can be interpreted two +different ways, depending on whether the second sentence is read as an +elaboration of the first.

+ + +

Proposed resolution:

+

Replace 27.6.1.2.3 [istream::extractors], paragraph 13, which begins +"If the function inserts no characters ..." with:

+ +
+

If the function inserts no characters, it calls + setstate(failbit), which may throw + ios_base::failure (27.4.4.3). If it inserted no characters + because it caught an exception thrown while extracting characters + from sb and failbit is on in exceptions() + (27.4.4.3), then the caught exception is rethrown.

+
+ + + + + +
+

66. Strstreambuf::setbuf

+

Section: D.7.1.3 [depr.strstreambuf.virtuals] Status: TC + Submitter: Matt Austern Date: 1998-08-18

+

View all other issues in [depr.strstreambuf.virtuals].

+

View all issues with TC status.

+

Discussion:

+

D.7.1.3, paragraph 19, says that strstreambuf::setbuf +"Performs an operation that is defined separately for each class +derived from strstreambuf". This is obviously an incorrect +cut-and-paste from basic_streambuf. There are no classes derived from +strstreambuf.

+ + +

Proposed resolution:

+

D.7.1.3 [depr.strstreambuf.virtuals], paragraph 19, replace the setbuf effects +clause which currently says "Performs an operation that is +defined separately for each class derived from strstreambuf" +with:

+ +
+

Effects: implementation defined, except that + setbuf(0,0) has no effect.

+
+ + + + + +
+

68. Extractors for char* should store null at end

+

Section: 27.6.1.2.3 [istream::extractors] Status: TC + Submitter: Angelika Langer Date: 1998-07-14

+

View all other issues in [istream::extractors].

+

View all issues with TC status.

+

Discussion:

+

Extractors for char* (27.6.1.2.3) do not store a null character +after the extracted character sequence whereas the unformatted +functions like get() do. Why is this?

+ +

Comment from Jerry Schwarz: There is apparently an editing +glitch. You'll notice that the last item of the list of what stops +extraction doesn't make any sense. It was supposed to be the line that +said a null is stored.

+ + +

Proposed resolution:

+

27.6.1.2.3 [istream::extractors], paragraph 7, change the last list +item from:

+ +

+ A null byte (charT()) in the next position, which may be + the first position if no characters were extracted. +

+ +

to become a new paragraph which reads:

+ +

+ Operator>> then stores a null byte (charT()) in the + next position, which may be the first position if no characters were + extracted. +

+ + + + + +
+

69. Must elements of a vector be contiguous?

+

Section: 23.2.5 [vector] Status: TC + Submitter: Andrew Koenig Date: 1998-07-29

+

View all other issues in [vector].

+

View all issues with TC status.

+

Discussion:

+

The issue is this: Must the elements of a vector be in contiguous memory?

+ +

(Please note that this is entirely separate from the question of +whether a vector iterator is required to be a pointer; the answer to +that question is clearly "no," as it would rule out +debugging implementations)

+ + +

Proposed resolution:

+

Add the following text to the end of 23.2.5 [vector], +paragraph 1.

+ +
+

The elements of a vector are stored contiguously, meaning that if + v is a vector<T, Allocator> where T is some type + other than bool, then it obeys the identity &v[n] + == &v[0] + n for all 0 <= n < v.size().

+
+ + +

Rationale:

+

The LWG feels that as a practical matter the answer is clearly +"yes". There was considerable discussion as to the best way +to express the concept of "contiguous", which is not +directly defined in the standard. Discussion included:

+ +
    +
  • An operational definition similar to the above proposed resolution is + already used for valarray (26.5.2.3 [valarray.access]).
  • +
  • There is no need to explicitly consider a user-defined operator& + because elements must be copyconstructible (23.1 [container.requirements] para 3) + and copyconstructible (20.1.1 [utility.arg.requirements]) specifies + requirements for operator&.
  • +
  • There is no issue of one-past-the-end because of language rules.
  • +
+ + + + + +
+

70. Uncaught_exception() missing throw() specification

+

Section: 18.7 [support.exception], 18.7.4 [uncaught] Status: TC + Submitter: Steve Clamage Date: 1998-08-03

+

View all other issues in [support.exception].

+

View all issues with TC status.

+

Discussion:

+

In article 3E04@pratique.fr, Valentin Bonnard writes:

+ +

uncaught_exception() doesn't have a throw specification.

+ +

It is intentional ? Does it means that one should be prepared to +handle exceptions thrown from uncaught_exception() ?

+ +

uncaught_exception() is called in exception handling contexts where +exception safety is very important.

+ + +

Proposed resolution:

+

In 15.5.3 [except.uncaught], paragraph 1, 18.7 [support.exception], +and 18.7.4 [uncaught], add "throw()" to uncaught_exception().

+ + + + +
+

71. Do_get_monthname synopsis missing argument

+

Section: 22.2.5.1 [locale.time.get] Status: TC + Submitter: Nathan Myers Date: 1998-08-13

+

View all issues with TC status.

+

Discussion:

+

The locale facet member time_get<>::do_get_monthname +is described in 22.2.5.1.2 [locale.time.get.virtuals] with five arguments, +consistent with do_get_weekday and with its specified use by member +get_monthname. However, in the synopsis, it is specified instead with +four arguments. The missing argument is the "end" iterator +value.

+ + +

Proposed resolution:

+

In 22.2.5.1 [locale.time.get], add an "end" argument to +the declaration of member do_monthname as follows:

+ +
  virtual iter_type do_get_monthname(iter_type s, iter_type end, ios_base&,
+                                     ios_base::iostate& err, tm* t) const;
+ + + + +
+

74. Garbled text for codecvt::do_max_length

+

Section: 22.2.1.4 [locale.codecvt] Status: TC + Submitter: Matt Austern Date: 1998-09-08

+

View all other issues in [locale.codecvt].

+

View all issues with TC status.

+

Discussion:

+

The text of codecvt::do_max_length's "Returns" +clause (22.2.1.5.2, paragraph 11) is garbled. It has unbalanced +parentheses and a spurious n.

+ + +

Proposed resolution:

+

Replace 22.2.1.4.2 [locale.codecvt.virtuals] paragraph 11 with the +following:

+ +

+ Returns: The maximum value that + do_length(state, from, from_end, 1) can return for any + valid range [from, from_end) and stateT value + state. The specialization codecvt<char, char, + mbstate_t>::do_max_length() returns 1. +

+ + + + +
+

75. Contradiction in codecvt::length's argument types

+

Section: 22.2.1.4 [locale.codecvt] Status: TC + Submitter: Matt +Austern Date: 1998-09-18

+

View all other issues in [locale.codecvt].

+

View all issues with TC status.

+

Discussion:

+

The class synopses for classes codecvt<> (22.2.1.5) +and codecvt_byname<> (22.2.1.6) say that the first +parameter of the member functions length and +do_length is of type const stateT&. The member +function descriptions, however (22.2.1.5.1, paragraph 6; 22.2.1.5.2, +paragraph 9) say that the type is stateT&. Either the +synopsis or the summary must be changed.

+ +

If (as I believe) the member function descriptions are correct, +then we must also add text saying how do_length changes its +stateT argument.

+ + +

Proposed resolution:

+

In 22.2.1.4 [locale.codecvt], and also in 22.2.1.5 [locale.codecvt.byname], +change the stateT argument type on both member +length() and member do_length() from

+ +
+

const stateT&

+
+ +

to

+ +
+

stateT&

+
+ +

In 22.2.1.4.2 [locale.codecvt.virtuals], add to the definition for member +do_length a paragraph:

+ +
+

Effects: The effect on the state argument is ``as if'' + it called do_in(state, from, from_end, from, to, to+max, + to) for to pointing to a buffer of at least + max elements.

+
+ + + + +
+

76. Can a codecvt facet always convert one internal character at a time?

+

Section: 22.2.1.4 [locale.codecvt] Status: WP + Submitter: Matt Austern Date: 1998-09-25

+

View all other issues in [locale.codecvt].

+

View all issues with WP status.

+

Discussion:

+

This issue concerns the requirements on classes derived from +codecvt, including user-defined classes. What are the +restrictions on the conversion from external characters +(e.g. char) to internal characters (e.g. wchar_t)? +Or, alternatively, what assumptions about codecvt facets can +the I/O library make?

+ +

The question is whether it's possible to convert from internal +characters to external characters one internal character at a time, +and whether, given a valid sequence of external characters, it's +possible to pick off internal characters one at a time. Or, to put it +differently: given a sequence of external characters and the +corresponding sequence of internal characters, does a position in the +internal sequence correspond to some position in the external +sequence?

+ +

To make this concrete, suppose that [first, last) is a +sequence of M external characters and that [ifirst, +ilast) is the corresponding sequence of N internal +characters, where N > 1. That is, my_encoding.in(), +applied to [first, last), yields [ifirst, +ilast). Now the question: does there necessarily exist a +subsequence of external characters, [first, last_1), such +that the corresponding sequence of internal characters is the single +character *ifirst? +

+ +

(What a "no" answer would mean is that +my_encoding translates sequences only as blocks. There's a +sequence of M external characters that maps to a sequence of +N internal characters, but that external sequence has no +subsequence that maps to N-1 internal characters.)

+ +

Some of the wording in the standard, such as the description of +codecvt::do_max_length (22.2.1.4.2 [locale.codecvt.virtuals], +paragraph 11) and basic_filebuf::underflow (27.8.1.5 [filebuf.virtuals], paragraph 3) suggests that it must always be +possible to pick off internal characters one at a time from a sequence +of external characters. However, this is never explicitly stated one +way or the other.

+ +

This issue seems (and is) quite technical, but it is important if +we expect users to provide their own encoding facets. This is an area +where the standard library calls user-supplied code, so a well-defined +set of requirements for the user-supplied code is crucial. Users must +be aware of the assumptions that the library makes. This issue affects +positioning operations on basic_filebuf, unbuffered input, +and several of codecvt's member functions.

+ + +

Proposed resolution:

+

Add the following text as a new paragraph, following 22.2.1.4.2 [locale.codecvt.virtuals] paragraph 2:

+ +
+

A codecvt facet that is used by basic_filebuf +(27.8 [file.streams]) must have the property that if

+
    do_out(state, from, from_end, from_next, to, to_lim, to_next)
+
+

would return ok, where from != from_end, then

+
    do_out(state, from, from + 1, from_next, to, to_end, to_next)
+
+

must also return ok, and that if

+
    do_in(state, from, from_end, from_next, to, to_lim, to_next)
+
+

would return ok, where to != to_lim, then

+
    do_in(state, from, from_end, from_next, to, to + 1, to_next)
+
+

must also return ok. [Footnote: Informally, this +means that basic_filebuf assumes that the mapping from +internal to external characters is 1 to N: a codecvt that is +used by basic_filebuf must be able to translate characters +one internal character at a time. --End Footnote]

+
+ +

[Redmond: Minor change in proposed resolution. Original +proposed resolution talked about "success", with a parenthetical +comment that success meant returning ok. New wording +removes all talk about "success", and just talks about the +return value.]

+ + + + +

Rationale:

+ +

The proposed resoluion says that conversions can be performed one + internal character at a time. This rules out some encodings that + would otherwise be legal. The alternative answer would mean there + would be some internal positions that do not correspond to any + external file position.

+

+ An example of an encoding that this rules out is one where the + internT and externT are of the same type, and + where the internal sequence c1 c2 corresponds to the + external sequence c2 c1. +

+

It was generally agreed that basic_filebuf relies + on this property: it was designed under the assumption that + the external-to-internal mapping is N-to-1, and it is not clear + that basic_filebuf is implementable without that + restriction. +

+

+ The proposed resolution is expressed as a restriction on + codecvt when used by basic_filebuf, rather + than a blanket restriction on all codecvt facets, + because basic_filebuf is the only other part of the + library that uses codecvt. If a user wants to define + a codecvt facet that implements a more general N-to-M + mapping, there is no reason to prohibit it, so long as the user + does not expect basic_filebuf to be able to use it. +

+ + + + + +
+

78. Typo: event_call_back

+

Section: 27.4.2 [ios.base] Status: TC + Submitter: Nico Josuttis Date: 1998-09-29

+

View all other issues in [ios.base].

+

View all issues with TC status.

+

Discussion:

+

typo: event_call_back should be event_callback  

+ + +

Proposed resolution:

+

In the 27.4.2 [ios.base] synopsis change +"event_call_back" to "event_callback".

+ + + + +
+

79. Inconsistent declaration of polar()

+

Section: 26.3.1 [complex.synopsis], 26.3.7 [complex.value.ops] Status: TC + Submitter: Nico Josuttis Date: 1998-09-29

+

View all other issues in [complex.synopsis].

+

View all issues with TC status.

+

Discussion:

+

In 26.3.1 [complex.synopsis] polar is declared as follows:

+
   template<class T> complex<T> polar(const T&, const T&); 
+ +

In 26.3.7 [complex.value.ops] it is declared as follows:

+
   template<class T> complex<T> polar(const T& rho, const T& theta = 0); 
+ +

Thus whether the second parameter is optional is not clear.

+ + +

Proposed resolution:

+

In 26.3.1 [complex.synopsis] change:

+
   template<class T> complex<T> polar(const T&, const T&);
+ +

to:

+
   template<class T> complex<T> polar(const T& rho, const T& theta = 0); 
+ + + + + +
+

80. Global Operators of complex declared twice

+

Section: 26.3.1 [complex.synopsis], 26.3.2 [complex] Status: TC + Submitter: Nico Josuttis Date: 1998-09-29

+

View all other issues in [complex.synopsis].

+

View all issues with TC status.

+

Discussion:

+

Both 26.2.1 and 26.2.2 contain declarations of global operators for +class complex. This redundancy should be removed.

+ + +

Proposed resolution:

+

Reduce redundancy according to the general style of the standard.

+ + + + +
+

83. String::npos vs. string::max_size()

+

Section: 21.3 [basic.string] Status: TC + Submitter: Nico Josuttis Date: 1998-09-29

+

View other active issues in [basic.string].

+

View all other issues in [basic.string].

+

View all issues with TC status.

+

Duplicate of: 89

+

Discussion:

+

Many string member functions throw if size is getting or exceeding +npos. However, I wonder why they don't throw if size is getting or +exceeding max_size() instead of npos. May be npos is known at compile +time, while max_size() is known at runtime. However, what happens if +size exceeds max_size() but not npos, then? It seems the standard +lacks some clarifications here.

+ + +

Proposed resolution:

+

After 21.3 [basic.string] paragraph 4 ("The functions +described in this clause...") add a new paragraph:

+ +
+

For any string operation, if as a result of the operation, size() would exceed + max_size() then + the operation throws length_error.

+
+ + +

Rationale:

+

The LWG believes length_error is the correct exception to throw.

+ + + + +
+

86. String constructors don't describe exceptions

+

Section: 21.3.1 [string.require] Status: TC + Submitter: Nico Josuttis Date: 1998-09-29

+

View all other issues in [string.require].

+

View all issues with TC status.

+

Discussion:

+

The constructor from a range:

+ +
template<class InputIterator> 
+         basic_string(InputIterator begin, InputIterator end, 
+                      const Allocator& a = Allocator());
+ +

lacks a throws clause. However, I would expect that it throws +according to the other constructors if the numbers of characters in +the range equals npos (or exceeds max_size(), see above).

+ + +

Proposed resolution:

+

In 21.3.1 [string.require], Strike throws paragraphs for +constructors which say "Throws: length_error if n == +npos."

+ + +

Rationale:

+

Throws clauses for length_error if n == npos are no longer needed +because they are subsumed by the general wording added by the +resolution for issue 83.

+ + + + +
+

90. Incorrect description of operator >> for strings

+

Section: 21.3.8.9 [string.io] Status: TC + Submitter: Nico Josuttis Date: 1998-09-29

+

View all other issues in [string.io].

+

View all issues with TC status.

+

Discussion:

+

The effect of operator >> for strings contain the following item:

+ +

    isspace(c,getloc()) is true for the next available input +character c.

+ +

Here getloc() has to be replaced by is.getloc().

+ + +

Proposed resolution:

+

In 21.3.8.9 [string.io] paragraph 1 Effects clause replace:

+ +
+

isspace(c,getloc()) is true for the next available input character c.

+
+ +

with:

+ +
+

isspace(c,is.getloc()) is true for the next available input character c.

+
+ + + + + +
+

91. Description of operator>> and getline() for string<> might cause endless loop

+

Section: 21.3.8.9 [string.io] Status: WP + Submitter: Nico Josuttis Date: 1998-09-29

+

View all other issues in [string.io].

+

View all issues with WP status.

+

Discussion:

+

Operator >> and getline() for strings read until eof() +in the input stream is true. However, this might never happen, if the +stream can't read anymore without reaching EOF. So shouldn't it be +changed into that it reads until !good() ?

+ + +

Proposed resolution:

+

In 21.3.8.9 [string.io], paragraph 1, replace:

+

+Effects: Begins by constructing a sentry object k as if k were +constructed by typename basic_istream<charT,traits>::sentry k( is). If +bool( k) is true, it calls str.erase() and then extracts characters +from is and appends them to str as if by calling str.append(1, c). If +is.width() is greater than zero, the maximum number n of characters +appended is is.width(); otherwise n is str.max_size(). Characters are +extracted and appended until any of the following occurs: +

+

with:

+

+Effects: Behaves as a formatted input function (27.6.1.2.1 +[istream.formatted.reqmts]). After constructing a sentry object, if the +sentry converts to true, calls str.erase() and then extracts +characters from is and appends them to str as if by calling +str.append(1,c). If is.width() is greater than zero, the maximum +number n of characters appended is is.width(); otherwise n is +str.max_size(). Characters are extracted and appended until any of the +following occurs: +

+ +

In 21.3.8.9 [string.io], paragraph 6, replace

+

+Effects: Begins by constructing a sentry object k as if by typename +basic_istream<charT,traits>::sentry k( is, true). If bool( k) is true, +it calls str.erase() and then extracts characters from is and appends +them to str as if by calling str.append(1, c) until any of the +following occurs: +

+

with:

+

Effects: Behaves as an unformatted input function +(27.6.1.3 [istream.unformatted]), except that it does not affect the +value returned +by subsequent calls to basic_istream<>::gcount(). After +constructing a sentry object, if the sentry converts to true, calls +str.erase() and then extracts characters from is and appends them to +str as if by calling str.append(1,c) until any of the following +occurs: +

+ +

[Redmond: Made changes in proposed resolution. operator>> +should be a formatted input function, not an unformatted input function. +getline should not be required to set gcount, since +there is no mechanism for gcount to be set except by one of +basic_istream's member functions.]

+ + +

[Curaçao: Nico agrees with proposed resolution.]

+ + + + +

Rationale:

+

The real issue here is whether or not these string input functions +get their characters from a streambuf, rather than by calling an +istream's member functions, a streambuf signals failure either by +returning eof or by throwing an exception; there are no other +possibilities. The proposed resolution makes it clear that these two +functions do get characters from a streambuf.

+ + + + + +
+

92. Incomplete Algorithm Requirements

+

Section: 25 [algorithms] Status: WP + Submitter: Nico Josuttis Date: 1998-09-29

+

View all other issues in [algorithms].

+

View all issues with WP status.

+

Discussion:

+

The standard does not state, how often a function object is copied, +called, or the order of calls inside an algorithm. This may lead to +surprising/buggy behavior. Consider the following example:

+ +
class Nth {    // function object that returns true for the nth element 
+  private: 
+    int nth;     // element to return true for 
+    int count;   // element counter 
+  public: 
+    Nth (int n) : nth(n), count(0) { 
+    } 
+    bool operator() (int) { 
+        return ++count == nth; 
+    } 
+}; 
+.... 
+// remove third element 
+    list<int>::iterator pos; 
+    pos = remove_if(coll.begin(),coll.end(),  // range 
+                    Nth(3)),                  // remove criterion 
+    coll.erase(pos,coll.end()); 
+ +

This call, in fact removes the 3rd AND the 6th element. This +happens because the usual implementation of the algorithm copies the +function object internally:

+ +
template <class ForwIter, class Predicate> 
+ForwIter std::remove_if(ForwIter beg, ForwIter end, Predicate op) 
+{ 
+    beg = find_if(beg, end, op); 
+    if (beg == end) { 
+        return beg; 
+    } 
+    else { 
+        ForwIter next = beg; 
+        return remove_copy_if(++next, end, beg, op); 
+    } 
+} 
+ +

The algorithm uses find_if() to find the first element that should +be removed. However, it then uses a copy of the passed function object +to process the resulting elements (if any). Here, Nth is used again +and removes also the sixth element. This behavior compromises the +advantage of function objects being able to have a state. Without any +cost it could be avoided (just implement it directly instead of +calling find_if()).

+ + +

Proposed resolution:

+ +

Add a new paragraph following 25 [algorithms] paragraph 8:

+

+[Note: Unless otherwise specified, algorithms that take function +objects as arguments are permitted to copy those function objects +freely. Programmers for whom object identity is important should +consider using a wrapper class that points to a noncopied +implementation object, or some equivalent solution.] +

+ +

[Dublin: Pete Becker felt that this may not be a defect, +but rather something that programmers need to be educated about. +There was discussion of adding wording to the effect that the number +and order of calls to function objects, including predicates, not +affect the behavior of the function object.]

+ + +

[Pre-Kona: Nico comments: It seems the problem is that we don't +have a clear statement of "predicate" in the +standard. People including me seemed to think "a function +returning a Boolean value and being able to be called by an STL +algorithm or be used as sorting criterion or ... is a +predicate". But a predicate has more requirements: It should +never change its behavior due to a call or being copied. IMHO we have +to state this in the standard. If you like, see section 8.1.4 of my +library book for a detailed discussion.]

+ + +

[Kona: Nico will provide wording to the effect that "unless +otherwise specified, the number of copies of and calls to function +objects by algorithms is unspecified".  Consider placing in +25 [algorithms] after paragraph 9.]

+ + +

[Santa Cruz: The standard doesn't currently guarantee that + functions object won't be copied, and what isn't forbidden is + allowed. It is believed (especially since implementations that were + written in concert with the standard do make copies of function + objects) that this was intentional. Thus, no normative change is + needed. What we should put in is a non-normative note suggesting to + programmers that if they want to guarantee the lack of copying they + should use something like the ref wrapper.]

+ + +

[Oxford: Matt provided wording.]

+ + + + + + + + +
+

98. Input iterator requirements are badly written

+

Section: 24.1.1 [input.iterators] Status: WP + Submitter: AFNOR Date: 1998-10-07

+

View all other issues in [input.iterators].

+

View all issues with WP status.

+

Discussion:

+

Table 72 in 24.1.1 [input.iterators] specifies semantics for +*r++ of:

+ +

   { T tmp = *r; ++r; return tmp; }

+ +

There are two problems with this. First, the return type is +specified to be "T", as opposed to something like "convertible to T". +This is too specific: we want to allow *r++ to return an lvalue.

+ +

Second, writing the semantics in terms of code misleadingly +suggests that the effects *r++ should precisely replicate the behavior +of this code, including side effects. (Does this mean that *r++ +should invoke the copy constructor exactly as many times as the sample +code above would?) See issue 334 for a similar +problem.

+ + + +

Proposed resolution:

+

In Table 72 in 24.1.1 [input.iterators], change the return type +for *r++ from T to "convertible to T".

+ + +

Rationale:

+

This issue has two parts: the return type, and the number of times + the copy constructor is invoked.

+ +

The LWG believes the the first part is a real issue. It's + inappropriate for the return type to be specified so much more + precisely for *r++ than it is for *r. In particular, if r is of + (say) type int*, then *r++ isn't int, + but int&.

+ +

The LWG does not believe that the number of times the copy + constructor is invoked is a real issue. This can vary in any case, + because of language rules on copy constructor elision. That's too + much to read into these semantics clauses.

+ +

Additionally, as Dave Abrahams pointed out (c++std-lib-13703): since + we're told (24.1/3) that forward iterators satisfy all the requirements + of input iterators, we can't impose any requirements in the Input + Iterator requirements table that forward iterators don't satisfy.

+ + + + + +
+

103. set::iterator is required to be modifiable, but this allows modification of keys

+

Section: 23.1.2 [associative.reqmts] Status: WP + Submitter: AFNOR Date: 1998-10-07

+

View all other issues in [associative.reqmts].

+

View all issues with WP status.

+

Discussion:

+

Set::iterator is described as implementation-defined with a +reference to the container requirement; the container requirement says +that const_iterator is an iterator pointing to const T and iterator an +iterator pointing to T.

+ +

23.1.2 paragraph 2 implies that the keys should not be modified to +break the ordering of elements. But that is not clearly +specified. Especially considering that the current standard requires +that iterator for associative containers be different from +const_iterator. Set, for example, has the following:

+ +

typedef implementation defined iterator;
+       // See _lib.container.requirements_

+ +

23.1 [container.requirements] actually requires that iterator type pointing +to T (table 65). Disallowing user modification of keys by changing the +standard to require an iterator for associative container to be the +same as const_iterator would be overkill since that will unnecessarily +significantly restrict the usage of associative container. A class to +be used as elements of set, for example, can no longer be modified +easily without either redesigning the class (using mutable on fields +that have nothing to do with ordering), or using const_cast, which +defeats requiring iterator to be const_iterator. The proposed solution +goes in line with trusting user knows what he is doing.

+ +

Other Options Evaluated:

+ +

Option A.   In 23.1.2 [associative.reqmts], paragraph 2, after +first sentence, and before "In addition,...", add one line: +

+ +
+

Modification of keys shall not change their strict weak ordering.

+
+ +

Option B. Add three new sentences to 23.1.2 [associative.reqmts]:

+ +
+

At the end of paragraph 5: "Keys in an associative container + are immutable." At the end of paragraph 6: "For + associative containers where the value type is the same as the key + type, both iterator and const_iterator are + constant iterators. It is unspecified whether or not + iterator and const_iterator are the same + type."

+
+ +

Option C. To 23.1.2 [associative.reqmts], paragraph 3, which +currently reads:

+ +
+

The phrase ``equivalence of keys'' means the equivalence relation imposed by the + comparison and not the operator== on keys. That is, two keys k1 and k2 in the same + container are considered to be equivalent if for the comparison object comp, comp(k1, k2) + == false && comp(k2, k1) == false.

+
+ +

  add the following:

+ +
+

For any two keys k1 and k2 in the same container, comp(k1, k2) shall return the same + value whenever it is evaluated. [Note: If k2 is removed from the container and later + reinserted, comp(k1, k2) must still return a consistent value but this value may be + different than it was the first time k1 and k2 were in the same container. This is + intended to allow usage like a string key that contains a filename, where comp compares + file contents; if k2 is removed, the file is changed, and the same k2 (filename) is + reinserted, comp(k1, k2) must again return a consistent value but this value may be + different than it was the previous time k2 was in the container.]

+
+ + + +

Proposed resolution:

+

Add the following to 23.1.2 [associative.reqmts] at +the indicated location:

+ +
+

At the end of paragraph 3: "For any two keys k1 and k2 in the same container, + calling comp(k1, k2) shall always return the same + value."

+

At the end of paragraph 5: "Keys in an associative container are immutable."

+

At the end of paragraph 6: "For associative containers where the value type is the + same as the key type, both iterator and const_iterator are constant + iterators. It is unspecified whether or not iterator and const_iterator + are the same type."

+
+ + +

Rationale:

+

Several arguments were advanced for and against allowing set elements to be +mutable as long as the ordering was not effected. The argument which swayed the +LWG was one of safety; if elements were mutable, there would be no compile-time +way to detect of a simple user oversight which caused ordering to be +modified. There was a report that this had actually happened in practice, +and had been painful to diagnose. If users need to modify elements, +it is possible to use mutable members or const_cast.

+ +

Simply requiring that keys be immutable is not sufficient, because the comparison +object may indirectly (via pointers) operate on values outside of the keys.

+ +

+The types iterator and const_iterator are permitted +to be different types to allow for potential future work in which some +member functions might be overloaded between the two types. No such +member functions exist now, and the LWG believes that user functionality +will not be impaired by permitting the two types to be the same. A +function that operates on both iterator types can be defined for +const_iterator alone, and can rely on the automatic +conversion from iterator to const_iterator. +

+ +

[Tokyo: The LWG crafted the proposed resolution and rationale.]

+ + + + + + +
+

106. Numeric library private members are implementation defined

+

Section: 26.5.5 [template.slice.array] Status: TC + Submitter: AFNOR Date: 1998-10-07

+

View all other issues in [template.slice.array].

+

View all issues with TC status.

+

Discussion:

+

This is the only place in the whole standard where the implementation has to document +something private.

+ + +

Proposed resolution:

+

+Remove the comment which says "// remainder implementation defined" from: +

+ +
    +
  • 26.5.5 [template.slice.array]
  • +
  • 26.5.7 [template.gslice.array]
  • +
  • 26.5.8 [template.mask.array]
  • +
  • 26.5.9 [template.indirect.array]
  • +
+ + + + + +
+

108. Lifetime of exception::what() return unspecified

+

Section: 18.6.1 [type.info] Status: TC + Submitter: AFNOR Date: 1998-10-07

+

View all other issues in [type.info].

+

View all issues with TC status.

+

Discussion:

+

In 18.6.1, paragraphs 8-9, the lifetime of the return value of +exception::what() is left unspecified. This issue has implications +with exception safety of exception handling: some exceptions should +not throw bad_alloc.

+ + +

Proposed resolution:

+

Add to 18.6.1 [type.info] paragraph 9 (exception::what notes +clause) the sentence:

+ +
+

The return value remains valid until the exception object from which it is obtained is + destroyed or a non-const member function of the exception object is called.

+
+ + +

Rationale:

+

If an exception object has non-const members, they may be used +to set internal state that should affect the contents of the string +returned by what(). +

+ + + + + +
+

109. Missing binders for non-const sequence elements

+

Section: D.8 [depr.lib.binders] Status: WP + Submitter: Bjarne Stroustrup Date: 1998-10-07

+

View all other issues in [depr.lib.binders].

+

View all issues with WP status.

+

Discussion:

+ +

There are no versions of binders that apply to non-const elements +of a sequence. This makes examples like for_each() using bind2nd() on +page 521 of "The C++ Programming Language (3rd)" +non-conforming. Suitable versions of the binders need to be added.

+ +

Further discussion from Nico:

+ +

What is probably meant here is shown in the following example:

+ +
class Elem { 
+  public: 
+    void print (int i) const { } 
+    void modify (int i) { } 
+}; 
+
int main() 
+{ 
+    vector<Elem> coll(2); 
+    for_each (coll.begin(), coll.end(), bind2nd(mem_fun_ref(&Elem::print),42));    // OK 
+    for_each (coll.begin(), coll.end(), bind2nd(mem_fun_ref(&Elem::modify),42));   // ERROR 
+}
+ +

The error results from the fact that bind2nd() passes its first +argument (the argument of the sequence) as constant reference. See the +following typical implementation:

+ +
+
template <class Operation> 
+class binder2nd 
+  : public unary_function<typename Operation::first_argument_type, 
+                          typename Operation::result_type> { 
+protected: 
+  Operation op; 
+  typename Operation::second_argument_type value; 
+public: 
+  binder2nd(const Operation& o, 
+            const typename Operation::second_argument_type& v) 
+      : op(o), value(v) {} 
+
 typename Operation::result_type 
+  operator()(const typename Operation::first_argument_type& x) const { 
+    return op(x, value); 
+  } 
+};
+
+ +

The solution is to overload operator () of bind2nd for non-constant arguments:

+ +
+
template <class Operation> 
+class binder2nd 
+  : public unary_function<typename Operation::first_argument_type, 
+                          typename Operation::result_type> { 
+protected: 
+  Operation op; 
+  typename Operation::second_argument_type value; 
+public: 
+  binder2nd(const Operation& o, 
+            const typename Operation::second_argument_type& v) 
+      : op(o), value(v) {} 
+
 typename Operation::result_type 
+  operator()(const typename Operation::first_argument_type& x) const { 
+    return op(x, value); 
+  } 
+  typename Operation::result_type 
+  operator()(typename Operation::first_argument_type& x) const { 
+    return op(x, value); 
+  } 
+};
+
+ + +

Proposed resolution:

+ +

Howard believes there is a flaw in this resolution. +See c++std-lib-9127. We may need to reopen this issue.

+ +

In D.8 [depr.lib.binders] in the declaration of binder1st after:

+
+

typename Operation::result_type
+  operator()(const typename Operation::second_argument_type& x) const;

+
+

insert:

+
+

typename Operation::result_type
+  operator()(typename Operation::second_argument_type& x) const;

+
+

In D.8 [depr.lib.binders] in the declaration of binder2nd after:

+
+

typename Operation::result_type
+  operator()(const typename Operation::first_argument_type& x) const;

+
+

insert:

+
+

typename Operation::result_type
+  operator()(typename Operation::first_argument_type& x) const;

+
+ +

[Kona: The LWG discussed this at some length.It was agreed that +this is a mistake in the design, but there was no consensus on whether +it was a defect in the Standard. Straw vote: NAD - 5. Accept +proposed resolution - 3. Leave open - 6.]

+ + +

[Copenhagen: It was generally agreed that this was a defect. +Strap poll: NAD - 0. Accept proposed resolution - 10. +Leave open - 1.]

+ + + + + + + +
+

110. istreambuf_iterator::equal not const

+

Section: 24.5.3 [istreambuf.iterator], 24.5.3.5 [istreambuf.iterator::equal] Status: TC + Submitter: Nathan Myers Date: 1998-10-15

+

View all other issues in [istreambuf.iterator].

+

View all issues with TC status.

+

Discussion:

+

Member istreambuf_iterator<>::equal is not declared +"const", yet 24.5.3.6 [istreambuf.iterator::op==] says that operator==, +which is const, calls it. This is contradictory.

+ + +

Proposed resolution:

+

In 24.5.3 [istreambuf.iterator] and also in 24.5.3.5 [istreambuf.iterator::equal], +replace:

+ +
+
bool equal(istreambuf_iterator& b);
+
+ +

with:

+ +
+
bool equal(const istreambuf_iterator& b) const;
+
+ + + + + +
+

112. Minor typo in ostreambuf_iterator constructor

+

Section: 24.5.4.1 [ostreambuf.iter.cons] Status: TC + Submitter: Matt Austern Date: 1998-10-20

+

View all issues with TC status.

+

Discussion:

+

The requires clause for ostreambuf_iterator's +constructor from an ostream_type (24.5.4.1, paragraph 1) +reads "s is not null". However, s is a +reference, and references can't be null.

+ + +

Proposed resolution:

+

In 24.5.4.1 [ostreambuf.iter.cons]:

+ +

Move the current paragraph 1, which reads "Requires: s is not +null.", from the first constructor to the second constructor.

+ +

Insert a new paragraph 1 Requires clause for the first constructor +reading:

+ +
+

Requires: s.rdbuf() is not null.

+
+ + + + + +
+

114. Placement forms example in error twice

+

Section: 18.5.1.3 [new.delete.placement] Status: TC + Submitter: Steve Clamage Date: 1998-10-28

+

View all other issues in [new.delete.placement].

+

View all issues with TC status.

+

Duplicate of: 196

+

Discussion:

+

Section 18.5.1.3 contains the following example:

+ +
[Example: This can be useful for constructing an object at a known address:
+        char place[sizeof(Something)];
+        Something* p = new (place) Something();
+ -end example]
+ +

First code line: "place" need not have any special alignment, and the +following constructor could fail due to misaligned data.

+ +

Second code line: Aren't the parens on Something() incorrect?  [Dublin: the LWG +believes the () are correct.]

+ +

Examples are not normative, but nevertheless should not show code that is invalid or +likely to fail.

+ + +

Proposed resolution:

+

Replace the first line of code in the example in +18.5.1.3 [new.delete.placement] with: +

+ +
+
void* place = operator new(sizeof(Something));
+
+ + + + + +
+

115. Typo in strstream constructors

+

Section: D.7.4.1 [depr.strstream.cons] Status: TC + Submitter: Steve Clamage Date: 1998-11-02

+

View all issues with TC status.

+

Discussion:

+

D.7.4.1 strstream constructors paragraph 2 says:

+ +
+

Effects: Constructs an object of class strstream, initializing the base class with + iostream(& sb) and initializing sb with one of the two constructors:

+

- If mode&app==0, then s shall designate the first element of an array of n + elements. The constructor is strstreambuf(s, n, s).

+

- If mode&app==0, then s shall designate the first element of an array of n + elements that contains an NTBS whose first element is designated by s. The constructor is + strstreambuf(s, n, s+std::strlen(s)).

+
+ +

Notice the second condition is the same as the first. I think the second condition +should be "If mode&app==app", or "mode&app!=0", meaning that +the append bit is set.

+ + +

Proposed resolution:

+

In D.7.3.1 [depr.ostrstream.cons] paragraph 2 and D.7.4.1 [depr.strstream.cons] +paragraph 2, change the first condition to (mode&app)==0 +and the second condition to (mode&app)!=0.

+ + + + + +
+

117. basic_ostream uses nonexistent num_put member functions

+

Section: 27.6.2.6.2 [ostream.inserters.arithmetic] Status: WP + Submitter: Matt Austern Date: 1998-11-20

+

View all other issues in [ostream.inserters.arithmetic].

+

View all issues with WP status.

+

Discussion:

+

The effects clause for numeric inserters says that +insertion of a value x, whose type is either bool, +short, unsigned short, int, unsigned +int, long, unsigned long, float, +double, long double, or const void*, is +delegated to num_put, and that insertion is performed as if +through the following code fragment:

+ +
bool failed = use_facet<
+   num_put<charT,ostreambuf_iterator<charT,traits> > 
+   >(getloc()).put(*this, *this, fill(), val). failed();
+ +

This doesn't work, because num_put<>::put is only +overloaded for the types bool, long, unsigned +long, double, long double, and const +void*. That is, the code fragment in the standard is incorrect +(it is diagnosed as ambiguous at compile time) for the types +short, unsigned short, int, unsigned +int, and float.

+ +

We must either add new member functions to num_put, or +else change the description in ostream so that it only calls +functions that are actually there. I prefer the latter.

+ + +

Proposed resolution:

+

Replace 27.6.2.5.2, paragraph 1 with the following:

+ +
+

+The classes num_get<> and num_put<> handle locale-dependent numeric +formatting and parsing. These inserter functions use the imbued +locale value to perform numeric formatting. When val is of type bool, +long, unsigned long, double, long double, or const void*, the +formatting conversion occurs as if it performed the following code +fragment: +

+ +
bool failed = use_facet<
+   num_put<charT,ostreambuf_iterator<charT,traits> >
+   >(getloc()).put(*this, *this, fill(), val). failed();
+
+ +

+When val is of type short the formatting conversion occurs as if it +performed the following code fragment: +

+ +
ios_base::fmtflags baseflags = ios_base::flags() & ios_base::basefield;
+bool failed = use_facet<
+   num_put<charT,ostreambuf_iterator<charT,traits> >
+   >(getloc()).put(*this, *this, fill(),
+      baseflags == ios_base::oct || baseflags == ios_base::hex
+         ? static_cast<long>(static_cast<unsigned short>(val))
+         : static_cast<long>(val)). failed();
+
+ +

+When val is of type int the formatting conversion occurs as if it performed +the following code fragment: +

+ +
ios_base::fmtflags baseflags = ios_base::flags() & ios_base::basefield;
+bool failed = use_facet<
+   num_put<charT,ostreambuf_iterator<charT,traits> >
+   >(getloc()).put(*this, *this, fill(),
+      baseflags == ios_base::oct || baseflags == ios_base::hex
+         ? static_cast<long>(static_cast<unsigned int>(val))
+         : static_cast<long>(val)). failed();
+
+ +

+When val is of type unsigned short or unsigned int the formatting conversion +occurs as if it performed the following code fragment: +

+ +
bool failed = use_facet<
+   num_put<charT,ostreambuf_iterator<charT,traits> >
+   >(getloc()).put(*this, *this, fill(), static_cast<unsigned long>(val)).
+failed();
+
+ +

+When val is of type float the formatting conversion occurs as if it +performed the following code fragment: +

+ +
bool failed = use_facet<
+   num_put<charT,ostreambuf_iterator<charT,traits> >
+   >(getloc()).put(*this, *this, fill(), static_cast<double>(val)).
+failed();
+
+ +
+ +

[post-Toronto: This differs from the previous proposed +resolution; PJP provided the new wording. The differences are in +signed short and int output.]

+ + + +

Rationale:

+

The original proposed resolution was to cast int and short to long, +unsigned int and unsigned short to unsigned long, and float to double, +thus ensuring that we don't try to use nonexistent num_put<> +member functions. The current proposed resolution is more +complicated, but gives more expected results for hex and octal output +of signed short and signed int. (On a system with 16-bit short, for +example, printing short(-1) in hex format should yield 0xffff.)

+ + + + + +
+

118. basic_istream uses nonexistent num_get member functions

+

Section: 27.6.1.2.2 [istream.formatted.arithmetic] Status: WP + Submitter: Matt Austern Date: 1998-11-20

+

View other active issues in [istream.formatted.arithmetic].

+

View all other issues in [istream.formatted.arithmetic].

+

View all issues with WP status.

+

Discussion:

+

Formatted input is defined for the types short, unsigned short, int, +unsigned int, long, unsigned long, float, double, +long double, bool, and void*. According to section 27.6.1.2.2, +formatted input of a value x is done as if by the following code fragment:

+ +
typedef num_get< charT,istreambuf_iterator<charT,traits> > numget; 
+iostate err = 0; 
+use_facet< numget >(loc).get(*this, 0, *this, err, val); 
+setstate(err);
+ +

According to section 22.2.2.1.1 [facet.num.get.members], however, +num_get<>::get() is only overloaded for the types +bool, long, unsigned short, unsigned +int, unsigned long, unsigned long, +float, double, long double, and +void*. Comparing the lists from the two sections, we find +that 27.6.1.2.2 is using a nonexistent function for types +short and int.

+ + +

Proposed resolution:

+

In 27.6.1.2.2 [istream.formatted.arithmetic] Arithmetic Extractors, remove the +two lines (1st and 3rd) which read:

+
+
operator>>(short& val);
+...
+operator>>(int& val);
+
+ +

And add the following at the end of that section (27.6.1.2.2) :

+ +
+
operator>>(short& val);
+

The conversion occurs as if performed by the following code fragment (using + the same notation as for the preceding code fragment):

+
  typedef num_get< charT,istreambuf_iterator<charT,traits> > numget;
+  iostate err = 0;
+  long lval;
+  use_facet< numget >(loc).get(*this, 0, *this, err, lval);
+        if (err == 0
+                && (lval < numeric_limits<short>::min() || numeric_limits<short>::max() < lval))
+                err = ios_base::failbit;
+  setstate(err);
+
operator>>(int& val);
+

The conversion occurs as if performed by the following code fragment (using + the same notation as for the preceding code fragment):

+
  typedef num_get< charT,istreambuf_iterator<charT,traits> > numget;
+  iostate err = 0;
+  long lval;
+  use_facet< numget >(loc).get(*this, 0, *this, err, lval);
+        if (err == 0
+                && (lval < numeric_limits<int>::min() || numeric_limits<int>::max() < lval))
+                err = ios_base::failbit;
+  setstate(err);
+
+ +

[Post-Tokyo: PJP provided the above wording.]

+ + + + + + +
+

119. Should virtual functions be allowed to strengthen the exception specification?

+

Section: 17.4.4.8 [res.on.exception.handling] Status: TC + Submitter: Judy Ward Date: 1998-12-15

+

View all other issues in [res.on.exception.handling].

+

View all issues with TC status.

+

Discussion:

+

Section 17.4.4.8 [res.on.exception.handling] states:

+ +

"An implementation may strengthen the exception-specification +for a function by removing listed exceptions."

+ +

The problem is that if an implementation is allowed to do this for +virtual functions, then a library user cannot write a class that +portably derives from that class.

+ +

For example, this would not compile if ios_base::failure::~failure +had an empty exception specification:

+ +
#include <ios>
+#include <string>
+
+class D : public std::ios_base::failure {
+public:
+        D(const std::string&);
+        ~D(); // error - exception specification must be compatible with 
+              // overridden virtual function ios_base::failure::~failure()
+};
+ + +

Proposed resolution:

+

Change Section 17.4.4.8 [res.on.exception.handling] from:

+ +

     "may strengthen the +exception-specification for a function"

+ +

to:

+ +

     "may strengthen the +exception-specification for a non-virtual function".

+ + + + + +
+

120. Can an implementor add specializations?

+

Section: 17.4.3.1 [reserved.names] Status: WP + Submitter: Judy Ward Date: 1998-12-15

+

View all other issues in [reserved.names].

+

View all issues with WP status.

+

Discussion:

+ +

The original issue asked whether a library implementor could +specialize standard library templates for built-in types. (This was +an issue because users are permitted to explicitly instantiate +standard library templates.)

+ +

Specializations are no longer a problem, because of the resolution +to core issue 259. Under the proposed resolution, it will be legal +for a translation unit to contain both a specialization and an +explicit instantiation of the same template, provided that the +specialization comes first. In such a case, the explicit +instantiation will be ignored. Further discussion of library issue +120 assumes that the core 259 resolution will be adopted.

+ +

However, as noted in lib-7047, one piece of this issue still +remains: what happens if a standard library implementor explicitly +instantiates a standard library templates? It's illegal for a program +to contain two different explicit instantiations of the same template +for the same type in two different translation units (ODR violation), +and the core working group doesn't believe it is practical to relax +that restriction.

+ +

The issue, then, is: are users allowed to explicitly instantiate +standard library templates for non-user defined types? The status quo +answer is 'yes'. Changing it to 'no' would give library implementors +more freedom.

+ +

This is an issue because, for performance reasons, library +implementors often need to explicitly instantiate standard library +templates. (for example, std::basic_string<char>) Does giving +users freedom to explicitly instantiate standard library templates for +non-user defined types make it impossible or painfully difficult for +library implementors to do this?

+ +

John Spicer suggests, in lib-8957, that library implementors have a +mechanism they can use for explicit instantiations that doesn't +prevent users from performing their own explicit instantiations: put +each explicit instantiation in its own object file. (Different +solutions might be necessary for Unix DSOs or MS-Windows DLLs.) On +some platforms, library implementors might not need to do anything +special: the "undefined behavior" that results from having two +different explicit instantiations might be harmless.

+ + + +

Proposed resolution:

+

Append to 17.4.3.1 [reserved.names] paragraph 1:

+

+ A program may explicitly instantiate any templates in the standard + library only if the declaration depends on the name of a user-defined + type of external linkage and the instantiation meets the standard library + requirements for the original template. +

+ +

[Kona: changed the wording from "a user-defined name" to "the name of + a user-defined type"]

+ + + + +

Rationale:

+

The LWG considered another possible resolution:

+
+

In light of the resolution to core issue 259, no normative changes + in the library clauses are necessary. Add the following non-normative + note to the end of 17.4.3.1 [reserved.names] paragraph 1:

+

+ [Note: A program may explicitly instantiate standard library + templates, even when an explicit instantiation does not depend on + a user-defined name. --end note] +

+
+ +

The LWG rejected this because it was believed that it would make + it unnecessarily difficult for library implementors to write + high-quality implementations. A program may not include an + explicit instantiation of the same template, for the same template + arguments, in two different translation units. If users are + allowed to provide explicit instantiations of Standard Library + templates for built-in types, then library implementors aren't, + at least not without nonportable tricks.

+ +

The most serious problem is a class template that has writeable + static member variables. Unfortunately, such class templates are + important and, in existing Standard Library implementations, are + often explicitly specialized by library implementors: locale facets, + which have a writeable static member variable id. If a + user's explicit instantiation collided with the implementations + explicit instantiation, iostream initialization could cause locales + to be constructed in an inconsistent state.

+ +

One proposed implementation technique was for Standard Library + implementors to provide explicit instantiations in separate object + files, so that they would not be picked up by the linker when the + user also provides an explicit instantiation. However, this + technique only applies for Standard Library implementations that + are packaged as static archives. Most Standard Library + implementations nowadays are packaged as dynamic libraries, so this + technique would not apply.

+ +

The Committee is now considering standardization of dynamic + linking. If there are such changes in the future, it may be + appropriate to revisit this issue later.

+ + + + + +
+

122. streambuf/wstreambuf description should not say they are specializations

+

Section: 27.5.2 [streambuf] Status: TC + Submitter: Judy Ward Date: 1998-12-15

+

View all other issues in [streambuf].

+

View all issues with TC status.

+

Discussion:

+

Section 27.5.2 describes the streambuf classes this way:

+ +
+ +

The class streambuf is a specialization of the template class basic_streambuf +specialized for the type char.

+ +

The class wstreambuf is a specialization of the template class basic_streambuf +specialized for the type wchar_t.

+ +
+ +

This implies that these classes must be template specializations, not typedefs.

+ +

It doesn't seem this was intended, since Section 27.5 has them declared as typedefs.

+ + +

Proposed resolution:

+

Remove 27.5.2 [streambuf] paragraphs 2 and 3 (the above two +sentences).

+ + +

Rationale:

+

The streambuf synopsis already has a declaration for the +typedefs and that is sufficient.

+ + + + + +
+

123. Should valarray helper arrays fill functions be const?

+

Section: 26.5.5.3 [slice.arr.fill], 26.5.7.3 [gslice.array.fill], 26.5.8.3 [mask.array.fill], 26.5.9.3 [indirect.array.fill] Status: WP + Submitter: Judy Ward Date: 1998-12-15

+

View all issues with WP status.

+

Discussion:

+

One of the operator= in the valarray helper arrays is const and one +is not. For example, look at slice_array. This operator= in Section +26.5.5.1 [slice.arr.assign] is const:

+ +

    void operator=(const valarray<T>&) const;

+ +

but this one in Section 26.5.5.3 [slice.arr.fill] is not:

+ +

    void operator=(const T&);

+ +

The description of the semantics for these two functions is similar.

+ + +

Proposed resolution:

+ +

26.5.5 [template.slice.array] Template class slice_array

+
+ +

In the class template definition for slice_array, replace the member + function declaration

+
      void operator=(const T&);
+    
+

with

+
      void operator=(const T&) const;
+    
+
+ +

26.5.5.3 [slice.arr.fill] slice_array fill function

+
+ +

Change the function declaration

+
      void operator=(const T&);
+    
+

to

+
      void operator=(const T&) const;
+    
+
+ +

26.5.7 [template.gslice.array] Template class gslice_array

+
+ +

In the class template definition for gslice_array, replace the member + function declaration

+
      void operator=(const T&);
+    
+

with

+
      void operator=(const T&) const;
+    
+
+ +

26.5.7.3 [gslice.array.fill] gslice_array fill function

+
+ +

Change the function declaration

+
      void operator=(const T&);
+    
+

to

+
      void operator=(const T&) const;
+    
+
+ +

26.5.8 [template.mask.array] Template class mask_array

+
+ +

In the class template definition for mask_array, replace the member + function declaration

+
      void operator=(const T&);
+    
+

with

+
      void operator=(const T&) const;
+    
+
+ +

26.5.8.3 [mask.array.fill] mask_array fill function

+
+ +

Change the function declaration

+
      void operator=(const T&);
+    
+

to

+
      void operator=(const T&) const;
+    
+
+ +

26.5.9 [template.indirect.array] Template class indirect_array

+
+ +

In the class template definition for indirect_array, replace the member + function declaration

+
      void operator=(const T&);
+    
+

with

+
      void operator=(const T&) const;
+    
+
+ +

26.5.9.3 [indirect.array.fill] indirect_array fill function

+
+ +

Change the function declaration

+
      void operator=(const T&);
+    
+

to

+
      void operator=(const T&) const;
+    
+
+ + +

[Redmond: Robert provided wording.]

+ + + + +

Rationale:

+

There's no good reason for one version of operator= being const and +another one not. Because of issue 253, this now +matters: these functions are now callable in more circumstances. In +many existing implementations, both versions are already const.

+ + + + + +
+

124. ctype_byname<charT>::do_scan_is & do_scan_not return type should be const charT*

+

Section: 22.2.1.2 [locale.ctype.byname] Status: TC + Submitter: Judy Ward Date: 1998-12-15

+

View all other issues in [locale.ctype.byname].

+

View all issues with TC status.

+

Discussion:

+

In Section 22.2.1.2 [locale.ctype.byname] +ctype_byname<charT>::do_scan_is() and do_scan_not() are declared +to return a const char* not a const charT*.

+ + +

Proposed resolution:

+

Change Section 22.2.1.2 [locale.ctype.byname] do_scan_is() and +do_scan_not() to return a const +charT*.

+ + + + + +
+

125. valarray<T>::operator!() return type is inconsistent

+

Section: 26.5.2 [template.valarray] Status: TC + Submitter: Judy Ward Date: 1998-12-15

+

View all other issues in [template.valarray].

+

View all issues with TC status.

+

Discussion:

+

In Section 26.5.2 [template.valarray] valarray<T>::operator!() +is +declared to return a valarray<T>, but in Section 26.5.2.5 +[valarray.unary] it is declared to return a valarray<bool>. The +latter appears to be correct.

+ + +

Proposed resolution:

+

Change in Section 26.5.2 [template.valarray] the declaration of +operator!() so that the return type is +valarray<bool>.

+ + + + +
+

126. typos in Effects clause of ctype::do_narrow()

+

Section: 22.2.1.1.2 [locale.ctype.virtuals] Status: TC + Submitter: Judy Ward Date: 1998-12-15

+

View all other issues in [locale.ctype.virtuals].

+

View all issues with TC status.

+

Discussion:

Typos in 22.2.1.1.2 need to be fixed.

+ +

Proposed resolution:

+

In Section 22.2.1.1.2 [locale.ctype.virtuals] change:

+ +
   do_widen(do_narrow(c),0) == c
+ +

to:

+ +
   do_widen(do_narrow(c,0)) == c
+ +

and change:

+ +
   (is(M,c) || !ctc.is(M, do_narrow(c),dfault) )
+ +

to:

+ +
   (is(M,c) || !ctc.is(M, do_narrow(c,dfault)) )
+ + + + + +
+

127. auto_ptr<> conversion issues

+

Section: D.9.1 [auto.ptr] Status: TC + Submitter: Greg Colvin Date: 1999-02-17

+

View all other issues in [auto.ptr].

+

View all issues with TC status.

+

Discussion:

+

There are two problems with the current auto_ptr wording +in the standard:

+ +

First, the auto_ptr_ref definition cannot be nested +because auto_ptr<Derived>::auto_ptr_ref is unrelated to +auto_ptr<Base>::auto_ptr_ref. Also submitted by +Nathan Myers, with the same proposed resolution.

+ +

Second, there is no auto_ptr assignment operator taking an +auto_ptr_ref argument.

+ +

I have discussed these problems with my proposal coauthor, Bill +Gibbons, and with some compiler and library implementors, and we +believe that these problems are not desired or desirable implications +of the standard.

+ +

25 Aug 1999: The proposed resolution now reflects changes suggested +by Dave Abrahams, with Greg Colvin's concurrence; 1) changed +"assignment operator" to "public assignment +operator", 2) changed effects to specify use of release(), 3) +made the conversion to auto_ptr_ref const.

+ +

2 Feb 2000: Lisa Lippincott comments: [The resolution of] this issue +states that the conversion from auto_ptr to auto_ptr_ref should +be const. This is not acceptable, because it would allow +initialization and assignment from _any_ const auto_ptr! It also +introduces an implementation difficulty in writing this conversion +function -- namely, somewhere along the line, a const_cast will be +necessary to remove that const so that release() may be called. This +may result in undefined behavior [7.1.5.1/4]. The conversion +operator does not have to be const, because a non-const implicit +object parameter may be bound to an rvalue [13.3.3.1.4/3] +[13.3.1/5].

+ +

Tokyo: The LWG removed the following from the proposed resolution:

+ +

In 20.4.4 [meta.unary], paragraph 2, and 20.4.4.3 [meta.unary.prop], + paragraph 2, make the conversion to auto_ptr_ref const:

+
+
template<class Y> operator auto_ptr_ref<Y>() const throw();
+
+ + +

Proposed resolution:

+

In 20.4.4 [meta.unary], paragraph 2, move +the auto_ptr_ref definition to namespace scope.

+ +

In 20.4.4 [meta.unary], paragraph 2, add +a public assignment operator to the auto_ptr definition:

+ +
+
auto_ptr& operator=(auto_ptr_ref<X> r) throw();
+
+ +

Also add the assignment operator to 20.4.4.3 [meta.unary.prop]:

+ +
+
auto_ptr& operator=(auto_ptr_ref<X> r) throw()
+ +

Effects: Calls reset(p.release()) for the auto_ptr + p that r holds a reference to.
+ Returns: *this.

+ +
+ + + + + +
+

129. Need error indication from seekp() and seekg()

+

Section: 27.6.1.3 [istream.unformatted], 27.6.2.5 [ostream.seeks] Status: TC + Submitter: Angelika Langer Date: 1999-02-22

+

View all other issues in [istream.unformatted].

+

View all issues with TC status.

+

Discussion:

+

Currently, the standard does not specify how seekg() and seekp() +indicate failure. They are not required to set failbit, and they can't +return an error indication because they must return *this, i.e. the +stream. Hence, it is undefined what happens if they fail. And they +can fail, for instance, when a file stream is disconnected from the +underlying file (is_open()==false) or when a wide character file +stream must perform a state-dependent code conversion, etc.

+ +

The stream functions seekg() and seekp() should set failbit in the +stream state in case of failure.

+ + +

Proposed resolution:

+

Add to the Effects: clause of  seekg() in +27.6.1.3 [istream.unformatted] and to the Effects: clause of seekp() in +27.6.2.5 [ostream.seeks]:

+ +
+

In case of failure, the function calls setstate(failbit) (which may throw ios_base::failure). +

+
+ + +

Rationale:

+

Setting failbit is the usual error reporting mechanism for streams

+ + + + +
+

130. Return type of container::erase(iterator) differs for associative containers

+

Section: 23.1.2 [associative.reqmts], 23.1.1 [sequence.reqmts] Status: DR + Submitter: Andrew Koenig Date: 1999-03-02

+

View all other issues in [associative.reqmts].

+

View all issues with DR status.

+

Duplicate of: 451

+

Discussion:

+

Table 67 (23.1.1) says that container::erase(iterator) returns an +iterator. Table 69 (23.1.2) says that in addition to this requirement, +associative containers also say that container::erase(iterator) +returns void. That's not an addition; it's a change to the +requirements, which has the effect of making associative containers +fail to meet the requirements for containers.

+ + +

Proposed resolution:

+ +

+In 23.1.2 [associative.reqmts], in Table 69 Associative container +requirements, change the return type of a.erase(q) from +void to iterator. Change the +assertion/not/pre/post-condition from "erases the element pointed to +by q" to "erases the element pointed to by q. +Returns an iterator pointing to the element immediately following q +prior to the element being erased. If no such element exists, a.end() +is returned." +

+ +

+In 23.1.2 [associative.reqmts], in Table 69 Associative container +requirements, change the return type of a.erase(q1, q2) +from void to iterator. Change the +assertion/not/pre/post-condition from "erases the elements in the +range [q1, q2)" to "erases the elements in the range [q1, +q2). Returns q2." +

+ +

+In 23.3.1 [map], in the map class synopsis; and +in 23.3.2 [multimap], in the multimap class synopsis; and +in 23.3.3 [set], in the set class synopsis; and +in 23.3.4 [multiset], in the multiset class synopsis: +change the signature of the first erase overload to +

+
   iterator erase(iterator position);
+
+

and change the signature of the third erase overload to

+
  iterator erase(iterator first, iterator last); 
+
+ + +

[Pre-Kona: reopened at the request of Howard Hinnant]

+ + +

[Post-Kona: the LWG agrees the return type should be +iterator, not void. (Alex Stepanov agrees too.) +Matt provided wording.]

+ + +

[ + Sydney: the proposed wording went in the right direction, but it + wasn't good enough. We want to return an iterator from the range form + of erase as well as the single-iterator form. Also, the wording is + slightly different from the wording we have for sequences; there's no + good reason for having a difference. Matt provided new wording, +(reflected above) which we will review at the next meeting. +]

+ + +

[ +Redmond: formally voted into WP. +]

+ + + + + + + +
+

132. list::resize description uses random access iterators

+

Section: 23.2.3.2 [list.capacity] Status: TC + Submitter: Howard Hinnant Date: 1999-03-06

+

View all issues with TC status.

+

Discussion:

+

The description reads:

+ +

-1- Effects:

+ +
         if (sz > size())
+           insert(end(), sz-size(), c);
+         else if (sz < size())
+           erase(begin()+sz, end());
+         else
+           ;                           //  do nothing
+ +

Obviously list::resize should not be specified in terms of random access iterators.

+ + +

Proposed resolution:

+

Change 23.2.3.2 [list.capacity] paragraph 1 to:

+ +

Effects:

+ +
         if (sz > size())
+           insert(end(), sz-size(), c);
+         else if (sz < size())
+         {
+           iterator i = begin();
+           advance(i, sz);
+           erase(i, end());
+         }
+ +

[Dublin: The LWG asked Howard to discuss exception safety offline +with David Abrahams. They had a discussion and believe there is +no issue of exception safety with the proposed resolution.]

+ + + + + + +
+

133. map missing get_allocator()

+

Section: 23.3.1 [map] Status: TC + Submitter: Howard Hinnant Date: 1999-03-06

+

View all other issues in [map].

+

View all issues with TC status.

+

Discussion:

The title says it all.

+ +

Proposed resolution:

+

Insert in 23.3.1 [map], paragraph 2, +after operator= in the map declaration:

+ +
    allocator_type get_allocator() const;
+ + + + +
+

134. vector constructors over specified

+

Section: 23.2.5.1 [vector.cons] Status: TC + Submitter: Howard Hinnant Date: 1999-03-06

+

View all issues with TC status.

+

Discussion:

+

The complexity description says: "It does at most 2N calls to the copy constructor +of T and logN reallocations if they are just input iterators ...".

+ +

This appears to be overly restrictive, dictating the precise memory/performance +tradeoff for the implementor.

+ + +

Proposed resolution:

+

Change 23.2.5.1 [vector.cons], paragraph 1 to:

+ +

-1- Complexity: The constructor template <class +InputIterator> vector(InputIterator first, InputIterator last) +makes only N calls to the copy constructor of T (where N is the +distance between first and last) and no reallocations if iterators +first and last are of forward, bidirectional, or random access +categories. It makes order N calls to the copy constructor of T and +order logN reallocations if they are just input iterators. +

+ + +

Rationale:

+

"at most 2N calls" is correct only if the growth factor +is greater than or equal to 2. +

+ + + + +
+

136. seekp, seekg setting wrong streams?

+

Section: 27.6.1.3 [istream.unformatted] Status: WP + Submitter: Howard Hinnant Date: 1999-03-06

+

View all other issues in [istream.unformatted].

+

View all issues with WP status.

+

Discussion:

+

I may be misunderstanding the intent, but should not seekg set only +the input stream and seekp set only the output stream? The description +seems to say that each should set both input and output streams. If +that's really the intent, I withdraw this proposal.

+ + +

Proposed resolution:

+

In section 27.6.1.3 change:

+ +
basic_istream<charT,traits>& seekg(pos_type pos);
+Effects: If fail() != true, executes rdbuf()->pubseekpos(pos). 
+ +

To:

+ +
basic_istream<charT,traits>& seekg(pos_type pos);
+Effects: If fail() != true, executes rdbuf()->pubseekpos(pos, ios_base::in). 
+ +

In section 27.6.1.3 change:

+ +
basic_istream<charT,traits>& seekg(off_type& off, ios_base::seekdir dir);
+Effects: If fail() != true, executes rdbuf()->pubseekoff(off, dir). 
+ +

To:

+ +
basic_istream<charT,traits>& seekg(off_type& off, ios_base::seekdir dir);
+Effects: If fail() != true, executes rdbuf()->pubseekoff(off, dir, ios_base::in). 
+ +

In section 27.6.2.4, paragraph 2 change:

+ +
-2- Effects: If fail() != true, executes rdbuf()->pubseekpos(pos). 
+ +

To:

+ +
-2- Effects: If fail() != true, executes rdbuf()->pubseekpos(pos, ios_base::out). 
+ +

In section 27.6.2.4, paragraph 4 change:

+ +
-4- Effects: If fail() != true, executes rdbuf()->pubseekoff(off, dir). 
+ +

To:

+ +
-4- Effects: If fail() != true, executes rdbuf()->pubseekoff(off, dir, ios_base::out). 
+ +

[Dublin: Dietmar Kühl thinks this is probably correct, but would +like the opinion of more iostream experts before taking action.]

+ + +

[Tokyo: Reviewed by the LWG. PJP noted that although his docs are +incorrect, his implementation already implements the Proposed +Resolution.]

+ + +

[Post-Tokyo: Matt Austern comments:
+Is it a problem with basic_istream and basic_ostream, or is it a problem +with basic_stringbuf? +We could resolve the issue either by changing basic_istream and +basic_ostream, or by changing basic_stringbuf. I prefer the latter +change (or maybe both changes): I don't see any reason for the standard to +require that std::stringbuf s(std::string("foo"), std::ios_base::in); +s.pubseekoff(0, std::ios_base::beg); must fail.
+This requirement is a bit weird. There's no similar requirement +for basic_streambuf<>::seekpos, or for basic_filebuf<>::seekoff or +basic_filebuf<>::seekpos.]

+ + + + + + +
+

137. Do use_facet and has_facet look in the global locale?

+

Section: 22.1.1 [locale] Status: TC + Submitter: Angelika Langer Date: 1999-03-17

+

View all other issues in [locale].

+

View all issues with TC status.

+

Discussion:

+

Section 22.1.1 [locale] says:

+ +

-4- In the call to use_facet<Facet>(loc), the type argument +chooses a facet, making available all members of the named type. If +Facet is not present in a locale (or, failing that, in the global +locale), it throws the standard exception bad_cast. A C++ program can +check if a locale implements a particular facet with the template +function has_facet<Facet>().

+ +

This contradicts the specification given in section +22.1.2 [locale.global.templates]: +

+template <class  Facet> const  Facet& use_facet(const +locale&  loc);
+
+-1- Get a reference to a facet of a locale.
+-2- Returns: a reference to the corresponding facet of loc, if present.
+-3- Throws: bad_cast if has_facet<Facet>(loc) is false.
+-4- Notes: The reference returned remains valid at least as long as any copy of loc exists +

+ + +

Proposed resolution:

+

Remove the phrase "(or, failing that, in the global locale)" +from section 22.1.1.

+ + +

Rationale:

+

Needed for consistency with the way locales are handled elsewhere +in the standard.

+ + + + +
+

139. Optional sequence operation table description unclear

+

Section: 23.1.1 [sequence.reqmts] Status: TC + Submitter: Andrew Koenig Date: 1999-03-30

+

View all other issues in [sequence.reqmts].

+

View all issues with TC status.

+

Discussion:

+

The sentence introducing the Optional sequence operation table +(23.1.1 paragraph 12) has two problems:

+ +

A. It says ``The operations in table 68 are provided only for the containers for which +they take constant time.''
+
+That could be interpreted in two ways, one of them being ``Even though table 68 shows +particular operations as being provided, implementations are free to omit them if they +cannot implement them in constant time.''
+
+B. That paragraph says nothing about amortized constant time, and it should. 

+ + +

Proposed resolution:

+

Replace the wording in 23.1.1 paragraph 12  which begins ``The operations in table 68 are provided only..." +with:

+ +
+

Table 68 lists sequence operations that are provided for some types of sequential + containers but not others. An implementation shall provide these operations for all + container types shown in the ``container'' column, and shall implement them so as to take + amortized constant time.

+
+ + + + +
+

141. basic_string::find_last_of, find_last_not_of say pos instead of xpos

+

Section: 21.3.6.4 [string::insert], 21.3.6.6 [string::replace] Status: TC + Submitter: Arch Robison Date: 1999-04-28

+

View all other issues in [string::insert].

+

View all issues with TC status.

+

Discussion:

+

Sections 21.3.6.4 paragraph 1 and 21.3.6.6 paragraph 1 surely have misprints where they +say:
+
+— xpos <= pos and pos < size();

+ +

Surely the document meant to say ``xpos < size()'' in both places.

+ +

[Judy Ward also sent in this issue for 21.3.6.4 with the same +proposed resolution.]

+ + + +

Proposed resolution:

+

Change Sections 21.3.6.4 paragraph 1 and 21.3.6.6 paragraph 1, the line which says:
+
+— xpos <= pos and pos < size();
+
+
to:
+
+
xpos <= pos and xpos < size();

+ + + + +
+

142. lexicographical_compare complexity wrong

+

Section: 25.3.8 [alg.lex.comparison] Status: TC + Submitter: Howard Hinnant Date: 1999-06-20

+

View all issues with TC status.

+

Discussion:

+

The lexicographical_compare complexity is specified as:
+
+     "At most min((last1 - first1), (last2 - first2)) +applications of the corresponding comparison."
+
+The best I can do is twice that expensive.

+ +

Nicolai Josuttis comments in lib-6862: You mean, to check for +equality you have to check both < and >? Yes, IMO you are +right! (and Matt states this complexity in his book)

+ + + +

Proposed resolution:

+

Change 25.3.8 [alg.lex.comparison] complexity to:

+

+ At most 2*min((last1 - first1), (last2 - first2)) + applications of the corresponding comparison. +

+ +

Change the example at the end of paragraph 3 to read:

+

+ [Example:
+
+     for ( ; first1 != last1 && first2 != last2 ; + ++first1, ++first2) {
+       if (*first1 < *first2) return true;
+       if (*first2 < *first1) return false;
+     }
+     return first1 == last1 && first2 != last2;
+    
+ --end example] +

+ + + + +
+

144. Deque constructor complexity wrong

+

Section: 23.2.2.1 [deque.cons] Status: TC + Submitter: Herb Sutter Date: 1999-05-09

+

View all other issues in [deque.cons].

+

View all issues with TC status.

+

Discussion:

+

In 23.2.2.1 [deque.cons] paragraph 6, the deque ctor that takes an iterator range appears +to have complexity requirements which are incorrect, and which contradict the +complexity requirements for insert(). I suspect that the text in question, +below, was taken from vector:

+
+

Complexity: If the iterators first and last are forward iterators, + bidirectional iterators, or random access iterators the constructor makes only + N calls to the copy constructor, and performs no reallocations, where N is + last - first.

+
+

The word "reallocations" does not really apply to deque. Further, +all of the following appears to be spurious:

+
+

It makes at most 2N calls to the copy constructor of T and log N + reallocations if they are input iterators.1)

+

1) The complexity is greater in the case of input iterators because each + element must be added individually: it is impossible to determine the distance + between first abd last before doing the copying.

+
+

This makes perfect sense for vector, but not for deque. Why should deque gain +an efficiency advantage from knowing in advance the number of elements to +insert?

+ + +

Proposed resolution:

+

In 23.2.2.1 [deque.cons] paragraph 6, replace the Complexity description, including the +footnote, with the following text (which also corrects the "abd" +typo):

+
+

Complexity: Makes last - first calls to the copy constructor of T.

+
+ + + + +
+

146. complex<T> Inserter and Extractor need sentries

+

Section: 26.3.6 [complex.ops] Status: TC + Submitter: Angelika Langer Date: 1999-05-12

+

View all other issues in [complex.ops].

+

View all issues with TC status.

+

Discussion:

+

The extractor for complex numbers is specified as: 

+ +
+ +

template<class T, class charT, class traits> 
+ basic_istream<charT, traits>& 
+ operator>>(basic_istream<charT, traits>& is, complex<T>& x);

+Effects: Extracts a complex number x of the form: u, (u), or (u,v), +where u is the real part and v is the imaginary part +(lib.istream.formatted). 
+Requires: The input values be convertible to T. If bad input is +encountered, calls is.setstate(ios::failbit) (which may throw +ios::failure (lib.iostate.flags). 
+Returns: is .

+ +
+

Is it intended that the extractor for complex numbers does not skip +whitespace, unlike all other extractors in the standard library do? +Shouldn't a sentry be used? 
+
+The inserter for complex numbers is specified as:

+ +
+ +

template<class T, class charT, class traits> 
+ basic_ostream<charT, traits>& 
+ operator<<(basic_ostream<charT, traits>& o, const complex<T>& x);
+
+Effects: inserts the complex number x onto the stream o as if it were implemented as follows:
+
+ template<class T, class charT, class traits> 
+ basic_ostream<charT, traits>& 
+ operator<<(basic_ostream<charT, traits>& o, const complex<T>& x) 
+ { 
+ basic_ostringstream<charT, traits> s; 
+ s.flags(o.flags()); 
+ s.imbue(o.getloc()); 
+ s.precision(o.precision()); 
+ s << '(' << x.real() << "," << x.imag() << ')'; 
+ return o << s.str(); 
+ }

+ +
+ +

Is it intended that the inserter for complex numbers ignores the +field width and does not do any padding? If, with the suggested +implementation above, the field width were set in the stream then the +opening parentheses would be adjusted, but the rest not, because the +field width is reset to zero after each insertion.

+ +

I think that both operations should use sentries, for sake of +consistency with the other inserters and extractors in the +library. Regarding the issue of padding in the inserter, I don't know +what the intent was. 

+ + +

Proposed resolution:

+

After 26.3.6 [complex.ops] paragraph 14 (operator>>), add a +Notes clause:

+ +
+ +

Notes: This extraction is performed as a series of simpler +extractions. Therefore, the skipping of whitespace is specified to be the +same for each of the simpler extractions.

+ +
+ + +

Rationale:

+

For extractors, the note is added to make it clear that skipping whitespace +follows an "all-or-none" rule.

+ +

For inserters, the LWG believes there is no defect; the standard is correct +as written.

+ + + + +
+

147. Library Intro refers to global functions that aren't global

+

Section: 17.4.4.3 [global.functions] Status: TC + Submitter: Lois Goldthwaite Date: 1999-06-04

+

View all other issues in [global.functions].

+

View all issues with TC status.

+

Discussion:

+

The library had many global functions until 17.4.1.1 [lib.contents] +paragraph 2 was added:

+ +
+ +

All library entities except macros, operator new and operator +delete are defined within the namespace std or namespaces nested +within namespace std.

+ +
+ +

It appears "global function" was never updated in the following:

+ +
+ +

17.4.4.3 - Global functions [lib.global.functions]
+
+-1- It is unspecified whether any global functions in the C++ Standard +Library are defined as inline (dcl.fct.spec).
+
+-2- A call to a global function signature described in Clauses +lib.language.support through lib.input.output behaves the same as if +the implementation declares no additional global function +signatures.*
+
+ [Footnote: A valid C++ program always calls the expected library + global function. An implementation may also define additional + global functions that would otherwise not be called by a valid C++ + program. --- end footnote]
+
+-3- A global function cannot be declared by the implementation as +taking additional default arguments. 
+
+17.4.4.4 - Member functions [lib.member.functions]
+
+-2- An implementation can declare additional non-virtual member +function signatures within a class:

+ +
+ +

-- by adding arguments with default values to a member function +signature; The same latitude does not extend to the implementation of +virtual or global functions, however.

+ +
+
+ + +

Proposed resolution:

+

Change "global" to "global or non-member" in:

+
+

17.4.4.3 [lib.global.functions] section title,
+ 17.4.4.3 [lib.global.functions] para 1,
+ 17.4.4.3 [lib.global.functions] para 2 in 2 places plus 2 + places in the footnote,
+ 17.4.4.3 [lib.global.functions] para 3,
+ 17.4.4.4 [lib.member.functions] para 2

+
+ + +

Rationale:

+

+Because operator new and delete are global, the proposed resolution +was changed from "non-member" to "global or non-member. +

+ + + + +
+

148. Functions in the example facet BoolNames should be const

+

Section: 22.2.8 [facets.examples] Status: TC + Submitter: Jeremy Siek Date: 1999-06-03

+

View all other issues in [facets.examples].

+

View all issues with TC status.

+

Discussion:

+

In 22.2.8 [facets.examples] paragraph 13, the do_truename() and +do_falsename() functions in the example facet BoolNames should be +const. The functions they are overriding in +numpunct_byname<char> are const.

+ + +

Proposed resolution:

+

In 22.2.8 [facets.examples] paragraph 13, insert "const" in +two places:

+
+

string do_truename() const { return "Oui Oui!"; }
+ string do_falsename() const { return "Mais Non!"; }

+
+ + + + +
+

150. Find_first_of says integer instead of iterator

+

Section: 25.1.4 [alg.find.first.of] Status: TC + Submitter: Matt McClure Date: 1999-06-30

+

View all other issues in [alg.find.first.of].

+

View all issues with TC status.

+

Discussion:

+ + +

Proposed resolution:

+

Change 25.1.4 [alg.find.first.of] paragraph 2 from:

+ +
+

Returns: The first iterator i in the range [first1, last1) such +that for some integer j in the range [first2, last2) ...

+
+ +

to:

+ +
+

Returns: The first iterator i in the range [first1, last1) such +that for some iterator j in the range [first2, last2) ...

+
+ + + + +
+

151. Can't currently clear() empty container

+

Section: 23.1.1 [sequence.reqmts] Status: TC + Submitter: Ed Brey Date: 1999-06-21

+

View all other issues in [sequence.reqmts].

+

View all issues with TC status.

+

Discussion:

+

For both sequences and associative containers, a.clear() has the +semantics of erase(a.begin(),a.end()), which is undefined for an empty +container since erase(q1,q2) requires that q1 be dereferenceable +(23.1.1,3 and 23.1.2,7). When the container is empty, a.begin() is +not dereferenceable.
+
+The requirement that q1 be unconditionally dereferenceable causes many +operations to be intuitively undefined, of which clearing an empty +container is probably the most dire.
+
+Since q1 and q2 are only referenced in the range [q1, q2), and [q1, +q2) is required to be a valid range, stating that q1 and q2 must be +iterators or certain kinds of iterators is unnecessary. +

+ + +

Proposed resolution:

+

In 23.1.1, paragraph 3, change:

+
+

p and q2 denote valid iterators to a, q and q1 denote valid dereferenceable iterators to a, [q1, q2) denotes a valid range

+
+

to:

+
+

p denotes a valid iterator to a, q denotes a valid dereferenceable iterator to a, [q1, q2) denotes a valid range + in a

+
+

In 23.1.2, paragraph 7, change:

+
+

p and q2 are valid iterators to a, q and q1 are valid dereferenceable + iterators to a, [q1, q2) is a valid range

+
+

to

+
+

p is a valid iterator to a, q is a valid dereferenceable iterator to a, [q1, q2) is a valid range + into a

+
+ + + + +
+

152. Typo in scan_is() semantics

+

Section: 22.2.1.1.2 [locale.ctype.virtuals] Status: TC + Submitter: Dietmar Kühl Date: 1999-07-20

+

View all other issues in [locale.ctype.virtuals].

+

View all issues with TC status.

+

Discussion:

+

The semantics of scan_is() (paragraphs 4 and 6) is not exactly described +because there is no function is() which only takes a character as +argument. Also, in the effects clause (paragraph 3), the semantic is also kept +vague.

+ + +

Proposed resolution:

+

In 22.2.1.1.2 [locale.ctype.virtuals] paragraphs 4 and 6, change the returns +clause from:

+
+

"... such that is(*p) +would..."

+
+

to:  "... such that is(m, *p) + would...."

+ + + + + +
+

153. Typo in narrow() semantics

+

Section: 22.2.1.3.2 [facet.ctype.char.members] Status: WP + Submitter: Dietmar Kühl Date: 1999-07-20

+

View all other issues in [facet.ctype.char.members].

+

View all issues with WP status.

+

Duplicate of: 207

+

Discussion:

+

The description of the array version of narrow() (in +paragraph 11) is flawed: There is no member do_narrow() which +takes only three arguments because in addition to the range a default +character is needed.

+ +

Additionally, for both widen and narrow we have +two signatures followed by a Returns clause that only addresses +one of them.

+ + + +

Proposed resolution:

+

Change the returns clause in 22.2.1.3.2 [facet.ctype.char.members] +paragraph 10 from:

+

    Returns: do_widen(low, high, to).

+ +

to:

+

    Returns: do_widen(c) or do_widen(low, high, to), +respectively.

+ +

Change 22.2.1.3.2 [facet.ctype.char.members] paragraph 10 and 11 from:

+
        char        narrow(char c, char /*dfault*/) const;
+        const char* narrow(const char* low, const char* high,
+                           char /*dfault*/, char* to) const;
+
        Returns: do_narrow(low, high, to).
+

to:

+
        char        narrow(char c, char dfault) const;
+        const char* narrow(const char* low, const char* high,
+                           char dfault, char* to) const;
+
        Returns: do_narrow(c, dfault) or
+                 do_narrow(low, high, dfault, to), respectively.
+ +

[Kona: 1) the problem occurs in additional places, 2) a user +defined version could be different.]

+ + +

[Post-Tokyo: Dietmar provided the above wording at the request of +the LWG. He could find no other places the problem occurred. He +asks for clarification of the Kona "a user defined +version..." comment above. Perhaps it was a circuitous way of +saying "dfault" needed to be uncommented?]

+ + +

[Post-Toronto: the issues list maintainer has merged in the +proposed resolution from issue 207, which addresses the +same paragraphs.]

+ + + + + + +
+

154. Missing double specifier for do_get()

+

Section: 22.2.2.1.2 [facet.num.get.virtuals] Status: TC + Submitter: Dietmar Kühl Date: 1999-07-20

+

View other active issues in [facet.num.get.virtuals].

+

View all other issues in [facet.num.get.virtuals].

+

View all issues with TC status.

+

Discussion:

+

The table in paragraph 7 for the length modifier does not list the length +modifier l to be applied if the type is double. Thus, the +standard asks the implementation to do undefined things when using scanf() +(the missing length modifier for scanf() when scanning doubles +is actually a problem I found quite often in production code, too).

+ + +

Proposed resolution:

+

In 22.2.2.1.2 [facet.num.get.virtuals], paragraph 7, add a row in the Length +Modifier table to say that for double a length modifier +l is to be used.

+ + +

Rationale:

+

The standard makes an embarrassing beginner's mistake.

+ + + + +
+

155. Typo in naming the class defining the class Init

+

Section: 27.3 [iostream.objects] Status: TC + Submitter: Dietmar Kühl Date: 1999-07-20

+

View all other issues in [iostream.objects].

+

View all issues with TC status.

+

Discussion:

+

There are conflicting statements about where the class +Init is defined. According to 27.3 [iostream.objects] paragraph 2 +it is defined as basic_ios::Init, according to 27.4.2 [ios.base] it is defined as ios_base::Init.

+ + +

Proposed resolution:

+

Change 27.3 [iostream.objects] paragraph 2 from +"basic_ios::Init" to +"ios_base::Init".

+ + +

Rationale:

+

Although not strictly wrong, the standard was misleading enough to warrant +the change.

+ + + + +
+

156. Typo in imbue() description

+

Section: 27.4.2.3 [ios.base.locales] Status: TC + Submitter: Dietmar Kühl Date: 1999-07-20

+

View all other issues in [ios.base.locales].

+

View all issues with TC status.

+

Discussion:

+

There is a small discrepancy between the declarations of +imbue(): in 27.4.2 [ios.base] the argument is passed as +locale const& (correct), in 27.4.2.3 [ios.base.locales] it +is passed as locale const (wrong).

+ + +

Proposed resolution:

+

In 27.4.2.3 [ios.base.locales] change the imbue argument +from "locale const" to "locale +const&".

+ + + + +
+

158. Underspecified semantics for setbuf()

+

Section: 27.5.2.4.2 [streambuf.virt.buffer] Status: TC + Submitter: Dietmar Kühl Date: 1999-07-20

+

View all other issues in [streambuf.virt.buffer].

+

View all issues with TC status.

+

Discussion:

+

The default behavior of setbuf() is described only for the +situation that gptr() != 0 && gptr() != egptr(): +namely to do nothing. What has to be done in other situations  +is not described although there is actually only one reasonable +approach, namely to do nothing, too.

+ +

Since changing the buffer would almost certainly mess up most +buffer management of derived classes unless these classes do it +themselves, the default behavior of setbuf() should always be +to do nothing.

+ + +

Proposed resolution:

+

Change 27.5.2.4.2 [streambuf.virt.buffer], paragraph 3, Default behavior, +to: "Default behavior: Does nothing. Returns this."

+ + + + +
+

159. Strange use of underflow()

+

Section: 27.5.2.4.3 [streambuf.virt.get] Status: TC + Submitter: Dietmar Kühl Date: 1999-07-20

+

View all issues with TC status.

+

Discussion:

+

The description of the meaning of the result of +showmanyc() seems to be rather strange: It uses calls to +underflow(). Using underflow() is strange because +this function only reads the current character but does not extract +it, uflow() would extract the current character. This should +be fixed to use sbumpc() instead.

+ + +

Proposed resolution:

+

Change 27.5.2.4.3 [streambuf.virt.get] paragraph 1, +showmanyc()returns clause, by replacing the word +"supplied" with the words "extracted from the +stream".

+ + + + +
+

160. Typo: Use of non-existing function exception()

+

Section: 27.6.1.1 [istream] Status: TC + Submitter: Dietmar Kühl Date: 1999-07-20

+

View all other issues in [istream].

+

View all issues with TC status.

+

Discussion:

+

The paragraph 4 refers to the function exception() which +is not defined. Probably, the referred function is +basic_ios<>::exceptions().

+ + +

Proposed resolution:

+

In 27.6.1.1 [istream], 27.6.1.3 [istream.unformatted], paragraph 1, +27.6.2.1 [ostream], paragraph 3, and 27.6.2.6.1 [ostream.formatted.reqmts], +paragraph 1, change "exception()" to +"exceptions()".

+ +

[Note to Editor: "exceptions" with an "s" +is the correct spelling.]

+ + + + + + +
+

161. Typo: istream_iterator vs. istreambuf_iterator

+

Section: 27.6.1.2.2 [istream.formatted.arithmetic] Status: TC + Submitter: Dietmar Kühl Date: 1999-07-20

+

View other active issues in [istream.formatted.arithmetic].

+

View all other issues in [istream.formatted.arithmetic].

+

View all issues with TC status.

+

Discussion:

+

The note in the second paragraph pretends that the first argument +is an object of type istream_iterator. This is wrong: It is +an object of type istreambuf_iterator.

+ + +

Proposed resolution:

+

Change 27.6.1.2.2 [istream.formatted.arithmetic] from:

+
+

The first argument provides an object of the istream_iterator class...

+
+

to

+
+

The first argument provides an object of the istreambuf_iterator class...

+
+ + + + + +
+

164. do_put() has apparently unused fill argument

+

Section: 22.2.5.3.2 [locale.time.put.virtuals] Status: TC + Submitter: Angelika Langer Date: 1999-07-23

+

View all issues with TC status.

+

Discussion:

+

In 22.2.5.3.2 [locale.time.put.virtuals] the do_put() function is specified +as taking a fill character as an argument, but the description of the +function does not say whether the character is used at all and, if so, +in which way. The same holds for any format control parameters that +are accessible through the ios_base& argument, such as the +adjustment or the field width. Is strftime() supposed to use the fill +character in any way? In any case, the specification of +time_put.do_put() looks inconsistent to me.

Is the +signature of do_put() wrong, or is the effects clause incomplete?

+ + +

Proposed resolution:

+

Add the following note after 22.2.5.3.2 [locale.time.put.virtuals] +paragraph 2:

+
+

[Note: the fill argument may be used in the implementation-defined formats, or by derivations. A space character is a reasonable default + for this argument. --end Note]

+
+ + +

Rationale:

+

The LWG felt that while the normative text was correct, +users need some guidance on what to pass for the fill +argument since the standard doesn't say how it's used.

+ + + + +
+

165. xsputn(), pubsync() never called by basic_ostream members?

+

Section: 27.6.2.1 [ostream] Status: WP + Submitter: Dietmar Kühl Date: 1999-07-20

+

View all other issues in [ostream].

+

View all issues with WP status.

+

Discussion:

+

Paragraph 2 explicitly states that none of the basic_ostream +functions falling into one of the groups "formatted output functions" +and "unformatted output functions" calls any stream buffer function +which might call a virtual function other than overflow(). Basically +this is fine but this implies that sputn() (this function would call +the virtual function xsputn()) is never called by any of the standard +output functions. Is this really intended? At minimum it would be convenient to +call xsputn() for strings... Also, the statement that overflow() +is the only virtual member of basic_streambuf called is in conflict +with the definition of flush() which calls rdbuf()->pubsync() +and thereby the virtual function sync() (flush() is listed +under "unformatted output functions").

+

In addition, I guess that the sentence starting with "They may use other +public members of basic_ostream ..." probably was intended to +start with "They may use other public members of basic_streamuf..." +although the problem with the virtual members exists in both cases.

+

I see two obvious resolutions:

+
    +
  1. state in a footnote that this means that xsputn() will never be + called by any ostream member and that this is intended.
  2. +
  3. relax the restriction and allow calling overflow() and xsputn(). + Of course, the problem with flush() has to be resolved in some way.
  4. +
+ + +

Proposed resolution:

+

Change the last sentence of 27.6.2.1 (lib.ostream) paragraph 2 from:

+
+

They may use other public members of basic_ostream except that they do not + invoke any virtual members of rdbuf() except overflow().

+
+

to:

+
+

They may use other public members of basic_ostream except that they shall + not invoke any virtual members of rdbuf() except overflow(), xsputn(), and + sync().

+
+ +

[Kona: the LWG believes this is a problem. Wish to ask Jerry or +PJP why the standard is written this way.]

+ + +

[Post-Tokyo: Dietmar supplied wording at the request of the +LWG. He comments: The rules can be made a little bit more specific if +necessary be explicitly spelling out what virtuals are allowed to be +called from what functions and eg to state specifically that flush() +is allowed to call sync() while other functions are not.]

+ + + + + + +
+

167. Improper use of traits_type::length()

+

Section: 27.6.2.6.4 [ostream.inserters.character] Status: WP + Submitter: Dietmar Kühl Date: 1999-07-20

+

View all other issues in [ostream.inserters.character].

+

View all issues with WP status.

+

Discussion:

+

Paragraph 4 states that the length is determined using +traits::length(s). Unfortunately, this function is not +defined for example if the character type is wchar_t and the +type of s is char const*. Similar problems exist if +the character type is char and the type of s is +either signed char const* or unsigned char +const*.

+ + +

Proposed resolution:

+

Change 27.6.2.6.4 [ostream.inserters.character] paragraph 4 from:

+
+

Effects: Behaves like an formatted inserter (as described in + lib.ostream.formatted.reqmts) of out. After a sentry object is + constructed it inserts characters. The number of characters starting + at s to be inserted is traits::length(s). Padding is determined as + described in lib.facet.num.put.virtuals. The traits::length(s) + characters starting at s are widened using out.widen + (lib.basic.ios.members). The widened characters and any required + padding are inserted into out. Calls width(0).

+
+

to:

+
+

Effects: Behaves like a formatted inserter (as described in + lib.ostream.formatted.reqmts) of out. After a sentry object is + constructed it inserts n characters starting at s, + where n is the number that would be computed as if by:

+
    +
  • traits::length(s) for the overload where the first argument is of + type basic_ostream<charT, traits>& and the second is + of type const charT*, and also for the overload where the first + argument is of type basic_ostream<char, traits>& and + the second is of type const char*.
  • +
  • std::char_traits<char>::length(s) + for the overload where the first argument is of type + basic_ostream<charT, traits>& and the second is of type + const char*.
  • +
  • traits::length(reinterpret_cast<const char*>(s)) + for the other two overloads.
  • +
+

Padding is determined as described in + lib.facet.num.put.virtuals. The n characters starting at + s are widened using out.widen (lib.basic.ios.members). The + widened characters and any required padding are inserted into + out. Calls width(0).

+
+ +

[Santa Cruz: Matt supplied new wording]

+ + +

[Kona: changed "where n is" to " where n is the + number that would be computed as if by"]

+ + + + +

Rationale:

+

We have five separate cases. In two of them we can use the +user-supplied traits class without any fuss. In the other three we +try to use something as close to that user-supplied class as possible. +In two cases we've got a traits class that's appropriate for +char and what we've got is a const signed char* or a const +unsigned char*; that's close enough so we can just use a reinterpret +cast, and continue to use the user-supplied traits class. Finally, +there's one case where we just have to give up: where we've got a +traits class for some arbitrary charT type, and we somehow have to +deal with a const char*. There's nothing better to do but fall back +to char_traits<char>

+ + + + + +
+

168. Typo: formatted vs. unformatted

+

Section: 27.6.2.7 [ostream.unformatted] Status: TC + Submitter: Dietmar Kühl Date: 1999-07-20

+

View all other issues in [ostream.unformatted].

+

View all issues with TC status.

+

Discussion:

+

The first paragraph begins with a descriptions what has to be done +in formatted output functions. Probably this is a typo and the +paragraph really want to describe unformatted output functions...

+ + +

Proposed resolution:

+

In 27.6.2.7 [ostream.unformatted] paragraph 1, the first and last +sentences, change the word "formatted" to +"unformatted":

+
+

"Each unformatted output function begins ..."
+ "... value specified for the unformatted output + function."

+
+ + + + +
+

169. Bad efficiency of overflow() mandated

+

Section: 27.7.1.4 [stringbuf.virtuals] Status: TC + Submitter: Dietmar Kühl Date: 1999-07-20

+

View other active issues in [stringbuf.virtuals].

+

View all other issues in [stringbuf.virtuals].

+

View all issues with TC status.

+

Discussion:

+

Paragraph 8, Notes, of this section seems to mandate an extremely +inefficient way of buffer handling for basic_stringbuf, +especially in view of the restriction that basic_ostream +member functions are not allowed to use xsputn() (see 27.6.2.1 [ostream]): For each character to be inserted, a new buffer +is to be created.

+

Of course, the resolution below requires some handling of +simultaneous input and output since it is no longer possible to update +egptr() whenever epptr() is changed. A possible +solution is to handle this in underflow().

+ + +

Proposed resolution:

+

In 27.7.1.4 [stringbuf.virtuals] paragraph 8, Notes, insert the words +"at least" as in the following:

+
+

To make a write position available, the function reallocates (or initially + allocates) an array object with a sufficient number of elements to hold the + current array object (if any), plus at least one additional write + position.

+
+ + + + +
+

170. Inconsistent definition of traits_type

+

Section: 27.7.4 [stringstream] Status: TC + Submitter: Dietmar Kühl Date: 1999-07-20

+

View all issues with TC status.

+

Discussion:

+

The classes basic_stringstream (27.7.4 [stringstream]), +basic_istringstream (27.7.2 [istringstream]), and +basic_ostringstream (27.7.3 [ostringstream]) are inconsistent +in their definition of the type traits_type: For +istringstream, this type is defined, for the other two it is +not. This should be consistent.

+ + +

Proposed resolution:

+

Proposed resolution:

To the declarations of +basic_ostringstream (27.7.3 [ostringstream]) and +basic_stringstream (27.7.4 [stringstream]) add:

+
+
typedef traits traits_type;
+
+ + + + +
+

171. Strange seekpos() semantics due to joint position

+

Section: 27.8.1.5 [filebuf.virtuals] Status: WP + Submitter: Dietmar Kühl Date: 1999-07-20

+

View all other issues in [filebuf.virtuals].

+

View all issues with WP status.

+

Discussion:

+

Overridden virtual functions, seekpos()

In 27.8.1.1 [filebuf] paragraph 3, it is stated that a joint input and +output position is maintained by basic_filebuf. Still, the +description of seekpos() seems to talk about different file +positions. In particular, it is unclear (at least to me) what is +supposed to happen to the output buffer (if there is one) if only the +input position is changed. The standard seems to mandate that the +output buffer is kept and processed as if there was no positioning of +the output position (by changing the input position). Of course, this +can be exactly what you want if the flag ios_base::ate is +set. However, I think, the standard should say something like +this:

+
    +
  • If (which & mode) == 0 neither read nor write position is + changed and the call fails. Otherwise, the joint read and write position is + altered to correspond to sp.
  • +
  • If there is an output buffer, the output sequences is updated and any + unshift sequence is written before the position is altered.
  • +
  • If there is an input buffer, the input sequence is updated after the + position is altered.
  • +
+

Plus the appropriate error handling, that is...

+ + +

Proposed resolution:

+

Change the unnumbered paragraph in 27.8.1.4 (lib.filebuf.virtuals) before +paragraph 14 from:

+
+

pos_type seekpos(pos_type sp, ios_base::openmode = ios_base::in | + ios_base::out);

+

Alters the file position, if possible, to correspond to the position stored + in sp (as described below).

+

- if (which&ios_base::in)!=0, set the file position to sp, then update + the input sequence

+

- if (which&ios_base::out)!=0, then update the output sequence, write + any unshift sequence, and set the file position to sp.

+
+

to:

+
+

pos_type seekpos(pos_type sp, ios_base::openmode = ios_base::in | + ios_base::out);

+

Alters the file position, if possible, to correspond to the position stored + in sp (as described below). Altering the file position performs as follows:

+

1. if (om & ios_base::out)!=0, then update the output sequence and + write any unshift sequence;

+

2. set the file position to sp;

+

3. if (om & ios_base::in)!=0, then update the input sequence;

+

where om is the open mode passed to the last call to open(). The operation + fails if is_open() returns false.

+
+ +

[Kona: Dietmar is working on a proposed resolution.]

+ +

[Post-Tokyo: Dietmar supplied the above wording.]

+ + + + + + +
+

172. Inconsistent types for basic_istream::ignore()

+

Section: 27.6.1.3 [istream.unformatted] Status: TC + Submitter: Greg Comeau, Dietmar Kühl Date: 1999-07-23

+

View all other issues in [istream.unformatted].

+

View all issues with TC status.

+

Discussion:

+

In 27.6.1.1 [istream] the function +ignore() gets an object of type streamsize as first +argument. However, in 27.6.1.3 [istream.unformatted] +paragraph 23 the first argument is of type int.

+ +

As far as I can see this is not really a contradiction because +everything is consistent if streamsize is typedef to be +int. However, this is almost certainly not what was +intended. The same thing happened to basic_filebuf::setbuf(), +as described in issue 173.

+ +

Darin Adler also +submitted this issue, commenting: Either 27.6.1.1 should be modified +to show a first parameter of type int, or 27.6.1.3 should be modified +to show a first parameter of type streamsize and use +numeric_limits<streamsize>::max.

+ + +

Proposed resolution:

+

In 27.6.1.3 [istream.unformatted] paragraph 23 and 24, change both uses +of int in the description of ignore() to +streamsize.

+ + + + +
+

173. Inconsistent types for basic_filebuf::setbuf()

+

Section: 27.8.1.5 [filebuf.virtuals] Status: TC + Submitter: Greg Comeau, Dietmar Kühl Date: 1999-07-23

+

View all other issues in [filebuf.virtuals].

+

View all issues with TC status.

+

Discussion:

+ +

+In 27.8.1.1 [filebuf] the function setbuf() gets an +object of type streamsize as second argument. However, in +27.8.1.5 [filebuf.virtuals] paragraph 9 the second argument is of type +int. +

+ +

+As far as I can see this is not really a contradiction because +everything is consistent if streamsize is typedef to be +int. However, this is almost certainly not what was +intended. The same thing happened to basic_istream::ignore(), +as described in issue 172. +

+ + + +

Proposed resolution:

+

In 27.8.1.5 [filebuf.virtuals] paragraph 9, change all uses of +int in the description of setbuf() to +streamsize.

+ + + + +
+

174. Typo: OFF_T vs. POS_T

+

Section: D.6 [depr.ios.members] Status: TC + Submitter: Dietmar Kühl Date: 1999-07-23

+

View all other issues in [depr.ios.members].

+

View all issues with TC status.

+

Discussion:

+

According to paragraph 1 of this section, streampos is the +type OFF_T, the same type as streamoff. However, in +paragraph 6 the streampos gets the type POS_T

+ + +

Proposed resolution:

+

Change D.6 [depr.ios.members] paragraph 1 from "typedef +OFF_T streampos;" to "typedef POS_T +streampos;"

+ + + + +
+

175. Ambiguity for basic_streambuf::pubseekpos() and a few other functions.

+

Section: D.6 [depr.ios.members] Status: TC + Submitter: Dietmar Kühl Date: 1999-07-23

+

View all other issues in [depr.ios.members].

+

View all issues with TC status.

+

Discussion:

+

According to paragraph 8 of this section, the methods +basic_streambuf::pubseekpos(), +basic_ifstream::open(), and basic_ofstream::open +"may" be overloaded by a version of this function taking the +type ios_base::open_mode as last argument argument instead of +ios_base::openmode (ios_base::open_mode is defined +in this section to be an alias for one of the integral types). The +clause specifies, that the last argument has a default argument in +three cases. However, this generates an ambiguity with the overloaded +version because now the arguments are absolutely identical if the last +argument is not specified.

+ + +

Proposed resolution:

+

In D.6 [depr.ios.members] paragraph 8, remove the default arguments for +basic_streambuf::pubseekpos(), +basic_ifstream::open(), and +basic_ofstream::open().

+ + + + +
+

176. exceptions() in ios_base...?

+

Section: D.6 [depr.ios.members] Status: TC + Submitter: Dietmar Kühl Date: 1999-07-23

+

View all other issues in [depr.ios.members].

+

View all issues with TC status.

+

Discussion:

+

The "overload" for the function exceptions() in +paragraph 8 gives the impression that there is another function of +this function defined in class ios_base. However, this is not +the case. Thus, it is hard to tell how the semantics (paragraph 9) can +be implemented: "Call the corresponding member function specified +in clause 27 [input.output]."

+ + +

Proposed resolution:

+

In D.6 [depr.ios.members] paragraph 8, move the declaration of the +function exceptions()into class basic_ios.

+ + + + +
+

179. Comparison of const_iterators to iterators doesn't work

+

Section: 23.1 [container.requirements] Status: WP + Submitter: Judy Ward Date: 1998-07-02

+

View other active issues in [container.requirements].

+

View all other issues in [container.requirements].

+

View all issues with WP status.

+

Discussion:

+

Currently the following will not compile on two well-known standard +library implementations:

+ +
+
#include <set>
+using namespace std;
+
+void f(const set<int> &s)
+{
+  set<int>::iterator i;
+  if (i==s.end()); // s.end() returns a const_iterator
+}
+
+ +

+The reason this doesn't compile is because operator== was implemented +as a member function of the nested classes set:iterator and +set::const_iterator, and there is no conversion from const_iterator to +iterator. Surprisingly, (s.end() == i) does work, though, because of +the conversion from iterator to const_iterator. +

+ +

+I don't see a requirement anywhere in the standard that this must +work. Should there be one? If so, I think the requirement would need +to be added to the tables in section 24.1.1. I'm not sure about the +wording. If this requirement existed in the standard, I would think +that implementors would have to make the comparison operators +non-member functions.

+ +

This issues was also raised on comp.std.c++ by Darin +Adler.  The example given was:

+ +
+
bool check_equal(std::deque<int>::iterator i,
+std::deque<int>::const_iterator ci)
+{
+return i == ci;
+}
+
+ +

Comment from John Potter:

+
+

+ In case nobody has noticed, accepting it will break reverse_iterator. +

+ +

+ The fix is to make the comparison operators templated on two types. +

+ +
    template <class Iterator1, class Iterator2>
+    bool operator== (reverse_iterator<Iterator1> const& x,
+                     reverse_iterator<Iterator2> const& y);
+    
+ +

+ Obviously: return x.base() == y.base(); +

+ +

+ Currently, no reverse_iterator to const_reverse_iterator compares are + valid. +

+ +

+ BTW, I think the issue is in support of bad code. Compares should be + between two iterators of the same type. All std::algorithms require + the begin and end iterators to be of the same type. +

+
+ + +

Proposed resolution:

+

Insert this paragraph after 23.1 [container.requirements] paragraph 7:

+
+

In the expressions

+
    i == j
+    i != j
+    i < j
+    i <= j
+    i >= j
+    i > j
+    i - j
+  
+

Where i and j denote objects of a container's iterator type, + either or both may be replaced by an object of the container's + const_iterator type referring to the same element with no + change in semantics.

+
+ +

[post-Toronto: Judy supplied a proposed resolution saying that +iterator and const_iterator could be freely mixed in +iterator comparison and difference operations.]

+ + +

[Redmond: Dave and Howard supplied a new proposed resolution which +explicitly listed expressions; there was concern that the previous +proposed resolution was too informal.]

+ + + +

Rationale:

+

+The LWG believes it is clear that the above wording applies only to +the nested types X::iterator and X::const_iterator, +where X is a container. There is no requirement that +X::reverse_iterator and X::const_reverse_iterator +can be mixed. If mixing them is considered important, that's a +separate issue. (Issue 280.) +

+ + + + +
+

181. make_pair() unintended behavior

+

Section: 20.2.3 [pairs] Status: TC + Submitter: Andrew Koenig Date: 1999-08-03

+

View all other issues in [pairs].

+

View all issues with TC status.

+

Discussion:

+

The claim has surfaced in Usenet that expressions such as
+
+       make_pair("abc", 3)
+
+are illegal, notwithstanding their use in examples, because template instantiation tries to bind the first template +parameter to const char (&)[4], which type is uncopyable.
+
+I doubt anyone intended that behavior... +

+ + +

Proposed resolution:

+

In 20.2 [utility], paragraph 1 change the following +declaration of make_pair():

+
+
template <class T1, class T2> pair<T1,T2> make_pair(const T1&, const T2&);
+
+

to:

+
+
template <class T1, class T2> pair<T1,T2> make_pair(T1, T2);
+
+

In 20.2.3 [pairs] paragraph 7 and the line before, change:

+
+
template <class T1, class T2>
+pair<T1, T2> make_pair(const T1& x, const T2& y);
+
+

to:

+
+
template <class T1, class T2>
+pair<T1, T2> make_pair(T1 x, T2 y);
+
+

and add the following footnote to the effects clause:

+
+

According to 12.8 [class.copy], an implementation is permitted + to not perform a copy of an argument, thus avoiding unnecessary + copies.

+
+ + +

Rationale:

+

Two potential fixes were suggested by Matt Austern and Dietmar +Kühl, respectively, 1) overloading with array arguments, and 2) use of +a reference_traits class with a specialization for arrays. Andy +Koenig suggested changing to pass by value. In discussion, it appeared +that this was a much smaller change to the standard that the other two +suggestions, and any efficiency concerns were more than offset by the +advantages of the solution. Two implementors reported that the +proposed resolution passed their test suites.

+ + + + +
+

182. Ambiguous references to size_t

+

Section: 17 [library] Status: WP + Submitter: Al Stevens Date: 1999-08-15

+

View all other issues in [library].

+

View all issues with WP status.

+

Discussion:

+

Many references to size_t throughout the document +omit the std:: namespace qualification.

For +example, 17.4.3.4 [replacement.functions] paragraph 2:

+
+
 operator new(size_t)
+ operator new(size_t, const std::nothrow_t&)
+ operator new[](size_t)
+ operator new[](size_t, const std::nothrow_t&)
+
+ + +

Proposed resolution:

+

In 17.4.3.4 [replacement.functions] paragraph 2: replace:

+
+

- operator new(size_t)
+ - operator new(size_t, const std::nothrow_t&)
+ - operator new[](size_t)
+ - operator new[](size_t, const std::nothrow_t&)

+
+

by:

+
+
- operator new(std::size_t)
+- operator new(std::size_t, const std::nothrow_t&)
+- operator new[](std::size_t)
+- operator new[](std::size_t, const std::nothrow_t&)
+
+

In [lib.allocator.requirements] 20.1.5, paragraph 4: replace:

+
+

The typedef members pointer, const_pointer, size_type, and difference_type + are required to be T*, T const*, size_t, and ptrdiff_t, respectively.

+
+

 by:

+
+

The typedef members pointer, const_pointer, size_type, and difference_type + are required to be T*, T const*, std::size_t, and std::ptrdiff_t, + respectively.

+
+

In [lib.allocator.members] 20.4.1.1, paragraphs 3 and 6: replace:

+
+

3 Notes: Uses ::operator new(size_t) (18.4.1).

+

6 Note: the storage is obtained by calling ::operator new(size_t), but it + is unspecified when or how often this function is called. The use of hint is + unspecified, but intended as an aid to locality if an implementation so + desires.

+
+

by:

+
+

3 Notes: Uses ::operator new(std::size_t) (18.4.1).

+

6 Note: the storage is obtained by calling ::operator new(std::size_t), but + it is unspecified when or how often this function is called. The use of hint + is unspecified, but intended as an aid to locality if an implementation so + desires.

+
+

In [lib.char.traits.require] 21.1.1, paragraph 1: replace:

+
+

In Table 37, X denotes a Traits class defining types and functions for the + character container type CharT; c and d denote values of type CharT; p and q + denote values of type const CharT*; s denotes a value of type CharT*; n, i and + j denote values of type size_t; e and f denote values of type X::int_type; pos + denotes a value of type X::pos_type; and state denotes a value of type X::state_type.

+
+

by:

+
+

In Table 37, X denotes a Traits class defining types and functions for the + character container type CharT; c and d denote values of type CharT; p and q + denote values of type const CharT*; s denotes a value of type CharT*; n, i and + j denote values of type std::size_t; e and f denote values of type X::int_type; + pos denotes a value of type X::pos_type; and state denotes a value of type X::state_type.

+
+

In [lib.char.traits.require] 21.1.1, table 37: replace the return type of +X::length(p): "size_t" by "std::size_t".

+

In [lib.std.iterator.tags] 24.3.3, paragraph 2: replace:
+    typedef ptrdiff_t difference_type;
+ by:
+    typedef std::ptrdiff_t difference_type;

+

In [lib.locale.ctype] 22.2.1.1 put namespace std { ...} around the +declaration of template <class charT> class ctype.
+
+ In [lib.iterator.traits] 24.3.1, paragraph 2 put namespace std { ...} around the declaration of:
+
+    template<class Iterator> struct iterator_traits
+    template<class T> struct iterator_traits<T*>
+    template<class T> struct iterator_traits<const T*>

+ + +

Rationale:

+

The LWG believes correcting names like size_t and +ptrdiff_t to std::size_t and std::ptrdiff_t +to be essentially editorial. There there can't be another size_t or +ptrdiff_t meant anyway because, according to 17.4.3.1.4 [extern.types],

+ +

+For each type T from the Standard C library, the types ::T and std::T +are reserved to the implementation and, when defined, ::T shall be +identical to std::T. +

+ +

The issue is treated as a Defect Report to make explicit the Project +Editor's authority to make this change.

+ +

[Post-Tokyo: Nico Josuttis provided the above wording at the +request of the LWG.]

+ + +

[Toronto: This is tangentially related to issue 229, but only tangentially: the intent of this issue is to +address use of the name size_t in contexts outside of +namespace std, such as in the description of ::operator new. +The proposed changes should be reviewed to make sure they are +correct.]

+ + +

[pre-Copenhagen: Nico has reviewed the changes and believes +them to be correct.]

+ + + + + + + +
+

183. I/O stream manipulators don't work for wide character streams

+

Section: 27.6.3 [std.manip] Status: WP + Submitter: Andy Sawyer Date: 1999-07-07

+

View all other issues in [std.manip].

+

View all issues with WP status.

+

Discussion:

+

27.6.3 [std.manip] paragraph 3 says (clause numbering added for +exposition):

+
+

Returns: An object s of unspecified type such that if [1] out is an (instance +of) basic_ostream then the expression out<<s behaves as if f(s) were +called, and if [2] in is an (instance of) basic_istream then the expression +in>>s behaves as if f(s) were called. Where f can be defined as: ios_base& +f(ios_base& str, ios_base::fmtflags mask) { // reset specified flags +str.setf(ios_base::fmtflags(0), mask); return str; } [3] The expression +out<<s has type ostream& and value out. [4] The expression in>>s +has type istream& and value in.

+
+

Given the definitions [1] and [2] for out and in, surely [3] should read: +"The expression out << s has type basic_ostream& ..." and +[4] should read: "The expression in >> s has type basic_istream& +..."

+

If the wording in the standard is correct, I can see no way of implementing +any of the manipulators so that they will work with wide character streams.

+

e.g. wcout << setbase( 16 );

+

Must have value 'wcout' (which makes sense) and type 'ostream&' (which +doesn't).

+

The same "cut'n'paste" type also seems to occur in Paras 4,5,7 and +8. In addition, Para 6 [setfill] has a similar error, but relates only to +ostreams.

+

I'd be happier if there was a better way of saying this, to make it clear +that the value of the expression is "the same specialization of +basic_ostream as out"&

+ + +

Proposed resolution:

+

Replace section 27.6.3 [std.manip] except paragraph 1 with the +following:

+
+

2- The type designated smanip in each of the following function +descriptions is implementation-specified and may be different for each +function.
+
+smanip resetiosflags(ios_base::fmtflags mask);
+
+-3- Returns: An object s of unspecified type such that if out is an +instance of basic_ostream<charT,traits> then the expression +out<<s behaves +as if f(s, mask) were called, or if in is an instance of +basic_istream<charT,traits> then the expression in>>s +behaves as if +f(s, mask) were called. The function f can be defined as:*
+
+[Footnote: The expression cin >> resetiosflags(ios_base::skipws) +clears ios_base::skipws in the format flags stored in the +basic_istream<charT,traits> object cin (the same as cin >> +noskipws), and the expression cout << +resetiosflags(ios_base::showbase) clears +ios_base::showbase in the format flags stored in the +basic_ostream<charT,traits> object cout (the same as cout +<< +noshowbase). --- end footnote]
+
+     ios_base& f(ios_base& str, ios_base::fmtflags mask)
+   {
+   // reset specified flags
+   str.setf(ios_base::fmtflags(0), mask);
+   return str;
+   }
+

+The expression out<<s has type basic_ostream<charT,traits>& and value out. +The expression in>>s has type basic_istream<charT,traits>& and value in.
+
smanip setiosflags(ios_base::fmtflags mask);
+
+-4- Returns: An object s of unspecified type such that if out is an +instance of basic_ostream<charT,traits> then the expression +out<<s behaves +as if f(s, mask) were called, or if in is an instance of +basic_istream<charT,traits> then the expression in>>s +behaves as if f(s, +mask) were called. The function f can be defined as:
+
+     ios_base& f(ios_base& str, ios_base::fmtflags mask)
+   {
+   // set specified flags
+   str.setf(mask);
+   return str;
+   }
+

+The expression out<<s has type basic_ostream<charT,traits>& and value out. +The expression in>>s has type basic_istream<charT,traits>& and value in.
+
+smanip setbase(int base);
+
+-5- Returns: An object s of unspecified type such that if out is an +instance of basic_ostream<charT,traits> then the expression +out<<s behaves +as if f(s, base) were called, or if in is an instance of +basic_istream<charT,traits> then the expression in>>s +behaves as if f(s, +base) were called. The function f can be defined as:
+
+     ios_base& f(ios_base& str, int base)
+   {
+   // set basefield
+   str.setf(base == 8 ? ios_base::oct :
+   base == 10 ? ios_base::dec :
+   base == 16 ? ios_base::hex :
+   ios_base::fmtflags(0), ios_base::basefield);
+   return str;
+   }
+

+The expression out<<s has type basic_ostream<charT,traits>& and value out. +The expression in>>s has type basic_istream<charT,traits>& and value in.
+
+smanip setfill(char_type c);
+

+-6- Returns: An object s of unspecified type such that if out is (or is +derived from) basic_ostream<charT,traits> and c has type charT +then the +expression out<<s behaves as if f(s, c) were called. The function +f can be +defined as:
+
+      template<class charT, class traits>
+   basic_ios<charT,traits>& f(basic_ios<charT,traits>& str, charT c)
+   {
+   // set fill character
+   str.fill(c);
+   return str;
+   }
+

+The expression out<<s has type basic_ostream<charT,traits>& and value out.
+
+smanip setprecision(int n);
+
+-7- Returns: An object s of unspecified type such that if out is an +instance of basic_ostream<charT,traits> then the expression +out<<s behaves +as if f(s, n) were called, or if in is an instance of +basic_istream<charT,traits> then the expression in>>s +behaves as if f(s, n) +were called. The function f can be defined as:
+
+      ios_base& f(ios_base& str, int n)
+   {
+   // set precision
+   str.precision(n);
+   return str;
+   }
+

+The expression out<<s has type basic_ostream<charT,traits>& and value out. +The expression in>>s has type basic_istream<charT,traits>& and value in
+.
+smanip setw(int n);
+

+-8- Returns: An object s of unspecified type such that if out is an +instance of basic_ostream<charT,traits> then the expression +out<<s behaves +as if f(s, n) were called, or if in is an instance of +basic_istream<charT,traits> then the expression in>>s +behaves as if f(s, n) +were called. The function f can be defined as:
+
+      ios_base& f(ios_base& str, int n)
+   {
+   // set width
+   str.width(n);
+   return str;
+   }
+

+The expression out<<s has type +basic_ostream<charT,traits>& and value out. The expression +in>>s has type basic_istream<charT,traits>& and value +in. +

+
+ +

[Kona: Andy Sawyer and Beman Dawes will work to improve the wording of +the proposed resolution.]

+ + +

[Tokyo - The LWG noted that issue 216 involves +the same paragraphs.]

+ + +

[Post-Tokyo: The issues list maintainer combined the proposed +resolution of this issue with the proposed resolution for issue 216 as they both involved the same paragraphs, and were so +intertwined that dealing with them separately appear fraught with +error. The full text was supplied by Bill Plauger; it was cross +checked against changes supplied by Andy Sawyer. It should be further +checked by the LWG.]

+ + + + + + +
+

184. numeric_limits<bool> wording problems

+

Section: 18.2.1.5 [numeric.special] Status: WP + Submitter: Gabriel Dos Reis Date: 1999-07-21

+

View all other issues in [numeric.special].

+

View all issues with WP status.

+

Discussion:

+

bools are defined by the standard to be of integer types, as per +3.9.1 [basic.fundamental] paragraph 7. However "integer types" +seems to have a special meaning for the author of 18.2. The net effect +is an unclear and confusing specification for +numeric_limits<bool> as evidenced below.

+ +

18.2.1.2/7 says numeric_limits<>::digits is, for built-in integer +types, the number of non-sign bits in the representation.

+ +

4.5/4 states that a bool promotes to int ; whereas 4.12/1 says any non zero +arithmetical value converts to true.

+ +

I don't think it makes sense at all to require +numeric_limits<bool>::digits and numeric_limits<bool>::digits10 to +be meaningful.

+ +

The standard defines what constitutes a signed (resp. unsigned) integer +types. It doesn't categorize bool as being signed or unsigned. And the set of +values of bool type has only two elements.

+ +

I don't think it makes sense to require numeric_limits<bool>::is_signed +to be meaningful.

+ +

18.2.1.2/18 for numeric_limits<integer_type>::radix  says:

+
+

For integer types, specifies the base of the representation.186)

+
+ +

This disposition is at best misleading and confusing for the standard +requires a "pure binary numeration system" for integer types as per +3.9.1/7

+ +

The footnote 186) says: "Distinguishes types with base other than 2 (e.g +BCD)."  This also erroneous as the standard never defines any integer +types with base representation other than 2.

+ +

Furthermore, numeric_limits<bool>::is_modulo and +numeric_limits<bool>::is_signed have similar problems.

+ + +

Proposed resolution:

+

Append to the end of 18.2.1.5 [numeric.special]:

+
+

The specialization for bool shall be provided as follows:

+
    namespace std {
+       template<> class numeric_limits<bool> {
+       public:
+         static const bool is_specialized = true;
+         static bool min() throw() { return false; }
+         static bool max() throw() { return true; }
+
+         static const int  digits = 1;
+         static const int  digits10 = 0;
+         static const bool is_signed = false;
+         static const bool is_integer = true;
+         static const bool is_exact = true;
+         static const int  radix = 2;
+         static bool epsilon() throw() { return 0; }
+         static bool round_error() throw() { return 0; }
+
+         static const int  min_exponent = 0;
+         static const int  min_exponent10 = 0;
+         static const int  max_exponent = 0;
+         static const int  max_exponent10 = 0;
+
+         static const bool has_infinity = false;
+         static const bool has_quiet_NaN = false;
+         static const bool has_signaling_NaN = false;
+         static const float_denorm_style has_denorm = denorm_absent;
+         static const bool has_denorm_loss = false;
+         static bool infinity() throw() { return 0; }
+         static bool quiet_NaN() throw() { return 0; }
+         static bool signaling_NaN() throw() { return 0; }
+         static bool denorm_min() throw() { return 0; }
+
+         static const bool is_iec559 = false;
+         static const bool is_bounded = true;
+         static const bool is_modulo = false;
+
+         static const bool traps = false;
+         static const bool tinyness_before = false;
+         static const float_round_style round_style = round_toward_zero;
+       };
+     }
+
+ +

[Tokyo:  The LWG desires wording that specifies exact values +rather than more general wording in the original proposed +resolution.]

+ + +

[Post-Tokyo:  At the request of the LWG in Tokyo, Nico +Josuttis provided the above wording.]

+ + + + + + +
+

185. Questionable use of term "inline"

+

Section: 20.5 [function.objects] Status: WP + Submitter: UK Panel Date: 1999-07-26

+

View all other issues in [function.objects].

+

View all issues with WP status.

+

Discussion:

+

Paragraph 4 of 20.5 [function.objects] says:

+
+

 [Example: To negate every element of a: transform(a.begin(), a.end(), + a.begin(), negate<double>()); The corresponding functions will inline + the addition and the negation. end example]

+
+

(Note: The "addition" referred to in the above is in para 3) we can +find no other wording, except this (non-normative) example which suggests that +any "inlining" will take place in this case.

+

Indeed both:

+
+

17.4.4.3 Global Functions [lib.global.functions] 1 It is + unspecified whether any global functions in the C++ Standard Library + are defined as inline (7.1.2).

+
+

and

+
+

17.4.4.4 Member Functions [lib.member.functions] 1 It is + unspecified whether any member functions in the C++ Standard Library + are defined as inline (7.1.2).

+
+

take care to state that this may indeed NOT be the case.

+

Thus the example "mandates" behavior that is explicitly +not required elsewhere.

+ + +

Proposed resolution:

+

In 20.5 [function.objects] paragraph 1, remove the sentence:

+
+

They are important for the effective use of the library.

+
+

Remove 20.5 [function.objects] paragraph 2, which reads:

+
+

Using function objects together with function templates + increases the expressive power of the library as well as making the + resulting code much more efficient.

+
+

In 20.5 [function.objects] paragraph 4, remove the sentence:

+
+

The corresponding functions will inline the addition and the + negation.

+
+ +

[Kona: The LWG agreed there was a defect.]

+ +

[Tokyo: The LWG crafted the proposed resolution.]

+ + + + + + +
+

186. bitset::set() second parameter should be bool

+

Section: 23.3.5.2 [bitset.members] Status: WP + Submitter: Darin Adler Date: 1999-08-13

+

View all other issues in [bitset.members].

+

View all issues with WP status.

+

Discussion:

+

In section 23.3.5.2 [bitset.members], paragraph 13 defines the +bitset::set operation to take a second parameter of type int. The +function tests whether this value is non-zero to determine whether to +set the bit to true or false. The type of this second parameter should +be bool. For one thing, the intent is to specify a Boolean value. For +another, the result type from test() is bool. In addition, it's +possible to slice an integer that's larger than an int. This can't +happen with bool, since conversion to bool has the semantic of +translating 0 to false and any non-zero value to true.

+ + +

Proposed resolution:

+

In 23.3.5 [template.bitset] Para 1 Replace:

+
+
bitset<N>& set(size_t pos, int val = true ); 
+
+

With:

+
+
bitset<N>& set(size_t pos, bool val = true );
+
+

In 23.3.5.2 [bitset.members] Para 12(.5) Replace:

+
+
bitset<N>& set(size_t pos, int val = 1 );
+
+

With:

+
+
bitset<N>& set(size_t pos, bool val = true );
+
+ +

[Kona: The LWG agrees with the description.  Andy Sawyer will work +on better P/R wording.]

+ +

[Post-Tokyo: Andy provided the above wording.]

+ + + +

Rationale:

+

bool is a better choice. It is believed that binary +compatibility is not an issue, because this member function is +usually implemented as inline, and because it is already +the case that users cannot rely on the type of a pointer to a +nonvirtual member of a standard library class.

+ + + + + +
+

187. iter_swap underspecified

+

Section: 25.2.3 [alg.swap] Status: WP + Submitter: Andrew Koenig Date: 1999-08-14

+

View all other issues in [alg.swap].

+

View all issues with WP status.

+

Discussion:

+

The description of iter_swap in 25.2.2 paragraph 7,says that it +``exchanges the values'' of the objects to which two iterators +refer.

What it doesn't say is whether it does so using swap +or using the assignment operator and copy constructor.

This +question is an important one to answer, because swap is specialized to +work efficiently for standard containers.
For example:

+
+
vector<int> v1, v2;
+iter_swap(&v1, &v2);
+
+

Is this call to iter_swap equivalent to calling swap(v1, v2)?  +Or is it equivalent to

+
+
{
+vector<int> temp = v1;
+v1 = v2;
+v2 = temp;
+}
+
+

The first alternative is O(1); the second is O(n).

+

A LWG member, Dave Abrahams, comments:

+
+

Not an objection necessarily, but I want to point out the cost of +that requirement:

+
+

iter_swap(list<T>::iterator, list<T>::iterator)

+
+

can currently be specialized to be more efficient than +iter_swap(T*,T*) for many T (by using splicing). Your proposal would +make that optimization illegal. 

+
+ +

[Kona: The LWG notes the original need for iter_swap was proxy iterators +which are no longer permitted.]

+ + + +

Proposed resolution:

+

Change the effect clause of iter_swap in 25.2.2 paragraph 7 from:

+
+

Exchanges the values pointed to by the two iterators a and b.

+
+

to

+
+

swap(*a, *b).

+
+ + + +

Rationale:

+

It's useful to say just what iter_swap does. There may be + some iterators for which we want to specialize iter_swap, + but the fully general version should have a general specification.

+ +

Note that in the specific case of list<T>::iterator, +iter_swap should not be specialized as suggested above. That would do +much more than exchanging the two iterators' values: it would change +predecessor/successor relationships, possibly moving the iterator from +one list to another. That would surely be inappropriate.

+ + + + + +
+

189. setprecision() not specified correctly

+

Section: 27.4.2.2 [fmtflags.state] Status: TC + Submitter: Andrew Koenig Date: 1999-08-25

+

View all other issues in [fmtflags.state].

+

View all issues with TC status.

+

Discussion:

+

27.4.2.2 paragraph 9 claims that setprecision() sets the precision, +and includes a parenthetical note saying that it is the number of +digits after the decimal point.
+
+This claim is not strictly correct. For example, in the default +floating-point output format, setprecision sets the number of +significant digits printed, not the number of digits after the decimal +point.
+
+I would like the committee to look at the definition carefully and +correct the statement in 27.4.2.2

+ + +

Proposed resolution:

+

Remove from 27.4.2.2 [fmtflags.state], paragraph 9, the text +"(number of digits after the decimal point)".

+ + + + +
+

193. Heap operations description incorrect

+

Section: 25.3.6 [alg.heap.operations] Status: TC + Submitter: Markus Mauhart Date: 1999-09-24

+

View all issues with TC status.

+

Duplicate of: 216

+

Discussion:

+

25.3.6 [lib.alg.heap.operations] states two key properties of a heap [a,b), the first of them +is
+
+    `"(1) *a is the largest element"
+
+I think this is incorrect and should be changed to the wording in the proposed +resolution.

+

Actually there are two independent changes:

+
+

A-"part of largest equivalence class" instead of "largest", cause 25.3 + [lib.alg.sorting] asserts "strict weak ordering" for all its sub clauses.

+

B-Take +'an oldest' from that equivalence class, otherwise the heap functions +could not be used for a priority queue as explained in 23.2.3.2.2 +[lib.priqueue.members] (where I assume that a "priority queue" respects +priority AND time).

+
+ + +

Proposed resolution:

+

Change 25.3.6 [alg.heap.operations] property (1) from:

+
+

(1) *a is the largest element

+
+

to:

+
+

(1) There is no element greater than *a

+
+ + + + + +
+

195. Should basic_istream::sentry's constructor ever set eofbit?

+

Section: 27.6.1.1.3 [istream::sentry] Status: TC + Submitter: Matt Austern Date: 1999-10-13

+

View all other issues in [istream::sentry].

+

View all issues with TC status.

+

Discussion:

+

Suppose that is.flags() & ios_base::skipws is nonzero. +What should basic_istream<>::sentry's constructor do if it +reaches eof while skipping whitespace? 27.6.1.1.2/5 suggests it +should set failbit. Should it set eofbit as well? The standard +doesn't seem to answer that question.

+ +

On the one hand, nothing in 27.6.1.1.3 [istream::sentry] says that +basic_istream<>::sentry should ever set eofbit. On the +other hand, 27.6.1.1 [istream] paragraph 4 says that if +extraction from a streambuf "returns +traits::eof(), then the input function, except as explicitly +noted otherwise, completes its actions and does +setstate(eofbit)". So the question comes down to +whether basic_istream<>::sentry's constructor is an +input function.

+ +

Comments from Jerry Schwarz:

+
+

It was always my intention that eofbit should be set any time that a +virtual returned something to indicate eof, no matter what reason +iostream code had for calling the virtual.

+

+The motivation for this is that I did not want to require streambufs +to behave consistently if their virtuals are called after they have +signaled eof.

+

+The classic case is a streambuf reading from a UNIX file. EOF isn't +really a state for UNIX file descriptors. The convention is that a +read on UNIX returns 0 bytes to indicate "EOF", but the file +descriptor isn't shut down in any way and future reads do not +necessarily also return 0 bytes. In particular, you can read from +tty's on UNIX even after they have signaled "EOF". (It +isn't always understood that a ^D on UNIX is not an EOF indicator, but +an EOL indicator. By typing a "line" consisting solely of +^D you cause a read to return 0 bytes, and by convention this is +interpreted as end of file.)

+
+ + +

Proposed resolution:

+

Add a sentence to the end of 27.6.1.1.2 paragraph 2:

+
+

If is.rdbuf()->sbumpc() or is.rdbuf()->sgetc() +returns traits::eof(), the function calls +setstate(failbit | eofbit) (which may throw +ios_base::failure). +

+
+ + + + +
+

198. Validity of pointers and references unspecified after iterator destruction

+

Section: 24.1 [iterator.requirements] Status: WP + Submitter: Beman Dawes Date: 1999-11-03

+

View other active issues in [iterator.requirements].

+

View all other issues in [iterator.requirements].

+

View all issues with WP status.

+

Discussion:

+

+Is a pointer or reference obtained from an iterator still valid after +destruction of the iterator? +

+

+Is a pointer or reference obtained from an iterator still valid after the value +of the iterator changes? +

+
+
#include <iostream>
+#include <vector>
+#include <iterator>
+
+int main()
+{
+    typedef std::vector<int> vec_t;
+    vec_t v;
+    v.push_back( 1 );
+
+    // Is a pointer or reference obtained from an iterator still
+    // valid after destruction of the iterator?
+    int * p = &*v.begin();
+    std::cout << *p << '\n';  // OK?
+
+    // Is a pointer or reference obtained from an iterator still
+    // valid after the value of the iterator changes?
+    vec_t::iterator iter( v.begin() );
+    p = &*iter++;
+    std::cout << *p << '\n';  // OK?
+
+    return 0;
+}
+
+
+ +

The standard doesn't appear to directly address these +questions. The standard needs to be clarified. At least two real-world +cases have been reported where library implementors wasted +considerable effort because of the lack of clarity in the +standard. The question is important because requiring pointers and +references to remain valid has the effect for practical purposes of +prohibiting iterators from pointing to cached rather than actual +elements of containers.

+ +

The standard itself assumes that pointers and references obtained +from an iterator are still valid after iterator destruction or +change. The definition of reverse_iterator::operator*(), 24.4.1.3.3 [reverse.iter.conv], which returns a reference, defines +effects:

+ +
+
Iterator tmp = current;
+return *--tmp;
+
+

The definition of reverse_iterator::operator->(), 24.4.1.3.4 +[reverse.iter.op.star], which returns a pointer, defines effects:

+
+
return &(operator*());
+
+ +

Because the standard itself assumes pointers and references remain +valid after iterator destruction or change, the standard should say so +explicitly. This will also reduce the chance of user code breaking +unexpectedly when porting to a different standard library +implementation.

+ + +

Proposed resolution:

+

Add a new paragraph to 24.1 [iterator.requirements]:

+

+Destruction of an iterator may invalidate pointers and references +previously obtained from that iterator. +

+ +

Replace paragraph 1 of 24.4.1.3.3 [reverse.iter.conv] with:

+ +
+

Effects:

+
  this->tmp = current;
+  --this->tmp;
+  return *this->tmp;
+
+ +

+[Note: This operation must use an auxiliary member variable, +rather than a temporary variable, to avoid returning a reference that +persists beyond the lifetime of its associated iterator. (See +24.1 [iterator.requirements].) The name of this member variable is shown for +exposition only. --end note] +

+
+ +

[Post-Tokyo: The issue has been reformulated purely +in terms of iterators.]

+ + +

[Pre-Toronto: Steve Cleary pointed out the no-invalidation +assumption by reverse_iterator. The issue and proposed resolution was +reformulated yet again to reflect this reality.]

+ + +

[Copenhagen: Steve Cleary pointed out that reverse_iterator +assumes its underlying iterator has persistent pointers and +references. Andy Koenig pointed out that it is possible to rewrite +reverse_iterator so that it no longer makes such an assupmption. +However, this issue is related to issue 299. If we +decide it is intentional that p[n] may return by value +instead of reference when p is a Random Access Iterator, +other changes in reverse_iterator will be necessary.]

+ + + +

Rationale:

+

This issue has been discussed extensively. Note that it is +not an issue about the behavior of predefined iterators. It is +asking whether or not user-defined iterators are permitted to have +transient pointers and references. Several people presented examples +of useful user-defined iterators that have such a property; examples +include a B-tree iterator, and an "iota iterator" that doesn't point +to memory. Library implementors already seem to be able to cope with +such iterators: they take pains to avoid forming references to memory +that gets iterated past. The only place where this is a problem is +reverse_iterator, so this issue changes +reverse_iterator to make it work.

+ +

This resolution does not weaken any guarantees provided by +predefined iterators like list<int>::iterator. +Clause 23 should be reviewed to make sure that guarantees for +predefined iterators are as strong as users expect.

+ + + + + + +
+

199. What does allocate(0) return?

+

Section: 20.1.2 [allocator.requirements] Status: TC + Submitter: Matt Austern Date: 1999-11-19

+

View other active issues in [allocator.requirements].

+

View all other issues in [allocator.requirements].

+

View all issues with TC status.

+

Discussion:

+

+Suppose that A is a class that conforms to the +Allocator requirements of Table 32, and a is an +object of class A What should be the return +value of a.allocate(0)? Three reasonable +possibilities: forbid the argument 0, return +a null pointer, or require that the return value be a +unique non-null pointer. +

+ + +

Proposed resolution:

+

+Add a note to the allocate row of Table 32: +"[Note: If n == 0, the return value is unspecified. --end note]"

+ + +

Rationale:

+

A key to understanding this issue is that the ultimate use of +allocate() is to construct an iterator, and that iterator for zero +length sequences must be the container's past-the-end +representation. Since this already implies special case code, it +would be over-specification to mandate the return value. +

+ + + + +
+

200. Forward iterator requirements don't allow constant iterators

+

Section: 24.1.3 [forward.iterators] Status: WP + Submitter: Matt Austern Date: 1999-11-19

+

View all other issues in [forward.iterators].

+

View all issues with WP status.

+

Discussion:

+

+In table 74, the return type of the expression *a is given +as T&, where T is the iterator's value type. +For constant iterators, however, this is wrong. ("Value type" +is never defined very precisely, but it is clear that the value type +of, say, std::list<int>::const_iterator is supposed to be +int, not const int.) +

+ + +

Proposed resolution:

+

+In table 74, in the *a and *r++ rows, change the +return type from "T&" to "T& +if X is mutable, otherwise const T&". +In the a->m row, change the return type from +"U&" to "U& if X is mutable, +otherwise const U&". +

+ +

[Tokyo: The LWG believes this is the tip of a larger iceberg; +there are multiple const problems with the STL portion of the library +and that these should be addressed as a single package.  Note +that issue 180 has already been declared NAD Future for +that very reason.]

+ + +

[Redmond: the LWG thinks this is separable from other constness +issues. This issue is just cleanup; it clarifies language that was +written before we had iterator_traits. Proposed resolution was +modified: the original version only discussed *a. It was pointed out +that we also need to worry about *r++ and a->m.]

+ + + + + + + +
+

201. Numeric limits terminology wrong

+

Section: 18.2.1 [limits] Status: WP + Submitter: Stephen Cleary Date: 1999-12-21

+

View all other issues in [limits].

+

View all issues with WP status.

+

Discussion:

+

+In some places in this section, the terms "fundamental types" and +"scalar types" are used when the term "arithmetic types" is intended. +The current usage is incorrect because void is a fundamental type and +pointers are scalar types, neither of which should have +specializations of numeric_limits. +

+

[Lillehammer: it remains true that numeric_limits is using + imprecise language. However, none of the proposals for changed + wording are clearer. A redesign of numeric_limits is needed, but this + is more a task than an open issue.]

+ + + +

Proposed resolution:

+ +

+Change 18.2 [support.limits] to: +

+ +
+

+-1- The headers <limits>, <climits>, +<cfloat>, and <cinttypes> supply +characteristics of implementation-dependent fundamental +arithmetic types (3.9.1). +

+
+ +

+Change 18.2.1 [limits] to: +

+ +
+

+-1- The numeric_limits component provides a C++ program with +information about various properties of the implementation's +representation of the fundamental arithmetic +types. +

+

+-2- Specializations shall be provided for each fundamental +arithmetic type, both floating point and integer, including +bool. The member is_specialized shall be true +for all such specializations of numeric_limits. +

+

+-4- Non-fundamentalarithmetic standard types, such +as complex<T> (26.3.2), shall not have specializations. +

+
+ +

+Change 18.2.1.1 [numeric.limits] to: +

+ +
+

+-1- The member is_specialized makes it possible to distinguish +between fundamental types, which have specializations, and non-scalar types, +which do not. +

+
+ + + + + + +
+

202. unique() effects unclear when predicate not an equivalence relation

+

Section: 25.2.9 [alg.unique] Status: WP + Submitter: Andrew Koenig Date: 2000-01-13

+

View all other issues in [alg.unique].

+

View all issues with WP status.

+

Discussion:

+

+What should unique() do if you give it a predicate that is not an +equivalence relation? There are at least two plausible answers: +

+ +
+ +

+ 1. You can't, because 25.2.8 says that it it "eliminates all but + the first element from every consecutive group of equal + elements..." and it wouldn't make sense to interpret "equal" as + meaning anything but an equivalence relation. [It also doesn't + make sense to interpret "equal" as meaning ==, because then there + would never be any sense in giving a predicate as an argument at + all.] +

+ +

+ 2. The word "equal" should be interpreted to mean whatever the + predicate says, even if it is not an equivalence relation + (and in particular, even if it is not transitive). +

+ +
+ +

+The example that raised this question is from Usenet: +

+ +
+ +
int f[] = { 1, 3, 7, 1, 2 };
+int* z = unique(f, f+5, greater<int>());
+ +
+ +

+If one blindly applies the definition using the predicate +greater<int>, and ignore the word "equal", you get: +

+ +
+ +

+ Eliminates all but the first element from every consecutive group + of elements referred to by the iterator i in the range [first, last) + for which *i > *(i - 1). +

+ +
+ +

+The first surprise is the order of the comparison. If we wanted to +allow for the predicate not being an equivalence relation, then we +should surely compare elements the other way: pred(*(i - 1), *i). If +we do that, then the description would seem to say: "Break the +sequence into subsequences whose elements are in strictly increasing +order, and keep only the first element of each subsequence". So the +result would be 1, 1, 2. If we take the description at its word, it +would seem to call for strictly DEcreasing order, in which case the +result should be 1, 3, 7, 2.
+
+In fact, the SGI implementation of unique() does neither: It yields 1, +3, 7. +

+ + +

Proposed resolution:

+

Change 25.2.9 [alg.unique] paragraph 1 to:

+

+For a nonempty range, eliminates all but the first element from every +consecutive group of equivalent elements referred to by the iterator +i in the range [first+1, last) for which the following +conditions hold: *(i-1) == *i or pred(*(i-1), *i) != +false. +

+ +

+Also insert a new paragraph, paragraph 2a, that reads: "Requires: The +comparison function must be an equivalence relation." +

+ +

[Redmond: discussed arguments for and against requiring the +comparison function to be an equivalence relation. Straw poll: +14-2-5. First number is to require that it be an equivalence +relation, second number is to explicitly not require that it be an +equivalence relation, third number is people who believe they need +more time to consider the issue. A separate issue: Andy Sawyer +pointed out that "i-1" is incorrect, since "i" can refer to the first +iterator in the range. Matt provided wording to address this +problem.]

+ + +

[Curaçao: The LWG changed "... the range (first, +last)..." to "... the range [first+1, last)..." for +clarity. They considered this change close enough to editorial to not +require another round of review.]

+ + + + +

Rationale:

+

The LWG also considered an alternative resolution: change +25.2.9 [alg.unique] paragraph 1 to:

+ +

+For a nonempty range, eliminates all but the first element from every +consecutive group of elements referred to by the iterator +i in the range (first, last) for which the following +conditions hold: *(i-1) == *i or pred(*(i-1), *i) != +false. +

+ +

+Also insert a new paragraph, paragraph 1a, that reads: "Notes: The +comparison function need not be an equivalence relation." +

+ + +

Informally: the proposed resolution imposes an explicit requirement +that the comparison function be an equivalence relation. The +alternative resolution does not, and it gives enough information so +that the behavior of unique() for a non-equivalence relation is +specified. Both resolutions are consistent with the behavior of +existing implementations.

+ + + + + +
+

206. operator new(size_t, nothrow) may become unlinked to ordinary operator new if ordinary version replaced

+

Section: 18.5.1.1 [new.delete.single] Status: WP + Submitter: Howard Hinnant Date: 1999-08-29

+

View all other issues in [new.delete.single].

+

View all issues with WP status.

+

Discussion:

+

As specified, the implementation of the nothrow version of operator +new does not necessarily call the ordinary operator new, but may +instead simply call the same underlying allocator and return a null +pointer instead of throwing an exception in case of failure.

+ +

Such an implementation breaks code that replaces the ordinary +version of new, but not the nothrow version. If the ordinary version +of new/delete is replaced, and if the replaced delete is not +compatible with pointers returned from the library versions of new, +then when the replaced delete receives a pointer allocated by the +library new(nothrow), crash follows.

+ +

The fix appears to be that the lib version of new(nothrow) must +call the ordinary new. Thus when the ordinary new gets replaced, the +lib version will call the replaced ordinary new and things will +continue to work.

+ +

An alternative would be to have the ordinary new call +new(nothrow). This seems sub-optimal to me as the ordinary version of +new is the version most commonly replaced in practice. So one would +still need to replace both ordinary and nothrow versions if one wanted +to replace the ordinary version.

+ +

Another alternative is to put in clear text that if one version is +replaced, then the other must also be replaced to maintain +compatibility. Then the proposed resolution below would just be a +quality of implementation issue. There is already such text in +paragraph 7 (under the new(nothrow) version). But this nuance is +easily missed if one reads only the paragraphs relating to the +ordinary new.

+ +

+N2158 +has been written explaining the rationale for the proposed resolution below. +

+ + + +

Proposed resolution:

+

+Change 18.5.1.1 [new.delete.single]: +

+ +
+
void* operator new(std::size_t size, const std::nothrow_t&) throw();
+
+
+

+-5- Effects: Same as above, except that it is called by a placement +version of a new-expression when a C++ program prefers a null pointer result as +an error indication, instead of a bad_alloc exception. +

+ +

+-6- Replaceable: a C++ program may define a function with this function +signature that displaces the default version defined by the C++ Standard +library. +

+ +

+-7- Required behavior: Return a non-null pointer to suitably aligned +storage (3.7.4), or else return a null pointer. This nothrow version of operator +new returns a pointer obtained as if acquired from the (possibly +replaced) ordinary version. This requirement is binding on a replacement +version of this function. +

+ +

+-8- Default behavior: +

+
    +
  • +Calls operator new(size). +
  • +
  • +If the call to operator new(size) returns normally, returns +the result of that call, else +
  • +
  • +if the call to operator new(size) throws an exception, returns +a null pointer. +
  • +
  • +Executes a loop: Within the loop, the function first attempts to allocate the +requested storage. Whether the attempt involves a call to the Standard C library +function malloc is unspecified. +
  • +
  • +Returns a pointer to the allocated storage if the attempt is successful. +Otherwise, if the last argument to set_new_handler() was a null +pointer, return a null pointer. +
  • +
  • +Otherwise, the function calls the current new_handler (18.5.2.2). If the +called function returns, the loop repeats. +
  • +
  • +The loop terminates when an attempt to allocate the requested storage is +successful or when a called new_handler function does not return. If the +called new_handler function terminates by throwing a bad_alloc +exception, the function returns a null pointer. +
  • +
+

+-9- [Example: +

+
T* p1 = new T;                 // throws bad_alloc if it fails
+T* p2 = new(nothrow) T;        // returns 0 if it fails
+
+

+--end example] +

+
+ +
void operator delete(void* ptr) throw();
+void operator delete(void* ptr, const std::nothrow_t&) throw();
+
+ +
+

+-10- Effects: The deallocation function (3.7.4.2) called by a +delete-expression to render the value of ptr invalid. +

+

+-11- Replaceable: a C++ program may define a function with this function +signature that displaces the default version defined by the C++ Standard +library. +

+

+-12- Requires: the value of ptr is null or the value +returned by an earlier call to the default (possibly +replaced) operator new(std::size_t) or operator +new(std::size_t, const std::nothrow_t&). +

+

+-13- Default behavior: +

+
    +
  • +For a null value of ptr, do nothing. +
  • +
  • +Any other value of ptr shall be a value returned earlier by a +call to the default operator new, which was not invalidated by an +intervening call to operator delete(void*) (17.4.3.7). For such a +non-null value of ptr, reclaims storage allocated by the earlier +call to the default operator new. +
  • +
+

+-14- Remarks: It is unspecified under what conditions part or all of +such reclaimed storage is allocated by a subsequent call to operator +new or any of calloc, malloc, or realloc, +declared in <cstdlib>. +

+
+ +
void operator delete(void* ptr, const std::nothrow_t&) throw();
+
+ +
+

+-15- Effects: Same as above, except that it is called by the +implementation when an exception propagates from a nothrow placement version +of the new-expression (i.e. when the constructor throws an exception). +

+

+-16- Replaceable: a C++ program may define a function with this function +signature that displaces the default version defined by the C++ Standard +library. +

+

+-17- Requires: the value of ptr is null or the +value returned by an earlier call to the (possibly replaced) operator +new(std::size_t) or operator new(std::size_t, const +std::nothrow_t&).

+

+-18- Default behavior: Calls operator delete(ptr). +

+
+ +
+ +

+Change 18.5.1.2 [new.delete.array] +

+ +
+
void* operator new[](std::size_t size, const std::nothrow_t&) throw();
+
+ +
+

+-5- Effects: Same as above, except that it is called by a placement +version of a new-expression when a C++ program prefers a null pointer result as +an error indication, instead of a bad_alloc exception. +

+ +

+-6- Replaceable: a C++ program can define a function with this function +signature that displaces the default version defined by the C++ Standard +library. +

+ +

+-7- Required behavior: Same as for operator new(std::size_t, +const std::nothrow_t&). This nothrow version of operator new[] +returns a pointer obtained as if acquired from the ordinary version. +Return a non-null pointer to suitably aligned storage (3.7.4), or else +return a null pointer. This nothrow version of operator new returns a pointer +obtained as if acquired from the (possibly replaced) operator +new[](std::size_t size). This requirement is binding on a +replacement version of this function. +

+ +

+-8- Default behavior: Returns operator new(size, +nothrow). +

+ +
    +
  • +Calls operator new[](size). +
  • +
  • +If the call to operator new[](size) returns normally, returns +the result of that call, else +
  • +
  • +if the call to operator new[](size) throws an exception, returns +a null pointer. +
  • +
+
+ +
void operator delete[](void* ptr) throw(); 
+void operator delete[](void* ptr, const std::nothrow_t&) throw();
+
+ +
+

+-9- Effects: The deallocation function (3.7.4.2) called by the +array form of a delete-expression to render the value of +ptr invalid. +

+ +

+-10- Replaceable: a C++ program can define a function with this function +signature that displaces the default version defined by the C++ Standard +library. +

+ +

+-11- Requires: the value of +ptr is null or the value returned by an earlier call to +operator new[](std::size_t) or operator new[](std::size_t, const +std::nothrow_t&). +

+ +

+-12- Default behavior: Calls operator delete(ptr) or +operator delete[](ptr, std::nothrow) respectively. +

+
+ +
+ + + +

Rationale:

+

Yes, they may become unlinked, and that is by design. If a user +replaces one, the user should also replace the other.

+ +

[ +Reopened due to a gcc conversation between Howard, Martin and Gaby. Forwarding +or not is visible behavior to the client and it would be useful for the client +to know which behavior it could depend on. +]

+ + +

[ +Batavia: Robert voiced serious reservations about backwards compatibility for +his customers. +]

+ + + + + + +
+

208. Unnecessary restriction on past-the-end iterators

+

Section: 24.1 [iterator.requirements] Status: TC + Submitter: Stephen Cleary Date: 2000-02-02

+

View other active issues in [iterator.requirements].

+

View all other issues in [iterator.requirements].

+

View all issues with TC status.

+

Discussion:

+

In 24.1 paragraph 5, it is stated ". . . Dereferenceable and +past-the-end values are always non-singular."

+

This places an unnecessary restriction on past-the-end iterators for +containers with forward iterators (for example, a singly-linked list). If the +past-the-end value on such a container was a well-known singular value, it would +still satisfy all forward iterator requirements.

+

Removing this restriction would allow, for example, a singly-linked list +without a "footer" node.

+

This would have an impact on existing code that expects past-the-end +iterators obtained from different (generic) containers being not equal.

+ + +

Proposed resolution:

+

Change 24.1 [iterator.requirements] paragraph 5, the last sentence, from:

+
+

Dereferenceable and past-the-end values are always non-singular.

+
+

to:

+
+

Dereferenceable values are always non-singular. 

+
+ + +

Rationale:

+

For some kinds of containers, including singly linked lists and +zero-length vectors, null pointers are perfectly reasonable past-the-end +iterators. Null pointers are singular. +

+ + + + +
+

209. basic_string declarations inconsistent

+

Section: 21.3 [basic.string] Status: TC + Submitter: Igor Stauder Date: 2000-02-11

+

View other active issues in [basic.string].

+

View all other issues in [basic.string].

+

View all issues with TC status.

+

Discussion:

+

In Section 21.3 [basic.string] the basic_string member function +declarations use a consistent style except for the following functions:

+
+
void push_back(const charT);
+basic_string& assign(const basic_string&);
+void swap(basic_string<charT,traits,Allocator>&);
+
+

- push_back, assign, swap: missing argument name 
+- push_back: use of const with charT (i.e. POD type passed by value +not by reference - should be charT or const charT& )
+- swap: redundant use of template parameters in argument +basic_string<charT,traits,Allocator>&

+ + +

Proposed resolution:

+

In Section 21.3 [basic.string] change the basic_string member +function declarations push_back, assign, and swap to:

+
+
void push_back(charT c); 
+
+basic_string& assign(const basic_string& str);
+void swap(basic_string& str);
+
+ + +

Rationale:

+

Although the standard is in general not consistent in declaration +style, the basic_string declarations are consistent other than the +above. The LWG felt that this was sufficient reason to merit the +change. +

+ + + + +
+

210. distance first and last confused

+

Section: 25 [algorithms] Status: TC + Submitter: Lisa Lippincott Date: 2000-02-15

+

View all other issues in [algorithms].

+

View all issues with TC status.

+

Discussion:

+

In paragraph 9 of section 25 [algorithms], it is written:

+
+

In the description of the algorithms operators + and - are used + for some of the iterator categories for which they do not have to + be defined. In these cases the semantics of [...] a-b is the same + as of
+
+      return distance(a, b);

+
+ + +

Proposed resolution:

+

On the last line of paragraph 9 of section 25 [algorithms] change +"a-b" to "b-a".

+ + +

Rationale:

+

There are two ways to fix the defect; change the description to b-a +or change the return to distance(b,a). The LWG preferred the +former for consistency.

+ + + + +
+

211. operator>>(istream&, string&) doesn't set failbit

+

Section: 21.3.8.9 [string.io] Status: TC + Submitter: Scott Snyder Date: 2000-02-04

+

View all other issues in [string.io].

+

View all issues with TC status.

+

Discussion:

+

The description of the stream extraction operator for std::string (section +21.3.7.9 [lib.string.io]) does not contain a requirement that failbit be set in +the case that the operator fails to extract any characters from the input +stream.

+

This implies that the typical construction

+
+
std::istream is;
+std::string str;
+...
+while (is >> str) ... ;
+
+

(which tests failbit) is not required to terminate at EOF.

+

Furthermore, this is inconsistent with other extraction operators, +which do include this requirement. (See sections 27.6.1.2 [istream.formatted] and 27.6.1.3 [istream.unformatted]), where this +requirement is present, either explicitly or implicitly, for the +extraction operators. It is also present explicitly in the description +of getline (istream&, string&, charT) in section 21.3.8.9 [string.io] paragraph 8.)

+ + +

Proposed resolution:

+

Insert new paragraph after paragraph 2 in section 21.3.8.9 [string.io]:

+
+ +

If the function extracts no characters, it calls +is.setstate(ios::failbit) which may throw ios_base::failure +(27.4.4.3).

+
+ + + + +
+

212. Empty range behavior unclear for several algorithms

+

Section: 25.3.7 [alg.min.max] Status: TC + Submitter: Nico Josuttis Date: 2000-02-26

+

View all other issues in [alg.min.max].

+

View all issues with TC status.

+

Discussion:

+

The standard doesn't specify what min_element() and max_element() shall +return if the range is empty (first equals last). The usual implementations +return last. This problem seems also apply to partition(), stable_partition(), +next_permutation(), and prev_permutation().

+ + +

Proposed resolution:

+

In 25.3.7 [alg.min.max] - Minimum and maximum, paragraphs 7 and +9, append: Returns last if first==last.

+ + +

Rationale:

+

The LWG looked in some detail at all of the above mentioned +algorithms, but believes that except for min_element() and +max_element() it is already clear that last is returned if first == +last.

+ + + + +
+

214. set::find() missing const overload

+

Section: 23.3.3 [set], 23.3.4 [multiset] Status: WP + Submitter: Judy Ward Date: 2000-02-28

+

View all other issues in [set].

+

View all issues with WP status.

+

Duplicate of: 450

+

Discussion:

+

The specification for the associative container requirements in +Table 69 state that the find member function should "return +iterator; const_iterator for constant a". The map and multimap +container descriptions have two overloaded versions of find, but set +and multiset do not, all they have is:

+
+
iterator find(const key_type & x) const;
+
+ + +

Proposed resolution:

+

Change the prototypes for find(), lower_bound(), upper_bound(), and +equal_range() in section 23.3.3 [set] and section 23.3.4 [multiset] to each have two overloads:

+
+
iterator find(const key_type & x);
+const_iterator find(const key_type & x) const;
+
iterator lower_bound(const key_type & x);
+const_iterator lower_bound(const key_type & x) const;
+
iterator upper_bound(const key_type & x);
+const_iterator upper_bound(const key_type & x) const;
+
pair<iterator, iterator> equal_range(const key_type & x);
+pair<const_iterator, const_iterator> equal_range(const key_type & x) const;
+
+ +

[Tokyo: At the request of the LWG, Judy Ward provided wording +extending the proposed resolution to lower_bound, upper_bound, and +equal_range.]

+ + + + + + +
+

217. Facets example (Classifying Japanese characters) contains errors

+

Section: 22.2.8 [facets.examples] Status: TC + Submitter: Martin Sebor Date: 2000-02-29

+

View all other issues in [facets.examples].

+

View all issues with TC status.

+

Discussion:

+

The example in 22.2.8, paragraph 11 contains the following errors:

+

1) The member function `My::JCtype::is_kanji()' is non-const; the function +must be const in order for it to be callable on a const object (a reference to +which which is what std::use_facet<>() returns).

+

2) In file filt.C, the definition of `JCtype::id' must be qualified with the +name of the namespace `My'.

+

3) In the definition of `loc' and subsequently in the call to use_facet<>() +in main(), the name of the facet is misspelled: it should read `My::JCtype' +rather than `My::JCType'.

+ + +

Proposed resolution:

+

Replace the "Classifying Japanese characters" example in 22.2.8, +paragraph 11 with the following:

+
#include <locale>
+
namespace My {
+    using namespace std;
+    class JCtype : public locale::facet {
+    public:
+        static locale::id id;     //  required for use as a new locale facet
+        bool is_kanji (wchar_t c) const;
+        JCtype() {}
+    protected:
+        ~JCtype() {}
+    };
+}
+
//  file:  filt.C
+#include <iostream>
+#include <locale>
+#include "jctype"                 //  above
+std::locale::id My::JCtype::id;   //  the static  JCtype  member
+declared above.
+
int main()
+{
+    using namespace std;
+    typedef ctype<wchar_t> wctype;
+    locale loc(locale(""),              //  the user's preferred locale...
+               new My::JCtype);         //  and a new feature ...
+    wchar_t c = use_facet<wctype>(loc).widen('!');
+    if (!use_facet<My::JCtype>(loc).is_kanji(c))
+        cout << "no it isn't!" << endl;
+    return 0;
+}
+ + + + +
+

220. ~ios_base() usage valid?

+

Section: 27.4.2.7 [ios.base.cons] Status: TC + Submitter: Jonathan Schilling, Howard Hinnant Date: 2000-03-13

+

View all issues with TC status.

+

Discussion:

+

The pre-conditions for the ios_base destructor are described in 27.4.2.7 +paragraph 2:

+
+

Effects: Destroys an object of class ios_base. Calls each registered + callback pair (fn,index) (27.4.2.6) as (*fn)(erase_event,*this,index) at such + time that any ios_base member function called from within fn has well defined + results.

+
+

But what is not clear is: If no callback functions were ever registered, does +it matter whether the ios_base members were ever initialized?

+

For instance, does this program have defined behavior:

+
+
#include <ios>
+
class D : public std::ios_base { };
+
int main() { D d; }
+
+

It seems that registration of a callback function would surely affect the +state of an ios_base. That is, when you register a callback function with an +ios_base, the ios_base must record that fact somehow.

+

But if after construction the ios_base is in an indeterminate state, and that +state is not made determinate before the destructor is called, then how would +the destructor know if any callbacks had indeed been registered? And if the +number of callbacks that had been registered is indeterminate, then is not the +behavior of the destructor undefined?

+

By comparison, the basic_ios class description in 27.4.4.1 paragraph 2 makes +it explicit that destruction before initialization results in undefined +behavior.

+ + +

Proposed resolution:

+

Modify 27.4.2.7 paragraph 1 from

+
+

Effects: Each ios_base member has an indeterminate value after + construction.

+
+

to

+
+

Effects: Each ios_base member has an indeterminate +value after construction. These members must be initialized by calling +basic_ios::init. If an ios_base object is destroyed before these +initializations have taken place, the behavior is undefined.

+
+ + + + +
+

221. num_get<>::do_get stage 2 processing broken

+

Section: 22.2.2.1.2 [facet.num.get.virtuals] Status: WP + Submitter: Matt Austern Date: 2000-03-14

+

View other active issues in [facet.num.get.virtuals].

+

View all other issues in [facet.num.get.virtuals].

+

View all issues with WP status.

+

Discussion:

+

Stage 2 processing of numeric conversion is broken.

+ +

Table 55 in 22.2.2.1.2 says that when basefield is 0 the integral +conversion specifier is %i. A %i specifier determines a number's base +by its prefix (0 for octal, 0x for hex), so the intention is clearly +that a 0x prefix is allowed. Paragraph 8 in the same section, +however, describes very precisely how characters are processed. (It +must be done "as if" by a specified code fragment.) That +description does not allow a 0x prefix to be recognized.

+ +

Very roughly, stage 2 processing reads a char_type ct. It converts +ct to a char, not by using narrow but by looking it up in a +translation table that was created by widening the string literal +"0123456789abcdefABCDEF+-". The character "x" is +not found in that table, so it can't be recognized by stage 2 +processing.

+ + +

Proposed resolution:

+

In 22.2.2.1.2 paragraph 8, replace the line:

+
+
static const char src[] = "0123456789abcdefABCDEF+-";
+
+

with the line:

+
+
static const char src[] = "0123456789abcdefxABCDEFX+-";
+
+ + +

Rationale:

+

If we're using the technique of widening a string literal, the +string literal must contain every character we wish to recognize. +This technique has the consequence that alternate representations +of digits will not be recognized. This design decision was made +deliberately, with full knowledge of that limitation.

+ + + + + +
+

222. Are throw clauses necessary if a throw is already implied by the effects clause?

+

Section: 17.3.1.3 [structure.specifications] Status: TC + Submitter: Judy Ward Date: 2000-03-17

+

View all other issues in [structure.specifications].

+

View all issues with TC status.

+

Discussion:

+

Section 21.3.6.8 describes the basic_string::compare function this way:

+
+
21.3.6.8 - basic_string::compare [lib.string::compare]
+
+int compare(size_type pos1, size_type n1,
+                const basic_string<charT,traits,Allocator>&  str ,
+                size_type  pos2 , size_type  n2 ) const;
+
+-4- Returns: 
+
+    basic_string<charT,traits,Allocator>(*this,pos1,n1).compare(
+                 basic_string<charT,traits,Allocator>(str,pos2,n2)) .
+
+

and the constructor that's implicitly called by the above is +defined to throw an out-of-range exception if pos > str.size(). See +section 21.3.1 [string.require] paragraph 4.

+ +

On the other hand, the compare function descriptions themselves don't have +"Throws: " clauses and according to 17.3.1.3, paragraph 3, elements +that do not apply to a function are omitted.

+

So it seems there is an inconsistency in the standard -- are the +"Effects" clauses correct, or are the "Throws" clauses +missing?

+ + +

Proposed resolution:

+

In 17.3.1.3 [structure.specifications] paragraph 3, the footnote 148 attached to +the sentence "Descriptions of function semantics contain the +following elements (as appropriate):", insert the word +"further" so that the foot note reads:

+
+

To save space, items that do not apply to a function are + omitted. For example, if a function does not specify any further + preconditions, there will be no "Requires" paragraph.

+
+ + +

Rationale:

+

The standard is somewhat inconsistent, but a failure to note a +throw condition in a throws clause does not grant permission not to +throw. The inconsistent wording is in a footnote, and thus +non-normative. The proposed resolution from the LWG clarifies the +footnote.

+ + + + +
+

223. reverse algorithm should use iter_swap rather than swap

+

Section: 25.2.10 [alg.reverse] Status: TC + Submitter: Dave Abrahams Date: 2000-03-21

+

View all issues with TC status.

+

Discussion:

+

Shouldn't the effects say "applies iter_swap to all pairs..."?

+ + +

Proposed resolution:

+

In 25.2.10 [alg.reverse], replace:

+

+ Effects: For each non-negative integer i <= (last - first)/2, + applies swap to all pairs of iterators first + i, (last - i) - 1. +

+

with:

+

+ Effects: For each non-negative integer i <= (last - first)/2, + applies iter_swap to all pairs of iterators first + i, (last - i) - 1. +

+ + + + +
+

224. clear() complexity for associative containers refers to undefined N

+

Section: 23.1.2 [associative.reqmts] Status: TC + Submitter: Ed Brey Date: 2000-03-23

+

View all other issues in [associative.reqmts].

+

View all issues with TC status.

+

Discussion:

+

In the associative container requirements table in 23.1.2 paragraph 7, +a.clear() has complexity "log(size()) + N". However, the meaning of N +is not defined.

+ + +

Proposed resolution:

+

In the associative container requirements table in 23.1.2 paragraph +7, the complexity of a.clear(), change "log(size()) + N" to +"linear in size()".

+ + +

Rationale:

+

It's the "log(size())", not the "N", that is in +error: there's no difference between O(N) and O(N + +log(N)). The text in the standard is probably an incorrect +cut-and-paste from the range version of erase.

+ + + + +
+

225. std:: algorithms use of other unqualified algorithms

+

Section: 17.4.4.3 [global.functions] Status: WP + Submitter: Dave Abrahams Date: 2000-04-01

+

View all other issues in [global.functions].

+

View all issues with WP status.

+

Discussion:

+

Are algorithms in std:: allowed to use other algorithms without qualification, so functions in +user namespaces might be found through Koenig lookup?

+

For example, a popular standard library implementation includes this +implementation of std::unique:

+
+
namespace std {
+    template <class _ForwardIter>
+    _ForwardIter unique(_ForwardIter __first, _ForwardIter __last) {
+      __first = adjacent_find(__first, __last);
+      return unique_copy(__first, __last, __first);
+    }
+    }
+
+

Imagine two users on opposite sides of town, each using unique on his own +sequences bounded by my_iterators . User1 looks at his standard library +implementation and says, "I know how to implement a more efficient +unique_copy for my_iterators", and writes:

+
+
namespace user1 {
+    class my_iterator;
+    // faster version for my_iterator
+    my_iterator unique_copy(my_iterator, my_iterator, my_iterator);
+    }
+
+

user1::unique_copy() is selected by Koenig lookup, as he intended.

+

User2 has other needs, and writes:

+
+
namespace user2 {
+    class my_iterator;
+    // Returns true iff *c is a unique copy of *a and *b.
+    bool unique_copy(my_iterator a, my_iterator b, my_iterator c);
+    }
+
+

User2 is shocked to find later that his fully-qualified use of +std::unique(user2::my_iterator, user2::my_iterator, user2::my_iterator) fails to +compile (if he's lucky). Looking in the standard, he sees the following Effects +clause for unique():

+
+

Effects: Eliminates all but the first element from every consecutive group + of equal elements referred to by the iterator i in the range [first, last) for + which the following corresponding conditions hold: *i == *(i - 1) or pred(*i, + *(i - 1)) != false

+
+

The standard gives user2 absolutely no reason to think he can interfere with +std::unique by defining names in namespace user2. His standard library has been +built with the template export feature, so he is unable to inspect the +implementation. User1 eventually compiles his code with another compiler, and +his version of unique_copy silently stops being called. Eventually, he realizes +that he was depending on an implementation detail of his library and had no +right to expect his unique_copy() to be called portably.

+

On the face of it, and given above scenario, it may seem obvious that the +implementation of unique() shown is non-conforming because it uses unique_copy() +rather than ::std::unique_copy(). Most standard library implementations, +however, seem to disagree with this notion.

+

[Tokyo:  Steve Adamczyk from +the core working group indicates that "std::" is sufficient;  +leading "::" qualification is not required because any namespace +qualification is sufficient to suppress Koenig lookup.]

+ + +

Proposed resolution:

+

Add a paragraph and a note at the end of +17.4.4.3 [global.functions]:

+
+ +

Unless otherwise specified, no global or non-member function in the +standard library shall use a function from another namespace which is +found through argument-dependent name lookup (3.4.2 [basic.lookup.argdep]).

+ +

[Note: the phrase "unless otherwise specified" is intended to +allow Koenig lookup in cases like that of ostream_iterators:
+ +
+ Effects:

+
+

*out_stream << value;
+ if(delim != 0) *out_stream << delim;
+ return (*this);

+

--end note]

+
+
+ +

[Tokyo: The LWG agrees that this is a defect in the standard, but +is as yet unsure if the proposed resolution is the best +solution. Furthermore, the LWG believes that the same problem of +unqualified library names applies to wording in the standard itself, +and has opened issue 229 accordingly. Any resolution of +issue 225 should be coordinated with the resolution of +issue 229.]

+ + +

[Toronto: The LWG is not sure if this is a defect in the +standard. Most LWG members believe that an implementation of +std::unique like the one quoted in this issue is already +illegal, since, under certain circumstances, its semantics are not +those specified in the standard. The standard's description of +unique does not say that overloading adjacent_find +should have any effect.]

+ + +

[Curaçao: An LWG-subgroup spent an afternoon working on issues +225, 226, and 229. Their conclusion was that the issues should be +separated into an LWG portion (Howard's paper, N1387=02-0045), and a +EWG portion (Dave will write a proposal). The LWG and EWG had +(separate) discussions of this plan the next day. The proposed +resolution for this issue is in accordance with Howard's paper.]

+ + + + +

Rationale:

+

It could be argued that this proposed isn't strictly necessary, + that the Standard doesn't grant implementors license to write a + standard function that behaves differently than specified in the + Standard just because of an unrelated user-defined name in some + other namespace. However, this is at worst a clarification. It is + surely right that algorithsm shouldn't pick up random names, that + user-defined names should have no effect unless otherwise specified. + Issue 226 deals with the question of when it is + appropriate for the standard to explicitly specify otherwise.

+ + + + + +
+

226. User supplied specializations or overloads of namespace std function templates

+

Section: 17.4.3.1 [reserved.names] Status: WP + Submitter: Dave Abrahams Date: 2000-04-01

+

View all other issues in [reserved.names].

+

View all issues with WP status.

+

Discussion:

+

The issues are: 

+

1. How can a 3rd party library implementor (lib1) write a version of a standard +algorithm which is specialized to work with his own class template? 

+

2. How can another library implementor (lib2) write a generic algorithm which +will take advantage of the specialized algorithm in lib1?

+

This appears to be the only viable answer under current language rules:

+
+
namespace lib1
+{
+    // arbitrary-precision numbers using T as a basic unit
+    template <class T>
+    class big_num { //...
+    };
+    
+
    // defining this in namespace std is illegal (it would be an
+    // overload), so we hope users will rely on Koenig lookup
+    template <class T>
+    void swap(big_int<T>&, big_int<T>&);
+}
+
#include <algorithm>
+namespace lib2
+{
+    template <class T>
+    void generic_sort(T* start, T* end)
+    {
+            ...
+        // using-declaration required so we can work on built-in types
+        using std::swap;
+        // use Koenig lookup to find specialized algorithm if available
+        swap(*x, *y);
+    }
+}
+
+

This answer has some drawbacks. First of all, it makes writing lib2 difficult +and somewhat slippery. The implementor needs to remember to write the +using-declaration, or generic_sort will fail to compile when T is a built-in +type. The second drawback is that the use of this style in lib2 effectively +"reserves" names in any namespace which defines types which may +eventually be used with lib2. This may seem innocuous at first when applied to +names like swap, but consider more ambiguous names like unique_copy() instead. +It is easy to imagine the user wanting to define these names differently in his +own namespace. A definition with semantics incompatible with the standard +library could cause serious problems (see issue 225).

+

Why, you may ask, can't we just partially specialize std::swap()? It's +because the language doesn't allow for partial specialization of function +templates. If you write:

+
+
namespace std
+{
+    template <class T>
+    void swap(lib1::big_int<T>&, lib1::big_int<T>&);
+}
+
+

You have just overloaded std::swap, which is illegal under the current +language rules. On the other hand, the following full specialization is legal:

+
+
namespace std
+{
+    template <>
+    void swap(lib1::other_type&, lib1::other_type&);
+}
+
+ +

This issue reflects concerns raised by the "Namespace issue +with specialized swap" thread on comp.lang.c++.moderated. A +similar set of concerns was earlier raised on the boost.org mailing +list and the ACCU-general mailing list. Also see library reflector +message c++std-lib-7354.

+ +

+J. C. van Winkel points out (in c++std-lib-9565) another unexpected +fact: it's impossible to output a container of std::pair's using copy +and an ostream_iterator, as long as both pair-members are built-in or +std:: types. That's because a user-defined operator<< for (for +example) std::pair<const std::string, int> will not be found: +lookup for operator<< will be performed only in namespace std. +Opinions differed on whether or not this was a defect, and, if so, +whether the defect is that something is wrong with user-defined +functionality and std, or whether it's that the standard library does +not provide an operator<< for std::pair<>. +

+ + + +

Proposed resolution:

+ +

Adopt the wording proposed in Howard Hinnant's paper + N1523=03-0106, "Proposed Resolution To LWG issues 225, 226, 229".

+ + +

[Tokyo: Summary, "There is no conforming way to extend +std::swap for user defined templates."  The LWG agrees that +there is a problem. Would like more information before +proceeding. This may be a core issue. Core issue 229 has been opened +to discuss the core aspects of this problem. It was also noted that +submissions regarding this issue have been received from several +sources, but too late to be integrated into the issues list. +]

+ + +

[Post-Tokyo: A paper with several proposed resolutions, +J16/00-0029==WG21/N1252, "Shades of namespace std functions +" by Alan Griffiths, is in the Post-Tokyo mailing. It +should be considered a part of this issue.]

+ + +

[Toronto: Dave Abrahams and Peter Dimov have proposed a +resolution that involves core changes: it would add partial +specialization of function template. The Core Working Group is +reluctant to add partial specialization of function templates. It is +viewed as a large change, CWG believes that proposal presented leaves +some syntactic issues unanswered; if the CWG does add partial +specialization of function templates, it wishes to develop its own +proposal. The LWG continues to believe that there is a serious +problem: there is no good way for users to force the library to use +user specializations of generic standard library functions, and in +certain cases (e.g. transcendental functions called by +valarray and complex) this is important. Koenig +lookup isn't adequate, since names within the library must be +qualified with std (see issue 225), specialization doesn't +work (we don't have partial specialization of function templates), and +users aren't permitted to add overloads within namespace std. +]

+ + +

[Copenhagen: Discussed at length, with no consensus. Relevant +papers in the pre-Copenhagen mailing: N1289, N1295, N1296. Discussion +focused on four options. (1) Relax restrictions on overloads within +namespace std. (2) Mandate that the standard library use unqualified +calls for swap and possibly other functions. (3) Introduce +helper class templates for swap and possibly other functions. +(4) Introduce partial specialization of function templates. Every +option had both support and opposition. Straw poll (first number is +support, second is strongly opposed): (1) 6, 4; (2) 6, 7; (3) 3, 8; +(4) 4, 4.]

+ + +

[Redmond: Discussed, again no consensus. Herb presented an +argument that a user who is defining a type T with an +associated swap should not be expected to put that +swap in namespace std, either by overloading or by partial +specialization. The argument is that swap is part of +T's interface, and thus should to in the same namespace as +T and only in that namespace. If we accept this argument, +the consequence is that standard library functions should use +unqualified call of swap. (And which other functions? Any?) +A small group (Nathan, Howard, Jeremy, Dave, Matt, Walter, Marc) will +try to put together a proposal before the next meeting.]

+ + +

[Curaçao: An LWG-subgroup spent an afternoon working on issues +225, 226, and 229. Their conclusion was that the issues should be +separated into an LWG portion (Howard's paper, N1387=02-0045), and a +EWG portion (Dave will write a proposal). The LWG and EWG had +(separate) discussions of this plan the next day. The proposed +resolution is the one proposed by Howard.]

+ + +

[Santa Cruz: the LWG agreed with the general direction of + Howard's paper, N1387. (Roughly: Koenig lookup is disabled unless + we say otherwise; this issue is about when we do say otherwise.) + However, there were concerns about wording. Howard will provide new + wording. Bill and Jeremy will review it.]

+ + +

[Kona: Howard proposed the new wording. The LWG accepted his + proposed resolution.]

+ + + + +

Rationale:

+

Informally: introduce a Swappable concept, and specify that the + value types of the iterators passed to certain standard algorithms + (such as iter_swap, swap_ranges, reverse, rotate, and sort) conform + to that concept. The Swappable concept will make it clear that + these algorithms use unqualified lookup for the calls + to swap. Also, in 26.5.3.3 [valarray.transcend] paragraph 1, + state that the valarray transcendentals use unqualified lookup.

+ + + + + +
+

227. std::swap() should require CopyConstructible or DefaultConstructible arguments

+

Section: 25.2.3 [alg.swap] Status: TC + Submitter: Dave Abrahams Date: 2000-04-09

+

View all other issues in [alg.swap].

+

View all issues with TC status.

+

Discussion:

+

25.2.2 reads:

+
+

template<class T> void swap(T& a, T& b);
+
+ Requires: Type T is Assignable (_lib.container.requirements_).
+ Effects: Exchanges values stored in two locations.

+
+

The only reasonable** generic implementation of swap requires construction of a + new temporary copy of one of its arguments:

+
+
template<class T> void swap(T& a, T& b);
+  {
+      T tmp(a);
+      a = b;
+      b = tmp;
+  }
+
+

But a type which is only Assignable cannot be swapped by this implementation.

+

**Yes, there's also an unreasonable implementation which would require T to be + DefaultConstructible instead of CopyConstructible. I don't think this is worthy + of consideration:

+
+
template<class T> void swap(T& a, T& b);
+{
+    T tmp;
+    tmp = a;
+    a = b;
+    b = tmp;
+}
+
+ + +

Proposed resolution:

+

Change 25.2.2 paragraph 1 from:

+
+

Requires: Type T is Assignable (23.1).

+
+

to:

+
+

Requires: Type T is CopyConstructible (20.1.3) and Assignable (23.1)

+
+ + + + + +
+

228. Incorrect specification of "..._byname" facets

+

Section: 22.2 [locale.categories] Status: WP + Submitter: Dietmar Kühl Date: 2000-04-20

+

View other active issues in [locale.categories].

+

View all other issues in [locale.categories].

+

View all issues with WP status.

+

Discussion:

+

The sections 22.2.1.2 [locale.ctype.byname], 22.2.1.5 +[locale.codecvt.byname], +sref ref="22.2.1.6", 22.2.3.2 [locale.numpunct.byname], 22.2.4.2 +[locale.collate.byname], 22.2.5.4 [locale.time.put.byname], 22.2.6.4 +[locale.moneypunct.byname], and 22.2.7.2 [locale.messages.byname] +overspecify the +definitions of the "..._byname" classes by listing a bunch +of virtual functions. At the same time, no semantics of these +functions are defined. Real implementations do not define these +functions because the functional part of the facets is actually +implemented in the corresponding base classes and the constructor of +the "..._byname" version just provides suitable date used by +these implementations. For example, the 'numpunct' methods just return +values from a struct. The base class uses a statically initialized +struct while the derived version reads the contents of this struct +from a table. However, no virtual function is defined in +'numpunct_byname'.

+ +

For most classes this does not impose a problem but specifically +for 'ctype' it does: The specialization for 'ctype_byname<char>' +is required because otherwise the semantics would change due to the +virtual functions defined in the general version for 'ctype_byname': +In 'ctype<char>' the method 'do_is()' is not virtual but it is +made virtual in both 'ctype<cT>' and 'ctype_byname<cT>'. +Thus, a class derived from 'ctype_byname<char>' can tell whether +this class is specialized or not under the current specification: +Without the specialization, 'do_is()' is virtual while with +specialization it is not virtual.

+ + +

Proposed resolution:

+

  Change section 22.2.1.2 (lib.locale.ctype.byname) to become:

+
     namespace std {
+       template <class charT>
+       class ctype_byname : public ctype<charT> {
+       public:
+         typedef ctype<charT>::mask mask;
+         explicit ctype_byname(const char*, size_t refs = 0);
+       protected:
+        ~ctype_byname();             //  virtual
+       };
+     }
+

  Change section 22.2.1.6 (lib.locale.codecvt.byname) to become:

+
    namespace std {
+      template <class internT, class externT, class stateT>
+      class codecvt_byname : public codecvt<internT, externT, stateT> {
+      public:
+       explicit codecvt_byname(const char*, size_t refs = 0);
+      protected:
+      ~codecvt_byname();             //  virtual
+       };
+     }
+
+

  Change section 22.2.3.2 (lib.locale.numpunct.byname) to become:

+
     namespace std {
+       template <class charT>
+       class numpunct_byname : public numpunct<charT> {
+     //  this class is specialized for  char  and  wchar_t.
+       public:
+         typedef charT                char_type;
+         typedef basic_string<charT>  string_type;
+         explicit numpunct_byname(const char*, size_t refs = 0);
+       protected:
+        ~numpunct_byname();          //  virtual
+       };
+     }
+

  Change section 22.2.4.2 (lib.locale.collate.byname) to become:

+
     namespace std {
+       template <class charT>
+       class collate_byname : public collate<charT> {
+       public:
+         typedef basic_string<charT> string_type;
+         explicit collate_byname(const char*, size_t refs = 0);
+       protected:
+        ~collate_byname();           //  virtual
+       };
+     }
+

  Change section 22.2.5.2 (lib.locale.time.get.byname) to become:

+
     namespace std {
+       template <class charT, class InputIterator = istreambuf_iterator<charT> >
+       class time_get_byname : public time_get<charT, InputIterator> {
+       public:
+         typedef time_base::dateorder dateorder;
+         typedef InputIterator        iter_type
+
         explicit time_get_byname(const char*, size_t refs = 0);
+       protected:
+        ~time_get_byname();          //  virtual
+       };
+     }
+

  Change section 22.2.5.4 (lib.locale.time.put.byname) to become:

+
     namespace std {
+       template <class charT, class OutputIterator = ostreambuf_iterator<charT> >
+       class time_put_byname : public time_put<charT, OutputIterator>
+       {
+       public:
+         typedef charT          char_type;
+         typedef OutputIterator iter_type;
+
         explicit time_put_byname(const char*, size_t refs = 0);
+       protected:
+        ~time_put_byname();          //  virtual
+       };
+     }"
+

  Change section 22.2.6.4 (lib.locale.moneypunct.byname) to become:

+
     namespace std {
+       template <class charT, bool Intl = false>
+       class moneypunct_byname : public moneypunct<charT, Intl> {
+       public:
+         typedef money_base::pattern pattern;
+         typedef basic_string<charT> string_type;
+
         explicit moneypunct_byname(const char*, size_t refs = 0);
+       protected:
+        ~moneypunct_byname();        //  virtual
+       };
+     }
+

  Change section 22.2.7.2 (lib.locale.messages.byname) to become:

+
     namespace std {
+       template <class charT>
+       class messages_byname : public messages<charT> {
+       public:
+         typedef messages_base::catalog catalog;
+         typedef basic_string<charT>    string_type;
+
         explicit messages_byname(const char*, size_t refs = 0);
+       protected:
+        ~messages_byname();          //  virtual
+       };
+     }
+

Remove section 22.2.1.4 [locale.codecvt] completely (because in +this case only those members are defined to be virtual which are +defined to be virtual in 'ctype<cT>'.)

+ +

[Post-Tokyo: Dietmar Kühl submitted this issue at the request of +the LWG to solve the underlying problems raised by issue 138.]

+ + +

[Copenhagen: proposed resolution was revised slightly, to remove +three last virtual functions from messages_byname.]

+ + + + + + + +
+

229. Unqualified references of other library entities

+

Section: 17.4.1.1 [contents] Status: WP + Submitter: Steve Clamage Date: 2000-04-19

+

View all issues with WP status.

+

Discussion:

+

Throughout the library chapters, the descriptions of library entities refer +to other library entities without necessarily qualifying the names.

+ +

For example, section 25.2.2 "Swap" describes the effect of +swap_ranges in terms of the unqualified name "swap". This section +could reasonably be interpreted to mean that the library must be implemented so +as to do a lookup of the unqualified name "swap", allowing users to +override any ::std::swap function when Koenig lookup applies.

+ +

Although it would have been best to use explicit qualification with +"::std::" throughout, too many lines in the standard would have to be +adjusted to make that change in a Technical Corrigendum.

+ +

Issue 182, which addresses qualification of +size_t, is a special case of this. +

+ + +

Proposed resolution:

+

To section 17.4.1.1 "Library contents" Add the following paragraph:

+
+

Whenever a name x defined in the standard library is mentioned, the name x + is assumed to be fully qualified as ::std::x, unless explicitly described + otherwise. For example, if the Effects section for library function F is + described as calling library function G, the function ::std::G is meant.

+
+ +

[Post-Tokyo: Steve Clamage submitted this issue at the request of +the LWG to solve a problem in the standard itself similar to the +problem within implementations of library identified by issue 225. Any resolution of issue 225 should be +coordinated with the resolution of this issue.]

+ + +

[post-Toronto: Howard is undecided about whether it is +appropriate for all standard library function names referred to in +other standard library functions to be explicitly qualified by +std: it is common advice that users should define global +functions that operate on their class in the same namespace as the +class, and this requires argument-dependent lookup if those functions +are intended to be called by library code. Several LWG members are +concerned that valarray appears to require argument-dependent lookup, +but that the wording may not be clear enough to fall under +"unless explicitly described otherwise".]

+ + +

[Curaçao: An LWG-subgroup spent an afternoon working on issues +225, 226, and 229. Their conclusion was that the issues should be +separated into an LWG portion (Howard's paper, N1387=02-0045), and a +EWG portion (Dave will write a proposal). The LWG and EWG had +(separate) discussions of this plan the next day. This paper resolves +issues 225 and 226. In light of that resolution, the proposed +resolution for the current issue makes sense.]

+ + + + + + + +
+

230. Assignable specified without also specifying CopyConstructible

+

Section: 17 [library] Status: WP + Submitter: Beman Dawes Date: 2000-04-26

+

View all other issues in [library].

+

View all issues with WP status.

+

Discussion:

+

Issue 227 identified an instance (std::swap) where +Assignable was specified without also specifying +CopyConstructible. The LWG asked that the standard be searched to +determine if the same defect existed elsewhere.

+ +

There are a number of places (see proposed resolution below) where +Assignable is specified without also specifying +CopyConstructible. There are also several cases where both are +specified. For example, 26.4.1 [rand.req].

+ + +

Proposed resolution:

+

In 23.1 [container.requirements] table 65 for value_type: +change "T is Assignable" to "T is CopyConstructible and +Assignable" +

+ +

In 23.1.2 [associative.reqmts] table 69 X::key_type; change +"Key is Assignable" to "Key is +CopyConstructible and Assignable"
+

+ +

In 24.1.2 [output.iterators] paragraph 1, change: +

+
+

A class or a built-in type X satisfies the requirements of an +output iterator if X is an Assignable type (23.1) and also the +following expressions are valid, as shown in Table 73: +

+
+

to: +

+
+

A class or a built-in type X satisfies the requirements of an +output iterator if X is a CopyConstructible (20.1.3) and Assignable +type (23.1) and also the following expressions are valid, as shown in +Table 73: +

+
+ +

[Post-Tokyo: Beman Dawes submitted this issue at the request of +the LWG. He asks that the 25.2.5 [alg.replace] and 25.2.6 [alg.fill] changes be studied carefully, as it is not clear that +CopyConstructible is really a requirement and may be +overspecification.]

+ + +

[Portions of the resolution for issue 230 have been superceded by +the resolution of issue 276.]

+ + + + +

Rationale:

+

The original proposed resolution also included changes to input +iterator, fill, and replace. The LWG believes that those changes are +not necessary. The LWG considered some blanket statement, where an +Assignable type was also required to be Copy Constructible, but +decided against this because fill and replace really don't require the +Copy Constructible property.

+ + + + +
+

231. Precision in iostream?

+

Section: 22.2.2.2.2 [facet.num.put.virtuals] Status: WP + Submitter: James Kanze, Stephen Clamage Date: 2000-04-25

+

View all other issues in [facet.num.put.virtuals].

+

View all issues with WP status.

+

Discussion:

+

What is the following program supposed to output?

+
#include <iostream>
+
+    int
+    main()
+    {
+        std::cout.setf( std::ios::scientific , std::ios::floatfield ) ;
+        std::cout.precision( 0 ) ;
+        std::cout << 1.00 << '\n' ;
+        return 0 ;
+    }
+

From my C experience, I would expect "1e+00"; this is what +printf("%.0e" , 1.00 ); does. G++ outputs +"1.000000e+00".

+ +

The only indication I can find in the standard is 22.2.2.2.2/11, +where it says "For conversion from a floating-point type, if +(flags & fixed) != 0 or if str.precision() > 0, then +str.precision() is specified in the conversion specification." +This is an obvious error, however, fixed is not a mask for a field, +but a value that a multi-bit field may take -- the results of and'ing +fmtflags with ios::fixed are not defined, at least not if +ios::scientific has been set. G++'s behavior corresponds to what might +happen if you do use (flags & fixed) != 0 with a typical +implementation (floatfield == 3 << something, fixed == 1 +<< something, and scientific == 2 << something).

+ +

Presumably, the intent is either (flags & floatfield) != 0, or +(flags & floatfield) == fixed; the first gives something more or +less like the effect of precision in a printf floating point +conversion. Only more or less, of course. In order to implement printf +formatting correctly, you must know whether the precision was +explicitly set or not. Say by initializing it to -1, instead of 6, and +stating that for floating point conversions, if precision < -1, 6 +will be used, for fixed point, if precision < -1, 1 will be used, +etc. Plus, of course, if precision == 0 and flags & floatfield == +0, 1 should be = used. But it probably isn't necessary to emulate all +of the anomalies of printf:-).

+ + +

Proposed resolution:

+

+Replace 22.2.2.2.2 [facet.num.put.virtuals], paragraph 11, with the following +sentence: +

+

+For conversion from a floating-point type, +str.precision() is specified in the conversion +specification. +

+ + +

Rationale:

+

The floatfield determines whether numbers are formatted as if +with %f, %e, or %g. If the fixed bit is set, it's %f, +if scientific it's %e, and if both bits are set, or +neither, it's %g.

+

Turning to the C standard, a precision of 0 is meaningful +for %f and %e. For %g, precision 0 is taken to be the same as +precision 1.

+

The proposed resolution has the effect that if neither +fixed nor scientific is set we'll be +specifying a precision of 0, which will be internally +turned into 1. There's no need to call it out as a special +case.

+

The output of the above program will be "1e+00".

+ +

[Post-Curaçao: Howard provided improved wording covering the case +where precision is 0 and mode is %g.]

+ + + + + + + +
+

232. "depends" poorly defined in 17.4.3.1

+

Section: 17.4.3.1 [reserved.names] Status: WP + Submitter: Peter Dimov Date: 2000-04-18

+

View all other issues in [reserved.names].

+

View all issues with WP status.

+

Discussion:

+

17.4.3.1/1 uses the term "depends" to limit the set of allowed +specializations of standard templates to those that "depend on a +user-defined name of external linkage."

+

This term, however, is not adequately defined, making it possible to +construct a specialization that is, I believe, technically legal according to +17.4.3.1/1, but that specializes a standard template for a built-in type such as +'int'.

+

The following code demonstrates the problem:

+
+
#include <algorithm>
+
template<class T> struct X
+{
+ typedef T type;
+};
+
namespace std
+{
+ template<> void swap(::X<int>::type& i, ::X<int>::type& j);
+}
+
+ + +

Proposed resolution:

+

Change "user-defined name" to "user-defined +type".

+ + +

Rationale:

+

This terminology is used in section 2.5.2 and 4.1.1 of The C++ +Programming Language. It disallows the example in the issue, +since the underlying type itself is not user-defined. The only +possible problem I can see is for non-type templates, but there's no +possible way for a user to come up with a specialization for bitset, +for example, that might not have already been specialized by the +implementor?

+ +

[Toronto: this may be related to issue 120.]

+ + +

[post-Toronto: Judy provided the above proposed resolution and +rationale.]

+ + + + + + +
+

233. Insertion hints in associative containers

+

Section: 23.1.2 [associative.reqmts] Status: WP + Submitter: Andrew Koenig Date: 2000-04-30

+

View all other issues in [associative.reqmts].

+

View all issues with WP status.

+

Duplicate of: 192, 246

+

Discussion:

+

+If mm is a multimap and p is an iterator +into the multimap, then mm.insert(p, x) inserts +x into mm with p as a hint as +to where it should go. Table 69 claims that the execution time is +amortized constant if the insert winds up taking place adjacent to +p, but does not say when, if ever, this is guaranteed to +happen. All it says it that p is a hint as to where to +insert. +

+

+The question is whether there is any guarantee about the relationship +between p and the insertion point, and, if so, what it +is. +

+

+I believe the present state is that there is no guarantee: The user +can supply p, and the implementation is allowed to +disregard it entirely. +

+ +

Additional comments from Nathan:
+ +The vote [in Redmond] was on whether to elaborately specify the use of +the hint, or to require behavior only if the value could be inserted +adjacent to the hint. I would like to ensure that we have a chance to +vote for a deterministic treatment: "before, if possible, otherwise +after, otherwise anywhere appropriate", as an alternative to the +proposed "before or after, if possible, otherwise [...]". +

+ +

[Toronto: there was general agreement that this is a real defect: +when inserting an element x into a multiset that already contains +several copies of x, there is no way to know whether the hint will be +used. The proposed resolution was that the new element should always +be inserted as close to the hint as possible. So, for example, if +there is a subsequence of equivalent values, then providing a.begin() +as the hint means that the new element should be inserted before the +subsequence even if a.begin() is far away. JC van Winkel supplied +precise wording for this proposed resolution, and also for an +alternative resolution in which hints are only used when they are +adjacent to the insertion point.]

+ + +

[Copenhagen: the LWG agreed to the original proposed resolution, +in which an insertion hint would be used even when it is far from the +insertion point. This was contingent on seeing a reference +implementation showing that it is possible to implement this +requirement without loss of efficiency. John Potter provided such a +reference implementation.]

+ + +

[Redmond: The LWG was reluctant to adopt the proposal that +emerged from Copenhagen: it seemed excessively complicated, and went +beyond fixing the defect that we identified in Toronto. PJP provided +the new wording described in this issue. Nathan agrees that we +shouldn't adopt the more detailed semantics, and notes: "we know that +you can do it efficiently enough with a red-black tree, but there are +other (perhaps better) balanced tree techniques that might differ +enough to make the detailed semantics hard to satisfy."]

+ + +

[Curaçao: Nathan should give us the alternative wording he +suggests so the LWG can decide between the two options.]

+ + +

[Lillehammer: The LWG previously rejected the more detailed + semantics, because it seemed more loike a new feature than like + defect fixing. We're now more sympathetic to it, but we (especially + Bill) are still worried about performance. N1780 describes a naive + algorithm, but it's not clear whether there is a non-naive + implementation. Is it possible to implement this as efficently as + the current version of insert?]

+ + +

[Post Lillehammer: +N1780 +updated in post meeting mailing with +feedback from Lillehammer with more information regarding performance. +]

+ + +

[ +Batavia: +1780 +accepted with minor wording changes in the proposed wording (reflected in the +proposed resolution below). Concerns about the performance of the algorithm +were satisfactorily met by +1780. +371 already handles the stability of equal ranges +and so that part of the resolution from +1780 +is no longer needed (or reflected in the proposed wording below). +]

+ + + + +

Proposed resolution:

+ +

+Change the indicated rows of the "Associative container requirements" Table in +23.1.2 [associative.reqmts] to: +

+ +

+ + + + + + + + + + + + + +
Associative container requirements
expression return typeassertion/note
pre/post-condition
complexity
a_eq.insert(t)iterator +inserts t and returns the iterator pointing to the newly inserted +element. If a range containing elements equivalent to t exists in +a_eq, t is inserted at the end of that range. + +logarithmic +
a.insert(p,t)iterator +inserts t if and only if there is no element with key equivalent to the +key of t in containers with unique keys; always inserts t in containers +with equivalent keys. always returns the iterator pointing to the element with key +equivalent to the key of t. iterator p is a hint pointing to where +the insert should start to search. t is inserted as close as possible +to the position just prior to p. + +logarithmic in general, but amortized constant if t is inserted right after + before p. +
+
+ + + + + + +
+

234. Typos in allocator definition

+

Section: 20.6.1.1 [allocator.members] Status: WP + Submitter: Dietmar Kühl Date: 2000-04-24

+

View all other issues in [allocator.members].

+

View all issues with WP status.

+

Discussion:

+

In paragraphs 12 and 13 the effects of construct() and +destruct() are described as returns but the functions actually +return void.

+ + +

Proposed resolution:

+

Substitute "Returns" by "Effect".

+ + + + +
+

235. No specification of default ctor for reverse_iterator

+

Section: 24.4.1.1 [reverse.iterator] Status: WP + Submitter: Dietmar Kühl Date: 2000-04-24

+

View all issues with WP status.

+

Discussion:

+

The declaration of reverse_iterator lists a default +constructor. However, no specification is given what this constructor +should do.

+ + +

Proposed resolution:

+

In section 24.4.1.3.1 [reverse.iter.cons] add the following + paragraph:

+
+

reverse_iterator()

+ +

Default initializes current. Iterator operations + applied to the resulting iterator have defined behavior if and + only if the corresponding operations are defined on a default + constructed iterator of type Iterator.

+
+

[pre-Copenhagen: Dietmar provide wording for proposed + resolution.]

+ + + + + + +
+

237. Undefined expression in complexity specification

+

Section: 23.2.2.1 [deque.cons] Status: WP + Submitter: Dietmar Kühl Date: 2000-04-24

+

View all other issues in [deque.cons].

+

View all issues with WP status.

+

Discussion:

+

The complexity specification in paragraph 6 says that the complexity +is linear in first - last. Even if operator-() is +defined on iterators this term is in general undefined because it +would have to be last - first.

+ + +

Proposed resolution:

+

Change paragraph 6 from

+

Linear in first - last.

+

to become

+

Linear in distance(first, last).

+ + + + +
+

238. Contradictory results of stringbuf initialization.

+

Section: 27.7.1.1 [stringbuf.cons] Status: WP + Submitter: Dietmar Kühl Date: 2000-05-11

+

View all issues with WP status.

+

Discussion:

+

In 27.7.1.1 paragraph 4 the results of calling the constructor of +'basic_stringbuf' are said to be str() == str. This is fine +that far but consider this code:

+ +
  std::basic_stringbuf<char> sbuf("hello, world", std::ios_base::openmode(0));
+  std::cout << "'" << sbuf.str() << "'\n";
+
+ +

Paragraph 3 of 27.7.1.1 basically says that in this case neither +the output sequence nor the input sequence is initialized and +paragraph 2 of 27.7.1.2 basically says that str() either +returns the input or the output sequence. None of them is initialized, +ie. both are empty, in which case the return from str() is +defined to be basic_string<cT>().

+ +

However, probably only test cases in some testsuites will detect this +"problem"...

+ + +

Proposed resolution:

+

Remove 27.7.1.1 paragraph 4.

+ + +

Rationale:

+

We could fix 27.7.1.1 paragraph 4, but there would be no point. If +we fixed it, it would say just the same thing as text that's already +in the standard.

+ + + + +
+

239. Complexity of unique() and/or unique_copy incorrect

+

Section: 25.2.9 [alg.unique] Status: WP + Submitter: Angelika Langer Date: 2000-05-15

+

View all other issues in [alg.unique].

+

View all issues with WP status.

+

Discussion:

+

The complexity of unique and unique_copy are inconsistent with each +other and inconsistent with the implementations.  The standard +specifies:

+ +

for unique():

+ +

-3- Complexity: If the range (last - first) is not empty, exactly +(last - first) - 1 applications of the corresponding predicate, otherwise +no applications of the predicate.

+ +

for unique_copy():

+ +

-7- Complexity: Exactly last - first applications of the corresponding +predicate.

+ +

+The implementations do it the other way round: unique() applies the +predicate last-first times and unique_copy() applies it last-first-1 +times.

+ +

As both algorithms use the predicate for pair-wise comparison of +sequence elements I don't see a justification for unique_copy() +applying the predicate last-first times, especially since it is not +specified to which pair in the sequence the predicate is applied +twice.

+ + +

Proposed resolution:

+

Change both complexity sections in 25.2.9 [alg.unique] to:

+ +

Complexity: For nonempty ranges, exactly last - first - 1 +applications of the corresponding predicate.

+ + + + + + +
+

240. Complexity of adjacent_find() is meaningless

+

Section: 25.1.5 [alg.adjacent.find] Status: WP + Submitter: Angelika Langer Date: 2000-05-15

+

View all issues with WP status.

+

Discussion:

+

The complexity section of adjacent_find is defective:

+ +
+
template <class ForwardIterator>
+ForwardIterator adjacent_find(ForwardIterator first, ForwardIterator last
+                              BinaryPredicate pred);
+
+ +

-1- Returns: The first iterator i such that both i and i + 1 are in +the range [first, last) for which the following corresponding +conditions hold: *i == *(i + 1), pred(*i, *(i + 1)) != false. Returns +last if no such iterator is found.

+ +

-2- Complexity: Exactly find(first, last, value) - first applications +of the corresponding predicate. +

+
+ +

In the Complexity section, it is not defined what "value" +is supposed to mean. My best guess is that "value" means an +object for which one of the conditions pred(*i,value) or +pred(value,*i) is true, where i is the iterator defined in the Returns +section. However, the value type of the input sequence need not be +equality-comparable and for this reason the term find(first, last, +value) - first is meaningless.

+ +

A term such as find_if(first, last, bind2nd(pred,*i)) - first or +find_if(first, last, bind1st(pred,*i)) - first might come closer to +the intended specification. Binders can only be applied to function +objects that have the function call operator declared const, which is +not required of predicates because they can have non-const data +members. For this reason, a specification using a binder could only be +an "as-if" specification.

+ + +

Proposed resolution:

+

Change the complexity section in 25.1.5 [alg.adjacent.find] to:

+

+For a nonempty range, exactly min((i - first) + 1, +(last - first) - 1) applications of the +corresponding predicate, where i is adjacent_find's +return value. +

+ +

[Copenhagen: the original resolution specified an upper +bound. The LWG preferred an exact count.]

+ + + + + + + +
+

241. Does unique_copy() require CopyConstructible and Assignable?

+

Section: 25.2.9 [alg.unique] Status: WP + Submitter: Angelika Langer Date: 2000-05-15

+

View all other issues in [alg.unique].

+

View all issues with WP status.

+

Discussion:

+ +

Some popular implementations of unique_copy() create temporary +copies of values in the input sequence, at least if the input iterator +is a pointer. Such an implementation is built on the assumption that +the value type is CopyConstructible and Assignable.

+ +

It is common practice in the standard that algorithms explicitly +specify any additional requirements that they impose on any of the +types used by the algorithm. An example of an algorithm that creates +temporary copies and correctly specifies the additional requirements +is accumulate(), 26.4.1 [rand.req].

+ +

Since the specifications of unique() and unique_copy() do not +require CopyConstructible and Assignable of the InputIterator's value +type the above mentioned implementations are not standard-compliant. I +cannot judge whether this is a defect in the standard or a defect in +the implementations.

+ + +

Proposed resolution:

+

In 25.2.8 change:

+ +

+-4- Requires: The ranges [first, last) and [result, result+(last-first)) +shall not overlap. +

+ +

to:

+ +
+

-4- Requires: The ranges [first, last) and [result, + result+(last-first)) shall not overlap. The expression *result = + *first must be valid. If neither InputIterator nor OutputIterator + meets the requirements of forward iterator then the value type of + InputIterator must be copy constructible. Otherwise copy + constructible is not required.

+
+ +

[Redmond: the original proposed resolution didn't impose an +explicit requirement that the iterator's value type must be copy +constructible, on the grounds that an input iterator's value type must +always be copy constructible. Not everyone in the LWG thought that +this requirement was clear from table 72. It has been suggested that +it might be possible to implement unique_copy without +requiring assignability, although current implementations do impose +that requirement. Howard provided new wording.]

+ + +

[ +Curaçao: The LWG changed the PR editorially to specify +"neither...nor...meet..." as clearer than +"both...and...do not meet...". Change believed to be so +minor as not to require re-review. +]

+ + + + + + + + +
+

242. Side effects of function objects

+

Section: 25.2.4 [alg.transform], 26.4 [rand] Status: WP + Submitter: Angelika Langer Date: 2000-05-15

+

View all other issues in [alg.transform].

+

View all issues with WP status.

+

Discussion:

+

The algorithms transform(), accumulate(), inner_product(), +partial_sum(), and adjacent_difference() require that the function +object supplied to them shall not have any side effects.

+ +

The standard defines a side effect in 1.9 [intro.execution] as:

+

-7- Accessing an object designated by a volatile lvalue (basic.lval), +modifying an object, calling a library I/O function, or calling a function +that does any of those operations are all side effects, which are changes +in the state of the execution environment.

+ +

As a consequence, the function call operator of a function object supplied +to any of the algorithms listed above cannot modify data members, cannot +invoke any function that has a side effect, and cannot even create and +modify temporary objects.  It is difficult to imagine a function object +that is still useful under these severe limitations. For instance, any +non-trivial transformator supplied to transform() might involve creation +and modification of temporaries, which is prohibited according to the current +wording of the standard.

+ +

On the other hand, popular implementations of these algorithms exhibit +uniform and predictable behavior when invoked with a side-effect-producing +function objects. It looks like the strong requirement is not needed for +efficient implementation of these algorithms.

+ +

The requirement of  side-effect-free function objects could be +replaced by a more relaxed basic requirement (which would hold for all +function objects supplied to any algorithm in the standard library):

+

A function objects supplied to an algorithm shall not invalidate +any iterator or sequence that is used by the algorithm. Invalidation of +the sequence includes destruction of the sorting order if the algorithm +relies on the sorting order (see section 25.3 - Sorting and related operations +[lib.alg.sorting]).

+ +

I can't judge whether it is intended that the function objects supplied +to transform(), accumulate(), inner_product(), partial_sum(), or adjacent_difference() +shall not modify sequence elements through dereferenced iterators.

+ +

It is debatable whether this issue is a defect or a change request. +Since the consequences for user-supplied function objects are drastic and +limit the usefulness of the algorithms significantly I would consider it +a defect.

+ + +

Proposed resolution:

+ +

Things to notice about these changes:

+ +
    +
  1. The fully-closed ("[]" as opposed to half-closed "[)" ranges + are intentional. we want to prevent side-effects from + invalidating the end iterators.
  2. + +
  3. That has the unintentional side-effect of prohibiting + modification of the end element as a side-effect. This could + conceivably be significant in some cases.
  4. + +
  5. The wording also prevents side-effects from modifying elements + of the output sequence. I can't imagine why anyone would want + to do this, but it is arguably a restriction that implementors + don't need to place on users.
  6. + +
  7. Lifting the restrictions imposed in #2 and #3 above is possible + and simple, but would require more verbiage.
  8. +
+ +

Change 25.2.3/2 from:

+ +

+ -2- Requires: op and binary_op shall not have any side effects. +

+ +

to:

+ +

+ -2- Requires: in the ranges [first1, last1], [first2, first2 + + (last1 - first1)] and [result, result + (last1- first1)], op and + binary_op shall neither modify elements nor invalidate iterators or + subranges. + [Footnote: The use of fully closed ranges is intentional --end footnote] +

+ + +

Change 25.2.3/2 from:

+ +

+ -2- Requires: op and binary_op shall not have any side effects. +

+ +

to:

+ +

+ -2- Requires: op and binary_op shall not invalidate iterators or + subranges, or modify elements in the ranges [first1, last1], + [first2, first2 + (last1 - first1)], and [result, result + (last1 + - first1)]. + [Footnote: The use of fully closed ranges is intentional --end footnote] +

+ + +

Change 26.4.1/2 from:

+ +

+ -2- Requires: T must meet the requirements of CopyConstructible + (lib.copyconstructible) and Assignable (lib.container.requirements) + types. binary_op shall not cause side effects. +

+ +

to:

+ +

+ -2- Requires: T must meet the requirements of CopyConstructible + (lib.copyconstructible) and Assignable + (lib.container.requirements) types. In the range [first, last], + binary_op shall neither modify elements nor invalidate iterators + or subranges. + [Footnote: The use of a fully closed range is intentional --end footnote] +

+ +

Change 26.4.2/2 from:

+ +

+ -2- Requires: T must meet the requirements of CopyConstructible + (lib.copyconstructible) and Assignable (lib.container.requirements) + types. binary_op1 and binary_op2 shall not cause side effects. +

+ +

to:

+ +

+ -2- Requires: T must meet the requirements of CopyConstructible + (lib.copyconstructible) and Assignable (lib.container.requirements) + types. In the ranges [first, last] and [first2, first2 + (last - + first)], binary_op1 and binary_op2 shall neither modify elements + nor invalidate iterators or subranges. + [Footnote: The use of fully closed ranges is intentional --end footnote] +

+ + +

Change 26.4.3/4 from:

+ +

+ -4- Requires: binary_op is expected not to have any side effects. +

+ +

to:

+ +

+ -4- Requires: In the ranges [first, last] and [result, result + + (last - first)], binary_op shall neither modify elements nor + invalidate iterators or subranges. + [Footnote: The use of fully closed ranges is intentional --end footnote] +

+ +

Change 26.4.4/2 from:

+ +

+ -2- Requires: binary_op shall not have any side effects. +

+ +

to:

+ +

+ -2- Requires: In the ranges [first, last] and [result, result + + (last - first)], binary_op shall neither modify elements nor + invalidate iterators or subranges. + [Footnote: The use of fully closed ranges is intentional --end footnote] +

+ +

[Toronto: Dave Abrahams supplied wording.]

+ + +

[Copenhagen: Proposed resolution was modified slightly. Matt +added footnotes pointing out that the use of closed ranges was +intentional.]

+ + + + + + + +
+

243. get and getline when sentry reports failure

+

Section: 27.6.1.3 [istream.unformatted] Status: WP + Submitter: Martin Sebor Date: 2000-05-15

+

View all other issues in [istream.unformatted].

+

View all issues with WP status.

+

Discussion:

+

basic_istream<>::get(), and basic_istream<>::getline(), +are unclear with respect to the behavior and side-effects of the named +functions in case of an error.

+ +

27.6.1.3, p1 states that "... If the sentry object returns +true, when converted to a value of type bool, the function endeavors +to obtain the requested input..." It is not clear from this (or +the rest of the paragraph) what precisely the behavior should be when +the sentry ctor exits by throwing an exception or when the sentry +object returns false. In particular, what is the number of characters +extracted that gcount() returns supposed to be?

+ +

27.6.1.3 p8 and p19 say about the effects of get() and getline(): +"... In any case, it then stores a null character (using +charT()) into the next successive location of the array." Is not +clear whether this sentence applies if either of the conditions above +holds (i.e., when sentry fails).

+ + +

Proposed resolution:

+

Add to 27.6.1.3, p1 after the sentence

+ +

+"... If the sentry object returns true, when converted to a value of +type bool, the function endeavors to obtain the requested input." +

+ +

the following

+ + +

+"Otherwise, if the sentry constructor exits by throwing an exception or +if the sentry object returns false, when converted to a value of type +bool, the function returns without attempting to obtain any input. In +either case the number of extracted characters is set to 0; unformatted +input functions taking a character array of non-zero size as an argument +shall also store a null character (using charT()) in the first location +of the array." +

+ + +

Rationale:

+

Although the general philosophy of the input functions is that the +argument should not be modified upon failure, getline +historically added a terminating null unconditionally. Most +implementations still do that. Earlier versions of the draft standard +had language that made this an unambiguous requirement; those words +were moved to a place where their context made them less clear. See +Jerry Schwarz's message c++std-lib-7618.

+ + + + +
+

247. vector, deque::insert complexity

+

Section: 23.2.5.4 [vector.modifiers] Status: WP + Submitter: Lisa Lippincott Date: 2000-06-06

+

View all other issues in [vector.modifiers].

+

View all issues with WP status.

+

Discussion:

+

Paragraph 2 of 23.2.5.4 [vector.modifiers] describes the complexity +of vector::insert:

+ +

+ Complexity: If first and last are forward iterators, bidirectional + iterators, or random access iterators, the complexity is linear in + the number of elements in the range [first, last) plus the distance + to the end of the vector. If they are input iterators, the complexity + is proportional to the number of elements in the range [first, last) + times the distance to the end of the vector. +

+ +

First, this fails to address the non-iterator forms of +insert.

+ +

Second, the complexity for input iterators misses an edge case -- +it requires that an arbitrary number of elements can be added at +the end of a vector in constant time.

+ +

I looked to see if deque had a similar problem, and was +surprised to find that deque places no requirement on the +complexity of inserting multiple elements (23.2.2.3 [deque.modifiers], +paragraph 3):

+ +

+ Complexity: In the worst case, inserting a single element into a + deque takes time linear in the minimum of the distance from the + insertion point to the beginning of the deque and the distance + from the insertion point to the end of the deque. Inserting a + single element either at the beginning or end of a deque always + takes constant time and causes a single call to the copy constructor + of T. +

+ + +

Proposed resolution:

+ +

Change Paragraph 2 of 23.2.5.4 [vector.modifiers] to

+

+ Complexity: The complexity is linear in the number of elements + inserted plus the distance to the end of the vector. +

+ +

[For input iterators, one may achieve this complexity by first + inserting at the end of the vector, and then using + rotate.]

+ + +

Change 23.2.2.3 [deque.modifiers], paragraph 3, to:

+ +

+ Complexity: The complexity is linear in the number of elements + inserted plus the shorter of the distances to the beginning and + end of the deque. Inserting a single element at either the + beginning or the end of a deque causes a single call to the copy + constructor of T. +

+ + + +

Rationale:

+

This is a real defect, and proposed resolution fixes it: some + complexities aren't specified that should be. This proposed + resolution does constrain deque implementations (it rules out the + most naive possible implementations), but the LWG doesn't see a + reason to permit that implementation.

+ + + + + +
+

248. time_get fails to set eofbit

+

Section: 22.2.5 [category.time] Status: WP + Submitter: Martin Sebor Date: 2000-06-22

+

View all issues with WP status.

+

Discussion:

+

There is no requirement that any of time_get member functions set +ios::eofbit when they reach the end iterator while parsing their input. +Since members of both the num_get and money_get facets are required to +do so (22.2.2.1.2, and 22.2.6.1.2, respectively), time_get members +should follow the same requirement for consistency.

+ + +

Proposed resolution:

+

Add paragraph 2 to section 22.2.5.1 with the following text:

+ +

+If the end iterator is reached during parsing by any of the get() +member functions, the member sets ios_base::eofbit in err. +

+ + +

Rationale:

+

Two alternative resolutions were proposed. The LWG chose this one +because it was more consistent with the way eof is described for other +input facets.

+ + + + +
+

250. splicing invalidates iterators

+

Section: 23.2.3.4 [list.ops] Status: WP + Submitter: Brian Parker Date: 2000-07-14

+

View all other issues in [list.ops].

+

View all issues with WP status.

+

Discussion:

+

+Section 23.2.3.4 [list.ops] states that +

+
  void splice(iterator position, list<T, Allocator>& x);
+
+

+invalidates all iterators and references to list x. +

+ +

+This is unnecessary and defeats an important feature of splice. In +fact, the SGI STL guarantees that iterators to x remain valid +after splice. +

+ + +

Proposed resolution:

+ +

Add a footnote to 23.2.3.4 [list.ops], paragraph 1:

+

+[Footnote: As specified in [default.con.req], paragraphs +4-5, the semantics described in this clause applies only to the case +where allocators compare equal. --end footnote] +

+ +

In 23.2.3.4 [list.ops], replace paragraph 4 with:

+

+Effects: Inserts the contents of x before position and x becomes +empty. Pointers and references to the moved elements of x now refer to +those same elements but as members of *this. Iterators referring to the +moved elements will continue to refer to their elements, but they now +behave as iterators into *this, not into x. +

+ +

In 23.2.3.4 [list.ops], replace paragraph 7 with:

+

+Effects: Inserts an element pointed to by i from list x before +position and removes the element from x. The result is unchanged if +position == i or position == ++i. Pointers and references to *i continue +to refer to this same element but as a member of *this. Iterators to *i +(including i itself) continue to refer to the same element, but now +behave as iterators into *this, not into x. +

+ +

In 23.2.3.4 [list.ops], replace paragraph 12 with:

+

+Requires: [first, last) is a valid range in x. The result is +undefined if position is an iterator in the range [first, last). +Pointers and references to the moved elements of x now refer to those +same elements but as members of *this. Iterators referring to the moved +elements will continue to refer to their elements, but they now behave as +iterators into *this, not into x. +

+ +

[pre-Copenhagen: Howard provided wording.]

+ + + +

Rationale:

+

The original proposed resolution said that iterators and references +would remain "valid". The new proposed resolution clarifies what that +means. Note that this only applies to the case of equal allocators. +From [default.con.req] paragraph 4, the behavior of list when +allocators compare nonequal is outside the scope of the standard.

+ + + + +
+

251. basic_stringbuf missing allocator_type

+

Section: 27.7.1 [stringbuf] Status: WP + Submitter: Martin Sebor Date: 2000-07-28

+

View all issues with WP status.

+

Discussion:

+

The synopsis for the template class basic_stringbuf +doesn't list a typedef for the template parameter +Allocator. This makes it impossible to determine the type of +the allocator at compile time. It's also inconsistent with all other +template classes in the library that do provide a typedef for the +Allocator parameter.

+ + +

Proposed resolution:

+

Add to the synopses of the class templates basic_stringbuf (27.7.1), +basic_istringstream (27.7.2), basic_ostringstream (27.7.3), and +basic_stringstream (27.7.4) the typedef:

+
  typedef Allocator allocator_type;
+
+ + + + +
+

252. missing casts/C-style casts used in iostreams

+

Section: 27.7 [string.streams] Status: WP + Submitter: Martin Sebor Date: 2000-07-28

+

View all other issues in [string.streams].

+

View all issues with WP status.

+

Discussion:

+

27.7.2.2, p1 uses a C-style cast rather than the more appropriate +const_cast<> in the Returns clause for basic_istringstream<>::rdbuf(). +The same C-style cast is being used in 27.7.3.2, p1, D.7.2.2, p1, and +D.7.3.2, p1, and perhaps elsewhere. 27.7.6, p1 and D.7.2.2, p1 are missing +the cast altogether.

+ +

C-style casts have not been deprecated, so the first part of this +issue is stylistic rather than a matter of correctness.

+ + +

Proposed resolution:

+

In 27.7.2.2, p1 replace

+
  -1- Returns: (basic_stringbuf<charT,traits,Allocator>*)&sb.
+ +

with

+
  -1- Returns: const_cast<basic_stringbuf<charT,traits,Allocator>*>(&sb).
+ + +

In 27.7.3.2, p1 replace

+
  -1- Returns: (basic_stringbuf<charT,traits,Allocator>*)&sb.
+ +

with

+
  -1- Returns: const_cast<basic_stringbuf<charT,traits,Allocator>*>(&sb).
+ +

In 27.7.6, p1, replace

+
  -1- Returns: &sb
+ +

with

+
  -1- Returns: const_cast<basic_stringbuf<charT,traits,Allocator>*>(&sb).
+ +

In D.7.2.2, p1 replace

+
  -2- Returns: &sb. 
+ +

with

+
  -2- Returns: const_cast<strstreambuf*>(&sb).
+ + + + +
+

253. valarray helper functions are almost entirely useless

+

Section: 26.5.2.1 [valarray.cons], 26.5.2.2 [valarray.assign] Status: WP + Submitter: Robert Klarer Date: 2000-07-31

+

View other active issues in [valarray.cons].

+

View all other issues in [valarray.cons].

+

View all issues with WP status.

+

Discussion:

+

This discussion is adapted from message c++std-lib-7056 posted +November 11, 1999. I don't think that anyone can reasonably claim +that the problem described below is NAD.

+ +

These valarray constructors can never be called:

+ +
   template <class T>
+         valarray<T>::valarray(const slice_array<T> &);
+   template <class T>
+         valarray<T>::valarray(const gslice_array<T> &);
+   template <class T>
+         valarray<T>::valarray(const mask_array<T> &);
+   template <class T>
+         valarray<T>::valarray(const indirect_array<T> &);
+
+ +

Similarly, these valarray assignment operators cannot be +called:

+ +
     template <class T>
+     valarray<T> valarray<T>::operator=(const slice_array<T> &);
+     template <class T>
+     valarray<T> valarray<T>::operator=(const gslice_array<T> &);
+     template <class T>
+     valarray<T> valarray<T>::operator=(const mask_array<T> &);
+     template <class T>
+     valarray<T> valarray<T>::operator=(const indirect_array<T> &);
+
+ +

Please consider the following example:

+ +
   #include <valarray>
+   using namespace std;
+
+   int main()
+   {
+       valarray<double> va1(12);
+       valarray<double> va2(va1[slice(1,4,3)]); // line 1
+   }
+
+ + +

Since the valarray va1 is non-const, the result of the sub-expression +va1[slice(1,4,3)] at line 1 is an rvalue of type const +std::slice_array<double>. This slice_array rvalue is then used to +construct va2. The constructor that is used to construct va2 is +declared like this:

+ +
     template <class T>
+     valarray<T>::valarray(const slice_array<T> &);
+
+ +

Notice the constructor's const reference parameter. When the +constructor is called, a slice_array must be bound to this reference. +The rules for binding an rvalue to a const reference are in 8.5.3, +paragraph 5 (see also 13.3.3.1.4). Specifically, paragraph 5 +indicates that a second slice_array rvalue is constructed (in this +case copy-constructed) from the first one; it is this second rvalue +that is bound to the reference parameter. Paragraph 5 also requires +that the constructor that is used for this purpose be callable, +regardless of whether the second rvalue is elided. The +copy-constructor in this case is not callable, however, because it is +private. Therefore, the compiler should report an error.

+ +

Since slice_arrays are always rvalues, the valarray constructor that has a +parameter of type const slice_array<T> & can never be called. The +same reasoning applies to the three other constructors and the four +assignment operators that are listed at the beginning of this post. +Furthermore, since these functions cannot be called, the valarray helper +classes are almost entirely useless.

+ + +

Proposed resolution:

+

slice_array:

+
    +
  • Make the copy constructor and copy-assignment operator declarations + public in the slice_array class template definition in 26.5.5 [template.slice.array]
  • +
  • remove paragraph 3 of 26.5.5 [template.slice.array]
  • +
  • remove the copy constructor declaration from [cons.slice.arr]
  • +
  • change paragraph 1 of [cons.slice.arr] to read "This constructor is declared + to be private. This constructor need not be defined."
  • +
  • remove the first sentence of paragraph 1 of 26.5.5.1 [slice.arr.assign]
  • +
  • Change the first three words of the second sentence of paragraph 1 of + 26.5.5.1 [slice.arr.assign] to "These assignment operators have"
  • +
+ +

gslice_array:

+
    +
  • Make the copy constructor and copy-assignment operator declarations + public in the gslice_array class template definition in 26.5.7 [template.gslice.array]
  • +
  • remove the note in paragraph 3 of 26.5.7 [template.gslice.array]
  • +
  • remove the copy constructor declaration from [gslice.array.cons]
  • +
  • change paragraph 1 of [gslice.array.cons] to read "This constructor is declared + to be private. This constructor need not be defined."
  • +
  • remove the first sentence of paragraph 1 of 26.5.7.1 [gslice.array.assign]
  • +
  • Change the first three words of the second sentence of paragraph 1 of + 26.5.7.1 [gslice.array.assign] to "These assignment operators have"
  • +
+ +

mask_array:

+
    +
  • Make the copy constructor and copy-assignment operator declarations + public in the mask_array class template definition in 26.5.8 [template.mask.array]
  • +
  • remove the note in paragraph 2 of 26.5.8 [template.mask.array]
  • +
  • remove the copy constructor declaration from [mask.array.cons]
  • +
  • change paragraph 1 of [mask.array.cons] to read "This constructor is declared + to be private. This constructor need not be defined."
  • +
  • remove the first sentence of paragraph 1 of 26.5.8.1 [mask.array.assign]
  • +
  • Change the first three words of the second sentence of paragraph 1 of + 26.5.8.1 [mask.array.assign] to "These assignment operators have"
  • +
+ +

indirect_array:

+
    +
  • Make the copy constructor and copy-assignment operator declarations + public in the indirect_array class definition in 26.5.9 [template.indirect.array]
  • +
  • remove the note in paragraph 2 of 26.5.9 [template.indirect.array]
  • +
  • remove the copy constructor declaration from [indirect.array.cons]
  • +
  • change the descriptive text in [indirect.array.cons] to read "This constructor is + declared to be private. This constructor need not be defined."
  • +
  • remove the first sentence of paragraph 1 of 26.5.9.1 [indirect.array.assign]
  • +
  • Change the first three words of the second sentence of paragraph 1 of + 26.5.9.1 [indirect.array.assign] to "These assignment operators have"
  • +
+

[Proposed resolution was modified in Santa Cruz: explicitly make +copy constructor and copy assignment operators public, instead of +removing them.]

+ + + +

Rationale:

+

Keeping the valarray constructors private is untenable. Merely +making valarray a friend of the helper classes isn't good enough, +because access to the copy constructor is checked in the user's +environment.

+ +

Making the assignment operator public is not strictly necessary to +solve this problem. A majority of the LWG (straw poll: 13-4) +believed we should make the assignment operators public, in addition +to the copy constructors, for reasons of symmetry and user +expectation.

+ + + + + +
+

254. Exception types in clause 19 are constructed from std::string

+

Section: 19.1 [std.exceptions], 27.4.2.1.1 [ios::failure] Status: WP + Submitter: Dave Abrahams Date: 2000-08-01

+

View all issues with WP status.

+

Discussion:

+

+Many of the standard exception types which implementations are +required to throw are constructed with a const std::string& +parameter. For example: +

+ +
     19.1.5  Class out_of_range                          [lib.out.of.range]
+     namespace std {
+       class out_of_range : public logic_error {
+       public:
+         explicit out_of_range(const string& what_arg);
+       };
+     }
+
+   1 The class out_of_range defines the type of objects  thrown  as  excep-
+     tions to report an argument value not in its expected range.
+
+     out_of_range(const string& what_arg);
+
+     Effects:
+       Constructs an object of class out_of_range.
+     Postcondition:
+       strcmp(what(), what_arg.c_str()) == 0.
+
+ +

+There are at least two problems with this: +

+
    +
  1. A program which is low on memory may end up throwing +std::bad_alloc instead of out_of_range because memory runs out while +constructing the exception object.
  2. +
  3. An obvious implementation which stores a std::string data member +may end up invoking terminate() during exception unwinding because the +exception object allocates memory (or rather fails to) as it is being +copied.
  4. +
+ +

+There may be no cure for (1) other than changing the interface to +out_of_range, though one could reasonably argue that (1) is not a +defect. Personally I don't care that much if out-of-memory is reported +when I only have 20 bytes left, in the case when out_of_range would +have been reported. People who use exception-specifications might care +a lot, though. +

+ +

+There is a cure for (2), but it isn't completely obvious. I think a +note for implementors should be made in the standard. Avoiding +possible termination in this case shouldn't be left up to chance. The +cure is to use a reference-counted "string" implementation +in the exception object. I am not necessarily referring to a +std::string here; any simple reference-counting scheme for a NTBS +would do. +

+ +

Further discussion, in email:

+ +

+...I'm not so concerned about (1). After all, a library implementation +can add const char* constructors as an extension, and users don't +need to avail themselves of the standard exceptions, though this is +a lame position to be forced into. FWIW, std::exception and +std::bad_alloc don't require a temporary basic_string. +

+ +

+...I don't think the fixed-size buffer is a solution to the problem, +strictly speaking, because you can't satisfy the postcondition +
+   strcmp(what(), what_arg.c_str()) == 0 +
+For all values of what_arg (i.e. very long values). That means that +the only truly conforming solution requires a dynamic allocation. +

+ +

Further discussion, from Redmond:

+ +

The most important progress we made at the Redmond meeting was +realizing that there are two separable issues here: the const +string& constructor, and the copy constructor. If a user writes +something like throw std::out_of_range("foo"), the const +string& constructor is invoked before anything gets thrown. The +copy constructor is potentially invoked during stack unwinding.

+ +

The copy constructor is a more serious problem, becuase failure +during stack unwinding invokes terminate. The copy +constructor must be nothrow. Curaçao: Howard thinks this +requirement may already be present.

+ +

The fundamental problem is that it's difficult to get the nothrow +requirement to work well with the requirement that the exception +objects store a string of unbounded size, particularly if you also try +to make the const string& constructor nothrow. Options discussed +include:

+ +
    +
  • Limit the size of a string that exception objects are required to +throw: change the postconditions of 19.1.2 [domain.error] paragraph 3 +and 19.1.6 [runtime.error] paragraph 3 to something like this: +"strncmp(what(), what_arg._str(), N) == 0, where N is an +implementation defined constant no smaller than 256".
  • +
  • Allow the const string& constructor to throw, but not the +copy constructor. It's the implementor's responsibility to get it +right. (An implementor might use a simple refcount class.)
  • +
  • Compromise between the two: an implementation is not allowed to +throw if the string's length is less than some N, but, if it doesn't +throw, the string must compare equal to the argument.
  • +
  • Add a new constructor that takes a const char*
  • +
+ +

(Not all of these options are mutually exclusive.)

+ + + +

Proposed resolution:

+ +

+Change 19.1.1 [logic.error] +

+ +
+
namespace std {
+  class logic_error : public exception {
+  public:
+    explicit logic_error(const string& what_arg);
+    explicit logic_error(const char* what_arg);
+  };
+}
+
+

...

+

+logic_error(const char* what_arg); +

+
+

+-4- Effects: Constructs an object of class logic_error. +

+

+-5- Postcondition: strcmp(what(), what_arg) == 0. +

+
+ +
+ +

+Change 19.1.2 [domain.error] +

+ +
+
namespace std {
+  class domain_error : public logic_error {
+  public:
+    explicit domain_error(const string& what_arg);
+    explicit domain_error(const char* what_arg);
+  };
+}
+
+

...

+

+domain_error(const char* what_arg); +

+
+

+-4- Effects: Constructs an object of class domain_error. +

+

+-5- Postcondition: strcmp(what(), what_arg) == 0. +

+ +
+
+ +

+Change 19.1.3 [invalid.argument] +

+ +
+
namespace std {
+  class invalid_argument : public logic_error {
+  public:
+    explicit invalid_argument(const string& what_arg);
+    explicit invalid_argument(const char* what_arg);
+  };
+}
+
+

...

+

+invalid_argument(const char* what_arg); +

+
+

+-4- Effects: Constructs an object of class invalid_argument. +

+

+-5- Postcondition: strcmp(what(), what_arg) == 0. +

+
+ +
+ +

+Change 19.1.4 [length.error] +

+ +
+
namespace std {
+  class length_error : public logic_error {
+  public:
+    explicit length_error(const string& what_arg);
+    explicit length_error(const char* what_arg);
+  };
+}
+
+

...

+

+length_error(const char* what_arg); +

+
+

+-4- Effects: Constructs an object of class length_error. +

+

+-5- Postcondition: strcmp(what(), what_arg) == 0. +

+
+ +
+ +

+Change 19.1.5 [out.of.range] +

+ +
+
namespace std {
+  class out_of_range : public logic_error {
+  public:
+    explicit out_of_range(const string& what_arg);
+    explicit out_of_range(const char* what_arg);
+  };
+}
+
+

...

+

+out_of_range(const char* what_arg); +

+
+

+-4- Effects: Constructs an object of class out_of_range. +

+

+-5- Postcondition: strcmp(what(), what_arg) == 0. +

+
+ +
+ +

+Change 19.1.6 [runtime.error] +

+ +
+
namespace std {
+  class runtime_error : public exception {
+  public:
+    explicit runtime_error(const string& what_arg);
+    explicit runtime_error(const char* what_arg);
+  };
+}
+
+

...

+

+runtime_error(const char* what_arg); +

+
+

+-4- Effects: Constructs an object of class runtime_error. +

+

+-5- Postcondition: strcmp(what(), what_arg) == 0. +

+
+ +
+ +

+Change 19.1.7 [range.error] +

+ +
+
namespace std {
+  class range_error : public runtime_error {
+  public:
+    explicit range_error(const string& what_arg);
+    explicit range_error(const char* what_arg);
+  };
+}
+
+

...

+

+range_error(const char* what_arg); +

+
+

+-4- Effects: Constructs an object of class range_error. +

+

+-5- Postcondition: strcmp(what(), what_arg) == 0. +

+
+ +
+ +

+Change 19.1.8 [overflow.error] +

+ +
+
namespace std {
+  class overflow_error : public runtime_error {
+  public:
+    explicit overflow_error(const string& what_arg);
+    explicit overflow_error(const char* what_arg);
+  };
+}
+
+

...

+

+overflow_error(const char* what_arg); +

+
+

+-4- Effects: Constructs an object of class overflow_error. +

+

+-5- Postcondition: strcmp(what(), what_arg) == 0. +

+
+ +
+ +

+Change 19.1.9 [underflow.error] +

+ +
+
namespace std {
+  class underflow_error : public runtime_error {
+  public:
+    explicit underflow_error(const string& what_arg);
+    explicit underflow_error(const char* what_arg);
+  };
+}
+
+

...

+

+underflow_error(const char* what_arg); +

+
+

+-4- Effects: Constructs an object of class underflow_error. +

+

+-5- Postcondition: strcmp(what(), what_arg) == 0. +

+
+ +
+ +

+Change 27.4.2.1.1 [ios::failure] +

+ +
+
namespace std {
+  class ios_base::failure : public exception {
+  public:
+    explicit failure(const string& msg);
+    explicit failure(const char* msg);
+    virtual const char* what() const throw();
+};
+}
+
+

...

+

+failure(const char* msg); +

+
+

+-4- Effects: Constructs an object of class failure. +

+

+-5- Postcondition: strcmp(what(), msg) == 0. +

+
+ +
+ + + +

Rationale:

+ +

Throwing a bad_alloc while trying to construct a message for another +exception-derived class is not necessarily a bad thing. And the +bad_alloc constructor already has a no throw spec on it (18.4.2.1).

+ +

Future:

+ +

All involved would like to see const char* constructors added, but +this should probably be done for C++0X as opposed to a DR.

+ +

I believe the no throw specs currently decorating these functions +could be improved by some kind of static no throw spec checking +mechanism (in a future C++ language). As they stand, the copy +constructors might fail via a call to unexpected. I think what is +intended here is that the copy constructors can't fail.

+ +

[Pre-Sydney: reopened at the request of Howard Hinnant. + Post-Redmond: James Kanze noticed that the copy constructors of + exception-derived classes do not have nothrow clauses. Those + classes have no copy constructors declared, meaning the + compiler-generated implicit copy constructors are used, and those + compiler-generated constructors might in principle throw anything.]

+ + +

[ +Batavia: Merged copy constructor and assignment operator spec into exception +and added ios::failure into the proposed resolution. +]

+ + +

[ +Oxford: The proposed resolution simply addresses the issue of constructing +the exception objects with const char* and string literals without +the need to explicit include or construct a std::string. +]

+ + + + + + + +
+

256. typo in 27.4.4.2, p17: copy_event does not exist

+

Section: 27.4.4.2 [basic.ios.members] Status: WP + Submitter: Martin Sebor Date: 2000-08-21

+

View all other issues in [basic.ios.members].

+

View all issues with WP status.

+

Discussion:

+

+27.4.4.2, p17 says +

+ +

+-17- Before copying any parts of rhs, calls each registered callback +pair (fn,index) as (*fn)(erase_event,*this,index). After all parts but +exceptions() have been replaced, calls each callback pair that was +copied from rhs as (*fn)(copy_event,*this,index). +

+ +

+The name copy_event isn't defined anywhere. The intended name was +copyfmt_event. +

+ + +

Proposed resolution:

+

Replace copy_event with copyfmt_event in the named paragraph.

+ + + + +
+

258. Missing allocator requirement

+

Section: 20.1.2 [allocator.requirements] Status: WP + Submitter: Matt Austern Date: 2000-08-22

+

View other active issues in [allocator.requirements].

+

View all other issues in [allocator.requirements].

+

View all issues with WP status.

+

Discussion:

+

+From lib-7752: +

+ +

+I've been assuming (and probably everyone else has been assuming) that +allocator instances have a particular property, and I don't think that +property can be deduced from anything in Table 32. +

+ +

+I think we have to assume that allocator type conversion is a +homomorphism. That is, if x1 and x2 are of type X, where +X::value_type is T, and if type Y is X::template +rebind<U>::other, then Y(x1) == Y(x2) if and only if x1 == x2. +

+ +

+Further discussion: Howard Hinnant writes, in lib-7757: +

+ +

+I think I can prove that this is not provable by Table 32. And I agree +it needs to be true except for the "and only if". If x1 != x2, I see no +reason why it can't be true that Y(x1) == Y(x2). Admittedly I can't +think of a practical instance where this would happen, or be valuable. +But I also don't see a need to add that extra restriction. I think we +only need: +

+ +

+ if (x1 == x2) then Y(x1) == Y(x2) +

+ +

+If we decide that == on allocators is transitive, then I think I can +prove the above. But I don't think == is necessarily transitive on +allocators. That is: +

+ +

+Given x1 == x2 and x2 == x3, this does not mean x1 == x3. +

+ +

Example:

+ +
+

+x1 can deallocate pointers from: x1, x2, x3
+x2 can deallocate pointers from: x1, x2, x4
+x3 can deallocate pointers from: x1, x3
+x4 can deallocate pointers from: x2, x4 +

+ +

+x1 == x2, and x2 == x4, but x1 != x4 +

+
+

[Toronto: LWG members offered multiple opinions. One +opinion is that it should not be required that x1 == x2 +implies Y(x1) == Y(x2), and that it should not even be +required that X(x1) == x1. Another opinion is that +the second line from the bottom in table 32 already implies the +desired property. This issue should be considered in light of +other issues related to allocator instances.]

+ + + +

Proposed resolution:

+

+Accept proposed wording from +N2436 part 3. +

+ + +

[Lillehammer: Same conclusion as before: this should be + considered as part of an allocator redesign, not solved on its own.]

+ + +

[ +Batavia: An allocator redesign is not forthcoming and thus we fixed this one issue. +]

+ + +

[ +Toronto: Reopened at the request of the project editor (Pete) because the proposed +wording did not fit within the indicated table. The intent of the resolution remains +unchanged. Pablo to work with Pete on improved wording. +]

+ + +

[ +Kona (2007): The LWG adopted the proposed resolution of N2387 for this issue which +was subsequently split out into a separate paper N2436 for the purposes of voting. +The resolution in N2436 addresses this issue. The LWG voted to accelerate this +issue to Ready status to be voted into the WP at Kona. +]

+ + + + + +
+

259. basic_string::operator[] and const correctness

+

Section: 21.3.4 [string.capacity] Status: WP + Submitter: Chris Newton Date: 2000-08-27

+

View all other issues in [string.capacity].

+

View all issues with WP status.

+

Discussion:

+

+Paraphrased from a message that Chris Newton posted to comp.std.c++: +

+ +

+The standard's description of basic_string<>::operator[] +seems to violate const correctness. +

+ +

+The standard (21.3.4/1) says that "If pos < size(), +returns data()[pos]." The types don't work. The +return value of data() is const charT*, but +operator[] has a non-const version whose return type is reference. +

+ + +

Proposed resolution:

+

+In section 21.3.4, paragraph 1, change +"data()[pos]" to "*(begin() + +pos)". +

+ + + + +
+

260. Inconsistent return type of istream_iterator::operator++(int)

+

Section: 24.5.1.2 [istream.iterator.ops] Status: WP + Submitter: Martin Sebor Date: 2000-08-27

+

View all other issues in [istream.iterator.ops].

+

View all issues with WP status.

+

Discussion:

+

The synopsis of istream_iterator::operator++(int) in 24.5.1 shows +it as returning the iterator by value. 24.5.1.2, p5 shows the same +operator as returning the iterator by reference. That's incorrect +given the Effects clause below (since a temporary is returned). The +`&' is probably just a typo.

+ + +

Proposed resolution:

+

Change the declaration in 24.5.1.2, p5 from

+
 istream_iterator<T,charT,traits,Distance>& operator++(int);
+ 
+

to

+
 istream_iterator<T,charT,traits,Distance> operator++(int);
+ 
+

(that is, remove the `&').

+ + + + +
+

261. Missing description of istream_iterator::operator!=

+

Section: 24.5.1.2 [istream.iterator.ops] Status: WP + Submitter: Martin Sebor Date: 2000-08-27

+

View all other issues in [istream.iterator.ops].

+

View all issues with WP status.

+

Discussion:

+

+24.5.1, p3 lists the synopsis for +

+ +
   template <class T, class charT, class traits, class Distance>
+        bool operator!=(const istream_iterator<T,charT,traits,Distance>& x,
+                        const istream_iterator<T,charT,traits,Distance>& y);
+
+ +

+but there is no description of what the operator does (i.e., no Effects +or Returns clause) in 24.5.1.2. +

+ + +

Proposed resolution:

+

+Add paragraph 7 to the end of section 24.5.1.2 with the following text: +

+ +
   template <class T, class charT, class traits, class Distance>
+        bool operator!=(const istream_iterator<T,charT,traits,Distance>& x,
+                        const istream_iterator<T,charT,traits,Distance>& y);
+
+ +

-7- Returns: !(x == y).

+ + + + +
+

262. Bitmask operator ~ specified incorrectly

+

Section: 17.3.2.1.2 [bitmask.types] Status: WP + Submitter: Beman Dawes Date: 2000-09-03

+

View all issues with WP status.

+

Discussion:

+

+The ~ operation should be applied after the cast to int_type. +

+ + +

Proposed resolution:

+

+Change 17.3.2.1.2 [lib.bitmask.types] operator~ from: +

+ +
   bitmask operator~ ( bitmask X )
+     { return static_cast< bitmask>(static_cast<int_type>(~ X)); }
+
+ +

+to: +

+ +
   bitmask operator~ ( bitmask X )
+     { return static_cast< bitmask>(~static_cast<int_type>(X)); }
+
+ + + + +
+

263. Severe restriction on basic_string reference counting

+

Section: 21.3 [basic.string] Status: WP + Submitter: Kevlin Henney Date: 2000-09-04

+

View other active issues in [basic.string].

+

View all other issues in [basic.string].

+

View all issues with WP status.

+

Discussion:

+

+The note in paragraph 6 suggests that the invalidation rules for +references, pointers, and iterators in paragraph 5 permit a reference- +counted implementation (actually, according to paragraph 6, they permit +a "reference counted implementation", but this is a minor editorial fix). +

+ +

+However, the last sub-bullet is so worded as to make a reference-counted +implementation unviable. In the following example none of the +conditions for iterator invalidation are satisfied: +

+ +
    // first example: "*******************" should be printed twice
+    string original = "some arbitrary text", copy = original;
+    const string & alias = original;
+
+    string::const_iterator i = alias.begin(), e = alias.end();
+    for(string::iterator j = original.begin(); j != original.end(); ++j)
+        *j = '*';
+    while(i != e)
+        cout << *i++;
+    cout << endl;
+    cout << original << endl;
+
+ +

+Similarly, in the following example: +

+ +
    // second example: "some arbitrary text" should be printed out
+    string original = "some arbitrary text", copy = original;
+    const string & alias = original;
+
+    string::const_iterator i = alias.begin();
+    original.begin();
+    while(i != alias.end())
+        cout << *i++;
+
+ +

+I have tested this on three string implementations, two of which were +reference counted. The reference-counted implementations gave +"surprising behavior" because they invalidated iterators on +the first call to non-const begin since construction. The current +wording does not permit such invalidation because it does not take +into account the first call since construction, only the first call +since various member and non-member function calls. +

+ + +

Proposed resolution:

+

+Change the following sentence in 21.3 paragraph 5 from +

+ +

+ Subsequent to any of the above uses except the forms of insert() and + erase() which return iterators, the first call to non-const member + functions operator[](), at(), begin(), rbegin(), end(), or rend(). +

+ +

to

+ +

+ Following construction or any of the above uses, except the forms of + insert() and erase() that return iterators, the first call to non- + const member functions operator[](), at(), begin(), rbegin(), end(), + or rend(). +

+ + + + +
+

264. Associative container insert(i, j) complexity requirements are not feasible.

+

Section: 23.1.2 [associative.reqmts] Status: WP + Submitter: John Potter Date: 2000-09-07

+

View all other issues in [associative.reqmts].

+

View all issues with WP status.

+

Duplicate of: 102

+

Discussion:

+

+Table 69 requires linear time if [i, j) is sorted. Sorted is necessary but not sufficient. +Consider inserting a sorted range of even integers into a set<int> containing the odd +integers in the same range. +

+ +

Related issue: 102

+ + +

Proposed resolution:

+

+In Table 69, in section 23.1.2, change the complexity clause for +insertion of a range from "N log(size() + N) (N is the distance +from i to j) in general; linear if [i, j) is sorted according to +value_comp()" to "N log(size() + N), where N is the distance +from i to j". +

+ +

[Copenhagen: Minor fix in proposed resolution: fixed unbalanced +parens in the revised wording.]

+ + + + +

Rationale:

+

+Testing for valid insertions could be less efficient than simply +inserting the elements when the range is not both sorted and between +two adjacent existing elements; this could be a QOI issue. +

+ +

+The LWG considered two other options: (a) specifying that the +complexity was linear if [i, j) is sorted according to value_comp() +and between two adjacent existing elements; or (b) changing to +Klog(size() + N) + (N - K) (N is the distance from i to j and K is the +number of elements which do not insert immediately after the previous +element from [i, j) including the first). The LWG felt that, since +we can't guarantee linear time complexity whenever the range to be +inserted is sorted, it's more trouble than it's worth to say that it's +linear in some special cases. +

+ + + + +
+

265. std::pair::pair() effects overly restrictive

+

Section: 20.2.3 [pairs] Status: WP + Submitter: Martin Sebor Date: 2000-09-11

+

View all other issues in [pairs].

+

View all issues with WP status.

+

Discussion:

+

+I don't see any requirements on the types of the elements of the +std::pair container in 20.2.2. From the descriptions of the member +functions it appears that they must at least satisfy the requirements of +20.1.3 [lib.copyconstructible] and 20.1.4 [lib.default.con.req], and in +the case of the [in]equality operators also the requirements of 20.1.1 +[lib.equalitycomparable] and 20.1.2 [lib.lessthancomparable]. +

+ +

+I believe that the the CopyConstructible requirement is unnecessary in +the case of 20.2.2, p2. +

+ + +

Proposed resolution:

+

Change the Effects clause in 20.2.2, p2 from

+ +

+-2- Effects: Initializes its members as if implemented: pair() : +first(T1()), second(T2()) {} +

+ +

to

+ +

+-2- Effects: Initializes its members as if implemented: pair() : +first(), second() {} +

+ + +

Rationale:

+

The existing specification of pair's constructor appears to be a +historical artifact: there was concern that pair's members be properly +zero-initialized when they are built-in types. At one time there was +uncertainty about whether they would be zero-initialized if the +default constructor was written the obvious way. This has been +clarified by core issue 178, and there is no longer any doubt that +the straightforward implementation is correct.

+ + + + +
+

266. bad_exception::~bad_exception() missing Effects clause

+

Section: 18.7.2.1 [bad.exception] Status: WP + Submitter: Martin Sebor Date: 2000-09-24

+

View all issues with WP status.

+

Discussion:

+

+The synopsis for std::bad_exception lists the function ~bad_exception() +but there is no description of what the function does (the Effects +clause is missing). +

+ + +

Proposed resolution:

+

+Remove the destructor from the class synopses of +bad_alloc (18.5.2.1 [bad.alloc]), +bad_cast (18.6.2 [bad.cast]), +bad_typeid (18.6.3 [bad.typeid]), +and bad_exception (18.7.2.1 [bad.exception]). +

+ + +

Rationale:

+

+This is a general problem with the exception classes in clause 18. +The proposed resolution is to remove the destructors from the class +synopses, rather than to document the destructors' behavior, because +removing them is more consistent with how exception classes are +described in clause 19. +

+ + + + +
+

268. Typo in locale synopsis

+

Section: 22.1.1 [locale] Status: WP + Submitter: Martin Sebor Date: 2000-10-05

+

View all other issues in [locale].

+

View all issues with WP status.

+

Discussion:

+

The synopsis of the class std::locale in 22.1.1 contains two typos: +the semicolons after the declarations of the default ctor +locale::locale() and the copy ctor locale::locale(const locale&) +are missing.

+ + +

Proposed resolution:

+

Add the missing semicolons, i.e., change

+ +
    //  construct/copy/destroy:
+        locale() throw()
+        locale(const locale& other) throw()
+
+ +

in the synopsis in 22.1.1 to

+ +
    //  construct/copy/destroy:
+        locale() throw();
+        locale(const locale& other) throw();
+
+ + + + +
+

270. Binary search requirements overly strict

+

Section: 25.3.3 [alg.binary.search] Status: WP + Submitter: Matt Austern Date: 2000-10-18

+

View all other issues in [alg.binary.search].

+

View all issues with WP status.

+

Duplicate of: 472

+

Discussion:

+

+Each of the four binary search algorithms (lower_bound, upper_bound, +equal_range, binary_search) has a form that allows the user to pass a +comparison function object. According to 25.3, paragraph 2, that +comparison function object has to be a strict weak ordering. +

+ +

+This requirement is slightly too strict. Suppose we are searching +through a sequence containing objects of type X, where X is some +large record with an integer key. We might reasonably want to look +up a record by key, in which case we would want to write something +like this: +

+
    struct key_comp {
+      bool operator()(const X& x, int n) const {
+        return x.key() < n;
+      }
+    }
+
+    std::lower_bound(first, last, 47, key_comp());
+
+ +

+key_comp is not a strict weak ordering, but there is no reason to +prohibit its use in lower_bound. +

+ +

+There's no difficulty in implementing lower_bound so that it allows +the use of something like key_comp. (It will probably work unless an +implementor takes special pains to forbid it.) What's difficult is +formulating language in the standard to specify what kind of +comparison function is acceptable. We need a notion that's slightly +more general than that of a strict weak ordering, one that can encompass +a comparison function that involves different types. Expressing that +notion may be complicated. +

+ +

Additional questions raised at the Toronto meeting:

+
    +
  • Do we really want to specify what ordering the implementor must + use when calling the function object? The standard gives + specific expressions when describing these algorithms, but it also + says that other expressions (with different argument order) are + equivalent.
  • +
  • If we are specifying ordering, note that the standard uses both + orderings when describing equal_range.
  • +
  • Are we talking about requiring these algorithms to work properly + when passed a binary function object whose two argument types + are not the same, or are we talking about requirements when + they are passed a binary function object with several overloaded + versions of operator()?
  • +
  • The definition of a strict weak ordering does not appear to give + any guidance on issues of overloading; it only discusses expressions, + and all of the values in these expressions are of the same type. + Some clarification would seem to be in order.
  • +
+ +

Additional discussion from Copenhagen:

+
    +
  • It was generally agreed that there is a real defect here: if +the predicate is merely required to be a Strict Weak Ordering, then +it's possible to pass in a function object with an overloaded +operator(), where the version that's actually called does something +completely inappropriate. (Such as returning a random value.)
  • + +
  • An alternative formulation was presented in a paper distributed by +David Abrahams at the meeting, "Binary Search with Heterogeneous +Comparison", J16-01/0027 = WG21 N1313: Instead of viewing the +predicate as a Strict Weak Ordering acting on a sorted sequence, view +the predicate/value pair as something that partitions a sequence. +This is almost equivalent to saying that we should view binary search +as if we are given a unary predicate and a sequence, such that f(*p) +is true for all p below a specific point and false for all p above it. +The proposed resolution is based on that alternative formulation.
  • +
+ + +

Proposed resolution:

+ +

Change 25.3 [lib.alg.sorting] paragraph 3 from:

+ +

+ 3 For all algorithms that take Compare, there is a version that uses + operator< instead. That is, comp(*i, *j) != false defaults to *i < + *j != false. For the algorithms to work correctly, comp has to + induce a strict weak ordering on the values. +

+ +

to:

+ +

+ 3 For all algorithms that take Compare, there is a version that uses + operator< instead. That is, comp(*i, *j) != false defaults to *i + < *j != false. For algorithms other than those described in + lib.alg.binary.search (25.3.3) to work correctly, comp has to induce + a strict weak ordering on the values. +

+ +

Add the following paragraph after 25.3 [lib.alg.sorting] paragraph 5:

+ +

+ -6- A sequence [start, finish) is partitioned with respect to an + expression f(e) if there exists an integer n such that + for all 0 <= i < distance(start, finish), f(*(begin+i)) is true if + and only if i < n. +

+ +

Change 25.3.3 [lib.alg.binary.search] paragraph 1 from:

+ +

+ -1- All of the algorithms in this section are versions of binary + search and assume that the sequence being searched is in order + according to the implied or explicit comparison function. They work + on non-random access iterators minimizing the number of + comparisons, which will be logarithmic for all types of + iterators. They are especially appropriate for random access + iterators, because these algorithms do a logarithmic number of + steps through the data structure. For non-random access iterators + they execute a linear number of steps. +

+ +

to:

+ +

+ -1- All of the algorithms in this section are versions of binary + search and assume that the sequence being searched is partitioned + with respect to an expression formed by binding the search key to + an argument of the implied or explicit comparison function. They + work on non-random access iterators minimizing the number of + comparisons, which will be logarithmic for all types of + iterators. They are especially appropriate for random access + iterators, because these algorithms do a logarithmic number of + steps through the data structure. For non-random access iterators + they execute a linear number of steps. +

+ +

Change 25.3.3.1 [lib.lower.bound] paragraph 1 from:

+ +

+ -1- Requires: Type T is LessThanComparable + (lib.lessthancomparable). +

+ +

to:

+ +

+ -1- Requires: The elements e of [first, last) are partitioned with + respect to the expression e < value or comp(e, value) +

+ + +

Remove 25.3.3.1 [lib.lower.bound] paragraph 2:

+ +

+ -2- Effects: Finds the first position into which value can be + inserted without violating the ordering. +

+ +

Change 25.3.3.2 [lib.upper.bound] paragraph 1 from:

+ +

+ -1- Requires: Type T is LessThanComparable (lib.lessthancomparable). +

+ +

to:

+ +

+ -1- Requires: The elements e of [first, last) are partitioned with + respect to the expression !(value < e) or !comp(value, e) +

+ +

Remove 25.3.3.2 [lib.upper.bound] paragraph 2:

+ +

+ -2- Effects: Finds the furthermost position into which value can be + inserted without violating the ordering. +

+ +

Change 25.3.3.3 [lib.equal.range] paragraph 1 from:

+ +

+ -1- Requires: Type T is LessThanComparable + (lib.lessthancomparable). +

+ +

to:

+ +

+ -1- Requires: The elements e of [first, last) are partitioned with + respect to the expressions e < value and !(value < e) or + comp(e, value) and !comp(value, e). Also, for all elements e of + [first, last), e < value implies !(value < e) or comp(e, + value) implies !comp(value, e) +

+ +

Change 25.3.3.3 [lib.equal.range] paragraph 2 from:

+ +

+ -2- Effects: Finds the largest subrange [i, j) such that the value + can be inserted at any iterator k in it without violating the + ordering. k satisfies the corresponding conditions: !(*k < value) + && !(value < *k) or comp(*k, value) == false && comp(value, *k) == + false. +

+ +

to:

+ +
   -2- Returns: 
+         make_pair(lower_bound(first, last, value),
+                   upper_bound(first, last, value))
+       or
+         make_pair(lower_bound(first, last, value, comp),
+                   upper_bound(first, last, value, comp))
+
+ +

Change 25.3.3.3 [lib.binary.search] paragraph 1 from:

+ +

+ -1- Requires: Type T is LessThanComparable + (lib.lessthancomparable). +

+ +

to:

+ +

+ -1- Requires: The elements e of [first, last) are partitioned with + respect to the expressions e < value and !(value < e) or comp(e, + value) and !comp(value, e). Also, for all elements e of [first, + last), e < value implies !(value < e) or comp(e, value) implies + !comp(value, e) +

+ +

[Copenhagen: Dave Abrahams provided this wording]

+ + +

[Redmond: Minor changes in wording. (Removed "non-negative", and +changed the "other than those described in" wording.) Also, the LWG +decided to accept the "optional" part.]

+ + + + +

Rationale:

+

The proposed resolution reinterprets binary search. Instead of +thinking about searching for a value in a sorted range, we view that +as an important special case of a more general algorithm: searching +for the partition point in a partitioned range.

+ +

We also add a guarantee that the old wording did not: we ensure +that the upper bound is no earlier than the lower bound, that +the pair returned by equal_range is a valid range, and that the first +part of that pair is the lower bound.

+ + + + + +
+

271. basic_iostream missing typedefs

+

Section: 27.6.1.5 [iostreamclass] Status: WP + Submitter: Martin Sebor Date: 2000-11-02

+

View all issues with WP status.

+

Discussion:

+

+Class template basic_iostream has no typedefs. The typedefs it +inherits from its base classes can't be used, since (for example) +basic_iostream<T>::traits_type is ambiguous. +

+ + +

Proposed resolution:

+ +

Add the following to basic_iostream's class synopsis in +27.6.1.5 [iostreamclass], immediately after public:

+ +
  // types:
+  typedef charT                     char_type;
+  typedef typename traits::int_type int_type;
+  typedef typename traits::pos_type pos_type;
+  typedef typename traits::off_type off_type;
+  typedef traits                    traits_type;
+
+ + + + +
+

272. Missing parentheses around subexpression

+

Section: 27.4.4.3 [iostate.flags] Status: WP + Submitter: Martin Sebor Date: 2000-11-02

+

View all other issues in [iostate.flags].

+

View all issues with WP status.

+

Duplicate of: 569

+

Discussion:

+

+27.4.4.3, p4 says about the postcondition of the function: If +rdbuf()!=0 then state == rdstate(); otherwise +rdstate()==state|ios_base::badbit. +

+ +

+The expression on the right-hand-side of the operator==() needs to be +parenthesized in order for the whole expression to ever evaluate to +anything but non-zero. +

+ + +

Proposed resolution:

+

+Add parentheses like so: rdstate()==(state|ios_base::badbit). +

+ + + + +
+

273. Missing ios_base qualification on members of a dependent class

+

Section: 27 [input.output] Status: WP + Submitter: Martin Sebor Date: 2000-11-02

+

View all other issues in [input.output].

+

View all issues with WP status.

+

Discussion:

+

27.5.2.4.2, p4, and 27.8.1.6, p2, 27.8.1.7, p3, 27.8.1.9, p2, +27.8.1.10, p3 refer to in and/or out w/o ios_base:: qualification. +That's incorrect since the names are members of a dependent base +class (14.6.2 [temp.dep]) and thus not visible.

+ + +

Proposed resolution:

+

Qualify the names with the name of the class of which they are +members, i.e., ios_base.

+ + + + +
+

274. a missing/impossible allocator requirement

+

Section: 20.1.2 [allocator.requirements] Status: WP + Submitter: Martin Sebor Date: 2000-11-02

+

View other active issues in [allocator.requirements].

+

View all other issues in [allocator.requirements].

+

View all issues with WP status.

+

Discussion:

+

+I see that table 31 in 20.1.5, p3 allows T in std::allocator<T> to be of +any type. But the synopsis in 20.4.1 calls for allocator<>::address() to +be overloaded on reference and const_reference, which is ill-formed for +all T = const U. In other words, this won't work: +

+ +

+template class std::allocator<const int>; +

+ +

+The obvious solution is to disallow specializations of allocators on +const types. However, while containers' elements are required to be +assignable (which rules out specializations on const T's), I think that +allocators might perhaps be potentially useful for const values in other +contexts. So if allocators are to allow const types a partial +specialization of std::allocator<const T> would probably have to be +provided. +

+ + +

Proposed resolution:

+

Change the text in row 1, column 2 of table 32 in 20.1.5, p3 from

+ +

+ any type +

+ +

to

+

+ any non-const, non-reference type +

+ +

[Redmond: previous proposed resolution was "any non-const, +non-volatile, non-reference type". Got rid of the "non-volatile".]

+ + + + +

Rationale:

+

+Two resolutions were originally proposed: one that partially +specialized std::allocator for const types, and one that said an +allocator's value type may not be const. The LWG chose the second. +The first wouldn't be appropriate, because allocators are intended for +use by containers, and const value types don't work in containers. +Encouraging the use of allocators with const value types would only +lead to unsafe code. +

+

+The original text for proposed resolution 2 was modified so that it +also forbids volatile types and reference types. +

+ +

[Curaçao: LWG double checked and believes volatile is correctly +excluded from the PR.]

+ + + + + + + +
+

275. Wrong type in num_get::get() overloads

+

Section: 22.2.2.1.1 [facet.num.get.members] Status: WP + Submitter: Matt Austern Date: 2000-11-02

+

View all other issues in [facet.num.get.members].

+

View all issues with WP status.

+

Discussion:

+

+In 22.2.2.1.1, we have a list of overloads for num_get<>::get(). +There are eight overloads, all of which are identical except for the +last parameter. The overloads are: +

+
    +
  • long&
  • +
  • unsigned short&
  • +
  • unsigned int&
  • +
  • unsigned long&
  • +
  • short&
  • +
  • double&
  • +
  • long double&
  • +
  • void*&
  • +
+ +

+There is a similar list, in 22.2.2.1.2, of overloads for +num_get<>::do_get(). In this list, the last parameter has +the types: +

+
    +
  • long&
  • +
  • unsigned short&
  • +
  • unsigned int&
  • +
  • unsigned long&
  • +
  • float&
  • +
  • double&
  • +
  • long double&
  • +
  • void*&
  • +
+ +

+These two lists are not identical. They should be, since +get is supposed to call do_get with exactly +the arguments it was given. +

+ + +

Proposed resolution:

+

In 22.2.2.1.1 [facet.num.get.members], change

+
  iter_type get(iter_type in, iter_type end, ios_base& str,
+                ios_base::iostate& err, short& val) const;
+
+

to

+
  iter_type get(iter_type in, iter_type end, ios_base& str,
+                ios_base::iostate& err, float& val) const;
+
+ + + + +
+

276. Assignable requirement for container value type overly strict

+

Section: 23.1 [container.requirements] Status: WP + Submitter: Peter Dimov Date: 2000-11-07

+

View other active issues in [container.requirements].

+

View all other issues in [container.requirements].

+

View all issues with WP status.

+

Discussion:

+

+23.1/3 states that the objects stored in a container must be +Assignable. 23.3.1 [map], paragraph 2, +states that map satisfies all requirements for a container, while in +the same time defining value_type as pair<const Key, T> - a type +that is not Assignable. +

+ +

+It should be noted that there exists a valid and non-contradictory +interpretation of the current text. The wording in 23.1/3 avoids +mentioning value_type, referring instead to "objects stored in a +container." One might argue that map does not store objects of +type map::value_type, but of map::mapped_type instead, and that the +Assignable requirement applies to map::mapped_type, not +map::value_type. +

+ +

+However, this makes map a special case (other containers store objects of +type value_type) and the Assignable requirement is needlessly restrictive in +general. +

+ +

+For example, the proposed resolution of active library issue +103 is to make set::iterator a constant iterator; this +means that no set operations can exploit the fact that the stored +objects are Assignable. +

+ +

+This is related to, but slightly broader than, closed issue +140. +

+ + +

Proposed resolution:

+

23.1/3: Strike the trailing part of the sentence:

+

+ , and the additional requirements of Assignable types from 23.1/3 +

+

so that it reads:

+

+ -3- The type of objects stored in these components must meet the + requirements of CopyConstructible types (lib.copyconstructible). +

+ +

23.1/4: Modify to make clear that this requirement is not for all +containers. Change to:

+ +

+-4- Table 64 defines the Assignable requirement. Some containers +require this property of the types to be stored in the container. T is +the type used to instantiate the container. t is a value of T, and u is +a value of (possibly const) T. +

+ +

23.1, Table 65: in the first row, change "T is Assignable" to "T is +CopyConstructible".

+ +

23.2.1/2: Add sentence for Assignable requirement. Change to:

+ +

+-2- A deque satisfies all of the requirements of a container and of a +reversible container (given in tables in lib.container.requirements) and +of a sequence, including the optional sequence requirements +(lib.sequence.reqmts). In addition to the requirements on the stored +object described in 23.1[lib.container.requirements], the stored object +must also meet the requirements of Assignable. Descriptions are +provided here only for operations on deque that are not described in one +of these tables or for operations where there is additional semantic +information. +

+ +

23.2.2/2: Add Assignable requirement to specific methods of list. +Change to:

+ +
+

-2- A list satisfies all of the requirements of a container and of a +reversible container (given in two tables in lib.container.requirements) +and of a sequence, including most of the the optional sequence +requirements (lib.sequence.reqmts). The exceptions are the operator[] +and at member functions, which are not provided. + +[Footnote: These member functions are only provided by containers whose +iterators are random access iterators. --- end foonote] +

+ +

list does not require the stored type T to be Assignable unless the +following methods are instantiated: + +[Footnote: Implementors are permitted but not required to take advantage +of T's Assignable properties for these methods. -- end foonote] +

+
     list<T,Allocator>& operator=(const list<T,Allocator>&  x );
+     template <class InputIterator>
+       void assign(InputIterator first, InputIterator last);
+     void assign(size_type n, const T& t);
+
+ + +

Descriptions are provided here only for operations on list that are not +described in one of these tables or for operations where there is +additional semantic information.

+
+ +

23.2.4/2: Add sentence for Assignable requirement. Change to:

+ +

+-2- A vector satisfies all of the requirements of a container and of a +reversible container (given in two tables in lib.container.requirements) +and of a sequence, including most of the optional sequence requirements +(lib.sequence.reqmts). The exceptions are the push_front and pop_front +member functions, which are not provided. In addition to the +requirements on the stored object described in +23.1[lib.container.requirements], the stored object must also meet the +requirements of Assignable. Descriptions are provided here only for +operations on vector that are not described in one of these tables or +for operations where there is additional semantic information. +

+ + +

Rationale:

+

list, set, multiset, map, multimap are able to store non-Assignables. +However, there is some concern about list<T>: +although in general there's no reason for T to be Assignable, some +implementations of the member functions operator= and +assign do rely on that requirement. The LWG does not want +to forbid such implementations.

+ +

Note that the type stored in a standard container must still satisfy +the requirements of the container's allocator; this rules out, for +example, such types as "const int". See issue 274 +for more details. +

+ +

In principle we could also relax the "Assignable" requirement for +individual vector member functions, such as +push_back. However, the LWG did not see great value in such +selective relaxation. Doing so would remove implementors' freedom to +implement vector::push_back in terms of +vector::insert.

+ + + + + +
+

278. What does iterator validity mean?

+

Section: 23.2.3.4 [list.ops] Status: WP + Submitter: P.J. Plauger Date: 2000-11-27

+

View all other issues in [list.ops].

+

View all issues with WP status.

+

Discussion:

+

+Section 23.2.3.4 [list.ops] states that +

+
  void splice(iterator position, list<T, Allocator>& x);
+
+

+invalidates all iterators and references to list x. +

+ +

+But what does the C++ Standard mean by "invalidate"? You +can still dereference the iterator to a spliced list element, but +you'd better not use it to delimit a range within the original +list. For the latter operation, it has definitely lost some of its +validity. +

+ +

+If we accept the proposed resolution to issue 250, +then we'd better clarify that a "valid" iterator need no +longer designate an element within the same container as it once did. +We then have to clarify what we mean by invalidating a past-the-end +iterator, as when a vector or string grows by reallocation. Clearly, +such an iterator has a different kind of validity. Perhaps we should +introduce separate terms for the two kinds of "validity." +

+ + +

Proposed resolution:

+

Add the following text to the end of section 24.1 [iterator.requirements], +after paragraph 5:

+

+An invalid iterator is an iterator that may be +singular. [Footnote: This definition applies to pointers, since +pointers are iterators. The effect of dereferencing an iterator that +has been invalidated is undefined.] +

+ +

[post-Copenhagen: Matt provided wording.]

+ + +

[Redmond: General agreement with the intent, some objections to +the wording. Dave provided new wording.]

+ + + +

Rationale:

+

This resolution simply defines a term that the Standard uses but + never defines, "invalid", in terms of a term that is defined, + "singular".

+ +

Why do we say "may be singular", instead of "is singular"? That's + becuase a valid iterator is one that is known to be nonsingular. + Invalidating an iterator means changing it in such a way that it's + no longer known to be nonsingular. An example: inserting an + element into the middle of a vector is correctly said to invalidate + all iterators pointing into the vector. That doesn't necessarily + mean they all become singular.

+ + + + + +
+

280. Comparison of reverse_iterator to const reverse_iterator

+

Section: 24.4.1 [reverse.iterators] Status: WP + Submitter: Steve Cleary Date: 2000-11-27

+

View all issues with WP status.

+

Discussion:

+

+This came from an email from Steve Cleary to Fergus in reference to +issue 179. The library working group briefly discussed +this in Toronto and believed it should be a separate issue. There was +also some reservations about whether this was a worthwhile problem to +fix. +

+ +

+Steve said: "Fixing reverse_iterator. std::reverse_iterator can +(and should) be changed to preserve these additional +requirements." He also said in email that it can be done without +breaking user's code: "If you take a look at my suggested +solution, reverse_iterator doesn't have to take two parameters; there +is no danger of breaking existing code, except someone taking the +address of one of the reverse_iterator global operator functions, and +I have to doubt if anyone has ever done that. . . But, just in +case they have, you can leave the old global functions in as well -- +they won't interfere with the two-template-argument functions. With +that, I don't see how any user code could break." +

+ + +

Proposed resolution:

+

+Section: 24.4.1.1 [reverse.iterator] +add/change the following declarations:

+
  A) Add a templated assignment operator, after the same manner
+        as the templated copy constructor, i.e.:
+
+  template < class U >
+  reverse_iterator < Iterator >& operator=(const reverse_iterator< U >& u);
+
+  B) Make all global functions (except the operator+) have
+  two template parameters instead of one, that is, for
+  operator ==, !=, <, >, <=, >=, - replace:
+
+       template < class Iterator >
+       typename reverse_iterator< Iterator >::difference_type operator-(
+                 const reverse_iterator< Iterator >& x,
+                 const reverse_iterator< Iterator >& y);
+
+  with:
+
+      template < class Iterator1, class Iterator2 >
+      typename reverse_iterator < Iterator1 >::difference_type operator-(
+                 const reverse_iterator < Iterator1 > & x,
+                 const reverse_iterator < Iterator2 > & y);
+
+

+Also make the addition/changes for these signatures in +24.4.1.3 [reverse.iter.ops]. +

+ +

[ +Copenhagen: The LWG is concerned that the proposed resolution +introduces new overloads. Experience shows that introducing +overloads is always risky, and that it would be inappropriate to +make this change without implementation experience. It may be +desirable to provide this feature in a different way. +]

+ + +

[ +Lillehammer: We now have implementation experience, and agree that +this solution is safe and correct. +]

+ + + + + + + +
+

281. std::min() and max() requirements overly restrictive

+

Section: 25.3.7 [alg.min.max] Status: WP + Submitter: Martin Sebor Date: 2000-12-02

+

View all other issues in [alg.min.max].

+

View all issues with WP status.

+

Duplicate of: 486

+

Discussion:

+

The requirements in 25.3.7, p1 and 4 call for T to satisfy the +requirements of LessThanComparable ( [lessthancomparable]) +and CopyConstructible (20.1.1 [utility.arg.requirements]). +Since the functions take and return their arguments and result by +const reference, I believe the CopyConstructible requirement +is unnecessary. +

+ + +

Proposed resolution:

+

Remove the CopyConstructible requirement. Specifically, replace +25.3.7, p1 with

+

-1- Requires: Type T is LessThanComparable +( [lessthancomparable]). +

+

and replace 25.3.7, p4 with

+

-4- Requires: Type T is LessThanComparable +( [lessthancomparable]). +

+ + + + +
+

282. What types does numpunct grouping refer to?

+

Section: 22.2.2.2.2 [facet.num.put.virtuals] Status: WP + Submitter: Howard Hinnant Date: 2000-12-05

+

View all other issues in [facet.num.put.virtuals].

+

View all issues with WP status.

+

Discussion:

+

+Paragraph 16 mistakenly singles out integral types for inserting +thousands_sep() characters. This conflicts with the syntax for floating +point numbers described under 22.2.3.1/2. +

+ + +

Proposed resolution:

+

Change paragraph 16 from:

+ +

+For integral types, punct.thousands_sep() characters are inserted into +the sequence as determined by the value returned by punct.do_grouping() +using the method described in 22.2.3.1.2 [facet.numpunct.virtuals]. +

+ +

To:

+ +

+For arithmetic types, punct.thousands_sep() characters are inserted into +the sequence as determined by the value returned by punct.do_grouping() +using the method described in 22.2.3.1.2 [facet.numpunct.virtuals]. +

+ +

[ +Copenhagen: Opinions were divided about whether this is actually an +inconsistency, but at best it seems to have been unintentional. This +is only an issue for floating-point output: The standard is +unambiguous that implementations must parse thousands_sep characters +when performing floating-point. The standard is also unambiguous that +this requirement does not apply to the "C" locale. +]

+ + +

[ +A survey of existing practice is needed; it is believed that some +implementations do insert thousands_sep characters for floating-point +output and others fail to insert thousands_sep characters for +floating-point input even though this is unambiguously required by the +standard. +]

+ + +

[Post-Curaçao: the above proposed resolution is the consensus of +Howard, Bill, Pete, Benjamin, Nathan, Dietmar, Boris, and Martin.]

+ + + + + + +
+

283. std::replace() requirement incorrect/insufficient

+

Section: 25.2.5 [alg.replace] Status: WP + Submitter: Martin Sebor Date: 2000-12-15

+

View all other issues in [alg.replace].

+

View all issues with WP status.

+

Duplicate of: 483

+

Discussion:

+

+(revision of the further discussion) +There are a number of problems with the requires clauses for the +algorithms in 25.1 and 25.2. The requires clause of each algorithm +should describe the necessary and sufficient requirements on the inputs +to the algorithm such that the algorithm compiles and runs properly. +Many of the requires clauses fail to do this. Here is a summary of the kinds +of mistakes: +

+ +
    +
  1. +Use of EqualityComparable, which only puts requirements on a single +type, when in fact an equality operator is required between two +different types, typically either T and the iterator's value type +or between the value types of two different iterators. +
  2. +
  3. +Use of Assignable for T when in fact what was needed is Assignable +for the value_type of the iterator, and convertability from T to the +value_type of the iterator. Or for output iterators, the requirement +should be that T is writable to the iterator (output iterators do +not have value types). +
  4. +
+ +

+Here is the list of algorithms that contain mistakes: +

+ +
    +
  • 25.1.2 std::find
  • +
  • 25.1.6 std::count
  • +
  • 25.1.8 std::equal
  • +
  • 25.1.9 std::search, std::search_n
  • +
  • 25.2.4 std::replace, std::replace_copy
  • +
  • 25.2.5 std::fill
  • +
  • 25.2.7 std::remove, std::remove_copy
  • +
+ +

+Also, in the requirements for EqualityComparable, the requirement that +the operator be defined for const objects is lacking. +

+ + + +

Proposed resolution:

+ +

20.1.1 Change p1 from

+ +

In Table 28, T is a type to be supplied by a C++ program +instantiating a template, a, b, and c are +values of type T. +

+ +

to

+ +

+In Table 28, T is a type to be supplied by a C++ program +instantiating a template, a, b, and c are +values of type const T. +

+ +

25 Between p8 and p9

+ +

Add the following sentence:

+ +

When the description of an algorithm gives an expression such as +*first == value for a condition, it is required that the expression +evaluate to either true or false in boolean contexts.

+ +

25.1.2 Change p1 by deleting the requires clause.

+ +

25.1.6 Change p1 by deleting the requires clause.

+ +

25.1.9

+ +

Change p4 from

+ +

-4- Requires: Type T is EqualityComparable +(20.1.1), type Size is convertible to integral type (4.7.12.3). +

+ +

to

+ +

-4- Requires: The type Size is convertible to integral +type (4.7.12.3).

+ +

25.2.4 Change p1 from

+ +

-1- Requires: Type T is Assignable (23.1 ) (and, for replace(), EqualityComparable (20.1.1 )).

+ +

to

+ +

-1- Requires: The expression *first = new_value must be valid.

+ +

and change p4 from

+ +

-4- Requires: Type T is Assignable (23.1) (and, +for replace_copy(), EqualityComparable +(20.1.1)). The ranges [first, last) and [result, result + +(last - first)) shall not overlap.

+ +

to

+ +

-4- Requires: The results of the expressions *first and +new_value must be writable to the result output iterator. The +ranges [first, last) and [result, result + (last - +first)) shall not overlap.

+ + +

25.2.5 Change p1 from

+ +

-1- Requires: Type T is Assignable (23.1). The +type Size is convertible to an integral type (4.7.12.3).

+ +

to

+ +

-1- Requires: The expression value must be is writable to +the output iterator. The type Size is convertible to an +integral type (4.7.12.3).

+ +

25.2.7 Change p1 from

+ +

-1- Requires: Type T is EqualityComparable (20.1.1).

+ +

to

+ +

+-1- Requires: The value type of the iterator must be +Assignable (23.1). +

+ + + +

Rationale:

+

+The general idea of the proposed solution is to remove the faulty +requires clauses and let the returns and effects clauses speak for +themselves. That is, the returns clauses contain expressions that must +be valid, and therefore already imply the correct requirements. In +addition, a sentence is added at the beginning of chapter 25 saying +that expressions given as conditions must evaluate to true or false in +a boolean context. An alternative would be to say that the type of +these condition expressions must be literally bool, but that would be +imposing a greater restriction that what the standard currently says +(which is convertible to bool). +

+ + + + + +
+

284. unportable example in 20.3.7, p6

+

Section: 20.5.7 [comparisons] Status: WP + Submitter: Martin Sebor Date: 2000-12-26

+

View all issues with WP status.

+

Discussion:

+

The example in 20.5.7 [comparisons], p6 shows how to use the C +library function strcmp() with the function pointer adapter +ptr_fun(). But since it's unspecified whether the C library +functions have extern "C" or extern +"C++" linkage [17.4.2.2 [using.linkage]], and since +function pointers with different the language linkage specifications +(7.5 [dcl.link]) are incompatible, whether this example is +well-formed is unspecified. +

+ + +

Proposed resolution:

+

Change 20.5.7 [comparisons] paragraph 6 from:

+
+

[Example:

+
    replace_if(v.begin(), v.end(), not1(bind2nd(ptr_fun(strcmp), "C")), "C++");
+  
+

replaces each C with C++ in sequence v.

+
+ + +

to:

+
+

[Example:

+
    int compare(const char*, const char*);
+    replace_if(v.begin(), v.end(),
+               not1(bind2nd(ptr_fun(compare), "abc")), "def");
+  
+

replaces each abc with def in sequence v.

+
+ +

Also, remove footnote 215 in that same paragraph.

+ +

[Copenhagen: Minor change in the proposed resolution. Since this +issue deals in part with C and C++ linkage, it was believed to be too +confusing for the strings in the example to be "C" and "C++". +]

+ + +

[Redmond: More minor changes. Got rid of the footnote (which +seems to make a sweeping normative requirement, even though footnotes +aren't normative), and changed the sentence after the footnote so that +it corresponds to the new code fragment.]

+ + + + + + +
+

285. minor editorial errors in fstream ctors

+

Section: 27.8.1.7 [ifstream.cons] Status: WP + Submitter: Martin Sebor Date: 2000-12-31

+

View all issues with WP status.

+

Discussion:

+

27.8.1.7 [ifstream.cons], p2, 27.8.1.11 [ofstream.cons], p2, and +27.8.1.15 [fstream.cons], p2 say about the effects of each constructor: +

+ +

... If that function returns a null pointer, calls +setstate(failbit) (which may throw ios_base::failure). +

+ +

The parenthetical note doesn't apply since the ctors cannot throw an +exception due to the requirement in 27.4.4.1 [basic.ios.cons], p3 +that exceptions() be initialized to ios_base::goodbit. +

+ + +

Proposed resolution:

+

+Strike the parenthetical note from the Effects clause in each of the +paragraphs mentioned above. +

+ + + + +
+

286. <cstdlib> requirements missing size_t typedef

+

Section: 25.4 [alg.c.library] Status: WP + Submitter: Judy Ward Date: 2000-12-30

+

View all other issues in [alg.c.library].

+

View all issues with WP status.

+

Discussion:

+

+The <cstdlib> header file contains prototypes for bsearch and +qsort (C++ Standard section 25.4 paragraphs 3 and 4) and other +prototypes (C++ Standard section 21.4 paragraph 1 table 49) that +require the typedef size_t. Yet size_t is not listed in the +<cstdlib> synopsis table 78 in section 25.4. +

+ + +

Proposed resolution:

+

+Add the type size_t to Table 78 (section 25.4) and add +the type size_t <cstdlib> to Table 97 (section C.2). +

+ + +

Rationale:

+

Since size_t is in <stdlib.h>, it must also be in <cstdlib>.

+ + + + + +
+

288. <cerrno> requirements missing macro EILSEQ

+

Section: 19.3 [errno] Status: WP + Submitter: Judy Ward Date: 2000-12-30

+

View all issues with WP status.

+

Discussion:

+

+ISO/IEC 9899:1990/Amendment1:1994 Section 4.3 States: "The list +of macros defined in <errno.h> is adjusted to include a new +macro, EILSEQ" +

+ +

+ISO/IEC 14882:1998(E) section 19.3 does not refer +to the above amendment. +

+ + + +

Proposed resolution:

+

+Update Table 26 (section 19.3) "Header <cerrno> synopsis" +and Table 95 (section C.2) "Standard Macros" to include EILSEQ. +

+ + + + + +
+

291. Underspecification of set algorithms

+

Section: 25.3.5 [alg.set.operations] Status: WP + Submitter: Matt Austern Date: 2001-01-03

+

View all other issues in [alg.set.operations].

+

View all issues with WP status.

+

Discussion:

+

+The standard library contains four algorithms that compute set +operations on sorted ranges: set_union, set_intersection, +set_difference, and set_symmetric_difference. Each +of these algorithms takes two sorted ranges as inputs, and writes the +output of the appropriate set operation to an output range. The elements +in the output range are sorted. +

+ +

+The ordinary mathematical definitions are generalized so that they +apply to ranges containing multiple copies of a given element. Two +elements are considered to be "the same" if, according to an +ordering relation provided by the user, neither one is less than the +other. So, for example, if one input range contains five copies of an +element and another contains three, the output range of set_union +will contain five copies, the output range of +set_intersection will contain three, the output range of +set_difference will contain two, and the output range of +set_symmetric_difference will contain two. +

+ +

+Because two elements can be "the same" for the purposes +of these set algorithms, without being identical in other respects +(consider, for example, strings under case-insensitive comparison), +this raises a number of unanswered questions: +

+ +
    +
  • If we're copying an element that's present in both of the +input ranges, which one do we copy it from?
  • +
  • If there are n copies of an element in the relevant +input range, and the output range will contain fewer copies (say +m) which ones do we choose? The first m, or the last +m, or something else?
  • +
  • Are these operations stable? That is, does a run of equivalent +elements appear in the output range in the same order as as it +appeared in the input range(s)?
  • +
+ +

+The standard should either answer these questions, or explicitly +say that the answers are unspecified. I prefer the former option, +since, as far as I know, all existing implementations behave the +same way. +

+ + + +

Proposed resolution:

+ +

Add the following to the end of 25.3.5.2 [set.union] paragraph 5:

+

+If [first1, last1) contains m elements that are equivalent to +each other and [first2, last2) contains n elements that are +equivalent to them, then max(m, n) of these elements +will be copied to the output range: all m of these elements +from [first1, last1), and the last max(n-m, 0) of them from +[first2, last2), in that order. +

+ +

Add the following to the end of 25.3.5.3 [set.intersection] paragraph 5:

+

+If [first1, last1) contains m elements that are equivalent to each +other and [first2, last2) contains n elements that are +equivalent to them, the first min(m, n) of those +elements from [first1, last1) are copied to the output range. +

+ +

Add a new paragraph, Notes, after 25.3.5.4 [set.difference] +paragraph 4:

+

+If [first1, last1) contains m elements that are equivalent to each +other and [first2, last2) contains n elements that are +equivalent to them, the last max(m-n, 0) elements from +[first1, last1) are copied to the output range. +

+ +

Add a new paragraph, Notes, after 25.3.5.5 [set.symmetric.difference] +paragraph 4:

+

+If [first1, last1) contains m elements that are equivalent to +each other and [first2, last2) contains n elements that are +equivalent to them, then |m - n| of those elements will be +copied to the output range: the last m - n of these elements +from [first1, last1) if m > n, and the last n - +m of these elements from [first2, last2) if m < n. +

+ +

[Santa Cruz: it's believed that this language is clearer than + what's in the Standard. However, it's also believed that the + Standard may already make these guarantees (although not quite in + these words). Bill and Howard will check and see whether they think + that some or all of these changes may be redundant. If so, we may + close this issue as NAD.]

+ + + + +

Rationale:

+

For simple cases, these descriptions are equivalent to what's + already in the Standard. For more complicated cases, they describe + the behavior of existing implementations.

+ + + + + +
+

292. effects of a.copyfmt (a)

+

Section: 27.4.4.2 [basic.ios.members] Status: WP + Submitter: Martin Sebor Date: 2001-01-05

+

View all other issues in [basic.ios.members].

+

View all issues with WP status.

+

Discussion:

+

The Effects clause of the member function copyfmt() in +27.4.4.2, p15 doesn't consider the case where the left-hand side +argument is identical to the argument on the right-hand side, that is +(this == &rhs). If the two arguments are identical there +is no need to copy any of the data members or call any callbacks +registered with register_callback(). Also, as Howard Hinnant +points out in message c++std-lib-8149 it appears to be incorrect to +allow the object to fire erase_event followed by +copyfmt_event since the callback handling the latter event +may inadvertently attempt to access memory freed by the former. +

+ + +

Proposed resolution:

+

Change the Effects clause in 27.4.4.2, p15 from

+ +

+-15- Effects:Assigns to the member objects of *this +the corresponding member objects of rhs, except that... +

+ +

to

+ +

+-15- Effects:If (this == &rhs) does nothing. Otherwise +assigns to the member objects of *this the corresponding member +objects of rhs, except that... +

+ + + + +
+

294. User defined macros and standard headers

+

Section: 17.4.3.1.1 [macro.names] Status: WP + Submitter: James Kanze Date: 2001-01-11

+

View all issues with WP status.

+

Discussion:

+

Paragraph 2 of 17.4.3.1.1 [macro.names] reads: "A +translation unit that includes a header shall not contain any macros +that define names declared in that header." As I read this, it +would mean that the following program is legal:

+ +
  #define npos 3.14
+  #include <sstream>
+
+ +

since npos is not defined in <sstream>. It is, however, defined +in <string>, and it is hard to imagine an implementation in +which <sstream> didn't include <string>.

+ +

I think that this phrase was probably formulated before it was +decided that a standard header may freely include other standard +headers. The phrase would be perfectly appropriate for C, for +example. In light of 17.4.4.1 [res.on.headers] paragraph 1, however, +it isn't stringent enough.

+ + +

Proposed resolution:

+

For 17.4.3.1.1 [macro.names], replace the current wording, which reads:

+
+

Each name defined as a macro in a header is reserved to the + implementation for any use if the translation unit includes + the header.168)

+ +

A translation unit that includes a header shall not contain any + macros that define names declared or defined in that header. Nor shall + such a translation unit define macros for names lexically + identical to keywords.

+ +

168) It is not permissible to remove a library macro definition by + using the #undef directive.

+
+ +

with the wording:

+ +
+

A translation unit that includes a standard library header shall not + #define or #undef names declared in any standard library header.

+ +

A translation unit shall not #define or #undef names lexically + identical to keywords.

+
+ +

[Lillehammer: Beman provided new wording]

+ + + + + + +
+

295. Is abs defined in <cmath>?

+

Section: 26.7 [c.math] Status: WP + Submitter: Jens Maurer Date: 2001-01-12

+

View other active issues in [c.math].

+

View all other issues in [c.math].

+

View all issues with WP status.

+

Discussion:

+

+Table 80 lists the contents of the <cmath> header. It does not +list abs(). However, 26.5, paragraph 6, which lists added +signatures present in <cmath>, does say that several overloads +of abs() should be defined in <cmath>. +

+ + +

Proposed resolution:

+

+Add abs to Table 80. Also, remove the parenthetical list +of functions "(abs(), div(), rand(), srand())" from 26.5 [numarray], +paragraph 1. +

+ +

[Copenhagen: Modified proposed resolution so that it also gets +rid of that vestigial list of functions in paragraph 1.]

+ + + + +

Rationale:

+

All this DR does is fix a typo; it's uncontroversial. A +separate question is whether we're doing the right thing in +putting some overloads in <cmath> that we aren't also +putting in <cstdlib>. That's issue 323.

+ + + + + +
+

297. const_mem_fun_t<>::argument_type should be const T*

+

Section: 20.5.8 [logical.operations] Status: WP + Submitter: Martin Sebor Date: 2001-01-06

+

View all issues with WP status.

+

Discussion:

+

The class templates const_mem_fun_t in 20.5.8, p8 and +const_mem_fun1_t +in 20.5.8, p9 derive from unary_function<T*, S>, and +binary_function<T*, +A, S>, respectively. Consequently, their argument_type, and +first_argument_type +members, respectively, are both defined to be T* (non-const). +However, their function call member operator takes a const T* +argument. It is my opinion that argument_type should be const +T* instead, so that one can easily refer to it in generic code. The +example below derived from existing code fails to compile due to the +discrepancy: +

+ +

template <class T> +
void foo (typename T::argument_type arg)   // #1 +
{ +
    typename T::result_type (T::*pf) (typename +T::argument_type) +const =   // #2 +
        &T::operator(); +
} +

+ +

struct X { /* ... */ };

+ +

int main () +
{ +
    const X x; +
    foo<std::const_mem_fun_t<void, X> +>(&x);   +// #3 +
} +

+ +

#1 foo() takes a plain unqualified X* as an argument +
#2 the type of the pointer is incompatible with the type of the member +function +
#3 the address of a constant being passed to a function taking a non-const +X* +

+ + +

Proposed resolution:

+

Replace the top portion of the definition of the class template +const_mem_fun_t in 20.5.8, p8 +

+

template <class S, class T> class const_mem_fun_t +
          : public +unary_function<T*, S> { +

+

with

+

template <class S, class T> class const_mem_fun_t +
          : public +unary_function<const T*, S> { +

+

Also replace the top portion of the definition of the class template +const_mem_fun1_t in 20.5.8, p9

+

template <class S, class T, class A> class const_mem_fun1_t +
          : public +binary_function<T*, A, S> { +

+

with

+

template <class S, class T, class A> class const_mem_fun1_t +
          : public +binary_function<const T*, A, S> { +

+ + +

Rationale:

+

This is simply a contradiction: the argument_type typedef, +and the argument type itself, are not the same.

+ + + + + +
+

298. ::operator delete[] requirement incorrect/insufficient

+

Section: 18.5.1.2 [new.delete.array] Status: WP + Submitter: John A. Pedretti Date: 2001-01-10

+

View all issues with WP status.

+

Discussion:

+

+The default behavior of operator delete[] described in 18.5.1.2, p12 - +namely that for non-null value of ptr, the operator reclaims storage +allocated by the earlier call to the default operator new[] - is not +correct in all cases. Since the specified operator new[] default +behavior is to call operator new (18.5.1.2, p4, p8), which can be +replaced, along with operator delete, by the user, to implement their +own memory management, the specified default behavior of operator +delete[] must be to call operator delete. +

+ + +

Proposed resolution:

+

Change 18.5.1.2, p12 from

+

+-12- Default behavior:

+
    +
  • +For a null value of ptr , does nothing. +
  • +
  • +Any other value of ptr shall be a value returned +earlier by a call to the default operator new[](std::size_t). +[Footnote: The value must not have been invalidated by an intervening +call to operator delete[](void*) (17.4.3.7 [res.on.arguments]). +--- end footnote] +For such a non-null value of ptr , reclaims storage +allocated by the earlier call to the default operator new[]. +
  • +
+
+ +

to

+ +

+-12- Default behavior: Calls operator +delete(ptr) +or operator delete(ptr, std::nothrow) respectively. +

+

and expunge paragraph 13.

+ + + + +
+

300. list::merge() specification incomplete

+

Section: 23.2.3.4 [list.ops] Status: WP + Submitter: John Pedretti Date: 2001-01-23

+

View all other issues in [list.ops].

+

View all issues with WP status.

+

Discussion:

+

+The "Effects" clause for list::merge() (23.2.3.4 [list.ops], p23) +appears to be incomplete: it doesn't cover the case where the argument +list is identical to *this (i.e., this == &x). The requirement in the +note in p24 (below) is that x be empty after the merge which is surely +unintended in this case. +

+ + +

Proposed resolution:

+

In 23.2.3.4 [list.ops], replace paragraps 23-25 with:

+
+

+23 Effects: if (&x == this) does nothing; otherwise, merges the two +sorted ranges [begin(), end()) and [x.begin(), x.end()). The result +is a range in which the elements will be sorted in non-decreasing +order according to the ordering defined by comp; that is, for every +iterator i in the range other than the first, the condition comp(*i, +*(i - 1)) will be false. +

+ +

+24 Notes: Stable: if (&x != this), then for equivalent elements in the +two original ranges, the elements from the original range [begin(), +end()) always precede the elements from the original range [x.begin(), +x.end()). If (&x != this) the range [x.begin(), x.end()) is empty +after the merge. +

+ +

+25 Complexity: At most size() + x.size() - 1 applications of comp if +(&x ! = this); otherwise, no applications of comp are performed. If +an exception is thrown other than by a comparison there are no +effects. +

+ +
+ +

[Copenhagen: The original proposed resolution did not fix all of +the problems in 23.2.3.4 [list.ops], p22-25. Three different +paragraphs (23, 24, 25) describe the effects of merge. +Changing p23, without changing the other two, appears to introduce +contradictions. Additionally, "merges the argument list into the +list" is excessively vague.]

+ + +

[Post-Curaçao: Robert Klarer provided new wording.]

+ + + + + + + +
+

301. basic_string template ctor effects clause omits allocator argument

+

Section: 21.3.1 [string.require] Status: WP + Submitter: Martin Sebor Date: 2001-01-27

+

View all other issues in [string.require].

+

View all issues with WP status.

+

Discussion:

+

+The effects clause for the basic_string template ctor in 21.3.1, p15 +leaves out the third argument of type Allocator. I believe this to be +a mistake. +

+ + +

Proposed resolution:

+

Replace

+ +
+

-15- Effects: If InputIterator is an integral + type, equivalent to

+ +

basic_string(static_cast<size_type>(begin), + static_cast<value_type>(end))

+
+ +

with

+ +
+

-15- Effects: If InputIterator is an integral + type, equivalent to

+ +

basic_string(static_cast<size_type>(begin), + static_cast<value_type>(end), a)

+
+ + + + +
+

303. Bitset input operator underspecified

+

Section: 23.3.5.3 [bitset.operators] Status: WP + Submitter: Matt Austern Date: 2001-02-05

+

View all issues with WP status.

+

Discussion:

+

+In 23.3.5.3, we are told that bitset's input operator +"Extracts up to N (single-byte) characters from +is.", where is is a stream of type +basic_istream<charT, traits>. +

+ +

+The standard does not say what it means to extract single byte +characters from a stream whose character type, charT, is in +general not a single-byte character type. Existing implementations +differ. +

+ +

+A reasonable solution will probably involve widen() and/or +narrow(), since they are the supplied mechanism for +converting a single character between char and +arbitrary charT. +

+ +

Narrowing the input characters is not the same as widening the +literals '0' and '1', because there may be some +locales in which more than one wide character maps to the narrow +character '0'. Narrowing means that alternate +representations may be used for bitset input, widening means that +they may not be.

+ +

Note that for numeric input, num_get<> +(22.2.2.1.2/8) compares input characters to widened version of narrow +character literals.

+ +

From Pete Becker, in c++std-lib-8224:

+
+

+Different writing systems can have different representations for the +digits that represent 0 and 1. For example, in the Unicode representation +of the Devanagari script (used in many of the Indic languages) the digit 0 +is 0x0966, and the digit 1 is 0x0967. Calling narrow would translate those +into '0' and '1'. But Unicode also provides the ASCII values 0x0030 and +0x0031 for for the Latin representations of '0' and '1', as well as code +points for the same numeric values in several other scripts (Tamil has no +character for 0, but does have the digits 1-9), and any of these values +would also be narrowed to '0' and '1'. +

+ +

...

+ +

+It's fairly common to intermix both native and Latin +representations of numbers in a document. So I think the rule has to be +that if a wide character represents a digit whose value is 0 then the bit +should be cleared; if it represents a digit whose value is 1 then the bit +should be set; otherwise throw an exception. So in a Devanagari locale, +both 0x0966 and 0x0030 would clear the bit, and both 0x0967 and 0x0031 +would set it. Widen can't do that. It would pick one of those two values, +and exclude the other one. +

+ +
+ +

From Jens Maurer, in c++std-lib-8233:

+ +
+

+Whatever we decide, I would find it most surprising if +bitset conversion worked differently from int conversion +with regard to alternate local representations of +numbers. +

+ +

Thus, I think the options are:

+
    +
  • Have a new defect issue for 22.2.2.1.2/8 so that it will +require the use of narrow().
  • + +
  • Have a defect issue for bitset() which describes clearly +that widen() is to be used.
  • +
+
+ + + +

Proposed resolution:

+ +

Replace the first two sentences of paragraph 5 with:

+ +

+ Extracts up to N characters from is. Stores these + characters in a temporary object str of type + basic_string<charT, traits>, then evaluates the + expression x = bitset<N>(str). +

+ +

Replace the third bullet item in paragraph 5 with:

+
  • + the next input character is neither is.widen(0) + nor is.widen(1) (in which case the input character + is not extracted). +
+ + + +

Rationale:

+

Input for bitset should work the same way as numeric +input. Using widen does mean that alternative digit +representations will not be recognized, but this was a known +consequence of the design choice.

+ + + + + +
+

305. Default behavior of codecvt<wchar_t, char, mbstate_t>::length()

+

Section: 22.2.1.5 [locale.codecvt.byname] Status: WP + Submitter: Howard Hinnant Date: 2001-01-24

+

View all other issues in [locale.codecvt.byname].

+

View all issues with WP status.

+

Discussion:

+

22.2.1.5/3 introduces codecvt in part with:

+ +

+ codecvt<wchar_t,char,mbstate_t> converts between the native + character sets for tiny and wide characters. Instantiations on + mbstate_t perform conversion between encodings known to the library + implementor. +

+ +

But 22.2.1.5.2/10 describes do_length in part with:

+ +

+ ... codecvt<wchar_t, char, mbstate_t> ... return(s) the lesser of max and + (from_end-from). +

+ +

+The semantics of do_in and do_length are linked. What one does must +be consistent with what the other does. 22.2.1.5/3 leads me to +believe that the vendor is allowed to choose the algorithm that +codecvt<wchar_t,char,mbstate_t>::do_in performs so that it makes +his customers happy on a given platform. But 22.2.1.5.2/10 explicitly +says what codecvt<wchar_t,char,mbstate_t>::do_length must +return. And thus indirectly specifies the algorithm that +codecvt<wchar_t,char,mbstate_t>::do_in must perform. I believe +that this is not what was intended and is a defect. +

+ +

Discussion from the -lib reflector: + +
This proposal would have the effect of making the semantics of +all of the virtual functions in codecvt<wchar_t, char, +mbstate_t> implementation specified. Is that what we want, or +do we want to mandate specific behavior for the base class virtuals +and leave the implementation specified behavior for the codecvt_byname +derived class? The tradeoff is that former allows implementors to +write a base class that actually does something useful, while the +latter gives users a way to get known and specified---albeit +useless---behavior, and is consistent with the way the standard +handles other facets. It is not clear what the original intention +was.

+ +

+Nathan has suggest a compromise: a character that is a widened version +of the characters in the basic execution character set must be +converted to a one-byte sequence, but there is no such requirement +for characters that are not part of the basic execution character set. +

+ + +

Proposed resolution:

+

+Change 22.2.1.5.2/5 from: +

+

+The instantiations required in Table 51 (lib.locale.category), namely +codecvt<wchar_t,char,mbstate_t> and +codecvt<char,char,mbstate_t>, store no characters. Stores no more +than (to_limit-to) destination elements. It always leaves the to_next +pointer pointing one beyond the last element successfully stored. +

+

+to: +

+

+Stores no more than (to_limit-to) destination elements, and leaves the +to_next pointer pointing one beyond the last element successfully +stored. codecvt<char,char,mbstate_t> stores no characters. +

+ +

Change 22.2.1.5.2/10 from:

+ +

+-10- Returns: (from_next-from) where from_next is the largest value in +the range [from,from_end] such that the sequence of values in the +range [from,from_next) represents max or fewer valid complete +characters of type internT. The instantiations required in Table 51 +(21.1.1.1.1), namely codecvt<wchar_t, char, mbstate_t> and +codecvt<char, char, mbstate_t>, return the lesser of max and +(from_end-from). +

+ +

to:

+ +

+-10- Returns: (from_next-from) where from_next is the largest value in +the range [from,from_end] such that the sequence of values in the range +[from,from_next) represents max or fewer valid complete characters of +type internT. The instantiation codecvt<char, char, mbstate_t> returns +the lesser of max and (from_end-from). +

+ +

[Redmond: Nathan suggested an alternative resolution: same as +above, but require that, in the default encoding, a character from the +basic execution character set would map to a single external +character. The straw poll was 8-1 in favor of the proposed +resolution.]

+ + + + +

Rationale:

+

The default encoding should be whatever users of a given platform +would expect to be the most natural. This varies from platform to +platform. In many cases there is a preexisting C library, and users +would expect the default encoding to be whatever C uses in the default +"C" locale. We could impose a guarantee like the one Nathan suggested +(a character from the basic execution character set must map to a +single external character), but this would rule out important +encodings that are in common use: it would rule out JIS, for +example, and it would rule out a fixed-width encoding of UCS-4.

+ +

[Curaçao: fixed rationale typo at the request of Ichiro Koshida; +"shift-JIS" changed to "JIS".]

+ + + + + + + +
+

306. offsetof macro and non-POD types

+

Section: 18.1 [support.types] Status: WP + Submitter: Steve Clamage Date: 2001-02-21

+

View all other issues in [support.types].

+

View all issues with WP status.

+

Discussion:

+

Spliced together from reflector messages c++std-lib-8294 and -8295:

+ +

18.1, paragraph 5, reads: "The macro offsetof +accepts a restricted set of type arguments in this +International Standard. type shall be a POD structure or a POD +union (clause 9). The result of applying the offsetof macro to a field +that is a static data member or a function member is +undefined."

+ +

For the POD requirement, it doesn't say "no diagnostic +required" or "undefined behavior". I read 1.4 [intro.compliance], paragraph 1, to mean that a diagnostic is required. +It's not clear whether this requirement was intended. While it's +possible to provide such a diagnostic, the extra complication doesn't +seem to add any value. +

+ + +

Proposed resolution:

+

Change 18.1, paragraph 5, to "If type is not a POD +structure or a POD union the results are undefined."

+ +

[Copenhagen: straw poll was 7-4 in favor. It was generally +agreed that requiring a diagnostic was inadvertent, but some LWG +members thought that diagnostics should be required whenever +possible.]

+ + + + + + +
+

307. Lack of reference typedefs in container adaptors

+

Section: 23.2.3 [list] Status: WP + Submitter: Howard Hinnant Date: 2001-03-13

+

View all issues with WP status.

+

Discussion:

+ +

From reflector message c++std-lib-8330. See also lib-8317.

+ +

+The standard is currently inconsistent in 23.2.3.2 [list.capacity] +paragraph 1 and 23.2.3.3 [list.modifiers] paragraph 1. +23.2.3.3/1, for example, says: +

+ +

+-1- Any sequence supporting operations back(), push_back() and pop_back() +can be used to instantiate stack. In particular, vector (lib.vector), list +(lib.list) and deque (lib.deque) can be used. +

+ +

But this is false: vector<bool> can not be used, because the +container adaptors return a T& rather than using the underlying +container's reference type.

+ +

This is a contradiction that can be fixed by:

+ +
    +
  1. Modifying these paragraphs to say that vector<bool> + is an exception.
  2. +
  3. Removing the vector<bool> specialization.
  4. +
  5. Changing the return types of stack and priority_queue to use + reference typedef's.
  6. +
+ +

+I propose 3. This does not preclude option 2 if we choose to do it +later (see issue 96); the issues are independent. Option +3 offers a small step towards support for proxied containers. This +small step fixes a current contradiction, is easy for vendors to +implement, is already implemented in at least one popular lib, and +does not break any code. +

+ + + +

Proposed resolution:

+

Summary: Add reference and const_reference typedefs to queue, +priority_queue and stack. Change return types of "value_type&" to +"reference". Change return types of "const value_type&" to +"const_reference". Details:

+ +

Change 23.2.3.1/1 from:

+ +
  namespace std {
+    template <class T, class Container = deque<T> >
+    class queue {
+    public:
+      typedef typename Container::value_type            value_type;
+      typedef typename Container::size_type             size_type;
+      typedef          Container                        container_type;
+    protected:
+      Container c;
+
+    public:
+      explicit queue(const Container& = Container());
+
+      bool      empty() const             { return c.empty(); }
+      size_type size()  const             { return c.size(); }
+      value_type&       front()           { return c.front(); }
+      const value_type& front() const     { return c.front(); }
+      value_type&       back()            { return c.back(); }
+      const value_type& back() const      { return c.back(); }
+      void push(const value_type& x)      { c.push_back(x); }
+      void pop()                          { c.pop_front(); }
+    };
+
+ +

to:

+ +
  namespace std {
+    template <class T, class Container = deque<T> >
+    class queue {
+    public:
+      typedef typename Container::value_type            value_type;
+      typedef typename Container::reference             reference;
+      typedef typename Container::const_reference       const_reference;
+      typedef typename Container::value_type            value_type;
+      typedef typename Container::size_type             size_type;
+      typedef          Container                        container_type;
+    protected:
+      Container c;
+
+    public:
+      explicit queue(const Container& = Container());
+
+      bool      empty() const             { return c.empty(); }
+      size_type size()  const             { return c.size(); }
+      reference         front()           { return c.front(); }
+      const_reference   front() const     { return c.front(); }
+      reference         back()            { return c.back(); }
+      const_reference   back() const      { return c.back(); }
+      void push(const value_type& x)      { c.push_back(x); }
+      void pop()                          { c.pop_front(); }
+    };
+
+ +

Change 23.2.3.2/1 from:

+ +
  namespace std {
+    template <class T, class Container = vector<T>,
+              class Compare = less<typename Container::value_type> >
+    class priority_queue {
+    public:
+      typedef typename Container::value_type            value_type;
+      typedef typename Container::size_type             size_type;
+      typedef          Container                        container_type;
+    protected:
+      Container c;
+      Compare comp;
+
+    public:
+      explicit priority_queue(const Compare& x = Compare(),
+                              const Container& = Container());
+      template <class InputIterator>
+        priority_queue(InputIterator first, InputIterator last,
+                       const Compare& x = Compare(),
+                       const Container& = Container());
+
+      bool      empty() const       { return c.empty(); }
+      size_type size()  const       { return c.size(); }
+      const value_type& top() const { return c.front(); }
+      void push(const value_type& x);
+      void pop();
+    };
+                                  //  no equality is provided
+  }
+
+ +

to:

+ +
  namespace std {
+    template <class T, class Container = vector<T>,
+              class Compare = less<typename Container::value_type> >
+    class priority_queue {
+    public:
+      typedef typename Container::value_type            value_type;
+      typedef typename Container::reference             reference;
+      typedef typename Container::const_reference       const_reference;
+      typedef typename Container::size_type             size_type;
+      typedef          Container                        container_type;
+    protected:
+      Container c;
+      Compare comp;
+
+    public:
+      explicit priority_queue(const Compare& x = Compare(),
+                              const Container& = Container());
+      template <class InputIterator>
+        priority_queue(InputIterator first, InputIterator last,
+                       const Compare& x = Compare(),
+                       const Container& = Container());
+
+      bool      empty() const       { return c.empty(); }
+      size_type size()  const       { return c.size(); }
+      const_reference   top() const { return c.front(); }
+      void push(const value_type& x);
+      void pop();
+    };
+                                  //  no equality is provided
+  }
+
+ +

And change 23.2.3.3/1 from:

+ +
  namespace std {
+    template <class T, class Container = deque<T> >
+    class stack {
+    public:
+      typedef typename Container::value_type            value_type;
+      typedef typename Container::size_type             size_type;
+      typedef          Container                        container_type;
+    protected:
+      Container c;
+
+    public:
+      explicit stack(const Container& = Container());
+
+      bool      empty() const             { return c.empty(); }
+      size_type size()  const             { return c.size(); }
+      value_type&       top()             { return c.back(); }
+      const value_type& top() const       { return c.back(); }
+      void push(const value_type& x)      { c.push_back(x); }
+      void pop()                          { c.pop_back(); }
+    };
+
+    template <class T, class Container>
+      bool operator==(const stack<T, Container>& x,
+                      const stack<T, Container>& y);
+    template <class T, class Container>
+      bool operator< (const stack<T, Container>& x,
+                      const stack<T, Container>& y);
+    template <class T, class Container>
+      bool operator!=(const stack<T, Container>& x,
+                      const stack<T, Container>& y);
+    template <class T, class Container>
+      bool operator> (const stack<T, Container>& x,
+                      const stack<T, Container>& y);
+    template <class T, class Container>
+      bool operator>=(const stack<T, Container>& x,
+                      const stack<T, Container>& y);
+    template <class T, class Container>
+      bool operator<=(const stack<T, Container>& x,
+                      const stack<T, Container>& y);
+  }
+
+ +

to:

+ +
  namespace std {
+    template <class T, class Container = deque<T> >
+    class stack {
+    public:
+      typedef typename Container::value_type            value_type;
+      typedef typename Container::reference             reference;
+      typedef typename Container::const_reference       const_reference;
+      typedef typename Container::size_type             size_type;
+      typedef          Container                        container_type;
+    protected:
+      Container c;
+
+    public:
+      explicit stack(const Container& = Container());
+
+      bool      empty() const             { return c.empty(); }
+      size_type size()  const             { return c.size(); }
+      reference         top()             { return c.back(); }
+      const_reference   top() const       { return c.back(); }
+      void push(const value_type& x)      { c.push_back(x); }
+      void pop()                          { c.pop_back(); }
+    };
+
+    template <class T, class Container>
+      bool operator==(const stack<T, Container>& x,
+                      const stack<T, Container>& y);
+    template <class T, class Container>
+      bool operator< (const stack<T, Container>& x,
+                      const stack<T, Container>& y);
+    template <class T, class Container>
+      bool operator!=(const stack<T, Container>& x,
+                      const stack<T, Container>& y);
+    template <class T, class Container>
+      bool operator> (const stack<T, Container>& x,
+                      const stack<T, Container>& y);
+    template <class T, class Container>
+      bool operator>=(const stack<T, Container>& x,
+                      const stack<T, Container>& y);
+    template <class T, class Container>
+      bool operator<=(const stack<T, Container>& x,
+                      const stack<T, Container>& y);
+  }
+
+ +

[Copenhagen: This change was discussed before the IS was released +and it was deliberately not adopted. Nevertheless, the LWG believes +(straw poll: 10-2) that it is a genuine defect.]

+ + + + + + +
+

308. Table 82 mentions unrelated headers

+

Section: 27 [input.output] Status: WP + Submitter: Martin Sebor Date: 2001-03-15

+

View all other issues in [input.output].

+

View all issues with WP status.

+

Discussion:

+

+Table 82 in section 27 mentions the header <cstdlib> for String +streams (27.7 [string.streams]) and the headers <cstdio> and +<cwchar> for File streams (27.8 [file.streams]). It's not clear +why these headers are mentioned in this context since they do not +define any of the library entities described by the +subclauses. According to 17.4.1.1 [contents], only such headers +are to be listed in the summary. +

+ + +

Proposed resolution:

+

Remove <cstdlib> and <cwchar> from +Table 82.

+ +

[Copenhagen: changed the proposed resolution slightly. The +original proposed resolution also said to remove <cstdio> from +Table 82. However, <cstdio> is mentioned several times within +section 27.8 [file.streams], including 27.8.2 [c.files].]

+ + + + + + +
+

310. Is errno a macro?

+

Section: 17.4.1.2 [headers], 19.3 [errno] Status: WP + Submitter: Steve Clamage Date: 2001-03-21

+

View all other issues in [headers].

+

View all issues with WP status.

+

Discussion:

+

+ Exactly how should errno be declared in a conforming C++ header? +

+ +

+ The C standard says in 7.1.4 that it is unspecified whether errno is a + macro or an identifier with external linkage. In some implementations + it can be either, depending on compile-time options. (E.g., on + Solaris in multi-threading mode, errno is a macro that expands to a + function call, but is an extern int otherwise. "Unspecified" allows + such variability.) +

+ +

The C++ standard:

+
    +
  • 17.4.1.2 says in a note that errno must be macro in C. (false)
  • +
  • 17.4.3.1.3 footnote 166 says errno is reserved as an external + name (true), and implies that it is an identifier.
  • +
  • 19.3 simply lists errno as a macro (by what reasoning?) and goes + on to say that the contents of of C++ <errno.h> are the + same as in C, begging the question.
  • +
  • C.2, table 95 lists errno as a macro, without comment.
  • +
+ +

I find no other references to errno.

+ +

We should either explicitly say that errno must be a macro, even + though it need not be a macro in C, or else explicitly leave it + unspecified. We also need to say something about namespace std. + A user who includes <cerrno> needs to know whether to write + errno, or ::errno, or std::errno, or + else <cerrno> is useless.

+ +

Two acceptable fixes:

+
    +
  • errno must be a macro. This is trivially satisfied by adding
    +   #define errno (::std::errno)
    + to the headers if errno is not already a macro. You then always + write errno without any scope qualification, and it always expands + to a correct reference. Since it is always a macro, you know to + avoid using errno as a local identifer.

  • +
  • errno is in the global namespace. This fix is inferior, because + ::errno is not guaranteed to be well-formed.

  • +
+ +

[ + This issue was first raised in 1999, but it slipped through + the cracks. + ]

+ + + +

Proposed resolution:

+

Change the Note in section 17.4.1.2p5 from

+ +

+ Note: the names defined as macros in C include the following: + assert, errno, offsetof, setjmp, va_arg, va_end, and va_start. +

+ +

to

+ +

+ Note: the names defined as macros in C include the following: + assert, offsetof, setjmp, va_arg, va_end, and va_start. +

+ +

In section 19.3, change paragraph 2 from

+ +

+ The contents are the same as the Standard C library header + <errno.h>. +

+ +

to

+ +

+ The contents are the same as the Standard C library header + <errno.h>, except that errno shall be defined as a macro. +

+ + +

Rationale:

+

C++ must not leave it up to the implementation to decide whether or +not a name is a macro; it must explicitly specify exactly which names +are required to be macros. The only one that really works is for it +to be a macro.

+ +

[Curaçao: additional rationale added.]

+ + + + + + + +
+

311. Incorrect wording in basic_ostream class synopsis

+

Section: 27.6.2.1 [ostream] Status: WP + Submitter: Andy Sawyer Date: 2001-03-21

+

View all other issues in [ostream].

+

View all issues with WP status.

+

Discussion:

+ +

In 27.6.2.1 [ostream], the synopsis of class basic_ostream says:

+ +
  // partial specializationss
+  template<class traits>
+    basic_ostream<char,traits>& operator<<( basic_ostream<char,traits>&,
+                                            const char * );
+
+ +

Problems:

+
    +
  • Too many 's's at the end of "specializationss"
  • +
  • This is an overload, not a partial specialization
  • +
+ + + +

Proposed resolution:

+

In the synopsis in 27.6.2.1 [ostream], remove the +// partial specializationss comment. Also remove the same +comment (correctly spelled, but still incorrect) from the synopsis in +27.6.2.6.4 [ostream.inserters.character]. +

+ +

[ +Pre-Redmond: added 27.6.2.6.4 [ostream.inserters.character] because of Martin's +comment in c++std-lib-8939. +]

+ + + + + + + +
+

312. Table 27 is missing headers

+

Section: 20 [utilities] Status: WP + Submitter: Martin Sebor Date: 2001-03-29

+

View all issues with WP status.

+

Discussion:

+

Table 27 in section 20 lists the header <memory> (only) for +Memory (lib.memory) but neglects to mention the headers +<cstdlib> and <cstring> that are discussed in 20.4.5 [meta.rel].

+ + +

Proposed resolution:

+

Add <cstdlib> and <cstring> to Table 27, in the same row +as <memory>.

+ + + + + +
+

315. Bad "range" in list::unique complexity

+

Section: 23.2.3.4 [list.ops] Status: WP + Submitter: Andy Sawyer Date: 2001-05-01

+

View all other issues in [list.ops].

+

View all issues with WP status.

+

Discussion:

+

+23.2.3.4 [list.ops], Para 21 describes the complexity of +list::unique as: "If the range (last - first) is not empty, exactly +(last - first) -1 applications of the corresponding predicate, +otherwise no applications of the predicate)". +

+ +

+"(last - first)" is not a range. +

+ + +

Proposed resolution:

+

+Change the "range" from (last - first) to [first, last). +

+ + + + +
+

316. Vague text in Table 69

+

Section: 23.1.2 [associative.reqmts] Status: WP + Submitter: Martin Sebor Date: 2001-05-04

+

View all other issues in [associative.reqmts].

+

View all issues with WP status.

+

Discussion:

+

Table 69 says this about a_uniq.insert(t):

+ +

+inserts t if and only if there is no element in the container with key +equivalent to the key of t. The bool component of the returned pair +indicates whether the insertion takes place and the iterator component of the +pair points to the element with key equivalent to the key of t. +

+ +

The description should be more specific about exactly how the bool component +indicates whether the insertion takes place.

+ + +

Proposed resolution:

+

Change the text in question to

+ +

+...The bool component of the returned pair is true if and only if the insertion +takes place... +

+ + + + + +
+

317. Instantiation vs. specialization of facets

+

Section: 22 [localization] Status: WP + Submitter: Martin Sebor Date: 2001-05-04

+

View all other issues in [localization].

+

View all issues with WP status.

+

Discussion:

+

+The localization section of the standard refers to specializations of +the facet templates as instantiations even though the required facets +are typically specialized rather than explicitly (or implicitly) +instantiated. In the case of ctype<char> and +ctype_byname<char> (and the wchar_t versions), these facets are +actually required to be specialized. The terminology should be +corrected to make it clear that the standard doesn't mandate explicit +instantiation (the term specialization encompasses both explicit +instantiations and specializations). +

+ + +

Proposed resolution:

+

+In the following paragraphs, replace all occurrences of the word +instantiation or instantiations with specialization or specializations, +respectively: +

+ +

+22.1.1.1.1, p4, Table 52, 22.2.1.1, p2, 22.2.1.5, p3, 22.2.1.5.1, p5, +22.2.1.5.2, p10, 22.2.2, p2, 22.2.3.1, p1, 22.2.3.1.2, p1, p2 and p3, +22.2.4.1, p1, 22.2.4.1.2, p1, 22,2,5, p1, 22,2,6, p2, 22.2.6.3.2, p7, and +Footnote 242. +

+ +

And change the text in 22.1.1.1.1, p4 from

+ +

+ An implementation is required to provide those instantiations + for facet templates identified as members of a category, and + for those shown in Table 52: +

+ +

to

+ +

+ An implementation is required to provide those specializations... +

+ +

[Nathan will review these changes, and will look for places where +explicit specialization is necessary.]

+ + + + +

Rationale:

+

This is a simple matter of outdated language. The language to +describe templates was clarified during the standardization process, +but the wording in clause 22 was never updated to reflect that +change.

+ + + + + + + +
+

318. Misleading comment in definition of numpunct_byname

+

Section: 22.2.3.2 [locale.numpunct.byname] Status: WP + Submitter: Martin Sebor Date: 2001-05-12

+

View all issues with WP status.

+

Discussion:

+

The definition of the numpunct_byname template contains the following +comment:

+ +
    namespace std {
+        template <class charT>
+        class numpunct_byname : public numpunct<charT> {
+    // this class is specialized for char and wchar_t.
+        ...
+
+ +

There is no documentation of the specializations and it seems +conceivable that an implementation will not explicitly specialize the +template at all, but simply provide the primary template.

+ + +

Proposed resolution:

+

Remove the comment from the text in 22.2.3.2 and from the proposed +resolution of library issue 228.

+ + + + +
+

319. Storage allocation wording confuses "Required behavior", "Requires"

+

Section: 18.5.1.1 [new.delete.single], 18.5.1.2 [new.delete.array] Status: WP + Submitter: Beman Dawes Date: 2001-05-15

+

View all other issues in [new.delete.single].

+

View all issues with WP status.

+

Discussion:

+

The standard specifies 17.3.1.3 [structure.specifications] that "Required +behavior" elements describe "the semantics of a function definition +provided by either the implementation or a C++ program."

+ +

The standard specifies 17.3.1.3 [structure.specifications] that "Requires" +elements describe "the preconditions for calling the function."

+ +

In the sections noted below, the current wording specifies +"Required Behavior" for what are actually preconditions, and thus +should be specified as "Requires".

+ + + +

Proposed resolution:

+ +

In 18.5.1.1 [new.delete.single] Para 12 Change:

+
+

Required behavior: accept a value of ptr that is null or that was + returned by an earlier call ...

+
+

to:

+
+

Requires: the value of ptr is null or the value returned by an + earlier call ...

+
+ +

In 18.5.1.2 [new.delete.array] Para 11 Change:

+
+

Required behavior: accept a value of ptr that is null or that was + returned by an earlier call ...

+
+

to:

+
+

Requires: the value of ptr is null or the value returned by an + earlier call ...

+
+ + + + + +
+

320. list::assign overspecified

+

Section: 23.2.3.1 [list.cons] Status: WP + Submitter: Howard Hinnant Date: 2001-05-17

+

View all other issues in [list.cons].

+

View all issues with WP status.

+

Discussion:

+

+Section 23.2.3.1 [list.cons], paragraphs 6-8 specify that list assign (both forms) have +the "effects" of a call to erase followed by a call to insert. +

+ +

+I would like to document that implementers have the freedom to implement +assign by other methods, as long as the end result is the same and the +exception guarantee is as good or better than the basic guarantee. +

+ +

+The motivation for this is to use T's assignment operator to recycle +existing nodes in the list instead of erasing them and reallocating +them with new values. It is also worth noting that, with careful +coding, most common cases of assign (everything but assignment with +true input iterators) can elevate the exception safety to strong if +T's assignment has a nothrow guarantee (with no extra memory cost). +Metrowerks does this. However I do not propose that this subtlety be +standardized. It is a QoI issue.

+ +

Existing practise: +Metrowerks and SGI recycle nodes, Dinkumware and Rogue Wave don't. +

+ + +

Proposed resolution:

+

Change 23.2.3.1 [list.cons]/7 from:

+ +
+

Effects:

+ +
   erase(begin(), end());
+   insert(begin(), first, last);
+
+
+ +

to:

+ +
+

Effects: Replaces the contents of the list with the range [first, last).

+
+ +

In 23.1.1 [sequence.reqmts], in Table 67 (sequence requirements), +add two new rows:

+
      a.assign(i,j)     void      pre: i,j are not iterators into a.
+                                  Replaces elements in a with a copy
+                                  of [i, j).
+
+      a.assign(n,t)     void      pre: t is not a reference into a.
+                                  Replaces elements in a with n copies
+                                  of t.
+
+ +

Change 23.2.3.1 [list.cons]/8 from:

+ +
+

Effects:

+
   erase(begin(), end());
+   insert(begin(), n, t);
+
+
+

to:

+ +
+

Effects: Replaces the contents of the list with n copies of t.

+
+ +

[Redmond: Proposed resolution was changed slightly. Previous +version made explicit statement about exception safety, which wasn't +consistent with the way exception safety is expressed elsewhere. +Also, the change in the sequence requirements is new. Without that +change, the proposed resolution would have required that assignment of +a subrange would have to work. That too would have been +overspecification; it would effectively mandate that assignment use a +temporary. Howard provided wording. +]

+ + +

[Curaçao: Made editorial improvement in wording; changed +"Replaces elements in a with copies of elements in [i, j)." +with "Replaces the elements of a with a copy of [i, j)." +Changes not deemed serious enough to requre rereview.]

+ + + + + + + +
+

321. Typo in num_get

+

Section: 22.2.2.1.2 [facet.num.get.virtuals] Status: WP + Submitter: Kevin Djang Date: 2001-05-17

+

View other active issues in [facet.num.get.virtuals].

+

View all other issues in [facet.num.get.virtuals].

+

View all issues with WP status.

+

Discussion:

+

+Section 22.2.2.1.2 at p7 states that "A length specifier is added to +the conversion function, if needed, as indicated in Table 56." +However, Table 56 uses the term "length modifier", not "length +specifier". +

+ + +

Proposed resolution:

+

+In 22.2.2.1.2 at p7, change the text "A length specifier is added ..." +to be "A length modifier is added ..." +

+ + +

Rationale:

+

C uses the term "length modifier". We should be consistent.

+ + + + + + +
+

322. iterator and const_iterator should have the same value type

+

Section: 23.1 [container.requirements] Status: WP + Submitter: Matt Austern Date: 2001-05-17

+

View other active issues in [container.requirements].

+

View all other issues in [container.requirements].

+

View all issues with WP status.

+

Discussion:

+

+It's widely assumed that, if X is a container, +iterator_traits<X::iterator>::value_type and +iterator_traits<X::const_iterator>::value_type should both be +X::value_type. However, this is nowhere stated. The language in +Table 65 is not precise about the iterators' value types (it predates +iterator_traits), and could even be interpreted as saying that +iterator_traits<X::const_iterator>::value_type should be "const +X::value_type". +

+ +

Related issue: 279.

+ + +

Proposed resolution:

+

In Table 65 ("Container Requirements"), change the return type for +X::iterator to "iterator type whose value type is T". Change the +return type for X::const_iterator to "constant iterator type whose +value type is T".

+ + +

Rationale:

+

+This belongs as a container requirement, rather than an iterator +requirement, because the whole notion of iterator/const_iterator +pairs is specific to containers' iterator. +

+

+It is existing practice that (for example) +iterator_traits<list<int>::const_iterator>::value_type +is "int", rather than "const int". This is consistent with +the way that const pointers are handled: the standard already +requires that iterator_traits<const int*>::value_type is int. +

+ + + + + +
+

324. Do output iterators have value types?

+

Section: 24.1.2 [output.iterators] Status: WP + Submitter: Dave Abrahams Date: 2001-06-07

+

View all other issues in [output.iterators].

+

View all issues with WP status.

+

Discussion:

+ +

Table 73 suggests that output iterators have value types. It +requires the expression "*a = t". Additionally, although Table 73 +never lists "a = t" or "X(a) = t" in the "expressions" column, it +contains a note saying that "a = t" and "X(a) = t" have equivalent +(but nowhere specified!) semantics.

+ +

According to 24.1/9, t is supposed to be "a value of value type +T":

+ +

+ In the following sections, a and b denote values of X, n denotes a + value of the difference type Distance, u, tmp, and m denote + identifiers, r denotes a value of X&, t denotes a value of + value type T. +

+ +

Two other parts of the standard that are relevant to whether +output iterators have value types:

+ +
    +
  • 24.1/1 says "All iterators i support the expression *i, + resulting in a value of some class, enumeration, or built-in type + T, called the value type of the iterator".
  • + +
  • + 24.3.1/1, which says "In the case of an output iterator, the types + iterator_traits<Iterator>::difference_type + iterator_traits<Iterator>::value_type are both defined as void." +
  • +
+ +

The first of these passages suggests that "*i" is supposed to +return a useful value, which contradicts the note in 24.1.2/2 saying +that the only valid use of "*i" for output iterators is in an +expression of the form "*i = t". The second of these passages appears +to contradict Table 73, because it suggests that "*i"'s return value +should be void. The second passage is also broken in the case of a an +iterator type, like non-const pointers, that satisfies both the output +iterator requirements and the forward iterator requirements.

+ +

What should the standard say about *i's return value when +i is an output iterator, and what should it say about that t is in the +expression "*i = t"? Finally, should the standard say anything about +output iterators' pointer and reference types?

+ + + +

Proposed resolution:

+

24.1 p1, change

+ +
+

All iterators i support the expression *i, resulting +in a value of some class, enumeration, or built-in type T, +called the value type of the iterator.

+
+ +

to

+ +
+

All input iterators i support the expression *i, +resulting in a value of some class, enumeration, or built-in type +T, called the value type of the iterator. All output +iterators support the expression *i = o where o is a +value of some type that is in the set of types that are writable to +the particular iterator type of i. +

+
+ +

24.1 p9, add

+ +
+

o denotes a value of some type that is writable to the +output iterator. +

+
+ +

Table 73, change

+ +
+
*a = t
+
+
+ +

to

+ +
+
*r = o
+
+
+ +

and change

+ +
+
*r++ = t
+
+
+ +

to

+ +
+
*r++ = o
+
+
+ +

[post-Redmond: Jeremy provided wording]

+ + + + +

Rationale:

+

The LWG considered two options: change all of the language that +seems to imply that output iterators have value types, thus making it +clear that output iterators have no value types, or else define value +types for output iterator consistently. The LWG chose the former +option, because it seems clear that output iterators were never +intended to have value types. This was a deliberate design decision, +and any language suggesting otherwise is simply a mistake.

+ +

A future revision of the standard may wish to revisit this design +decision.

+ + + + + +
+

325. Misleading text in moneypunct<>::do_grouping

+

Section: 22.2.6.3.2 [locale.moneypunct.virtuals] Status: WP + Submitter: Martin Sebor Date: 2001-07-02

+

View all other issues in [locale.moneypunct.virtuals].

+

View all issues with WP status.

+

Discussion:

+

The Returns clause in 22.2.6.3.2, p3 says about +moneypunct<charT>::do_grouping() +

+ +

+ Returns: A pattern defined identically as the result of + numpunct<charT>::do_grouping().241) +

+ +

Footnote 241 then reads

+ +

+ This is most commonly the value "\003" (not "3"). +

+ +

+The returns clause seems to imply that the two member functions must +return an identical value which in reality may or may not be true, +since the facets are usually implemented in terms of struct std::lconv +and return the value of the grouping and mon_grouping, respectively. +The footnote also implies that the member function of the moneypunct +facet (rather than the overridden virtual functions in moneypunct_byname) +most commonly return "\003", which contradicts the C standard which +specifies the value of "" for the (most common) C locale. +

+ + + +

Proposed resolution:

+

Replace the text in Returns clause in 22.2.6.3.2, p3 with the following:

+ +

+ Returns: A pattern defined identically as, but not necessarily + equal to, the result of numpunct<charT>::do_grouping().241) +

+ +

and replace the text in Footnote 241 with the following:

+ +

+ To specify grouping by 3s the value is "\003", not "3". +

+ + +

Rationale:

+

+The fundamental problem is that the description of the locale facet +virtuals serves two purposes: describing the behavior of the base +class, and describing the meaning of and constraints on the behavior +in arbitrary derived classes. The new wording makes that separation a +little bit clearer. The footnote (which is nonnormative) is not +supposed to say what the grouping is in the "C" locale or in any other +locale. It is just a reminder that the values are interpreted as small +integers, not ASCII characters. +

+ + + + +
+

327. Typo in time_get facet in table 52

+

Section: 22.1.1.1.1 [locale.category] Status: WP + Submitter: Tiki Wan Date: 2001-07-06

+

View all other issues in [locale.category].

+

View all issues with WP status.

+

Duplicate of: 447

+

Discussion:

+

The wchar_t versions of time_get and +time_get_byname are listed incorrectly in table 52, +required instantiations. In both cases the second template +parameter is given as OutputIterator. It should instead be +InputIterator, since these are input facets.

+ + +

Proposed resolution:

+

+In table 52, required instantiations, in +22.1.1.1.1 [locale.category], change

+
    time_get<wchar_t, OutputIterator>
+    time_get_byname<wchar_t, OutputIterator>
+
+

to

+
    time_get<wchar_t, InputIterator>
+    time_get_byname<wchar_t, InputIterator>
+
+ +

[Redmond: Very minor change in proposed resolution. Original had +a typo, wchart instead of wchar_t.]

+ + + + + + +
+

328. Bad sprintf format modifier in money_put<>::do_put()

+

Section: 22.2.6.2.2 [locale.money.put.virtuals] Status: WP + Submitter: Martin Sebor Date: 2001-07-07

+

View all issues with WP status.

+

Discussion:

+

The sprintf format string , "%.01f" (that's the digit one), in the +description of the do_put() member functions of the money_put facet in +22.2.6.2.2, p1 is incorrect. First, the f format specifier is wrong +for values of type long double, and second, the precision of 01 +doesn't seem to make sense. What was most likely intended was +"%.0Lf"., that is a precision of zero followed by the L length +modifier.

+ + +

Proposed resolution:

+

Change the format string to "%.0Lf".

+ + +

Rationale:

Fixes an obvious typo

+ + + + +
+

329. vector capacity, reserve and reallocation

+

Section: 23.2.5.2 [vector.capacity], 23.2.5.4 [vector.modifiers] Status: WP + Submitter: Anthony Williams Date: 2001-07-13

+

View all other issues in [vector.capacity].

+

View all issues with WP status.

+

Discussion:

+

+There is an apparent contradiction about which circumstances can cause +a reallocation of a vector in Section 23.2.5.2 [vector.capacity] and +section 23.2.5.4 [vector.modifiers]. +

+ +

23.2.5.2 [vector.capacity],p5 says:

+

+Notes: Reallocation invalidates all the references, pointers, and iterators +referring to the elements in the sequence. It is guaranteed that no +reallocation takes place during insertions that happen after a call to +reserve() until the time when an insertion would make the size of the vector +greater than the size specified in the most recent call to reserve(). +

+ +

Which implies if I do

+ +
  std::vector<int> vec;
+  vec.reserve(23);
+  vec.reserve(0);
+  vec.insert(vec.end(),1);
+
+ +

then the implementation may reallocate the vector for the insert, +as the size specified in the previous call to reserve was zero.

+ +

However, the previous paragraphs (23.2.5.2 [vector.capacity], p1-2) state:

+
+

+(capacity) Returns: The total number of elements the vector +can hold without requiring reallocation +

+

+...After reserve(), capacity() is greater or equal to the +argument of reserve if reallocation happens; and equal to the previous value +of capacity() otherwise... +

+
+ +

+This implies that vec.capacity() is still 23, and so the insert() +should not require a reallocation, as vec.size() is 0. This is backed +up by 23.2.5.4 [vector.modifiers], p1: +

+

+(insert) Notes: Causes reallocation if the new size is greater than the old +capacity. +

+ +

+Though this doesn't rule out reallocation if the new size is less +than the old capacity, I think the intent is clear. +

+ + + +

Proposed resolution:

+

Change the wording of 23.2.5.2 [vector.capacity] paragraph 5 to:

+ +

+Notes: Reallocation invalidates all the references, pointers, and +iterators referring to the elements in the sequence. It is guaranteed +that no reallocation takes place during insertions that happen after a +call to reserve() until the time when an insertion would make the size +of the vector greater than the value of capacity(). +

+ +

[Redmond: original proposed resolution was modified slightly. In +the original, the guarantee was that there would be no reallocation +until the size would be greater than the value of capacity() after the +most recent call to reserve(). The LWG did not believe that the +"after the most recent call to reserve()" added any useful +information.]

+ + + + +

Rationale:

+

There was general agreement that, when reserve() is called twice in +succession and the argument to the second invocation is smaller than +the argument to the first, the intent was for the second invocation to +have no effect. Wording implying that such cases have an effect on +reallocation guarantees was inadvertant.

+ + + + + +
+

331. bad declaration of destructor for ios_base::failure

+

Section: 27.4.2.1.1 [ios::failure] Status: WP + Submitter: PremAnand M. Rao Date: 2001-08-23

+

View all other issues in [ios::failure].

+

View all issues with WP status.

+

Discussion:

+

+With the change in 17.4.4.8 [res.on.exception.handling] to state + "An implementation may strengthen the exception-specification for a + non-virtual function by removing listed exceptions." +(issue 119) +and the following declaration of ~failure() in ios_base::failure +

+
    namespace std {
+       class ios_base::failure : public exception {
+       public:
+           ...
+           virtual ~failure();
+           ...
+       };
+     }
+
+

the class failure cannot be implemented since in 18.6.1 [type.info] the destructor of class exception has an empty +exception specification:

+
    namespace std {
+       class exception {
+       public:
+         ...
+         virtual ~exception() throw();
+         ...
+       };
+     }
+
+ + +

Proposed resolution:

+

Remove the declaration of ~failure().

+ + +

Rationale:

+

The proposed resolution is consistent with the way that destructors +of other classes derived from exception are handled.

+ + + + + + + +
+

333. does endl imply synchronization with the device?

+

Section: 27.6.2.8 [ostream.manip] Status: WP + Submitter: PremAnand M. Rao Date: 2001-08-27

+

View all issues with WP status.

+

Discussion:

+

A footnote in 27.6.2.8 [ostream.manip] states:

+

+ [Footnote: The effect of executing cout << endl is to insert a + newline character in the output sequence controlled by cout, then + synchronize it with any external file with which it might be + associated. --- end foonote] +

+ +

+Does the term "file" here refer to the external device? +This leads to some implementation ambiguity on systems with fully +buffered files where a newline does not cause a flush to the device. +

+ +

+Choosing to sync with the device leads to significant performance +penalties for each call to endl, while not sync-ing leads to +errors under special circumstances. +

+ +

+I could not find any other statement that explicitly defined +the behavior one way or the other. +

+ + +

Proposed resolution:

+

Remove footnote 300 from section 27.6.2.8 [ostream.manip].

+ + +

Rationale:

+

We already have normative text saying what endl does: it +inserts a newline character and calls flush. This footnote +is at best redundant, at worst (as this issue says) misleading, +because it appears to make promises about what flush +does.

+ + + + + + + +
+

334. map::operator[] specification forces inefficient implementation

+

Section: 23.3.1.2 [map.access] Status: WP + Submitter: Andrea Griffini Date: 2001-09-02

+

View all other issues in [map.access].

+

View all issues with WP status.

+

Discussion:

+

+The current standard describes map::operator[] using a +code example. That code example is however quite +inefficient because it requires several useless copies +of both the passed key_type value and of default +constructed mapped_type instances. +My opinion is that was not meant by the comitee to +require all those temporary copies. +

+ +

Currently map::operator[] behaviour is specified as:

+
  Returns:
+    (*((insert(make_pair(x, T()))).first)).second.
+
+ +

+This specification however uses make_pair that is a +template function of which parameters in this case +will be deduced being of type const key_type& and +const T&. This will create a pair<key_type,T> that +isn't the correct type expected by map::insert so +another copy will be required using the template +conversion constructor available in pair to build +the required pair<const key_type,T> instance. +

+ +

If we consider calling of key_type copy constructor +and mapped_type default constructor and copy +constructor as observable behaviour (as I think we +should) then the standard is in this place requiring +two copies of a key_type element plus a default +construction and two copy construction of a mapped_type +(supposing the addressed element is already present +in the map; otherwise at least another copy +construction for each type). +

+ +

A simple (half) solution would be replacing the description with:

+
  Returns:
+    (*((insert(value_type(x, T()))).first)).second.
+
+ +

This will remove the wrong typed pair construction that +requires one extra copy of both key and value.

+ +

However still the using of map::insert requires temporary +objects while the operation, from a logical point of view, +doesn't require any.

+ +

I think that a better solution would be leaving free an +implementer to use a different approach than map::insert +that, because of its interface, forces default constructed +temporaries and copies in this case. +The best solution in my opinion would be just requiring +map::operator[] to return a reference to the mapped_type +part of the contained element creating a default element +with the specified key if no such an element is already +present in the container. Also a logarithmic complexity +requirement should be specified for the operation. +

+ +

+This would allow library implementers to write alternative +implementations not using map::insert and reaching optimal +performance in both cases of the addressed element being +present or absent from the map (no temporaries at all and +just the creation of a new pair inside the container if +the element isn't present). +Some implementer has already taken this option but I think +that the current wording of the standard rules that as +non-conforming. +

+ + + +

Proposed resolution:

+ +

+Replace 23.3.1.2 [map.access] paragraph 1 with +

+
+

+-1- Effects: If there is no key equivalent to x in the map, inserts +value_type(x, T()) into the map. +

+

+-2- Returns: A reference to the mapped_type corresponding to x in *this. +

+

+-3- Complexity: logarithmic. +

+
+ +

[This is the second option mentioned above. Howard provided +wording. We may also wish to have a blanket statement somewhere in +clause 17 saying that we do not intend the semantics of sample code +fragments to be interpreted as specifing exactly how many copies are +made. See issue 98 for a similar problem.]

+ + + + +

Rationale:

+

+This is the second solution described above; as noted, it is +consistent with existing practice. +

+ +

Note that we now need to specify the complexity explicitly, because +we are no longer defining operator[] in terms of +insert.

+ + + + + +
+

335. minor issue with char_traits, table 37

+

Section: 21.1.1 [char.traits.require] Status: WP + Submitter: Andy Sawyer Date: 2001-09-06

+

View all issues with WP status.

+

Discussion:

+

+Table 37, in 21.1.1 [char.traits.require], descibes char_traits::assign +as: +

+
  X::assign(c,d)   assigns c = d.
+
+ +

And para 1 says:

+ +

+ [...] c and d denote values of type CharT [...] +

+ +

+Naturally, if c and d are values, then the assignment is +(effectively) meaningless. It's clearly intended that (in the case of +assign, at least), 'c' is intended to be a reference type. +

+ +

I did a quick survey of the four implementations I happened to have +lying around, and sure enough they all have signatures:

+
    assign( charT&, const charT& );
+
+ +

(or the equivalent). It's also described this way in Nico's book. +(Not to mention the synopses of char_traits<char> in 21.1.3.1 +and char_traits<wchar_t> in 21.1.3.2...) +

+ + +

Proposed resolution:

+

Add the following to 21.1.1 para 1:

+

+ r denotes an lvalue of CharT +

+ +

and change the description of assign in the table to:

+
  X::assign(r,d)   assigns r = d
+
+ + + + + +
+

336. Clause 17 lack of references to deprecated headers

+

Section: 17 [library] Status: WP + Submitter: Detlef Vollmann Date: 2001-09-05

+

View all other issues in [library].

+

View all issues with WP status.

+

Discussion:

+

From c++std-edit-873:

+ +

17.4.1.2 [headers], Table 11. In this table, the header +<strstream> is missing.

+ +

This shows a general problem: The whole clause 17 refers quite +often to clauses 18 through 27, but D.7 is also a part of the standard +library (though a deprecated one).

+ + + +

Proposed resolution:

+ +

To 17.4.1.2 [headers] Table 11, C++ Library Headers, add +"<strstream>".

+ +

In the following places, change "clauses 17 through 27" to "clauses +17 through 27 and Annex D":

+ +
    +
  • 1.2 [intro.refs] Normative references/1/footnote 1
  • +
  • 1.3 [intro.defs] Definitions/1
  • +
  • 7 [dcl.dcl] Library introduction/9
  • +
  • 17.3 [description] Method of description (Informative)/1
  • +
  • 17.3.2.1.3 [character.seq] Character sequences/1/bullet 2
  • +
  • 17.3.2.2 [functions.within.classes] Functions within classes/1
  • +
  • 17.3.2.3 [objects.within.classes] Private members/1/(2 places)
  • +
  • 17.4 [requirements] Library-wide requirements/1
  • +
  • 17.4.1.2 [headers] Headers/4
  • +
  • 17.4.3.4 [replacement.functions] Replacement functions/1
  • +
  • 17.4.4.3 [global.functions] Global or non-member functions/2
  • +
  • 17.4.4.6 [protection.within.classes] Protection within classes/1
  • +
+ + + + + + + +
+

337. replace_copy_if's template parameter should be InputIterator

+

Section: 25.2.5 [alg.replace] Status: WP + Submitter: Detlef Vollmann Date: 2001-09-07

+

View all other issues in [alg.replace].

+

View all issues with WP status.

+

Discussion:

+

From c++std-edit-876:

+ +

+In section 25.2.5 [alg.replace] before p4: The name of the first +parameter of template replace_copy_if should be "InputIterator" +instead of "Iterator". According to 17.3.2.1 [type.descriptions] p1 the +parameter name conveys real normative meaning. +

+ + +

Proposed resolution:

+

Change Iterator to InputIterator.

+ + + + + +
+

338. is whitespace allowed between `-' and a digit?

+

Section: 22.2 [locale.categories] Status: WP + Submitter: Martin Sebor Date: 2001-09-17

+

View other active issues in [locale.categories].

+

View all other issues in [locale.categories].

+

View all issues with WP status.

+

Discussion:

+

+From Stage 2 processing in 22.2.2.1.2 [facet.num.get.virtuals], p8 and 9 (the +original text or the text corrected by the proposed resolution of +issue 221) it seems clear that no whitespace is allowed +within a number, but 22.2.3.1 [locale.numpunct], p2, which gives the +format for integer and floating point values, says that whitespace is +optional between a plusminus and a sign. +

+ +

+The text needs to be clarified to either consistently allow or +disallow whitespace between a plusminus and a sign. It might be +worthwhile to consider the fact that the C library stdio facility does +not permit whitespace embedded in numbers and neither does the C or +C++ core language (the syntax of integer-literals is given in 2.13.1 +[lex.icon], that of floating-point-literals in 2.13.3 [lex.fcon] of the +C++ standard). +

+ + +

Proposed resolution:

+

Change the first part of 22.2.3.1 [locale.numpunct] paragraph 2 from:

+
+

+The syntax for number formats is as follows, where digit +represents the radix set specified by the fmtflags argument +value, whitespace is as determined by the facet +ctype<charT> (22.2.1.1), and thousands-sep and +decimal-point are the results of corresponding +numpunct<charT> members. Integer values have the +format: +

+
  integer   ::= [sign] units
+  sign      ::= plusminus [whitespace]
+  plusminus ::= '+' | '-'
+  units     ::= digits [thousands-sep units]
+  digits    ::= digit [digits]
+
+
+

to:

+
+

+The syntax for number formats is as follows, where digit +represents the radix set specified by the fmtflags argument +value, and thousands-sep and decimal-point are the +results of corresponding numpunct<charT> members. +Integer values have the format: +

+
  integer   ::= [sign] units
+  sign      ::= plusminus
+  plusminus ::= '+' | '-'
+  units     ::= digits [thousands-sep units]
+  digits    ::= digit [digits]
+
+
+ + +

Rationale:

+

It's not clear whether the format described in 22.2.3.1 [locale.numpunct] paragraph 2 has any normative weight: nothing in the +standard says how, or whether, it's used. However, there's no reason +for it to differ gratuitously from the very specific description of +numeric processing in 22.2.2.1.2 [facet.num.get.virtuals]. The proposed +resolution removes all mention of "whitespace" from that format.

+ + + + + +
+

339. definition of bitmask type restricted to clause 27

+

Section: 22.2.1 [category.ctype], 17.3.2.1.2 [bitmask.types] Status: WP + Submitter: Martin Sebor Date: 2001-09-17

+

View all other issues in [category.ctype].

+

View all issues with WP status.

+

Discussion:

+

The ctype_category::mask type is declared to be an enum in 22.2.1 +[category.ctype] with p1 then stating that it is a bitmask type, most +likely referring to the definition of bitmask type in 17.3.2.1.2 +[bitmask.types], p1. However, the said definition only applies to +clause 27, making the reference in 22.2.1 somewhat dubious. +

+ + +

Proposed resolution:

+

Clarify 17.3.2.1.2, p1 by changing the current text from

+

+ Several types defined in clause 27 are bitmask types. Each bitmask type + can be implemented as an enumerated type that overloads certain operators, + as an integer type, or as a bitset (23.3.5 [template.bitset]). +

+

to read

+

+ Several types defined in clauses lib.language.support through + lib.input.output and Annex D are bitmask types. Each bitmask type can + be implemented as an enumerated type that overloads certain operators, + as an integer type, or as a bitset (lib.template.bitset). +

+ +

+Additionally, change the definition in 22.2.1 to adopt the same +convention as in clause 27 by replacing the existing text with the +following (note, in particluar, the cross-reference to 17.3.2.1.2 in +22.2.1, p1): +

+ +
+

22.2.1 The ctype category [lib.category.ctype]

+
namespace std {
+    class ctype_base {
+    public:
+        typedef T mask;
+
+        // numeric values are for exposition only.
+        static const mask space = 1 << 0;
+        static const mask print = 1 << 1;
+        static const mask cntrl = 1 << 2;
+        static const mask upper = 1 << 3;
+        static const mask lower = 1 << 4;
+        static const mask alpha = 1 << 5;
+        static const mask digit = 1 << 6;
+        static const mask punct = 1 << 7;
+        static const mask xdigit = 1 << 8;
+        static const mask alnum = alpha | digit;
+        static const mask graph = alnum | punct;
+    };
+}
+
+ +

The type mask is a bitmask type (17.3.2.1.2 [bitmask.types]).

+
+ +

[Curaçao: The LWG notes that T above should be bold-italics to be +consistent with the rest of the standard.]

+ + + + + + + + + +
+

340. interpretation of has_facet<Facet>(loc)

+

Section: 22.1.1.1.1 [locale.category] Status: WP + Submitter: Martin Sebor Date: 2001-09-18

+

View all other issues in [locale.category].

+

View all issues with WP status.

+

Discussion:

+

+It's unclear whether 22.1.1.1.1, p3 says that +has_facet<Facet>(loc) returns true for any Facet +from Table 51 or whether it includes Table 52 as well: +

+ +

+For any locale loc either constructed, or returned by +locale::classic(), and any facet Facet that is a member of a +standard category, has_facet<Facet>(loc) is true. Each +locale member function which takes a locale::category +argument operates on the corresponding set of facets. +

+ +

+It seems that it comes down to which facets are considered to be members of a +standard category. Intuitively, I would classify all the facets in Table 52 as +members of their respective standard categories, but there are an unbounded set +of them... +

+ +

+The paragraph implies that, for instance, has_facet<num_put<C, +OutputIterator> >(loc) must always return true. I don't think that's +possible. If it were, then use_facet<num_put<C, OutputIterator> +>(loc) would have to return a reference to a distinct object for each +valid specialization of num_put<C, OutputIteratory>, which is +clearly impossible. +

+ +

+On the other hand, if none of the facets in Table 52 is a member of a standard +category then none of the locale member functions that operate on entire +categories of facets will work properly. +

+ +

+It seems that what p3 should mention that it's required (permitted?) +to hold only for specializations of Facet from Table 52 on +C from the set { char, wchar_t }, and +InputIterator and OutputIterator from the set of +{ +{i,o}streambuf_iterator<{char,wchar_t}> +}. +

+ + +

Proposed resolution:

+

In 22.1.1.1.1 [locale.category], paragraph 3, change +"that is a member of a standard category" to "shown in Table 51".

+ + +

Rationale:

+

The facets in Table 52 are an unbounded set. Locales should not be +required to contain an infinite number of facets.

+ +

It's not necessary to talk about which values of InputIterator and +OutputIterator must be supported. Table 51 already contains a +complete list of the ones we need.

+ + + + + + +
+

341. Vector reallocation and swap

+

Section: 23.2.5.2 [vector.capacity] Status: WP + Submitter: Anthony Williams Date: 2001-09-27

+

View all other issues in [vector.capacity].

+

View all issues with WP status.

+

Discussion:

+

It is a common idiom to reduce the capacity of a vector by swapping it with +an empty one:

+
  std::vector<SomeType> vec;
+  // fill vec with data
+  std::vector<SomeType>().swap(vec);
+  // vec is now empty, with minimal capacity
+
+ +

However, the wording of 23.2.5.2 [vector.capacity]paragraph 5 prevents +the capacity of a vector being reduced, following a call to +reserve(). This invalidates the idiom, as swap() is thus prevented +from reducing the capacity. The proposed wording for issue 329 does not affect this. Consequently, the example above +requires the temporary to be expanded to cater for the contents of +vec, and the contents be copied across. This is a linear-time +operation.

+ +

However, the container requirements state that swap must have constant +complexity (23.1 [container.requirements] note to table 65).

+ +

This is an important issue, as reallocation affects the validity of +references and iterators.

+ +

If the wording of 23.2.4.2p5 is taken to be the desired intent, then +references and iterators remain valid after a call to swap, if they refer to +an element before the new end() of the vector into which they originally +pointed, in which case they refer to the element at the same index position. +Iterators and references that referred to an element whose index position +was beyond the new end of the vector are invalidated.

+ +

If the note to table 65 is taken as the desired intent, then there are two +possibilities with regard to iterators and references:

+ +
    +
  1. All Iterators and references into both vectors are invalidated.
  2. +
  3. Iterators and references into either vector remain valid, and remain +pointing to the same element. Consequently iterators and references that +referred to one vector now refer to the other, and vice-versa.
  4. +
+ + +

Proposed resolution:

+

Add a new paragraph after 23.2.5.2 [vector.capacity] paragraph 5:

+
+
  void swap(vector<T,Allocator>& x);
+
+

Effects: Exchanges the contents and capacity() of *this +with that of x.

+

Complexity: Constant time.

+
+ +

[This solves the problem reported for this issue. We may also +have a problem with a circular definition of swap() for other +containers.]

+ + + + +

Rationale:

+

+swap should be constant time. The clear intent is that it should just +do pointer twiddling, and that it should exchange all properties of +the two vectors, including their reallocation guarantees. +

+ + + + + +
+

345. type tm in <cwchar>

+

Section: 21.5 [c.strings] Status: WP + Submitter: Clark Nelson Date: 2001-10-19

+

View all other issues in [c.strings].

+

View all issues with WP status.

+

Discussion:

+

C99, and presumably amendment 1 to C90, specify that <wchar.h> +declares struct tm as an incomplete type. However, table 48 in 21.5 +[c.strings] does not mention the type tm as being declared in +<cwchar>. Is this omission intentional or accidental? +

+ + +

Proposed resolution:

+

In section 21.5 [c.strings], add "tm" to table 48.

+ + + + + +
+

346. Some iterator member functions should be const

+

Section: 24.1 [iterator.requirements] Status: WP + Submitter: Jeremy Siek Date: 2001-10-20

+

View other active issues in [iterator.requirements].

+

View all other issues in [iterator.requirements].

+

View all issues with WP status.

+

Discussion:

+

Iterator member functions and operators that do not change the state +of the iterator should be defined as const member functions or as +functions that take iterators either by const reference or by +value. The standard does not explicitly state which functions should +be const. Since this a fairly common mistake, the following changes +are suggested to make this explicit.

+ +

The tables almost indicate constness properly through naming: r +for non-const and a,b for const iterators. The following changes +make this more explicit and also fix a couple problems.

+ + +

Proposed resolution:

+

In 24.1 [iterator.requirements] Change the first section of p9 from +"In the following sections, a and b denote values of X..." to +"In the following sections, a and b denote values of type const X...".

+ +

In Table 73, change

+
    a->m   U&         ...
+
+ +

to

+ +
    a->m   const U&   ...
+    r->m   U&         ...
+
+ +

In Table 73 expression column, change

+ +
    *a = t
+
+ +

to

+ +
    *r = t
+
+ +

[Redmond: The container requirements should be reviewed to see if +the same problem appears there.]

+ + + + + + + +
+

347. locale::category and bitmask requirements

+

Section: 22.1.1.1.1 [locale.category] Status: WP + Submitter: P.J. Plauger, Nathan Myers Date: 2001-10-23

+

View all other issues in [locale.category].

+

View all issues with WP status.

+

Discussion:

+

+In 22.1.1.1.1 [locale.category] paragraph 1, the category members +are described as bitmask elements. In fact, the bitmask requirements +in 17.3.2.1.2 [bitmask.types] don't seem quite right: none +and all are bitmask constants, not bitmask elements.

+ +

In particular, the requirements for none interact poorly +with the requirement that the LC_* constants from the C library must +be recognizable as C++ locale category constants. LC_* values should +not be mixed with these values to make category values.

+ +

We have two options for the proposed resolution. Informally: +option 1 removes the requirement that LC_* values be recognized as +category arguments. Option 2 changes the category type so that this +requirement is implementable, by allowing none to be some +value such as 0x1000 instead of 0.

+ +

Nathan writes: "I believe my proposed resolution [Option 2] merely +re-expresses the status quo more clearly, without introducing any +changes beyond resolving the DR.

+ + + +

Proposed resolution:

+

Replace the first two paragraphs of 22.1.1.1 [locale.types] with:

+
+
    typedef int category;
+
+ +

Valid category values include the locale member bitmask +elements collate, ctype, monetary, +numeric, time, and messages, each of which +represents a single locale category. In addition, locale member +bitmask constant none is defined as zero and represents no +category. And locale member bitmask constant all is defined such that +the expression

+
    (collate | ctype | monetary | numeric | time | messages | all) == all
+
+

+is true, and represents the union of all categories. Further +the expression (X | Y), where X and Y each +represent a single category, represents the union of the two +categories. +

+ +

+locale member functions expecting a category +argument require one of the category values defined above, or +the union of two or more such values. Such a category +argument identifies a set of locale categories. Each locale category, +in turn, identifies a set of locale facets, including at least those +shown in Table 51: +

+
+

[Curaçao: need input from locale experts.]

+ + + + +

Rationale:

+ +

The LWG considered, and rejected, an alternate proposal (described + as "Option 2" in the discussion). The main reason for rejecting it + was that library implementors were concerened about implementation + difficult, given that getting a C++ library to work smoothly with a + separately written C library is already a delicate business. Some + library implementers were also concerned about the issue of adding + extra locale categories.

+ +
+

Option 2:
+Replace the first paragraph of 22.1.1.1 [locale.types] with:

+
+

+Valid category values include the enumerated values. In addition, the +result of applying commutative operators | and & to any two valid +values is valid, and results in the setwise union and intersection, +respectively, of the argument categories. The values all and +none are defined such that for any valid value cat, the +expressions (cat | all == all), (cat & all == cat), +(cat | none == cat) and (cat & none == none) are +true. For non-equal values cat1 and cat2 of the +remaining enumerated values, (cat1 & cat2 == none) is true. +For any valid categories cat1 and cat2, the result +of (cat1 & ~cat2) is valid, and equals the setwise union of +those categories found in cat1 but not found in cat2. +[Footnote: it is not required that all equal the setwise union +of the other enumerated values; implementations may add extra categories.] +

+
+
+ + + + + +
+

349. Minor typographical error in ostream_iterator

+

Section: 24.5.2 [ostream.iterator] Status: WP + Submitter: Andy Sawyer Date: 2001-10-24

+

View all issues with WP status.

+

Discussion:

+

24.5.2 [lib.ostream.iterator] states:

+
    [...]
+
+    private:
+    // basic_ostream<charT,traits>* out_stream; exposition only
+    // const char* delim; exposition only
+
+ +

Whilst it's clearly marked "exposition only", I suspect 'delim' +should be of type 'const charT*'.

+ + +

Proposed resolution:

+

+In 24.5.2 [ostream.iterator], replace const char* delim with +const charT* delim. +

+ + + + + +
+

352. missing fpos requirements

+

Section: 21.1.2 [char.traits.typedefs] Status: WP + Submitter: Martin Sebor Date: 2001-12-02

+

View all issues with WP status.

+

Discussion:

+

+(1) +There are no requirements on the stateT template parameter of +fpos listed in 27.4.3. The interface appears to require that +the type be at least Assignable and CopyConstructible (27.4.3.1, p1), +and I think also DefaultConstructible (to implement the operations in +Table 88). +

+

+21.1.2, p3, however, only requires that +char_traits<charT>::state_type meet the requirements of +CopyConstructible types. +

+

+(2) +Additionally, the stateT template argument has no +corresponding typedef in fpos which might make it difficult to use in +generic code. +

+ + +

Proposed resolution:

+

+Modify 21.1.2, p4 from +

+

+ Requires: state_type shall meet the requirements of + CopyConstructible types (20.1.3). +

+

+ Requires: state_type shall meet the requirements of Assignable + (23.1, p4), CopyConstructible (20.1.3), and + DefaultConstructible (20.1.4) types. +

+ + + +

Rationale:

+

The LWG feels this is two issues, as indicated above. The first is +a defect---std::basic_fstream is unimplementable without these +additional requirements---and the proposed resolution fixes it. The +second is questionable; who would use that typedef? The class +template fpos is used only in a very few places, all of which know the +state type already. Unless motivation is provided, the second should +be considered NAD.

+ + + + + +
+

354. Associative container lower/upper bound requirements

+

Section: 23.1.2 [associative.reqmts] Status: WP + Submitter: Hans Aberg Date: 2001-12-17

+

View all other issues in [associative.reqmts].

+

View all issues with WP status.

+

Discussion:

+

+Discussions in the thread "Associative container lower/upper bound +requirements" on comp.std.c++ suggests that there is a defect in the +C++ standard, Table 69 of section 23.1.2, "Associative containers", +[lib.associative.reqmts]. It currently says:

+ +
+

+a.find(k): returns an iterator pointing to an element with the key equivalent to +k, or a.end() if such an element is not found. +

+ +

+a.lower_bound(k): returns an iterator pointing to the first element with +key not less than k. +

+ +

+a.upper_bound(k): returns an iterator pointing to the first element with +key greater than k. +

+
+ +

+We have "or a.end() if such an element is not found" for +find, but not for upper_bound or +lower_bound. As the text stands, one would be forced to +insert a new element into the container and return an iterator to that +in case the sought iterator does not exist, which does not seem to be +the intention (and not possible with the "const" versions). +

+ + +

Proposed resolution:

+ +

Change Table 69 of section 23.1.2 [associative.reqmts] indicated entries +to:

+ +
+

+a.lower_bound(k): returns an iterator pointing to the first element with +key not less than k, or a.end() if such an element is not found. +

+ +

+a.upper_bound(k): returns an iterator pointing to the first element with +key greater than k, or a.end() if such an element is not found. +

+
+ +

[Curaçao: LWG reviewed PR.]

+ + + + + + + + +
+

355. Operational semantics for a.back()

+

Section: 23.1.1 [sequence.reqmts] Status: WP + Submitter: Yaroslav Mironov Date: 2002-01-23

+

View all other issues in [sequence.reqmts].

+

View all issues with WP status.

+

Discussion:

+ +

Table 68 "Optional Sequence Operations" in 23.1.1/12 +specifies operational semantics for "a.back()" as +"*--a.end()", which may be ill-formed [because calling +operator-- on a temporary (the return) of a built-in type is +ill-formed], provided a.end() returns a simple pointer rvalue +(this is almost always the case for std::vector::end(), for +example). Thus, the specification is not only incorrect, it +demonstrates a dangerous construct: "--a.end()" may +successfully compile and run as intended, but after changing the type +of the container or the mode of compilation it may produce +compile-time error.

+ + + +

Proposed resolution:

+

Change the specification in table 68 "Optional Sequence +Operations" in 23.1.1/12 for "a.back()" from

+ + +
*--a.end()
+
+ +

to

+ +
  { iterator tmp = a.end(); --tmp; return *tmp; }
+
+ +

and the specification for "a.pop_back()" from

+ +
a.erase(--a.end())
+
+ +

to

+ +
  { iterator tmp = a.end(); --tmp; a.erase(tmp); }
+
+ +

[Curaçao: LWG changed PR from "{ X::iterator tmp = +a.end(); return *--tmp; }" to "*a.rbegin()", and from +"{ X::iterator tmp = a.end(); a.erase(--tmp); }" to +"a.erase(rbegin())".]

+ + +

[There is a second possible defect; table 68 "Optional +Sequence Operations" in the "Operational Semantics" +column uses operations present only in the "Reversible +Container" requirements, yet there is no stated dependency +between these separate requirements tables. Ask in Santa Cruz if the +LWG would like a new issue opened.]

+ + +

[Santa Cruz: the proposed resolution is even worse than what's in + the current standard: erase is undefined for reverse iterator. If + we're going to make the change, we need to define a temporary and + use operator--. Additionally, we don't know how prevalent this is: + do we need to make this change in more than one place? Martin has + volunteered to review the standard and see if this problem occurs + elsewhere.]

+ + +

[Oxford: Matt provided new wording to address the concerns raised + in Santa Cruz. It does not appear that this problem appears + anywhere else in clauses 23 or 24.]

+ + +

[Kona: In definition of operational semantics of back(), change +"*tmp" to "return *tmp;"]

+ + + + + + + +
+

358. interpreting thousands_sep after a decimal_point

+

Section: 22.2.2.1.2 [facet.num.get.virtuals] Status: WP + Submitter: Martin Sebor Date: 2002-03-12

+

View other active issues in [facet.num.get.virtuals].

+

View all other issues in [facet.num.get.virtuals].

+

View all issues with WP status.

+

Discussion:

+

+I don't think thousands_sep is being treated correctly after +decimal_point has been seen. Since grouping applies only to the +integral part of the number, the first such occurrence should, IMO, +terminate Stage 2. (If it does not terminate it, then 22.2.2.1.2, p12 +and 22.2.3.1.2, p3 need to explain how thousands_sep is to be +interpreted in the fractional part of a number.) +

+ +

+The easiest change I can think of that resolves this issue would be +something like below. +

+ + +

Proposed resolution:

+

+Change the first sentence of 22.2.2.1.2, p9 from +

+ +

+ If discard is true then the position of the character is + remembered, but the character is otherwise ignored. If it is not + discarded, then a check is made to determine if c is allowed as + the next character of an input field of the conversion specifier + returned by stage 1. If so it is accumulated. +

+ +

to

+ +

+ If discard is true, then if '.' has not yet been + accumulated, then the position of the character is remembered, but + the character is otherwise ignored. Otherwise, if '.' has + already been accumulated, the character is discarded and Stage 2 + terminates. ... +

+ + + +

Rationale:

+

We believe this reflects the intent of the Standard. Thousands sep + characters after the decimal point are not useful in any locale. + Some formatting conventions do group digits that follow the decimal + point, but they usually introduce a different grouping character + instead of reusing the thousand sep character. If we want to add + support for such conventions, we need to do so explicitly.

+ + + + + + +
+

359. num_put<>::do_put (..., bool) undocumented

+

Section: 22.2.2.2.1 [facet.num.put.members] Status: WP + Submitter: Martin Sebor Date: 2002-03-12

+

View all issues with WP status.

+

Discussion:

+

22.2.2.2.1, p1:

+ +
    iter_type put (iter_type out, ios_base& str, char_type fill,
+                   bool val) const;
+    ...
+
+    1   Returns: do_put (out, str, fill, val).
+    
+ +

AFAICS, the behavior of do_put (..., bool) is not documented anywhere, +however, 22.2.2.2.2, p23:

+ +
+
iter_type put (iter_type out, ios_base& str, char_type fill,
+               bool val) const;
+
+ + +

Effects: If (str.flags() & ios_base::boolalpha) == 0 then do + out = do_put(out, str, fill, (int)val) + Otherwise do

+
             string_type s =
+                 val ? use_facet<ctype<charT> >(loc).truename()
+                     : use_facet<ctype<charT> >(loc).falsename();
+
+

and then insert the characters of s into out. out.

+
+ +

+This means that the bool overload of do_put() will never be called, +which contradicts the first paragraph. Perhaps the declaration +should read do_put(), and not put()? +

+ +

+Note also that there is no Returns clause for this function, which +should probably be corrected, just as should the second occurrence +of "out." in the text. +

+ +

+I think the least invasive change to fix it would be something like +the following: +

+ + +

Proposed resolution:

+

In 22.2.2.2.2 [facet.num.put.virtuals], just above paragraph 1, remove + the bool overload.

+ +

+In 22.2.2.2.2 [facet.num.put.virtuals], p23, make the following changes +

+ +

+ Replace put() with do_put() in the declaration + of the member function. +

+ +

+ Change the Effects clause to a Returns clause (to + avoid the requirement to call do_put(..., int) from + do_put (..., bool)) + like so: +

+ +

+ 23 Returns: If (str.flags() & + ios_base::boolalpha) == 0 then + do_put (out, str, fill, (long)val) + Otherwise the function obtains a string s as if by

+
             string_type s =
+                val ? use_facet<ctype<charT> >(loc).truename()
+                    : use_facet<ctype<charT> >(loc).falsename();
+
+

and then inserts each character c of s into out via + *out++ = c + and returns out.

+
+ + + +

Rationale:

+This fixes a couple of obvious typos, and also fixes what appears to +be a requirement of gratuitous inefficiency. +

+ + + + +
+

360. locale mandates inefficient implementation

+

Section: 22.1.1 [locale] Status: WP + Submitter: Martin Sebor Date: 2002-03-12

+

View all other issues in [locale].

+

View all issues with WP status.

+

Discussion:

+

+22.1.1, p7 (copied below) allows iostream formatters and extractors +to make assumptions about the values returned from facet members. +However, such assumptions are apparently not guaranteed to hold +in other cases (e.g., when the facet members are being called directly +rather than as a result of iostream calls, or between successive +calls to the same iostream functions with no interevening calls to +imbue(), or even when the facet member functions are called +from other member functions of other facets). This restriction +prevents locale from being implemented efficiently. +

+ + +

Proposed resolution:

+

Change the first sentence in 22.1.1, p7 from

+

+ In successive calls to a locale facet member function during + a call to an iostream inserter or extractor or a streambuf member + function, the returned result shall be identical. [Note: This + implies that such results may safely be reused without calling + the locale facet member function again, and that member functions + of iostream classes cannot safely call imbue() + themselves, except as specified elsewhere. --end note] +

+ +

to

+ +

+ In successive calls to a locale facet member function on a facet + object installed in the same locale, the returned result shall be + identical. ... +

+ + + +

Rationale:

+

This change is reasonable becuase it clarifies the intent of this + part of the standard.

+ + + + + +
+

362. bind1st/bind2nd type safety

+

Section: D.8 [depr.lib.binders] Status: WP + Submitter: Andrew Demkin Date: 2002-04-26

+

View all other issues in [depr.lib.binders].

+

View all issues with WP status.

+

Discussion:

+

+The definition of bind1st() (D.8 [depr.lib.binders]) can result in +the construction of an unsafe binding between incompatible pointer +types. For example, given a function whose first parameter type is +'pointer to T', it's possible without error to bind an argument of +type 'pointer to U' when U does not derive from T: +

+
   foo(T*, int);
+
+   struct T {};
+   struct U {};
+
+   U u;
+
+   int* p;
+   int* q;
+
+   for_each(p, q, bind1st(ptr_fun(foo), &u));    // unsafe binding
+
+ +

+The definition of bind1st() includes a functional-style conversion to +map its argument to the expected argument type of the bound function +(see below): +

+
  typename Operation::first_argument_type(x)
+
+ +

A functional-style conversion (D.8 [depr.lib.binders]) is defined to +be +semantically equivalent to an explicit cast expression (D.8 +[depr.lib.binders]), which may (according to 5.4, paragraph 5) be +interpreted +as a reinterpret_cast, thus masking the error. +

+ +

The problem and proposed change also apply to D.8 [depr.lib.binders].

+ + +

Proposed resolution:

+

Add this sentence to the end of D.8 [depr.lib.binders]/1: + "Binders bind1st and bind2nd are deprecated in + favor of std::tr1::bind."

+ +

(Notes to editor: (1) when and if tr1::bind is incorporated into + the standard, "std::tr1::bind" should be changed to "std::bind". (2) + 20.5.6 should probably be moved to Annex D.

+ + +

Rationale:

+

There is no point in fixing bind1st and bind2nd. tr1::bind is a + superior solution. It solves this problem and others.

+ + + + + +
+

363. Missing exception specification in 27.4.2.1.1

+

Section: 27.4.2.1.1 [ios::failure] Status: WP + Submitter: Walter Brown and Marc Paterno Date: 2002-05-20

+

View all other issues in [ios::failure].

+

View all issues with WP status.

+

Discussion:

+

+The destructor of ios_base::failure should have an empty throw +specification, because the destructor of its base class, exception, is +declared in this way. +

+ + +

Proposed resolution:

+

Change the destructor to

+
  virtual ~failure() throw();
+
+ + +

Rationale:

+

Fixes an obvious glitch. This is almost editorial.

+ + + + + +
+

364. Inconsistent wording in 27.5.2.4.2

+

Section: 27.5.2.4.2 [streambuf.virt.buffer] Status: WP + Submitter: Walter Brown, Marc Paterno Date: 2002-05-10

+

View all other issues in [streambuf.virt.buffer].

+

View all issues with WP status.

+

Discussion:

+

+27.5.2.4.2 [streambuf.virt.buffer] paragraph 1 is inconsistent with the Effects +clause for seekoff. +

+ + +

Proposed resolution:

+

+Make this paragraph, the Effects clause for setbuf, consistent in wording +with the Effects clause for seekoff in paragraph 3 by amending paragraph 1 +to indicate the purpose of setbuf: +

+ +

Original text:

+ +

+1 Effects: Performs an operation that is defined separately for each +class derived from basic_streambuf in this clause (27.7.1.3, 27.8.1.4). +

+ +

Proposed text:

+ +

+1 Effects: Influences stream buffering in a way that is defined separately +for each class derived from basic_streambuf in this clause +(27.7.1.3, 27.8.1.4). +

+ + + +

Rationale:

+

The LWG doesn't believe there is any normative difference between + the existing wording and what's in the proposed resolution, but the + change may make the intent clearer.

+ + + + + +
+

365. Lack of const-qualification in clause 27

+

Section: 27 [input.output] Status: WP + Submitter: Walter Brown, Marc Paterno Date: 2002-05-10

+

View all other issues in [input.output].

+

View all issues with WP status.

+

Discussion:

+

+Some stream and streambuf member functions are declared non-const, +even thought they appear only to report information rather than to +change an object's logical state. They should be declared const. See +document N1360 for details and rationale. +

+ +

The list of member functions under discussion: in_avail, +showmanyc, tellg, tellp, is_open.

+ +

Related issue: 73

+ + + +

Proposed resolution:

+

In 27.8.1.5, 27.8.1.7, 27.8.1.8, 27.8.1.10, 27.8.1.11, and 27.8.1.13

+

Replace

+
  bool is_open();
+
+

with

+
  bool is_open() const;
+
+ + +

Rationale:

+

Of the changes proposed in N1360, the only one that is safe is +changing the filestreams' is_open to const. The LWG believed that +this was NAD the first time it considered this issue (issue 73), but now thinks otherwise. The corresponding streambuf +member function, after all,is already const.

+ +

The other proposed changes are less safe, because some streambuf +functions that appear merely to report a value do actually perform +mutating operations. It's not even clear that they should be +considered "logically const", because streambuf has two interfaces, a +public one and a protected one. These functions may, and often do, +change the state as exposed by the protected interface, even if the +state exposed by the public interface is unchanged.

+ +

Note that implementers can make this change in a binary compatible +way by providing both overloads; this would be a conforming extension.

+ + + + + + +
+

369. io stream objects and static ctors

+

Section: 27.3 [iostream.objects] Status: WP + Submitter: Ruslan Abdikeev Date: 2002-07-08

+

View all other issues in [iostream.objects].

+

View all issues with WP status.

+

Discussion:

+

+Is it safe to use standard iostream objects from constructors of +static objects? Are standard iostream objects constructed and are +their associations established at that time? +

+ +

Surpisingly enough, Standard does NOT require that.

+ +

+27.3/2 [lib.iostream.objects] guarantees that standard iostream +objects are constructed and their associations are established before +the body of main() begins execution. It also refers to ios_base::Init +class as the panacea for constructors of static objects. +

+ +

+However, there's nothing in 27.3 [lib.iostream.objects], +in 27.4.2 [lib.ios.base], and in 27.4.2.1.6 [lib.ios::Init], +that would require implementations to allow access to standard +iostream objects from constructors of static objects. +

+ +

Details:

+ +

Core text refers to some magic object ios_base::Init, which will +be discussed below:

+ +

+ "The [standard iostream] objects are constructed, and their + associations are established at some time prior to or during + first time an object of class basic_ios<charT,traits>::Init + is constructed, and in any case before the body of main + begins execution." (27.3/2 [lib.iostream.objects]) +

+ +

+The first non-normative footnote encourages implementations +to initialize standard iostream objects earlier than required. +

+ +

However, the second non-normative footnote makes an explicit +and unsupported claim:

+ +

+ "Constructors and destructors for static objects can access these + [standard iostream] objects to read input from stdin or write output + to stdout or stderr." (27.3/2 footnote 265 [lib.iostream.objects]) +

+ +

+The only bit of magic is related to that ios_base::Init class. AFAIK, +the rationale behind ios_base::Init was to bring an instance of this +class to each translation unit which #included <iostream> or +related header. Such an inclusion would support the claim of footnote +quoted above, because in order to use some standard iostream object it +is necessary to #include <iostream>. +

+ +

+However, while Standard explicitly describes ios_base::Init as +an appropriate class for doing the trick, I failed to found a +mention of an _instance_ of ios_base::Init in Standard. +

+ + +

Proposed resolution:

+ +

Add to 27.3 [iostream.objects], p2, immediately before the last sentence +of the paragraph, the following two sentences:

+ +

+If a translation unit includes <iostream>, or explicitly +constructs an ios_base::Init object, these stream objects shall +be constructed before dynamic initialization of non-local +objects defined later in that translation unit, and these stream +objects shall be destroyed after the destruction of dynamically +initialized non-local objects defined later in that translation unit. +

+ +

[Lillehammer: Matt provided wording.]

+ +

[Mont Tremblant: Matt provided revised wording.]

+ + + +

Rationale:

+

+The original proposed resolution unconditionally required +implementations to define an ios_base::Init object of some +implementation-defined name in the header <iostream>. That's an +overspecification. First, defining the object may be unnecessary +and even detrimental to performance if an implementation can +guarantee that the 8 standard iostream objects will be initialized +before any other user-defined object in a program. Second, there +is no need to require implementations to document the name of the +object.

+ +

+The new proposed resolution gives users guidance on what they need to +do to ensure that stream objects are constructed during startup.

+ + + + + +
+

370. Minor error in basic_istream::get

+

Section: 27.6.1.3 [istream.unformatted] Status: WP + Submitter: Ray Lischner Date: 2002-07-15

+

View all other issues in [istream.unformatted].

+

View all issues with WP status.

+

Discussion:

+

Defect report for description of basic_istream::get (section +27.6.1.3 [istream.unformatted]), paragraph 15. The description for the +get function +with the following signature:

+ +
  basic_istream<charT,traits>& get(basic_streambuf<char_type,traits>&
+  sb);
+
+ +

is incorrect. It reads

+ +

+ Effects: Calls get(s,n,widen('\n')) +

+ +

which I believe should be:

+ +

+ Effects: Calls get(sb,widen('\n')) +

+ + +

Proposed resolution:

+

Change the Effects paragraph to:

+

+ Effects: Calls get(sb,this->widen('\n')) +

+ +

[Pre-Oxford: Minor correction from Howard: replaced 'widen' + with 'this->widen'.]

+ + + + +

Rationale:

Fixes an obvious typo.

+ + + + +
+

371. Stability of multiset and multimap member functions

+

Section: 23.1 [container.requirements] Status: WP + Submitter: Frank Compagner Date: 2002-07-20

+

View other active issues in [container.requirements].

+

View all other issues in [container.requirements].

+

View all issues with WP status.

+

Discussion:

+

+The requirements for multiset and multimap containers (23.1 +[lib.containers.requirements], 23.1.2 [lib.associative.reqmnts], +23.3.2 [lib.multimap] and 23.3.4 [lib.multiset]) make no mention of +the stability of the required (mutating) member functions. It appears +the standard allows these functions to reorder equivalent elements of +the container at will, yet the pervasive red-black tree implementation +appears to provide stable behaviour. +

+ +

This is of most concern when considering the behaviour of erase(). +A stability requirement would guarantee the correct working of the +following 'idiom' that removes elements based on a certain predicate +function. +

+ +
  multimap<int, int> m;
+  multimap<int, int>::iterator i = m.begin();
+  while (i != m.end()) {
+      if (pred(i))
+          m.erase (i++);
+      else
+          ++i;
+  }
+
+ +

+Although clause 23.1.2/8 guarantees that i remains a valid iterator +througout this loop, absence of the stability requirement could +potentially result in elements being skipped. This would make +this code incorrect, and, furthermore, means that there is no way +of erasing these elements without iterating first over the entire +container, and second over the elements to be erased. This would +be unfortunate, and have a negative impact on both performance and +code simplicity. +

+ +

+If the stability requirement is intended, it should be made explicit +(probably through an extra paragraph in clause 23.1.2). +

+

+If it turns out stability cannot be guaranteed, i'd argue that a +remark or footnote is called for (also somewhere in clause 23.1.2) to +warn against relying on stable behaviour (as demonstrated by the code +above). If most implementations will display stable behaviour, any +problems emerging on an implementation without stable behaviour will +be hard to track down by users. This would also make the need for an +erase_if() member function that much greater. +

+ +

This issue is somewhat related to LWG issue 130.

+ + + +

Proposed resolution:

+ +

Add the following to the end of 23.1.2 [associative.reqmts] paragraph 4: +"For multiset and multimap, insertand erase + are stable: they preserve the relative ordering of equivalent + elements.

+ +

[Lillehammer: Matt provided wording]

+ +

[Joe Gottman points out that the provided wording does not address +multimap and multiset. N1780 also addresses this issue and suggests +wording.]

+ + +

[Mont Tremblant: Changed set and map to multiset and multimap.]

+ + + + +

Rationale:

+

The LWG agrees that this guarantee is necessary for common user + idioms to work, and that all existing implementations provide this + property. Note that this resolution guarantees stability for + multimap and multiset, not for all associative containers in + general.

+ + + + + + +
+

373. Are basic_istream and basic_ostream to use (exceptions()&badbit) != 0 ?

+

Section: 27.6.1.2.1 [istream.formatted.reqmts], 27.6.2.6.1 [ostream.formatted.reqmts] Status: WP + Submitter: Keith Baker Date: 2002-07-23

+

View all other issues in [istream.formatted.reqmts].

+

View all issues with WP status.

+

Discussion:

+ +

+In 27.6.1.2.1 [istream.formatted.reqmts] and 27.6.2.6.1 [ostream.formatted.reqmts] +(exception()&badbit) != 0 is used in testing for rethrow, yet +exception() is the constructor to class std::exception in 18.6.1 [type.info] that has no return type. Should member function +exceptions() found in 27.4.4 [ios] be used instead? +

+ + + +

Proposed resolution:

+

+In 27.6.1.2.1 [istream.formatted.reqmts] and 27.6.2.6.1 [ostream.formatted.reqmts], change +"(exception()&badbit) != 0" to "(exceptions()&badbit) != 0". +

+ + +

Rationale:

+

Fixes an obvious typo.

+ + + + + +
+

375. basic_ios should be ios_base in 27.7.1.3

+

Section: 27.7.1.4 [stringbuf.virtuals] Status: WP + Submitter: Ray Lischner Date: 2002-08-14

+

View other active issues in [stringbuf.virtuals].

+

View all other issues in [stringbuf.virtuals].

+

View all issues with WP status.

+

Discussion:

+

+In Section 27.7.1.4 [stringbuf.virtuals]: Table 90, Table 91, and paragraph +14 all contain references to "basic_ios::" which should be +"ios_base::". +

+ + +

Proposed resolution:

+

+Change all references to "basic_ios" in Table 90, Table 91, and +paragraph 14 to "ios_base". +

+ + +

Rationale:

Fixes an obvious typo.

+ + + + +
+

376. basic_streambuf semantics

+

Section: 27.7.1.4 [stringbuf.virtuals] Status: WP + Submitter: Ray Lischner Date: 2002-08-14

+

View other active issues in [stringbuf.virtuals].

+

View all other issues in [stringbuf.virtuals].

+

View all issues with WP status.

+

Discussion:

+

+In Section 27.7.1.4 [stringbuf.virtuals], Table 90, the implication is that +the four conditions should be mutually exclusive, but they are not. +The first two cases, as written, are subcases of the third.

+ +

+As written, it is unclear what should be the result if cases 1 and 2 +are both true, but case 3 is false. +

+ + + +

Proposed resolution:

+ +

Rewrite these conditions as:

+
+

+ (which & (ios_base::in|ios_base::out)) == ios_base::in +

+ +

+ (which & (ios_base::in|ios_base::out)) == ios_base::out +

+ +

+ (which & (ios_base::in|ios_base::out)) == +(ios_base::in|ios_base::out) + and way == either ios_base::beg or ios_base::end +

+ +

Otherwise

+
+ + + +

Rationale:

+

It's clear what we wanted to say, we just failed to say it. This + fixes it.

+ + + + + +
+

379. nonsensical ctype::do_widen() requirement

+

Section: 22.2.1.1.2 [locale.ctype.virtuals] Status: WP + Submitter: Martin Sebor Date: 2002-09-06

+

View all other issues in [locale.ctype.virtuals].

+

View all issues with WP status.

+

Discussion:

+

+The last sentence in 22.2.1.1.2, p11 below doesn't seem to make sense. +

+
  charT do_widen (char c) const;
+
+  -11- Effects: Applies the simplest reasonable transformation from
+       a char value or sequence of char values to the corresponding
+       charT value or values. The only characters for which unique
+       transformations are required are those in the basic source
+       character set (2.2). For any named ctype category with a
+       ctype<charT> facet ctw and valid ctype_base::mask value
+       M (is(M, c) || !ctw.is(M, do_widen(c))) is true.
+
+

+Shouldn't the last sentence instead read +

+
       For any named ctype category with a ctype<char> facet ctc
+       and valid ctype_base::mask value M
+       (ctc.is(M, c) || !is(M, do_widen(c))) is true.
+
+

+I.e., if the narrow character c is not a member of a class of +characters then neither is the widened form of c. (To paraphrase +footnote 224.) +

+ + +

Proposed resolution:

+

+Replace the last sentence of 22.2.1.1.2 [locale.ctype.virtuals], p11 with the +following text: +

+
       For any named ctype category with a ctype<char> facet ctc
+       and valid ctype_base::mask value M,
+       (ctc.is(M, c) || !is(M, do_widen(c))) is true.
+
+ +

[Kona: Minor edit. Added a comma after the M for clarity.]

+ + + + +

Rationale:

+

The LWG believes this is just a typo, and that this is the correct fix.

+ + + + + +
+

380. typos in codecvt tables 53 and 54

+

Section: 22.2.1.5 [locale.codecvt.byname] Status: WP + Submitter: Martin Sebor Date: 2002-09-06

+

View all other issues in [locale.codecvt.byname].

+

View all issues with WP status.

+

Discussion:

+

+Tables 53 and 54 in 22.2.1.5 [locale.codecvt.byname] are both titled "convert +result values," when surely "do_in/do_out result values" must have +been intended for Table 53 and "do_unshift result values" for Table +54. +

+

+Table 54, row 3 says that the meaning of partial is "more characters +needed to be supplied to complete termination." The function is not +supplied any characters, it is given a buffer which it fills with +characters or, more precisely, destination elements (i.e., an escape +sequence). So partial means that space for more than (to_limit - to) +destination elements was needed to terminate a sequence given the +value of state. +

+ + +

Proposed resolution:

+

+Change the title of Table 53 to "do_in/do_out result values" and +the title of Table 54 to "do_unshift result values." +

+

+Change the text in Table 54, row 3 (the partial row), under the +heading Meaning, to "space for more than (to_limit - to) destination +elements was needed to terminate a sequence given the value of state." +

+ + + + +
+

381. detection of invalid mbstate_t in codecvt

+

Section: 22.2.1.5 [locale.codecvt.byname] Status: WP + Submitter: Martin Sebor Date: 2002-09-06

+

View all other issues in [locale.codecvt.byname].

+

View all issues with WP status.

+

Discussion:

+

+All but one codecvt member functions that take a state_type argument +list as one of their preconditions that the state_type argument have +a valid value. However, according to 22.2.1.5.2, p6, +codecvt::do_unshift() is the only codecvt member that is supposed to +return error if the state_type object is invalid. +

+ +

+It seems to me that the treatment of state_type by all codecvt member +functions should be the same and the current requirements should be +changed. Since the detection of invalid state_type values may be +difficult in general or computationally expensive in some specific +cases, I propose the following: +

+ + +

Proposed resolution:

+

+Add a new paragraph before 22.2.1.5.2, p5, and after the function +declaration below +

+
    result do_unshift(stateT& state,
+    externT* to, externT* to_limit, externT*& to_next) const;
+
+

+as follows: +

+
    Requires: (to <= to_end) well defined and true; state initialized,
+    if at the beginning of a sequence, or else equal to the result of
+    converting the preceding characters in the sequence.
+
+

+and change the text in Table 54, row 4, the error row, under +the heading Meaning, from +

+
    state has invalid value
+
+

+to +

+
    an unspecified error has occurred
+
+ + +

Rationale:

+

The intent is that implementations should not be required to detect +invalid state values; such a requirement appears nowhere else. An +invalid state value is a precondition violation, i.e. undefined +behavior. Implementations that do choose to detect invalid state +values, or that choose to detect any other kind of error, may return +error as an indication.

+ + + + + +
+

383. Bidirectional iterator assertion typo

+

Section: 24.1.4 [bidirectional.iterators] Status: WP + Submitter: ysapir (submitted via comp.std.c++) Date: 2002-10-17

+

View all other issues in [bidirectional.iterators].

+

View all issues with WP status.

+

Discussion:

+

+Following a discussion on the boost list regarding end iterators and +the possibility of performing operator--() on them, it seems to me +that there is a typo in the standard. This typo has nothing to do +with that discussion. +

+ +

+I have checked this newsgroup, as well as attempted a search of the +Active/Defect/Closed Issues List on the site for the words "s is +derefer" so I believe this has not been proposed before. Furthermore, +the "Lists by Index" mentions only DR 299 on section +24.1.4, and DR 299 is not related to this issue. +

+ +

+The standard makes the following assertion on bidirectional iterators, +in section 24.1.4 [lib.bidirectional.iterators], Table 75: +

+ +
                         operational  assertion/note
+expression  return type   semantics    pre/post-condition
+
+--r          X&                        pre: there exists s such
+                                       that r == ++s.
+                                       post: s is dereferenceable.
+                                       --(++r) == r.
+                                       --r == --s implies r == s.
+                                       &r == &--r.
+
+ +

+(See http://aspn.activestate.com/ASPN/Mail/Message/boost/1395763.) +

+ +

+In particular, "s is dereferenceable" seems to be in error. It seems +that the intention was to say "r is dereferenceable". +

+ +

+If it were to say "r is dereferenceable" it would +make perfect sense. Since s must be dereferenceable prior to +operator++, then the natural result of operator-- (to undo operator++) +would be to make r dereferenceable. Furthermore, without other +assertions, and basing only on precondition and postconditions, we +could not otherwise know this. So it is also interesting information. +

+ + + +

Proposed resolution:

+

+Change the guarantee to "postcondition: r is dereferenceable." +

+ + +

Rationale:

Fixes an obvious typo

+ + + + +
+

384. equal_range has unimplementable runtime complexity

+

Section: 25.3.3.3 [equal.range] Status: WP + Submitter: Hans Bos Date: 2002-10-18

+

View all other issues in [equal.range].

+

View all issues with WP status.

+

Discussion:

+

+Section 25.3.3.3 [equal.range] +states that at most 2 * log(last - first) + 1 +comparisons are allowed for equal_range. +

+ +

It is not possible to implement equal_range with these constraints.

+ +

In a range of one element as in:

+
    int x = 1;
+    equal_range(&x, &x + 1, 1)
+
+ +

it is easy to see that at least 2 comparison operations are needed.

+ +

For this case at most 2 * log(1) + 1 = 1 comparison is allowed.

+ +

I have checked a few libraries and they all use the same (nonconforming) +algorithm for equal_range that has a complexity of

+
     2* log(distance(first, last)) + 2.
+
+

I guess this is the algorithm that the standard assumes for equal_range.

+ +

+It is easy to see that 2 * log(distance) + 2 comparisons are enough +since equal range can be implemented with lower_bound and upper_bound +(both log(distance) + 1). +

+ +

+I think it is better to require something like 2log(distance) + O(1) (or +even logarithmic as multiset::equal_range). +Then an implementation has more room to optimize for certain cases (e.g. +have log(distance) characteristics when at most match is found in the range +but 2log(distance) + 4 for the worst case). +

+ + + +

Proposed resolution:

+

In 25.3.3.1 [lower.bound]/4, change log(last - first) + 1 +to log2(last - first) + O(1).

+ +

In 25.3.3.2 [upper.bound]/4, change log(last - first) + 1 +to log2(last - first) + O(1).

+ +

In 25.3.3.3 [equal.range]/4, change 2*log(last - first) + 1 +to 2*log2(last - first) + O(1).

+ +

[Matt provided wording]

+ + + +

Rationale:

+

The LWG considered just saying O(log n) for all three, but + decided that threw away too much valuable information. The fact + that lower_bound is twice as fast as equal_range is important. + However, it's better to allow an arbitrary additive constant than to + specify an exact count. An exact count would have to + involve floor or ceil. It would be too easy to + get this wrong, and don't provide any substantial value for users.

+ + + + +
+

386. Reverse iterator's operator[] has impossible return type

+

Section: 24.4.1.3.11 [reverse.iter.op-=] Status: DR + Submitter: Matt Austern Date: 2002-10-23

+

View all issues with DR status.

+

Discussion:

+

In 24.4.1.3.11 [reverse.iter.op-=], reverse_iterator<>::operator[] +is specified as having a return type of reverse_iterator::reference, +which is the same as iterator_traits<Iterator>::reference. +(Where Iterator is the underlying iterator type.)

+ +

The trouble is that Iterator's own operator[] doesn't + necessarily have a return type + of iterator_traits<Iterator>::reference. Its + return type is merely required to be convertible + to Iterator's value type. The return type specified for + reverse_iterator's operator[] would thus appear to be impossible.

+ +

With the resolution of issue 299, the type of + a[n] will continue to be required (for random access + iterators) to be convertible to the value type, and also a[n] = + t will be a valid expression. Implementations of + reverse_iterator will likely need to return a proxy from + operator[] to meet these requirements. As mentioned in the + comment from Dave Abrahams, the simplest way to specify that + reverse_iterator meet this requirement to just mandate + it and leave the return type of operator[] unspecified.

+ + + +

Proposed resolution:

+ +

In 24.4.1.2 [reverse.iter.requirements] change:

+ +
+
reference operator[](difference_type n) const;
+
+
+ +

to:

+ +
+
unspecified operator[](difference_type n) const; // see 24.1.5 [random.access.iterators]
+
+
+ + + + +

[ +Comments from Dave Abrahams: IMO we should resolve 386 by just saying + that the return type of reverse_iterator's operator[] is + unspecified, allowing the random access iterator requirements to + impose an appropriate return type. If we accept 299's proposed + resolution (and I think we should), the return type will be + readable and writable, which is about as good as we can do. +]

+ + + + + + +
+

389. Const overload of valarray::operator[] returns by value

+

Section: 26.5.2.3 [valarray.access] Status: WP + Submitter: Gabriel Dos Reis Date: 2002-11-08

+

View all other issues in [valarray.access].

+

View all issues with WP status.

+

Duplicate of: 77

+

Discussion:

+

Consider the following program:

+
    #include <iostream>
+    #include <ostream>
+    #include <vector>
+    #include <valarray>
+    #include <algorithm>
+    #include <iterator>
+    template<typename Array>
+    void print(const Array& a)
+    {
+    using namespace std;
+    typedef typename Array::value_type T;
+    copy(&a[0], &a[0] + a.size(),
+    ostream_iterator<T>(std::cout, " "));
+    }
+    template<typename T, unsigned N>
+    unsigned size(T(&)[N]) { return N; }
+    int main()
+    {
+    double array[] = { 0.89, 9.3, 7, 6.23 };
+    std::vector<double> v(array, array + size(array));
+    std::valarray<double> w(array, size(array));
+    print(v); // #1
+    std::cout << std::endl;
+    print(w); // #2
+    std::cout << std::endl;
+    }
+
+ +

While the call numbered #1 succeeds, the call numbered #2 fails +because the const version of the member function +valarray<T>::operator[](size_t) returns a value instead of a +const-reference. That seems to be so for no apparent reason, no +benefit. Not only does that defeats users' expectation but it also +does hinder existing software (written either in C or Fortran) +integration within programs written in C++. There is no reason why +subscripting an expression of type valarray<T> that is const-qualified +should not return a const T&.

+ + +

Proposed resolution:

+

In the class synopsis in 26.5.2 [template.valarray], and in +26.5.2.3 [valarray.access] just above paragraph 1, change

+
  T operator[](size_t const);
+
+

to

+
  const T& operator[](size_t const);
+
+ +

[Kona: fixed a minor typo: put semicolon at the end of the line + wehre it belongs.]

+ + + + +

Rationale:

+

Return by value seems to serve no purpose. Valaray was explicitly +designed to have a specified layout so that it could easily be +integrated with libraries in other languages, and return by value +defeats that purpose. It is believed that this change will have no +impact on allowable optimizations.

+ + + + + +
+

391. non-member functions specified as const

+

Section: 22.1.3.2 [conversions] Status: WP + Submitter: James Kanze Date: 2002-12-10

+

View all issues with WP status.

+

Discussion:

+

+The specifications of toupper and tolower both specify the functions as +const, althought they are not member functions, and are not specified as +const in the header file synopsis in section 22.1 [locales]. +

+ + +

Proposed resolution:

+

In 22.1.3.2 [conversions], remove const from the function + declarations of std::toupper and std::tolower

+ + +

Rationale:

Fixes an obvious typo

+ + + + +
+

395. inconsistencies in the definitions of rand() and random_shuffle()

+

Section: 26.7 [c.math] Status: WP + Submitter: James Kanze Date: 2003-01-03

+

View other active issues in [c.math].

+

View all other issues in [c.math].

+

View all issues with WP status.

+

Discussion:

+

+In 26.7 [c.math], the C++ standard refers to the C standard for the +definition of rand(); in the C standard, it is written that "The +implementation shall behave as if no library function calls the rand +function." +

+ +

+In 25.2.12 [alg.random.shuffle], there is no specification as to +how the two parameter version of the function generates its random +value. I believe that all current implementations in fact call rand() +(in contradiction with the requirement avove); if an implementation does +not call rand(), there is the question of how whatever random generator +it does use is seeded. Something is missing. +

+ + + +

Proposed resolution:

+

+In [lib.c.math], add a paragraph specifying that the C definition of +rand shal be modified to say that "Unless otherwise specified, the +implementation shall behave as if no library function calls the rand +function." +

+ +

+In [lib.alg.random.shuffle], add a sentence to the effect that "In +the two argument form of the function, the underlying source of +random numbers is implementation defined. [Note: in particular, an +implementation is permitted to use rand.] +

+ + +

Rationale:

+

The original proposed resolution proposed requiring the + two-argument from of random_shuffle to + use rand. We don't want to do that, because some existing + implementations already use something else: gcc + uses lrand48, for example. Using rand presents a + problem if the number of elements in the sequence is greater than + RAND_MAX.

+ + + + + +
+

400. redundant type cast in lib.allocator.members

+

Section: 20.6.1.1 [allocator.members] Status: WP + Submitter: Markus Mauhart Date: 2003-02-27

+

View all other issues in [allocator.members].

+

View all issues with WP status.

+

Discussion:

+

+20.6.1.1 [allocator.members] allocator members, contains +the following 3 lines: +

+ +
  12 Returns: new((void *) p) T( val)
+     void destroy(pointer p);
+  13 Returns: ((T*) p)->~T()
+
+ +

+The type cast "(T*) p" in the last line is redundant cause +we know that std::allocator<T>::pointer is a typedef for T*. +

+ + +

Proposed resolution:

+

+Replace "((T*) p)" with "p". +

+ + +

Rationale:

Just a typo, this is really editorial.

+ + + + +
+

401. incorrect type casts in table 32 in lib.allocator.requirements

+

Section: 20.1.2 [allocator.requirements] Status: WP + Submitter: Markus Mauhart Date: 2003-02-27

+

View other active issues in [allocator.requirements].

+

View all other issues in [allocator.requirements].

+

View all issues with WP status.

+

Discussion:

+

+I think that in par2 of [default.con.req] the last two +lines of table 32 contain two incorrect type casts. The lines are ... +

+ +
  a.construct(p,t)   Effect: new((void*)p) T(t)
+  a.destroy(p)       Effect: ((T*)p)?->~T()
+
+ +

+.... with the prerequisits coming from the preceding two paragraphs, especially +from table 31: +

+ +
  alloc<T>             a     ;// an allocator for T
+  alloc<T>::pointer    p     ;// random access iterator
+                              // (may be different from T*)
+  alloc<T>::reference  r = *p;// T&
+  T const&             t     ;
+
+ +

+For that two type casts ("(void*)p" and "(T*)p") to be well-formed +this would require then conversions to T* and void* for all +alloc<T>::pointer, so it would implicitely introduce extra +requirements for alloc<T>::pointer, additionally to the only +current requirement (being a random access iterator). +

+ + +

Proposed resolution:

+ +

+Accept proposed wording from +N2436 part 1. +

+ +

+Note: Actually I would prefer to replace "((T*)p)?->dtor_name" with +"p?->dtor_name", but AFAICS this is not possible cause of an omission +in 13.5.6 [over.ref] (for which I have filed another DR on 29.11.2002). +

+ +

[Kona: The LWG thinks this is somewhere on the border between + Open and NAD. The intend is clear: construct constructs an + object at the location p. It's reading too much into the + description to think that literally calling new is + required. Tweaking this description is low priority until we can do + a thorough review of allocators, and, in particular, allocators with + non-default pointer types.]

+ + +

[ +Batavia: Proposed resolution changed to less code and more description. +]

+ + +

[ +post Oxford: This would be rendered NAD Editorial by acceptance of +N2257. +]

+ + +

[ +Kona (2007): The LWG adopted the proposed resolution of N2387 for this issue which +was subsequently split out into a separate paper N2436 for the purposes of voting. +The resolution in N2436 addresses this issue. The LWG voted to accelerate this +issue to Ready status to be voted into the WP at Kona. +]

+ + + + + + + +
+

402. wrong new expression in [some_]allocator::construct

+

Section: 20.1.2 [allocator.requirements], 20.6.1.1 [allocator.members] Status: WP + Submitter: Markus Mauhart Date: 2003-02-27

+

View other active issues in [allocator.requirements].

+

View all other issues in [allocator.requirements].

+

View all issues with WP status.

+

Discussion:

+

+This applies to the new expression that is contained in both par12 of +20.6.1.1 [allocator.members] and in par2 (table 32) of [default.con.req]. +I think this new expression is wrong, involving unintended side +effects. +

+ + +

20.6.1.1 [allocator.members] contains the following 3 lines:

+ +
  11 Returns: the largest value N for which the call allocate(N,0) might succeed.
+     void construct(pointer p, const_reference val);
+  12 Returns: new((void *) p) T( val)
+
+ + +

[default.con.req] in table 32 has the following line:

+
  a.construct(p,t)   Effect: new((void*)p) T(t)
+
+ +

+.... with the prerequisits coming from the preceding two paragraphs, +especially from table 31: +

+ +
  alloc<T>             a     ;// an allocator for T
+  alloc<T>::pointer    p     ;// random access iterator
+                              // (may be different from T*)
+  alloc<T>::reference  r = *p;// T&
+  T const&             t     ;
+
+ +

+Cause of using "new" but not "::new", any existing "T::operator new" +function will hide the global placement new function. When there is no +"T::operator new" with adequate signature, +every_alloc<T>::construct(..) is ill-formed, and most +std::container<T,every_alloc<T>> use it; a workaround +would be adding placement new and delete functions with adequate +signature and semantic to class T, but class T might come from another +party. Maybe even worse is the case when T has placement new and +delete functions with adequate signature but with "unknown" semantic: +I dont like to speculate about it, but whoever implements +any_container<T,any_alloc> and wants to use construct(..) +probably must think about it. +

+ + +

Proposed resolution:

+

+Replace "new" with "::new" in both cases. +

+ + + + + + + +
+

403. basic_string::swap should not throw exceptions

+

Section: 21.3.6.8 [string::swap] Status: WP + Submitter: Beman Dawes Date: 2003-03-25

+

View all other issues in [string::swap].

+

View all issues with WP status.

+

Discussion:

+ +

+std::basic_string, 21.3 [basic.string] paragraph 2 says that +basic_string "conforms to the requirements of a Sequence, as specified +in (23.1.1)." The sequence requirements specified in (23.1.1) to not +include any prohibition on swap members throwing exceptions. +

+ +

+Section 23.1 [container.requirements] paragraph 10 does limit conditions under +which exceptions may be thrown, but applies only to "all container +types defined in this clause" and so excludes basic_string::swap +because it is defined elsewhere. +

+ +

+Eric Niebler points out that 21.3 [basic.string] paragraph 5 explicitly +permits basic_string::swap to invalidates iterators, which is +disallowed by 23.1 [container.requirements] paragraph 10. Thus the standard would +be contradictory if it were read or extended to read as having +basic_string meet 23.1 [container.requirements] paragraph 10 requirements. +

+ +

+Yet several LWG members have expressed the belief that the original +intent was that basic_string::swap should not throw exceptions as +specified by 23.1 [container.requirements] paragraph 10, and that the standard is +unclear on this issue. The complexity of basic_string::swap is +specified as "constant time", indicating the intent was to avoid +copying (which could cause a bad_alloc or other exception). An +important use of swap is to ensure that exceptions are not thrown in +exception-safe code. +

+ +

+Note: There remains long standing concern over whether or not it is +possible to reasonably meet the 23.1 [container.requirements] paragraph 10 swap +requirements when allocators are unequal. The specification of +basic_string::swap exception requirements is in no way intended to +address, prejudice, or otherwise impact that concern. +

+ + + + + + + +

Proposed resolution:

+

+In 21.3.6.8 [string::swap], add a throws clause: +

+ +

+Throws: Shall not throw exceptions. +

+ + + + + +
+

404. May a replacement allocation function be declared inline?

+

Section: 17.4.3.4 [replacement.functions], 18.5.1 [new.delete] Status: WP + Submitter: Matt Austern Date: 2003-04-24

+

View all issues with WP status.

+

Discussion:

+

+The eight basic dynamic memory allocation functions (single-object +and array versions of ::operator new and ::operator delete, in the +ordinary and nothrow forms) are replaceable. A C++ program may +provide an alternative definition for any of them, which will be used +in preference to the implementation's definition. +

+ +

+Three different parts of the standard mention requirements on +replacement functions: 17.4.3.4 [replacement.functions], 18.5.1.1 [new.delete.single] +and 18.5.1.2 [new.delete.array], and 3.7.2 [basic.stc.auto]. +

+ +

None of these three places say whether a replacement function may + be declared inline. 18.5.1.1 [new.delete.single] paragraph 2 specifies a + signature for the replacement function, but that's not enough: + the inline specifier is not part of a function's signature. + One might also reason from 7.1.2 [dcl.fct.spec] paragraph 2, which + requires that "an inline function shall be defined in every + translation unit in which it is used," but this may not be quite + specific enough either. We should either explicitly allow or + explicitly forbid inline replacement memory allocation + functions.

+ + +

Proposed resolution:

+

+Add a new sentence to the end of 17.4.3.4 [replacement.functions] paragraph 3: +"The program's definitions shall not be specified as inline. +No diagnostic is required." +

+ +

[Kona: added "no diagnostic is required"]

+ + + + +

Rationale:

+

+The fact that inline isn't mentioned appears to have been +nothing more than an oversight. Existing implementations do not +permit inline functions as replacement memory allocation functions. +Providing this functionality would be difficult in some cases, and is +believed to be of limited value. +

+ + + + + +
+

405. qsort and POD

+

Section: 25.4 [alg.c.library] Status: WP + Submitter: Ray Lischner Date: 2003-04-08

+

View all other issues in [alg.c.library].

+

View all issues with WP status.

+

Discussion:

+

+Section 25.4 [alg.c.library] describes bsearch and qsort, from the C +standard library. Paragraph 4 does not list any restrictions on qsort, +but it should limit the base parameter to point to POD. Presumably, +qsort sorts the array by copying bytes, which requires POD. +

+ + +

Proposed resolution:

+

+In 25.4 [alg.c.library] paragraph 4, just after the declarations and +before the nonnormative note, add these words: "both of which have the +same behavior as the original declaration. The behavior is undefined +unless the objects in the array pointed to by base are of POD +type." +

+ +

[Something along these lines is clearly necessary. Matt + provided wording.]

+ + + + + + +
+

406. vector::insert(s) exception safety

+

Section: 23.2.5.4 [vector.modifiers] Status: DR + Submitter: Dave Abrahams Date: 2003-04-27

+

View all other issues in [vector.modifiers].

+

View all issues with DR status.

+

Discussion:

+

+There is a possible defect in the standard: the standard text was +never intended to prevent arbitrary ForwardIterators, whose operations +may throw exceptions, from being passed, and it also wasn't intended +to require a temporary buffer in the case where ForwardIterators were +passed (and I think most implementations don't use one). As is, the +standard appears to impose requirements that aren't met by any +existing implementation. +

+ + +

Proposed resolution:

+

Replace 23.2.5.4 [vector.modifiers] paragraph 1 with:

+

+ 1- Notes: Causes reallocation if the new size is greater than the + old capacity. If no reallocation happens, all the iterators and + references before the insertion point remain valid. If an exception + is thrown other than by the copy constructor or assignment operator + of T or by any InputIterator operation there are no effects. +

+ +

[We probably need to say something similar for deque.]

+ + + + + + + +
+

407. Can singular iterators be destroyed?

+

Section: 24.1 [iterator.requirements] Status: WP + Submitter: Nathan Myers Date: 2003-06-03

+

View other active issues in [iterator.requirements].

+

View all other issues in [iterator.requirements].

+

View all issues with WP status.

+

Discussion:

+

+Clause 24.1 [iterator.requirements], paragraph 5, says that the only expression +that is defined for a singular iterator is "an assignment of a +non-singular value to an iterator that holds a singular value". This +means that destroying a singular iterator (e.g. letting an automatic +variable go out of scope) is technically undefined behavior. This +seems overly strict, and probably unintentional. +

+ + +

Proposed resolution:

+

+Change the sentence in question to "... the only exceptions are +destroying an iterator that holds a singular value, or the assignment +of a non-singular value to an iterator that holds a singular value." +

+ + + + + +
+

409. Closing an fstream should clear error state

+

Section: 27.8.1.9 [ifstream.members], 27.8.1.13 [ofstream.members] Status: DR + Submitter: Nathan Myers Date: 2003-06-03

+

View all other issues in [ifstream.members].

+

View all issues with DR status.

+

Discussion:

+

+A strict reading of 27.8.1 [fstreams] shows that opening or +closing a basic_[io]fstream does not affect the error bits. This +means, for example, that if you read through a file up to EOF, and +then close the stream and reopen it at the beginning of the file, +the EOF bit in the stream's error state is still set. This is +counterintuitive. +

+

+The LWG considered this issue once before, as issue 22, +and put in a footnote to clarify that the strict reading was indeed +correct. We did that because we believed the standard was +unambiguous and consistent, and that we should not make architectural +changes in a TC. Now that we're working on a new revision of the +language, those considerations no longer apply. +

+ + +

Proposed resolution:

+ +

Change 27.8.1.9 [ifstream.members], para. 3 from:

+ +

+Calls rdbuf()->open(s,mode|in). If that function returns a null +pointer, calls setstate(failbit) (which may throw ios_base::failure +[Footnote: (lib.iostate.flags)]. +

+ +

to:

+ +

Calls rdbuf()->open(s,mode|in). If that function +returns a null pointer, calls setstate(failbit) (which may throw +ios_base::failure [Footnote: (lib.iostate.flags)), else calls clear(). +

+ +

Change 27.8.1.13 [ofstream.members], para. 3 from:

+ +

Calls rdbuf()->open(s,mode|out). If that function +returns a null pointer, calls setstate(failbit) (which may throw +ios_base::failure [Footnote: (lib.iostate.flags)). +

+ +

to:

+ +

Calls rdbuf()->open(s,mode|out). If that function +returns a null pointer, calls setstate(failbit) (which may throw +ios_base::failure [Footnote: (lib.iostate.flags)), else calls clear(). +

+ +

Change 27.8.1.17 [fstream.members], para. 3 from:

+ +

Calls rdbuf()->open(s,mode), If that function returns +a null pointer, calls setstate(failbit), (which may throw +ios_base::failure). (lib.iostate.flags) ) +

+ +

to:

+ +

Calls rdbuf()->open(s,mode), If that function returns +a null pointer, calls setstate(failbit), (which may throw +ios_base::failure). (lib.iostate.flags) ), else calls clear(). +

+ + + +

[Kona: the LWG agrees this is a good idea. Post-Kona: Bill +provided wording. He suggests having open, not close, clear the error +flags.]

+ + +

[Post-Sydney: Howard provided a new proposed resolution. The + old one didn't make sense because it proposed to fix this at the + level of basic_filebuf, which doesn't have access to the stream's + error state. Howard's proposed resolution fixes this at the level + of the three fstream class template instead.]

+ + + + + + + + +
+

410. Missing semantics for stack and queue comparison operators

+

Section: 23.2.3.1 [list.cons], 23.2.3.3 [list.modifiers] Status: WP + Submitter: Hans Bos Date: 2003-06-07

+

View all other issues in [list.cons].

+

View all issues with WP status.

+

Discussion:

+

+Sections 23.2.3.1 [list.cons] and 23.2.3.3 [list.modifiers] list +comparison operators (==, !=, <, <=, >, =>) for queue and +stack. Only the semantics for queue::operator== (23.2.3.1 [list.cons] par2) and queue::operator< (23.2.3.1 [list.cons] +par3) are defined. +

+ + +

Proposed resolution:

+ +

Add the following new paragraphs after 23.2.3.1 [list.cons] + paragraph 3:

+ +
+ +
  operator!=
+
+

Returns: x.c != y.c

+ +
  operator>
+
+

Returns: x.c > y.c

+ +
  operator<=
+
+

Returns: x.c <= y.c

+ +
  operator>=
+
+

Returns: x.c >= y.c

+ +
+ +

Add the following paragraphs at the end of 23.2.3.3 [list.modifiers]:

+ +
+ +
  operator==
+
+

Returns: x.c == y.c

+ +
  operator<
+
+

Returns: x.c < y.c

+ +
  operator!=
+
+

Returns: x.c != y.c

+ +
  operator>
+
+

Returns: x.c > y.c

+ +
  operator<=
+
+

Returns: x.c <= y.c

+ +
  operator>=
+
+

Returns: x.c >= y.c

+ +
+ + +

[Kona: Matt provided wording.]

+ + + + +

Rationale:

+

There isn't any real doubt about what these operators are +supposed to do, but we ought to spell it out.

+ + + + + +
+

411. Wrong names of set member functions

+

Section: 25.3.5 [alg.set.operations] Status: WP + Submitter: Daniel Frey Date: 2003-07-09

+

View all other issues in [alg.set.operations].

+

View all issues with WP status.

+

Discussion:

+

+25.3.5 [alg.set.operations] paragraph 1 reads: +"The semantics of the set operations are generalized to multisets in a +standard way by defining union() to contain the maximum number of +occurrences of every element, intersection() to contain the minimum, and +so on." +

+ +

+This is wrong. The name of the functions are set_union() and +set_intersection(), not union() and intersection(). +

+ + +

Proposed resolution:

+

Change that sentence to use the correct names.

+ + + + + +
+

412. Typo in 27.4.4.3

+

Section: 27.4.4.3 [iostate.flags] Status: WP + Submitter: Martin Sebor Date: 2003-07-10

+

View all other issues in [iostate.flags].

+

View all issues with WP status.

+

Duplicate of: 429

+

Discussion:

+

+The Effects clause in 27.4.4.3 [iostate.flags] paragraph 5 says that the +function only throws if the respective bits are already set prior to +the function call. That's obviously not the intent. The typo ought to +be corrected and the text reworded as: "If (state & +exceptions()) == 0, returns. ..." +

+ + +

Proposed resolution:

+

+In 27.4.4.3 [iostate.flags] paragraph 5, replace "If (rdstate() & +exceptions()) == 0" with "If ((state | (rdbuf() ? goodbit : badbit)) +& exceptions()) == 0". +

+ +

[Kona: the original proposed resolution wasn't quite right. We + really do mean rdstate(); the ambiguity is that the wording in the + standard doesn't make it clear whether we mean rdstate() before + setting the new state, or rdsate() after setting it. We intend the + latter, of course. Post-Kona: Martin provided wording.]

+ + + + + + + +
+

413. Proposed resolution to LDR#64 still wrong

+

Section: 27.6.1.2.3 [istream::extractors] Status: DR + Submitter: Bo Persson Date: 2003-07-13

+

View all other issues in [istream::extractors].

+

View all issues with DR status.

+

Discussion:

+

+The second sentence of the proposed resolution says: +

+ +

+"If it inserted no characters because it caught an exception thrown +while extracting characters from sb and ..." +

+ +

+However, we are not extracting from sb, but extracting from the +basic_istream (*this) and inserting into sb. I can't really tell if +"extracting" or "sb" is a typo. +

+ +

[ +Sydney: Definitely a real issue. We are, indeed, extracting characters +from an istream and not from sb. The problem was there in the FDIS and +wasn't fixed by issue 64. Probably what was intended was +to have *this instead of sb. We're talking about the exception flag +state of a basic_istream object, and there's only one basic_istream +object in this discussion, so that would be a consistent +interpretation. (But we need to be careful: the exception policy of +this member function must be consistent with that of other +extractors.) PJP will provide wording. +]

+ + + + +

Proposed resolution:

+

Change the sentence from:

+ +

+If it inserted no characters because it caught an exception thrown +while extracting characters from sb and failbit is on in exceptions(), +then the caught exception is rethrown. +

+ +

to:

+ +

+If it inserted no characters because it caught an exception thrown +while extracting characters from *this and failbit is on in exceptions(), +then the caught exception is rethrown. +

+ + + + + +
+

414. Which iterators are invalidated by v.erase()?

+

Section: 23.2.5.4 [vector.modifiers] Status: WP + Submitter: Matt Austern Date: 2003-08-19

+

View all other issues in [vector.modifiers].

+

View all issues with WP status.

+

Discussion:

+

+Consider the following code fragment: +

+
+
int A[8] = { 1,3,5,7,9,8,4,2 };
+std::vector<int> v(A, A+8);
+
+std::vector<int>::iterator i1 = v.begin() + 3;
+std::vector<int>::iterator i2 = v.begin() + 4;
+v.erase(i1);
+
+
+ +

+Which iterators are invalidated by v.erase(i1): i1, i2, +both, or neither? +

+ +

+On all existing implementations that I know of, the status of i1 and +i2 is the same: both of them will be iterators that point to some +elements of the vector (albeit not the same elements they did +before). You won't get a crash if you use them. Depending on +exactly what you mean by "invalidate", you might say that neither one +has been invalidated because they still point to something, +or you might say that both have been invalidated because in both +cases the elements they point to have been changed out from under the +iterator. +

+ +

+The standard doesn't say either of those things. It says that erase +invalidates all iterators and references "after the point of the +erase". This doesn't include i1, since it's at the point of the +erase instead of after it. I can't think of any sensible definition +of invalidation by which one can say that i2 is invalidated but i1 +isn't. +

+ +

+(This issue is important if you try to reason about iterator validity +based only on the guarantees in the standard, rather than reasoning +from typical implementation techniques. Strict debugging modes, +which some programmers find useful, do not use typical implementation +techniques.) +

+ + +

Proposed resolution:

+

+In 23.2.5.4 [vector.modifiers] paragraph 3, change "Invalidates all the +iterators and references after the point of the erase" to +"Invalidates iterators and references at or after the point of the +erase". +

+ + +

Rationale:

+

I believe this was essentially a typographical error, and that it + was taken for granted that erasing an element invalidates iterators + that point to it. The effects clause in question treats iterators + and references in parallel, and it would seem counterintuitive to + say that a reference to an erased value remains valid.

+ + + + + +
+

415. behavior of std::ws

+

Section: 27.6.1.4 [istream.manip] Status: WP + Submitter: Martin Sebor Date: 2003-09-18

+

View all issues with WP status.

+

Discussion:

+

+According to 27.6.1.4, the ws() manipulator is not required to construct +the sentry object. The manipulator is also not a member function so the +text in 27.6.1, p1 through 4 that describes the exception policy for +istream member functions does not apply. That seems inconsistent with +the rest of extractors and all the other input functions (i.e., ws will +not cause a tied stream to be flushed before extraction, it doesn't check +the stream's exceptions or catch exceptions thrown during input, and it +doesn't affect the stream's gcount). +

+ + +

Proposed resolution:

+

+Add to 27.6.1.4 [istream.manip], immediately before the first sentence +of paragraph 1, the following text: +

+ +

+ Behaves as an unformatted input function (as described in + 27.6.1.3, paragraph 1), except that it does not count the number + of characters extracted and does not affect the value returned by + subsequent calls to is.gcount(). After constructing a sentry + object... +

+ +

[Post-Kona: Martin provided wording]

+ + + + + + +
+

416. definitions of XXX_MIN and XXX_MAX macros in climits

+

Section: 18.2.2 [c.limits] Status: WP + Submitter: Martin Sebor Date: 2003-09-18

+

View all issues with WP status.

+

Discussion:

+

+ +Given two overloads of the function foo(), one taking an argument of type +int and the other taking a long, which one will the call foo(LONG_MAX) +resolve to? The expected answer should be foo(long), but whether that +is true depends on the #defintion of the LONG_MAX macro, specifically +its type. This issue is about the fact that the type of these macros +is not actually required to be the same as the the type each respective +limit. +
+ +Section 18.2.2 of the C++ Standard does not specify the exact types of +the XXX_MIN and XXX_MAX macros #defined in the <climits> and <limits.h> +headers such as INT_MAX and LONG_MAX and instead defers to the C standard. +
+ +Section 5.2.4.2.1, p1 of the C standard specifies that "The values [of +these constants] shall be replaced by constant expressions suitable for use +in #if preprocessing directives. Moreover, except for CHAR_BIT and MB_LEN_MAX, +the following shall be replaced by expressions that have the same type as +would an expression that is an object of the corresponding type converted +according to the integer promotions." +
+ +The "corresponding type converted according to the integer promotions" for +LONG_MAX is, according to 6.4.4.1, p5 of the C standard, the type of long +converted to the first of the following set of types that can represent it: +int, long int, long long int. So on an implementation where (sizeof(long) +== sizeof(int)) this type is actually int, while on an implementation where +(sizeof(long) > sizeof(int)) holds this type will be long. +
+ +This is not an issue in C since the type of the macro cannot be detected +by any conforming C program, but it presents a portability problem in C++ +where the actual type is easily detectable by overload resolution. + +

+

[Kona: the LWG does not believe this is a defect. The C macro + definitions are what they are; we've got a better + mechanism, std::numeric_limits, that is specified more + precisely than the C limit macros. At most we should add a + nonnormative note recommending that users who care about the exact + types of limit quantities should use <limits> instead of + <climits>.]

+ + + + +

Proposed resolution:

+ +

+Change 18.2.2 [c.limits], paragraph 2: +

+ +

+-2- The contents are the same as the Standard C library header <limits.h>. +[Note: The types of the macros in <climits> are not guaranteed +to match the type to which they refer.--end note] +

+ + + + + +
+

420. is std::FILE a complete type?

+

Section: 27.8.1 [fstreams] Status: WP + Submitter: Martin Sebor Date: 2003-09-18

+

View all other issues in [fstreams].

+

View all issues with WP status.

+

Discussion:

+

+7.19.1, p2, of C99 requires that the FILE type only be declared in +<stdio.h>. None of the (implementation-defined) members of the +struct is mentioned anywhere for obvious reasons. +

+ +

+C++ says in 27.8.1, p2 that FILE is a type that's defined in <cstdio>. Is +it really the intent that FILE be a complete type or is an implementation +allowed to just declare it without providing a full definition? +

+ + +

Proposed resolution:

+

In the first sentence of 27.8.1 [fstreams] paragraph 2, change + "defined" to "declared".

+ + +

Rationale:

+

We don't want to impose any restrictions beyond what the C standard + already says. We don't want to make anything implementation defined, + because that imposes new requirements in implementations.

+ + + + + +
+

422. explicit specializations of member functions of class templates

+

Section: 17.4.3.1 [reserved.names] Status: WP + Submitter: Martin Sebor Date: 2003-09-18

+

View all other issues in [reserved.names].

+

View all issues with WP status.

+

Discussion:

+

+It has been suggested that 17.4.3.1, p1 may or may not allow programs to +explicitly specialize members of standard templates on user-defined types. +The answer to the question might have an impact where library requirements +are given using the "as if" rule. I.e., if programs are allowed to specialize +member functions they will be able to detect an implementation's strict +conformance to Effects clauses that describe the behavior of the function +in terms of the other member function (the one explicitly specialized by +the program) by relying on the "as if" rule. +

+ + +

Proposed resolution:

+ +

+ Add the following sentence to 17.4.3.1 [reserved.names], p1: +

+ +

+It is undefined for a C++ program to add declarations or definitions to +namespace std or namespaces within namespace std unless otherwise specified. A +program may add template specializations for any standard library template to +namespace std. Such a specialization (complete or partial) of a standard library +template results in undefined behavior unless the declaration depends on a +user-defined type of external linkage and unless the specialization meets the +standard library requirements for the original template.168) +A program has undefined behavior if it declares +

+
    +
  • an explicit specialization of any member function of a standard + library class template, or
  • +
  • an explicit specialization of any member function template of a + standard library class or class template, or
  • +
  • an explicit or partial specialization of any member class + template of a standard library class or class template.
  • +
+

+A program may explicitly instantiate any templates in the standard library only +if the declaration depends on the name of a user-defined type of external +linkage and the instantiation meets the standard library requirements for the +original template. +

+ +

[Kona: straw poll was 6-1 that user programs should not be + allowed to specialize individual member functions of standard + library class templates, and that doing so invokes undefined + behavior. Post-Kona: Martin provided wording.]

+ + +

[Sydney: The LWG agrees that the standard shouldn't permit users +to specialize individual member functions unless they specialize the +whole class, but we're not sure these words say what we want them to; +they could be read as prohibiting the specialization of any standard +library class templates. We need to consult with CWG to make sure we +use the right wording.]

+ + + + + + +
+

425. return value of std::get_temporary_buffer

+

Section: 20.6.3 [temporary.buffer] Status: WP + Submitter: Martin Sebor Date: 2003-09-18

+

View all issues with WP status.

+

Discussion:

+

+The standard is not clear about the requirements on the value returned from +a call to get_temporary_buffer(0). In particular, it fails to specify whether +the call should return a distinct pointer each time it is called (like +operator new), or whether the value is unspecified (as if returned by +malloc). The standard also fails to mention what the required behavior +is when the argument is less than 0. +

+ + +

Proposed resolution:

+

Change 20.4.3 [meta.help] paragraph 2 from "...or a pair of 0 +values if no storage can be obtained" to "...or a pair of 0 values if +no storage can be obtained or if n <= 0."

+

[Kona: Matt provided wording]

+ + + + + +
+

426. search_n(), fill_n(), and generate_n() with negative n

+

Section: 25.1.9 [alg.search], 25.2.6 [alg.fill], 25.2.7 [alg.generate] Status: WP + Submitter: Martin Sebor Date: 2003-09-18

+

View all other issues in [alg.search].

+

View all issues with WP status.

+

Discussion:

+

+The complexity requirements for these function templates are incorrect +(or don't even make sense) for negative n:

+ +

25.1.9, p7 (search_n): +
+Complexity: At most (last1 - first1) * count applications +of the corresponding predicate.

+ +

25.2.5, p3 (fill_n): +
+Complexity: Exactly last - first (or n) assignments.

+ +

25.2.6, p3 (generate_n): +
+Complexity: Exactly last - first (or n) assignments.

+ +

+In addition, the Requirements or the Effects clauses for the latter two +templates don't say anything about the behavior when n is negative. +

+ + +

Proposed resolution:

+

Change 25.1.9, p7 to

+ +

+Complexity: At most (last1 - first1) * count applications +of the corresponding predicate if count is positive, +or 0 otherwise. +

+ +

Change 25.2.5, p2 to

+

+Effects: Assigns value through all the iterators in the range [first, +last), or [first, first + n) if n is positive, none otherwise. +

+ +

Change 25.2.5, p3 to:

+

+Complexity: Exactly last - first (or n if n is positive, +or 0 otherwise) assignments. +

+ +

+Change 25.2.6, p1 +to (notice the correction for the misspelled "through"): +

+

+Effects: Invokes the function object genand assigns the return +value of gen through all the iterators in the range [first, last), +or [first, first + n) if n is positive, or [first, first) +otherwise. +

+ +

Change 25.2.6, p3 to:

+

+Complexity: Exactly last - first (or n if n is positive, +or 0 otherwise) assignments. +

+ + +

Rationale:

+

Informally, we want to say that whenever we see a negative number + we treat it the same as if it were zero. We believe the above + changes do that (although they may not be the minimal way of saying + so). The LWG considered and rejected the alternative of saying that + negative numbers are undefined behavior.

+ + + + + +
+

428. string::erase(iterator) validity

+

Section: 21.3.6.5 [string::erase] Status: WP + Submitter: Martin Sebor Date: 2003-09-18

+

View all other issues in [string::erase].

+

View all issues with WP status.

+

Discussion:

+

+23.1.1, p3 along with Table 67 specify as a prerequisite for a.erase(q) +that q must be a valid dereferenceable iterator into the sequence a. +

+ +

+However, 21.3.5.5, p5 describing string::erase(p) only requires that +p be a valid iterator. +

+ +

+This may be interepreted as a relaxation of the general requirement, +which is most likely not the intent. +

+ + +

Proposed resolution:

+

Remove 21.3.6.5 [string::erase] paragraph 5.

+ + +

Rationale:

+

The LWG considered two options: changing the string requirements to + match the general container requirements, or just removing the + erroneous string requirements altogether. The LWG chose the latter + option, on the grounds that duplicating text always risks the + possibility that it might be duplicated incorrectly.

+ + + + + +
+

432. stringbuf::overflow() makes only one write position available

+

Section: 27.7.1.4 [stringbuf.virtuals] Status: WP + Submitter: Christian W Brock Date: 2003-09-24

+

View other active issues in [stringbuf.virtuals].

+

View all other issues in [stringbuf.virtuals].

+

View all issues with WP status.

+

Discussion:

+

27.7.1.3 par 8 says:

+

+Notes: The function can make a write position available only if + ( mode & ios_base::out) != 0. To make a write position + available, the function reallocates (or initially allocates) an + array object with a sufficient number of elements to hold the + current array object (if any), plus one additional write position. + If ( mode & ios_base::in) != 0, the function alters the read end + pointer egptr() to point just past the new write position (as + does the write end pointer epptr()). +

+ +

+The sentences "plus one additional write position." and especially + "(as does the write end pointer epptr())" COULD by interpreted + (and is interpreted by at least my library vendor) as: +

+ +

+ post-condition: epptr() == pptr()+1 +

+ +

+This WOULD force sputc() to call the virtual overflow() each time. +

+ +

The proposed change also affects Defect Report 169.

+ + + +

Proposed resolution:

+

27.7.1.1/2 Change:

+ +

+2- Notes: The function allocates no array object. +

+ +

+to: +

+ +

+2- Postcondition: str() == "". +

+ +

+27.7.1.1/3 Change: +

+ +
+

+-3- Effects: Constructs an object of class basic_stringbuf, +initializing the base class with basic_streambuf() +(lib.streambuf.cons), and initializing mode with which . Then copies +the content of str into the basic_stringbuf underlying character +sequence and initializes the input and output sequences according to +which. If which & ios_base::out is true, initializes the output +sequence with the underlying sequence. If which & ios_base::in is +true, initializes the input sequence with the underlying sequence. +

+
+ +

to:

+ +
+

+-3- Effects: Constructs an object of class basic_stringbuf, +initializing the base class with basic_streambuf() +(lib.streambuf.cons), and initializing mode with which. Then copies +the content of str into the basic_stringbuf underlying character +sequence. If which & ios_base::out is true, initializes the output +sequence such that pbase() points to the first underlying character, +epptr() points one past the last underlying character, and if (which & +ios_base::ate) is true, pptr() is set equal to +epptr() else pptr() is set equal to pbase(). If which & ios_base::in +is true, initializes the input sequence such that eback() and gptr() +point to the first underlying character and egptr() points one past +the last underlying character. +

+
+ +

27.7.1.2/1 Change:

+ +
+

+-1- Returns: A basic_string object whose content is equal to the +basic_stringbuf underlying character sequence. If the buffer is only +created in input mode, the underlying character sequence is equal to +the input sequence; otherwise, it is equal to the output sequence. In +case of an empty underlying character sequence, the function returns +basic_string<charT,traits,Allocator>(). +

+
+ +

to:

+ +
+

+-1- Returns: A basic_string object whose content is equal to the +basic_stringbuf underlying character sequence. If the basic_stringbuf +was created only in input mode, the resultant basic_string contains +the character sequence in the range [eback(), egptr()). If the +basic_stringbuf was created with (which & ios_base::out) being true +then the resultant basic_string contains the character sequence in the +range [pbase(), high_mark) where high_mark represents the position one +past the highest initialized character in the buffer. Characters can +be initialized either through writing to the stream, or by +constructing the basic_stringbuf with a basic_string, or by calling +the str(basic_string) member function. In the case of calling the +str(basic_string) member function, all characters initialized prior to +the call are now considered uninitialized (except for those +characters re-initialized by the new basic_string). Otherwise the +basic_stringbuf has been created in neither input nor output mode and +a zero length basic_string is returned. +

+
+ +

+27.7.1.2/2 Change: +

+ +
+

+-2- Effects: If the basic_stringbuf's underlying character sequence is +not empty, deallocates it. Then copies the content of s into the +basic_stringbuf underlying character sequence and initializes the +input and output sequences according to the mode stored when creating +the basic_stringbuf object. If (mode&ios_base::out) is true, then +initializes the output sequence with the underlying sequence. If +(mode&ios_base::in) is true, then initializes the input sequence with +the underlying sequence. +

+
+ +

to:

+ +
+

+-2- Effects: Copies the content of s into the basic_stringbuf +underlying character sequence. If mode & ios_base::out is true, +initializes the output sequence such that pbase() points to the first +underlying character, epptr() points one past the last underlying +character, and if (mode & ios_base::ate) is true, +pptr() is set equal to epptr() else pptr() is set equal to pbase(). If +mode & ios_base::in is true, initializes the input sequence such that +eback() and gptr() point to the first underlying character and egptr() +points one past the last underlying character. +

+
+ +

Remove 27.2.1.2/3. (Same rationale as issue 238: incorrect and unnecessary.)

+ +

27.7.1.3/1 Change:

+ +
+

+1- Returns: If the input sequence has a read position available, +returns traits::to_int_type(*gptr()). Otherwise, returns +traits::eof(). +

+
+ +

to:

+ +
+

+1- Returns: If the input sequence has a read position available, +returns traits::to_int_type(*gptr()). Otherwise, returns +traits::eof(). Any character in the underlying buffer which has been +initialized is considered to be part of the input sequence. +

+
+ +

27.7.1.3/9 Change:

+ +
+

+-9- Notes: The function can make a write position available only if ( +mode & ios_base::out) != 0. To make a write position available, the +function reallocates (or initially allocates) an array object with a +sufficient number of elements to hold the current array object (if +any), plus one additional write position. If ( mode & ios_base::in) != +0, the function alters the read end pointer egptr() to point just past +the new write position (as does the write end pointer epptr()). +

+
+ +

to:

+ +
+

+-9- The function can make a write position available only if ( mode & +ios_base::out) != 0. To make a write position available, the function +reallocates (or initially allocates) an array object with a sufficient +number of elements to hold the current array object (if any), plus one +additional write position. If ( mode & ios_base::in) != 0, the +function alters the read end pointer egptr() to point just past the +new write position. +

+
+ +

27.7.1.3/12 Change:

+ +
+

+-12- _ If (newoff + off) < 0, or (xend - xbeg) < (newoff + off), the +positioning operation fails. Otherwise, the function assigns xbeg + +newoff + off to the next pointer xnext . +

+
+ +

to:

+ +
+

+-12- _ If (newoff + off) < 0, or if (newoff + off) refers to an +uninitialized character (as defined in 27.7.1.3 [stringbuf.members] +paragraph 1), the positioning operation fails. Otherwise, the function +assigns xbeg + newoff + off to the next pointer xnext . +

+
+ +

[post-Kona: Howard provided wording. At Kona the LWG agreed that + something along these lines was a good idea, but the original + proposed resolution didn't say enough about the effect of various + member functions on the underlying character sequences.]

+ + + + +

Rationale:

+

The current basic_stringbuf description is over-constrained in such +a way as to prohibit vendors from making this the high-performance +in-memory stream it was meant to be. The fundamental problem is that +the pointers: eback(), gptr(), egptr(), pbase(), pptr(), epptr() are +observable from a derived client, and the current description +restricts the range [pbase(), epptr()) from being grown geometrically. +This change allows, but does not require, geometric growth of this +range.

+ +

Backwards compatibility issues: These changes will break code that +derives from basic_stringbuf, observes epptr(), and depends upon +[pbase(), epptr()) growing by one character on each call to overflow() +(i.e. test suites). Otherwise there are no backwards compatibility +issues.

+ +

27.7.1.1/2: The non-normative note is non-binding, and if it were +binding, would be over specification. The recommended change focuses +on the important observable fact.

+ +

27.7.1.1/3: This change does two things: 1. It describes exactly +what must happen in terms of the sequences. The terms "input +sequence" and "output sequence" are not well defined. 2. It +introduces a common extension: open with app or ate mode. I concur +with issue 238 that paragraph 4 is both wrong and unnecessary.

+ +

27.7.1.2/1: This change is the crux of the efficiency issue. The +resultant basic_string is not dependent upon epptr(), and thus +implementors are free to grow the underlying buffer geometrically +during overflow() *and* place epptr() at the end of that buffer.

+ +

27.7.1.2/2: Made consistent with the proposed 27.7.1.1/3.

+ +

27.7.1.3/1: Clarifies that characters written to the stream beyond +the initially specified string are available for reading in an i/o +basic_streambuf.

+ +

27.7.1.3/9: Made normative by removing "Notes:", and removed the +trailing parenthetical comment concerning epptr().

+ +

27.7.1.3/12: Restricting the positioning to [xbeg, xend) is no +longer allowable since [pbase(), epptr()) may now contain +uninitialized characters. Positioning is only allowable over the +initialized range.

+ + + + + +
+

434. bitset::to_string() hard to use

+

Section: 23.3.5.2 [bitset.members] Status: DR + Submitter: Martin Sebor Date: 2003-10-15

+

View all other issues in [bitset.members].

+

View all issues with DR status.

+

Discussion:

+

+It has been pointed out a number of times that the bitset to_string() member +function template is tedious to use since callers must explicitly specify the +entire template argument list (3 arguments). At least two implementations +provide a number of overloads of this template to make it easier to use. +

+ + + +

Proposed resolution:

+

In order to allow callers to specify no template arguments at all, just the +first one (charT), or the first 2 (charT and traits), in addition to all +three template arguments, add the following three overloads to both the +interface (declarations only) of the class template bitset as well as to +section 23.3.5.2, immediately after p34, the Returns clause of the existing +to_string() member function template:

+ +
    template <class charT, class traits>
+    basic_string<charT, traits, allocator<charT> >
+    to_string () const;
+
+    -34.1- Returns: to_string<charT, traits, allocator<charT> >().
+
+    template <class charT>
+    basic_string<charT, char_traits<charT>, allocator<charT> >
+    to_string () const;
+
+    -34.2- Returns: to_string<charT, char_traits<charT>, allocator<charT> >().
+
+    basic_string<char, char_traits<char>, allocator<char> >
+    to_string () const;
+
+    -34.3- Returns: to_string<char, char_traits<char>, allocator<char> >().
+
+ +

[Kona: the LWG agrees that this is an improvement over the + status quo. Dietmar thought about an alternative using a proxy + object but now believes that the proposed resolution above is the + right choice. +]

+ + + + + + + + +
+

435. bug in DR 25

+

Section: 21.3.8.9 [string.io] Status: WP + Submitter: Martin Sebor Date: 2003-10-15

+

View all other issues in [string.io].

+

View all issues with WP status.

+

Discussion:

+ +

+It has been pointed out that the proposed resolution in DR 25 may not be +quite up to snuff:
+http://gcc.gnu.org/ml/libstdc++/2003-09/msg00147.html +http://anubis.dkuug.dk/jtc1/sc22/wg21/docs/lwg-defects.html#25
+

+ +

+It looks like Petur is right. The complete corrected text is copied below. +I think we may have have been confused by the reference to 22.2.2.2.2 and +the subsequent description of `n' which actually talks about the second +argument to sputn(), not about the number of fill characters to pad with. +

+ +

+So the question is: was the original text correct? If the intent was to +follow classic iostreams then it most likely wasn't, since setting width() +to less than the length of the string doesn't truncate it on output. This +is also the behavior of most implementations (except for SGI's standard +iostreams where the operator does truncate). +

+ + + +

Proposed resolution:

+

Change the text in 21.3.7.9, p4 from

+

+ If bool(k) is true, inserts characters as if by calling + os.rdbuf()->sputn(str.data(), n), padding as described in stage 3 + of lib.facet.num.put.virtuals, where n is the larger of os.width() + and str.size(); +

+

to

+

+ If bool(k) is true, determines padding as described in + lib.facet.num.put.virtuals, and then inserts the resulting + sequence of characters seq as if by calling + os.rdbuf()->sputn(seq, n), where n is the larger of + os.width() and str.size(); +

+ +

[Kona: it appears that neither the original wording, DR25, nor the + proposed resolution, is quite what we want. We want to say that + the string will be output, padded to os.width() if necessary. We + don't want to duplicate the padding rules in clause 22, because + they're complicated, but we need to be careful because they weren't + quite written with quite this case in mind. We need to say what + the character sequence is, and then defer to clause 22. Post-Kona: + Benjamin provided wording.]

+ + + + + + + +
+

436. are cv-qualified facet types valid facets?

+

Section: 22.1.1.1.2 [locale.facet] Status: WP + Submitter: Martin Sebor Date: 2003-10-15

+

View all issues with WP status.

+

Discussion:

+

+Is "const std::ctype<char>" a valid template argument to has_facet, use_facet, +and the locale template ctor? And if so, does it designate the same Facet as +the non-const "std::ctype<char>?" What about "volatile std::ctype<char>?" +Different implementations behave differently: some fail to compile, others +accept such types but behave inconsistently. +

+ + +

Proposed resolution:

+

Change 22.1.1.1.2, p1 to read:

+ +

Template parameters in this clause which are required to be facets +are those named Facet in declarations. A program that passes a type +that is not a facet, or a type that refers to volatile-qualified +facet, as an (explicit or deduced) template parameter to a locale +function expecting a facet, is ill-formed. A const-qualified facet is +a valid template argument to any locale function that expects a Facet +template parameter.

+ +

[Kona: changed the last sentence from a footnote to normative +text.]

+ + + + + + +
+

438. Ambiguity in the "do the right thing" clause

+

Section: 23.1.1 [sequence.reqmts] Status: DR + Submitter: Howard Hinnant Date: 2003-10-20

+

View all other issues in [sequence.reqmts].

+

View all issues with DR status.

+

Discussion:

+ +

Section 23.1.1 [sequence.reqmts], paragraphs 9-11, fixed up the problem +noticed with statements like:

+
vector<int> v(10, 1);
+
+ +

The intent of the above statement was to construct with:

+
vector(size_type, const value_type&);
+
+ +

but early implementations failed to compile as they bound to:

+
template <class InputIterator>
+vector(InputIterator f, InputIterator l);
+
+

instead.

+ +

Paragraphs 9-11 say that if InputIterator is an integral type, then the +member template constructor will have the same effect as:

+
vector<static_cast<size_type>(f), static_cast<value_type>(l));
+
+

(and similarly for the other member template functions of sequences).

+ +

There is also a note that describes one implementation technique:

+

+ One way that sequence implementors can satisfy this requirement is to + specialize the member template for every integral type. +

+ +

This might look something like:

+
+
template <class T>
+struct vector
+{
+     typedef unsigned size_type;
+
+     explicit vector(size_type) {}
+     vector(size_type, const T&) {}
+
+     template <class I>
+     vector(I, I);
+
+     // ...
+};
+
+template <class T>
+template <class I>
+vector<T>::vector(I, I) { ... }
+
+template <>
+template <>
+vector<int>::vector(int, int) { ... }
+
+template <>
+template <>
+vector<int>::vector(unsigned, unsigned) { ... }
+
+//  ...
+
+
+ +

Label this solution 'A'.

+ +

The standard also says:

+

+ Less cumbersome implementation techniques also exist. +

+

+A popular technique is to not specialize as above, but instead catch +every call with the member template, detect the type of InputIterator, +and then redirect to the correct logic. Something like: +

+
+
template <class T>
+template <class I>
+vector<T>::vector(I f, I l)
+{
+     choose_init(f, l, int2type<is_integral<I>::value>());
+}
+
+template <class T>
+template <class I>
+vector<T>::choose_init(I f, I l, int2type<false>)
+{
+    // construct with iterators
+}
+
+template <class T>
+template <class I>
+vector<T>::choose_init(I f, I l, int2type<true>)
+{
+    size_type sz = static_cast<size_type>(f);
+    value_type v = static_cast<value_type>(l);
+    // construct with sz,v
+}
+
+
+ +

Label this solution 'B'.

+ +

Both of these solutions solve the case the standard specifically +mentions:

+
vector<int> v(10, 1);  // ok, vector size 10, initialized to 1
+
+ +

+However, (and here is the problem), the two solutions have different +behavior in some cases where the value_type of the sequence is not an +integral type. For example consider: +

+
     pair<char, char>                     p('a', 'b');
+     vector<vector<pair<char, char> > >   d('a', 'b');
+
+

+The second line of this snippet is likely an error. Solution A catches +the error and refuses to compile. The reason is that there is no +specialization of the member template constructor that looks like: +

+
template <>
+template <>
+vector<vector<pair<char, char> > >::vector(char, char) { ... }
+
+ +

+So the expression binds to the unspecialized member template +constructor, and then fails (compile time) because char is not an +InputIterator. +

+ +

+Solution B compiles the above example though. 'a' is casted to an +unsigned integral type and used to size the outer vector. 'b' is +static casted to the inner vector using it's explicit constructor: +

+ +
explicit vector(size_type n);
+
+ +

+and so you end up with a static_cast<size_type>('a') by +static_cast<size_type>('b') matrix. +

+ +

+It is certainly possible that this is what the coder intended. But the +explicit qualifier on the inner vector has been thwarted at any rate. +

+ +

+The standard is not clear whether the expression: +

+ +
     vector<vector<pair<char, char> > >   d('a', 'b');
+
+ +

+(and similar expressions) are: +

+ +
    +
  1. undefined behavior.
  2. +
  3. illegal and must be rejected.
  4. +
  5. legal and must be accepted.
  6. +
+ +

My preference is listed in the order presented.

+ +

There are still other techniques for implementing the requirements of +paragraphs 9-11, namely the "restricted template technique" (e.g. +enable_if). This technique is the most compact and easy way of coding +the requirements, and has the behavior of #2 (rejects the above +expression). +

+ +

+Choosing 1 would allow all implementation techniques I'm aware of. +Choosing 2 would allow only solution 'A' and the enable_if technique. +Choosing 3 would allow only solution 'B'. +

+ +

+Possible wording for a future standard if we wanted to actively reject +the expression above would be to change "static_cast" in paragraphs +9-11 to "implicit_cast" where that is defined by: +

+ +
+
template <class T, class U>
+inline
+T implicit_cast(const U& u)
+{
+     return u;
+}
+
+
+ + + +

Proposed resolution:

+ +

Replace 23.1.1 [sequence.reqmts] paragraphs 9 - 11 with:

+ +

For every sequence defined in this clause and in clause lib.strings:

+ +
    +
  • +

    If the constructor

    +
           template <class InputIterator>
    +       X(InputIterator f, InputIterator l,
    +         const allocator_type& a = allocator_type())
    +       
    +

    is called with a type InputIterator that does not qualify as + an input iterator, then the constructor will behave as if the + overloaded constructor:

    +
           X(size_type, const value_type& = value_type(),
    +         const allocator_type& = allocator_type())
    +       
    +

    were called instead, with the arguments static_cast<size_type>(f), l and a, respectively.

    +
  • + +
  • +

    If the member functions of the forms:

    +
           template <class InputIterator>          //  such as  insert()
    +       rt fx1(iterator p, InputIterator f, InputIterator l);
    +
    +       template <class InputIterator>          //  such as  append(), assign()
    +       rt fx2(InputIterator f, InputIterator l);
    +
    +       template <class InputIterator>          //  such as  replace()
    +       rt fx3(iterator i1, iterator i2, InputIterator f, InputIterator l);
    +       
    +

    are called with a type InputIterator that does not qualify as + an input iterator, then these functions will behave as if the + overloaded member functions:

    +
           rt fx1(iterator, size_type, const value_type&);
    +
    +       rt fx2(size_type, const value_type&);
    +
    +       rt fx3(iterator, iterator, size_type, const value_type&);
    +       
    +

    were called instead, with the same arguments.

    +
  • +
+ +

In the previous paragraph the alternative binding will fail if f +is not implicitly convertible to X::size_type or if l is not implicitly +convertible to X::value_type.

+ +

+The extent to which an implementation determines that a type cannot be +an input iterator is unspecified, except that as a minimum integral +types shall not qualify as input iterators. +

+ + + +

[ +Kona: agreed that the current standard requires v('a', 'b') +to be accepted, and also agreed that this is surprising behavior. The +LWG considered several options, including something like +implicit_cast, which doesn't appear to be quite what we want. We +considered Howards three options: allow acceptance or rejection, +require rejection as a compile time error, and require acceptance. By +straw poll (1-6-1), we chose to require a compile time error. +Post-Kona: Howard provided wording. +]

+ + +

[ +Sydney: The LWG agreed with this general direction, but there was some +discomfort with the wording in the original proposed resolution. +Howard submitted new wording, and we will review this again in +Redmond. +]

+ + +

[Redmond: one very small change in wording: the first argument + is cast to size_t. This fixes the problem of something like + vector<vector<int> >(5, 5), where int is not + implicitly convertible to the value type.]

+ + + + +

Rationale:

+

The proposed resolution fixes:

+ +
  vector<int> v(10, 1);
+
+ +

+since as integral types 10 and 1 must be disqualified as input +iterators and therefore the (size,value) constructor is called (as +if).

+ +

The proposed resolution breaks:

+ +
  vector<vector<T> > v(10, 1);
+
+ +

+because the integral type 1 is not *implicitly* convertible to +vector<T>. The wording above requires a diagnostic.

+ +

+The proposed resolution leaves the behavior of the following code +unspecified. +

+ +
  struct A
+  {
+    operator int () const {return 10;}
+  };
+
+  struct B
+  {
+    B(A) {}
+  };
+
+  vector<B> v(A(), A());
+
+ +

+The implementation may or may not detect that A is not an input +iterator and employee the (size,value) constructor. Note though that +in the above example if the B(A) constructor is qualified explicit, +then the implementation must reject the constructor as A is no longer +implicitly convertible to B. +

+ + + + + +
+

441. Is fpos::state const?

+

Section: 27.4.3 [fpos] Status: WP + Submitter: Vincent Leloup Date: 2003-11-17

+

View all other issues in [fpos].

+

View all issues with WP status.

+

Discussion:

+

+In section 27.4.3.1 [fpos.members] fpos<stateT>::state() is declared +non const, but in section 27.4.3 [fpos] it is declared const. +

+ + +

Proposed resolution:

+

+In section 27.4.3.1 [fpos.members], change the declaration of +fpos<stateT>::state() to const. +

+ + + + + +
+

442. sentry::operator bool() inconsistent signature

+

Section: 27.6.2.4 [ostream::sentry] Status: WP + Submitter: Vincent Leloup Date: 2003-11-18

+

View other active issues in [ostream::sentry].

+

View all other issues in [ostream::sentry].

+

View all issues with WP status.

+

Discussion:

+

+In section 27.6.2.4 [ostream::sentry] paragraph 4, in description part +basic_ostream<charT, traits>::sentry::operator bool() is declared +as non const, but in section 27.6.2.3, in synopsis it is declared +const. +

+ + +

Proposed resolution:

+

+In section 27.6.2.4 [ostream::sentry] paragraph 4, change the declaration +of sentry::operator bool() to const. +

+ + + + + +
+

443. filebuf::close() inconsistent use of EOF

+

Section: 27.8.1.4 [filebuf.members] Status: WP + Submitter: Vincent Leloup Date: 2003-11-20

+

View other active issues in [filebuf.members].

+

View all other issues in [filebuf.members].

+

View all issues with WP status.

+

Discussion:

+

+In section 27.8.1.4 [filebuf.members] par6, in effects description of +basic_filebuf<charT, traits>::close(), overflow(EOF) is used twice; +should be overflow(traits::eof()). +

+ + +

Proposed resolution:

+

+Change overflow(EOF) to overflow(traits::eof()). +

+ + + + + +
+

444. Bad use of casts in fstream

+

Section: 27.8.1 [fstreams] Status: DR + Submitter: Vincent Leloup Date: 2003-11-20

+

View all other issues in [fstreams].

+

View all issues with DR status.

+

Discussion:

+

27.8.1.9 [ifstream.members] p1, 27.8.1.13 [ofstream.members] p1, +27.8.1.17 [fstream.members] p1 seems have same problem as exposed in +LWG issue +252. +

+ + +

Proposed resolution:

+ +

[Sydney: Genuine defect. 27.8.1.13 needs a cast to cast away + constness. The other two places are stylistic: we could change the + C-style casts to const_cast. Post-Sydney: Howard provided wording. +]

+ + +

Change 27.8.1.7/1 from:

+

+ Returns: (basic_filebuf<charT,traits>*)&sb. +

+ +

to:

+

+ Returns: const_cast<basic_filebuf<charT,traits>*>(&sb). +

+ +

Change 27.8.1.10/1 from:

+

+ Returns: (basic_filebuf<charT,traits>*)&sb. +

+ +

to:

+

+ Returns: const_cast<basic_filebuf<charT,traits>*>(&sb). +

+ +

Change 27.8.1.13/1 from:

+

+ Returns: &sb. +

+ +

to:

+

+ Returns: const_cast<basic_filebuf<charT,traits>*>(&sb). +

+ + + + + + + + +
+

445. iterator_traits::reference unspecified for some iterator categories

+

Section: 24.3.1 [iterator.traits] Status: DR + Submitter: Dave Abrahams Date: 2003-12-09

+

View all issues with DR status.

+

Discussion:

+

+The standard places no restrictions at all on the reference type +of input, output, or forward iterators (for forward iterators it +only specifies that *x must be value_type& and doesn't mention +the reference type). Bidirectional iterators' reference type is +restricted only by implication, since the base iterator's +reference type is used as the return type of reverse_iterator's +operator*, which must be T& in order to be a conforming forward +iterator. +

+ +

+Here's what I think we ought to be able to expect from an input +or forward iterator's reference type R, where a is an iterator +and V is its value_type +

+ +
    +
  • + *a is convertible to R +
  • + +
  • + R is convertible to V +
  • + +
  • + static_cast<V>(static_cast<R>(*a)) is equivalent to + static_cast<V>(*a) +
  • +
+ +

A mutable forward iterator ought to satisfy, for x of type V:

+
      { R r = *a; r = x; } is equivalent to *a = x;
+  
+ +

+I think these requirements capture existing container iterators +(including vector<bool>'s), but render istream_iterator invalid; +its reference type would have to be changed to a constant +reference. +

+ + +

+(Jeremy Siek) During the discussion in Sydney, it was felt that a +simpler long term solution for this was needed. The solution proposed +was to require reference to be the same type as *a +and pointer to be the same type as a->. Most +iterators in the Standard Library already meet this requirement. Some +iterators are output iterators, and do not need to meet the +requirement, and others are only specified through the general +iterator requirements (which will change with this resolution). The +sole case where there is an explicit definition of the reference type +that will need to change is istreambuf_iterator which returns +charT from operator* but has a reference type of +charT&. We propose changing the reference type of +istreambuf_iterator to charT. +

+ +

The other option for resolving the issue with pointer, + mentioned in the note below, is to remove pointer + altogether. I prefer placing requirements on pointer to + removing it for two reasons. First, pointer will become + useful for implementing iterator adaptors and in particular, + reverse_iterator will become more well defined. Second, + removing pointer is a rather drastic and publicly-visible + action to take.

+ +

The proposed resolution technically enlarges the requirements for +iterators, which means there are existing iterators (such as +istreambuf_iterator, and potentially some programmer-defined +iterators) that will no longer meet the requirements. Will this break +existing code? The scenario in which it would is if an algorithm +implementation (say in the Standard Library) is changed to rely on +iterator_traits::reference, and then is used with one of the +iterators that do not have an appropriately defined +iterator_traits::reference. +

+ + +

The proposed resolution makes one other subtle change. Previously, +it was required that output iterators have a difference_type +and value_type of void, which means that a forward +iterator could not be an output iterator. This is clearly a mistake, +so I've changed the wording to say that those types may be +void. +

+ + + +

Proposed resolution:

+ +

In 24.3.1 [iterator.traits], after:

+ +

+be defined as the iterator's difference type, value type and iterator +category, respectively. +

+ +

add

+ +

+In addition, the types

+
iterator_traits<Iterator>::reference
+iterator_traits<Iterator>::pointer
+
+

must be defined as the iterator's reference and pointer types, that +is, the same type as the type of *a and a->, +respectively.

+
+ +

In 24.3.1 [iterator.traits], change:

+ +

+In the case of an output iterator, the types

+
iterator_traits<Iterator>::difference_type
+iterator_traits<Iterator>::value_type
+
+

are both defined as void.

+
+ +

to:

+

+In the case of an output iterator, the types

+
iterator_traits<Iterator>::difference_type
+iterator_traits<Iterator>::value_type
+iterator_traits<Iterator>::reference
+iterator_traits<Iterator>::pointer
+
+

may be defined as void.

+
+ +

In 24.5.3 [istreambuf.iterator], change:

+
+
typename traits::off_type, charT*, charT&>
+
+
+

to:

+
+
typename traits::off_type, charT*, charT>
+
+
+ +

[ +Redmond: there was concern in Sydney that this might not be the only place +where things were underspecified and needed to be changed. Jeremy +reviewed iterators in the standard and confirmed that nothing else +needed to be changed. +]

+ + + + + + + + + +
+

448. Random Access Iterators over abstract classes

+

Section: 24.1.5 [random.access.iterators] Status: WP + Submitter: Dave Abrahams Date: 2004-01-07

+

View all other issues in [random.access.iterators].

+

View all issues with WP status.

+

Discussion:

+

+Table 76, the random access iterator requirement table, says that the +return type of a[n] must be "convertible to T". When an iterator's +value_type T is an abstract class, nothing is convertible to T. +Surely this isn't an intended restriction? +

+ + +

Proposed resolution:

+

+Change the return type to "convertible to T const&". +

+ + + + + +
+

449. Library Issue 306 Goes Too Far

+

Section: 18.1 [support.types] Status: WP + Submitter: Pete Becker Date: 2004-01-15

+

View all other issues in [support.types].

+

View all issues with WP status.

+

Discussion:

+

Original text:

+

+The macro offsetof accepts a restricted set of type arguments in this +International Standard. type shall be a POD structure or a POD union +(clause 9). The result of applying the offsetof macro to a field that +is a static data member or a function member is undefined." +

+ +

Revised text:

+

+"If type is not a POD structure or a POD union the results are undefined." +

+ +

+Looks to me like the revised text should have replaced only the second +sentence. It doesn't make sense standing alone. +

+ + + +

Proposed resolution:

+

Change 18.1, paragraph 5, to:

+ +

+The macro offsetof accepts a restricted set of type arguments in this +International Standard. If type is not a POD structure or a POD union +the results are undefined. The result of applying the offsetof macro +to a field that is a static data member or a function member is +undefined." +

+ + + + + +
+

453. basic_stringbuf::seekoff need not always fail for an empty stream

+

Section: 27.7.1.4 [stringbuf.virtuals] Status: WP + Submitter: Bill Plauger Date: 2004-01-30

+

View other active issues in [stringbuf.virtuals].

+

View all other issues in [stringbuf.virtuals].

+

View all issues with WP status.

+

Discussion:

+
  pos_type basic_stringbuf::seekoff(off_type, ios_base::seekdir,
+                                    ios_base::openmode);
+
+

+is obliged to fail if nothing has been inserted into the stream. This +is unnecessary and undesirable. It should be permissible to seek to +an effective offset of zero.

+ +

[ + Sydney: Agreed that this is an annoying problem: seeking to zero should be + legal. Bill will provide wording. +]

+ + + + +

Proposed resolution:

+

Change the sentence from:

+

+For a sequence to be positioned, if its next pointer (either +gptr() or pptr()) is a null pointer, the positioning operation +fails. +

+ +

to:

+ +

+For a sequence to be positioned, if its next pointer (either +gptr() or pptr()) is a null pointer and the new offset newoff +is nonzero, the positioning operation fails. +

+ + + + + +
+

455. cerr::tie() and wcerr::tie() are overspecified

+

Section: 27.3 [iostream.objects] Status: DR + Submitter: Bill Plauger Date: 2004-01-30

+

View all other issues in [iostream.objects].

+

View all issues with DR status.

+

Discussion:

+

+Both cerr::tie() and wcerr::tie() are obliged to be null at program +startup. This is overspecification and overkill. It is both traditional +and useful to tie cerr to cout, to ensure that standard output is drained +whenever an error message is written. This behavior should at least be +permitted if not required. Same for wcerr::tie(). +

+ + +

Proposed resolution:

+ +

Add to the description of cerr:

+

+After the object cerr is initialized, cerr.tie() returns &cout. +Its state is otherwise the same as required for basic_ios<char>::init +(lib.basic.ios.cons). +

+ +

Add to the description of wcerr:

+ +

+After the object wcerr is initialized, wcerr.tie() returns &wcout. +Its state is otherwise the same as required for basic_ios<wchar_t>::init +(lib.basic.ios.cons). +

+ +

[Sydney: straw poll (3-1): we should require, not just + permit, cout and cerr to be tied on startup. Pre-Redmond: Bill will + provide wording.]

+ + + + + + +
+

456. Traditional C header files are overspecified

+

Section: 17.4.1.2 [headers] Status: WP + Submitter: Bill Plauger Date: 2004-01-30

+

View all other issues in [headers].

+

View all issues with WP status.

+

Discussion:

+ +

The C++ Standard effectively requires that the traditional C headers +(of the form <xxx.h>) be defined in terms of the newer C++ +headers (of the form <cxxx>). Clauses 17.4.1.2/4 and D.5 combine +to require that:

+ +
    +
  • Including the header <cxxx> declares a C name in namespace std.
  • + +
  • Including the header <xxx.h> declares a C name in namespace std + (effectively by including <cxxx>), then imports it into the global + namespace with an individual using declaration.
  • +
+ +

+The rules were left in this form despited repeated and heated objections +from several compiler vendors. The C headers are often beyond the direct +control of C++ implementors. In some organizations, it's all they can do +to get a few #ifdef __cplusplus tests added. Third-party library vendors +can perhaps wrap the C headers. But neither of these approaches supports +the drastic restructuring required by the C++ Standard. As a result, it is +still widespread practice to ignore this conformance requirement, nearly +seven years after the committee last debated this topic. Instead, what is +often implemented is: +

+ +
    +
  • Including the header <xxx.h> declares a C name in the + global namespace.
  • + +
  • Including the header <cxxx> declares a C name in the + global namespace (effectively by including <xxx.h>), then + imports it into namespace std with an individual using declaration.
  • +
+ +

+The practical benefit for implementors with the second approach is that +they can use existing C library headers, as they are pretty much obliged +to do. The practical cost for programmers facing a mix of implementations +is that they have to assume weaker rules:

+ +
    +
  • If you want to assuredly declare a C name in the global + namespace, include <xxx.h>. You may or may not also get the + declaration in namespace std.
  • + +
  • If you want to assuredly declare a C name in namespace std, + include <cxxx>. You may or may not also get the declaration in + the global namespace.
  • +
+ +

+There also exists the possibility of subtle differences due to +Koenig lookup, but there are so few non-builtin types defined in the C +headers that I've yet to see an example of any real problems in this +area. +

+ +

+It is worth observing that the rate at which programmers fall afoul of +these differences has remained small, at least as measured by newsgroup +postings and our own bug reports. (By an overwhelming margin, the +commonest problem is still that programmers include <string> and can't +understand why the typename string isn't defined -- this a decade after +the committee invented namespace std, nominally for the benefit of all +programmers.) +

+ +

+We should accept the fact that we made a serious mistake and rectify it, +however belatedly, by explicitly allowing either of the two schemes for +declaring C names in headers. +

+ +

[Sydney: This issue has been debated many times, and will + certainly have to be discussed in full committee before any action + can be taken. However, the preliminary sentiment of the LWG was in + favor of the change. (6 yes, 0 no, 2 abstain) Robert Klarer + suggests that we might also want to undeprecate the + C-style .h headers.]

+ + + + +

Proposed resolution:

+

+Add to 17.4.1.2 [headers], para. 4: +

+ +

+Except as noted in clauses 18 through 27 and Annex D, the contents of each +header cname shall be the same as that of the corresponding header +name.h, as specified in ISO/IEC 9899:1990 Programming Languages C (Clause +7), or ISO/IEC:1990 Programming Languages-C AMENDMENT 1: C Integrity, (Clause +7), as appropriate, as if by inclusion. In the C++ Standard Library, however, +the declarations and definitions (except for names which are defined +as macros in C) are within namespace scope (3.3.5) of the namespace std. +It is unspecified whether these names are first declared within the global +namespace scope and are then injected into namespace std by explicit +using-declarations (7.3.3 [namespace.udecl]). +

+ +

+Change D.5 [depr.c.headers], para. 2-3: +

+ +
+

+-2- Every C header, each of which has a name of the form name.h, behaves +as if each name placed in the Standard library namespace by the corresponding +cname header is also placed within the global +namespace scope. of the namespace std and is followed +by an explicit using-declaration (7.3.3 [namespace.udecl]). +It is unspecified whether these names are first declared or defined within +namespace scope (3.3.5 [basic.scope.namespace]) of the namespace +std and are then injected into the global namespace scope by explicit +using-declarations (7.3.3 [namespace.udecl]). +

+

+-3- [Example: The header <cstdlib> assuredly +provides its declarations and definitions within the namespace std. +It may also provide these names within the global namespace. The +header <stdlib.h> makes these available also in +assuredly provides the same declarations and definitions within the +global namespace, much as in the C Standard. It may also provide these +names within the namespace std. -- end example] +

+
+ + + + + +
+

457. bitset constructor: incorrect number of initialized bits

+

Section: 23.3.5.1 [bitset.cons] Status: DR + Submitter: Dag Henriksson Date: 2004-01-30

+

View all other issues in [bitset.cons].

+

View all issues with DR status.

+

Discussion:

+

+The constructor from unsigned long says it initializes "the first M +bit positions to the corresponding bit values in val. M is the smaller +of N and the value CHAR_BIT * sizeof(unsigned long)." +

+ +

+Object-representation vs. value-representation strikes again. CHAR_BIT * +sizeof (unsigned long) does not give us the number of bits an unsigned long +uses to hold the value. Thus, the first M bit position above is not +guaranteed to have any corresponding bit values in val. +

+ + +

Proposed resolution:

+

In 23.3.5.1 [bitset.cons] paragraph 2, change "M is the smaller of + N and the value CHAR_BIT * sizeof (unsigned long). (249)" to + "M is the smaller of N and the number of bits in + the value representation (section 3.9 [basic.types]) of unsigned + long." +

+ + + + + +
+

460. Default modes missing from basic_fstream member specifications

+

Section: 27.8.1 [fstreams] Status: DR + Submitter: Ben Hutchings Date: 2004-04-01

+

View all other issues in [fstreams].

+

View all issues with DR status.

+

Discussion:

+

+The second parameters of the non-default constructor and of the open +member function for basic_fstream, named "mode", are optional +according to the class declaration in 27.8.1.11 [lib.fstream]. The +specifications of these members in 27.8.1.12 [lib.fstream.cons] and +27.8.1.13 lib.fstream.members] disagree with this, though the +constructor declaration has the "explicit" function-specifier implying +that it is intended to be callable with one argument. +

+ + +

Proposed resolution:

+

In 27.8.1.15 [fstream.cons], change

+
  explicit basic_fstream(const char* s, ios_base::openmode mode); 
+
+

to

+
  explicit basic_fstream(const char* s,
+                         ios_base::openmode mode = ios_base::in|ios_base::out);
+
+

In 27.8.1.17 [fstream.members], change

+
  void open(const char*s, ios_base::openmode mode); 
+
+

to

+
  void open(const char*s,
+            ios_base::openmode mode = ios_base::in|ios_base::out);
+
+ + + + + +
+

461. time_get hard or impossible to implement

+

Section: 22.2.5.1.2 [locale.time.get.virtuals] Status: WP + Submitter: Bill Plauger Date: 2004-03-23

+

View all issues with WP status.

+

Discussion:

+

+Template time_get currently contains difficult, if not impossible, +requirements for do_date_order, do_get_time, and do_get_date. All require +the implementation to scan a field generated by the %x or %X conversion +specifier in strftime. Yes, do_date_order can always return no_order, but +that doesn't help the other functions. The problem is that %x can be +nearly anything, and it can vary widely with locales. It's horribly +onerous to have to parse "third sunday after Michaelmas in the year of +our Lord two thousand and three," but that's what we currently ask of +do_get_date. More practically, it leads some people to think that if +%x produces 10.2.04, we should know to look for dots as separators. Still +not easy. +

+ +

+Note that this is the opposite effect from the intent stated in the +footnote earlier in this subclause: +

+ +

+"In other words, user confirmation is required for reliable parsing of +user-entered dates and times, but machine-generated formats can be +parsed reliably. This allows parsers to be aggressive about interpreting +user variations on standard formats." +

+ +

+We should give both implementers and users an easier and more reliable +alternative: provide a (short) list of alternative delimiters and say +what the default date order is for no_order. For backward compatibility, +and maximum latitude, we can permit an implementation to parse whatever +%x or %X generates, but we shouldn't require it. +

+ + +

Proposed resolution:

+ +

In the description:

+
iter_type do_get_time(iter_type s, iter_type end, ios_base& str,
+        ios_base::iostate& err, tm* t) const;
+
+ +

+2 Effects: Reads characters starting at suntil it has extracted those +struct tm members, and remaining format characters, used by +time_put<>::put to produce the format specified by 'X', or until it +encounters an error or end of sequence. +

+ +

change: 'X'

+ +

to: "%H:%M:%S"

+ + +

Change

+
iter_type do_get_date(iter_type s, iter_type end, ios_base& str,
+        ios_base::iostate& err, tm* t) const;
+
+4 Effects: Reads characters starting at s until it has extracted those
+struct tm members, and remaining format characters, used by
+time_put<>::put to produce the format specified by 'x', or until it
+encounters an error.
+
+ +

to

+
iter_type do_get_date(iter_type s, iter_type end, ios_base& str,
+        ios_base::iostate& err, tm* t) const;
+
+ +

+4 Effects: Reads characters starting at s until it has extracted those +struct tm members, and remaining format characters, used by +time_put<>::put to produce one of the following formats, or until it +encounters an error. The format depends on the value returned by +date_order() as follows: +

+ +
        date_order()  format
+
+        no_order      "%m/%d/%y"
+        dmy           "%d/%m/%y"
+        mdy           "%m/%d/%y"
+        ymd           "%y/%m/%d"
+        ydm           "%y/%d/%m"
+
+

+An implementation may also accept additional implementation-defined formats. +

+ +

[Redmond: agreed that this is a real problem. The solution is + probably to match C99's parsing rules. Bill provided wording. +]

+ + + + + + + +
+

464. Suggestion for new member functions in standard containers

+

Section: 23.2.5 [vector], 23.3.1 [map] Status: WP + Submitter: Thorsten Ottosen Date: 2004-05-12

+

View all other issues in [vector].

+

View all issues with WP status.

+

Discussion:

+ +

To add slightly more convenience to vector<T> and map<Key,T> we should consider to add

+
    +
  1. add vector<T>::data() member (const and non-const version) +semantics: if( empty() ) return 0; else return buffer_;
  2. +
  3. add map<Key,T>::at( const Key& k ) member (const and non-const version) +semantics: iterator i = find( k ); if( i != end() ) return *i; else throw range_error();
  4. +
+ +

Rationale:

+ +
    +
  • To obtain a pointer to the vector's buffer, one must use either +operator[]() (which can give undefined behavior for empty vectors) or +at() (which will then throw if the vector is empty).
  • +
  • tr1::array<T,sz> already has a data() member
  • +
  • e cannot use operator[]() when T is not DefaultDonstructible
  • +
  • Neither when the map is const.
  • +
  • when we want to make sure we don't add an element accidently
  • +
  • when it should be considered an error if a key is not in the map
  • +
+ + + +

Proposed resolution:

+

In 23.2.5 [vector], add the following to the vector + synopsis after "element access" and before "modifiers":

+
  // [lib.vector.data] data access
+  pointer       data();
+  const_pointer data() const;
+
+ +

Add a new subsection of 23.2.5 [vector]:

+
+

23.2.4.x vector data access

+
   pointer       data();
+   const_pointer data() const;
+
+

Returns: A pointer such that [data(), data() + size()) is a valid + range. For a non-empty vector, data() == &front().

+

Complexity: Constant time.

+

Throws: Nothing.

+
+ +

In 23.3.1 [map], add the following to the map +synopsis immediately after the line for operator[]:

+
  T&       at(const key_type& x);
+  const T& at(const key_type& x) const;
+
+ +

Add the following to 23.3.1.2 [map.access]:

+
+
  T&       at(const key_type& x);
+  const T& at(const key_type& x) const;
+
+ +

Returns: A reference to the element whose key is equivalent + to x, if such an element is present in the map.

+

Throws: out_of_range if no such element is present.

+ +
+ + + +

Rationale:

+

Neither of these additions provides any new functionality but the + LWG agreed that they are convenient, especially for novices. The + exception type chosen for at, std::out_of_range, + was chosen to match vector::at.

+ + + + + +
+

465. Contents of <ciso646>

+

Section: 17.4.1.2 [headers] Status: WP + Submitter: Steve Clamage Date: 2004-06-03

+

View all other issues in [headers].

+

View all issues with WP status.

+

Discussion:

+

C header <iso646.h> defines macros for some operators, such as +not_eq for !=.

+ +

Section 17.4.1.2 [headers] "Headers" says that except as noted in +clauses 18 through 27, the <cname> C++ header contents are the same +as the C header <name.h>. In particular, table 12 lists +<ciso646> as a C++ header.

+ +

I don't find any other mention of <ciso646>, or any mention of +<iso646.h>, in clauses 17 thorough 27. That implies that the +contents of <ciso646> are the same as C header <iso646.h>.

+ +

Annex C (informative, not normative) in [diff.header.iso646.h] C.2.2.2 +"Header <iso646.h>" says that the alternative tokens are not +defined as macros in <ciso646>, but does not mention the contents +of <iso646.h>.

+ +

I don't find any normative text to support C.2.2.2.

+ + + +

Proposed resolution:

+

Add to section 17.4.1.2 Headers [lib.headers] a new paragraph after + paragraph 6 (the one about functions must be functions):

+ +
+

Identifiers that are keywords or operators in C++ shall not be defined +as macros in C++ standard library headers. +[Footnote:In particular, including the standard header <iso646.h> +or <ciso646> has no effect.

+
+ +

[post-Redmond: Steve provided wording.]

+ + + + + + + +
+

467. char_traits::lt(), compare(), and memcmp()

+

Section: 21.1.3.1 [char.traits.specializations.char] Status: WP + Submitter: Martin Sebor Date: 2004-06-28

+

View all issues with WP status.

+

Discussion:

+ +

+Table 37 describes the requirements on Traits::compare() in terms of +those on Traits::lt(). 21.1.3.1, p6 requires char_traits<char>::lt() +to yield the same result as operator<(char, char). +

+ +

+Most, if not all, implementations of char_traits<char>::compare() +call memcmp() for efficiency. However, the C standard requires both +memcmp() and strcmp() to interpret characters under comparison as +unsigned, regardless of the signedness of char. As a result, all +these char_traits implementations fail to meet the requirement +imposed by Table 37 on compare() when char is signed. +

+ + +

Read email thread starting with c++std-lib-13499 for more.

+ + +

Proposed resolution:

+ + +

Change 21.1.3.1, p6 from

+

+ The two-argument members assign, eq, and lt are defined identically + to the built-in operators =, ==, and < respectively. +

+

to

+

+ The two-argument member assign is defined identically to + the built-in operator =. The two + argument members eq and lt are defined identically to + the built-in operators == and < for type unsigned char. +

+ +

[Redmond: The LWG agreed with this general direction, but we + also need to change eq to be consistent with this change. + Post-Redmond: Martin provided wording.]

+ + + + + + +
+

468. unexpected consequences of ios_base::operator void*()

+

Section: 27.4.4.3 [iostate.flags] Status: WP + Submitter: Martin Sebor Date: 2004-06-28

+

View all other issues in [iostate.flags].

+

View all issues with WP status.

+

Discussion:

+ +

The program below is required to compile but when run it typically +produces unexpected results due to the user-defined conversion from +std::cout or any object derived from basic_ios to void*. +

+ +
    #include <cassert>
+    #include <iostream>
+
+    int main ()
+    {
+        assert (std::cin.tie () == std::cout);
+        // calls std::cout.ios::operator void*()
+    }
+
+ + +

Proposed resolution:

+ +

+Replace std::basic_ios<charT, traits>::operator void*() with another +conversion operator to some unspecified type that is guaranteed not +to be convertible to any other type except for bool (a pointer-to-member +might be one such suitable type). In addition, make it clear that the +pointer type need not be a pointer to a complete type and when non-null, +the value need not be valid. +

+ +

Specifically, change in [lib.ios] the signature of

+
    operator void*() const;
+
+

to

+
    operator unspecified-bool-type() const;
+
+

and change [lib.iostate.flags], p1 from

+
    operator void*() const;
+
+

to

+
operator unspecified-bool-type() const;
+
+     -1- Returns: if fail() then a value that will evaluate false in a
+      boolean context; otherwise a value that will evaluate true in a
+      boolean context. The value type returned shall not be
+      convertible to int.
+
+     -2- [Note: This conversion can be used in contexts where a bool
+      is expected (e.g., an if condition); however, implicit
+      conversions (e.g., to int) that can occur with bool are not
+      allowed, eliminating some sources of user error. One possible
+      implementation choice for this type is pointer-to-member.  - end
+      note]
+
+ +

[Redmond: 5-4 straw poll in favor of doing this.]

+ +

[Lillehammer: Doug provided revised wording for + "unspecified-bool-type".]

+ + + + + + + + +
+

469. vector<bool> ill-formed relational operators

+

Section: 23.2.5 [vector] Status: DR + Submitter: Martin Sebor Date: 2004-06-28

+

View all other issues in [vector].

+

View all issues with DR status.

+

Discussion:

+ +

+The overloads of relational operators for vector<bool> specified +in [lib.vector.bool] are redundant (they are semantically identical +to those provided for the vector primary template) and may even be +diagnosed as ill-formed (refer to Daveed Vandevoorde's explanation +in c++std-lib-13647). +

+ + + +

Proposed resolution:

+

+Remove all overloads of overloads of relational operators for +vector<bool> from [lib.vector.bool]. +

+ + + + +
+

474. confusing Footnote 297

+

Section: 27.6.2.6.4 [ostream.inserters.character] Status: WP + Submitter: Martin Sebor Date: 2004-07-01

+

View all other issues in [ostream.inserters.character].

+

View all issues with WP status.

+

Discussion:

+ +

+I think Footnote 297 is confused. The paragraph it applies to seems +quite clear in that widen() is only called if the object is not a char +stream (i.e., not basic_ostream<char>), so it's irrelevant what the +value of widen(c) is otherwise. +

+ + +

Proposed resolution:

+

+I propose to strike the Footnote. +

+ + + + +
+

475. May the function object passed to for_each modify the elements of the iterated sequence?

+

Section: 25.1.1 [alg.foreach] Status: WP + Submitter: Stephan T. Lavavej, Jaakko Jarvi Date: 2004-07-09

+

View all other issues in [alg.foreach].

+

View all issues with WP status.

+

Discussion:

+

+It is not clear whether the function object passed to for_each is allowed to +modify the elements of the sequence being iterated over. +

+ +

+for_each is classified without explanation in [lib.alg.nonmodifying], "25.1 +Non-modifying sequence operations". 'Non-modifying sequence operation' is +never defined. +

+ +

+25(5) says: "If an algorithm's Effects section says that a value pointed to +by any iterator passed as an argument is modified, then that algorithm has +an additional type requirement: The type of that argument shall satisfy the +requirements of a mutable iterator (24.1)." +

+ +

for_each's Effects section does not mention whether arguments can be +modified:

+ +

+ "Effects: Applies f to the result of dereferencing every iterator in the + range [first, last), starting from first and proceeding to last - 1." +

+ +

+Every other algorithm in [lib.alg.nonmodifying] is "really" non-modifying in +the sense that neither the algorithms themselves nor the function objects +passed to the algorithms may modify the sequences or elements in any way. +This DR affects only for_each. +

+ +

+We suspect that for_each's classification in "non-modifying sequence +operations" means that the algorithm itself does not inherently modify the +sequence or the elements in the sequence, but that the function object +passed to it may modify the elements it operates on. +

+ +

+The original STL document by Stepanov and Lee explicitly prohibited the +function object from modifying its argument. +The "obvious" implementation of for_each found in several standard library +implementations, however, does not impose this restriction. +As a result, we suspect that the use of for_each with function objects that modify +their arguments is wide-spread. +If the restriction was reinstated, all such code would become non-conforming. +Further, none of the other algorithms in the Standard +could serve the purpose of for_each (transform does not guarantee the order in +which its function object is called). +

+ +

+We suggest that the standard be clarified to explicitly allow the function object +passed to for_each modify its argument.

+ + + +

Proposed resolution:

+

Add a nonnormative note to the Effects in 25.1.1 [alg.foreach]: If +the type of 'first' satisfies the requirements of a mutable iterator, +'f' may apply nonconstant functions through the dereferenced iterators +passed to it. +

+ + + +

Rationale:

+

The LWG believes that nothing in the standard prohibits function + objects that modify the sequence elements. The problem is that + for_each is in a secion entitled "nonmutating algorithms", and the + title may be confusing. A nonnormative note should clarify that.

+ + + + + +
+

478. Should forward iterator requirements table have a line for r->m?

+

Section: 24.1.3 [forward.iterators] Status: WP + Submitter: Dave Abrahams Date: 2004-07-11

+

View all other issues in [forward.iterators].

+

View all issues with WP status.

+

Duplicate of: 477

+

Discussion:

+

+The Forward Iterator requirements table contains the following: +

+
 expression  return type         operational  precondition
+                                  semantics
+  ==========  ==================  ===========  ==========================
+  a->m        U& if X is mutable, (*a).m       pre: (*a).m is well-defined.
+              otherwise const U&
+
+  r->m        U&                  (*r).m       pre: (*r).m is well-defined.
+
+ +

The second line may be unnecessary. Paragraph 11 of + [lib.iterator.requirements] says: +

+ +

+ In the following sections, a and b denote values of type const X, n + denotes a value of the difference type Distance, u, tmp, and m + denote identifiers, r denotes a value of X&, t denotes a value of + value type T, o denotes a value of some type that is writable to + the output iterator. +

+ +

+Because operators can be overloaded on an iterator's const-ness, the +current requirements allow iterators to make many of the operations +specified using the identifiers a and b invalid for non-const +iterators.

+ +

Related issue: 477

+ + +

Proposed resolution:

+ +

Remove the "r->m" line from the Forward Iterator requirements +table. Change

+

+ "const X" +

+ +

to

+ +

+ "X or const X" +

+ +

in paragraph 11 of [lib.iterator.requirements].

+ + + + +

Rationale:

+

+This is a defect because it constrains an lvalue to returning a modifiable lvalue. +

+ + + + + +
+

488. rotate throws away useful information

+

Section: 25.2.11 [alg.rotate] Status: WP + Submitter: Howard Hinnant Date: 2004-11-22

+

View all issues with WP status.

+

Discussion:

+

+rotate takes 3 iterators: first, middle and last which point into a +sequence, and rearranges the sequence such that the subrange [middle, +last) is now at the beginning of the sequence and the subrange [first, +middle) follows. The return type is void. +

+ +

+In many use cases of rotate, the client needs to know where the +subrange [first, middle) starts after the rotate is performed. This +might look like: +

+
  rotate(first, middle, last);
+  Iterator i = advance(first, distance(middle, last));
+
+ +

+Unless the iterators are random access, the computation to find the +start of the subrange [first, middle) has linear complexity. However, +it is not difficult for rotate to return this information with +negligible additional computation expense. So the client could code: +

+
  Iterator i = rotate(first, middle, last);
+
+ +

+and the resulting program becomes significantly more efficient. +

+ +

+While the backwards compatibility hit with this change is not zero, it +is very small (similar to that of lwg 130), and there is +a significant benefit to the change. +

+ + + +

Proposed resolution:

+

In 25 [algorithms] p2, change:

+ +
  template<class ForwardIterator>
+    void ForwardIterator rotate(ForwardIterator first, ForwardIterator middle,
+                ForwardIterator last);
+
+ +

In 25.2.11 [alg.rotate], change:

+ +
  template<class ForwardIterator>
+    void ForwardIterator rotate(ForwardIterator first, ForwardIterator middle,
+                ForwardIterator last);
+
+ +

In 25.2.11 [alg.rotate] insert a new paragraph after p1:

+ +
+

Returns: first + (last - middle).

+
+ +

[ +The LWG agrees with this idea, but has one quibble: we want to make +sure not to give the impression that the function "advance" is +actually called, just that the nth iterator is returned. (Calling +advance is observable behavior, since users can specialize it for +their own iterators.) Howard will provide wording. +]

+ + +

[Howard provided wording for mid-meeting-mailing Jun. 2005.]

+ + +

[ +Toronto: moved to Ready. +]

+ + + + + + + +
+

495. Clause 22 template parameter requirements

+

Section: 22 [localization] Status: WP + Submitter: Beman Dawes Date: 2005-01-10

+

View all other issues in [localization].

+

View all issues with WP status.

+

Discussion:

+

It appears that there are no requirements specified for many of the +template parameters in clause 22. It looks like this issue has never +come up, except perhaps for Facet.

+ +

Clause 22 isn't even listed in 17.3.2.1 [lib.type.descriptions], +either, which is the wording that allows requirements on template +parameters to be identified by name.

+ +

So one issue is that 17.3.2.1 [lib.type.descriptions] Should be +changed to cover clause 22. A better change, which will cover us in +the future, would be to say that it applies to all the library +clauses. Then if a template gets added to any library clause we are +covered.

+ +

charT, InputIterator, and other names with requirements defined +elsewhere are fine, assuming the 17.3.2.1 [lib.type.descriptions] fix. +But there are a few template arguments names which I don't think have +requirements given elsewhere:

+ +
    +
  • internT and externT. The fix is to add wording saying that internT +and externT must meet the same requirements as template arguments +named charT.
  • + +
  • stateT. I'm not sure about this one. There already is some wording, +but it seems a bit vague.
  • + +
  • Intl. [lib.locale.moneypunct.byname] The fix for this one is to +rename "Intl" to "International". The name is important because other +text identifies the requirements for the name International but not +for Intl.
  • +
+ +

Proposed resolution:

+

Change 17.3.2.1 [type.descriptions], paragraph 1, from:

+

+The Requirements subclauses may describe names that are used to +specify constraints on template arguments.153) These names are used in +clauses 20, 23, 25, and 26 to describe the types that may be supplied +as arguments by a C++ program when instantiating template components +from the library. +

+

to:

+

+The Requirements subclauses may describe names that are used to +specify constraints on template arguments.153) These names are used in +library clauses to describe the types that may be supplied as +arguments by a C++ program when instantiating template components from +the library. +

+ +

In the front matter of class 22, locales, add:

+

+Template parameter types internT and externT shall meet the +requirements of charT (described in 21 [strings]). +

+ + +

Rationale:

+

+ Again, a blanket clause isn't blanket enough. Also, we've got a + couple of names that we don't have blanket requirement statements + for. The only issue is what to do about stateT. This wording is + thin, but probably adequate.

+ + + + + +
+

496. Illegal use of "T" in vector<bool>

+

Section: 23.2.5 [vector] Status: WP + Submitter: richard@ex-parrot.com Date: 2005-02-10

+

View all other issues in [vector].

+

View all issues with WP status.

+

Discussion:

+

+In the synopsis of the std::vector<bool> specialisation in 23.2.5 [vector], +the non-template assign() function has the signature

+ +
  void assign( size_type n, const T& t );
+
+ +

The type, T, is not defined in this context.

+ + +

Proposed resolution:

+

Replace "T" with "value_type".

+ + + + + +
+

497. meaning of numeric_limits::traps for floating point types

+

Section: 18.2.1.2 [numeric.limits.members] Status: WP + Submitter: Martin Sebor Date: 2005-03-02

+

View all other issues in [numeric.limits.members].

+

View all issues with WP status.

+

Discussion:

+ +

18.2.1.2, p59 says this much about the traps member of numeric_limits:

+ +
+

static const bool traps;
+-59- true if trapping is implemented for the type.204) +
+Footnote 204: Required by LIA-1. +

+
+ +

It's not clear what is meant by "is implemented" here.

+ +

+In the context of floating point numbers it seems reasonable to expect +to be able to use traps to determine whether a program can "safely" use +infinity(), quiet_NaN(), etc., in arithmetic expressions, that is +without causing a trap (i.e., on UNIX without having to worry about +getting a signal). When traps is true, I would expect any of the +operations in section 7 of IEEE 754 to cause a trap (and my program +to get a SIGFPE). So, for example, on Alpha, I would expect traps +to be true by default (unless I compiled my program with the -ieee +option), false by default on most other popular architectures, +including IA64, MIPS, PA-RISC, PPC, SPARC, and x86 which require +traps to be explicitly enabled by the program. +

+ +

+Another possible interpretation of p59 is that traps should be true +on any implementation that supports traps regardless of whether they +are enabled by default or not. I don't think such an interpretation +makes the traps member very useful, even though that is how traps is +implemented on several platforms. It is also the only way to implement +traps on platforms that allow programs to enable and disable trapping +at runtime. +

+ + +

Proposed resolution:

+

Change p59 to read:

+

True if, at program startup, there exists a value of the type that + would cause an arithmetic operation using that value to trap.

+ + +

Rationale:

+

+ Real issue, since trapping can be turned on and off. Unclear what a + static query can say about a dynamic issue. The real advice we should + give users is to use cfenv for these sorts of queries. But this new + proposed resolution is at least consistent and slightly better than + nothing.

+ + + + + +
+

505. Result_type in random distribution requirements

+

Section: 26.4.1 [rand.req], TR1 5.1.1 [tr.rand.req] Status: WP + Submitter: Walter Brown Date: 2005-07-03

+

View all other issues in [rand.req].

+

View all issues with WP status.

+

Discussion:

+

+Table 17: Random distribution requirements +

+

+Row 1 requires that each random distribution provide a nested type "input_type"; +this type denotes the type of the values that the distribution consumes. +

+

+Inspection of all distributions in [tr.rand.dist] reveals that each distribution +provides a second typedef ("result_type") that denotes the type of the values the +distribution produces when called. +

+ + +

Proposed resolution:

+

+It seems to me that this is also a requirement +for all distributions and should therefore be indicated as such via a new second +row to this table 17: +

+ + +
X::result_typeT---compile-time
+ +

[ +Berlin: Voted to WP. N1932 adopts the proposed resolution: see Table 5 row 1. +]

+ + + + + + + +
+

507. Missing requirement for variate_generator::operator()

+

Section: 26.4 [rand], TR1 5.1.3 [tr.rand.var] Status: WP + Submitter: Walter Brown Date: 2005-07-03

+

View all other issues in [rand].

+

View all issues with WP status.

+

Discussion:

+

+Paragraph 11 of [tr.rand.var] equires that the member template +

+
template<class T> result_type operator() (T value);
+
+

+return +

+
distribution()(e, value)
+
+

+However, not all distributions have an operator() with a corresponding signature. +

+ +

[ +Berlin: As a working group we voted in favor of N1932 which makes this moot: +variate_generator has been eliminated. Then in full committee we voted to give +this issue WP status (mistakenly). +]

+ + + + +

Proposed resolution:

+

+We therefore recommend that we insert the following precondition before paragraph 11: +

+

+Precondition: distribution().operator()(e,value) is well-formed. +

+ + + + + +
+

508. Bad parameters for ranlux64_base_01

+

Section: 26.4.5 [rand.predef], TR1 5.1.5 [tr.rand.predef] Status: WP + Submitter: Walter Brown Date: 2005-07-03

+

View all issues with WP status.

+

Discussion:

+

+The fifth of these engines with predefined parameters, ranlux64_base_01, +appears to have an unintentional error for which there is a simple correction. +The two pre-defined subtract_with_carry_01 engines are given as: +

+
typedef subtract_with_carry_01<float,  24, 10, 24> ranlux_base_01;
+typedef subtract_with_carry_01<double, 48, 10, 24> ranlux64_base_01;
+
+

+We demonstrate below that ranlux64_base_01 fails to meet the intent of the +random number generation proposal, but that the simple correction to +

+
typedef subtract_with_carry_01<double, 48,  5, 12> ranlux64_base_01;
+
+

+does meet the intent of defining well-known good parameterizations. +

+

+The ranlux64_base_01 engine as presented fails to meet the intent for +predefined engines, stated in proposal N1398 (section E): +

+

+In order to make good random numbers available to a large number of library +users, this proposal not only defines generic random-number engines, but also +provides a number of predefined well-known good parameterizations for those. +

+

+The predefined ranlux_base_01 engine has been proven [1,2,3] to have a very +long period and so meets this criterion. This property makes it suitable for +use in the excellent discard_block engines defined subsequently. The proof +of long period relies on the fact (proven in [1]) that 2**(w*r) - 2**(w*s) ++ 1 is prime (w, r, and s are template parameters to subtract_with_carry_01, +as defined in [tr.rand.eng.sub1]). +

+

+The ranlux64_base_01 engine as presented in [tr.rand.predef] uses w=48, r=24, s=10. +For these numbers, the combination 2**(w*r)-2**(w*s)+1 is non-prime (though +explicit factorization would be a challenge). In consequence, while it is +certainly possible for some seeding states that this engine would have a very +long period, it is not at all "well-known" that this is the case. The intent +in the N1398 proposal involved the base of the ranlux64 engine, which finds heavy +use in the physics community. This is isomorphic to the predefined ranlux_base_01, +but exploits the ability of double variables to hold (at least) 48 bits of mantissa, +to deliver 48 random bits at a time rather than 24. +

+ + +

Proposed resolution:

+

+To achieve this intended behavior, the correct template parameteriztion would be: +

+
typedef subtract_with_carry_01<double, 48, 5, 12> ranlux64_base_01;
+
+

+The sequence of mantissa bits delivered by this is isomorphic (treating each +double as having the bits of two floats) to that delivered by ranlux_base_01. +

+

+References: +

+
    +
  1. F. James, Comput. Phys. Commun. 60(1990) 329
  2. +
  3. G. Marsaglia and A. Zaman, Ann. Appl. Prob 1(1991) 462
  4. +
  5. M. Luscher, Comput. Phys. Commun. 79(1994) 100-110
  6. +
+ +

[ +Berlin: Voted to WP. N1932 adopts the proposed resolution in 26.3.5, +just above paragraph 5. +]

+ + + + + + + +
+

519. Data() undocumented

+

Section: 23.2.1 [array], TR1 6.2.2 [tr.array.array] Status: WP + Submitter: Pete Becker Date: 2005-07-03

+

View other active issues in [array].

+

View all other issues in [array].

+

View all issues with WP status.

+

Discussion:

+

+array<>::data() is present in the class synopsis, but not documented. +

+ + +

Proposed resolution:

+

+Add a new section, after 6.2.2.3: +

+
T*       data()
+const T* data() const;
+
+

+Returns: elems. +

+

+Change 6.2.2.4/2 to: +

+

+In the case where N == 0, begin() == end(). The return value +of data() is unspecified. +

+ + + + + +
+

520. Result_of and pointers to data members

+

Section: 20.5.11.1 [func.bind], TR1 3.6 [tr.func.bind] Status: WP + Submitter: Pete Becker Date: 2005-07-03

+

View all issues with WP status.

+

Discussion:

+

+In the original proposal for binders, the return type of bind() when +called with a pointer to member data as it's callable object was +defined to be mem_fn(ptr); when Peter Dimov and I unified the +descriptions of the TR1 function objects we hoisted the descriptions +of return types into the INVOKE pseudo-function and into result_of. +Unfortunately, we left pointer to member data out of result_of, so +bind doesn't have any specified behavior when called with a pointer +to member data. +

+ + +

Proposed resolution:

+

[ +Pete and Peter will provide wording. +]

+ + +

+In 20.5.4 [lib.func.ret] ([tr.func.ret]) p3 add the following bullet after bullet 2: +

+
    +
  1. If F is a member data pointer type R T::*, type +shall be cv R& when T1 is cv U1&, +R otherwise.
  2. +
+ +

[ +Peter provided wording. +]

+ + + + + + + +
+

521. Garbled requirements for argument_type in reference_wrapper

+

Section: 20.5.5 [refwrap], TR1 2.1.2 [tr.util.refwrp.refwrp] Status: WP + Submitter: Pete Becker Date: 2005-07-03

+

View all issues with WP status.

+

Discussion:

+

+2.1.2/3, second bullet item currently says that reference_wrapper<T> is +derived from unary_function<T, R> if T is: +

+

+a pointer to member function type with cv-qualifier cv and no arguments; +the type T1 is cv T* and R is the return type of the pointer to member function; +

+

+The type of T1 can't be cv T*, 'cause that's a pointer to a pointer to member +function. It should be a pointer to the class that T is a pointer to member of. +Like this: +

+

+a pointer to a member function R T0::f() cv (where cv represents the member +function's cv-qualifiers); the type T1 is cv T0* +

+

+Similarly, bullet item 2 in 2.1.2/4 should be: +

+

+a pointer to a member function R T0::f(T2) cv (where cv represents the member +function's cv-qualifiers); the type T1 is cv T0* +

+ + +

Proposed resolution:

+ +

+Change bullet item 2 in 2.1.2/3: +

+ +
+
    +
  • +a pointer to member function type with cv-qualifier cv and no arguments; +the type T1 is cv T* and R is the return +type of the pointer to member function R T0::f() cv +(where cv represents the member function's cv-qualifiers); +the type T1 is cv T0* +
  • +
+
+ +

+Change bullet item 2 in 2.1.2/4: +

+ +
+
    +
  • +a pointer to member function with cv-qualifier cv and taking one argument +of type T2; the type T1 is cv T* and +R is the return type of the pointer to member function +R T0::f(T2) cv (where cv represents the member +function's cv-qualifiers); the type T1 is cv T0* +
  • +
+
+ + + + + + +
+

524. regex named character classes and case-insensitivity don't mix

+

Section: 28 [re] Status: WP + Submitter: Eric Niebler Date: 2005-07-01

+

View all other issues in [re].

+

View all issues with WP status.

+

Discussion:

+

+This defect is also being discussed on the Boost developers list. The +full discussion can be found here: +http://lists.boost.org/boost/2005/07/29546.php +

+

+-- Begin original message -- +

+

+Also, I may have found another issue, closely related to the one under +discussion. It regards case-insensitive matching of named character +classes. The regex_traits<> provides two functions for working with +named char classes: lookup_classname and isctype. To match a char class +such as [[:alpha:]], you pass "alpha" to lookup_classname and get a +bitmask. Later, you pass a char and the bitmask to isctype and get a +bool yes/no answer. +

+

+But how does case-insensitivity work in this scenario? Suppose we're +doing a case-insensitive match on [[:lower:]]. It should behave as if it +were [[:lower:][:upper:]], right? But there doesn't seem to be enough +smarts in the regex_traits interface to do this. +

+

+Imagine I write a traits class which recognizes [[:fubar:]], and the +"fubar" char class happens to be case-sensitive. How is the regex engine +to know that? And how should it do a case-insensitive match of a +character against the [[:fubar:]] char class? John, can you confirm this +is a legitimate problem? +

+

+I see two options: +

+

+1) Add a bool icase parameter to lookup_classname. Then, +lookup_classname( "upper", true ) will know to return lower|upper +instead of just upper. +

+

+2) Add a isctype_nocase function +

+

+I prefer (1) because the extra computation happens at the time the +pattern is compiled rather than when it is executed. +

+

+-- End original message -- +

+ +

+For what it's worth, John has also expressed his preference for option +(1) above. +

+ + +

Proposed resolution:

+

+Adopt the proposed resolution in +N2409. +

+ + +

[ +Kona (2007): The LWG adopted the proposed resolution of N2409 for this issue. +The LWG voted to accelerate this issue to Ready status to be voted into the WP at Kona. +]

+ + + + + +
+

530. Must elements of a string be contiguous?

+

Section: 21.3 [basic.string] Status: WP + Submitter: Matt Austern Date: 2005-11-15

+

View other active issues in [basic.string].

+

View all other issues in [basic.string].

+

View all issues with WP status.

+

Discussion:

+

Issue 69, which was incorporated into C++03, mandated + that the elements of a vector must be stored in contiguous memory. + Should the same also apply to basic_string?

+ +

We almost require contiguity already. Clause 23.3.4 [multiset] + defines operator[] as data()[pos]. What's missing + is a similar guarantee if we access the string's elements via the + iterator interface.

+ +

Given the existence of data(), and the definition of + operator[] and at in terms of data, + I don't believe it's possible to write a useful and standard- + conforming basic_string that isn't contiguous. I'm not + aware of any non-contiguous implementation. We should just require + it. +

+ + +

Proposed resolution:

+

Add the following text to the end of 21.3 [basic.string], +paragraph 2.

+ +
+

The characters in a string are stored contiguously, meaning that if + s is a basic_string<charT, Allocator>, then + it obeys the identity + &*(s.begin() + n) == &*s.begin() + n + for all 0 <= n < s.size(). +

+
+ + +

Rationale:

+

+Not standardizing this existing practice does not give implementors more +freedom. We thought it might a decade ago. But the vendors have spoken +both with their implementations, and with their voice at the LWG +meetings. The implementations are going to be contiguous no matter what +the standard says. So the standard might as well give string clients +more design choices. +

+ + + + + +
+

531. array forms of unformatted input functions

+

Section: 27.6.1.3 [istream.unformatted] Status: WP + Submitter: Martin Sebor Date: 2005-11-23

+

View all other issues in [istream.unformatted].

+

View all issues with WP status.

+

Discussion:

+

+The array forms of unformatted input functions don't seem to have well-defined +semantics for zero-element arrays in a couple of cases. The affected ones +(istream::get() and istream::getline()) are supposed to +terminate when (n - 1) characters are stored, which obviously can +never be true when (n == 0) holds to start with. See +c++std-lib-16071. +

+ + +

Proposed resolution:

+

+I suggest changing 27.6.1.3, p7 (istream::get()), bullet 1 to read: +

+
    +
  • + (n < 1) is true or (n - 1) characters + are stored; +
  • +
+

+Change 27.6.1.3, p9: +

+ +

+If the function stores no characters, it calls setstate(failbit) (which +may throw ios_base::failure (27.4.4.3)). In any case, if (n +> 0) is true it then stores a null character into the next +successive location of the array. +

+ +

+ +and similarly p17 (istream::getline()), bullet 3 to: + +

+
    +
  • + (n < 1) is true or (n - 1) characters + are stored (in which case the function calls + setstate(failbit)). +
  • +
+ +

+ +In addition, to clarify that istream::getline() must not store the +terminating NUL character unless the the array has non-zero size, Robert +Klarer suggests in c++std-lib-16082 to change 27.6.1.3, p20 to read: + +

+

+ +In any case, provided (n > 0) is true, it then stores a null character +(using charT()) into the next successive location of the array. + +

+ +

[ +post-Redmond: Pete noticed that the current resolution for get requires +writing to out of bounds memory when n == 0. Martin provided fix. +]

+ + + + + + + +
+

533. typo in 2.2.3.10/1

+

Section: 20.6.6.2.11 [util.smartptr.getdeleter], TR1 2.2.3.10 [tr.util.smartptr.getdeleter] Status: DR + Submitter: Paolo Carlini Date: 2005-11-09

+

View all other issues in [util.smartptr.getdeleter].

+

View all issues with DR status.

+

Discussion:

+

+I'm seeing something that looks like a typo. The Return of get_deleter +says: +

+

+If *this owns a deleter d... +

+

+but get_deleter is a free function! +

+ + +

Proposed resolution:

+

+Therefore, I think should be: +

+

+If *this p owns a deleter d... +

+ + + + + +
+

534. Missing basic_string members

+

Section: 21.3 [basic.string] Status: WP + Submitter: Alisdair Meredith Date: 2005-11-16

+

View other active issues in [basic.string].

+

View all other issues in [basic.string].

+

View all issues with WP status.

+

Discussion:

+

+OK, we all know std::basic_string is bloated and already has way too +many members. However, I propose it is missing 3 useful members that +are often expected by users believing it is a close approximation of the +container concept. All 3 are listed in table 71 as 'optional' +

+ +

+i/ pop_back. +

+ +

+This is the one I feel most strongly about, as I only just discovered it +was missing as we are switching to a more conforming standard library +<g> +

+ +

+I find it particularly inconsistent to support push_back, but not +pop_back. +

+ +

+ii/ back. +

+ +

+There are certainly cases where I want to examine the last character of +a string before deciding to append, or to trim trailing path separators +from directory names etc. *rbegin() somehow feels inelegant. +

+ +

+iii/ front +

+ +

+This one I don't feel strongly about, but if I can get the first two, +this one feels that it should be added as a 'me too' for consistency. +

+ +

+I believe this would be similarly useful to the data() member recently +added to vector, or at() member added to the maps. +

+ + +

Proposed resolution:

+

+Add the following members to definition of class template basic_string, 21.3p7 +

+
void pop_back ()
+
+const charT & front() const
+charT & front()
+
+const charT & back() const
+charT & back()
+
+

+Add the following paragraphs to basic_string description +

+ +

+21.3.4p5 +

+
+
const charT & front() const
+charT & front()
+
+

+Precondition: !empty() +

+

+Effects: Equivalent to operator[](0). +

+
+ +

+21.3.4p6 +

+
+
const charT & back() const
+charT & back()
+
+

+Precondition: !empty() +

+

+Effects: Equivalent to operator[]( size() - 1). +

+
+ +

+21.3.5.5p10 +

+
+
void pop_back ()
+
+

+Precondition: !empty() +

+

+Effects: Equivalent to erase( size() - 1, 1 ). +

+
+ +

+Update Table 71: (optional sequence operations) +Add basic_string to the list of containers for the following operations. +

+
a.front()
+a.back()
+a.push_back()
+a.pop_back()
+a[n]
+
+ +

[ +Berlin: Has support. Alisdair provided wording. +]

+ + + + + + +
+

535. std::string::swap specification poorly worded

+

Section: 21.3.6.8 [string::swap] Status: WP + Submitter: Beman Dawes Date: 2005-12-14

+

View all other issues in [string::swap].

+

View all issues with WP status.

+

Discussion:

+

+std::string::swap currently says for effects and postcondition: +

+ +
+

+Effects: Swaps the contents of the two strings. +

+ +

+Postcondition: *this contains the characters that were in s, +s contains the characters that were in *this. +

+
+ +

+Specifying both Effects and Postcondition seems redundant, and the postcondition +needs to be made stronger. Users would be unhappy if the characters were not in +the same order after the swap. +

+ + +

Proposed resolution:

+
+

+Effects: Swaps the contents of the two strings. +

+ +

+Postcondition: *this contains the same sequence of +characters that were was in s, +s contains the same sequence of characters that +were was in *this. +

+
+ + + + + +
+

537. Typos in the signatures in 27.6.1.3/42-43 and 27.6.2.4

+

Section: 27.6.1.3 [istream.unformatted] Status: WP + Submitter: Paolo Carlini Date: 2006-02-12

+

View all other issues in [istream.unformatted].

+

View all issues with WP status.

+

Discussion:

+

+In the most recent working draft, I'm still seeing: +

+ +
seekg(off_type& off, ios_base::seekdir dir)
+
+ +

+and +

+ +
seekp(pos_type& pos)
+
+seekp(off_type& off, ios_base::seekdir dir)
+
+ +

+that is, by reference off and pos arguments. +

+ + +

Proposed resolution:

+

+After 27.6.1.3p42 change: +

+ +
basic_istream<charT,traits>& seekg(off_type& off, ios_base::seekdir dir);
+
+ +

+After 27.6.2.4p1 change: +

+ +
basic_ostream<charT,traits>& seekp(pos_type& pos);
+
+ +

+After 27.6.2.4p3 change: +

+ +
basic_ostream<charT,traits>& seekp(off_type& off, ios_base::seekdir dir);
+
+ + + + + +
+

538. 241 again: Does unique_copy() require CopyConstructible and Assignable?

+

Section: 25.2.9 [alg.unique] Status: WP + Submitter: Howard Hinnant Date: 2006-02-09

+

View all other issues in [alg.unique].

+

View all issues with WP status.

+

Discussion:

+

+I believe I botched the resolution of + +241 "Does unique_copy() require CopyConstructible and Assignable?" which now +has WP status. +

+ +

+This talks about unique_copy requirements and currently reads: +

+ +

+-5- Requires: The ranges [first, last) and +[result, result+(last-first)) +shall not overlap. The expression *result = *first shall +be valid. If neither InputIterator nor OutputIterator meets the +requirements of forward iterator then the value type of InputIterator +must be CopyConstructible (20.1.3). Otherwise CopyConstructible is not required. +

+ +

+The problem (which Paolo discovered) is that when the iterators are at their +most restrictive (InputIterator, OutputIterator), then we want +InputIterator::value_type to be both CopyConstructible and +CopyAssignable (for the most efficient implementation). However this +proposed resolution only makes it clear that it is CopyConstructible, +and that one can assign from *first to *result. +This latter requirement does not necessarily imply that you can: +

+ +
*first = *first;
+
+ + +

Proposed resolution:

+

+-5- Requires: The ranges [first, last) and +[result, result+(last-first)) +shall not overlap. The expression *result = *first +shall +be valid. If neither InputIterator nor OutputIterator meets the +requirements of forward iterator then the value type +value_type of InputIterator +must be CopyConstructible (20.1.3) and Assignable. +Otherwise CopyConstructible is not required. +

+ + + + + +
+

540. shared_ptr<void>::operator*()

+

Section: 20.6.6.2.5 [util.smartptr.shared.obs], TR1 2.2.3.5 [tr.util.smartptr.shared.obs] Status: WP + Submitter: Martin Sebor Date: 2005-10-15

+

View all other issues in [util.smartptr.shared.obs].

+

View all issues with WP status.

+

Discussion:

+

+I'm trying to reconcile the note in tr.util.smartptr.shared.obs, p6 +that talks about the operator*() member function of shared_ptr: +

+ +

+ Notes: When T is void, attempting to instantiate this member function + renders the program ill-formed. [Note: Instantiating shared_ptr<void> + does not necessarily result in instantiating this member function. + --end note] +

+ +

+with the requirement in temp.inst, p1: +

+ +

+ The implicit instantiation of a class template specialization causes + the implicit instantiation of the declarations, but not of the + definitions... +

+ +

+I assume that what the note is really trying to say is that +"instantiating shared_ptr<void> *must not* result in instantiating +this member function." That is, that this function must not be +declared a member of shared_ptr<void>. Is my interpretation +correct? +

+ + +

Proposed resolution:

+

+Change 2.2.3.5p6 +

+ +

+-6- Notes: When T is void, attempting to instantiate +this member function renders the program ill-formed. [Note: +Instantiating shared_ptr<void> does not necessarily result in +instantiating this member function. --end note] it is +unspecified whether this member function is declared or not, and if so, what its +return type is, except that the declaration (although not necessarily the +definition) of the function shall be well-formed. +

+ + + + + + +
+

541. shared_ptr template assignment and void

+

Section: 20.6.6.2 [util.smartptr.shared], TR1 2.2.3 [tr.util.smartptr.shared] Status: WP + Submitter: Martin Sebor Date: 2005-10-16

+

View other active issues in [util.smartptr.shared].

+

View all other issues in [util.smartptr.shared].

+

View all issues with WP status.

+

Discussion:

+

+Is the void specialization of the template assignment operator taking +a shared_ptr<void> as an argument supposed be well-formed? +

+

+I.e., is this snippet well-formed: +

+
shared_ptr<void> p;
+p.operator=<void>(p);
+
+ +

+Gcc complains about auto_ptr<void>::operator*() returning a reference +to void. I suspect it's because shared_ptr has two template assignment +operators, one of which takes auto_ptr, and the auto_ptr template gets +implicitly instantiated in the process of overload resolution. +

+ +

+The only way I see around it is to do the same trick with auto_ptr<void> +operator*() as with the same operator in shared_ptr<void>. +

+ +

+PS Strangely enough, the EDG front end doesn't mind the code, even +though in a small test case (below) I can reproduce the error with +it as well. +

+ +
template <class T>
+struct A { T& operator*() { return *(T*)0; } };
+
+template <class T>
+struct B {
+    void operator= (const B&) { }
+    template <class U>
+    void operator= (const B<U>&) { }
+    template <class U>
+    void operator= (const A<U>&) { }
+};
+
+int main ()
+{
+    B<void> b;
+    b.operator=<void>(b);
+}
+
+ + +

Proposed resolution:

+

+In [lib.memory] change: +

+
template<class X> class auto_ptr;
+template<> class auto_ptr<void>;
+
+ +

+In [lib.auto.ptr]/2 add the following before the last closing brace: +

+ +
template<> class auto_ptr<void>
+{
+public:
+    typedef void element_type;
+};
+
+ + + + + + +
+

542. shared_ptr observers

+

Section: 20.6.6.2.5 [util.smartptr.shared.obs], TR1 2.2.3.5 [tr.util.smartptr.shared.obs] Status: WP + Submitter: Martin Sebor Date: 2005-10-18

+

View all other issues in [util.smartptr.shared.obs].

+

View all issues with WP status.

+

Discussion:

+

+Peter Dimov wrote: +To: C++ libraries mailing list +Message c++std-lib-15614 +[...] +The intent is for both use_count() and unique() to work in a threaded environment. +They are intrinsically prone to race conditions, but they never return garbage. +

+ +

+This is a crucial piece of information that I really wish were +captured in the text. Having this in a non-normative note would +have made everything crystal clear to me and probably stopped +me from ever starting this discussion :) Instead, the sentence +in p12 "use only for debugging and testing purposes, not for +production code" very strongly suggests that implementations +can and even are encouraged to return garbage (when threads +are involved) for performance reasons. +

+

+How about adding an informative note along these lines: +

+

+ Note: Implementations are encouraged to provide well-defined + behavior for use_count() and unique() even in the presence of + multiple threads. +

+

+I don't necessarily insist on the exact wording, just that we +capture the intent. +

+ + +

Proposed resolution:

+

+Change 20.6.6.2.5 [util.smartptr.shared.obs] p12: +

+

+[Note: use_count() is not necessarily efficient. Use only for +debugging and testing purposes, not for production code. --end note] +

+ +

+Change 20.6.6.3.5 [util.smartptr.weak.obs] p3: +

+

+[Note: use_count() is not necessarily efficient. Use only for +debugging and testing purposes, not for production code. --end note] +

+ + + + + +
+

543. valarray slice default constructor

+

Section: 26.5.4 [class.slice] Status: WP + Submitter: Howard Hinnant Date: 2005-11-03

+

View all issues with WP status.

+

Discussion:

+

+If one explicitly constructs a slice or glice with the default +constructor, does the standard require this slice to have any usable +state? It says "creates a slice which specifies no elements", which +could be interpreted two ways: +

+
    +
  1. There are no elements to which the slice refers (i.e. undefined).
  2. +
  3. The slice specifies an array with no elements in it (i.e. defined).
  4. +
+

+Here is a bit of code to illustrate: +

+
#include <iostream>
+#include <valarray>
+
+int main()
+{
+    std::valarray<int> v(10);
+    std::valarray<int> v2 = v[std::slice()];
+    std::cout << "v[slice()].size() = " << v2.size() << '\n';
+}
+
+ +

+Is the behavior undefined? Or should the output be: +

+ +
v[slice()].size() = 0
+
+ +

+There is a similar question and wording for gslice at 26.3.6.1p1. +

+ + +

Proposed resolution:

+ +

[Martin suggests removing the second sentence in 26.5.4.1 [cons.slice] as well.]

+ + +

+Change 26.5.4.1 [cons.slice]: +

+ +

+1 - The default constructor for slice creates a slice +which specifies no elements. The default constructor is equivalent to +slice(0, 0, 0). A default constructor is provided only to permit +the declaration of arrays of slices. The constructor with arguments for a slice +takes a start, length, and stride parameter. +

+ +

+Change 26.5.6.1 [gslice.cons]: +

+ +

+1 - The default constructor creates a gslice which specifies no +elements. The default constructor is equivalent to gslice(0, +valarray<size_t>(), valarray<size_t>()). The constructor +with arguments builds a gslice based on a specification of start, +lengths, and strides, as explained in the previous section. +

+ + + + + + +
+

545. When is a deleter deleted?

+

Section: 20.6.6.2.11 [util.smartptr.getdeleter], TR1 2.2.3.2 [tr.util.smartptr.shared.dest] Status: WP + Submitter: Matt Austern Date: 2006-01-10

+

View all other issues in [util.smartptr.getdeleter].

+

View all issues with WP status.

+

Discussion:

+

+The description of ~shared_ptr doesn't say when the shared_ptr's deleter, if +any, is destroyed. In principle there are two possibilities: it is destroyed +unconditionally whenever ~shared_ptr is executed (which, from an implementation +standpoint, means that the deleter is copied whenever the shared_ptr is copied), +or it is destroyed immediately after the owned pointer is destroyed (which, from +an implementation standpoint, means that the deleter object is shared between +instances). We should say which it is. +

+ + +

Proposed resolution:

+

+Add after the first sentence of 20.6.6.2.11 [util.smartptr.getdeleter]/1: +

+
+

+The returned pointer remains valid as long as there exists a shared_ptr instance +that owns d. +

+

+[Note: it is unspecified whether the pointer remains valid longer than that. +This can happen if the implementation doesn't destroy the deleter until all +weak_ptr instances in the ownership group are destroyed. -- end note] +

+
+ + + + + +
+

551. <ccomplex>

+

Section: 26.3.11 [cmplxh], TR1 8.3 [tr.c99.cmplxh] Status: WP + Submitter: Howard Hinnant Date: 2006-01-23

+

View all issues with WP status.

+

Discussion:

+

+Previously xxx.h was parsable by C++. But in the case of C99's <complex.h> +it isn't. Otherwise we could model it just like <string.h>, <cstring>, <string>: +

+ +
    +
  • <string> : C++ API in namespace std
  • +
  • <cstring> : C API in namespace std
  • +
  • <string.h> : C API in global namespace
  • +
+ +

+In the case of C's complex, the C API won't compile in C++. So we have: +

+ +
    +
  • <complex> : C++ API in namespace std
  • +
  • <ccomplex> : ?
  • +
  • <complex.h> : ?
  • +
+ +

+The ? can't refer to the C API. TR1 currently says: +

+ +
    +
  • <complex> : C++ API in namespace std
  • +
  • <ccomplex> : C++ API in namespace std
  • +
  • <complex.h> : C++ API in global namespace
  • +
+ + + +

Proposed resolution:

+

+Change 26.3.11 [cmplxh]: +

+ +
+

+The header behaves as if it includes the header +<ccomplex>., and provides sufficient using +declarations to declare in the global namespace all function and type names +declared or defined in the neader <complex>. +[Note: <complex.h> does not promote any interface +into the global namespace as there is no C interface to promote. --end +note] +

+
+ + + + + + +
+

552. random_shuffle and its generator

+

Section: 25.2.12 [alg.random.shuffle] Status: WP + Submitter: Martin Sebor Date: 2006-01-25

+

View all issues with WP status.

+

Discussion:

+

+...is specified to shuffle its range by calling swap but not how +(or even that) it's supposed to use the RandomNumberGenerator +argument passed to it. +

+

+Shouldn't we require that the generator object actually be used +by the algorithm to obtain a series of random numbers and specify +how many times its operator() should be invoked by the algorithm? +

+ +

+See N2391 and +N2423 +for some further discussion. +

+ + + +

Proposed resolution:

+

+Adopt the proposed resolution in +N2423. +

+ + +

[ +Kona (2007): The LWG adopted the proposed resolution of N2423 for this issue. +The LWG voted to accelerate this issue to Ready status to be voted into the WP at Kona. +]

+ + + + + +
+

559. numeric_limits<const T>

+

Section: 18.2.1 [limits] Status: WP + Submitter: Martin Sebor Date: 2006-02-19

+

View all other issues in [limits].

+

View all issues with WP status.

+

Discussion:

+

+ +18.2.1 [limits], p2 requires implementations to provide specializations of the +numeric_limits template for each scalar type. While this +could be interepreted to include cv-qualified forms of such types such +an interepretation is not reflected in the synopsis of the +<limits> header. + +

+

+ +The absence of specializations of the template on cv-qualified forms +of fundamental types makes numeric_limits difficult to +use in generic code where the constness (or volatility) of a type is +not always immediately apparent. In such contexts, the primary +template ends up being instantiated instead of the provided +specialization, typically yielding unexpected behavior. + +

+

+ +Require that specializations of numeric_limits on +cv-qualified fundamental types have the same semantics as those on the +unqualifed forms of the same types. + +

+ + +

Proposed resolution:

+

+ +Add to the synopsis of the <limits> header, +immediately below the declaration of the primary template, the +following: +

+ +
+template <class T> class numeric_limits<const T>;
+template <class T> class numeric_limits<volatile T>;
+template <class T> class numeric_limits<const volatile T>;
+
+
+ +

+ +Add a new paragraph to the end of 18.2.1.1 [numeric.limits], with the following +text: + +

+

+ +-new-para- The value of each member of a numeric_limits +specialization on a cv-qualified T is equal to the value of the same +member of numeric_limits<T>. + +

+ +

[ +Portland: Martin will clarify that user-defined types get cv-specializations +automatically. +]

+ + + + + + + +
+

566. array forms of unformatted input function undefined for zero-element arrays

+

Section: 27.6.1.3 [istream.unformatted] Status: WP + Submitter: Martin Sebor Date: 2006-02-23

+

View all other issues in [istream.unformatted].

+

View all issues with WP status.

+

Discussion:

+

+ +The array forms of unformatted input functions don't have well-defined +semantics for zero-element arrays in a couple of cases. The affected +ones (istream::get() and getline()) are supposed to +terminate when (n - 1) characters are stored, which obviously +can never be true when (n == 0) to start with. + +

+ + +

Proposed resolution:

+

+ +I propose the following changes (references are relative to the +Working Draft (document N1804). + +

+

+ +Change 27.6.1.3, p8 (istream::get()), bullet 1 as follows: + +

+
+

+ +if (n < 1) is true or (n - 1) +characters are stored; + +

+
+

+ +Similarly, change 27.6.1.3, p18 (istream::getline()), bullet +3 as follows: + +

+
+

+ +(n < 1) is true or (n - 1) characters +are stored (in which case the function calls +setstate(failbit)). + +

+
+

+ +Finally, change p21 as follows: + +

+
+

+ +In any case, provided (n > 0) is true, it then +stores a null character (using charT()) into the next successive +location of the array. + +

+
+ + + + + +
+

575. the specification of ~shared_ptr is MT-unfriendly, makes implementation assumptions

+

Section: 20.6.6.2.2 [util.smartptr.shared.dest], TR1 2.2.3.2 [tr.util.smartptr.shared.dest] Status: WP + Submitter: Peter Dimov Date: 2006-04-23

+

View all issues with WP status.

+

Discussion:

+

+[tr.util.smartptr.shared.dest] says in its second bullet: +

+ +

+"If *this shares ownership with another shared_ptr instance (use_count() > 1), +decrements that instance's use count." +

+ +

+The problem with this formulation is that it presupposes the existence of an +"use count" variable that can be decremented and that is part of the state of a +shared_ptr instance (because of the "that instance's use count".) +

+ +

+This is contrary to the spirit of the rest of the specification that carefully +avoids to require an use count variable. Instead, use_count() is specified to +return a value, a number of instances. +

+ +

+In multithreaded code, the usual implicit assumption is that a shared variable +should not be accessed by more than one thread without explicit synchronization, +and by introducing the concept of an "use count" variable, the current wording +implies that two shared_ptr instances that share ownership cannot be destroyed +simultaneously. +

+ +

+In addition, if we allow the interpretation that an use count variable is part +of shared_ptr's state, this would lead to other undesirable consequences WRT +multiple threads. For example, +

+ +
p1 = p2;
+
+ +

+would now visibly modify the state of p2, a "write" operation, requiring a lock. +

+ + +

Proposed resolution:

+

+Change the first two bullets of [lib.util.smartptr.shared.dest]/1 to: +

+ +
+
    +
  • If *this is empty or shares ownership with another +shared_ptr instance (use_count() > 1), there are no side effects.
  • +
  • If *this shares ownership with another shared_ptr instance +(use_count() > 1), decrements that instance's use count.
  • +
+
+ +

+Add the following paragraph after [lib.util.smartptr.shared.dest]/1: +

+ +

+[Note: since the destruction of *this decreases the number of instances in +*this's ownership group by one, all shared_ptr instances that share ownership +with *this will report an use_count() that is one lower than its previous value +after *this is destroyed. --end note] +

+ + + + + +
+

576. find_first_of is overconstrained

+

Section: 25.1.4 [alg.find.first.of] Status: WP + Submitter: Doug Gregor Date: 2006-04-25

+

View all other issues in [alg.find.first.of].

+

View all issues with WP status.

+

Discussion:

+

+In 25.1.4 Find First [lib.alg.find.first], the two iterator type parameters to +find_first_of are specified to require Forward Iterators, as follows: +

+ +
template<class ForwardIterator1, class ForwardIterator2>
+  ForwardIterator1
+  find_first_of(ForwardIterator1 first1, ForwardIterator1 last1,
+                        ForwardIterator2 first2, ForwardIterator2 last2);
+template<class ForwardIterator1, class ForwardIterator2,
+                  class BinaryPredicate>
+ForwardIterator1
+  find_first_of(ForwardIterator1 first1, ForwardIterator1 last1,
+                         ForwardIterator2 first2, ForwardIterator2 last2,
+                        BinaryPredicate pred);
+
+ +

+However, ForwardIterator1 need not actually be a Forward Iterator; an Input +Iterator suffices, because we do not need the multi-pass property of the Forward +Iterator or a true reference. +

+ + +

Proposed resolution:

+

+Change the declarations of find_first_of to: +

+ +
template<class ForwardIterator1InputIterator1, class ForwardIterator2>
+  ForwardIterator1InputIterator1
+  find_first_of(ForwardIterator1InputIterator1 first1, ForwardIterator1InputIterator1 last1,
+                        ForwardIterator2 first2, ForwardIterator2 last2);
+template<class ForwardIterator1InputIterator1, class ForwardIterator2,
+                  class BinaryPredicate>
+ForwardIterator1InputIterator1
+  find_first_of(ForwardIterator1InputIterator1 first1, ForwardIterator1InputIterator1 last1,
+                         ForwardIterator2 first2, ForwardIterator2 last2,
+                        BinaryPredicate pred);
+
+ + + + + + +
+

577. upper_bound(first, last, ...) cannot return last

+

Section: 25.3.3.2 [upper.bound] Status: WP + Submitter: Seungbeom Kim Date: 2006-05-03

+

View all issues with WP status.

+

Discussion:

+

+ISO/IEC 14882:2003 says: +

+ +
+

+25.3.3.2 upper_bound +

+

+Returns: The furthermost iterator i in the range +[first, last) such that +for any iterator j in the range [first, i) the following corresponding +conditions hold: !(value < *j) or comp(value, *j) == false. +

+
+ +

+From the description above, upper_bound cannot return last, since it's +not in the interval [first, last). This seems to be a typo, because if +value is greater than or equal to any other values in the range, or if +the range is empty, returning last seems to be the intended behaviour. +The corresponding interval for lower_bound is also [first, last]. +

+ + +

Proposed resolution:

+

+Change [lib.upper.bound]: +

+ +
+

+Returns: The furthermost iterator i in the range +[first, last)] such that +for any iterator j in the range [first, i) the following corresponding +conditions hold: !(value < *j) or comp(value, *j) == false. +

+
+ + + + + + +
+

578. purpose of hint to allocator::allocate()

+

Section: 20.6.1.1 [allocator.members] Status: WP + Submitter: Martin Sebor Date: 2006-05-17

+

View all other issues in [allocator.members].

+

View all issues with WP status.

+

Discussion:

+

+ +The description of the allocator member function +allocate() requires that the hint argument be +either 0 or a value previously returned from allocate(). +Footnote 227 further suggests that containers may pass the address of +an adjacent element as this argument. + +

+

+ +I believe that either the footnote is wrong or the normative +requirement that the argument be a value previously returned from a +call to allocate() is wrong. The latter is supported by +the resolution to issue 20-004 proposed in c++std-lib-3736 by Nathan +Myers. In addition, the hint is an ordinary void* and not the +pointer type returned by allocate(), with +the two types potentially being incompatible and the requirement +impossible to satisfy. + +

+

+ +See also c++std-lib-14323 for some more context on where this came up +(again). + +

+ + +

Proposed resolution:

+

+ +Remove the requirement in 20.6.1.1, p4 that the hint be a value +previously returned from allocate(). Specifically, change +the paragraph as follows: + +

+

+Requires: hint either 0 or previously obtained from member +allocate and not yet passed to member deallocate. +The value hint may be used by an implementation to help improve performance +223). [Note: The value hint may be used by an +implementation to help improve performance. -- end note] +

+

+[Footnote: 223)In a container member function, the address of an +adjacent element is often a good choice to pass for this argument. +

+ + + + +
+

586. string inserter not a formatted function

+

Section: 21.3.8.9 [string.io] Status: WP + Submitter: Martin Sebor Date: 2006-06-22

+

View all other issues in [string.io].

+

View all issues with WP status.

+

Discussion:

+

+ +Section and paragraph numbers in this paper are relative to the +working draft document number N2009 from 4/21/2006. + +

+ +

+ +The basic_string extractor in 21.3.7.9, p1 is clearly +required to behave as a formatted input function, as is the +std::getline() overload for string described in p7. + +

+

+ +However, the basic_string inserter described in p5 of the +same section has no such requirement. This has implications on how the +operator responds to exceptions thrown from xsputn() +(formatted output functions are required to set badbit +and swallow the exception unless badbit is also set in +exceptions(); the string inserter doesn't have any such +requirement). + +

+

+ +I don't see anything in the spec for the string inserter that would +justify requiring it to treat exceptions differently from all other +similar operators. (If it did, I think it should be made this explicit +by saying that the operator "does not behave as a formatted output +function" as has been made customary by the adoption of the resolution +of issue 60). + +

+ + +

Proposed resolution:

+

+ +I propose to change the Effects clause in 21.3.7.9, p5, as follows: + +

+
+

+ +Effects: Begins by constructing a sentry object k as if k +were constructed by typename basic_ostream<charT, +traits>::sentry k (os). If bool(k) is +true, Behaves as a formatted output function +(27.6.2.5.1). After constructing a sentry object, if +this object returns true when converted to a value of +type bool, determines padding as described in +22.2.2.2.2, then inserts the resulting sequence of characters +seq as if by calling os.rdbuf()->sputn(seq , +n), where n is the larger of +os.width() and str.size(); then calls +os.width(0). If the call to sputn fails, calls +os.setstate(ios_base::failbit). + +

+
+

+ +This proposed resilution assumes the resolution of issue 394 (i.e., +that all formatted output functions are required to set +ios_base::badbit in response to any kind of streambuf +failure), and implicitly assumes that a return value of +sputn(seq, n) other than n +indicates a failure. + +

+ + + + +
+

589. Requirements on iterators of member template functions of containers

+

Section: 23.1 [container.requirements] Status: WP + Submitter: Peter Dimov Date: 2006-08-02

+

View other active issues in [container.requirements].

+

View all other issues in [container.requirements].

+

View all issues with WP status.

+

Duplicate of: 536

+

Discussion:

+

+There appears to be no requirements on the InputIterators used in sequences in 23.1.1 in +terms of their value_type, and the requirements in 23.1.2 appear to be overly strict +(requires InputIterator::value_type be the same type as the container's value_type). +

+ + +

Proposed resolution:

+

+Change 23.1.1 p3: +

+ +

+In Tables 82 and 83, X denotes a sequence class, a denotes a +value of X, i and j denote iterators satisfying input +iterator requirements and refer to elements implicitly +convertible to value_type, [i, j) denotes a valid +range, n denotes a value of X::size_type, p denotes a +valid iterator to a, q denotes a valid dereferenceable +iterator to a, [q1, q2) denotes a valid range in a, +and t denotes a value of X::value_type. +

+ +

+Change 23.1.2 p7: +

+ +

+In Table 84, X is an associative container class, a is a value +of X, a_uniq is a value of X when X supports +unique keys, and a_eq is a value of X when X supports +multiple keys, i and j satisfy input iterator requirements and +refer to elements of implicitly convertible to +value_type, [i, j) is a valid range, p is a valid +iterator to a, q is a valid dereferenceable iterator to +a, [q1, q2) is a valid range in a, t is a +value of X::value_type, k is a value of X::key_type +and c is a value of type X::key_compare. +

+ + + +

Rationale:

+

+Concepts will probably come in and rewrite this section anyway. But just in case it is +easy to fix this up as a safety net and as a clear statement of intent. +

+ + + + + +
+

593. __STDC_CONSTANT_MACROS

+

Section: 18.3 [cstdint], TR1 8.22 [tr.c99.cstdint] Status: WP + Submitter: Walter Brown Date: 2006-08-28

+

View all other issues in [cstdint].

+

View all issues with WP status.

+

Discussion:

+

+Clause 18.3 of the current Working Paper (N2009) deals with the new C++ headers +<cstdint> and <stdint.h>. These are of course based on the C99 header +<stdint.h>, and were part of TR1. +

+ +

+Per 18.3.1/1, these headers define a number of macros and function macros. +While the WP does not mention __STDC_CONSTANT_MACROS in this context, C99 +footnotes do mention __STDC_CONSTANT_MACROS. Further, 18.3.1/2 states that "The +header defines all ... macros the same as C99 subclause 7.18." +

+ +

+Therefore, if I wish to have the above-referenced macros and function macros +defined, must I #define __STDC_CONSTANT_MACROS before I #include <cstdint>, or +does the C++ header define these macros/function macros unconditionally? +

+ + +

Proposed resolution:

+

+To put this issue to rest for C++0X, I propose the following addition to +18.3.1/2 of the Working Paper N2009: +

+ +

+[Note: The macros defined by <cstdint> are provided unconditionally: in +particular, the symbols __STDC_LIMIT_MACROS and __STDC_CONSTANT_MACROS +(mentioned in C99 footnotes 219, 220, and 222) play no role in C++. --end note] +

+ + + + + +
+

598. Decimal: Conversion to integral should truncate, not round.

+

Section: TRDecimal 3.2 [trdec.types.types] Status: TRDec + Submitter: Daniel Krugler Date: 2006-05-28

+

View other active issues in [trdec.types.types].

+

View all other issues in [trdec.types.types].

+

View all issues with TRDec status.

+

Discussion:

+ +

+In a private email, Daniel writes: +

+
+

+I would like to +ask, what where the reason for the decision to +define the semantics of the integral conversion of the decimal types, namely +

+
"operator long long() const;
+
+     Returns: Returns the result of the 
+conversion of *this to the type long long, as if 
+performed by the expression llrounddXX(*this)."
+
+

+where XX stands for either 32, 64, or 128, +corresponding to the proper decimal type. The +exact meaning of llrounddXX is not given in that +paper, so I compared it to the corresponding +definition given in C99, 2nd edition (ISO 9899), which says in 7.12.9.7 p. 2: +

+

+"The lround and llround functions round their +argument to the nearest integer value, +rounding halfway cases away from zero, regardless +of the current rounding direction. [..]" +

+

+Now considering the fact that integral conversion +of the usual floating-point types ("4.9 +Floating-integral conversions") has truncation +semantic I wonder why this conversion behaviour +has not been transferred for the decimal types. +

+
+

+Robert comments: +

+

+Also, there is a further error in the Returns: clause for converting decimal::decimal128 to long long. It currently calls llroundd64, not llroundd128. +

+ + + +

Proposed resolution:

+

+Change the Returns: clause in 3.2.2.4 to: +

+

+Returns: Returns the result of the conversion of *this to the type long long, as if performed by the expression llroundd32(*this) while the decimal rounding direction mode [3.5.2] FE_DEC_TOWARD_ZERO is in effect. +

+

+Change the Returns: clause in 3.2.3.4 to: +

+

+Returns: Returns the result of the conversion of *this to the type long long, as if performed by the expression llroundd64(*this) while the decimal rounding direction mode [3.5.2] FE_DEC_TOWARD_ZERO is in effect. +

+

+Change the Returns: clause in 3.2.4.4 to: +

+

+Returns: Returns the result of the conversion of *this to the type long long, as if performed by the expression llroundd64(*this) llroundd128(*this) while the decimal rounding direction mode [3.5.2] FE_DEC_TOWARD_ZERO is in effect. +

+ + + + + + +
+

599. Decimal: Say "octets" instead of "bytes."

+

Section: TRDecimal 3.1 [trdec.types.encodings] Status: TRDec + Submitter: Daniel Krugler Date: 2006-05-28

+

View all issues with TRDec status.

+

Discussion:

+

+Daniel writes in a private email: +

+ +
+

+- 3.1 'Decimal type encodings' says in its note: +

+
"this implies that 
+sizeof(std::decimal::decimal32) == 4, 
+sizeof(std::decimal::decimal64) == 8, and 
+sizeof(std::decimal::decimal128) == 16."
+
+

+This is a wrong assertion, because the definition +of 'byte' in 1.7 'The C+ + memory model' of ISO +14882 (2nd edition) does not specify that a byte +must be necessarily 8 bits large, which would be +necessary to compare with the specified bit sizes +of the types decimal32, decimal64, and decimal128. +

+
+ + +

Proposed resolution:

+

+Change 3.1 as follows: +

+
+

+The three decimal encoding formats defined in IEEE-754R correspond to the three decimal floating types as follows: +

+
    +
  • +decimal32 is a decimal32 number, which is encoded in four consecutive bytes octets (32 bits) +
  • +
  • +decimal64 is a decimal64 number, which is encoded in eight consecutive bytes octets (64 bits) + +
  • +
  • +decimal128 is a decimal128 number, which is encoded in 16 consecutive bytes octets (128 bits) +
  • +
+

+[Note: this implies that sizeof(std::decimal::decimal32) == 4, sizeof(std::decimal::decimal64) == 8, and sizeof(std::decimal::decimal128) == 16. --end note] +

+
+ + + + +
+

600. Decimal: Wrong parameters for wcstod* functions

+

Section: TRDecimal 3.9 [trdec.types.cwchar] Status: TRDec + Submitter: Daniel Krugler Date: 2006-05-28

+

View all issues with TRDec status.

+

Discussion:

+

+Daniel writes: +

+

+- 3.9.1 'Additions to <cwchar>' provides wrong +signatures to the wcstod32, wcstod64, and +wcstod128 functions ([the parameters have type pointer-to-] char instead of wchar_t). +

+ + +

Proposed resolution:

+

+Change "3.9.1 Additions to <cwchar> synopsis" to: +

+
       namespace std {
+       namespace decimal {
+         // 3.9.2 wcstod functions:
+         decimal32  wcstod32  (const char wchar_t * nptr, char wchar_t ** endptr);
+         decimal64  wcstod64  (const char wchar_t * nptr, char wchar_t ** endptr);
+         decimal128 wcstod128 (const char wchar_t * nptr, char wchar_t ** endptr);
+       }
+       }
+
+ + + + +
+

601. Decimal: numeric_limits typos

+

Section: TRDecimal 3.3 [trdec.types.limits] Status: TRDec + Submitter: Daniel Krugler Date: 2006-05-28

+

View all issues with TRDec status.

+

Discussion:

+

+Daniel writes in a private email: +

+ +
+

+- 3.3 'Additions to header <limits>' contains two +errors in the specialisation of numeric_limits<decimal::decimal128>: +

+
    +
  1. The static member max() returns DEC128_MIN, this should be DEC128_MAX.
  2. +
  3. The static member digits is assigned to 384, +this should be 34 (Probably mixed up with the +max. exponent for decimal::decimal64).
  4. +
+
+ + +

Proposed resolution:

+

+In "3.3 Additions to header <limits>" change numeric_limits<decimal::decimal128> as follows: +

+
        template<> class numeric_limits<decimal::decimal128> {
+          public:
+            static const bool is_specialized = true;
+
+            static decimal::decimal128 min() throw() { return DEC128_MIN; }
+            static decimal::decimal128 max() throw() { return DEC128_MIN; DEC128_MAX; }
+
+            static const int digits       = 384 34;
+            /* ... */
+
+ + + + +
+

602. Decimal: "generic floating type" not defined.

+

Section: TRDecimal 3 [trdec.types] Status: TRDec + Submitter: Daniel Krugler Date: 2006-05-28

+

View all other issues in [trdec.types].

+

View all issues with TRDec status.

+

Discussion:

+

+The document uses the term "generic floating types," but defines it nowhere. +

+ + +

Proposed resolution:

+

+Change the first paragraph of "3 Decimal floating-point types" as follows: +

+

+This Technical Report introduces three decimal floating-point types, named +decimal32, decimal64, and decimal128. The set of values of type decimal32 is a +subset of the set of values of type decimal64; the set of values of the type +decimal64 is a subset of the set of values of the type decimal128. Support for +decimal128 is optional. These types supplement the Standard C++ types +float, double, and long double, which are +collectively described as the basic floating types. +

+ + + + +
+

603. Decimal: Trivially simplifying decimal classes.

+

Section: TRDecimal 3 [trdec.types] Status: TRDec + Submitter: Martin Sebor Date: 2006-05-28

+

View all other issues in [trdec.types].

+

View all issues with TRDec status.

+

Discussion:

+

In c++std-lib-17198, Martin writes:

+ +

+Each of the three classes proposed in the paper (decimal32, decimal64, +and decimal128) explicitly declares and specifies the semantics of its +copy constructor, copy assignment operator, and destructor. Since the +semantics of all three functions are identical to the trivial versions +implicitly generated by the compiler in the absence of any declarations +it is safe to drop them from the spec. This change would make the +proposed classes consistent with other similar classes already in the +standard (e.g., std::complex). +

+ + +

Proposed resolution:

+

+Change "3.2.2 Class decimal32" as follows: +

+
      namespace std {
+      namespace decimal {
+        class decimal32 {
+          public:
+            // 3.2.2.1 construct/copy/destroy:
+            decimal32();
+            decimal32(const decimal32 & d32);
+            decimal32 & operator=(const decimal32 & d32);
+            ~decimal32();
+            /* ... */
+
+

+Change "3.2.2.1 construct/copy/destroy" as follows: +

+
        decimal32();
+
+    Effects: Constructs an object of type decimal32 with the value 0;
+
+        decimal32(const decimal32 & d32);
+        decimal32 & operator=(const decimal32 & d32);
+
+    Effects: Copies an object of type decimal32.
+
+        ~decimal32();
+
+    Effects: Destroys an object of type decimal32.
+
+
+

+Change "3.2.3 Class decimal64" as follows: +

+
      namespace std {
+      namespace decimal {
+        class decimal64 {
+          public:
+            // 3.2.3.1 construct/copy/destroy:
+            decimal64();
+            decimal64(const decimal64 & d64);
+            decimal64 & operator=(const decimal64 & d64);
+            ~decimal64();
+            /* ... */
+
+

+Change "3.2.3.1 construct/copy/destroy" as follows: +

+
        decimal64();
+
+    Effects: Constructs an object of type decimal64 with the value 0;
+
+        decimal64(const decimal64 & d64);
+        decimal64 & operator=(const decimal64 & d64);
+
+    Effects: Copies an object of type decimal64.
+
+        ~decimal64();
+
+    Effects: Destroys an object of type decimal64.
+
+
+

+Change "3.2.4 Class decimal128" as follows: +

+
      namespace std {
+      namespace decimal {
+        class decimal128 {
+          public:
+            // 3.2.4.1 construct/copy/destroy:
+            decimal128();
+            decimal128(const decimal128 & d128);
+            decimal128 & operator=(const decimal128 & d128);
+            ~decimal128();
+            /* ... */
+
+

+Change "3.2.4.1 construct/copy/destroy" as follows: +

+
        decimal128();
+
+    Effects: Constructs an object of type decimal128 with the value 0;
+
+        decimal128(const decimal128 & d128);
+        decimal128 & operator=(const decimal128 & d128);
+
+    Effects: Copies an object of type decimal128.
+
+        ~decimal128();
+
+    Effects: Destroys an object of type decimal128.
+
+
+ + + + +
+

604. Decimal: Storing a reference to a facet unsafe.

+

Section: TRDecimal 3 [trdec.types] Status: TRDec + Submitter: Martin Sebor Date: 2006-05-28

+

View all other issues in [trdec.types].

+

View all issues with TRDec status.

+

Discussion:

+

+In c++std-lib-17197, Martin writes: +

+

+The extended_num_get and extended_num_put facets are designed +to store a reference to a num_get or num_put facet which the +extended facets delegate the parsing and formatting of types +other than decimal. One form of the extended facet's ctor (the +default ctor and the size_t overload) obtains the reference +from the global C++ locale while the other form takes this +reference as an argument. +

+

+The problem with storing a reference to a facet in another +object (as opposed to storing the locale object in which the +facet is installed) is that doing so bypasses the reference +counting mechanism designed to prevent a facet that is still +being referenced (i.e., one that is still installed in some +locale) from being destroyed when another locale that contains +it is destroyed. Separating a facet reference from the locale +it comes from van make it cumbersome (and in some cases might +even make it impossible) for programs to prevent invalidating +the reference. (The danger of this design is highlighted in +the paper.) +

+

+This problem could be easily avoided by having the extended +facets store a copy of the locale from which they would extract +the base facet either at construction time or when needed. To +make it possible, the forms of ctors of the extended facets that +take a reference to the base facet would need to be changed to +take a locale argument instead. +

+ + +

Proposed resolution:

+

+1. Change the extended_num_get synopsis in 3.10.2 as follows: +

+
            extended_num_get(const std::num_get<charT, InputIterator> std::locale & b, size_t refs = 0);
+
+            /* ... */
+
+            // const std::num_get<charT, InputIterator> & base;        exposition only
+            // std::locale baseloc;                                    exposition only
+
+

+2. Change the description of the above constructor in 3.10.2.1: +

+
            extended_num_get(const std::num_get<charT, InputIterator> std::locale & b, size_t refs = 0);
+
+
+
+

+Effects: Constructs an extended_num_get facet as if by: +

+
       extended_num_get(const std::num_get<charT, InputIterator> std::locale & b, size_t refs = 0)
+                : facet(refs), baseloc(b)
+                { /* ... */ }
+
+
+

+Notes: Care must be taken by the implementation to ensure that the lifetime of the facet referenced by base exceeds that of the resulting extended_num_get facet. +

+
+

+3. Change the Returns: clause for do_get(iter_type, iter_type, ios_base &, ios_base::iostate &, bool &) const, et al to +

+

+Returns: base std::use_facet<std::num_get<charT, InputIterator> >(baseloc).get(in, end, str, err, val). +

+

+4. Change the extended_num_put synopsis in 3.10.3 as follows: +

+
            extended_num_put(const std::num_put<charT, OutputIterator> std::locale & b, size_t refs = 0);
+
+            /* ... */
+
+            // const std::num_put<charT, OutputIterator> & base;       exposition only
+            // std::locale baseloc;                                    exposition only
+
+

+5. Change the description of the above constructor in 3.10.3.1: +

+
            extended_num_put(const std::num_put<charT, OutputIterator> std::locale & b, size_t refs = 0);
+
+
+

+Effects: Constructs an extended_num_put facet as if by: +

+
       extended_num_put(const std::num_put<charT, OutputIterator> std::locale & b, size_t refs = 0)
+                : facet(refs), baseloc(b)
+                { /* ... */ }
+
+
+

+Notes: Care must be taken by the implementation to ensure that the lifetime of the facet referenced by base exceeds that of the resulting extended_num_put facet. +

+
+

+6. Change the Returns: clause for do_put(iter_type, ios_base &, char_type, bool &) const, et al to +

+

+Returns: base std::use_facet<std::num_put<charT, OutputIterator> >(baseloc).put(s, f, fill, val). +

+ +

[ +Redmond: We would prefer to rename "extended" to "decimal". +]

+ + + + + + +
+

605. Decimal: <decfloat.h> doesn't live here anymore.

+

Section: TRDecimal 3.4 [trdec.types.cdecfloat] Status: TRDec + Submitter: Robert Klarer Date: 2006-10-17

+

View all issues with TRDec status.

+

Discussion:

+

+In Berlin, WG14 decided to drop the <decfloat.h> header. The +contents of that header have been moved into <float.h>. For the +sake of C compatibility, we should make corresponding changes. +

+ + +

Proposed resolution:

+

+1. Change the heading of subclause 3.4, "Headers <cdecfloat> and <decfloat.h>" to "Additions to headers <cfloat> and <float.h>." +

+

+2. Change the text of subclause 3.4 as follows: +

+
+

+The standard C++ headers <cfloat> and <float.h> define characteristics of the floating-point types float, double, and long double. Their contents remain unchanged by this Technical Report. +

+

+Headers <cdecfloat> and <decfloat.h> define characteristics of the decimal floating-point types decimal32, decimal64, and decimal128. As well, <decfloat.h> defines the convenience typedefs _Decimal32, _Decimal64, and _Decimal128, for compatibilty with the C programming language. +

+

+The header <cfloat> is described in [tr.c99.cfloat]. The header <float.h> +is described in [tr.c99.floath]. These headers are extended by this +Technical Report to define characteristics of the decimal +floating-point types decimal32, decimal64, and decimal128. As well, <float.h> is extended to define the convenience typedefs _Decimal32, _Decimal64, and _Decimal128 for compatibility with the C programming language. +

+
+

+3. Change the heading of subclause 3.4.1, "Header <cdecfloat> synopsis" to "Additions to header <cfloat> synopsis." +

+

+4. Change the heading of subclause 3.4.2, "Header <decfloat.h> synopsis" to "Additions to header <float.h> synopsis." +

+

+5. Change the contents of 3.4.2 as follows: +

+
      #include <cdecfloat>
+
+      // C-compatibility convenience typedefs:
+
+      typedef std::decimal::decimal32  _Decimal32;
+      typedef std::decimal::decimal64  _Decimal64;
+      typedef std::decimal::decimal128 _Decimal128;
+
+ + + + + +
+

607. Concern about short seed vectors

+

Section: 26.4.7.1 [rand.util.seedseq] Status: Pending WP + Submitter: Charles Karney Date: 2006-10-26

+

View all other issues in [rand.util.seedseq].

+

View all issues with Pending WP status.

+

Discussion:

+

+Short seed vectors of 32-bit quantities all result in different states. However +this is not true of seed vectors of 16-bit (or smaller) quantities. For example +these two seeds +

+ +
unsigned short seed = {1, 2, 3};
+unsigned short seed = {1, 2, 3, 0};
+
+ +

+both pack to +

+ +
unsigned seed = {0x20001, 0x3};
+
+ +

+yielding the same state. +

+ +

+See N2391 and +N2423 +for some further discussion. +

+ + +

Proposed resolution:

+

+Adopt the proposed resolution in +N2423. +

+ + +

[ +Kona (2007): The LWG adopted the proposed resolution of N2423 for this issue. +The LWG voted to accelerate this issue to Ready status to be voted into the WP at Kona. +]

+ + + + + +
+

608. Unclear seed_seq construction details

+

Section: 26.4.7.1 [rand.util.seedseq] Status: Pending WP + Submitter: Charles Karney Date: 2006-10-26

+

View all other issues in [rand.util.seedseq].

+

View all issues with Pending WP status.

+

Discussion:

+

+In 26.4.7.1 [rand.util.seedseq] /6, the order of packing the inputs into b and the +treatment of signed quantities is unclear. Better to spell it out. +

+ +

+See N2391 and +N2423 +for some further discussion. +

+ + +

Proposed resolution:

+

+Adopt the proposed resolution in +N2423. +

+ + +

[ +Kona (2007): The LWG adopted the proposed resolution of N2423 for this issue. +The LWG voted to accelerate this issue to Ready status to be voted into the WP at Kona. +]

+ + + + + +
+

609. missing static const

+

Section: 26.4.4.2 [rand.adapt.ibits], TR1 5.1 [tr.rand] Status: WP + Submitter: Walter E. Brown Date: 2006-11-02

+

View all issues with WP status.

+

Discussion:

+

+In preparing N2111, an error on my part resulted in the omission of the +following line from the template synopsis in the cited section: +

+ +
static const size_t word_size = w;
+
+ +

+(This same constant is found, for example, in 26.4.3.3 [rand.eng.sub].) +

+ + +

Proposed resolution:

+

+Add the above declaration as the first line after the comment in [rand.adapt.ibits] p4: +

+ +
// engine characteristics
+static const size_t word_size = w;
+
+ +

+and accept my apologies for the oversight. +

+ + + + + +
+

610. Suggested non-normative note for C++0x

+

Section: 20.5.15.2.1 [func.wrap.func.con], TR1 3.7.2.1 [tr.func.wrap.func.con] Status: WP + Submitter: Scott Meyers Date: 2006-11-02

+

View all issues with WP status.

+

Discussion:

+

+My suggestion is that implementers of both tr1::function and its +official C++0x successor be explicitly encouraged (but not required) to +optimize for the cases mentioned above, i.e., function pointers and +small function objects. They could do this by using a small internal +buffer akin to the buffer used by implementations of the small string +optimization. (That would make this the small functor optimization -- +SFO :-}) The form of this encouragement could be a note in the standard +akin to footnote 214 of the current standard. +

+ +

+Dave Abrahams notes: +

+ +

+"shall not throw exceptions" should really be "nothing," both to be more +grammatical and to be consistent with existing wording in the standard. +

+ +

+Doug Gregor comments: I think this is a good idea. Currently, implementations of +tr1::function are required to have non-throwing constructors and assignment +operators when the target function object is a function pointer or a +reference_wrapper. The common case, however, is for a tr1::function to store +either an empty function object or a member pointer + an object pointer. +

+

+The function implementation in the upcoming Boost 1.34.0 uses the +"SFO", so that the function objects for typical bind expressions like +

+
bind(&X::f, this, _1, _2, _3)
+
+ +

+do not require heap allocation when stored in a boost::function. I +believe Dinkumware's implementation also performs this optimization. +

+ + + +

Proposed resolution:

+

+Revise 20.5.14.2.1 p6 [func.wrap.func.con] to add a note as follows: +

+ +
+

+Throws: shall not throw exceptions if f's target is a function +pointer or a function object passed via reference_wrapper. Otherwise, +may throw bad_alloc or any exception thrown by the copy constructor of +the stored function object. +

+

+Note: Implementations are encouraged to avoid the use of dynamically +allocated memory for "small" function objects, e.g., where f's target +is an object holding only a pointer or reference to an object and a member +function pointer (a "bound member function"). +

+
+ + + + + +
+

611. Standard library templates and incomplete types

+

Section: 17.4.3.6 [res.on.functions] Status: WP + Submitter: Nicola Musatti Date: 2006-11-13

+

View all issues with WP status.

+

Discussion:

+

+In the latest available draft standard +(N2134) +§ 17.4.3.6 [res.on.functions] states: +

+ +
+

+-1- In certain cases (replacement functions, handler functions, operations on +types used to instantiate standard library template components), the C++ +Standard Library depends on components supplied by a C++ program. If these +components do not meet their requirements, the Standard places no requirements +on the implementation. +

+ +

+-2- In particular, the effects are undefined in the following cases: +

+

+[...] +

+
    +
  • if an incomplete type (3.9) is used as a template argument when +instantiating a template component.
  • +
+
+ +

+This is contradicted by § 20.6.6.2/2 [util.smartptr.shared] which +states: +

+ +
+

+[...] +

+ +

+The template parameter T of shared_ptr may be an incomplete type. +

+
+ + +

Proposed resolution:

+

+Modify the last bullet of § 17.4.3.6/2 [res.on.functions] to allow for +exceptions: +

+ +
+
    +
  • if an incomplete type (3.9) is used as a template argument when +instantiating a template component, unless specifically allowed for the +component.
  • +
+
+ + + + + + +
+

613. max_digits10 missing from numeric_limits

+

Section: 18.2.1.5 [numeric.special] Status: WP + Submitter: Bo Persson Date: 2006-11-20

+

View all other issues in [numeric.special].

+

View all issues with WP status.

+

Discussion:

+

+Section 18.2.1.5 [numeric.special] starts out by saying that "All members shall be provided +for all specializations." +

+

+Then it goes on to show specializations for float and bool, where one member +is missing (max_digits10). +

+ +

+Maarten Kronenburg adds: +

+ +

+I agree, just adding the comment that the exact number of decimal digits +is digits * ln(radix) / ln(10), where probably this real number is +rounded downward for digits10, and rounded upward for max_digits10 +(when radix=10, then digits10=max_digits10). +Why not add this exact definition also to the standard, so the user +knows what these numbers exactly mean. +

+ +

+Howard adds: +

+ +

+For reference, here are the correct formulas from +N1822: +

+ +
digits10 = floor((digits-1) * log10(2))
+max_digits10 = ceil((1 + digits) * log10(2))
+
+ +

+We are also missing a statement regarding for what specializations this member has meaning. +

+ + + +

Proposed resolution:

+

+Change and add after 18.2.1.2 [numeric.limits.members], p11: +

+ +
+
static const int max_digits10;
+
+

+-11- Number of base 10 digits required to ensure that values which +differ by only one epsilon are always differentiated. +

+

+-12- Meaningful for all floating point types. +

+
+
+ +

+Change 18.2.1.5 [numeric.special], p2: +

+ +
template<> class numeric_limits<float> { 
+public: 
+  static const bool is_specialized = true; 
+  ...
+  static const int digits10 = 6;
+  static const int max_digits10 = 9;
+  ...
+
+ +

+Change 18.2.1.5 [numeric.special], p3: +

+ +
template<> class numeric_limits<bool> { 
+public: 
+  static const bool is_specialized = true; 
+  ...
+  static const int digits10 = 0;
+  static const int max_digits10 = 0;
+  ...
+
+ + + + + + + +
+

616. missing 'typename' in ctype_byname

+

Section: 22.2.1.2 [locale.ctype.byname] Status: WP + Submitter: Bo Persson Date: 2006-12-16

+

View all other issues in [locale.ctype.byname].

+

View all issues with WP status.

+

Discussion:

+

+Section 22.2.1.2 defines the ctype_byname class template. It contains the +line +

+ +
typedef ctype<charT>::mask   mask;
+
+ + + +

Proposed resolution:

+

+as this is a dependent type, it should obviously be +

+ +
typedef typename ctype<charT>::mask   mask;
+
+ + + + + +
+

619. Longjmp wording problem

+

Section: 18.8 [support.runtime] Status: WP + Submitter: Lawrence Crowl Date: 2007-01-12

+

View all issues with WP status.

+

Discussion:

+

+The wording for longjmp is confusing. +

+

+18.8 [support.runtime] -4- Other runtime support +

+

+The function signature longjmp(jmp_buf jbuf, int val) has more restricted +behavior in this International Standard. If any automatic objects would +be destroyed by a thrown exception transferring control to another +(destination) point in the program, then a call to longjmp(jbuf, val) that +the throw point that transfers control to the same (destination) point has +undefined behavior. +

+

+Someone at Google thinks that should say "then a call to longjmp(jbuf, val) +*at* the throw point that transfers control". +

+

+Bill Gibbons thinks it should say something like "If any automatic objects +would be destroyed by an exception thrown at the point of the longjmp and +caught only at the point of the setjmp, the behavior is undefined." +

+ + +

Proposed resolution:

+

+In general, accept Bill Gibbons' recommendation, +but add "call" to indicate that the undefined behavior +comes from the dynamic call, not from its presence in the code. +In 18.8 [support.runtime] paragraph 4, change +

+ +

+The function signature longjmp(jmp_buf jbuf, int val) has more +restricted behavior in this International Standard. If any automatic +objects would be destroyed by a thrown exception transferring control to another +(destination) point in the program, then a call to longjmp(jbuf, val) +that the throw point that transfers control to the same (destination) point has +undefined behavior. A setjmp/longjmp call pair has +undefined behavior if replacing the setjmp and longjmp by +catch and throw would destroy any automatic objects. +

+ + + + + +
+

628. Inconsistent definition of basic_regex constructor

+

Section: 28.8 [re.regex] Status: WP + Submitter: Bo Persson Date: 2007-01-23

+

View all other issues in [re.regex].

+

View all issues with WP status.

+

Discussion:

+

+Section 28.8 [re.regex] lists a constructor +

+ +
template<class InputIterator>
+basic_regex(InputIterator first, InputIterator last,
+                       flag_type f = regex_constants::ECMAScript);
+
+ +

+However, in section 28.8.2 [re.regex.construct], this constructor takes a +pair of ForwardIterator. +

+ + +

Proposed resolution:

+

+Change 28.8.2 [re.regex.construct]: +

+ +
template <class ForwardIterator InputIterator>
+  basic_regex(ForwardIterator InputIterator first, ForwardIterator InputIterator last, 
+              flag_type f = regex_constants::ECMAScript);
+
+ + + + + + +
+

634. allocator.address() doesn't work for types overloading operator&

+

Section: 20.6.1.1 [allocator.members] Status: WP + Submitter: Howard Hinnant Date: 2007-02-07

+

View all other issues in [allocator.members].

+

View all issues with WP status.

+

Duplicate of: 350

+

Discussion:

+ +

+20.6.1.1 [allocator.members] says: +

+
+
pointer address(reference x) const;
+
+

+-1- Returns: &x. +

+
+
+ +

+20.6.1.1 [allocator.members] defines CopyConstructible which currently not +only defines the semantics of copy construction, but also restricts what an overloaded +operator& may do. I believe proposals are in the works (such as concepts +and rvalue reference) to decouple these two requirements. Indeed it is not evident +that we should disallow overloading operator& to return something other +than the address of *this. +

+ +

+An example of when you want to overload operator& to return something +other than the object's address is proxy references such as vector<bool> +(or its replacement, currently code-named bit_vector). Taking the address of +such a proxy reference should logically yield a proxy pointer, which when dereferenced, +yields a copy of the original proxy reference again. +

+ +

+On the other hand, some code truly needs the address of an object, and not a proxy +(typically for determining the identity of an object compared to a reference object). +boost has long recognized this dilemma and solved it with +boost::addressof. +It appears to me that this would be useful functionality for the default allocator. Adopting +this definition for allocator::address would free the standard of requiring +anything special from types which overload operator&. Issue 580 +is expected to make use of allocator::address mandatory for containers. +

+ + + +

Proposed resolution:

+

+Change 20.6.1.1 [allocator.members]: +

+ +
+
pointer address(reference x) const;
+
+

+-1- Returns: &x. The actual address of object referenced by x, +even in the presence of an overloaded operator&. +

+
+ +
const_pointer address(address(const_reference x) const;
+
+

+-2- Returns: &x. The actual address of object referenced by x, +even in the presence of an overloaded operator&. +

+
+
+ +

[ +post Oxford: This would be rendered NAD Editorial by acceptance of +N2257. +]

+ + +

[ +Kona (2007): The LWG adopted the proposed resolution of N2387 for this issue which +was subsequently split out into a separate paper N2436 for the purposes of voting. +The resolution in N2436 addresses this issue. The LWG voted to accelerate this +issue to Ready status to be voted into the WP at Kona. +]

+ + + + + + + +
+

640. 27.6.2.5.2 does not handle (unsigned) long long

+

Section: 27.6.2.6.2 [ostream.inserters.arithmetic] Status: WP + Submitter: Daniel Krügler Date: 2007-02-17

+

View all other issues in [ostream.inserters.arithmetic].

+

View all issues with WP status.

+

Discussion:

+

+The arithmetic inserters are described in 27.6.2.6.2 [ostream.inserters.arithmetic]. +Although the section starts with a listing of the inserters including +the new ones: +

+ +
operator<<(long long val );
+operator<<(unsigned long long val );
+
+ +

+the text in paragraph 1, which describes the corresponding effects +of the inserters, depending on the actual type of val, does not +handle the types long long and unsigned long long. +

+ +

[ +Alisdair: In addition to the (unsigned) long long problem, that whole paragraph +misses any reference to extended integral types supplied by the +implementation - one of the additions by core a couple of working papers +back. +]

+ + + + +

Proposed resolution:

+

+In 27.6.2.6.2 [ostream.inserters.arithmetic]/1 change the third sentence +

+ +
+When val is of type bool, long, unsigned +long, long long, unsigned long long, double, +long double, or const void*, the formatting conversion +occurs as if it performed the following code fragment: +
+ + + + + +
+

643. Impossible "as if" clauses

+

Section: 27.8.1.1 [filebuf], 22.2.2.2.2 [facet.num.put.virtuals] Status: WP + Submitter: Daniel Krügler Date: 2007-02-20

+

View all issues with WP status.

+

Discussion:

+

+The current standard 14882:2003(E) as well as N2134 have the +following +defects: +

+ +

+27.8.1.1 [filebuf]/5 says: +

+ +
+

+In order to support file I/O and multibyte/wide character conversion, conversions are performed using members of a +facet, referred to as a_codecvt in following sections, obtained "as if" by +

+
codecvt<charT,char,typename traits::state_type> a_codecvt =
+  use_facet<codecvt<charT,char,typename traits::state_type> >(getloc());
+
+
+ +

+use_facet returns a const facet reference and no facet is +copyconstructible, so the codecvt construction should fail to compile. +

+ +

+A similar issue arises in 22.2.2.2.2 [facet.num.put.virtuals]/15 for num_punct. +

+ + +

Proposed resolution:

+

+In 27.8.1.1 [filebuf]/5 change the "as if" code +

+ +
const codecvt<charT,char,typename traits::state_type>& a_codecvt =
+  use_facet<codecvt<charT,char,typename traits::state_type> >(getloc());
+
+ +

+In 22.2.2.2.2 [facet.num.put.virtuals]/15 (This is para 5 in N2134) change +

+ +
+

+A local variable punct is initialized via +

+
const numpunct<charT>& punct = use_facet< numpunct<charT> >(str.getloc() );
+
+
+ +

+(Please note also the additional provided trailing semicolon) +

+ + + + + + +
+

644. Possible typos in 'function' description

+

Section: X [func.wrap.func.undef] Status: Pending WP + Submitter: Bo Persson Date: 2007-02-25

+

View all issues with Pending WP status.

+

Discussion:

+

+X [func.wrap.func.undef] +

+

+The note in paragraph 2 refers to 'undefined void operators', while the +section declares a pair of operators returning bool. +

+ + +

Proposed resolution:

+

+Change 20.5.15.2 [func.wrap.func] +

+ +
...
+private:
+   // X [func.wrap.func.undef], undefined operators:
+   template<class Function2> bool void operator==(const function<Function2>&);
+   template<class Function2> bool void operator!=(const function<Function2>&);
+};
+
+ +

+Change X [func.wrap.func.undef] +

+ +
template<class Function2> bool void operator==(const function<Function2>&);
+template<class Function2> bool void operator!=(const function<Function2>&);
+
+ + + + + +
+

646. const incorrect match_result members

+

Section: 28.10.4 [re.results.form] Status: WP + Submitter: Daniel Krügler Date: 2007-02-26

+

View all issues with WP status.

+

Discussion:

+

+28.10.4 [re.results.form] (root and para 3) in N2134 defines the two function template +members format as non-const functions, although they are declared +as const in 28.10 [re.results]/3. +

+ + +

Proposed resolution:

+

+Add the missing const specifier to both format overloads described +in section 28.10.4 [re.results.form]. +

+ + + + + +
+

650. regex_token_iterator and const correctness

+

Section: 28.12.2 [re.tokiter] Status: WP + Submitter: Daniel Krügler Date: 2007-03-05

+

View all other issues in [re.tokiter].

+

View all issues with WP status.

+

Discussion:

+

+Both the class definition of regex_token_iterator (28.12.2 +[re.tokiter]/6) and the latter member specifications (28.12.2.2 +[re.tokiter.comp]/1+2) declare both comparison operators as +non-const functions. Furtheron, both dereference operators are +unexpectedly also declared as non-const in 28.12.2 [re.tokiter]/6 +as well as in (28.12.2.3 [re.tokiter.deref]/1+2). +

+ + +

Proposed resolution:

+

+1) In (28.12.2 [re.tokiter]/6) change the current declarations +

+ +
bool operator==(const regex_token_iterator&) const;
+bool operator!=(const regex_token_iterator&) const;
+const value_type& operator*() const;
+const value_type* operator->() const;
+
+ +

+2) In 28.12.2.2 [re.tokiter.comp] change the following declarations +

+ +
bool operator==(const regex_token_iterator& right) const;
+bool operator!=(const regex_token_iterator& right) const;
+
+ +

+3) In 28.12.2.3 [re.tokiter.deref] change the following declarations +

+ +
const value_type& operator*() const;
+const value_type* operator->() const;
+
+ + +

[ +Kona (2007): The LWG adopted the proposed resolution of N2409 for this issue (which +is to adopt the proposed wording in this issue). +The LWG voted to accelerate this issue to Ready status to be voted into the WP at Kona. +]

+ + + + + +
+

651. Missing preconditions for regex_token_iterator c'tors

+

Section: 28.12.2.1 [re.tokiter.cnstr] Status: WP + Submitter: Daniel Krügler Date: 2007-03-05

+

View all other issues in [re.tokiter.cnstr].

+

View all issues with WP status.

+

Discussion:

+

+The text provided in 28.12.2.1 [re.tokiter.cnstr]/2+3 describes +the effects of the three non-default constructors of class +template regex_token_iterator but is does not clarify which values +are legal values for submatch/submatches. This becomes +an issue, if one takes 28.12.2 [re.tokiter]/9 into account, which explains +the notion of a "current match" by saying: +

+ +

+The current match is (*position).prefix() if subs[N] +== -1, or (*position)[subs[N]] for any other value of +subs[N]. +

+ +

+It's not clear to me, whether other negative values except -1 +are legal arguments or not - it seems they are not. +

+ + +

Proposed resolution:

+

+Add the following precondition paragraph just before the current +28.12.2.1 [re.tokiter.cnstr]/2: +

+ +

+Requires: Each of the initialization values of subs must be >= -1. +

+ + +

[ +Kona (2007): The LWG adopted the proposed resolution of N2409 for this issue (which +is to adopt the proposed wording in this issue). +The LWG voted to accelerate this issue to Ready status to be voted into the WP at Kona. +]

+ + + + + +
+

652. regex_iterator and const correctness

+

Section: 28.12.1 [re.regiter] Status: WP + Submitter: Daniel Krügler Date: 2007-03-05

+

View all issues with WP status.

+

Discussion:

+

Both the class definition of regex_iterator (28.12.1 [re.regiter]/1) +and the latter member specification (28.12.1.2 [re.regiter.comp]/1+2) +declare both comparison operators as +non-const functions. Furtheron, both dereference operators are +unexpectedly also declared as non-const in 28.12.1 [re.regiter]/1 +as well as in (28.12.1.3 [re.regiter.deref]/1+2). +

+ + +

Proposed resolution:

+

+1) In (28.12.1 [re.regiter]/1) change the current declarations +

+ +
bool operator==(const regex_iterator&) const;
+bool operator!=(const regex_iterator&) const;
+const value_type& operator*() const;
+const value_type* operator->() const;
+
+ +

+2) In 28.12.1.3 [re.regiter.deref] change the following declarations +

+ +
const value_type& operator*() const;
+const value_type* operator->() const;
+
+ +

+3) In 28.12.1.2 [re.regiter.comp] change the following declarations +

+ +
bool operator==(const regex_iterator& right) const;
+bool operator!=(const regex_iterator& right) const;
+
+ + +

[ +Kona (2007): The LWG adopted the proposed resolution of N2409 for this issue (which +is to adopt the proposed wording in this issue). +The LWG voted to accelerate this issue to Ready status to be voted into the WP at Kona. +]

+ + + + + +
+

654. Missing IO roundtrip for random number engines

+

Section: 26.4.1.3 [rand.req.eng] Status: Pending WP + Submitter: Daniel Krügler Date: 2007-03-08

+

View all other issues in [rand.req.eng].

+

View all issues with Pending WP status.

+

Discussion:

+

+Table 98 and para 5 in 26.4.1.3 [rand.req.eng] specify +the IO insertion and extraction semantic of random +number engines. It can be shown, v.i., that the specification +of the extractor cannot guarantee to fulfill the requirement +from para 5: +

+ +

+If a textual representation written via os << x was +subsequently read via is >> v, then x == v provided that +there have been no intervening invocations of x or of v. +

+ +

+The problem is, that the extraction process described in +table 98 misses to specify that it will initially set the +if.fmtflags to ios_base::dec, see table 104: +

+ +

+dec: converts integer input or generates integer output +in decimal base +

+ +

+Proof: The following small program demonstrates the violation +of requirements (exception safety not fulfilled): +

+ +
#include <cassert>
+#include <ostream>
+#include <iostream>
+#include <iomanip>
+#include <sstream>
+
+class RanNumEngine {
+  int state;
+public:
+  RanNumEngine() : state(42) {}
+
+  bool operator==(RanNumEngine other) const {
+	  return state == other.state;
+  }
+
+  template <typename Ch, typename Tr>
+  friend std::basic_ostream<Ch, Tr>& operator<<(std::basic_ostream<Ch, Tr>& os, RanNumEngine engine) {
+	Ch old = os.fill(os.widen(' ')); // Sets space character
+	std::ios_base::fmtflags f = os.flags();
+	os << std::dec << std::left << engine.state; // Adds ios_base::dec|ios_base::left
+	os.fill(old); // Undo
+	os.flags(f);
+	return os;
+  }
+
+  template <typename Ch, typename Tr>
+  friend std::basic_istream<Ch, Tr>& operator>>(std::basic_istream<Ch, Tr>& is, RanNumEngine& engine) {
+       // Uncomment only for the fix.
+
+	//std::ios_base::fmtflags f = is.flags();
+	//is >> std::dec;
+	is >> engine.state;
+	//is.flags(f);
+	return is;
+  }
+};
+
+int main() {
+	std::stringstream s;
+	s << std::setfill('#'); // No problem
+        s << std::oct; // Yikes!
+        // Here starts para 5 requirements:
+	RanNumEngine x;
+	s << x;
+	RanNumEngine v;
+	s >> v;
+	assert(x == v); // Fails: 42 == 34
+}
+
+ +

+A second, minor issue seems to be, that the insertion +description from table 98 unnecessarily requires the +addition of ios_base::fixed (which only influences floating-point +numbers). Its not entirely clear to me whether the proposed +standard does require that the state of random number engines +is stored in integral types or not, but I have the impression +that this is the indent, see e.g. p. 3 +

+ +

+The specification of each random number engine defines the +size of its state in multiples of the size of its result_type. +

+ +

+If other types than integrals are supported, then I wonder why +no requirements are specified for the precision of the stream. +

+ +

+See N2391 and +N2423 +for some further discussion. +

+ + +

Proposed resolution:

+

+Adopt the proposed resolution in +N2423. +

+ + +

[ +Kona (2007): The LWG adopted the proposed resolution of N2423 for this issue. +The LWG voted to accelerate this issue to Ready status to be voted into the WP at Kona. +]

+ + + + + +
+

655. Signature of generate_canonical not useful

+

Section: 26.4.7.2 [rand.util.canonical] Status: Pending WP + Submitter: Daniel Krügler Date: 2007-03-08

+

View all other issues in [rand.util.canonical].

+

View all issues with Pending WP status.

+

Discussion:

+

+In 26.4.2 [rand.synopsis] we have the declaration +

+ +
template<class RealType, class UniformRandomNumberGenerator,
+  size_t bits>
+result_type generate_canonical(UniformRandomNumberGenerator& g);
+
+ +

+Besides the "result_type" issue (already recognized by Bo Persson +at Sun, 11 Feb 2007 05:26:47 GMT in this group) it's clear, that +the template parameter order is not reasonably choosen: Obviously +one always needs to specify all three parameters, although usually +only two are required, namely the result type RealType and the +wanted bits, because UniformRandomNumberGenerator can usually +be deduced. +

+ +

+See N2391 and +N2423 +for some further discussion. +

+ + +

Proposed resolution:

+

+Adopt the proposed resolution in +N2423. +

+ + +

[ +Kona (2007): The LWG adopted the proposed resolution of N2423 for this issue. +The LWG voted to accelerate this issue to Ready status to be voted into the WP at Kona. +]

+ + + + + +
+

660. Missing Bitwise Operations

+

Section: 20.5 [function.objects] Status: WP + Submitter: Beman Dawes Date: 2007-04-02

+

View all other issues in [function.objects].

+

View all issues with WP status.

+

Discussion:

+

Section 20.5 [function.objects] provides function +objects for some unary and binary +operations, but others are missing. In a LWG reflector discussion, beginning +with c++std-lib-18078, pros and cons of adding some of the missing operations +were discussed. Bjarne Stroustrup commented "Why standardize what isn't used? +Yes, I see the chicken and egg problems here, but it would be nice to see a +couple of genuine uses before making additions."

+

A number of libraries, including Rogue Wave, GNU, Adobe ASL, and Boost, have +already added these functions, either publicly or for internal use. For example, +Doug Gregor commented: "Boost will also add ... (|, &, ^) in 1.35.0, because we +need those function +objects to represent various parallel +collective operations (reductions, prefix reductions, etc.) in the new Message +Passing Interface (MPI) library."

+

Because the bitwise operators have the strongest use cases, the proposed +resolution is limited to them.

+ + +

Proposed resolution:

+

To 20.5 [function.objects], Function objects, paragraph 2, add to the header +<functional> synopsis:

+
+
template <class T> struct bit_and;
+template <class T> struct bit_or;
+template <class T> struct bit_xor;
+
+

At a location in clause 20 to be determined by the Project Editor, add:

+
+

The library provides basic function object classes for all of the bitwise + operators in the language ([expr.bit.and], [expr.or], [exp.xor]).

+
template <class T> struct bit_and : binary_function<T,T,T> {
+  T operator()(const T& x , const T& y ) const;
+};
+
+

operator() returns x & y .

+
+
template <class T> struct bit_or : binary_function<T,T,T> {
+  T operator()(const T& x , const T& y ) const;
+};
+
+

operator() returns x | y .

+
+
template <class T> struct bit_xor : binary_function<T,T,T> {
+  T operator()(const T& x , const T& y ) const;
+};
+
+

operator() returns x ^ y .

+
+
+ + + + + +
+

677. Weaknesses in seed_seq::randomize [rand.util.seedseq]

+

Section: 26.4.7.1 [rand.util.seedseq] Status: Pending WP + Submitter: Charles Karney Date: 2007-05-15

+

View all other issues in [rand.util.seedseq].

+

View all issues with Pending WP status.

+

Discussion:

+

+seed_seq::randomize provides a mechanism for initializing random number +engines which ideally would yield "distant" states when given "close" +seeds. The algorithm for seed_seq::randomize given in the current +Working Draft for C++, +N2284 +(2007-05-08), has 3 weaknesses +

+ +
    +
  1. +

    Collisions in state. Because of the way the state is initialized, + seeds of different lengths may result in the same state. The + current version of seed_seq has the following properties:

    +
      +
    • For a given s <= n, each of the 2^(32s) seed vectors results in a + distinct state.
    • +
    +

    + The proposed algorithm (below) has the considerably stronger + properties:

    +
      +
    • All of the (2^(32n)-1)/(2^32-1) seed vectors of lengths s < n + result in distinct states. +
    • +
    • All of the 2^(32n) seed vectors of length s == n result in + distinct states. +
    • +
    +
  2. +
  3. +

    Poor mixing of v's entropy into the state. Consider v.size() == n + and hold v[n/2] thru v[n-1] fixed while varying v[0] thru v[n/2-1], + a total of 2^(16n) possibilities. Because of the simple recursion + used in seed_seq, begin[n/2] thru begin[n-1] can take on only 2^64 + possible states.

    + +

    The proposed algorithm uses a more complex recursion which results + in much better mixing.

    +
  4. +
  5. seed_seq::randomize is undefined for v.size() == 0. The proposed + algorithm remedies this. +
  6. +
+

+The current algorithm for seed_seq::randomize is adapted by me from the +initialization procedure for the Mersenne Twister by Makoto Matsumoto +and Takuji Nishimura. The weakness (2) given above was communicated to +me by Matsumoto last year. +

+

+The proposed replacement for seed_seq::randomize is due to Mutsuo Saito, +a student of Matsumoto, and is given in the implementation of the +SIMD-oriented Fast Mersenne Twister random number generator SFMT. +http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/SFMT/index.html +http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/SFMT/SFMT-src-1.2.tar.gz +

+

+See +Mutsuo Saito, +An Application of Finite Field: Design and Implementation of 128-bit +Instruction-Based Fast Pseudorandom Number Generator, +Master's Thesis, Dept. of Math., Hiroshima University (Feb. 2007) +http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/SFMT/M062821.pdf +

+

+One change has been made here, namely to treat the case of small n +(setting t = (n-1)/2 for n < 7). +

+

+Since seed_seq was introduced relatively recently there is little cost +in making this incompatible improvement to it. +

+ +

+See N2391 and +N2423 +for some further discussion. +

+ + +

Proposed resolution:

+

+Adopt the proposed resolution in +N2423. +

+ + +

[ +Kona (2007): The LWG adopted the proposed resolution of N2423 for this issue. +The LWG voted to accelerate this issue to Ready status to be voted into the WP at Kona. +]

+ + + + + +
+

678. Changes for [rand.req.eng]

+

Section: 26.4.1.3 [rand.req.eng] Status: WP + Submitter: Charles Karney Date: 2007-05-15

+

View all other issues in [rand.req.eng].

+

View all issues with WP status.

+

Discussion:

+

+Section 26.4.1.3 [rand.req.eng] Random number engine requirements: +

+ +

+This change follows naturally from the proposed change to +seed_seq::randomize in 677. +

+ +

+In table 104 the description of X(q) contains a special treatment of +the case q.size() == 0. This is undesirable for 4 reasons: +

+ +
    +
  1. It replicates the functionality provided by X().
  2. +
  3. It leads to the possibility of a collision in the state provided + by some other X(q) with q.size() > 0.
  4. +
  5. It is inconsistent with the description of the X(q) in +paragraphs 26.4.3.1 [rand.eng.lcong] p5, 26.4.3.2 [rand.eng.mers] p8, and 26.4.3.3 [rand.eng.sub] p10 where +there is no special treatment of q.size() == 0.
  6. +
  7. The proposed replacement for seed_seq::randomize given above + allows for the case q.size() == 0.
  8. +
+ +

+See N2391 and +N2423 +for some further discussion. +

+ + +

Proposed resolution:

+

+Adopt the proposed resolution in +N2423. +

+ + +

[ +Kona (2007): The LWG adopted the proposed resolution of N2423 for this issue. +The LWG voted to accelerate this issue to Ready status to be voted into the WP at Kona. +]

+ + + + + +
+

681. Operator functions impossible to compare are defined in [re.submatch.op]

+

Section: 28.9.2 [re.submatch.op] Status: WP + Submitter: Nozomu Katoo Date: 2007-05-27

+

View all issues with WP status.

+

Discussion:

+

+In 28.9.2 [re.submatch.op] of N2284, +operator functions numbered 31-42 seem impossible to compare.  E.g.: +

+ +
+
+template <class BiIter>
+    bool operator==(typename iterator_traits<BiIter>::value_type const& lhs,
+                    const sub_match<BiIter>& rhs);
+
+
+

+-31- Returns: lhs == rhs.str(). +

+
+
+ +

+When char* is used as BiIter, iterator_traits<BiIter>::value_type would be +char, so that lhs == rhs.str() ends up comparing a char value and an object +of std::basic_string<char>.  However, the behaviour of comparison between +these two types is not defined in 21.3.8 [string.nonmembers] of N2284. + This applies when wchar_t* is used as BiIter. +

+ + +

Proposed resolution:

+

+Adopt the proposed resolution in +N2409. +

+ + +

[ +Kona (2007): The LWG adopted the proposed resolution of N2409 for this issue. +The LWG voted to accelerate this issue to Ready status to be voted into the WP at Kona. +]

+ + + + + +
+

682. basic_regex ctor takes InputIterator or ForwardIterator?

+

Section: 28.8.2 [re.regex.construct] Status: Pending WP + Submitter: Eric Niebler Date: 2007-06-03

+

View all issues with Pending WP status.

+

Discussion:

+

+Looking at N2284, 28.8 [re.regex], p3 basic_regex class template synopsis shows this +constructor: +

+
template <class InputIterator>
+     basic_regex(InputIterator first, InputIterator last, 
+                 flag_type f = regex_constants::ECMAScript);
+
+ +

+In 28.8.2 [re.regex.construct], p15, the constructor appears with this signature: +

+ +
template <class ForwardIterator>
+     basic_regex(ForwardIterator first, ForwardIterator last, 
+                 flag_type f = regex_constants::ECMAScript);
+
+ +

+ForwardIterator is probably correct, so the synopsis is wrong. +

+ +

[ +John adds: +]

+ + +
+

+I think either could be implemented?  Although an input iterator would +probably require an internal copy of the string being made. +

+

+I have no strong feelings either way, although I think my original intent +was InputIterator. +

+
+ + +

Proposed resolution:

+

+Adopt the proposed resolution in +N2409. +

+ + +

[ +Kona (2007): The LWG adopted the proposed resolution of N2409 for this issue. +The LWG voted to accelerate this issue to Ready status to be voted into the WP at Kona. +]

+ + + + + +
+

699. N2111 changes min/max

+

Section: 26.4 [rand] Status: WP + Submitter: P.J. Plauger Date: 2007-07-01

+

View all other issues in [rand].

+

View all issues with WP status.

+

Discussion:

+

+N2111 +changes min/max in several places in random from member +functions to static data members. I believe this introduces +a needless backward compatibility problem between C++0X and +TR1. I'd like us to find new names for the static data members, +or perhaps change min/max to constexprs in C++0X. +

+ +

+See N2391 and +N2423 +for some further discussion. +

+ + +

Proposed resolution:

+

+Adopt the proposed resolution in +N2423. +

+ + +

[ +Kona (2007): The LWG adopted the proposed resolution of N2423 for this issue. +The LWG voted to accelerate this issue to Ready status to be voted into the WP at Kona. +]

+ + + + + +
+

712. seed_seq::size no longer useful

+

Section: 26.4.7.1 [rand.util.seedseq] Status: WP + Submitter: Marc Paterno Date: 2007-08-25

+

View all other issues in [rand.util.seedseq].

+

View all issues with WP status.

+

Discussion:

+

+One of the motivations for incorporating seed_seq::size() +was to simplify the wording +in other parts of 26.4 [rand]. +As a side effect of resolving related issues, +all such references +to seed_seq::size() will have been excised. +More importantly, +the present specification is contradictory, +as "The number of 32-bit units the object can deliver" +is not the same as "the result of v.size()." +

+ +

+See N2391 and +N2423 +for some further discussion. +

+ + +

Proposed resolution:

+

+Adopt the proposed resolution in +N2423. +

+ + +

[ +Kona (2007): The LWG adopted the proposed resolution of N2423 for this issue. +The LWG voted to accelerate this issue to Ready status to be voted into the WP at Kona. +]

+ + + + + + + \ No newline at end of file diff --git a/libstdc++-v3/doc/html/ext/mt_allocator.html b/libstdc++-v3/doc/html/ext/mt_allocator.html new file mode 100644 index 00000000000..b53e7e6200e --- /dev/null +++ b/libstdc++-v3/doc/html/ext/mt_allocator.html @@ -0,0 +1,560 @@ + + + + + + + + + + A fixed-size, multi-thread optimized allocator + + + + + + + +

A fixed-size, multi-thread optimized allocator

+ +

+ The latest version of this document is always available at + + http://gcc.gnu.org/onlinedocs/libstdc++/ext/mt_allocator.html. +

+ +

+ To the libstdc++ homepage. +

+ + +
+

+ Introduction +

+ +

The mt allocator [hereinafter referred to simply as "the +allocator"] is a fixed size (power of two) allocator that was +initially developed specifically to suit the needs of multi threaded +applications [hereinafter referred to as an MT application]. Over time +the allocator has evolved and been improved in many ways, in +particular it now also does a good job in single threaded applications +[hereinafter referred to as a ST application]. (Note: In this +document, when referring to single threaded applications this also +includes applications that are compiled with gcc without thread +support enabled. This is accomplished using ifdef's on +__GTHREADS). This allocator is tunable, very flexible, and capable of +high-performance. +

+ +

+The aim of this document is to describe - from an application point of +view - the "inner workings" of the allocator. +

+ +

+ Design Overview +

+ +

There are three general components to the allocator: a datum +describing the characteristics of the memory pool, a policy class +containing this pool that links instantiation types to common or +individual pools, and a class inheriting from the policy class that is +the actual allocator. +

+ +

The datum describing pools characteristics is +

+
+  template<bool _Thread>
+    class __pool
+
+

This class is parametrized on thread support, and is explicitly +specialized for both multiple threads (with bool==true) +and single threads (via bool==false.) It is possible to +use a custom pool datum instead of the default class that is provided. +

+ +

There are two distinct policy classes, each of which can be used +with either type of underlying pool datum. +

+ +
+  template<bool _Thread>
+    struct __common_pool_policy
+
+  template<typename _Tp, bool _Thread>
+    struct __per_type_pool_policy
+
+ +

The first policy, __common_pool_policy, implements a +common pool. This means that allocators that are instantiated with +different types, say char and long will both +use the same pool. This is the default policy. +

+ +

The second policy, __per_type_pool_policy, implements +a separate pool for each instantiating type. Thus, char +and long will use separate pools. This allows per-type +tuning, for instance. +

+ +

Putting this all together, the actual allocator class is +

+
+  template<typename _Tp, typename _Poolp = __default_policy>
+    class __mt_alloc : public __mt_alloc_base<_Tp>,  _Poolp
+
+

This class has the interface required for standard library allocator +classes, namely member functions allocate and +deallocate, plus others. +

+ +

+ Tunable parameters +

+ +

Certain allocation parameters can be modified, or tuned. There +exists a nested struct __pool_base::_Tune that contains all +these parameters, which include settings for +

+
    +
  • Alignment
  • +
  • Maximum bytes before calling ::operator new directly
  • +
  • Minimum bytes
  • +
  • Size of underlying global allocations
  • +
  • Maximum number of supported threads
  • +
  • Migration of deallocations to the global free list
  • +
  • Shunt for global new and delete
  • +
+

Adjusting parameters for a given instance of an allocator can only +happen before any allocations take place, when the allocator itself is +initialized. For instance: +

+
+#include <ext/mt_allocator.h>
+
+struct pod
+{
+  int i;
+  int j;
+};
+
+int main()
+{
+  typedef pod value_type;
+  typedef __gnu_cxx::__mt_alloc<value_type> allocator_type;
+  typedef __gnu_cxx::__pool_base::_Tune tune_type;
+
+  tune_type t_default;
+  tune_type t_opt(16, 5120, 32, 5120, 20, 10, false);
+  tune_type t_single(16, 5120, 32, 5120, 1, 10, false);
+
+  tune_type t;
+  t = allocator_type::_M_get_options();  
+  allocator_type::_M_set_options(t_opt);
+  t = allocator_type::_M_get_options();  
+
+  allocator_type a;
+  allocator_type::pointer p1 = a.allocate(128);
+  allocator_type::pointer p2 = a.allocate(5128);
+
+  a.deallocate(p1, 128);
+  a.deallocate(p2, 5128);
+
+  return 0;
+}
+
+ +

+ Initialization +

+ +

+The static variables (pointers to freelists, tuning parameters etc) +are initialized as above, or are set to the global defaults. +

+ +

+The very first allocate() call will always call the +_S_initialize_once() function. In order to make sure that this +function is called exactly once we make use of a __gthread_once call +in MT applications and check a static bool (_S_init) in ST +applications. +

+ +

+The _S_initialize() function: +- If the GLIBCXX_FORCE_NEW environment variable is set, it sets the bool + _S_force_new to true and then returns. This will cause subsequent calls to + allocate() to return memory directly from a new() call, and deallocate will + only do a delete() call. +

+ +

+- If the GLIBCXX_FORCE_NEW environment variable is not set, both ST and MT + applications will: + - Calculate the number of bins needed. A bin is a specific power of two size + of bytes. I.e., by default the allocator will deal with requests of up to + 128 bytes (or whatever the value of _S_max_bytes is when _S_init() is + called). This means that there will be bins of the following sizes + (in bytes): 1, 2, 4, 8, 16, 32, 64, 128. + + - Create the _S_binmap array. All requests are rounded up to the next + "large enough" bin. I.e., a request for 29 bytes will cause a block from + the "32 byte bin" to be returned to the application. The purpose of + _S_binmap is to speed up the process of finding out which bin to use. + I.e., the value of _S_binmap[ 29 ] is initialized to 5 (bin 5 = 32 bytes). +

+

+ - Create the _S_bin array. This array consists of bin_records. There will be + as many bin_records in this array as the number of bins that we calculated + earlier. I.e., if _S_max_bytes = 128 there will be 8 entries. + Each bin_record is then initialized: + - bin_record->first = An array of pointers to block_records. There will be + as many block_records pointers as there are maximum number of threads + (in a ST application there is only 1 thread, in a MT application there + are _S_max_threads). + This holds the pointer to the first free block for each thread in this + bin. I.e., if we would like to know where the first free block of size 32 + for thread number 3 is we would look this up by: _S_bin[ 5 ].first[ 3 ] + + The above created block_record pointers members are now initialized to + their initial values. I.e. _S_bin[ n ].first[ n ] = NULL; +

+ +

+- Additionally a MT application will: + - Create a list of free thread id's. The pointer to the first entry + is stored in _S_thread_freelist_first. The reason for this approach is + that the __gthread_self() call will not return a value that corresponds to + the maximum number of threads allowed but rather a process id number or + something else. So what we do is that we create a list of thread_records. + This list is _S_max_threads long and each entry holds a size_t thread_id + which is initialized to 1, 2, 3, 4, 5 and so on up to _S_max_threads. + Each time a thread calls allocate() or deallocate() we call + _S_get_thread_id() which looks at the value of _S_thread_key which is a + thread local storage pointer. If this is NULL we know that this is a newly + created thread and we pop the first entry from this list and saves the + pointer to this record in the _S_thread_key variable. The next time + we will get the pointer to the thread_record back and we use the + thread_record->thread_id as identification. I.e., the first thread that + calls allocate will get the first record in this list and thus be thread + number 1 and will then find the pointer to its first free 32 byte block + in _S_bin[ 5 ].first[ 1 ] + When we create the _S_thread_key we also define a destructor + (_S_thread_key_destr) which means that when the thread dies, this + thread_record is returned to the front of this list and the thread id + can then be reused if a new thread is created. + This list is protected by a mutex (_S_thread_freelist_mutex) which is only + locked when records are removed/added to the list. +

+

+ - Initialize the free and used counters of each bin_record: + - bin_record->free = An array of size_t. This keeps track of the number + of blocks on a specific thread's freelist in each bin. I.e., if a thread + has 12 32-byte blocks on it's freelists and allocates one of these, this + counter would be decreased to 11. + + - bin_record->used = An array of size_t. This keeps track of the number + of blocks currently in use of this size by this thread. I.e., if a thread + has made 678 requests (and no deallocations...) of 32-byte blocks this + counter will read 678. + + The above created arrays are now initialized with their initial values. + I.e. _S_bin[ n ].free[ n ] = 0; +

+

+ - Initialize the mutex of each bin_record: The bin_record->mutex + is used to protect the global freelist. This concept of a global + freelist is explained in more detail in the section "A multi + threaded example", but basically this mutex is locked whenever a + block of memory is retrieved or returned to the global freelist + for this specific bin. This only occurs when a number of blocks + are grabbed from the global list to a thread specific list or when + a thread decides to return some blocks to the global freelist. +

+ +

Notes about deallocation. This allocator does not explicitly +release memory. Because of this, memory debugging programs like +valgrind or purify may notice leaks: sorry about this +inconvenience. Operating systems will reclaim allocated memory at +program termination anyway. If sidestepping this kind of noise is +desired, there are three options: use an allocator, like +new_allocator that releases memory while debugging, use +GLIBCXX_FORCE_NEW to bypass the allocator's internal pools, or use a +custom pool datum that releases resources on destruction.

+ +

On systems with the function __cxa_atexit, the +allocator can be forced to free all memory allocated before program +termination with the member function +__pool_type::_M_destroy. However, because this member +function relies on the precise and exactly-conforming ordering of +static destructors, including those of a static local +__pool object, it should not be used, ever, on systems +that don't have the necessary underlying support. In addition, in +practice, forcing deallocation can be tricky, as it requires the +__pool object to be fully-constructed before the object +that uses it is fully constructed. For most (but not all) STL +containers, this works, as an instance of the allocator is constructed +as part of a container's constructor. However, this assumption is +implementation-specific, and subject to change. For an example of a +pool that frees memory, see the following + + example. +

+ +

+ A single threaded example (and a primer for the multi threaded example!) +

+ +

+Let's start by describing how the data on a freelist is laid out in memory. +This is the first two blocks in freelist for thread id 3 in bin 3 (8 bytes): +

+
++----------------+
+| next* ---------|--+  (_S_bin[ 3 ].first[ 3 ] points here)
+|                |  |
+|                |  |
+|                |  |
++----------------+  |
+| thread_id = 3  |  |
+|                |  |
+|                |  |
+|                |  |
++----------------+  |
+| DATA           |  |  (A pointer to here is what is returned to the
+|                |  |   the application when needed)
+|                |  |
+|                |  |
+|                |  |
+|                |  |
+|                |  |
+|                |  |
++----------------+  |
++----------------+  |
+| next*          |<-+  (If next == NULL it's the last one on the list)
+|                |
+|                |
+|                |
++----------------+
+| thread_id = 3  |
+|                |
+|                |
+|                |
++----------------+
+| DATA           |
+|                |
+|                |
+|                |
+|                |
+|                |
+|                |
+|                |
++----------------+
+
+ +

+With this in mind we simplify things a bit for a while and say that there is +only one thread (a ST application). In this case all operations are made to +what is referred to as the global pool - thread id 0 (No thread may be +assigned this id since they span from 1 to _S_max_threads in a MT application). +

+

+When the application requests memory (calling allocate()) we first look at the +requested size and if this is > _S_max_bytes we call new() directly and return. +

+

+If the requested size is within limits we start by finding out from which +bin we should serve this request by looking in _S_binmap. +

+

+A quick look at _S_bin[ bin ].first[ 0 ] tells us if there are any blocks of +this size on the freelist (0). If this is not NULL - fine, just remove the +block that _S_bin[ bin ].first[ 0 ] points to from the list, +update _S_bin[ bin ].first[ 0 ] and return a pointer to that blocks data. +

+

+If the freelist is empty (the pointer is NULL) we must get memory from the +system and build us a freelist within this memory. All requests for new memory +is made in chunks of _S_chunk_size. Knowing the size of a block_record and +the bytes that this bin stores we then calculate how many blocks we can create +within this chunk, build the list, remove the first block, update the pointer +(_S_bin[ bin ].first[ 0 ]) and return a pointer to that blocks data. +

+ +

+Deallocation is equally simple; the pointer is casted back to a block_record +pointer, lookup which bin to use based on the size, add the block to the front +of the global freelist and update the pointer as needed +(_S_bin[ bin ].first[ 0 ]). +

+ +

+The decision to add deallocated blocks to the front of the freelist was made +after a set of performance measurements that showed that this is roughly 10% +faster than maintaining a set of "last pointers" as well. +

+ +

+ A multi threaded example +

+ +

+In the ST example we never used the thread_id variable present in each block. +Let's start by explaining the purpose of this in a MT application. +

+ +

+The concept of "ownership" was introduced since many MT applications +allocate and deallocate memory to shared containers from different +threads (such as a cache shared amongst all threads). This introduces +a problem if the allocator only returns memory to the current threads +freelist (I.e., there might be one thread doing all the allocation and +thus obtaining ever more memory from the system and another thread +that is getting a longer and longer freelist - this will in the end +consume all available memory). +

+ +

+Each time a block is moved from the global list (where ownership is +irrelevant), to a threads freelist (or when a new freelist is built +from a chunk directly onto a threads freelist or when a deallocation +occurs on a block which was not allocated by the same thread id as the +one doing the deallocation) the thread id is set to the current one. +

+ +

+What's the use? Well, when a deallocation occurs we can now look at +the thread id and find out if it was allocated by another thread id +and decrease the used counter of that thread instead, thus keeping the +free and used counters correct. And keeping the free and used counters +corrects is very important since the relationship between these two +variables decides if memory should be returned to the global pool or +not when a deallocation occurs. +

+ +

+When the application requests memory (calling allocate()) we first +look at the requested size and if this is > _S_max_bytes we call new() +directly and return. +

+ +

+If the requested size is within limits we start by finding out from which +bin we should serve this request by looking in _S_binmap. +

+ +

+A call to _S_get_thread_id() returns the thread id for the calling thread +(and if no value has been set in _S_thread_key, a new id is assigned and +returned). +

+ +

+A quick look at _S_bin[ bin ].first[ thread_id ] tells us if there are +any blocks of this size on the current threads freelist. If this is +not NULL - fine, just remove the block that _S_bin[ bin ].first[ +thread_id ] points to from the list, update _S_bin[ bin ].first[ +thread_id ], update the free and used counters and return a pointer to +that blocks data. +

+ +

+If the freelist is empty (the pointer is NULL) we start by looking at +the global freelist (0). If there are blocks available on the global +freelist we lock this bins mutex and move up to block_count (the +number of blocks of this bins size that will fit into a _S_chunk_size) +or until end of list - whatever comes first - to the current threads +freelist and at the same time change the thread_id ownership and +update the counters and pointers. When the bins mutex has been +unlocked, we remove the block that _S_bin[ bin ].first[ thread_id ] +points to from the list, update _S_bin[ bin ].first[ thread_id ], +update the free and used counters, and return a pointer to that blocks +data. +

+ +

+The reason that the number of blocks moved to the current threads +freelist is limited to block_count is to minimize the chance that a +subsequent deallocate() call will return the excess blocks to the +global freelist (based on the _S_freelist_headroom calculation, see +below). +

+ +

+However if there isn't any memory on the global pool we need to get +memory from the system - this is done in exactly the same way as in a +single threaded application with one major difference; the list built +in the newly allocated memory (of _S_chunk_size size) is added to the +current threads freelist instead of to the global. +

+ +

+The basic process of a deallocation call is simple: always add the +block to the front of the current threads freelist and update the +counters and pointers (as described earlier with the specific check of +ownership that causes the used counter of the thread that originally +allocated the block to be decreased instead of the current threads +counter). +

+ +

+And here comes the free and used counters to service. Each time a +deallocation() call is made, the length of the current threads +freelist is compared to the amount memory in use by this thread. +

+ +

+Let's go back to the example of an application that has one thread +that does all the allocations and one that deallocates. Both these +threads use say 516 32-byte blocks that was allocated during thread +creation for example. Their used counters will both say 516 at this +point. The allocation thread now grabs 1000 32-byte blocks and puts +them in a shared container. The used counter for this thread is now +1516. +

+ +

+The deallocation thread now deallocates 500 of these blocks. For each +deallocation made the used counter of the allocating thread is +decreased and the freelist of the deallocation thread gets longer and +longer. But the calculation made in deallocate() will limit the length +of the freelist in the deallocation thread to _S_freelist_headroom % +of it's used counter. In this case, when the freelist (given that the +_S_freelist_headroom is at it's default value of 10%) exceeds 52 +(516/10) blocks will be returned to the global pool where the +allocating thread may pick them up and reuse them. +

+ +

+In order to reduce lock contention (since this requires this bins +mutex to be locked) this operation is also made in chunks of blocks +(just like when chunks of blocks are moved from the global freelist to +a threads freelist mentioned above). The "formula" used can probably +be improved to further reduce the risk of blocks being "bounced back +and forth" between freelists. +

+ +
+

Return to the top of the page or + to the libstdc++ homepage. +

+ + + + +
+

+See license.html for copying conditions. +Comments and suggestions are welcome, and may be sent to +the libstdc++ mailing list. +

+ + + + diff --git a/libstdc++-v3/doc/html/ext/parallel_mode.html b/libstdc++-v3/doc/html/ext/parallel_mode.html new file mode 100644 index 00000000000..7ca8dbe937c --- /dev/null +++ b/libstdc++-v3/doc/html/ext/parallel_mode.html @@ -0,0 +1,593 @@ + + + + + + + + + + The libstdc++ parallel mode + + + + + +

The libstdc++ parallel mode

+ +

+ The latest version of this document is always available at + + http://gcc.gnu.org/onlinedocs/libstdc++/parallel_mode.html. +

+ +

+ To the libstdc++ homepage. +

+ + +
+

The libstdc++ parallel mode is an experimental parallel +implementation of many algorithms the C++ Standard Library. +

+ +

+Several of the standard algorithms, for instance +std::sort, are made parallel using OpenMP +annotations. These parallel mode constructs and can be invoked by +explicit source declaration or by compiling existing sources with a +specific compiler flag. +

+ +

The libstdc++ parallel mode

+ +

The libstdc++ parallel mode performs parallelization of algorithms, +function objects, classes, and functions in the C++ Standard.

+ +

Using the libstdc++ parallel mode

+ +

To use the libstdc++ parallel mode, compile your application with + the compiler flag -D_GLIBCXX_PARALLEL -fopenmp. This + will link in libgomp, the GNU OpenMP implementation, + whose presence is mandatory. In addition, hardware capable of atomic + operations is mandatory. Actually activating these atomic + operations may require explicit compiler flags on some targets + (like sparc and x86), such as -march=i686, + -march=native or -mcpu=v9. +

+ +

Note that the _GLIBCXX_PARALLEL define may change the + sizes and behavior of standard class templates such as + std::search, and therefore one can only link code + compiled with parallel mode and code compiled without parallel mode + if no instantiation of a container is passed between the two + translation units. Parallel mode functionality has distinct linkage, + and cannot be confused with normal mode symbols.

+ + +

The following library components in the include +<numeric> are included in the parallel mode:

+
    +
  • std::accumulate
  • +
  • std::adjacent_difference
  • +
  • std::inner_product
  • +
  • std::partial_sum
  • +
+ +

The following library components in the include +<algorithm> are included in the parallel mode:

+
    +
  • std::adjacent_find
  • +
  • std::count
  • +
  • std::count_if
  • +
  • std::equal
  • +
  • std::find
  • +
  • std::find_if
  • +
  • std::find_first_of
  • +
  • std::for_each
  • +
  • std::generate
  • +
  • std::generate_n
  • +
  • std::lexicographical_compare
  • +
  • std::mismatch
  • +
  • std::search
  • +
  • std::search_n
  • +
  • std::transform
  • +
  • std::replace
  • +
  • std::replace_if
  • +
  • std::max_element
  • +
  • std::merge
  • +
  • std::min_element
  • +
  • std::nth_element
  • +
  • std::partial_sort
  • +
  • std::partition
  • +
  • std::random_shuffle
  • +
  • std::set_union
  • +
  • std::set_intersection
  • +
  • std::set_symmetric_difference
  • +
  • std::set_difference
  • +
  • std::sort
  • +
  • std::stable_sort
  • +
  • std::unique_copy
  • +
+ +

The following library components in the includes +<set> and <map> are included in the parallel mode:

+
    +
  • std::(multi_)map/set<T>::(multi_)map/set(Iterator begin, Iterator end) (bulk construction)
  • +
  • std::(multi_)map/set<T>::insert(Iterator begin, Iterator end) (bulk insertion)
  • +
+ + +

Using the parallel algorithms without parallel mode

+ +

When it is not feasible to recompile your entire application, or + only specific algorithms need to be parallel-aware, individual + parallel algorithms can be made available explicitly. These + parallel algorithms are functionally equivalent to the standard + drop-in algorithms used in parallel mode, but they are available in + a separate namespace as GNU extensions and may be used in programs + compiled with either release mode or with parallel mode. The + following table provides the names and headers of the parallel + algorithms: +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AlgorithmHeaderParallel algorithmParallel header
std::accumulate<numeric>__gnu_parallel::accumulate<parallel/numeric>
std::adjacent_difference<numeric>__gnu_parallel::adjacent_difference<parallel/numeric>
std::inner_product<numeric>__gnu_parallel::inner_product<parallel/numeric>
std::partial_sum<numeric>__gnu_parallel::partial_sum<parallel/numeric>
std::adjacent_find<algorithm>__gnu_parallel::adjacent_find<parallel/algorithm>
std::count<algorithm>__gnu_parallel::count<parallel/algorithm>
std::count_if<algorithm>__gnu_parallel::count_if<parallel/algorithm>
std::equal<algorithm>__gnu_parallel::equal<parallel/algorithm>
std::find<algorithm>__gnu_parallel::find<parallel/algorithm>
std::find_if<algorithm>__gnu_parallel::find_if<parallel/algorithm>
std::find_first_of<algorithm>__gnu_parallel::find_first_of<parallel/algorithm>
std::for_each<algorithm>__gnu_parallel::for_each<parallel/algorithm>
std::generate<algorithm>__gnu_parallel::generate<parallel/algorithm>
std::generate_n<algorithm>__gnu_parallel::generate_n<parallel/algorithm>
std::lexicographical_compare<algorithm>__gnu_parallel::lexicographical_compare<parallel/algorithm>
std::mismatch<algorithm>__gnu_parallel::mismatch<parallel/algorithm>
std::search<algorithm>__gnu_parallel::search<parallel/algorithm>
std::search_n<algorithm>__gnu_parallel::search_n<parallel/algorithm>
std::transform<algorithm>__gnu_parallel::transform<parallel/algorithm>
std::replace<algorithm>__gnu_parallel::replace<parallel/algorithm>
std::replace_if<algorithm>__gnu_parallel::replace_if<parallel/algorithm>
std::max_element<algorithm>__gnu_parallel::max_element<parallel/algorithm>
std::merge<algorithm>__gnu_parallel::merge<parallel/algorithm>
std::min_element<algorithm>__gnu_parallel::min_element<parallel/algorithm>
std::nth_element<algorithm>__gnu_parallel::nth_element<parallel/algorithm>
std::partial_sort<algorithm>__gnu_parallel::partial_sort<parallel/algorithm>
std::partition<algorithm>__gnu_parallel::partition<parallel/algorithm>
std::random_shuffle<algorithm>__gnu_parallel::random_shuffle<parallel/algorithm>
std::set_union<algorithm>__gnu_parallel::set_union<parallel/algorithm>
std::set_intersection<algorithm>__gnu_parallel::set_intersection<parallel/algorithm>
std::set_symmetric_difference<algorithm>__gnu_parallel::set_symmetric_difference<parallel/algorithm>
std::set_difference<algorithm>__gnu_parallel::set_difference<parallel/algorithm>
std::sort<algorithm>__gnu_parallel::sort<parallel/algorithm>
std::stable_sort<algorithm>__gnu_parallel::stable_sort<parallel/algorithm>
std::unique_copy<algorithm>__gnu_parallel::unique_copy<parallel/algorithm>
+ + +

Parallel mode semantics

+ +

The parallel mode STL algorithms are currently not exception-safe, +i. e. user-defined functors must not throw exceptions. +

+ +

Since the current GCC OpenMP implementation does not support +OpenMP parallel regions in concurrent threads, +it is not possible to call parallel STL algorithm in +concurrent threads, either. +It might work with other compilers, though.

+ + +

Configuration and Tuning

+ +

Some algorithm variants can be enabled/disabled/selected at compile-time. +See +<compiletime_settings.h> and +See +<features.h> for details. +

+ +

+To specify the number of threads to be used for an algorithm, +use omp_set_num_threads. +To force a function to execute sequentially, +even though parallelism is switched on in general, +add __gnu_parallel::sequential_tag() +to the end of the argument list. +

+ +

+Parallelism always incurs some overhead. Thus, it is not +helpful to parallelize operations on very small sets of data. +There are measures to avoid parallelizing stuff that is not worth it. +For each algorithm, a minimum problem size can be stated, +usually using the variable +__gnu_parallel::Settings::[algorithm]_minimal_n. +Please see +<settings.h> for details.

+ + + +

Interface basics and general design

+ +

All parallel algorithms are intended to have signatures that are +equivalent to the ISO C++ algorithms replaced. For instance, the +std::adjacent_find function is declared as: +

+
+namespace std
+{
+  template<typename _FIter>
+    _FIter
+    adjacent_find(_FIter, _FIter);
+}
+
+ +

+Which means that there should be something equivalent for the parallel +version. Indeed, this is the case: +

+ +
+namespace std
+{
+  namespace __parallel
+  {
+    template<typename _FIter>
+      _FIter
+      adjacent_find(_FIter, _FIter);
+
+    ...
+  }
+}
+
+ +

But.... why the elipses? +

+ +

The elipses in the example above represent additional overloads +required for the parallel version of the function. These additional +overloads are used to dispatch calls from the ISO C++ function +signature to the appropriate parallel function (or sequential +function, if no parallel functions are deemed worthy), based on either +compile-time or run-time conditions. +

+ +

Compile-time conditions are referred to as "embarrassingly +parallel," and are denoted with the appropriate dispatch object, ie +one of __gnu_parallel::sequential_tag, +__gnu_parallel::parallel_tag, +__gnu_parallel::balanced_tag, +__gnu_parallel::unbalanced_tag, +__gnu_parallel::omp_loop_tag, or +__gnu_parallel::omp_loop_static_tag. +

+ +

Run-time conditions depend on the hardware being used, the number +of threads available, etc., and are denoted by the use of the enum +__gnu_parallel::parallelism. Values of this enum include +__gnu_parallel::sequential, +__gnu_parallel::parallel_unbalanced, +__gnu_parallel::parallel_balanced, +__gnu_parallel::parallel_omp_loop, +__gnu_parallel::parallel_omp_loop_static, or +__gnu_parallel::parallel_taskqueue. +

+ +

Putting all this together, the general view of overloads for the +parallel algorithms look like this: +

+
    +
  • ISO C++ signature
  • +
  • ISO C++ signature + sequential_tag argument
  • +
  • ISO C++ signature + parallelism argument
  • +
+ +

Please note that the implementation may use additional functions +(designated with the _switch suffix) to dispatch from the +ISO C++ signature to the correct parallel version. Also, some of the +algorithms do not have support for run-time conditions, so the last +overload is therefore missing. +

+ + +

Relevant namespaces

+ +

One namespace contain versions of code that are explicitly sequential: +__gnu_serial. +

+ +

Two namespaces contain the parallel mode: +std::__parallel and __gnu_parallel. +

+ +

Parallel implementations of standard components, including +template helpers to select parallelism, are defined in namespace +std::__parallel. For instance, std::transform from +<algorithm> has a parallel counterpart in +std::__parallel::transform from +<parallel/algorithm>. In addition, these parallel +implementations are injected into namespace +__gnu_parallel with using declarations. +

+ +

Support and general infrastructure is in namespace +__gnu_parallel. +

+ +

More information, and an organized index of types and functions +related to the parallel mode on a per-namespace basis, can be found in +the generated source documentation. +

+ +

Testing

+ +

Both the normal conformance and regression tests and the +supplemental performance tests work.

+ +

To run the conformance and regression tests with the parallel mode +active,

+make check-parallel + +

The log and summary files for conformance testing are in the +testsuite/parallel directory.

+ +

To run the performance tests with the parallel mode active,

+make check-performance-parallel + +

The result file for performance testing are in the +testsuite directory, in the file +libstdc++_performance.sum. In addition, the policy-based +containers have their own visualizations, which have additional +software dependencies than the usual bare-boned text file, and can be +generated by using the make doc-performance rule in the +testsuite's Makefile.

+ +

Return to the top of the page or + to the libstdc++ homepage. +

+ + +

References / Further Reading

+ +

+Johannes Singler, Peter Sanders, Felix Putze. The Multi-Core Standard Template Library. Euro-Par 2007: Parallel Processing. (LNCS 4641) +

+ +

+Leonor Frias, Johannes Singler: Parallelization of Bulk Operations for STL Dictionaries. Workshop on Highly Parallel Processing on a Chip (HPPC) 2007. (LNCS) +

+ + + +
+

+See license.html for copying conditions. +Comments and suggestions are welcome, and may be sent to +the libstdc++ mailing list. +

+ + + + diff --git a/libstdc++-v3/doc/html/ext/pb_ds/PythonPoweredSmall.gif b/libstdc++-v3/doc/html/ext/pb_ds/PythonPoweredSmall.gif new file mode 100644 index 00000000000..268980706ab Binary files /dev/null and b/libstdc++-v3/doc/html/ext/pb_ds/PythonPoweredSmall.gif differ diff --git a/libstdc++-v3/doc/html/ext/pb_ds/acks.html b/libstdc++-v3/doc/html/ext/pb_ds/acks.html new file mode 100644 index 00000000000..6612a4a8184 --- /dev/null +++ b/libstdc++-v3/doc/html/ext/pb_ds/acks.html @@ -0,0 +1,65 @@ + + + + + + + Acknowledgments + + + + +
+

Acknowledgments

+ +
    +
  1. This library was partially written at IBM's Haifa Research + Labs.
  2. + +
  3. The library is based heavily on policy-based design and + uses many useful techniques from [alexandrescu01modern].
  4. + +
  5. Two ideas are borrowed from the SGI-STL implementation + [sgi_stl]: + +
      +
    1. The prime-based resize policies use a list of primes + taken from the SGI-STL implementation.
    2. + +
    3. The red-black trees contain both a root node and a + header node (containing metadata), connected in a way + that forward and reverse iteration can be performed + efficiently.
    4. +
    +
  6. + +
  7. Some test utilities borrow ideas from [boost_timer].
  8. + +
  9. We would like to thank Scott Meyers for useful comments + (without attributing to him any flaws in the design or + implementation of the library).
  10. + +
  11. Much of the documentation is [Python Powered] (especially through PyChart, Beautiful + Soup, and kjbuckets) + and uses [HTML tidy]. The CSS-driven menus are + slightly modified from Brothercake + (hopefully without introducing errors).
  12. +
+
+ + diff --git a/libstdc++-v3/doc/html/ext/pb_ds/assoc_container_tag_cd.png b/libstdc++-v3/doc/html/ext/pb_ds/assoc_container_tag_cd.png new file mode 100644 index 00000000000..16cc6da870d Binary files /dev/null and b/libstdc++-v3/doc/html/ext/pb_ds/assoc_container_tag_cd.png differ diff --git a/libstdc++-v3/doc/html/ext/pb_ds/assoc_container_tag_cd.svg b/libstdc++-v3/doc/html/ext/pb_ds/assoc_container_tag_cd.svg new file mode 100644 index 00000000000..02be6241647 --- /dev/null +++ b/libstdc++-v3/doc/html/ext/pb_ds/assoc_container_tag_cd.svg @@ -0,0 +1,491 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + Benjamin Kosnik + + + + + + + + + + + + basic_hash_table_tag + basic_tree_tag + + + tree_tag + trie_tag + + associative_container_tag + + + + + cc_hash_table_tag + gp_hash_table_tag + + + + + list_update_tag + + rb_tree_tag + splay_tree_tag + + + + pat_trie_tag + + ov_tree_tag + + diff --git a/libstdc++-v3/doc/html/ext/pb_ds/assoc_container_traits.html b/libstdc++-v3/doc/html/ext/pb_ds/assoc_container_traits.html new file mode 100644 index 00000000000..245b81c9409 --- /dev/null +++ b/libstdc++-v3/doc/html/ext/pb_ds/assoc_container_traits.html @@ -0,0 +1,170 @@ + + + + + + + container_traits Interface + + + + +
+

container_traits Interface

+ +

Traits of an associative-container based on its underlying + data structure.

+ +

Defined in: tag_and_trait.hpp

+ +

Template Parameters

+ + + + + + + + + + + + + + + + + +
ParameterDescriptionDefault Value
+
+class Cntnr
+
+
+

Container type.

+
-
+ +

Public Types and + Constants

+ +

Container Attributes

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
TypeDefinitionDescription
+
+invalidation_guarantee
+
+
+
+Invalidation guarantee.
+
+
+

Invalidation-guarantee type.

+ +

This is either basic_invalidation_guarantee, + point_invalidation_guarantee, or + range_invalidation_guarantee

+
+
+order_preserving
+
+
+
+True only if Cntnr objects guarantee storing  keys by order.
+
+
+

Order-preserving indicator.

+
+
+erase_can_throw
+
+
+
+True only if erasing a key can throw.
+
+
+

Erase-throw indicator.

+
+
+reverse_iteration
+
+
+
+True only reverse iterators are supported.
+
+
+

Reverse iteration indicator.

+
+
+split_join_can_throw
+
+
+
+True only if split or join operations can throw.
+
+
+

Split-join throw indicator.

+
+
+ + diff --git a/libstdc++-v3/doc/html/ext/pb_ds/assoc_design.html b/libstdc++-v3/doc/html/ext/pb_ds/assoc_design.html new file mode 100644 index 00000000000..6c501e26bbd --- /dev/null +++ b/libstdc++-v3/doc/html/ext/pb_ds/assoc_design.html @@ -0,0 +1,46 @@ + + + + + + + Associative Containers + + + + +
+

Associative-Container Design

+ +
    +
  1. Data-Structure Genericity
  2. + +
  3. Genericity discusses generic manipulation of + containers based on different underlying + data structures.
  4. + +
  5. Genericity discusses generic manipulation of + containers with different mapping semantics.
  6. + +
  7. Tree-Based + Containers describes the design and policies of + tree-based containers.
  8. + +
  9. Trie-Based + Containers describes the design and policies of + trie-based containers.
  10. + +
  11. Hash-Based + Containers describes the design and policies of + hash-based containers.
  12. + +
  13. List-Based + Containers describes the design and policies of + list-based containers with update policies.
  14. +
+
+ + diff --git a/libstdc++-v3/doc/html/ext/pb_ds/assoc_examples.html b/libstdc++-v3/doc/html/ext/pb_ds/assoc_examples.html new file mode 100644 index 00000000000..6c166987fcb --- /dev/null +++ b/libstdc++-v3/doc/html/ext/pb_ds/assoc_examples.html @@ -0,0 +1,174 @@ + + + + + + + Examples + + + + +
+

Associative-Container Examples

+ +

Basic Use

+ +
    +
  1. basic_map.cc + Basic use of "maps".
  2. + +
  3. basic_set.cc + Basic use of "sets".
  4. + +
  5. erase_if.cc + Conditionally erasing values from a container object.
  6. +
+ +

Generics

+ +
    +
  1. assoc_container_traits.cc + Using container_traits to query + about underlying data structure behavior.
  2. + +
  3. hash_find_neg.cc + A non-compiling example showing wrong use of finding keys in + hash-based containers.
  4. +
+ +

Hash-Based + Containers

+ + +

Resize + Related

+ + +
    +
  1. hash_initial_size.cc + Setting the initial size of a hash-based container + object.
  2. + +
  3. hash_resize_neg.cc + A non-compiling example showing how not to resize a + hash-based container object.
  4. + +
  5. hash_resize.cc + Resizing the size of a hash-based container object.
  6. + +
  7. hash_illegal_resize.cc + Showing an illegal resize of a hash-based container + object.
  8. + +
  9. hash_load_set_change.cc + Changing the load factors of a hash-based container + object.
  10. +
+ +

Hash-Function + Related

+ + +
    +
  1. hash_mod.cc + Using a modulo range-hashing function for the case of an + unknown skewed key distribution.
  2. + +
  3. shift_mask.cc + Writing a range-hashing functor for the case of a known + skewed key distribution.
  4. + +
  5. store_hash.cc + Storing the hash value along with each key.
  6. + +
  7. ranged_hash.cc + Writing a ranged-hash functor.
  8. +
+ +

Tree-Like Containers (Trees and + Tries)

+ + +

Node-Invariants

+ + +
    +
  1. tree_order_statistics.cc + Using trees for order statistics.
  2. + +
  3. tree_intervals.cc + Augmenting trees to support operations on line + intervals.
  4. +
+ +

Split and + Join

+ + +
    +
  1. tree_join.cc + Joining two tree-based container objects.
  2. + +
  3. trie_split.cc + Splitting a PATRICIA trie container object.
  4. + +
  5. tree_order_statistics_join.cc + Order statistics while joining two tree-based container + objects.
  6. +
+ +

Trie-Based + Containers

+ + +
    +
  1. trie_dna.cc + Using a PATRICIA trie for DNA strings.
  2. + +
  3. trie_prefix_search.cc + Using a PATRICIA trie for finding all entries whose key + matches a given prefix.
  4. +
+ +

"Multimaps" and + "Multisets".

+
    +
  1. basic_multimap.cc + Basic use of "multimaps".
  2. + +
  3. basic_multiset.cc + Basic use of "multisets".
  4. +
+
+ + diff --git a/libstdc++-v3/doc/html/ext/pb_ds/assoc_performance_tests.html b/libstdc++-v3/doc/html/ext/pb_ds/assoc_performance_tests.html new file mode 100644 index 00000000000..642f8480953 --- /dev/null +++ b/libstdc++-v3/doc/html/ext/pb_ds/assoc_performance_tests.html @@ -0,0 +1,345 @@ + + + + + +Associative-Container Performance Tests + + + +
+

Associative-Container + Performance Tests

+

Settings

+

This section describes performance tests and their results. + In the following, g++, msvc++, and local (the build used for generating this + documentation) stand for three different builds:

+
+
+

g++

+
    +
  • CPU speed - cpu MHz : 2660.644
  • +
  • Memory - MemTotal: 484412 kB
  • +
  • Platform - + Linux-2.6.12-9-386-i686-with-debian-testing-unstable
  • +
  • Compiler - g++ (GCC) 4.0.2 20050808 (prerelease) + (Ubuntu 4.0.1-4ubuntu9) Copyright (C) 2005 Free Software + Foundation, Inc. This is free software; see the source + for copying conditions. There is NO warranty; not even + for MERCHANTABILITY or FITNESS FOR A PARTICULAR + PURPOSE.
  • +
+
+
+
+
+
+

msvc++

+
    +
  • CPU speed - cpu MHz : 2660.554
  • +
  • Memory - MemTotal: 484412 kB
  • +
  • Platform - Windows XP Pro
  • +
  • Compiler - Microsoft (R) 32-bit C/C++ Optimizing + Compiler Version 13.10.3077 for 80x86 Copyright (C) + Microsoft Corporation 1984-2002. All rights + reserved.
  • +
+
+
+
+

local

    +
  • CPU speed - cpu MHz : 2250.000
  • +
  • Memory - MemTotal: 2076248 kB
  • +
  • Platform - Linux-2.6.16-1.2133_FC5-i686-with-redhat-5-Bordeaux
  • +
  • Compiler - g++ (GCC) 4.1.1 20060525 (Red Hat 4.1.1-1) +Copyright (C) 2006 Free Software Foundation, Inc. +This is free software; see the source for copying conditions. There is NO +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +
  • +
+
+

Tests

+

Hash-Based + Containers

+
    +
  1. Hash-Based + Text find Find Timing Test
  2. +
  3. Hash-Based + Random-Integer find Find Timing Test
  4. +
  5. Hash-Based + Random-Integer Subscript Find Timing Test
  6. +
  7. Hash-Based + Random-Integer Subscript Insert Timing Test
  8. +
  9. Hash-Based + Skewed-Distribution Random-Integer find Find Timing + Test
  10. +
  11. Hash-Based Erase + Memory Use Test
  12. +
+

Tree-Like-Based Containers

+
    +
  1. Tree-Based + and Trie-Based Text Insert Timing Test
  2. +
  3. Tree-Based + and Trie-Based Text find Find Timing Test
  4. +
  5. Tree-Based + Locality-of-Reference Text find Find Timing + Test
  6. +
  7. Tree-Based + Random-Integer find Find Timing Test
  8. +
  9. Tree Split and + Join Timing Test
  10. +
  11. Tree + Order-Statistics Timing Test
  12. +
+

Multimaps

+
    +
  1. "Multimap" + Text Find Timing Test with Small Average Secondary-Key + to Primary-Key Ratio
  2. +
  3. "Multimap" + Text Find Timing Test with Large Average Secondary-Key + to Primary-Key Ratio
  4. +
  5. "Multimap" + Text Insert Timing Test with Small Average + Secondary-Key to Primary-Key Ratio
  6. +
  7. "Multimap" + Text Insert Timing Test with Large Average + Secondary-Key to Primary-Key Ratio
  8. +
  9. "Multimap" + Text Insert Memory-Use Test with Small Average + Secondary-Key to Primary-Key Ratio
  10. +
  11. "Multimap" + Text Insert Memory-Use Test with Large Average + Secondary-Key to Primary-Key Ratio
  12. +
+

Observations

+

Underlying Data-Structure Families

+

In general, hash-based containers (see Design::Associative + Containers::Hash-Based Containers) have better timing + performance than containers based on different underlying-data + structures. The main reason to choose a tree-based (see + Design::Associative + Containers::Tree-Based Containers) or trie-based container + (see Design::Associative + Containers::Trie-Based Containers) is if a byproduct of the + tree-like structure is required: either order-preservation, or + the ability to utilize node invariants (see Design::Associative + Containers::Tree-Based Containers::Node Invariants and + Design::Associative + Containers::Trie-Based Containers::Node Invariants). If + memory-use is the major factor, an ordered-vector tree (see + Design::Associative + Containers::Tree-Based Containers) gives optimal results + (albeit with high modificiation costs), and a list-based + container (see Design::Associative + Containers::List-Based Containers) gives reasonable + results.

+

Hash-Based + Container Types

+

Hash-based containers are typically either collision + chaining or probing (see Design::Associative + Containers::Hash-Based Containers). Collision-chaining + containers are more flexible internally, and so offer better + timing performance. Probing containers, if used for simple + value-types, manage memory more efficiently (they perform far + fewer allocation-related calls). In general, therefore, a + collision-chaining table should be used. A probing container, + conversely, might be used efficiently for operations such as + eliminating duplicates in a sequence, or counting the number of + occurrences within a sequence. Probing containers might be more + useful also in multithreaded applications where each thread + manipulates a hash-based container: in the STL, allocators have + class-wise semantics (see [meyers96more] - Item 10); a + probing container might incur less contention in this case.

+

Hash-Based Containers' Policies

+

In hash-based containers, the range-hashing scheme (see + Design::Associative + Containers::Hash-Based Containers::Hash Policies) seems to + affect performance more than other considerations. In most + settings, a mask-based scheme works well (or can be made to + work well). If the key-distribution can be estimated a-priori, + a simple hash function can produce nearly uniform hash-value + distribution. In many other cases (e.g., text hashing, + floating-point hashing), the hash function is powerful enough + to generate hash values with good uniformity properties + [knuth98sorting]; + a modulo-based scheme, taking into account all bits of the hash + value, appears to overlap the hash function in its effort.

+

The range-hashing scheme determines many of the other + policies (see Design::Hash-Based + Containers::Policy Interaction). A mask-based scheme works + well with an exponential-size policy (see Design::Associative + Containers::Hash-Based Containers::Resize Policies) ; for + probing-based containers, it goes well with a linear-probe + function (see Design::Associative + Containers::Hash-Based Containers::Hash Policies).

+

An orthogonal consideration is the trigger policy (see + Design::Associative + Containers::Hash-Based Containers::Resize Policies). This + presents difficult tradeoffs. E.g., different load + factors in a load-check trigger policy yield a + space/amortized-cost tradeoff.

+

Tree-Like-Based Container + Types

+

In general, there are several families of tree-based + underlying data structures: balanced node-based trees + (e.g., red-black or AVL trees), high-probability + balanced node-based trees (e.g., random treaps or + skip-lists), competitive node-based trees (e.g., splay + trees), vector-based "trees", and tries. (Additionally, there + are disk-residing or network-residing trees, such as B-Trees + and their numerous variants. An interface for this would have + to deal with the execution model and ACID guarantees; this is + out of the scope of this library.) Following are some + observations on their application to different settings.

+

Of the balanced node-based trees, this library includes a + red-black tree (see Design::Associative + Containers::Tree-Based Containers), as does STL (in + practice). This type of tree is the "workhorse" of tree-based + containers: it offers both reasonable modification and + reasonable lookup time. Unfortunately, this data structure + stores a huge amount of metadata. Each node must contain, + besides a value, three pointers and a boolean. This type might + be avoided if space is at a premium [austern00noset].

+

High-probability balanced node-based trees suffer the + drawbacks of deterministic balanced trees. Although they are + fascinating data structures, preliminary tests with them showed + their performance was worse than red-black trees. The library + does not contain any such trees, therefore.

+

Competitive node-based trees have two drawbacks. They are + usually somewhat unbalanced, and they perform a large number of + comparisons. Balanced trees perform one comparison per each + node they encounter on a search path; a splay tree performs two + comparisons. If the keys are complex objects, e.g., + std::string, this can increase the running time. + Conversely, such trees do well when there is much locality of + reference. It is difficult to determine in which case to prefer + such trees over balanced trees. This library includes a splay + tree (see Design::Associative + Containers::Tree-Based Containers).

+

Ordered-vector trees (see Design::Associative + Containers::Tree-Based Containers) use very little space + [austern00noset]. + They do not have any other advantages (at least in this + implementation).

+

Large-fan-out PATRICIA tries (see Design::Associative + Containers::Trie-Based Containers) have excellent lookup + performance, but they do so through maintaining, for each node, + a miniature "hash-table". Their space efficiency is low, and + their modification performance is bad. These tries might be + used for semi-static settings, where order preservation is + important. Alternatively, red-black trees cross-referenced with + hash tables can be used. [okasaki98mereable] + discusses small-fan-out PATRICIA tries for integers, but the + cited results seem to indicate that the amortized cost of + maintaining such trees is higher than that of balanced trees. + Moderate-fan-out trees might be useful for sequences where each + element has a limited number of choices, e.g., DNA + strings (see Examples::Associative + Containers::Trie-Based Containers).

+

Mapping-Semantics + Considerations

+

Different mapping semantics were discussed in Motivation::Associative + Containers::Alternative to Multiple Equivalent Keys and + Tutorial::Associative + Containers::Associative Containers Others than Maps. We + will focus here on the case where a keys can be composed into + primary keys and secondary keys. (In the case where some keys + are completely identical, it is trivial that one should use an + associative container mapping values to size types.) In this + case there are (at least) five possibilities:

+
    +
  1. Use an associative container that allows equivalent-key + values (such as std::multimap)
  2. +
  3. Use a unique-key value associative container that maps + each primary key to some complex associative container of + secondary keys, say a tree-based or hash-based container (see + Design::Associative + Containers::Tree-Based Containers and Design::Associative + Containers::Hash-Based Containers)
  4. +
  5. Use a unique-key value associative container that maps + each primary key to some simple associative container of + secondary keys, say a list-based container (see Design::Associative + Containers::List-Based Containers)
  6. +
  7. Use a unique-key value associative container that maps + each primary key to some non-associative container + (e.g., std::vector)
  8. +
  9. Use a unique-key value associative container that takes + into account both primary and secondary keys.
  10. +
+

We do not think there is a simple answer for this (excluding + option 1, which we think should be avoided in all cases).

+

If the expected ratio of secondary keys to primary keys is + small, then 3 and 4 seem reasonable. Both types of secondary + containers are relatively lightweight (in terms of memory use + and construction time), and so creating an entire container + object for each primary key is not too expensive. Option 4 + might be preferable to option 3 if changing the secondary key + of some primary key is frequent - one cannot modify an + associative container's key, and the only possibility, + therefore, is erasing the secondary key and inserting another + one instead; a non-associative container, conversely, can + support in-place modification. The actual cost of erasing a + secondary key and inserting another one depends also on the + allocator used for secondary associative-containers (The tests + above used the standard allocator, but in practice one might + choose to use, e.g., [boost_pool]). Option 2 is + definitely an overkill in this case. Option 1 loses out either + immediately (when there is one secondary key per primary key) + or almost immediately after that. Option 5 has the same + drawbacks as option 2, but it has the additional drawback that + finding all values whose primary key is equivalent to some key, + might be linear in the total number of values stored (for + example, if using a hash-based container).

+

If the expected ratio of secondary keys to primary keys is + large, then the answer is more complicated. It depends on the + distribution of secondary keys to primary keys, the + distribution of accesses according to primary keys, and the + types of operations most frequent.

+

To be more precise, assume there are m primary keys, + primary key i is mapped to ni + secondary keys, and each primary key is mapped, on average, to + n secondary keys (i.e., + E(ni) = n).

+

Suppose one wants to find a specific pair of primary and + secondary keys. Using 1 with a tree based container + (std::multimap), the expected cost is + E(Θ(log(m) + ni)) = Θ(log(m) + + n); using 1 with a hash-based container + (std::tr1::unordered_multimap), the expected cost is + Θ(n). Using 2 with a primary hash-based container + and secondary hash-based containers, the expected cost is + O(1); using 2 with a primary tree-based container and + secondary tree-based containers, the expected cost is (using + the Jensen inequality [motwani95random]) + E(O(log(m) + log(ni)) = O(log(m)) + + E(O(log(ni)) = O(log(m)) + O(log(n)), + assuming that primary keys are accessed equiprobably. 3 and 4 + are similar to 1, but with lower constants. Using 5 with a + hash-based container, the expected cost is O(1); using 5 + with a tree based container, the cost is + E(Θ(log(mn))) = Θ(log(m) + + log(n)).

+

Suppose one needs the values whose primary key matches some + given key. Using 1 with a hash-based container, the expected + cost is Θ(n), but the values will not be ordered + by secondary keys (which may or may not be required); using 1 + with a tree-based container, the expected cost is + Θ(log(m) + n), but with high constants; again the + values will not be ordered by secondary keys. 2, 3, and 4 are + similar to 1, but typically with lower constants (and, + additionally, if one uses a tree-based container for secondary + keys, they will be ordered). Using 5 with a hash-based + container, the cost is Θ(mn).

+

Suppose one wants to assign to a primary key all secondary + keys assigned to a different primary key. Using 1 with a + hash-based container, the expected cost is Θ(n), + but with very high constants; using 1 with a tree-based + container, the cost is Θ(nlog(mn)). Using 2, 3, + and 4, the expected cost is Θ(n), but typically + with far lower costs than 1. 5 is similar to 1.

+
+ + diff --git a/libstdc++-v3/doc/html/ext/pb_ds/assoc_regression_tests.html b/libstdc++-v3/doc/html/ext/pb_ds/assoc_regression_tests.html new file mode 100644 index 00000000000..178aadf985f --- /dev/null +++ b/libstdc++-v3/doc/html/ext/pb_ds/assoc_regression_tests.html @@ -0,0 +1,96 @@ + + + + + + + Associative-Container Regression Tests + + + + +
+

Associative-Container Regression Tests

+ +

Description

+ +

The library contains a single comprehensive regression test. + For a given container type in pb_ds, the test creates + an object of the container type and an object of the + corresponding STL type (e.g., std::set). It + then performs a random sequence of methods with random + arguments (e.g., inserts, erases, and so forth) on both + objects. At each operation, the test checks the return value of + the method, and optionally both compares pb_ds's + object with the STL's object as well as performing other + consistency checks on pb_ds's object (e.g., + order preservation, when applicable, or node invariants, when + applicable).

+ +

Additionally, the test integrally checks exception safety + and resource leaks. This is done as follows. A special + allocator type, written for the purpose of the test, both + randomly throws an exceptions when allocations are performed, + and tracks allocations and de-allocations. The exceptions thrown + at allocations simulate memory-allocation failures; the + tracking mechanism checks for memory-related bugs (e.g., + resource leaks and multiple de-allocations). Both + pb_ds's containers and the containers' value-types are + configured to use this allocator.

+ +

Due to compiler constraints, the test is split into the + several sources, each checking only some containers.

+ +

Tests

+ +

"Set" + Tests

+ +

The following check all "set" types:

+ +
    +
  1. hash_no_data_map_rand.cc + checks all hash-based "set" types.
  2. + +
  3. list_update_no_data_map_rand.cc + checks all list-based "set" types.
  4. + +
  5. tree_no_data_map_rand.cc + checks all tree-based "set" types.
  6. + +
  7. trie_no_data_map_rand.cc + checks all PATRICIA-trie-based "set" types.
  8. +
+ +

"Map" + Tests

+ +

The following check all "map" types:

+ +
    +
  1. hash_data_map_rand.cc + checks all hash-based "map" types.
  2. + +
  3. list_update_data_map_rand.cc + checks all list-based "map" types.
  4. + +
  5. tree_data_map_rand.cc + checks all tree-based "map" types.
  6. + +
  7. trie_data_map_rand.cc + checks all PATRICIA-trie-based "map" types.
  8. +
+
+ + diff --git a/libstdc++-v3/doc/html/ext/pb_ds/assoc_tests.html b/libstdc++-v3/doc/html/ext/pb_ds/assoc_tests.html new file mode 100644 index 00000000000..6e4474945d3 --- /dev/null +++ b/libstdc++-v3/doc/html/ext/pb_ds/assoc_tests.html @@ -0,0 +1,24 @@ + + + + + + + Associative-Container Tests + + + + +
+

Associative-Container Tests

+ +

Associative-Container + Regression Tests describes the regression tests; Associative-Container + Performance Tests describes the performance tests.

+
+ + diff --git a/libstdc++-v3/doc/html/ext/pb_ds/associative_container_tag.html b/libstdc++-v3/doc/html/ext/pb_ds/associative_container_tag.html new file mode 100644 index 00000000000..5c44efe231c --- /dev/null +++ b/libstdc++-v3/doc/html/ext/pb_ds/associative_container_tag.html @@ -0,0 +1,47 @@ + + + + + + + associative_container_tag Interface + + + + +
+

associative_container_tag Interface

+ +

Basic associative-container data structure tag.

+ +

Defined in: tag_and_trait.hpp

+ +

Base Classes

+ + + + + + + + + + + + + +
ClassDerivation Type
+
+container_tag
+
+
+

public

+
+
+ + diff --git a/libstdc++-v3/doc/html/ext/pb_ds/balls_and_bins.png b/libstdc++-v3/doc/html/ext/pb_ds/balls_and_bins.png new file mode 100644 index 00000000000..529c3ae41bc Binary files /dev/null and b/libstdc++-v3/doc/html/ext/pb_ds/balls_and_bins.png differ diff --git a/libstdc++-v3/doc/html/ext/pb_ds/basic_hash_table.html b/libstdc++-v3/doc/html/ext/pb_ds/basic_hash_table.html new file mode 100644 index 00000000000..a6c569c2bb1 --- /dev/null +++ b/libstdc++-v3/doc/html/ext/pb_ds/basic_hash_table.html @@ -0,0 +1,436 @@ + + + + + + + basic_hash_table Interface + + + + +
+

basic_hash_table Interface

+ +

An abstract basic hash-based associative container.

+ +

Defined in: assoc_container.hpp

+ +

Template Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterDescriptionDefault Value
+
+typename Key
+
+
+

Key type.

+
-
+
+typename Mapped
+
+
+

Mapped type.

+
-
+
+class Hash_Fn
+
+
+

Hash functor.

+
-
+
+class Eq_Fn
+
+
+

Equivalence functor.

+
-
+
+class Resize_Policy
+
+
+

Resize policy.

+
-
+
+bool Store_Hash
+
+
+

Indicates whether the hash value will be stored along + with each key.

+
-
+
+class Tag
+
+
+

Mapped-structure tag.

+
-
+
+class Allocator
+
+
+

Allocator type.

+
-
+ +

Base Classes

+ + + + + + + + + + + + + + + + + + + +
ClassDerivation Type
+
+Resize_Policy
+
+
+

public

+
+
+container_base
+
+
+

public

+
+ +

Public Types and + Constants

+ +

Policy Definitions

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
TypeDefinitionDescription
+
+hash_fn
+
+
+
+Hash_Fn
+
+
+

Hash functor type.

+
+
+eq_fn
+
+
+
+Eq_Fn
+
+
+

Equivalence functor type.

+
+
+resize_policy
+
+
+
+Resize_Policy
+
+
+

Resize policy type.

+
+
+store_hash
+
+
+
+Store_Hash
+
+
+

Indicates whether a hash value is stored with each + entry.

+
+ +

Public Methods

+ +

Constructors, Destructor, and + Related

+ + + + + + + + + + + + + +
MethodDescription
+
+virtual 
+  ~basic_hash_table
+  ()
+
+
+

Destructor.

+
+ +

Policy Access Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDescription
+
+hash_fn &
+  get_hash_fn
+  ()
+
+
+

Access to the hash_fn object.

+
+
+const hash_fn &
+  get_hash_fn
+  () const
+
+
+

Const access to the hash_fn object.

+
+
+eq_fn &
+  get_eq_fn
+  ()
+
+
+

Access to the eq_fn + object.

+
+
+const eq_fn &
+  get_eq_fn
+  () const
+
+
+

Const access to the eq_fn object.

+
+
+resize_policy &
+  get_resize_policy
+  ()
+
+
+

Access to the resize_policy + object.

+
+
+const resize_policy &
+  get_resize_policy
+  () const
+
+
+

Const access to the resize_policy + object.

+
+ +

Private Methods

+ +

Resize Methods

+ + + + + + + + + + + + + +
MethodDescription
+
+virtual void 
+  do_resize
+  (size_type new_size)
+
+
+

Resizes the container object to new_size.

+
+
+ + diff --git a/libstdc++-v3/doc/html/ext/pb_ds/basic_hash_tag.html b/libstdc++-v3/doc/html/ext/pb_ds/basic_hash_tag.html new file mode 100644 index 00000000000..8110c0dfc4f --- /dev/null +++ b/libstdc++-v3/doc/html/ext/pb_ds/basic_hash_tag.html @@ -0,0 +1,47 @@ + + + + + + + basic_hash_tag Interface + + + + +
+

basic_hash_tag Interface

+ +

Basic hash data structure tag.

+ +

Defined in: tag_and_trait.hpp

+ +

Base Classes

+ + + + + + + + + + + + + +
ClassDerivation Type
+
+associative_container_tag
+
+
+

public

+
+
+ + diff --git a/libstdc++-v3/doc/html/ext/pb_ds/basic_invalidation_guarantee.html b/libstdc++-v3/doc/html/ext/pb_ds/basic_invalidation_guarantee.html new file mode 100644 index 00000000000..c4c242bbded --- /dev/null +++ b/libstdc++-v3/doc/html/ext/pb_ds/basic_invalidation_guarantee.html @@ -0,0 +1,26 @@ + + + + + + + basic_invalidation_guarantee Interface + + + + +
+

basic_invalidation_guarantee Interface

+ +

Signifies a basic invalidation guarantee that any iterator, + pointer, or reference to a container object's mapped value type + is valid as long as the container is not modified.

+ +

Defined in: tag_and_trait.hpp

+
+ + diff --git a/libstdc++-v3/doc/html/ext/pb_ds/basic_tree.html b/libstdc++-v3/doc/html/ext/pb_ds/basic_tree.html new file mode 100644 index 00000000000..f66d7a9f7a6 --- /dev/null +++ b/libstdc++-v3/doc/html/ext/pb_ds/basic_tree.html @@ -0,0 +1,660 @@ + + + + + + + basic_tree Interface + + + + +
+

basic_tree Interface

+ +

An abstract basic tree-like-based associative container.

+ +

Defined in: assoc_container.hpp

+ +

Template Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterDescriptionDefault Value
+
+typename Key
+
+
+

Key type.

+
-
+
+typename Mapped
+
+
+

Mapped type.

+
-
+
+class Tag
+
+
+

Mapped-structure tag.

+
-
+
+class Node_Update
+
+
+

Node updater.

+ +

Restores node-invariants when invalidated.

+
-
+
+class Policy_Tl
+
+
+

Policy typelist.

+ +

Contains subclasses' policies.

+
-
+
+class Allocator
+
+
+

Allocator type.

+
-
+ +

Base Classes

+ + + + + + + + + + + + + + + + + + + +
ClassDerivation Type
+
+Node_Update
+
+
+

public

+
+
+container_base
+
+
+

public

+
+ +

Public Types and + Constants

+ +

Key-Type Definitions

+ + + + + + + + + + + + + + + + + +
TypeDefinitionDescription
+
+const_key_reference
+
+
+
+typename container_base::const_key_reference
+
+
+

Const key reference type.

+
+ +

Policy Definitions

+ + + + + + + + + + + + + + + + + +
TypeDefinitionDescription
+
+node_update
+
+
+
+Node_Update
+
+
+

Node updater type.

+
+ +

Iterator Definitions

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
TypeDefinitionDescription
+
+const_iterator
+
+
+
+typename container_base::const_iterator
+
+
+

Const range-type iterator.

+
+
+iterator
+
+
+
+typename container_base::iterator
+
+
+

Range-type iterator.

+
+
+const_reverse_iterator
+
+
+
+Const reverse range-type iterator.
+
+
+

Const reverse range-type iterator.

+
+
+reverse_iterator
+
+
+
+Reverse range-type iterator.
+If Mapped is null_mapped_type, then this is synonymous to const_reverse_iterator +
+
+

Reverse range-type iterator.

+
+ +

Public Methods

+ +

Constructors, Destructor, and + Related

+ + + + + + + + + + + + + +
MethodDescription
+
+virtual 
+  ~basic_tree
+  ()
+
+
+

Destructor.

+
+ +

Policy Access Methods

+ + + + + + + + + + + + + + + + + + + +
MethodDescription
+
+node_update &
+  get_node_update
+  ()
+
+
+

Access to the node_update + object.

+
+
+const node_update &
+  get_node_update
+  () const
+
+
+

Const access to the node_update + object.

+
+ +

Find Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDescription
+
+iterator
+  lower_bound
+  (const_key_reference r_key)
+
+
+

Returns an iterator corresponding + to the entry whose key is the smallest one at least as + large as r_key.

+
+
+const_iterator
+  lower_bound
+  (const_key_reference r_key) const
+
+
+

Returns a const iterator corresponding + to the entry whose key is the smallest one at least as + large as r_key.

+
+
+iterator
+  upper_bound
+  (const_key_reference r_key)
+
+
+

Returns an iterator corresponding + to the entry whose key is the smallest one larger than + r_key.

+
+
+const_iterator
+  upper_bound
+  (const_key_reference r_key) const
+
+
+

Returns a const_iterator + corresponding to the entry whose key is the smallest one + larger than r_key.

+
+ +

Erase Methods

+ + + + + + + + + + + + + + + + + + + +
MethodDescription
+
+iterator
+  erase
+  (iterator it)
+
+
+

Erases the value_type corresponding to the iterator it. Returns the iterator corresponding + to the next value_type.

+
+
+reverse_iterator
+  erase
+  (reverse_iterator it)
+
+
+

Erases the value_type corresponding to the reverse_iterator + it. Returns the reverse_iterator + corresponding to the previous value_type.

+
+ +

Iteration Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDescription
+
+reverse_iterator
+  rbegin
+  ()
+
+
+

Returns a reverse_iterator + corresponding to the last value_type in the + container.

+
+
+const_reverse_iterator
+  rbegin
+  () const
+
+
+

Returns a const_reverse_iterator + corresponding to the last value_type in the + container.

+
+
+reverse_iterator
+  rend
+  ()
+
+
+

Returns a reverse_iterator + corresponding to the just-before-first value_type in the + container.

+
+
+const_reverse_iterator
+  rend
+  () const
+
+
+

Returns a const_reverse_iterator + corresponding to the just-before-first value_type in the + container.

+
+ +

Split and join + Methods

+ + + + + + + + + + + + + + + + + + + +
MethodDescription
+
+void 
+  join
+  (basic_tree &other)
+
+
+

Joins two trees. When this function returns, + other will be + empty.

+ +

When calling this method, other's keys must be all larger or + all smaller than this object's keys, and other's policies must be + equivalent to this object's policies.

+
+
+void
+  split
+  (const_key_reference r_key, 
+    basic_tree &other)
+
+
+

Splits into two trees. When this function returns, + other will contain + only keys larger than r_key.

+ +

When calling this method, other's policies must be + equivalent to this object's policies.

+
+
+ + diff --git a/libstdc++-v3/doc/html/ext/pb_ds/basic_tree_assoc_container_const_node_iterator.html b/libstdc++-v3/doc/html/ext/pb_ds/basic_tree_assoc_container_const_node_iterator.html new file mode 100644 index 00000000000..5647f551e95 --- /dev/null +++ b/libstdc++-v3/doc/html/ext/pb_ds/basic_tree_assoc_container_const_node_iterator.html @@ -0,0 +1,383 @@ + + + + + + + tree::const_node_iterator + Interface + + + + +
+

tree::const_node_iterator + Interface

+ +

Const node iterator.

+ +

This is an &qout;iterator to an iterator&qout; - it + iterates over nodes, and de-referencing it returns one of the + tree's iterators

+ +

Public Types and + Constants

+ +

Iterator Definitions

+ + + + + + + + + + + + + + + + + + + + + + + + + +
TypeDefinitionDescription
+
+iterator_category
+
+
+
+trivial_iterator_tag
+
+
+

Category.

+ +

This tag identifies that the iterator has none of the + STL's iterators' movement abilities.

+
+
+difference_type
+
+
+
+void
+
+
+

Difference type.

+
+ +

Value-Type Definitions

+ +

Note that a node iterator's value type is actually a tree + iterator.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
TypeDefinitionDescription
+
+value_type
+
+
+
+container_base::const_iterator
+
+
+

Iterator's value type.

+
+
+reference
+
+
+
+container_base::const_iterator
+
+
+

Iterator's reference type.

+
+
+const_reference
+
+
+
+container_base::const_iterator
+
+
+

Iterator's const reference type.

+
+ +

Metadata Definitions

+ +

These are only defined if + basic_tree::Node_Update + is not null_tree_node_update

+ + + + + + + + + + + + + + + + + + + + + + + + + +
TypeDefinitionDescription
+
+metadata_type
+
+
+
+typename basic_tree::Node_Update::metadata_type
+
+
+

Metadata type.

+
+
+const_metadata_reference
+
+
+
+typename Allocator::template rebind<
+    metadata_type>::other::const_reference
+
+
+

Const metadata reference type.

+
+ +

Public Methods

+ +

Constructors, Destructor, and + Related

+ + + + + + + + + + + + + +
MethodDescription
+
+inline 
+  const_node_iterator
+  ()
+
+
+

Default constructor.

+
+ +

Access Methods

+ + + + + + + + + + + + + +
MethodDescription
+
+inline const_reference
+  operator*
+  () const
+
+
+

Access.

+
+ +

Metadata Access Methods

+ +

These are only defined if + basic_tree::Node_Update + is not null_tree_node_update

+ + + + + + + + + + + + + +
MethodDescription
+
+inline const_metadata_reference
+  get_metadata
+  () const
+
+
+

Metadata access.

+
+ +

Movement Methods

+ + + + + + + + + + + + + + + + + + + +
MethodDescription
+
+inline const_node_iterator
+  get_l_child
+  () const
+
+
+

Returns the const node iterator associated with the + left node.

+
+
+inline const_node_iterator
+  get_r_child
+  () const
+
+
+

Returns the const node iterator associated with the + right node.

+
+ +

Comparison Methods

+ + + + + + + + + + + + + + + + + + + +
MethodDescription
+
+inline bool
+  operator==
+  (const const_node_iterator &other) const
+
+
+

Compares to a different iterator object.

+
+
+inline bool
+  operator!=
+  (const const_node_iterator &other) const
+
+
+

Compares (negatively) to a different iterator + object.

+
+
+ + diff --git a/libstdc++-v3/doc/html/ext/pb_ds/basic_tree_tag.html b/libstdc++-v3/doc/html/ext/pb_ds/basic_tree_tag.html new file mode 100644 index 00000000000..c35ecad4a2d --- /dev/null +++ b/libstdc++-v3/doc/html/ext/pb_ds/basic_tree_tag.html @@ -0,0 +1,47 @@ + + + + + + + basic_tree_tag Interface + + + + +
+

basic_tree_tag Interface

+ +

Basic tree-like data structure tag.

+ +

Defined in: tag_and_trait.hpp

+ +

Base Classes

+ + + + + + + + + + + + + +
ClassDerivation Type
+
+associative_container_tag
+
+
+

public

+
+
+ + diff --git a/libstdc++-v3/doc/html/ext/pb_ds/binary_heap_tag.html b/libstdc++-v3/doc/html/ext/pb_ds/binary_heap_tag.html new file mode 100644 index 00000000000..47f42477be3 --- /dev/null +++ b/libstdc++-v3/doc/html/ext/pb_ds/binary_heap_tag.html @@ -0,0 +1,47 @@ + + + + + + + binary_heap_tag Interface + + + + +
+

binary_heap_tag Interface

+ +

Binary-heap (array-based) data structure tag.

+ +

Defined in: tag_and_trait.hpp

+ +

Base Classes

+ + + + + + + + + + + + + +
ClassDerivation Type
+
+priority_queue_tag
+
+
+

public

+
+
+ + diff --git a/libstdc++-v3/doc/html/ext/pb_ds/binary_priority_queue_random_int_push_timing_test_gcc.png b/libstdc++-v3/doc/html/ext/pb_ds/binary_priority_queue_random_int_push_timing_test_gcc.png new file mode 100644 index 00000000000..07f0953a661 Binary files /dev/null and b/libstdc++-v3/doc/html/ext/pb_ds/binary_priority_queue_random_int_push_timing_test_gcc.png differ diff --git a/libstdc++-v3/doc/html/ext/pb_ds/binary_priority_queue_random_int_push_timing_test_local.png b/libstdc++-v3/doc/html/ext/pb_ds/binary_priority_queue_random_int_push_timing_test_local.png new file mode 100644 index 00000000000..76e02f134f0 Binary files /dev/null and b/libstdc++-v3/doc/html/ext/pb_ds/binary_priority_queue_random_int_push_timing_test_local.png differ diff --git a/libstdc++-v3/doc/html/ext/pb_ds/binary_priority_queue_random_int_push_timing_test_msvc.png b/libstdc++-v3/doc/html/ext/pb_ds/binary_priority_queue_random_int_push_timing_test_msvc.png new file mode 100644 index 00000000000..b8a3b237124 Binary files /dev/null and b/libstdc++-v3/doc/html/ext/pb_ds/binary_priority_queue_random_int_push_timing_test_msvc.png differ diff --git a/libstdc++-v3/doc/html/ext/pb_ds/binomial_heap_tag.html b/libstdc++-v3/doc/html/ext/pb_ds/binomial_heap_tag.html new file mode 100644 index 00000000000..6b5e849e42b --- /dev/null +++ b/libstdc++-v3/doc/html/ext/pb_ds/binomial_heap_tag.html @@ -0,0 +1,47 @@ + + + + + + + binomial_heap_tag Interface + + + + +
+

binomial_heap_tag Interface

+ +

Binomial-heap data structure tag.

+ +

Defined in: tag_and_trait.hpp

+ +

Base Classes

+ + + + + + + + + + + + + +
ClassDerivation Type
+
+priority_queue_tag
+
+
+

public

+
+
+ + diff --git a/libstdc++-v3/doc/html/ext/pb_ds/cc_hash_max_collision_check_resize_trigger.html b/libstdc++-v3/doc/html/ext/pb_ds/cc_hash_max_collision_check_resize_trigger.html new file mode 100644 index 00000000000..e07c51e3a64 --- /dev/null +++ b/libstdc++-v3/doc/html/ext/pb_ds/cc_hash_max_collision_check_resize_trigger.html @@ -0,0 +1,532 @@ + + + + + + + cc_hash_max_collision_check_resize_trigger + Interface + + + + +
+

cc_hash_max_collision_check_resize_trigger + Interface

+ +

A resize trigger policy based on collision checks. It keeps + the simulated load factor lower than some given load + factor.

+ +

Defined in: hash_policy.hpp

+ +

Template Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterDescriptionDefault Value
+
+bool External_Load_Access 
+
+
+

Specifies whether the load factor can be accessed + externally. The two options have different trade-offs in + terms of flexibility, genericity, and encapsulation.

+
false
+
+typename Size_Type 
+
+
+

Size type.

+
size_t
+ +

Public Types and + Constants

+ +

General Definitions

+ + + + + + + + + + + + + + + + + + + + + + + + + +
TypeDefinitionDescription
+
+size_type
+
+
+
+Size_Type
+
+
+

Size type.

+
+
+external_load_access
+
+
+
+External_Load_Access
+
+
+

Indicates whether loads can be accessed externally

+
+ +

Public Methods

+ +

Constructors, Destructor, and + Related

+ + + + + + + + + + + + + + + + + + + +
MethodDescription
+
+  cc_hash_max_collision_check_resize_trigger
+  (float load = 0.5)
+
+
+

Default constructor, or constructor taking + load, a load factor + which it will attempt to maintain.

+
+
+void
+  swap
+  (cc_hash_max_collision_check_resize_trigger &other)
+
+
+

Swaps content.

+
+ +

Load Access Methods

+ +

These methods are only available if the external access + parameter is set.

+ + + + + + + + + + + + + + + + + + + +
MethodDescription
+
+inline float
+  get_load
+  () const
+
+
+

Returns the current load.

+ +

Calling this method will not compile when External_Load_Access + == false.

+
+
+void 
+  set_load
+  (float load)
+
+
+

Sets the load; does + not resize the container.

+ +

It is the responsibility of the user to pass an + appropriate load to this + function. Calling this method will not compile when + External_Load_Access + == false.

+
+ +

Protected Methods

+ +

Insert Search + Notifications.

+ +

Notifications called during an insert operation.

+ + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDescription
+
+inline void
+  notify_insert_search_start
+  ()
+
+
+

Notifies a search started.

+
+
+inline void
+  notify_insert_search_collision
+  ()
+
+
+

Notifies a search encountered a collision.

+
+
+inline void
+  notify_insert_search_end
+  ()
+
+
+

Notifies a search ended.

+
+ +

Find Search + Notifications.

+ +

Notifications called during a find operation.

+ + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDescription
+
+inline void
+  notify_find_search_start
+  ()
+
+
+

Notifies a search started.

+
+
+inline void
+  notify_find_search_collision
+  ()
+
+
+

Notifies a search encountered a collision.

+
+
+inline void
+  notify_find_search_end
+  ()
+
+
+

Notifies a search ended.

+
+ +

Erase Search + Notifications.

+ +

Notifications called during an insert operation.

+ + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDescription
+
+inline void
+  notify_erase_search_start
+  ()
+
+
+

Notifies a search started.

+
+
+inline void
+  notify_erase_search_collision
+  ()
+
+
+

Notifies a search encountered a collision.

+
+
+inline void
+  notify_erase_search_end
+  ()
+
+
+

Notifies a search ended.

+
+ +

Content Change + Notifications

+ +

Notifications called when the content of the table changes + in a way that can affect the resize policy.

+ + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDescription
+
+inline void
+  notify_inserted
+  (size_type num_entries)
+
+
+

Notifies an element was inserted.

+
+
+inline void
+  notify_erased
+  (size_type num_entries)
+
+
+

Notifies an element was erased.

+
+
+void 
+  notify_cleared
+  ()
+
+
+

Notifies the table was cleared.

+
+ +

Size Change + Notifications

+ +

Notifications called when the table changes size.

+ + + + + + + + + + + + + + + + + + + +
MethodDescription
+
+void
+  notify_resized
+  (size_type new_size)
+
+
+

Notifies the table was resized as a result of this + object's signifying that a resize is needed.

+
+
+void
+  notify_externally_resized
+  (size_type new_size)
+
+
+

Notifies the table was resized externally.

+
+ +

Queries

+ +

Called to query whether/how to resize.

+ + + + + + + + + + + + + + + + + + + +
MethodDescription
+
+inline bool 
+  is_resize_needed
+  () const
+
+
+

Queries whether a resize is needed.

+
+
+inline bool
+  is_grow_needed
+  (size_type size, size_type num_entries) const
+
+
+

Queries whether a grow is needed.

+ +

This method is called only if this object indicated is + needed.

+
+
+ + diff --git a/libstdc++-v3/doc/html/ext/pb_ds/cc_hash_random_int_find_timing_test_gcc.png b/libstdc++-v3/doc/html/ext/pb_ds/cc_hash_random_int_find_timing_test_gcc.png new file mode 100644 index 00000000000..85b9eca4ff6 Binary files /dev/null and b/libstdc++-v3/doc/html/ext/pb_ds/cc_hash_random_int_find_timing_test_gcc.png differ diff --git a/libstdc++-v3/doc/html/ext/pb_ds/cc_hash_random_int_find_timing_test_local.png b/libstdc++-v3/doc/html/ext/pb_ds/cc_hash_random_int_find_timing_test_local.png new file mode 100644 index 00000000000..4f578c65b1e Binary files /dev/null and b/libstdc++-v3/doc/html/ext/pb_ds/cc_hash_random_int_find_timing_test_local.png differ diff --git a/libstdc++-v3/doc/html/ext/pb_ds/cc_hash_random_int_find_timing_test_msvc.png b/libstdc++-v3/doc/html/ext/pb_ds/cc_hash_random_int_find_timing_test_msvc.png new file mode 100644 index 00000000000..d1234aa11d8 Binary files /dev/null and b/libstdc++-v3/doc/html/ext/pb_ds/cc_hash_random_int_find_timing_test_msvc.png differ diff --git a/libstdc++-v3/doc/html/ext/pb_ds/cc_hash_random_int_subscript_timing_test_find_gcc.png b/libstdc++-v3/doc/html/ext/pb_ds/cc_hash_random_int_subscript_timing_test_find_gcc.png new file mode 100644 index 00000000000..1db2cc0c6a8 Binary files /dev/null and b/libstdc++-v3/doc/html/ext/pb_ds/cc_hash_random_int_subscript_timing_test_find_gcc.png differ diff --git a/libstdc++-v3/doc/html/ext/pb_ds/cc_hash_random_int_subscript_timing_test_find_local.png b/libstdc++-v3/doc/html/ext/pb_ds/cc_hash_random_int_subscript_timing_test_find_local.png new file mode 100644 index 00000000000..ca4db96f457 Binary files /dev/null and b/libstdc++-v3/doc/html/ext/pb_ds/cc_hash_random_int_subscript_timing_test_find_local.png differ diff --git a/libstdc++-v3/doc/html/ext/pb_ds/cc_hash_random_int_subscript_timing_test_find_msvc.png b/libstdc++-v3/doc/html/ext/pb_ds/cc_hash_random_int_subscript_timing_test_find_msvc.png new file mode 100644 index 00000000000..0b51d9432a9 Binary files /dev/null and b/libstdc++-v3/doc/html/ext/pb_ds/cc_hash_random_int_subscript_timing_test_find_msvc.png differ diff --git a/libstdc++-v3/doc/html/ext/pb_ds/cc_hash_random_int_subscript_timing_test_insert_gcc.png b/libstdc++-v3/doc/html/ext/pb_ds/cc_hash_random_int_subscript_timing_test_insert_gcc.png new file mode 100644 index 00000000000..6e494038125 Binary files /dev/null and b/libstdc++-v3/doc/html/ext/pb_ds/cc_hash_random_int_subscript_timing_test_insert_gcc.png differ diff --git a/libstdc++-v3/doc/html/ext/pb_ds/cc_hash_random_int_subscript_timing_test_insert_local.png b/libstdc++-v3/doc/html/ext/pb_ds/cc_hash_random_int_subscript_timing_test_insert_local.png new file mode 100644 index 00000000000..48fcf76c048 Binary files /dev/null and b/libstdc++-v3/doc/html/ext/pb_ds/cc_hash_random_int_subscript_timing_test_insert_local.png differ diff --git a/libstdc++-v3/doc/html/ext/pb_ds/cc_hash_random_int_subscript_timing_test_insert_msvc.png b/libstdc++-v3/doc/html/ext/pb_ds/cc_hash_random_int_subscript_timing_test_insert_msvc.png new file mode 100644 index 00000000000..39c96ad8daf Binary files /dev/null and b/libstdc++-v3/doc/html/ext/pb_ds/cc_hash_random_int_subscript_timing_test_insert_msvc.png differ diff --git a/libstdc++-v3/doc/html/ext/pb_ds/cc_hash_table.html b/libstdc++-v3/doc/html/ext/pb_ds/cc_hash_table.html new file mode 100644 index 00000000000..fec6bec1b51 --- /dev/null +++ b/libstdc++-v3/doc/html/ext/pb_ds/cc_hash_table.html @@ -0,0 +1,724 @@ + + + + + + + cc_hash_table Interface + + + + +
+

cc_hash_table Interface

+ +

A concrete collision-chaining hash-based associative + container.

+ +

Defined in: assoc_container.hpp

+ +

Template Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterDescriptionDefault Value
+
+typename Key
+
+
+

Key type.

+
-
+
+typename Mapped
+
+
+

Mapped type.

+
-
+
+class Hash_Fn 
+
+
+

Hash functor.

+
+
+__gnu_cxx::hash<Key>
+
if using gcc; +
+stdext::hash_value<Key>
+
if using Visual C++ .net +
+
+class Eq_Fn 
+
+
+

Equivalence functor.

+
+
+std::equal_to<Key>
+
+
+
+class Comb_Hash_Fn 
+
+
+

Combining hash functor.

+ +

If Hash_Fn is + not null_hash_fn, then this is the + ranged-hash functor; otherwise, this is the range-hashing + functor.

+ +

(See Design::Hash-Based + Containers::Hash Policies.)

+
+
+direct_mask_range_hashing
+
+
+
+class Resize_Policy 
+
+
+

Resize policy.

+
+ If Comb_Hash_Fn + is direct_mask_range_hashing, + then +
+hash_standard_resize_policy<
+  hash_exponential_size_policy<
+    typename Comb_Hash_Fn::size_type>,
+  hash_load_check_resize_trigger<
+    typename Comb_Hash_Fn::size_type>,
+  false,
+  typename Comb_Hash_Fn::size_type>
+
otherwise, +
+hash_standard_resize_policy<
+  hash_exponential_size_policy<
+    typename Comb_Hash_Fn::size_type>,
+  hash_load_check_resize_trigger<
+    typename Comb_Hash_Fn::size_type>,
+  false,
+  typename Comb_Hash_Fn::size_type>
+
+
+
+bool Store_Hash 
+
+
+

Indicates whether the hash value will be stored along + with each key.

+ +

If hash_fn is null_hash_fn, then the container + will not compile if this value is + true

+
+
+false
+
+
+
+class Allocator 
+
+
+

Allocator type.

+
+
+std::allocator<char>
+
+
+ +

Base Classes

+ + + + + + + + + + + + + +
ClassDerivation Type
+
+basic_hash_table
+
+
+

public

+
+ +

Public Types and + Constants

+ +

Policy Definitions

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
TypeDefinitionDescription
+
+hash_fn
+
+
+
+Hash_Fn
+
+
+

Hash functor type.

+
+
+eq_fn
+
+
+
+Eq_Fn
+
+
+

Equivalence functor type.

+
+
+resize_policy
+
+
+
+Resize_Policy
+
+
+

Resize policy type.

+
+
+comb_hash_fn
+
+
+
+Comb_Hash_Fn
+
+
+

Combining hash functor type.

+
+ +

Public Methods

+ +

Constructors, Destructor, and + Related

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDescription
+
+  cc_hash_table
+  ()
+
+
+

Default constructor.

+
+
+  cc_hash_table
+  (const hash_fn &r_hash_fn)
+
+
+

Constructor taking some policy objects. r_hash_fn will be copied by the + Hash_Fn object of + the container object.

+
+
+  cc_hash_table
+  (const hash_fn &r_hash_fn, 
+    const eq_fn &r_eq_fn)
+
+
+

Constructor taking some policy objects. r_hash_fn will be copied by the + hash_fn object of + the container object, and r_eq_fn will be copied by the + eq_fn object of the + container object.

+
+
+  cc_hash_table
+  (const hash_fn &r_hash_fn, 
+    const eq_fn &r_eq_fn, 
+    const comb_hash_fn &r_comb_hash_fn)
+
+
+

Constructor taking some policy objects. r_hash_fn will be copied by the + hash_fn object of + the container object, r_eq_fn will be copied by the + eq_fn object of the + container object, and r_comb_hash_fn will be copied by the + comb_hash_fn + object of the container object.

+
+
+  cc_hash_table
+  (const hash_fn &r_hash_fn, 
+    const eq_fn &r_eq_fn, 
+    const comb_hash_fn &r_comb_hash_fn, 
+    const resize_policy &r_resize_policy)
+
+
+

Constructor taking some policy objects. r_hash_fn will be copied by the + hash_fn object of + the container object, r_eq_fn will be copied by the + eq_fn object of the + container object, r_comb_hash_fn will be copied by the + comb_hash_fn + object of the container object, and r_resize_policy will be copied by + the resize_policy + object of the container object.

+
+
+template<
+    class It>
+  cc_hash_table
+  (It first_it, 
+    It last_it)
+
+
+

Constructor taking iterators to a range of + value_types. The value_types between first_it and last_it will be inserted into the + container object.

+
+
+template<
+    class It>
+  cc_hash_table
+  (It first_it, 
+    It last_it,
+    const hash_fn &r_hash_fn)
+
+
+

Constructor taking iterators to a range of value_types + and some policy objects. The value_types between + first_it and + last_it will be inserted + into the container object.

+
+
+template<
+    class It>
+  cc_hash_table
+  (It first_it, 
+    It last_it,
+    const hash_fn &r_hash_fn, 
+    const eq_fn &r_eq_fn)
+
+
+

Constructor taking iterators to a range of value_types + and some policy objects The value_types between + first_it and + last_it will be inserted + into the container object. r_hash_fn will be copied by the + hash_fn object of + the container object, and r_eq_fn will be copied by the + eq_fn object of the + container object.

+
+
+template<
+    class It>
+  cc_hash_table
+  (It first_it, 
+    It last_it,
+    const hash_fn &r_hash_fn, 
+    const eq_fn &r_eq_fn, 
+    const comb_hash_fn &r_comb_hash_fn)
+
+
+

Constructor taking iterators to a range of value_types + and some policy objects The value_types between + first_it and + last_it will be inserted + into the container object. r_hash_fn will be copied by the + hash_fn object of + the container object, r_eq_fn will be copied by the + eq_fn object of the + container object, and r_comb_hash_fn will be copied by the + comb_hash_fn + object of the container object.

+
+
+template<
+    class It>
+  cc_hash_table
+  (It first_it, 
+    It last_it,
+    const hash_fn &r_hash_fn, 
+    const eq_fn &r_eq_fn, 
+    const comb_hash_fn &r_comb_hash_fn, 
+    const resize_policy &r_resize_policy)
+
+
+

Constructor taking iterators to a range of value_types + and some policy objects The value_types between + first_it and + last_it will be inserted + into the container object. r_hash_fn will be copied by the + hash_fn object of + the container object, r_eq_fn will be copied by the + eq_fn object of the + container object, r_comb_hash_fn will be copied by the + comb_hash_fn + object of the container object, and r_resize_policy will be copied by + the resize_policy + object of the container object.

+
+
+  cc_hash_table
+  (const cc_hash_table &other)
+
+
+

Copy constructor.

+
+
+virtual 
+  ~cc_hash_table
+  ()
+
+
+

Destructor.

+
+
+cc_hash_table &
+  operator=
+  (const cc_hash_table &other)
+
+
+

Assignment operator.

+
+
+void
+  swap
+  (cc_hash_table &other)
+
+
+

Swaps content.

+
+ +

Policy Access Methods

+ + + + + + + + + + + + + + + + + + + +
MethodDescription
+
+comb_hash_fn &
+  get_comb_hash_fn
+  ()
+
+
+

Access to the comb_hash_fn + object.

+
+
+const comb_hash_fn &
+  get_comb_hash_fn
+  () const
+
+
+

Const access to the comb_hash_fn + object.

+
+
+ + diff --git a/libstdc++-v3/doc/html/ext/pb_ds/cc_hash_tag.html b/libstdc++-v3/doc/html/ext/pb_ds/cc_hash_tag.html new file mode 100644 index 00000000000..fb6f5935830 --- /dev/null +++ b/libstdc++-v3/doc/html/ext/pb_ds/cc_hash_tag.html @@ -0,0 +1,47 @@ + + + + + + + cc_hash_tag Interface + + + + +
+

cc_hash_tag Interface

+ +

Collision-chaining hash data structure tag.

+ +

Defined in: tag_and_trait.hpp

+ +

Base Classes

+ + + + + + + + + + + + + +
ClassDerivation Type
+
+basic_hash_tag
+
+
+

public

+
+
+ + diff --git a/libstdc++-v3/doc/html/ext/pb_ds/ccgp_hash_random_int_subscript_timing_test_insert_gcc.png b/libstdc++-v3/doc/html/ext/pb_ds/ccgp_hash_random_int_subscript_timing_test_insert_gcc.png new file mode 100644 index 00000000000..fde6b41bf94 Binary files /dev/null and b/libstdc++-v3/doc/html/ext/pb_ds/ccgp_hash_random_int_subscript_timing_test_insert_gcc.png differ diff --git a/libstdc++-v3/doc/html/ext/pb_ds/ccgp_hash_random_int_subscript_timing_test_insert_local.png b/libstdc++-v3/doc/html/ext/pb_ds/ccgp_hash_random_int_subscript_timing_test_insert_local.png new file mode 100644 index 00000000000..2449e1de324 Binary files /dev/null and b/libstdc++-v3/doc/html/ext/pb_ds/ccgp_hash_random_int_subscript_timing_test_insert_local.png differ diff --git a/libstdc++-v3/doc/html/ext/pb_ds/ccgp_hash_random_int_subscript_timing_test_insert_msvc.png b/libstdc++-v3/doc/html/ext/pb_ds/ccgp_hash_random_int_subscript_timing_test_insert_msvc.png new file mode 100644 index 00000000000..11dca77fcfe Binary files /dev/null and b/libstdc++-v3/doc/html/ext/pb_ds/ccgp_hash_random_int_subscript_timing_test_insert_msvc.png differ diff --git a/libstdc++-v3/doc/html/ext/pb_ds/checked_by_tidy.gif b/libstdc++-v3/doc/html/ext/pb_ds/checked_by_tidy.gif new file mode 100644 index 00000000000..47c2c4859c5 Binary files /dev/null and b/libstdc++-v3/doc/html/ext/pb_ds/checked_by_tidy.gif differ diff --git a/libstdc++-v3/doc/html/ext/pb_ds/concepts.html b/libstdc++-v3/doc/html/ext/pb_ds/concepts.html new file mode 100644 index 00000000000..9f6c2246254 --- /dev/null +++ b/libstdc++-v3/doc/html/ext/pb_ds/concepts.html @@ -0,0 +1,118 @@ + + + + + + + Concepts + + + + +
+

Concepts

+ +

Point and Range Methods and + Iterators

+ +

A point-type iterator is an iterator that refers to a + specific element, e.g. as returned through an + associative-container's find method; a range-type + iterator is an iterator that is used to go over a sequence of + elements, e.g., as returned by a container's + find method. A point-type method is a method that + returns a point-type iterator; a range-type method is a method + that returns a range-type iterator.

+ +

For most containers, these types are synonymous; for + self-organizing containers, such as hash-based containers or + priority queues, these are inherently different (in any + implementation, including that of the STL), but in + pb_ds this is made explicit - they are distinct + types.

+ + +

Invalidation Guarantees

+ +

If one manipulates a container object, then iterators + previously obtained from it can be invalidated. In some cases a + previously-obtained iterator cannot be de-referenced; in other + cases, the iterator's next or previous element might have + changed unpredictably. This corresponds exactly to the question + whether a point-type or range-type iterator (see previous + concept) is valid or not. In pb_ds one can query a + container (in compile time) what are its invalidation + guarantees.

+ +

Primary and Secondary Keys + and Associative Containers

+ +

In pb_ds there are no associative containers which + allow multiple values with equivalent keys (such as the STL's + std::multimap, for example). Instead, one maps the + unique part of a key - the primary key, into an + associative-container of the (originally) non-unique parts of + the key - the secondary key. A primary associative-container is + an associative container of primary keys; a secondary + associative-container is an associative container of secondary + keys.

+ + +

Null Policy Classes

+ +

Associative containers are typically parametrized by + various policies. For example, a hash-based associative + container is parametrized by a hash-functor, transforming each + key into an non-negative numerical type. Each such value is + then further mapped into a position within the table. The + mapping of a key into a position within the table is therefore + a two-step process.

+ +

In some cases, instantiations are redundant. For + example, when the keys are integers, it is possible to use a + redundant hash policy, which transforms each key into + its value.

+ +

In some other cases, these policies are irrelevant. + For example, a hash-based associative container might transform + keys into positions within a table by a different method than + the two-step method described above. In such a case, the hash + functor is simply irrelevant.

+ +

pb_ds uses special pre-defined "null policies" + classes for these cases. Some null policies in pb_ds + are:

+ +
    +
  1. null_mapped_type
  2. + +
  3. null_tree_node_update
  4. + +
  5. null_trie_node_update
  6. + +
  7. null_hash_fn
  8. + +
  9. null_probe_fn
  10. +
+ +

A "set" in pb_ds, for example, is an associative + container with its Data_Parameter instantiated by + null_mapped_type. + Design::Tree-Based + Containers::Node Invariants explains another case where a + null policy is needed.

+
+ + diff --git a/libstdc++-v3/doc/html/ext/pb_ds/contact.html b/libstdc++-v3/doc/html/ext/pb_ds/contact.html new file mode 100644 index 00000000000..3d506c975c7 --- /dev/null +++ b/libstdc++-v3/doc/html/ext/pb_ds/contact.html @@ -0,0 +1,22 @@ + + + + + + + Contact + + + + +
+

Contact

+ +

For anything relevant, please write to pbassoc@gmail.com

+
+ + diff --git a/libstdc++-v3/doc/html/ext/pb_ds/container_base.html b/libstdc++-v3/doc/html/ext/pb_ds/container_base.html new file mode 100644 index 00000000000..a0741307e0f --- /dev/null +++ b/libstdc++-v3/doc/html/ext/pb_ds/container_base.html @@ -0,0 +1,1063 @@ + + + + + + + container_base Interface + + + + +
+

container_base Interface

+ +

An abstract basic associative container.

+ +

Defined in: assoc_container.hpp

+ +

Template Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterDescriptionDefault Value
+
+typename Key
+
+
+

Key type.

+
-
+
+typename Mapped
+
+
+

Mapped type.

+
-
+
+class Tag
+
+
+

Data structure tag.

+
-
+
+class Policy_Tl
+
+
+

Policy typelist.

+ +

Contains subclasses' policies.

+
-
+
+class Allocator
+
+
+

Allocator type.

+
-
+ +

Public Types and + Constants

+ +

General Container + Definitions

+ + + + + + + + + + + + + + + + + + + + + + + + + +
TypeDefinitionDescription
+
+size_type
+
+
+
+typename Allocator::size_type
+
+
+

Size type.

+
+
+difference_type
+
+
+
+typename Allocator::difference_type
+
+
+

Difference type.

+
+ +

Categories

+ + + + + + + + + + + + + + + + + +
TypeDefinitionDescription
+
+container_category
+
+
+
+Tag
+
+
+

The underlying mapped-structure tag of the + container.

+ +

This is one of:

+ +
    +
  1. cc_hash_tag
  2. + +
  3. gp_hash_tag
  4. + +
  5. rb_tree_tag
  6. + +
  7. ov_tree_tag
  8. + +
  9. splay_tree_tag
  10. + +
  11. pat_trie_tag
  12. + +
  13. list_update_tag
  14. +
+
+ +

Policy Definitions

+ + + + + + + + + + + + + + + + + +
TypeDefinitionDescription
+
+allocator
+
+
+
+Allocator
+
+
+

Allocator + type.

+
+ +

Key-Type Definitions

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
TypeDefinitionDescription
+
+key_type
+
+
+
+typename allocator::template rebind<
+    Key>::other::value_type
+
+
+

Key type.

+
+
+key_reference
+
+
+
+typename allocator::template rebind<
+    key_type>::other::reference
+
+
+

Key reference + type.

+
+
+const_key_reference
+
+
+
+typename allocator::template rebind<
+    key_type>::other::const_reference
+
+
+

Const key reference type.

+
+
+key_pointer
+
+
+
+typename allocator::template rebind<
+    key_type>::other::pointer
+
+
+

Key pointer type.

+
+
+const_key_pointer
+
+
+
+typename allocator::template rebind<
+    key_type>::other::const_pointer
+
+
+

Const key pointer type.

+
+ +

Mapped-Type Definitions

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
TypeDefinitionDescription
+
+mapped_type
+
+
+
+Mapped
+
+
+

Mapped type.

+
+
+mapped_reference
+
+
+
+typename allocator::template rebind<
+    mapped_type>::other::reference
+
+
+

Mapped reference + type.

+
+
+const_mapped_reference
+
+
+
+typename allocator::template rebind<
+    mapped_type>::other::const_reference
+
+
+

Const mapped reference type.

+
+
+mapped_pointer
+
+
+
+typename allocator::template rebind<
+    mapped_type>::other::pointer
+
+
+

Mapped pointer + type.

+
+
+const_mapped_pointer
+
+
+
+typename allocator::template rebind<
+    mapped_type>::other::const_pointer
+
+
+

Const mapped pointer type.

+
+ +

Value-Type Definitions

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
TypeDefinitionDescription
+
+value_type
+
+
+
+
+If Mapped is null_mapped_type, then Key
+Otherwise, Mapped +
+
+

Value type.

+
+
+reference
+
+
+
+typename allocator::template rebind<
+    value_type>::other::reference
+
+
+

Value reference type.

+
+
+const_reference
+
+
+
+typename allocator::template rebind<
+    value_type>::other::const_reference
+
+
+

Const value reference type.

+
+
+pointer
+
+
+
+typename allocator::template rebind<
+    value_type>::other::pointer
+
+
+

Value pointer type.

+
+
+const_pointer
+
+
+
+typename allocator::template rebind<
+    value_type>::other::const_pointer
+
+
+

Const Value pointer type.

+
+ +

Iterator Definitions

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
TypeDefinitionDescription
+
+const_point_iterator
+
+
+
+Const point-type iterator.
+
+
+

Const point-type iterator.

+
+
+point_iterator
+
+
+
+
+Point-type iterator.
+If Mapped is null_mapped_type, then this is synonymous to const_point_iterator +
+
+

Point-type iterator.

+
+
+const_iterator
+
+
+
+Const range-type iterator.
+
+
+

Const range-type iterator.

+
+
+iterator
+
+
+
+
+Range-type iterator.
+If Mapped is null_mapped_type, then this is synonymous to const_iterator +
+
+

Range-type iterator.

+
+ +

Public Methods

+ +

Constructors, Destructor, and + Related

+ + + + + + + + + + + + + +
MethodDescription
+
+virtual 
+  ~container_base
+  ()
+
+
+

Destructor.

+
+ +

Information Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDescription
+
+inline size_type
+  size
+  () const
+
+
+

Returns the number of distinct value_type objects + the container object is storing.

+
+
+inline size_type
+  max_size
+  () const
+
+
+

Returns an upper bound on the number of distinct + value_type + objects this container can store.

+
+
+inline bool
+  empty
+  () const
+
+
+

Returns whether the container object is not storing + any value_type + objects.

+
+ +

Insert Methods

+ + + + + + + + + + + + + + + + + + + +
MethodDescription
+
+std::pair<point_iterator, bool>
+  insert
+  (const_reference r_val)
+
+
+

Inserts a value_type object. If + no value_type + with r_val's key was in + the container object, inserts and returns (point_iterator + object associated with r_val, true); + otherwise just returns (point_iterator + object associated with r_val's key, + false).

+
+
+mapped_reference
+  operator[]
+  (const_key_reference r_key)
+
+
+

Subscript operator.

+
+ +

Find Methods

+ + + + + + + + + + + + + + + + + + + +
MethodDescription
+
+point_iterator 
+  find
+  (const_key_reference r_key)
+
+
+

Returns the point_iterator + corresponding to the value_type with + r_key as its key, or the + point_iterator + corresponding to the just-after-last entry if no such + value_type.

+
+
+const_point_iterator 
+  find
+  (const_key_reference r_key) const
+
+
+

Returns the const_point_iterator + corresponding to the value_type with + r_key as its key, or the + const_point_iterator + corresponding to the just-after-last entry if no such + value_type.

+
+ +

Erase Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDescription
+
+bool
+  erase
+  (const_key_reference r_key)
+
+
+

Erases the value_type associated + with r_key. returns + false iff r_key was not contained.

+
+
+template<
+  class Pred>
+size_type 
+  erase_if
+  (Pred prd)
+
+
+

Erases any value_type satisfying + the predicate prd (this + is transactional, either all matching value_types are + erased, or, if an exception is thrown (for types whose + erase can throw an exception) none); returns the number + of value_types + erased.

+
+
+void 
+  clear
+  ()
+
+
+

Clears the container object.

+
+ +

Iteration Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDescription
+
+iterator
+  begin
+  ()
+
+
+

Returns an iterator corresponding + to the first value_type in the + container.

+
+
+const_iterator
+  begin
+  () const
+
+
+

Returns a const_iterator + corresponding to the first value_type in the + container.

+
+
+iterator
+  end
+  ()
+
+
+

Returns an iterator corresponding + to the just-after-last value_type in the + container.

+
+
+const_iterator
+  end
+  () const
+
+
+

Returns a const_iterator + corresponding to the just-after-last value_type in the + container.

+
+
+ + diff --git a/libstdc++-v3/doc/html/ext/pb_ds/container_cd.png b/libstdc++-v3/doc/html/ext/pb_ds/container_cd.png new file mode 100644 index 00000000000..52553278cac Binary files /dev/null and b/libstdc++-v3/doc/html/ext/pb_ds/container_cd.png differ diff --git a/libstdc++-v3/doc/html/ext/pb_ds/container_cd.svg b/libstdc++-v3/doc/html/ext/pb_ds/container_cd.svg new file mode 100644 index 00000000000..3b5a9818967 --- /dev/null +++ b/libstdc++-v3/doc/html/ext/pb_ds/container_cd.svg @@ -0,0 +1,418 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + Benjamin Kosnik + + + + + + + + + + list_update + basic_hash_table + basic_tree + + + + + tree + trie + cc_hash_table + gp_hash_table + + container_base + + + + + + + + diff --git a/libstdc++-v3/doc/html/ext/pb_ds/container_tag.html b/libstdc++-v3/doc/html/ext/pb_ds/container_tag.html new file mode 100644 index 00000000000..b9f05319dc2 --- /dev/null +++ b/libstdc++-v3/doc/html/ext/pb_ds/container_tag.html @@ -0,0 +1,24 @@ + + + + + + + container _tag Interface + + + + +
+

container _tag Interface

+ +

Basic data structure tag.

+ +

Defined in: tag_and_trait.hpp

+
+ + diff --git a/libstdc++-v3/doc/html/ext/pb_ds/counter_lu_policy.html b/libstdc++-v3/doc/html/ext/pb_ds/counter_lu_policy.html new file mode 100644 index 00000000000..142cca19570 --- /dev/null +++ b/libstdc++-v3/doc/html/ext/pb_ds/counter_lu_policy.html @@ -0,0 +1,259 @@ + + + + + + + counter_lu_policy Interface + + + + +
+

counter_lu_policy Interface

+ +

A list-update policy that moves elements to the front of the + list based on the counter algorithm.

+ +

Defined in: list_update_policy.hpp

+ +

Template Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterDescriptionDefault Value
+
+size_t Max_Count 
+
+
+

Maximum count.

+ +

When some element is accessed this number of times, it + will be moved to the front of the list.

+
5
+
+class Allocator 
+
+
+

Allocator type.

+ +

This is used only for definitions, e.g., the size + type.

+
+
+std::allocator<char>
+
+
+ +

Public Types and + Constants

+ +

Policy Definitions

+ + + + + + + + + + + + + + + + + + + + + + + + + +
TypeDefinitionDescription
+
+allocator
+
+
+
+Allocator
+
+
+

Allocator + type.

+
+
+max_count
+
+
+
+Max_Count
+}
+
+
+

Maximum count.

+
+ +

General Definitions

+ + + + + + + + + + + + + + + + + +
TypeDefinitionDescription
+
+size_type
+
+
+
+typename allocator::size_type
+
+
+

Size type.

+
+ +

Metadata-Type + Definitions

+ + + + + + + + + + + + + + + + + + + + + + + + + +
TypeDefinitionDescription
+
+metadata_type
+
+
+
+Some class containing a counter.
+
+
+

Metadata on which this functor operates.

+
+
+metadata_reference
+
+
+
+typename Allocator::template rebind<
+    metadata_type>::other::reference
+
+
+

Reference to metadata on which this functor + operates.

+
+ +

Public Methods

+ +

Metadata Methods

+ + + + + + + + + + + + + + + + + + + +
MethodDescription
+
+metadata_type
+  operator()
+  () const
+
+
+

Creates a metadata object.

+
+
+bool 
+  operator()
+  (metadata_reference r_metadata) const
+
+
+

Decides whether a metadata object should be moved to + the front of the list.

+
+
+ + diff --git a/libstdc++-v3/doc/html/ext/pb_ds/design.html b/libstdc++-v3/doc/html/ext/pb_ds/design.html new file mode 100644 index 00000000000..e83bd4dd20a --- /dev/null +++ b/libstdc++-v3/doc/html/ext/pb_ds/design.html @@ -0,0 +1,96 @@ + + + + + + + Design + + + + +
+

Design

+ +

The pb_ds namespace contains:

+ +
    +
  1. Exception classes (see Interface::Exceptions::Common)
  2. + +
  3. Invalidation-guarantee tags (see Design::Invalidation Guarantees + and Interface::Data-Structure Tags + and Traits::Invalidation-Guarantee Tags).
  4. + +
  5. Associative Containers (see Design::Associative + Containers::Tree-Based Containers, Design::Associative + Containers::Trie-Based Containers, Design::Associative + Containers::Hash-Based Containers, and Design::Associative + Containers::List-Based Containers, and Interface::Containers::Associative + Containers).
  6. + +
  7. Associative Container tags and traits + (see Design::Associative + Containers::Data-Structure Genericity, Interface::Data-Structure Tags + and Traits::Data-Structure Tags::Associative-Containers, + and Interface::Data-Structure Tags and + Traits::Data-Structure + Traits::Associative-Containers).
  8. + +
  9. Associative Container policies (see + Design::Associative + Containers::Tree-Based Containers, Design::Associative + Containers::Trie-Based Containers, Design::Associative + Containers::Hash-Based Containers, and Design::Associative + Containers::List-Based Containers, and Interface::Container + Policy Classes).
  10. + + +
  11. Mapped types for setting the mapping semantics of + associative containers (see Tutorial::Associative + Containers::Associative Containers Others than Maps and + Interface::Mapped-Type + Policies).
  12. + + +
  13. Priority Queues (see Design::Priority + Queues and Interface::Containers::Priority + Queues).
  14. + +
  15. Priority Queue tags and traits + (see Design::Priority + Queues::Traits, Interface::Data-Structure Tags and + Traits::Data-Structure Tags::Priority Queues, and + Interface::Data-Structure + Tags and Traits::Data-Structure Traits::Priority + Queues).
  16. +
+ + +

Associative-Container Design + describes associative-container design.

+ +

Priority-Queue Design describes + priority-queue design.

+
+ + diff --git a/libstdc++-v3/doc/html/ext/pb_ds/different_underlying_dss.png b/libstdc++-v3/doc/html/ext/pb_ds/different_underlying_dss.png new file mode 100644 index 00000000000..adee1263600 Binary files /dev/null and b/libstdc++-v3/doc/html/ext/pb_ds/different_underlying_dss.png differ diff --git a/libstdc++-v3/doc/html/ext/pb_ds/direct_mask_range_hashing.html b/libstdc++-v3/doc/html/ext/pb_ds/direct_mask_range_hashing.html new file mode 100644 index 00000000000..1a7d39b70c2 --- /dev/null +++ b/libstdc++-v3/doc/html/ext/pb_ds/direct_mask_range_hashing.html @@ -0,0 +1,167 @@ + + + + + + + direct_mask_range_hashing Interface + + + + +
+

direct_mask_range_hashing Interface

+ +

A mask range-hashing class (uses a bit-mask).

+ +

Defined in: hash_policy.hpp

+ +

Template Parameters

+ + + + + + + + + + + + + + + + + +
ParameterDescriptionDefault Value
+
+typename Size_Type 
+
+
+

Size type.

+
size_t
+ +

Public Types and + Constants

+ +

General Definitions

+ + + + + + + + + + + + + + + + + +
TypeDefinitionDescription
+
+size_type
+
+
+
+Size_Type
+
+
+

Size type.

+
+ +

Public Methods

+ +

Constructors, Destructor, and + Related

+ + + + + + + + + + + + + +
MethodDescription
+
+void
+  swap
+  (direct_mask_range_hashing &other)
+
+
+

Swaps content.

+
+ +

Protected Methods

+ +

Notification Methods

+ + + + + + + + + + + + + +
MethodDescription
+
+void 
+  notify_resized
+  (size_type size)
+
+
+

Notifies the policy object that the container's size + has changed to size.

+
+ +

Operators.

+ + + + + + + + + + + + + +
MethodDescription
+
+inline size_type
+  operator()
+  (size_type hash) const
+
+
+

Transforms the hash value hash into a ranged-hash value (using + a bit-mask).

+
+
+ + diff --git a/libstdc++-v3/doc/html/ext/pb_ds/direct_mod_range_hashing.html b/libstdc++-v3/doc/html/ext/pb_ds/direct_mod_range_hashing.html new file mode 100644 index 00000000000..33c99338ad1 --- /dev/null +++ b/libstdc++-v3/doc/html/ext/pb_ds/direct_mod_range_hashing.html @@ -0,0 +1,144 @@ + + + + + + + direct_mod_range_hashing Interface + + + + +
+

direct_mod_range_hashing Interface

+ +

A mod range-hashing class (uses the modulo function).

+ +

Defined in: hash_policy.hpp

+ +

Template Parameters

+ + + + + + + + + + + + + + + + + +
ParameterDescriptionDefault Value
+
+typename Size_Type 
+
+
+

Size type.

+
size_t
+ +

Public Types and + Constants

+ +

General Definitions

+ + + + + + + + + + + + + + + + + +
TypeDefinitionDescription
+
+size_type
+
+
+
+Size_Type
+
+
+

Size type.

+
+ +

Public Methods

+ +

Constructors, Destructor, and + Related

+ + + + + + + + + + + + + +
MethodDescription
+
+void
+  swap
+  (direct_mod_range_hashing &other)
+
+
+

Swaps content.

+
+ +

Protected Methods

+ +

Notification Methods

+ +

Operators.

+ + + + + + + + + + + + + +
MethodDescription
+
+inline size_type
+  operator()
+  (size_type hash) const
+
+
+

Transforms the hash value hash into a ranged-hash value (using + a modulo operation).

+
+
+ + diff --git a/libstdc++-v3/doc/html/ext/pb_ds/disclaimer.html b/libstdc++-v3/doc/html/ext/pb_ds/disclaimer.html new file mode 100644 index 00000000000..681af4edf72 --- /dev/null +++ b/libstdc++-v3/doc/html/ext/pb_ds/disclaimer.html @@ -0,0 +1,34 @@ + + + + + + + What, me worry? + + + + +
+

Disclaimer and Copyright

+ +

Revised 16 February, 2004

© Copyright Ami Tavory and + Vladimir Dreizin, IBM-HRL, 2004, and Benjamin Kosnik, Red Hat, + 2004. + +

Permission to use, copy, modify, sell, and distribute this + software is hereby granted without fee, provided that the above + copyright notice appears in all copies, and that both that + copyright notice and this permission notice appear in + supporting documentation.

+ +

None of the above authors, nor IBM Haifa Research + Laboratories, Red Hat, or both, make any representation about + the suitability of this software for any purpose. It is + provided "as is" without express or implied warranty.

+
+ + diff --git a/libstdc++-v3/doc/html/ext/pb_ds/ds_gen.html b/libstdc++-v3/doc/html/ext/pb_ds/ds_gen.html new file mode 100644 index 00000000000..ec99c4d5f7e --- /dev/null +++ b/libstdc++-v3/doc/html/ext/pb_ds/ds_gen.html @@ -0,0 +1,344 @@ + + + + + + + Data-Structure Genericity + + + + +
+

Data-Structure Genericity

+ +

The Basic Problem

+ +

The design attempts to address the following problem. When + writing a function manipulating a generic container object, + what is the behavior of the object? E.g., suppose one + writes

+
+template<typename Cntnr>
+void
+some_op_sequence(Cntnr &r_container)
+{
+    ...
+}
+
then one needs to address the following questions in the body +of some_op_sequence: + +
    +
  1. Which types and methods does Cntnr support? + Containers based on hash tables can be queries for the + hash-functor type and object; this is meaningless for + tree-based containers. Containers based on trees can be + split, joined, or can erase iterators and return the + following iterator; this cannot be done by hash-based + containers.
  2. + +
  3. What are the guarantees of Cntnr? A container + based on a probing hash-table invalidates all iterators when + it is modified; this is not the case for containers based on + node-based trees. Containers based on a node-based tree can + be split or joined without exceptions; this is not the case + for containers based on vector-based trees.
  4. + +
  5. How does the container maintain its elements? Tree-based + and Trie-based containers store elements by key order; + others, typically, do not. A container based on a splay trees + or lists with update policies "cache" "frequently accessed" + elements; containers based on most other underlying + data structures do not.
  6. +
+ +

The remainder of this section deals with these issues.

+ +

Container + Hierarchy

+ +

Figure Container class hierarchy shows the + container hierarchy.

+ +
+
+ +
Container class hierarchy.
+ +
    +
  1. container_base is an + abstract base class for associative containers.
  2. + +
  3. Tree-Like-Based Associative-Containers: + +
      +
    1. basic_tree + is an abstract base class for tree-like-based + associative-containers
    2. + +
    3. tree + is a concrete base class for tree-based + associative-containers
    4. + +
    5. trie + is a concrete base class trie-based + associative-containers
    6. +
    +
  4. + +
  5. Hash-Based Associative-Containers: + +
      +
    1. basic_hash_table + is an abstract base class for hash-based + associative-containers
    2. + +
    3. cc_hash_table + is a concrete collision-chaining hash-based + associative-containers
    4. + +
    5. gp_hash_table + is a concrete (general) probing hash-based + associative-containers
    6. +
    +
  6. + +
  7. List-Based Associative-Containers: + +
      +
    1. list_update - + list-based update-policy associative container
    2. +
    +
  8. +
+ +

The hierarchy is composed naturally so that commonality is + captured by base classes. Thus operator[] is + defined container_base, since + all containers support it. Conversely split is defined + in basic_tree, + since only tree-like containers support it. Data-Structure Tags and Traits discusses how + to query which types and methods each container supports.

+ +

Data-Structure Tags and + Traits

+ +

Tags and traits are very useful for manipulating generic + types. For example, if It is an iterator class, then + typename It::iterator_category or + typename + std::iterator_traits<It>::iterator_category will + yield its category, and typename + std::iterator_traits<It>::value_type will yield its + value type.

+ +

pb_ds contains a tag hierarchy corresponding to the + hierarchy in Figure Class hierarchy. The tag + hierarchy is shown in Figure Data-structure tag class hierarchy.

+ +
no image
+ +
Data-structure tag class hierarchy.
+ +

container_base + publicly defines container_category as one of the classes in + Figure Data-structure tag class + hierarchy. Given any container Cntnr, the tag of + the underlying data structure can be found via + typename Cntnr::container_category.

+ +

Additionally, a traits mechanism can be used to query a + container type for its attributes. Given any container + Cntnr, then __gnu_pbds::container_traits<Cntnr> + is a traits class identifying the properties of the + container.

+ +

To find if a container can throw when a key is erased (which + is true for vector-based trees, for example), one can + use

container_traits<Cntnr>::erase_can_throw, + for example. + +

Some of the definitions in container_traits are + dependent on other definitions. E.g., if container_traits<Cntnr>::order_preserving + is true (which is the case for containers based + on trees and tries), then the container can be split or joined; + in this case, container_traits<Cntnr>::split_join_can_throw + indicates whether splits or joins can throw exceptions (which + is true for vector-based trees); otherwise container_traits<Cntnr>::split_join_can_throw + will yield a compilation error. (This is somewhat similar to a + compile-time version of the COM model [mscom]).

+ +

Point-Type and + Range-Type Methods and Iterators

+ +

Iterators in + Unordered Container Types

+ +

pb_ds differentiates between two types of methods + and iterators: point-type methods and iterators, and range-type + methods and iterators (see Motivation::Associative + Containers::Differentiating between Iterator Types and + Tutorial::Associative + Containers::Point-Type and Range-Type Methods and + Iterators). Each associative container's interface includes + the methods:

+
+const_point_iterator
+find(const_key_reference r_key) const;                
+
+point_iterator
+find(const_key_reference r_key);         
+    
+std::pair<point_iterator,bool>
+insert(const_reference r_val);
+
+ +

The relationship between these iterator types varies between + container types. Figure Point-type and range-type iterators-A + shows the most general invariant between point-type and + range-type iterators: iterator, e.g., can + always be converted to point_iterator. Figure Point-type and range-type iterators-B + shows invariants for order-preserving containers: point-type + iterators are synonymous with range-type iterators. + Orthogonally, Figure Point-type + and range-type iterators-C shows invariants for "set" + containers: iterators are synonymous with const iterators.

+ +
+
+ +
Point-type and range-type iterators.
+ +

Note that point-type iterators in self-organizing containers + (e.g., hash-based associative containers) lack movement + operators, such as operator++ - in fact, this + is the reason why pb_ds differentiates from the STL's + design on this point.

+ +

Typically, one can determine an iterator's movement + capabilities in the STL using + std::iterator_traits<It>iterator_category, which + is a struct indicating the iterator's movement + capabilities. Unfortunately, none of the STL's predefined + categories reflect a pointer's not having any movement + capabilities whatsoever. Consequently, pb_ds adds a + type trivial_iterator_tag + (whose name is taken from a concept in [sgi_stl]), which is the category + of iterators with no movement capabilities. All other STL tags, + such as forward_iterator_tag retain their common + use.

+ +

Invalidation + Guarantees

+ +

Motivation::Associative + Containers::Differentiating between Iterator + Types::Invalidation Guarantees posed a problem. Given three + different types of associative containers, a modifying + operation (in that example, erase) invalidated + iterators in three different ways: the iterator of one + container remained completely valid - it could be de-referenced + and incremented; the iterator of a different container could + not even be de-referenced; the iterator of the third container + could be de-referenced, but its "next" iterator changed + unpredictably.

+ +

Distinguishing between find and range types allows + fine-grained invalidation guarantees, because these questions + correspond exactly to the question of whether point-type + iterators and range-type iterators are valid. Invalidation guarantees class + hierarchy shows tags corresponding to different types of + invalidation guarantees.

+ +
no image
+ +
Invalidation guarantees class hierarchy.
+ +
    +
  1. basic_invalidation_guarantee + corresponds to a basic guarantee that a point-type iterator, + a found pointer, or a found reference, remains valid as long + as the container object is not modified.
  2. + +
  3. point_invalidation_guarantee + corresponds to a guarantee that a point-type iterator, a + found pointer, or a found reference, remains valid even if + the container object is modified.
  4. + +
  5. range_invalidation_guarantee + corresponds to a guarantee that a range-type iterator remains + valid even if the container object is modified.
  6. +
+ +

As shown in Tutorial::Associative + Containers::Point-Type and Range-Type Methods and + Iterators, to find the invalidation guarantee of a + container, one can use

+
+typename container_traits<Cntnr>::invalidation_guarantee
+
+ +

which is one of the classes in Figure Invalidation guarantees class + hierarchy.

+ +

Note that this hierarchy corresponds to the logic it + represents: if a container has range-invalidation guarantees, + then it must also have find invalidation guarantees; + correspondingly, its invalidation guarantee (in this case + range_invalidation_guarantee) + can be cast to its base class (in this case point_invalidation_guarantee). + This means that this this hierarchy can be used easily using + standard metaprogramming techniques, by specializing on the + type of invalidation_guarantee.

+ +

(These types of problems were addressed, in a more general + setting, in [meyers96more] - Item 2. In + our opinion, an invalidation-guarantee hierarchy would solve + these problems in all container types - not just associative + containers.)

+
+ + diff --git a/libstdc++-v3/doc/html/ext/pb_ds/embedded_lists_1.png b/libstdc++-v3/doc/html/ext/pb_ds/embedded_lists_1.png new file mode 100644 index 00000000000..9470a65b568 Binary files /dev/null and b/libstdc++-v3/doc/html/ext/pb_ds/embedded_lists_1.png differ diff --git a/libstdc++-v3/doc/html/ext/pb_ds/embedded_lists_2.png b/libstdc++-v3/doc/html/ext/pb_ds/embedded_lists_2.png new file mode 100644 index 00000000000..d2ac91c1ab0 Binary files /dev/null and b/libstdc++-v3/doc/html/ext/pb_ds/embedded_lists_2.png differ diff --git a/libstdc++-v3/doc/html/ext/pb_ds/embedded_lists_3.png b/libstdc++-v3/doc/html/ext/pb_ds/embedded_lists_3.png new file mode 100644 index 00000000000..08ecb0ffe16 Binary files /dev/null and b/libstdc++-v3/doc/html/ext/pb_ds/embedded_lists_3.png differ diff --git a/libstdc++-v3/doc/html/ext/pb_ds/examples.html b/libstdc++-v3/doc/html/ext/pb_ds/examples.html new file mode 100644 index 00000000000..03c7a391003 --- /dev/null +++ b/libstdc++-v3/doc/html/ext/pb_ds/examples.html @@ -0,0 +1,24 @@ + + + + + + + Examples + + + + +
+

Examples

+ +

Associative-Container + Examples shows examples for associative containers; + Priority-Queue Examples shows + examples for priority queues.

+
+ + diff --git a/libstdc++-v3/doc/html/ext/pb_ds/exceptions.html b/libstdc++-v3/doc/html/ext/pb_ds/exceptions.html new file mode 100644 index 00000000000..3b50c27aa04 --- /dev/null +++ b/libstdc++-v3/doc/html/ext/pb_ds/exceptions.html @@ -0,0 +1,46 @@ + + + + + + +container_error Interface + + + + +
+

container_error Interface

+ +

Base class for associative-container exceptions.

+ +

Defined in: exception.hpp

+ +

Base Classes

+ + + + + + + + + + + + + +
ClassDerivation Type
+
+std::logic_error
+
+
+

public

+
+
+ + diff --git a/libstdc++-v3/doc/html/ext/pb_ds/gp_hash_random_int_find_timing_test_gcc.png b/libstdc++-v3/doc/html/ext/pb_ds/gp_hash_random_int_find_timing_test_gcc.png new file mode 100644 index 00000000000..d86299b7e3e Binary files /dev/null and b/libstdc++-v3/doc/html/ext/pb_ds/gp_hash_random_int_find_timing_test_gcc.png differ diff --git a/libstdc++-v3/doc/html/ext/pb_ds/gp_hash_random_int_find_timing_test_local.png b/libstdc++-v3/doc/html/ext/pb_ds/gp_hash_random_int_find_timing_test_local.png new file mode 100644 index 00000000000..1b31b7f27ca Binary files /dev/null and b/libstdc++-v3/doc/html/ext/pb_ds/gp_hash_random_int_find_timing_test_local.png differ diff --git a/libstdc++-v3/doc/html/ext/pb_ds/gp_hash_random_int_find_timing_test_msvc.png b/libstdc++-v3/doc/html/ext/pb_ds/gp_hash_random_int_find_timing_test_msvc.png new file mode 100644 index 00000000000..b7082f28605 Binary files /dev/null and b/libstdc++-v3/doc/html/ext/pb_ds/gp_hash_random_int_find_timing_test_msvc.png differ diff --git a/libstdc++-v3/doc/html/ext/pb_ds/gp_hash_random_int_subscript_timing_test_find_gcc.png b/libstdc++-v3/doc/html/ext/pb_ds/gp_hash_random_int_subscript_timing_test_find_gcc.png new file mode 100644 index 00000000000..b9fbe00deff Binary files /dev/null and b/libstdc++-v3/doc/html/ext/pb_ds/gp_hash_random_int_subscript_timing_test_find_gcc.png differ diff --git a/libstdc++-v3/doc/html/ext/pb_ds/gp_hash_random_int_subscript_timing_test_find_local.png b/libstdc++-v3/doc/html/ext/pb_ds/gp_hash_random_int_subscript_timing_test_find_local.png new file mode 100644 index 00000000000..c693ed3869b Binary files /dev/null and b/libstdc++-v3/doc/html/ext/pb_ds/gp_hash_random_int_subscript_timing_test_find_local.png differ diff --git a/libstdc++-v3/doc/html/ext/pb_ds/gp_hash_random_int_subscript_timing_test_find_msvc.png b/libstdc++-v3/doc/html/ext/pb_ds/gp_hash_random_int_subscript_timing_test_find_msvc.png new file mode 100644 index 00000000000..248ff6b8872 Binary files /dev/null and b/libstdc++-v3/doc/html/ext/pb_ds/gp_hash_random_int_subscript_timing_test_find_msvc.png differ diff --git a/libstdc++-v3/doc/html/ext/pb_ds/gp_hash_random_int_subscript_timing_test_insert_gcc.png b/libstdc++-v3/doc/html/ext/pb_ds/gp_hash_random_int_subscript_timing_test_insert_gcc.png new file mode 100644 index 00000000000..ac4f838fe26 Binary files /dev/null and b/libstdc++-v3/doc/html/ext/pb_ds/gp_hash_random_int_subscript_timing_test_insert_gcc.png differ diff --git a/libstdc++-v3/doc/html/ext/pb_ds/gp_hash_random_int_subscript_timing_test_insert_local.png b/libstdc++-v3/doc/html/ext/pb_ds/gp_hash_random_int_subscript_timing_test_insert_local.png new file mode 100644 index 00000000000..9fa08a0c2c3 Binary files /dev/null and b/libstdc++-v3/doc/html/ext/pb_ds/gp_hash_random_int_subscript_timing_test_insert_local.png differ diff --git a/libstdc++-v3/doc/html/ext/pb_ds/gp_hash_random_int_subscript_timing_test_insert_msvc.png b/libstdc++-v3/doc/html/ext/pb_ds/gp_hash_random_int_subscript_timing_test_insert_msvc.png new file mode 100644 index 00000000000..5f1d740b817 Binary files /dev/null and b/libstdc++-v3/doc/html/ext/pb_ds/gp_hash_random_int_subscript_timing_test_insert_msvc.png differ diff --git a/libstdc++-v3/doc/html/ext/pb_ds/gp_hash_table.html b/libstdc++-v3/doc/html/ext/pb_ds/gp_hash_table.html new file mode 100644 index 00000000000..446359b4a89 --- /dev/null +++ b/libstdc++-v3/doc/html/ext/pb_ds/gp_hash_table.html @@ -0,0 +1,891 @@ + + + + + + + gp_hash_table Interface + + + + +
+

gp_hash_table Interface

+ +

A concrete general-probing hash-based associative + container.

+ +

Defined in: assoc_container.hpp

+ +

Template Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterDescriptionDefault Value
+
+typename Key
+
+
+

Key type.

+
-
+
+typename Mapped
+
+
+

Mapped type.

+
-
+
+class Hash_Fn 
+
+
+

Hash functor.

+
+
+__gnu_cxx::hash<Key>
+
if using gcc; +
+stdext::hash_value<Key>
+
if using Visual C++ .net +
+
+class Eq_Fn 
+
+
+

Equivalence functor.

+
+
+std::equal_to<Key>
+
+
+
+class Comb_Probe_Fn 
+
+
+

Combining probe functor.

+ +

If Hash_Fn is + null_hash_fn, and Probe_Fn is null_probe_fn, then this is the + ranged-probe functor; otherwise, this is the + range-hashing functor.

+ +

(See Design::Hash-Based + Containers::Hash Policies.)

+
direct_mask_range_hashing
+
+class Probe_Fn 
+
+
+

Probe functor.

+
+ If Comb_Probe_Fn + is direct_mask_range_hashing, then +
+linear_probe_fn<
+  typename Comb_Probe_Fn::size_type>
+
otherwise, +
+quadratic_probe_fn<
+  typename Comb_Probe_Fn::size_type>
+
+
+
+class Resize_Policy 
+
+
+

Resize policy.

+
+ If Comb_Probe_Fn + is direct_mask_range_hashing, + then +
+hash_standard_resize_policy<
+  hash_exponential_size_policy<
+    typename Comb_Probe_Fn::size_type>,
+  hash_load_check_resize_trigger<
+    typename Comb_Probe_Fn::size_type>,
+  false,
+  typename Comb_Probe_Fn::size_type>
+
otherwise, +
+hash_standard_resize_policy<
+  hash_exponential_size_policy<
+    typename Comb_Probe_Fn::size_type>,
+  hash_load_check_resize_trigger<
+    typename Comb_Probe_Fn::size_type>,
+  false,
+  typename Comb_Probe_Fn::size_type>
+
+
+
+bool Store_Hash 
+
+
+

Indicates whether the hash value will be stored along + with each key.

+ +

If hash_fn is null_hash_fn, then the container + will not compile if this value is + true

+
+
+false
+
+
+
+class Allocator 
+
+
+

Allocator type.

+
+
+std::allocator<char>
+
+
+ +

Base Classes

+ + + + + + + + + + + + + +
ClassDerivation Type
+
+basic_hash_table
+
+
+

public

+
+ +

Public Types and + Constants

+ +

Policy Definitions

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
TypeDefinitionDescription
+
+hash_fn
+
+
+
+Hash_Fn
+
+
+

Hash functor type.

+
+
+eq_fn
+
+
+
+Eq_Fn
+
+
+

Equivalence functor type.

+
+
+comb_probe_fn
+
+
+
+Comb_Probe_Fn
+
+
+

Combining probe functor type.

+
+
+probe_fn
+
+
+
+Probe_Fn
+
+
+

Probe functor type.

+
+
+resize_policy
+
+
+
+Resize_Policy
+
+
+

Resize policy type.

+
+ +

Public Methods

+ +

Constructors, Destructor, and + Related

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDescription
+
+  gp_hash_table
+  ()
+
+
+

Default constructor.

+
+
+  gp_hash_table
+  (const hash_fn &r_hash_fn)
+
+
+

Constructor taking some policy objects. r_hash_fn will be copied by the + hash_fn object of + the container object.

+
+
+  gp_hash_table
+  (const hash_fn &r_hash_fn, 
+    const eq_fn &r_eq_fn)
+
+
+

Constructor taking some policy objects. r_hash_fn will be copied by the + hash_fn object of + the container object, and r_eq_fn will be copied by the + eq_fn object of the + container object.

+
+
+  gp_hash_table
+  (const hash_fn &r_hash_fn, 
+    const eq_fn &r_eq_fn, 
+    const comb_probe_fn &r_comb_probe_fn)
+
+
+

Constructor taking some policy objects. r_hash_fn will be copied by the + hash_fn object of + the container object, r_eq_fn will be copied by the + eq_fn object of the + container object, and r_comb_probe_fn will be copied by + the comb_probe_fn + object of the container object.

+
+
+  gp_hash_table
+  (const hash_fn &r_hash_fn, 
+    const eq_fn &r_eq_fn, 
+    const comb_probe_fn &r_comb_probe_fn,
+    const probe_fn &r_probe_fn)
+
+
+

Constructor taking some policy objects. r_hash_fn will be copied by the + hash_fn object of + the container object, r_eq_fn will be copied by the + eq_fn object of the + container object, r_comb_probe_fn will be copied by + the comb_probe_fn + object of the container object, and r_probe_fn will be copied by the + probe_fn object + of the container object.

+
+
+  gp_hash_table
+  (const hash_fn &r_hash_fn, 
+    const eq_fn &r_eq_fn, 
+    const comb_probe_fn &r_comb_probe_fn, 
+    const probe_fn &r_probe_fn,
+    const resize_policy &r_resize_policy)
+
+
+

Constructor taking some policy objects. r_hash_fn will be copied by the + hash_fn object of + the container object, r_eq_fn will be copied by the + eq_fn object of the + container object, r_comb_probe_fn will be copied by + the comb_probe_fn + object of the container object, r_probe_fn will be copied by the + probe_fn object + of the container object, and r_resize_policy will be copied by + the Resize_Policy + object of the container object.

+
+
+template<
+    class It>
+  gp_hash_table
+  (It first_it, 
+    It last_it)
+
+
+

Constructor taking iterators to a range of + value_types. The value_types between first_it and last_it will be inserted into the + container object.

+
+
+template<
+    class It>
+  gp_hash_table
+  (It first_it, 
+    It last_it,
+    const hash_fn &r_hash_fn)
+
+
+

Constructor taking iterators to a range of value_types + and some policy objects. The value_types between + first_it and + last_it will be inserted + into the container object. r_hash_fn will be copied by the + hash_fn object of + the container object.

+
+
+template<
+    class It>
+  gp_hash_table
+  (It first_it, 
+    It last_it,
+    const hash_fn &r_hash_fn, 
+    const eq_fn &r_eq_fn)
+
+
+

Constructor taking iterators to a range of value_types + and some policy objects. The value_types between + first_it and + last_it will be inserted + into the container object. r_hash_fn will be copied by the + hash_fn object of + the container object, and r_eq_fn will be copied by the + eq_fn object of the + container object.

+
+
+template<
+    class It>
+  gp_hash_table
+  (It first_it, 
+    It last_it,
+    const hash_fn &r_hash_fn, 
+    const eq_fn &r_eq_fn, 
+    const comb_probe_fn &r_comb_probe_fn)
+
+
+

Constructor taking iterators to a range of value_types + and some policy objects. The value_types between + first_it and + last_it will be inserted + into the container object. r_hash_fn will be copied by the + hash_fn object of + the container object, r_eq_fn will be copied by the + eq_fn object of the + container object, and r_comb_probe_fn will be copied by + the comb_probe_fn + object of the container object.

+
+
+template<
+    class It>
+  gp_hash_table
+  (It first_it, 
+    It last_it,
+    const hash_fn &r_hash_fn, 
+    const eq_fn &r_eq_fn, 
+    const comb_probe_fn &r_comb_probe_fn,
+    const probe_fn &r_probe_fn)
+
+
+

Constructor taking iterators to a range of value_types + and some policy objects. The value_types between + first_it and + last_it will be inserted + into the container object. r_hash_fn will be copied by the + hash_fn object of + the container object, r_eq_fn will be copied by the + eq_fn object of the + container object, r_comb_probe_fn will be copied by + the comb_probe_fn + object of the container object, and r_probe_fn will be copied by the + probe_fn object + of the container object.

+
+
+template<
+    class It>
+  gp_hash_table
+  (It first_it, 
+    It last_it,
+    const hash_fn &r_hash_fn, 
+    const eq_fn &r_eq_fn, 
+    const comb_probe_fn &r_comb_probe_fn, 
+    const probe_fn &r_probe_fn,      
+    const resize_policy &r_resize_policy)
+
+
+

Constructor taking iterators to a range of value_types + and some policy objects. The value_types between + first_it and + last_it will be inserted + into the container object. r_hash_fn will be copied by the + hash_fn object of + the container object, r_eq_fn will be copied by the + eq_fn object of the + container object, r_comb_probe_fn will be copied by + the comb_probe_fn + object of the container object, r_probe_fn will be copied by the + probe_fn object + of the container object, and r_resize_policy will be copied by + the resize_policy + object of the container object.

+
+
+  gp_hash_table
+  (const gp_hash_table &other)
+
+
+

Copy constructor.

+
+
+virtual 
+  ~gp_hash_table
+  ()
+
+
+

Destructor.

+
+
+gp_hash_table &
+  operator=
+  (const gp_hash_table &other)
+
+
+

Assignment operator.

+
+
+void
+  swap
+  (gp_hash_table &other)
+
+
+

Swaps content.

+
+ +

Policy Access Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDescription
+
+comb_probe_fn &
+  get_comb_probe_fn
+  ()
+
+
+

Access to the comb_probe_fn + object.

+
+
+const comb_probe_fn &
+  get_comb_probe_fn
+  () const
+
+
+

Const access to the comb_probe_fn + object.

+
+
+probe_fn &
+  get_probe_fn
+  ()
+
+
+

Access to the probe_fn object.

+
+
+const probe_fn &
+  get_probe_fn
+  () const
+
+
+

Const access to the probe_fn object.

+
+
+ + diff --git a/libstdc++-v3/doc/html/ext/pb_ds/gp_hash_tag.html b/libstdc++-v3/doc/html/ext/pb_ds/gp_hash_tag.html new file mode 100644 index 00000000000..720984fff2f --- /dev/null +++ b/libstdc++-v3/doc/html/ext/pb_ds/gp_hash_tag.html @@ -0,0 +1,47 @@ + + + + + + + gp_hash_tag Interface + + + + +
+

gp_hash_tag Interface

+ +

General-probing hash data structure tag.

+ +

Defined in: tag_and_trait.hpp

+ +

Base Classes

+ + + + + + + + + + + + + +
ClassDerivation Type
+
+basic_hash_tag
+
+
+

public

+
+
+ + diff --git a/libstdc++-v3/doc/html/ext/pb_ds/hash_based_containers.html b/libstdc++-v3/doc/html/ext/pb_ds/hash_based_containers.html new file mode 100644 index 00000000000..21d092a76ef --- /dev/null +++ b/libstdc++-v3/doc/html/ext/pb_ds/hash_based_containers.html @@ -0,0 +1,835 @@ + + + + + + + Hash-Based Containers + + + + +
+

Hash Table Design

+ +

Overview

+ +

The collision-chaining hash-based container has the + following declaration.

+
+template<
+    typename Key,
+    typename Mapped,
+    typename Hash_Fn = std::hash<Key>,
+    typename Eq_Fn = std::equal_to<Key>,
+    typename Comb_Hash_Fn = direct_mask_range_hashing<>
+    typename Resize_Policy = default explained below.
+     bool Store_Hash = false,
+     typename Allocator = std::allocator<char> >
+class cc_hash_table;
+
+ +

The parameters have the following meaning:

+ +
    +
  1. Key is the key type.
  2. + +
  3. Mapped is the mapped-policy, and is explained in + Tutorial::Associative + Containers::Associative Containers Others than Maps.
  4. + +
  5. Hash_Fn is a key hashing functor.
  6. + +
  7. Eq_Fn is a key equivalence functor.
  8. + +
  9. Comb_Hash_Fn is a range-hashing_functor; + it describes how to translate hash values into positions + within the table. This is described in Hash Policies.
  10. + +
  11. Resize_Policy describes how a container object + should change its internal size. This is described in + Resize Policies.
  12. + +
  13. Store_Hash indicates whether the hash value + should be stored with each entry. This is described in + Policy Interaction.
  14. + +
  15. Allocator is an allocator + type.
  16. +
+ +

The probing hash-based container has the following + declaration.

+
+template<
+    typename Key,
+    typename Mapped,
+    typename Hash_Fn = std::hash<Key>,
+    typename Eq_Fn = std::equal_to<Key>,
+    typename Comb_Probe_Fn = direct_mask_range_hashing<>
+    typename Probe_Fn = default explained below.
+    typename Resize_Policy = default explained below.
+    bool Store_Hash = false,
+    typename Allocator =  std::allocator<char> >
+class gp_hash_table;
+
+ +

The parameters are identical to those of the + collision-chaining container, except for the following.

+ +
    +
  1. Comb_Probe_Fn describes how to transform a probe + sequence into a sequence of positions within the table.
  2. + +
  3. Probe_Fn describes a probe sequence policy.
  4. +
+ +

Some of the default template values depend on the values of + other parameters, and are explained in Policy Interaction.

+ +

Hash + Policies

+ +

General + Terms

+ +

Following is an explanation of some functions which hashing + involves. Figure Hash functions, + ranged-hash functions, and range-hashing functions) + illustrates the discussion.

+ +
+
+ +
Hash functions, ranged-hash functions, and + range-hashing functions.
+ +

Let U be a domain (e.g., the integers, or the + strings of 3 characters). A hash-table algorithm needs to map + elements of U "uniformly" into the range [0,..., m - + 1] (where m is a non-negative integral value, and + is, in general, time varying). I.e., the algorithm needs + a ranged-hash function

+ +

f : U × Z+ → Z+ + ,

+ +

such that for any u in U ,

+ +

0 ≤ f(u, m) ≤ m - 1 ,

+ +

and which has "good uniformity" properties [knuth98sorting]. One + common solution is to use the composition of the hash + function

+ +

h : U → Z+ ,

+ +

which maps elements of U into the non-negative + integrals, and

+ +

g : Z+ × Z+ → + Z+,

+ +

which maps a non-negative hash value, and a non-negative + range upper-bound into a non-negative integral in the range + between 0 (inclusive) and the range upper bound (exclusive), + i.e., for any r in Z+,

+ +

0 ≤ g(r, m) ≤ m - 1 .

+ +

The resulting ranged-hash function, is

+ +

f(u , m) = + g(h(u), m) (1) .

+ +

From the above, it is obvious that given g and + h, f can always be composed (however the converse + is not true). The STL's hash-based containers allow specifying + a hash function, and use a hard-wired range-hashing function; + the ranged-hash function is implicitly composed.

+ +

The above describes the case where a key is to be mapped + into a single position within a hash table, e.g., + in a collision-chaining table. In other cases, a key is to be + mapped into a sequence of positions within a table, + e.g., in a probing table. Similar terms apply in this + case: the table requires a ranged probe function, + mapping a key into a sequence of positions withing the table. + This is typically achieved by composing a hash function + mapping the key into a non-negative integral type, a + probe function transforming the hash value into a + sequence of hash values, and a range-hashing function + transforming the sequence of hash values into a sequence of + positions.

+ +

Range-Hashing Functions

+ +

Some common choices for range-hashing functions are the + division, multiplication, and middle-square methods [knuth98sorting], defined + as

+ +

g(r, m) = + r mod m (2) ,

+ +

g(r, m) = ⌈ u/v ( a r mod v ) ⌉ ,

+ +

and

+ +

g(r, m) = ⌈ u/v ( r2 mod v ) ⌉ + ,

+ +

respectively, for some positive integrals u and + v (typically powers of 2), and some a. Each of + these range-hashing functions works best for some different + setting.

+ +

The division method (2) is a + very common choice. However, even this single method can be + implemented in two very different ways. It is possible to + implement (2) using the low + level % (modulo) operation (for any m), or the + low level & (bit-mask) operation (for the case where + m is a power of 2), i.e.,

+ +

g(r, m) = r % m (3) ,

+ +

and

+ +

g(r, m) = r & m - 1, (m = + 2k) for some k) (4),

+ +

respectively.

+ +

The % (modulo) implementation (3) has the advantage that for + m a prime far from a power of 2, g(r, m) is + affected by all the bits of r (minimizing the chance of + collision). It has the disadvantage of using the costly modulo + operation. This method is hard-wired into SGI's implementation + [sgi_stl].

+ +

The & (bit-mask) implementation (4) has the advantage of + relying on the fast bit-wise and operation. It has the + disadvantage that for g(r, m) is affected only by the + low order bits of r. This method is hard-wired into + Dinkumware's implementation [dinkumware_stl].

+ +

Ranged-Hash + Functions

+ +

In cases it is beneficial to allow the + client to directly specify a ranged-hash hash function. It is + true, that the writer of the ranged-hash function cannot rely + on the values of m having specific numerical properties + suitable for hashing (in the sense used in [knuth98sorting]), since + the values of m are determined by a resize policy with + possibly orthogonal considerations.

+ +

There are two cases where a ranged-hash function can be + superior. The firs is when using perfect hashing [knuth98sorting]; the + second is when the values of m can be used to estimate + the "general" number of distinct values required. This is + described in the following.

+ +

Let

+ +

s = [ s0,..., st - 1]

+ +

be a string of t characters, each of which is from + domain S. Consider the following ranged-hash + function:

+ +

f1(s, m) = ∑ i = + 0t - 1 si ai mod + m (5) ,

+ +

where a is some non-negative integral value. This is + the standard string-hashing function used in SGI's + implementation (with a = 5) [sgi_stl]. Its advantage is that + it takes into account all of the characters of the string.

+ +

Now assume that s is the string representation of a + of a long DNA sequence (and so S = {'A', 'C', 'G', + 'T'}). In this case, scanning the entire string might be + prohibitively expensive. A possible alternative might be to use + only the first k characters of the string, where

+ +

|S|k ≥ m ,

+ +

i.e., using the hash function

+ +

f2(s, m) = ∑ i + = 0k - 1 si ai mod + m , (6)

+ +

requiring scanning over only

+ +

k = log4( m )

+ +

characters.

+ +

Other more elaborate hash-functions might scan k + characters starting at a random position (determined at each + resize), or scanning k random positions (determined at + each resize), i.e., using

+ +

f3(s, m) = ∑ i = + r0r0 + k - 1 si + ai mod m ,

+ +

or

+ +

f4(s, m) = ∑ i = 0k - + 1 sri ari mod + m ,

+ +

respectively, for r0,..., rk-1 + each in the (inclusive) range [0,...,t-1].

+ +

It should be noted that the above functions cannot be + decomposed as (1) .

+ +

Implementation

+ +

This sub-subsection describes the implementation of the + above in pb_ds. It first explains range-hashing + functions in collision-chaining tables, then ranged-hash + functions in collision-chaining tables, then probing-based + tables, and, finally, lists the relevant classes in + pb_ds.

+ +

Range-Hashing and Ranged-Hashes in Collision-Chaining + Tables

+ +

cc_hash_table is + parametrized by Hash_Fn and Comb_Hash_Fn, a + hash functor and a combining hash functor, respectively.

+ +

In general, Comb_Hash_Fn is considered a + range-hashing functor. cc_hash_table + synthesizes a ranged-hash function from Hash_Fn and + Comb_Hash_Fn (see (1) + above). Figure Insert + hash sequence diagram shows an insert sequence + diagram for this case. The user inserts an element (point A), + the container transforms the key into a non-negative integral + using the hash functor (points B and C), and transforms the + result into a position using the combining functor (points D + and E).

+ +
no image
+ +
Insert hash sequence diagram.
+ +

If cc_hash_table's + hash-functor, Hash_Fn is instantiated by null_hash_fn (see Interface::Concepts::Null + Policy Classes), then Comb_Hash_Fn is taken to be + a ranged-hash function. Figure Insert hash sequence diagram + with a null hash policy shows an insert sequence + diagram. The user inserts an element (point A), the container + transforms the key into a position using the combining functor + (points B and C).

+ +
+
+ +
Insert hash sequence diagram with a null hash + policy.
+ +

Probing Tables

+ +

gp_hash_table is + parametrized by Hash_Fn, Probe_Fn, and + Comb_Probe_Fn. As before, if Hash_Fn and + Probe_Fn are, respectively, null_hash_fn and null_probe_fn, then + Comb_Probe_Fn is a ranged-probe functor. Otherwise, + Hash_Fn is a hash functor, Probe_Fn is a + functor for offsets from a hash value, and + Comb_Probe_Fn transforms a probe sequence into a + sequence of positions within the table.

+ +

Pre-Defined Policies

+ +

pb_ds contains some pre-defined classes + implementing range-hashing and probing functions:

+ +
    +
  1. direct_mask_range_hashing + and direct_mod_range_hashing + are range-hashing functions based on a bit-mask and a modulo + operation, respectively.
  2. + +
  3. linear_probe_fn, and + quadratic_probe_fn are + a linear probe and a quadratic probe function, + respectively.
  4. +
Figure Hash policy class + diagram shows a class diagram. + +
+
+ +
Hash policy class diagram.
+ +

Resize + Policies

+ +

General Terms

+ +

Hash-tables, as opposed to trees, do not naturally grow or + shrink. It is necessary to specify policies to determine how + and when a hash table should change its size. Usually, resize + policies can be decomposed into orthogonal policies:

+ +
    +
  1. A size policy indicating how a hash table + should grow (e.g., it should multiply by powers of + 2).
  2. + +
  3. A trigger policy indicating when a hash + table should grow (e.g., a load factor is + exceeded).
  4. +
+ +

Size + Policies

+ +

Size policies determine how a hash table changes size. These + policies are simple, and there are relatively few sensible + options. An exponential-size policy (with the initial size and + growth factors both powers of 2) works well with a mask-based + range-hashing function (see Range-Hashing Policies), and is the + hard-wired policy used by Dinkumware [dinkumware_stl]. A + prime-list based policy works well with a modulo-prime range + hashing function (see Range-Hashing + Policies), and is the hard-wired policy used by SGI's + implementation [sgi_stl].

+ +

Trigger + Policies

+ +

Trigger policies determine when a hash table changes size. + Following is a description of two policies: load-check + policies, and collision-check policies.

+ +

Load-check policies are straightforward. The user specifies + two factors, αmin and + αmax, and the hash table maintains the + invariant that

+ +

αmin ≤ (number of + stored elements) / (hash-table size) ≤ + αmax (1) .

+ +

Collision-check policies work in the opposite direction of + load-check policies. They focus on keeping the number of + collisions moderate and hoping that the size of the table will + not grow very large, instead of keeping a moderate load-factor + and hoping that the number of collisions will be small. A + maximal collision-check policy resizes when the longest + probe-sequence grows too large.

+ +

Consider Figure Balls and + bins. Let the size of the hash table be denoted by + m, the length of a probe sequence be denoted by + k, and some load factor be denoted by α. We would + like to calculate the minimal length of k, such that if + there were α m elements in the hash table, a probe + sequence of length k would be found with probability at + most 1/m.

+ +
+
+ +
Balls and bins.
+ +

Denote the probability that a probe sequence of length + k appears in bin i by pi, the + length of the probe sequence of bin i by + li, and assume uniform distribution. Then

+ +

p1 = (3)

+ +

P(l1 ≥ k) =

+ +

P(l1 ≥ α ( 1 + k / α - 1 + ) ≤ (a)

+ +

e ^ ( - ( α ( k / α - 1 )2 ) /2 + ) ,

+ +

where (a) follows from the Chernoff bound [motwani95random]. To + calculate the probability that some bin contains a probe + sequence greater than k, we note that the + li are negatively-dependent [dubhashi98neg]. Let + I(.) denote the indicator function. Then

+ +

P( existsi + li ≥ k ) = (3)

+ +

P ( ∑ i = 1m + I(li ≥ k) ≥ 1 ) =

+ +

P ( ∑ i = 1m I ( + li ≥ k ) ≥ m p1 ( 1 + 1 / (m + p1) - 1 ) ) ≤ (a)

+ +

e ^ ( ( - m p1 ( 1 / (m p1) + - 1 ) 2 ) / 2 ) ,

+ +

where (a) follows from the fact that the Chernoff bound can + be applied to negatively-dependent variables [dubhashi98neg]. Inserting + (2) into (3), and equating with + 1/m, we obtain

+ +

k ~ √ ( 2 α ln 2 m ln(m) ) + ) .

+ +

Implementation

+ +

This sub-subsection describes the implementation of the + above in pb_ds. It first describes resize policies and + their decomposition into trigger and size policies, then + describes pre-defined classes, and finally discusses controlled + access the policies' internals.

+ +

Resize Policies and Their Decomposition

+ +

Each hash-based container is parametrized by a + Resize_Policy parameter; the container derives + publicly from Resize_Policy. For + example:

+
+cc_hash_table<
+    typename Key,
+    typename Mapped,
+    ...
+    typename Resize_Policy
+    ...> :
+        public Resize_Policy
+
+ +

As a container object is modified, it continuously notifies + its Resize_Policy base of internal changes + (e.g., collisions encountered and elements being + inserted). It queries its Resize_Policy base whether + it needs to be resized, and if so, to what size.

+ +

Figure Insert + resize sequence diagram shows a (possible) sequence diagram + of an insert operation. The user inserts an element; the hash + table notifies its resize policy that a search has started + (point A); in this case, a single collision is encountered - + the table notifies its resize policy of this (point B); the + container finally notifies its resize policy that the search + has ended (point C); it then queries its resize policy whether + a resize is needed, and if so, what is the new size (points D + to G); following the resize, it notifies the policy that a + resize has completed (point H); finally, the element is + inserted, and the policy notified (point I).

+ +
+
+ +
Insert resize sequence diagram.
+ +

In practice, a resize policy can be usually orthogonally + decomposed to a size policy and a trigger policy. Consequently, + the library contains a single class for instantiating a resize + policy: hash_standard_resize_policy + is parametrized by Size_Policy and + Trigger_Policy, derives publicly from + both, and acts as a standard delegate [gamma95designpatterns] + to these policies.

+ +

Figures Standard + resize policy trigger sequence diagram and Standard resize policy size + sequence diagram show sequence diagrams illustrating the + interaction between the standard resize policy and its trigger + and size policies, respectively.

+ +
+
+ +
Standard resize policy trigger sequence + diagram.
+ +
+
+ +
Standard resize policy size sequence + diagram.
+ +

Pre-Defined Policies

+ +

The library includes the following + instantiations of size and trigger policies:

+ +
    +
  1. hash_load_check_resize_trigger + implements a load check trigger policy.
  2. + +
  3. cc_hash_max_collision_check_resize_trigger + implements a collision check trigger policy.
  4. + +
  5. hash_exponential_size_policy + implements an exponential-size policy (which should be used + with mask range hashing).
  6. + +
  7. hash_prime_size_policy + implementing a size policy based on a sequence of primes + [sgi_stl] (which should + be used with mod range hashing
  8. +
+ +

Figure Resize policy class + diagram gives an overall picture of the resize-related + classes. basic_hash_table + is parametrized by Resize_Policy, which it subclasses + publicly. This class is currently instantiated only by hash_standard_resize_policy. + hash_standard_resize_policy + itself is parametrized by Trigger_Policy and + Size_Policy. Currently, Trigger_Policy is + instantiated by hash_load_check_resize_trigger, + or cc_hash_max_collision_check_resize_trigger; + Size_Policy is instantiated by hash_exponential_size_policy, + or hash_prime_size_policy.

+ +
+
+ +
Resize policy class diagram.
+ +

Controlled Access to Policies' Internals

+ +

There are cases where (controlled) access to resize + policies' internals is beneficial. E.g., it is sometimes + useful to query a hash-table for the table's actual size (as + opposed to its size() - the number of values it + currently holds); it is sometimes useful to set a table's + initial size, externally resize it, or change load factors.

+ +

Clearly, supporting such methods both decreases the + encapsulation of hash-based containers, and increases the + diversity between different associative-containers' interfaces. + Conversely, omitting such methods can decrease containers' + flexibility.

+ +

In order to avoid, to the extent possible, the above + conflict, the hash-based containers themselves do not address + any of these questions; this is deferred to the resize policies, + which are easier to change or replace. Thus, for example, + neither cc_hash_table nor + gp_hash_table + contain methods for querying the actual size of the table; this + is deferred to hash_standard_resize_policy.

+ +

Furthermore, the policies themselves are parametrized by + template arguments that determine the methods they support + ([alexandrescu01modern] + shows techniques for doing so). hash_standard_resize_policy + is parametrized by External_Size_Access that + determines whether it supports methods for querying the actual + size of the table or resizing it. hash_load_check_resize_trigger + is parametrized by External_Load_Access that + determines whether it supports methods for querying or + modifying the loads. cc_hash_max_collision_check_resize_trigger + is parametrized by External_Load_Access that + determines whether it supports methods for querying the + load.

+ +

Some operations, for example, resizing a container at + run time, or changing the load factors of a load-check trigger + policy, require the container itself to resize. As mentioned + above, the hash-based containers themselves do not contain + these types of methods, only their resize policies. + Consequently, there must be some mechanism for a resize policy + to manipulate the hash-based container. As the hash-based + container is a subclass of the resize policy, this is done + through virtual methods. Each hash-based container has a + private virtual method:

+
+virtual void
+    do_resize
+    (size_type new_size);
+
+ +

which resizes the container. Implementations of + Resize_Policy can export public methods for resizing + the container externally; these methods internally call + do_resize to resize the table.

+ +

Policy + Interaction

+ +

Hash-tables are unfortunately especially susceptible to + choice of policies. One of the more complicated aspects of this + is that poor combinations of good policies can form a poor + container. Following are some considerations.

+ +

Probe Policies, Size + Policies, and Trigger Policies

+ +

Some combinations do not work well for probing containers. + For example, combining a quadratic probe policy with an + exponential size policy can yield a poor container: when an + element is inserted, a trigger policy might decide that there + is no need to resize, as the table still contains unused + entries; the probe sequence, however, might never reach any of + the unused entries.

+ +

Unfortunately, pb_ds cannot detect such problems at + compilation (they are halting reducible). It therefore defines + an exception class insert_error to throw an + exception in this case.

+ +

Hash Policies and Trigger + Policies

+ +

Some trigger policies are especially susceptible to poor + hash functions. Suppose, as an extreme case, that the hash + function transforms each key to the same hash value. After some + inserts, a collision detecting policy will always indicate that + the container needs to grow.

+ +

The library, therefore, by design, limits each operation to + one resize. For each insert, for example, it queries + only once whether a resize is needed.

+ +

Equivalence Functors, Storing + Hash Values, and Hash Functions

+ +

cc_hash_table and + gp_hash_table are + parametrized by an equivalence functor and by a + Store_Hash parameter. If the latter parameter is + true, then the container stores with each entry + a hash value, and uses this value in case of collisions to + determine whether to apply a hash value. This can lower the + cost of collision for some types, but increase the cost of + collisions for other types.

+ +

If a ranged-hash function or ranged probe function is + directly supplied, however, then it makes no sense to store the + hash value with each entry. pb_ds's container will + fail at compilation, by design, if this is attempted.

+ +

Size Policies and + Load-Check Trigger Policies

+ +

Assume a size policy issues an increasing sequence of sizes + a, a q, a q1, a q2, ... For + example, an exponential size policy might issue the sequence of + sizes 8, 16, 32, 64, ...

+ +

If a load-check trigger policy is used, with loads + αmin and αmax, + respectively, then it is a good idea to have:

+ +
    +
  1. αmax ~ 1 / q
  2. + +
  3. αmin < 1 / (2 q)
  4. +
+ +

This will ensure that the amortized hash cost of each + modifying operation is at most approximately 3.

+ +

αmin ~ αmax is, in + any case, a bad choice, and αmin > + αmax is horrendous.

+
+ + diff --git a/libstdc++-v3/doc/html/ext/pb_ds/hash_exponential_size_policy.html b/libstdc++-v3/doc/html/ext/pb_ds/hash_exponential_size_policy.html new file mode 100644 index 00000000000..059fa48d7f5 --- /dev/null +++ b/libstdc++-v3/doc/html/ext/pb_ds/hash_exponential_size_policy.html @@ -0,0 +1,183 @@ + + + + + + + hash_exponential_size_policy Interface + + + + +
+

hash_exponential_size_policy Interface

+ +

A size policy whose sequence of sizes form an exponential + sequence (typically powers of 2)

+ +

Defined in: hash_policy.hpp

+ +

Template Parameters

+ + + + + + + + + + + + + + + + + +
ParameterDescriptionDefault Value
+
+typename Size_Type 
+
+
+

Size type.

+
size_t
+ +

Public Types and + Constants

+ +

General Definitions

+ + + + + + + + + + + + + + + + + +
TypeDefinitionDescription
+
+size_type
+
+
+
+Size_Type
+
+
+

Size type.

+
+ +

Public Methods

+ +

Constructors, Destructor, and + Related

+ + + + + + + + + + + + + + + + + + + +
MethodDescription
+
+  hash_exponential_size_policy
+  (size_type start_size = 8, 
+    size_type grow_factor = 2)
+
+
+

Default constructor, or constructor taking a + start_size, or + constructor taking a start size and grow_factor. The policy will use the + sequence of sizes start_size, start_size * grow_factor, start_size * grow_factor^2, ...

+
+
+void 
+  swap
+  (hash_exponential_size_policy &other)
+
+
+

Swaps content.

+
+ +

Protected Methods

+ +

Size methods

+ + + + + + + + + + + + + + + + + + + +
MethodDescription
+
+size_type
+  get_nearest_larger_size
+  (size_type size) const
+
+
+

Given a size size, + returns a size that is larger.

+
+
+size_type
+  get_nearest_smaller_size
+  (size_type size) const
+
+
+

Given a size size, + returns a size that is smaller.

+
+
+ + diff --git a/libstdc++-v3/doc/html/ext/pb_ds/hash_load_check_resize_trigger.html b/libstdc++-v3/doc/html/ext/pb_ds/hash_load_check_resize_trigger.html new file mode 100644 index 00000000000..0013e0127c0 --- /dev/null +++ b/libstdc++-v3/doc/html/ext/pb_ds/hash_load_check_resize_trigger.html @@ -0,0 +1,583 @@ + + + + + + + hash_load_check_resize_trigger Interface + + + + +
+

hash_load_check_resize_trigger Interface

+ +

A resize trigger policy based on a load check. It keeps the + load factor between some load factors load_min and + load_max.

+ +

Defined in: hash_policy.hpp

+ +

Template Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterDescriptionDefault Value
+
+bool External_Load_Access 
+
+
+

Specifies whether the load factor can be accessed + externally. The two options have different trade-offs in + terms of flexibility, genericity, and encapsulation.

+
false
+
+typename Size_Type 
+
+
+

Size type.

+
size_t
+ +

Public Types and + Constants

+ +

General Definitions

+ + + + + + + + + + + + + + + + + + + + + + + + + +
TypeDefinitionDescription
+
+size_type
+
+
+
+Size_Type
+
+
+

Size type.

+
+
+external_load_access
+
+
+
+External_Load_Access
+
+
+

Indicates whether loads can be accessed externally

+
+ +

Public Methods

+ +

Constructors, Destructor, and + Related

+ + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDescription
+
+  hash_load_check_resize_trigger
+  (float load_min = 0.125, 
+    float load_max = 0.5)
+
+
+

Default constructor, or constructor taking + load_min and + load_max load factors + between which this policy will keep the actual load.

+ +

It is the responsibility of the user to ensure that + load_min is smaller than + load_max.

+
+
+void
+  swap
+  (hash_load_check_resize_trigger &other)
+
+
+

Swaps content.

+
+
+  virtual
+    ~hash_load_check_resize_trigger
+    ()
+
+
+

Destructor.

+
+ +

Load Access Methods

+ +

These methods are only available if the external access + parameter is set.

+ + + + + + + + + + + + + + + + + + + +
MethodDescription
+
+inline std::pair<float, float>
+  get_loads
+  () const
+
+
+

Returns a pair of the minimal and maximal loads, + respectively.

+ +

Calling this method will not compile when External_Load_Access + == false.

+
+
+void 
+  set_loads
+  (std::pair<float, float> load_pair)
+
+
+

Sets the loads through a pair of the minimal and + maximal loads, respectively.

+ +

Calling this method resizes the container, and might + throw an exception. It is the responsibility of the user + to pass appropriate loads to this function. Calling this + method will not compile when External_Load_Access + == false.

+
+ +

Protected Methods

+ +

Insert Search + Notifications.

+ +

Notifications called during an insert operation.

+ + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDescription
+
+inline void
+  notify_insert_search_start
+  ()
+
+
+

Notifies a search started.

+
+
+inline void
+  notify_insert_search_collision
+  ()
+
+
+

Notifies a search encountered a collision.

+
+
+inline void
+  notify_insert_search_end
+  ()
+
+
+

Notifies a search ended.

+
+ +

Find Search + Notifications.

+ +

Notifications called during a find operation.

+ + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDescription
+
+inline void
+  notify_find_search_start
+  ()
+
+
+

Notifies a search started.

+
+
+inline void
+  notify_find_search_collision
+  ()
+
+
+

Notifies a search encountered a collision.

+
+
+inline void
+  notify_find_search_end
+  ()
+
+
+

Notifies a search ended.

+
+ +

Erase Search + Notifications.

+ +

Notifications called during an insert operation.

+ + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDescription
+
+inline void
+  notify_erase_search_start
+  ()
+
+
+

Notifies a search started.

+
+
+inline void
+  notify_erase_search_collision
+  ()
+
+
+

Notifies a search encountered a collision.

+
+
+inline void
+  notify_erase_search_end
+  ()
+
+
+

Notifies a search ended.

+
+ +

Content Change + Notifications.

+ +

Notifications called when the content of the table changes + in a way that can affect the resize policy.

+ + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDescription
+
+inline void
+  notify_inserted
+  (size_type num_entries)
+
+
+

Notifies an element was inserted. the total number of + entries in the table is num_entries.

+
+
+inline void
+  notify_erased
+  (size_type num_entries)
+
+
+

Notifies an element was erased.

+
+
+void 
+  notify_cleared
+  ()
+
+
+

Notifies the table was cleared.

+
+ +

Size Change + Notifications.

+ +

Notifications called when the table changes size.

+ + + + + + + + + + + + + + + + + + + +
MethodDescription
+
+void
+  notify_resized
+  (size_type new_size)
+
+
+

Notifies the table was resized as a result of this + object's signifying that a resize is needed.

+
+
+void
+  notify_externally_resized
+  (size_type new_size)
+
+
+

Notifies the table was resized externally.

+
+ +

Queries

+ +

Called to query whether/how to resize.

+ + + + + + + + + + + + + + + + + + + +
MethodDescription
+
+inline bool 
+  is_resize_needed
+  () const
+
+
+

Queries whether a resize is needed.

+
+
+inline bool
+  is_grow_needed
+  (size_type size, 
+    size_type num_entries) const
+
+
+

Queries whether a grow is needed.

+ +

This method is called only if this object indicated + resize is needed. The actual size of the table is size, and the number of entries in + it is num_entries.

+
+ +

Private Methods

+ +

Overrides

+ + + + + + + + + + + + + +
MethodDescription
+
+virtual void
+  do_resize
+  (size_type new_size)
+
+
+

Resizes to new_size.

+
+
+ + diff --git a/libstdc++-v3/doc/html/ext/pb_ds/hash_policy_cd.png b/libstdc++-v3/doc/html/ext/pb_ds/hash_policy_cd.png new file mode 100644 index 00000000000..f3122a112fc Binary files /dev/null and b/libstdc++-v3/doc/html/ext/pb_ds/hash_policy_cd.png differ diff --git a/libstdc++-v3/doc/html/ext/pb_ds/hash_prime_size_policy.html b/libstdc++-v3/doc/html/ext/pb_ds/hash_prime_size_policy.html new file mode 100644 index 00000000000..cf67dabe078 --- /dev/null +++ b/libstdc++-v3/doc/html/ext/pb_ds/hash_prime_size_policy.html @@ -0,0 +1,149 @@ + + + + + + + hash_prime_size_policy Interface + + + + +
+

hash_prime_size_policy Interface

+ +

A size policy whose sequence of sizes form a + nearly-exponential sequence of primes.

+ +

Defined in: hash_policy.hpp

+ +

Public Types and + Constants

+ +

General Definitions

+ + + + + + + + + + + + + + + + + +
TypeDefinitionDescription
+
+size_type
+
+
+
+size_t
+
+
+

Size type.

+
+ +

Public Methods

+ +

Constructors, Destructor, and + Related

+ + + + + + + + + + + + + + + + + + + +
MethodDescription
+
+  hash_prime_size_policy
+  (size_type start_size = 8)
+
+
+

Default constructor, or constructor taking a + start_size The policy + will use the sequence of sizes approximately start_size, start_size * 2, start_size * 2^2, ...

+
+
+inline void
+  swap
+  (hash_prime_size_policy &other)
+
+
+

Swaps content.

+
+ +

Protected Methods

+ +

Size methods

+ + + + + + + + + + + + + + + + + + + +
MethodDescription
+
+size_type
+  get_nearest_larger_size
+  (size_type size) const
+
+
+

Given a size size, + returns a size that is larger.

+
+
+size_type
+  get_nearest_smaller_size
+  (size_type size) const
+
+
+

Given a size size, + returns a size that is smaller.

+
+
+ + diff --git a/libstdc++-v3/doc/html/ext/pb_ds/hash_random_int_erase_mem_usage_test.html b/libstdc++-v3/doc/html/ext/pb_ds/hash_random_int_erase_mem_usage_test.html new file mode 100644 index 00000000000..073c84c2bba --- /dev/null +++ b/libstdc++-v3/doc/html/ext/pb_ds/hash_random_int_erase_mem_usage_test.html @@ -0,0 +1,173 @@ + + + + + +Tree Text Locality of Reference Timing Test + + + +
+

Hash-Based Erase Memory-Use Test

+

Description

+

This test inserts a number of uniform i.i.d. integer keys + into a container, then erases all keys except one. It measures + the final size of the container.

+

(The test was executed with hash_random_int_erase_mem_usage.cc + 2000 2000 2100)

+

Purpose

+

The test checks how containers adjust internally as their + logical size decreases (see Motivation::Associative + Containers::Slightly Different Methods::Methods Related to + Erase).

+

Results

+

Figures NHG, NHM and + NHL show the results for the native and + collision-chaining types in g++, msvc++ and + local, + respectively.

+
+
+
+
+
no image
NHG: Native, collision-chaing, and probing, hash random int erase test - g++

In the above figure, the names in the legends have the following meaning:

+
    +
  1. +n_hash_set_ncah- +std::tr1::unordered_set with cache_hash_code = false
  2. +
  3. +gp_hash_mask_linp_exp_nea_lc_1div8_1div2_nsth_set- +gp_hash_table + with Comb_Hash_Fn = direct_mask_range_hashing +, Resize_Policy = hash_standard_resize_policy + with Size_Policy = hash_exponential_size_policy +, and Trigger_Policy = hash_load_check_resize_trigger + with αmin = 1/8 and αmax = 1/2, and Probe_Fn = linear_probe_fn +
  4. +
  5. +cc_hash_mod_prime_nea_lc_1div8_1div1_nsth_set- +cc_hash_table +with Comb_Hash_Fn = direct_mod_range_hashing +, and Resize_Policy = hash_standard_resize_policy + with Size_Policy = hash_prime_size_policy +, and Trigger_Policy = hash_load_check_resize_trigger + with αmin = 1/8 and αmax = 1/1
  6. +
  7. +cc_hash_mask_exp_nea_lc_1div8_1div2_nsth_set- +cc_hash_table +with Comb_Hash_Fn = direct_mask_range_hashing +, and Resize_Policy = hash_standard_resize_policy + with Size_Policy = hash_exponential_size_policy +, and Trigger_Policy = hash_load_check_resize_trigger + with αmin = 1/8 and αmax = 1/2
  8. +
+
+
+
+
+
+
+
+
+
+
no image
NHM: Native, collision-chaing, and probing, hash random int erase test - msvc++

In the above figure, the names in the legends have the following meaning:

+
    +
  1. +n_hash_set_ncah- +stdext::hash_set
  2. +
  3. +gp_hash_mask_linp_exp_nea_lc_1div8_1div2_nsth_set- +gp_hash_table + with Comb_Hash_Fn = direct_mask_range_hashing +, Resize_Policy = hash_standard_resize_policy + with Size_Policy = hash_exponential_size_policy +, and Trigger_Policy = hash_load_check_resize_trigger + with αmin = 1/8 and αmax = 1/2, and Probe_Fn = linear_probe_fn +
  4. +
  5. +cc_hash_mod_prime_nea_lc_1div8_1div1_nsth_set- +cc_hash_table +with Comb_Hash_Fn = direct_mod_range_hashing +, and Resize_Policy = hash_standard_resize_policy + with Size_Policy = hash_prime_size_policy +, and Trigger_Policy = hash_load_check_resize_trigger + with αmin = 1/8 and αmax = 1/1
  6. +
  7. +cc_hash_mask_exp_nea_lc_1div8_1div2_nsth_set- +cc_hash_table +with Comb_Hash_Fn = direct_mask_range_hashing +, and Resize_Policy = hash_standard_resize_policy + with Size_Policy = hash_exponential_size_policy +, and Trigger_Policy = hash_load_check_resize_trigger + with αmin = 1/8 and αmax = 1/2
  8. +
+
+
+
+
+
+
+
+
+
+
no image
NHM: Native, collision-chaing, and probing, hash random int erase test - msvc++

In the above figure, the names in the legends have the following meaning:

+
    +
  1. +n_hash_set_ncah- +stdext::hash_set
  2. +
  3. +gp_hash_mask_linp_exp_nea_lc_1div8_1div2_nsth_set- +gp_hash_table + with Comb_Hash_Fn = direct_mask_range_hashing +, Resize_Policy = hash_standard_resize_policy + with Size_Policy = hash_exponential_size_policy +, and Trigger_Policy = hash_load_check_resize_trigger + with αmin = 1/8 and αmax = 1/2, and Probe_Fn = linear_probe_fn +
  4. +
  5. +cc_hash_mod_prime_nea_lc_1div8_1div1_nsth_set- +cc_hash_table +with Comb_Hash_Fn = direct_mod_range_hashing +, and Resize_Policy = hash_standard_resize_policy + with Size_Policy = hash_prime_size_policy +, and Trigger_Policy = hash_load_check_resize_trigger + with αmin = 1/8 and αmax = 1/1
  6. +
  7. +cc_hash_mask_exp_nea_lc_1div8_1div2_nsth_set- +cc_hash_table +with Comb_Hash_Fn = direct_mask_range_hashing +, and Resize_Policy = hash_standard_resize_policy + with Size_Policy = hash_exponential_size_policy +, and Trigger_Policy = hash_load_check_resize_trigger + with αmin = 1/8 and αmax = 1/2
  8. +
+
+
+
+
+
+
+
+
+
+
no image
NHL: Native, collision-chaing, and probing, hash random int erase test - local
+
+
+
+
+

Observations

+

STL hash-based containers act very differently than trees in + this respect. When erasing numerous keys from an STL + associative-container, the resulting memory user varies greatly + depending on whether the container is tree-based or hash-based. + As noted in Motivation::Choice of + Methods , this is a fundamental consequence of the STL's + associative containers' interface, it is not due to a specific + implementation.

+

(See Priority Queue + Text pop Memory Use Test for a similar phenomenon + regarding priority queues.)

+
+ + diff --git a/libstdc++-v3/doc/html/ext/pb_ds/hash_random_int_erase_mem_usage_test_gcc.png b/libstdc++-v3/doc/html/ext/pb_ds/hash_random_int_erase_mem_usage_test_gcc.png new file mode 100644 index 00000000000..c552506a755 Binary files /dev/null and b/libstdc++-v3/doc/html/ext/pb_ds/hash_random_int_erase_mem_usage_test_gcc.png differ diff --git a/libstdc++-v3/doc/html/ext/pb_ds/hash_random_int_erase_mem_usage_test_local.png b/libstdc++-v3/doc/html/ext/pb_ds/hash_random_int_erase_mem_usage_test_local.png new file mode 100644 index 00000000000..dbd3ee9d3c0 Binary files /dev/null and b/libstdc++-v3/doc/html/ext/pb_ds/hash_random_int_erase_mem_usage_test_local.png differ diff --git a/libstdc++-v3/doc/html/ext/pb_ds/hash_random_int_erase_mem_usage_test_msvc.png b/libstdc++-v3/doc/html/ext/pb_ds/hash_random_int_erase_mem_usage_test_msvc.png new file mode 100644 index 00000000000..8c23d46da39 Binary files /dev/null and b/libstdc++-v3/doc/html/ext/pb_ds/hash_random_int_erase_mem_usage_test_msvc.png differ diff --git a/libstdc++-v3/doc/html/ext/pb_ds/hash_random_int_find_find_timing_test.html b/libstdc++-v3/doc/html/ext/pb_ds/hash_random_int_find_find_timing_test.html new file mode 100644 index 00000000000..7e7f2084b08 --- /dev/null +++ b/libstdc++-v3/doc/html/ext/pb_ds/hash_random_int_find_find_timing_test.html @@ -0,0 +1,247 @@ + + + + + +Hash Random Int Find Timing Test + + + +
+

Hash-Based Random-Integer find Find Timing + Test

+

Description

+

This test inserts a number of values with uniform i.i.d. + integer keys into a container, then performs a series of finds + using find. It measures the average time + forfind as a function of the number of values + inserted.

+

(The test was executed with random_int_find_timing_test + 200 200 2100)

+

Purpose

+

The test checks the effect of different underlying + hash-tables (see Design::Associative + Containers::Associative Containers::Hash-Based Containers), + range-hashing functions, and trigger policies (see Design::Associative + Containers::Hash-Based Containers::Hash Policies and + Design::Associative + Containers::Hash-Based Containers::Resize Policies).

+

Results

+

Figures NCCG, NCCM, + and NCCL show the results for the native + and collision-chaining types in g++, MSVC++, and + local, + respectively; Figures NGPG, NGPM, and NGPL show the results + for the native and probing types in g++, MSVC++, and + local + respectively.

+
+
+
+
+
no image
NCCG: Native and collision-chaining hash random int find timing test using find - g++

In the above figure, the names in the legends have the following meaning:

+
    +
  1. +n_hash_map_ncah- +std::tr1::unordered_map with cache_hash_code = false
  2. +
  3. +cc_hash_mod_prime_nea_lc_1div8_1div1_nsth_map- +cc_hash_table +with Comb_Hash_Fn = direct_mod_range_hashing +, and Resize_Policy = hash_standard_resize_policy + with Size_Policy = hash_prime_size_policy +, and Trigger_Policy = hash_load_check_resize_trigger + with αmin = 1/8 and αmax = 1/1
  4. +
  5. +cc_hash_mod_prime_nea_lc_1div8_1div2_nsth_map- +cc_hash_table +with Comb_Hash_Fn = direct_mod_range_hashing +, and Resize_Policy = hash_standard_resize_policy + with Size_Policy = hash_prime_size_policy +, and Trigger_Policy = hash_load_check_resize_trigger + with αmin = 1/8 and αmax = 1/2
  6. +
  7. +cc_hash_mask_exp_nea_lc_1div8_1div1_nsth_map- +cc_hash_table +with Comb_Hash_Fn = direct_mask_range_hashing +, and Resize_Policy = hash_standard_resize_policy + with Size_Policy = hash_exponential_size_policy +, and Trigger_Policy = hash_load_check_resize_trigger + with αmin = 1/8 and αmax = 1/1
  8. +
  9. +cc_hash_mask_exp_nea_lc_1div8_1div2_nsth_map- +cc_hash_table +with Comb_Hash_Fn = direct_mask_range_hashing +, and Resize_Policy = hash_standard_resize_policy + with Size_Policy = hash_exponential_size_policy +, and Trigger_Policy = hash_load_check_resize_trigger + with αmin = 1/8 and αmax = 1/2
  10. +
+
+
+
+
+
+
+
+
+
+
no image
NCCM: Native and collision-chaining hash random int find timing test using find - msvc++

In the above figure, the names in the legends have the following meaning:

+
    +
  1. +cc_hash_mod_prime_nea_lc_1div8_1div1_nsth_map- +cc_hash_table +with Comb_Hash_Fn = direct_mod_range_hashing +, and Resize_Policy = hash_standard_resize_policy + with Size_Policy = hash_prime_size_policy +, and Trigger_Policy = hash_load_check_resize_trigger + with αmin = 1/8 and αmax = 1/1
  2. +
  3. +cc_hash_mod_prime_nea_lc_1div8_1div2_nsth_map- +cc_hash_table +with Comb_Hash_Fn = direct_mod_range_hashing +, and Resize_Policy = hash_standard_resize_policy + with Size_Policy = hash_prime_size_policy +, and Trigger_Policy = hash_load_check_resize_trigger + with αmin = 1/8 and αmax = 1/2
  4. +
  5. +n_hash_map_ncah- +stdext::hash_map
  6. +
  7. +cc_hash_mask_exp_nea_lc_1div8_1div1_nsth_map- +cc_hash_table +with Comb_Hash_Fn = direct_mask_range_hashing +, and Resize_Policy = hash_standard_resize_policy + with Size_Policy = hash_exponential_size_policy +, and Trigger_Policy = hash_load_check_resize_trigger + with αmin = 1/8 and αmax = 1/1
  8. +
  9. +cc_hash_mask_exp_nea_lc_1div8_1div2_nsth_map- +cc_hash_table +with Comb_Hash_Fn = direct_mask_range_hashing +, and Resize_Policy = hash_standard_resize_policy + with Size_Policy = hash_exponential_size_policy +, and Trigger_Policy = hash_load_check_resize_trigger + with αmin = 1/8 and αmax = 1/2
  10. +
+
+
+
+
+
+
+
+
+
+
no image
NCCL: Native and collision-chaining hash random int find timing test using find - local
+
+
+
+
+
+
+
+
+
no image
NGPG: Native and collision-chaining hash random int find timing test using find - g++

In the above figure, the names in the legends have the following meaning:

+
    +
  1. +gp_hash_mod_quadp_prime_nea_lc_1div8_1div2_nsth_map- +gp_hash_table + with Comb_Hash_Fn = direct_mod_range_hashing +, Resize_Policy = hash_standard_resize_policy + with Size_Policy = hash_prime_size_policy +, and Trigger_Policy = hash_load_check_resize_trigger + with αmin = 1/8 and αmax = 1/2, and Probe_Fn = quadratic_probe_fn +
  2. +
  3. +n_hash_map_ncah- +std::tr1::unordered_map with cache_hash_code = false
  4. +
  5. +gp_hash_mask_linp_exp_nea_lc_1div8_1div2_nsth_map- +gp_hash_table + with Comb_Hash_Fn = direct_mask_range_hashing +, Resize_Policy = hash_standard_resize_policy + with Size_Policy = hash_exponential_size_policy +, and Trigger_Policy = hash_load_check_resize_trigger + with αmin = 1/8 and αmax = 1/2, and Probe_Fn = linear_probe_fn +
  6. +
+
+
+
+
+
+
+
+
+
+
no image
NGPM: Native and collision-chaining hash random int find timing test using find - msvc++

In the above figure, the names in the legends have the following meaning:

+
    +
  1. +gp_hash_mod_quadp_prime_nea_lc_1div8_1div2_nsth_map- +gp_hash_table + with Comb_Hash_Fn = direct_mod_range_hashing +, Resize_Policy = hash_standard_resize_policy + with Size_Policy = hash_prime_size_policy +, and Trigger_Policy = hash_load_check_resize_trigger + with αmin = 1/8 and αmax = 1/2, and Probe_Fn = quadratic_probe_fn +
  2. +
  3. +n_hash_map_ncah- +stdext::hash_map
  4. +
  5. +gp_hash_mask_linp_exp_nea_lc_1div8_1div2_nsth_map- +gp_hash_table + with Comb_Hash_Fn = direct_mask_range_hashing +, Resize_Policy = hash_standard_resize_policy + with Size_Policy = hash_exponential_size_policy +, and Trigger_Policy = hash_load_check_resize_trigger + with αmin = 1/8 and αmax = 1/2, and Probe_Fn = linear_probe_fn +
  6. +
+
+
+
+
+
+
+
+
+
+
no image
NGPL: Native and collision-chaining hash random int find timing test using find - local
+
+
+
+
+

Observations

+

In this setting, the choice of underlying hash-table (see + Design::Associative + Containers::Hash-Based Containers ) affects performance + most, then the range-hashing scheme (See Design::Associative + Containers::Hash-Based Containers::Hash Policies ), and, + only finally, other policies.

+

When comparing Figures NCCG and NCCM to NGPG and NGPM , respectively, it is apparent that the + probing containers are less efficient than the + collision-chaining containers (both + std::tr1::unordered_map and stdext::hash_map + use collision-chaining) in this case.

+

( Hash-Based + Random-Integer Subscript Insert Timing Test shows a + different case, where the situation is reversed; Observations::Hash-Based + Container Types discusses some further considerations.)

+

Within each type of hash-table, the range-hashing scheme + affects performance more than other policies; Hash-Based + Text find Find Timing Test::Observations discusses + this. In Figures NCCG , NCCM , NGPG , and NGPM , it should be noted that + std::tr1::unordered_map and stdext::hash_map + are hard-wired currently to mod-based and mask-based schemes, + respectively.

+

Observations::Hash-Based + Container Types summarizes some observations on hash-based + containers; Observations::Hash-Based + Containers' Policies summarizes some observations on + hash-based containers' policies.

+
+ + diff --git a/libstdc++-v3/doc/html/ext/pb_ds/hash_random_int_subscript_find_timing_test.html b/libstdc++-v3/doc/html/ext/pb_ds/hash_random_int_subscript_find_timing_test.html new file mode 100644 index 00000000000..adee8f0b1bd --- /dev/null +++ b/libstdc++-v3/doc/html/ext/pb_ds/hash_random_int_subscript_find_timing_test.html @@ -0,0 +1,220 @@ + + + + + +Hash Random Int Subscript Find Timing Test + + + +
+

Hash-Based Random-Integer operator[] + FindTiming Test

+

Description

+

This test inserts a number of values with uniform i.i.d. + integer keys into a container, then performs a series of finds + using operator[]. It measures the average time + for operator[] as a function of the number of + values inserted.

+

(The test was executed with hash_random_int_subscript_find_timing_test + 200 200 2100)

+

Purpose

+

The test checks the effect of different underlying + hash-tables (see Design::Hash-Based Containers + ), range-hashing functions, and trigger policies (see Design::Hash-Based + Containers::Hash Policies and Design::Hash-Based + Containers::Resize Policies ).

+

Results

+

Figures NCCG, NCCM, + and NCCL show the results for the native + and collision-chaining types in g++, MSVC++, and + local, + respectively; Figures NGPG, NGPM, and NGPL show the results + for the native and probing types in g++, MSVC++, and + local, + respectively.

+
+
+
+
+
no image
NCCG: Native and collision-chaining hash random int find timing test using operator[] - g++

In the above figure, the names in the legends have the following meaning:

+
    +
  1. +n_hash_map_ncah- +std::tr1::unordered_map with cache_hash_code = false
  2. +
  3. +cc_hash_mod_prime_nea_lc_1div8_1div1_nsth_map- +cc_hash_table +with Comb_Hash_Fn = direct_mod_range_hashing +, and Resize_Policy = hash_standard_resize_policy + with Size_Policy = hash_prime_size_policy +, and Trigger_Policy = hash_load_check_resize_trigger + with αmin = 1/8 and αmax = 1/1
  4. +
  5. +cc_hash_mod_prime_nea_lc_1div8_1div2_nsth_map- +cc_hash_table +with Comb_Hash_Fn = direct_mod_range_hashing +, and Resize_Policy = hash_standard_resize_policy + with Size_Policy = hash_prime_size_policy +, and Trigger_Policy = hash_load_check_resize_trigger + with αmin = 1/8 and αmax = 1/2
  6. +
  7. +cc_hash_mask_exp_nea_lc_1div8_1div1_nsth_map- +cc_hash_table +with Comb_Hash_Fn = direct_mask_range_hashing +, and Resize_Policy = hash_standard_resize_policy + with Size_Policy = hash_exponential_size_policy +, and Trigger_Policy = hash_load_check_resize_trigger + with αmin = 1/8 and αmax = 1/1
  8. +
  9. +cc_hash_mask_exp_nea_lc_1div8_1div2_nsth_map- +cc_hash_table +with Comb_Hash_Fn = direct_mask_range_hashing +, and Resize_Policy = hash_standard_resize_policy + with Size_Policy = hash_exponential_size_policy +, and Trigger_Policy = hash_load_check_resize_trigger + with αmin = 1/8 and αmax = 1/2
  10. +
+
+
+
+
+
+
+
+
+
+
no image
NCCM: Native and collision-chaining hash random int find timing test using operator[] - msvc++

In the above figure, the names in the legends have the following meaning:

+
    +
  1. +cc_hash_mod_prime_nea_lc_1div8_1div1_nsth_map- +cc_hash_table +with Comb_Hash_Fn = direct_mod_range_hashing +, and Resize_Policy = hash_standard_resize_policy + with Size_Policy = hash_prime_size_policy +, and Trigger_Policy = hash_load_check_resize_trigger + with αmin = 1/8 and αmax = 1/1
  2. +
  3. +cc_hash_mod_prime_nea_lc_1div8_1div2_nsth_map- +cc_hash_table +with Comb_Hash_Fn = direct_mod_range_hashing +, and Resize_Policy = hash_standard_resize_policy + with Size_Policy = hash_prime_size_policy +, and Trigger_Policy = hash_load_check_resize_trigger + with αmin = 1/8 and αmax = 1/2
  4. +
  5. +n_hash_map_ncah- +stdext::hash_map
  6. +
  7. +cc_hash_mask_exp_nea_lc_1div8_1div1_nsth_map- +cc_hash_table +with Comb_Hash_Fn = direct_mask_range_hashing +, and Resize_Policy = hash_standard_resize_policy + with Size_Policy = hash_exponential_size_policy +, and Trigger_Policy = hash_load_check_resize_trigger + with αmin = 1/8 and αmax = 1/1
  8. +
  9. +cc_hash_mask_exp_nea_lc_1div8_1div2_nsth_map- +cc_hash_table +with Comb_Hash_Fn = direct_mask_range_hashing +, and Resize_Policy = hash_standard_resize_policy + with Size_Policy = hash_exponential_size_policy +, and Trigger_Policy = hash_load_check_resize_trigger + with αmin = 1/8 and αmax = 1/2
  10. +
+
+
+
+
+
+
+
+
+
+
no image
NCCL: Native and collision-chaining hash random int find timing test using operator[] - local
+
+
+
+
+
+
+
+
+
no image
NGPG: Native and probing hash random int find timing test using operator[] - g++

In the above figure, the names in the legends have the following meaning:

+
    +
  1. +n_hash_map_ncah- +std::tr1::unordered_map with cache_hash_code = false
  2. +
  3. +gp_hash_mod_quadp_prime_nea_lc_1div8_1div2_nsth_map- +gp_hash_table + with Comb_Hash_Fn = direct_mod_range_hashing +, Resize_Policy = hash_standard_resize_policy + with Size_Policy = hash_prime_size_policy +, and Trigger_Policy = hash_load_check_resize_trigger + with αmin = 1/8 and αmax = 1/2, and Probe_Fn = quadratic_probe_fn +
  4. +
  5. +gp_hash_mask_linp_exp_nea_lc_1div8_1div2_nsth_map- +gp_hash_table + with Comb_Hash_Fn = direct_mask_range_hashing +, Resize_Policy = hash_standard_resize_policy + with Size_Policy = hash_exponential_size_policy +, and Trigger_Policy = hash_load_check_resize_trigger + with αmin = 1/8 and αmax = 1/2, and Probe_Fn = linear_probe_fn +
  6. +
+
+
+
+
+
+
+
+
+
+
no image
NGPM: Native and probing hash random int find timing test using operator[] - msvc++

In the above figure, the names in the legends have the following meaning:

+
    +
  1. +gp_hash_mod_quadp_prime_nea_lc_1div8_1div2_nsth_map- +gp_hash_table + with Comb_Hash_Fn = direct_mod_range_hashing +, Resize_Policy = hash_standard_resize_policy + with Size_Policy = hash_prime_size_policy +, and Trigger_Policy = hash_load_check_resize_trigger + with αmin = 1/8 and αmax = 1/2, and Probe_Fn = quadratic_probe_fn +
  2. +
  3. +n_hash_map_ncah- +stdext::hash_map
  4. +
  5. +gp_hash_mask_linp_exp_nea_lc_1div8_1div2_nsth_map- +gp_hash_table + with Comb_Hash_Fn = direct_mask_range_hashing +, Resize_Policy = hash_standard_resize_policy + with Size_Policy = hash_exponential_size_policy +, and Trigger_Policy = hash_load_check_resize_trigger + with αmin = 1/8 and αmax = 1/2, and Probe_Fn = linear_probe_fn +
  6. +
+
+
+
+
+
+
+
+
+
+
no image
NGPL: Native and probing hash random int find timing test using operator[] - local
+
+
+
+
+

Observations

+

This test shows similar results to Hash-Based + Random-Integer find Find Timing Test .

+
+ + diff --git a/libstdc++-v3/doc/html/ext/pb_ds/hash_random_int_subscript_insert_timing_test.html b/libstdc++-v3/doc/html/ext/pb_ds/hash_random_int_subscript_insert_timing_test.html new file mode 100644 index 00000000000..37a8644a496 --- /dev/null +++ b/libstdc++-v3/doc/html/ext/pb_ds/hash_random_int_subscript_insert_timing_test.html @@ -0,0 +1,365 @@ + + + + + +Hash Random Int Subscript Insert Timing Test + + + +
+

Hash-Based Random-Integer operator[] Insert + Timing Test

+

Description

+

This test inserts a number of values with uniform i.i.d. + integer keys into a container, using + operator[]. It measures the average time for + operator[] as a function of the number of + values inserted.

+

(The test was executed with hash_random_int_subscript_insert_timing_test + 200 200 2100)

+

Purpose

+

The test primarily checks the effect of different underlying + hash-tables (see Design::Associative + Containers::Associative Containers::Hash-Based + Containers).

+

Results

+

Figures NCCG, NCCM, + and NCCL show the results for the native + and collision-chaining types in g++, MSVC++, and + local, + respectively; Figures NGPG, NGPM, and NGPL show the results + for the native and probing types in g++, msvc++, and + local + respectively; Figures CCGPG, CCGPM, and CCGPL compare the + results for the collision-chaining and probing types of + pb_ds only, in g++, MSVC++, and + local + respectively.

+
+
+
+
+
no image
NCCG: Native and collision-chaining hash random int insert timing test using operator - g++

In the above figure, the names in the legends have the following meaning:

+
    +
  1. +cc_hash_mod_prime_nea_lc_1div8_1div2_nsth_map- +cc_hash_table +with Comb_Hash_Fn = direct_mod_range_hashing +, and Resize_Policy = hash_standard_resize_policy + with Size_Policy = hash_prime_size_policy +, and Trigger_Policy = hash_load_check_resize_trigger + with αmin = 1/8 and αmax = 1/2
  2. +
  3. +n_hash_map_ncah- +std::tr1::unordered_map with cache_hash_code = false
  4. +
  5. +cc_hash_mask_exp_nea_lc_1div8_1div2_nsth_map- +cc_hash_table +with Comb_Hash_Fn = direct_mask_range_hashing +, and Resize_Policy = hash_standard_resize_policy + with Size_Policy = hash_exponential_size_policy +, and Trigger_Policy = hash_load_check_resize_trigger + with αmin = 1/8 and αmax = 1/2
  6. +
  7. +cc_hash_mod_prime_nea_lc_1div8_1div1_nsth_map- +cc_hash_table +with Comb_Hash_Fn = direct_mod_range_hashing +, and Resize_Policy = hash_standard_resize_policy + with Size_Policy = hash_prime_size_policy +, and Trigger_Policy = hash_load_check_resize_trigger + with αmin = 1/8 and αmax = 1/1
  8. +
  9. +cc_hash_mask_exp_nea_lc_1div8_1div1_nsth_map- +cc_hash_table +with Comb_Hash_Fn = direct_mask_range_hashing +, and Resize_Policy = hash_standard_resize_policy + with Size_Policy = hash_exponential_size_policy +, and Trigger_Policy = hash_load_check_resize_trigger + with αmin = 1/8 and αmax = 1/1
  10. +
+
+
+
+
+
+
+
+
+
+
no image
NCCM: Native and collision-chaining hash random int insert timing test using operator - msvc++

In the above figure, the names in the legends have the following meaning:

+
    +
  1. +n_hash_map_ncah- +stdext::hash_map
  2. +
  3. +cc_hash_mod_prime_nea_lc_1div8_1div2_nsth_map- +cc_hash_table +with Comb_Hash_Fn = direct_mod_range_hashing +, and Resize_Policy = hash_standard_resize_policy + with Size_Policy = hash_prime_size_policy +, and Trigger_Policy = hash_load_check_resize_trigger + with αmin = 1/8 and αmax = 1/2
  4. +
  5. +cc_hash_mod_prime_nea_lc_1div8_1div1_nsth_map- +cc_hash_table +with Comb_Hash_Fn = direct_mod_range_hashing +, and Resize_Policy = hash_standard_resize_policy + with Size_Policy = hash_prime_size_policy +, and Trigger_Policy = hash_load_check_resize_trigger + with αmin = 1/8 and αmax = 1/1
  6. +
  7. +cc_hash_mask_exp_nea_lc_1div8_1div2_nsth_map- +cc_hash_table +with Comb_Hash_Fn = direct_mask_range_hashing +, and Resize_Policy = hash_standard_resize_policy + with Size_Policy = hash_exponential_size_policy +, and Trigger_Policy = hash_load_check_resize_trigger + with αmin = 1/8 and αmax = 1/2
  8. +
  9. +cc_hash_mask_exp_nea_lc_1div8_1div1_nsth_map- +cc_hash_table +with Comb_Hash_Fn = direct_mask_range_hashing +, and Resize_Policy = hash_standard_resize_policy + with Size_Policy = hash_exponential_size_policy +, and Trigger_Policy = hash_load_check_resize_trigger + with αmin = 1/8 and αmax = 1/1
  10. +
+
+
+
+
+
+
+
+
+
+
no image
NCCL: Native and collision-chaining hash random int insert timing test using operator - local
+
+
+
+
+
+
+
+
+
no image
NGPG: Native and probing hash random int insert timing test using operator - g++

In the above figure, the names in the legends have the following meaning:

+
    +
  1. +gp_hash_mod_quadp_prime_nea_lc_1div8_1div2_nsth_map- +gp_hash_table + with Comb_Hash_Fn = direct_mod_range_hashing +, Resize_Policy = hash_standard_resize_policy + with Size_Policy = hash_prime_size_policy +, and Trigger_Policy = hash_load_check_resize_trigger + with αmin = 1/8 and αmax = 1/2, and Probe_Fn = quadratic_probe_fn +
  2. +
  3. +n_hash_map_ncah- +std::tr1::unordered_map with cache_hash_code = false
  4. +
  5. +gp_hash_mask_linp_exp_nea_lc_1div8_1div2_nsth_map- +gp_hash_table + with Comb_Hash_Fn = direct_mask_range_hashing +, Resize_Policy = hash_standard_resize_policy + with Size_Policy = hash_exponential_size_policy +, and Trigger_Policy = hash_load_check_resize_trigger + with αmin = 1/8 and αmax = 1/2, and Probe_Fn = linear_probe_fn +
  6. +
+
+
+
+
+
+
+
+
+
+
no image
NGPM: Native and probing hash random int insert timing test using operator - msvc++

In the above figure, the names in the legends have the following meaning:

+
    +
  1. +n_hash_map_ncah- +stdext::hash_map
  2. +
  3. +gp_hash_mod_quadp_prime_nea_lc_1div8_1div2_nsth_map- +gp_hash_table + with Comb_Hash_Fn = direct_mod_range_hashing +, Resize_Policy = hash_standard_resize_policy + with Size_Policy = hash_prime_size_policy +, and Trigger_Policy = hash_load_check_resize_trigger + with αmin = 1/8 and αmax = 1/2, and Probe_Fn = quadratic_probe_fn +
  4. +
  5. +gp_hash_mask_linp_exp_nea_lc_1div8_1div2_nsth_map- +gp_hash_table + with Comb_Hash_Fn = direct_mask_range_hashing +, Resize_Policy = hash_standard_resize_policy + with Size_Policy = hash_exponential_size_policy +, and Trigger_Policy = hash_load_check_resize_trigger + with αmin = 1/8 and αmax = 1/2, and Probe_Fn = linear_probe_fn +
  6. +
+
+
+
+
+
+
+
+
+
+
no image
NGPL: Native and probing hash random int insert timing test using operator - local
+
+
+
+
+
+
+
+
+
no image
CCGPG: Collision-chaining and probing hash random int insert timing test using operator - g++

In the above figure, the names in the legends have the following meaning:

+
    +
  1. +gp_hash_mod_quadp_prime_nea_lc_1div8_1div2_nsth_map- +gp_hash_table + with Comb_Hash_Fn = direct_mod_range_hashing +, Resize_Policy = hash_standard_resize_policy + with Size_Policy = hash_prime_size_policy +, and Trigger_Policy = hash_load_check_resize_trigger + with αmin = 1/8 and αmax = 1/2, and Probe_Fn = quadratic_probe_fn +
  2. +
  3. +cc_hash_mod_prime_nea_lc_1div8_1div2_nsth_map- +cc_hash_table +with Comb_Hash_Fn = direct_mod_range_hashing +, and Resize_Policy = hash_standard_resize_policy + with Size_Policy = hash_prime_size_policy +, and Trigger_Policy = hash_load_check_resize_trigger + with αmin = 1/8 and αmax = 1/2
  4. +
  5. +cc_hash_mask_exp_nea_lc_1div8_1div2_nsth_map- +cc_hash_table +with Comb_Hash_Fn = direct_mask_range_hashing +, and Resize_Policy = hash_standard_resize_policy + with Size_Policy = hash_exponential_size_policy +, and Trigger_Policy = hash_load_check_resize_trigger + with αmin = 1/8 and αmax = 1/2
  6. +
  7. +gp_hash_mask_linp_exp_nea_lc_1div8_1div2_nsth_map- +gp_hash_table + with Comb_Hash_Fn = direct_mask_range_hashing +, Resize_Policy = hash_standard_resize_policy + with Size_Policy = hash_exponential_size_policy +, and Trigger_Policy = hash_load_check_resize_trigger + with αmin = 1/8 and αmax = 1/2, and Probe_Fn = linear_probe_fn +
  8. +
+
+
+
+
+
+
+
+
+
+
no image
CCGPM: Collision-chaining and probing hash random int insert timing test using operator - msvc++

In the above figure, the names in the legends have the following meaning:

+
    +
  1. +cc_hash_mod_prime_nea_lc_1div8_1div2_nsth_map- +cc_hash_table +with Comb_Hash_Fn = direct_mod_range_hashing +, and Resize_Policy = hash_standard_resize_policy + with Size_Policy = hash_prime_size_policy +, and Trigger_Policy = hash_load_check_resize_trigger + with αmin = 1/8 and αmax = 1/2
  2. +
  3. +cc_hash_mask_exp_nea_lc_1div8_1div2_nsth_map- +cc_hash_table +with Comb_Hash_Fn = direct_mask_range_hashing +, and Resize_Policy = hash_standard_resize_policy + with Size_Policy = hash_exponential_size_policy +, and Trigger_Policy = hash_load_check_resize_trigger + with αmin = 1/8 and αmax = 1/2
  4. +
  5. +gp_hash_mod_quadp_prime_nea_lc_1div8_1div2_nsth_map- +gp_hash_table + with Comb_Hash_Fn = direct_mod_range_hashing +, Resize_Policy = hash_standard_resize_policy + with Size_Policy = hash_prime_size_policy +, and Trigger_Policy = hash_load_check_resize_trigger + with αmin = 1/8 and αmax = 1/2, and Probe_Fn = quadratic_probe_fn +
  6. +
  7. +gp_hash_mask_linp_exp_nea_lc_1div8_1div2_nsth_map- +gp_hash_table + with Comb_Hash_Fn = direct_mask_range_hashing +, Resize_Policy = hash_standard_resize_policy + with Size_Policy = hash_exponential_size_policy +, and Trigger_Policy = hash_load_check_resize_trigger + with αmin = 1/8 and αmax = 1/2, and Probe_Fn = linear_probe_fn +
  8. +
+
+
+
+
+
+
+
+
+
+
no image
CCGPL: Collision-chaining and probing hash random int insert timing test using operator - local
+
+
+
+
+

Observations

+

In this setting, as in Hash-Based Text + find Find Timing Test and Hash-Based + Random-Integer find Find Timing Test , the choice + of underlying hash-table underlying hash-table (see Design::Associative + Containers::Hash-Based Containers ) affects performance + most, then the range-hashing scheme (See Design::Associative + Containers::Hash-Based Containers::Hash Policies ), and, + only finally, other policies.

+

There are some differences, however:

+
    +
  1. In this setting, probing tables function sometimes more + efficiently than collision-chaining tables (see Figures + CCGPG and CCGPM ). + This is explained shortly.
  2. +
  3. The performance graphs have a "saw-tooth" shape. The + average insert time rises and falls. As values are inserted + into the container, the load factor grows larger. Eventually, + a resize occurs. The reallocations and rehashing are + relatively expensive. After this, the load factor is smaller + than before.
  4. +
+

Collision-chaining containers use indirection for greater + flexibility; probing containers store values contiguously, in + an array (see Figure Motivation::Different + underlying data structures A and B, respectively). It + follows that for simple data types, probing containers access + their allocator less frequently than collision-chaining + containers, (although they still have less efficient probing + sequences). This explains why some probing containers fare + better than collision-chaining containers in this case.

+

Within each type of hash-table, the range-hashing scheme + affects performance more than other policies. This is similar + to the situation in Hash-Based Text + find Find Timing Test and Hash-Based + Random-Integer find Find Timing Test. + Unsurprisingly, however, containers with lower +alphamax perform worse in this case, + since more re-hashes are performed.

+

Observations::Hash-Based + Container Types summarizes some observations on hash-based + containers; Observations::Hash-Based + Containers' Policies summarizes some observations on + hash-based containers' policies.

+
+ + diff --git a/libstdc++-v3/doc/html/ext/pb_ds/hash_range_hashing_seq_diagram.png b/libstdc++-v3/doc/html/ext/pb_ds/hash_range_hashing_seq_diagram.png new file mode 100644 index 00000000000..5c37407dda6 Binary files /dev/null and b/libstdc++-v3/doc/html/ext/pb_ds/hash_range_hashing_seq_diagram.png differ diff --git a/libstdc++-v3/doc/html/ext/pb_ds/hash_range_hashing_seq_diagram2.png b/libstdc++-v3/doc/html/ext/pb_ds/hash_range_hashing_seq_diagram2.png new file mode 100644 index 00000000000..87763caacc7 Binary files /dev/null and b/libstdc++-v3/doc/html/ext/pb_ds/hash_range_hashing_seq_diagram2.png differ diff --git a/libstdc++-v3/doc/html/ext/pb_ds/hash_ranged_hash_range_hashing_fns.png b/libstdc++-v3/doc/html/ext/pb_ds/hash_ranged_hash_range_hashing_fns.png new file mode 100644 index 00000000000..5e0d7f4037b Binary files /dev/null and b/libstdc++-v3/doc/html/ext/pb_ds/hash_ranged_hash_range_hashing_fns.png differ diff --git a/libstdc++-v3/doc/html/ext/pb_ds/hash_standard_resize_policy.html b/libstdc++-v3/doc/html/ext/pb_ds/hash_standard_resize_policy.html new file mode 100644 index 00000000000..70d6086d503 --- /dev/null +++ b/libstdc++-v3/doc/html/ext/pb_ds/hash_standard_resize_policy.html @@ -0,0 +1,795 @@ + + + + + + + hash_standard_resize_policy Interface + + + + +
+

hash_standard_resize_policy Interface

+ +

A resize policy which delegates operations to size and + trigger policies.

+ +

Defined in: hash_policy.hpp

+ +

Template Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterDescriptionDefault Value
+
+class Size_Policy 
+
+
+

Size policy type.

+
hash_exponential_size_policy
+
+class Trigger_Policy 
+
+
+

Trigger policy type.

+
hash_load_check_resize_trigger
+
+bool External_Size_Access 
+
+
+

Indicates whether physical sizes can be accessed + externally.

+
false
+
+typename Size_Type 
+
+
+

Size type.

+
size_t
+ +

Base Classes

+ + + + + + + + + + + + + + + + + + + +
ClassDerivation Type
+
+Size_Policy
+
+
+

public

+
+
+Trigger_Policy
+
+
+

public

+
+ +

Public Types and + Constants

+ +

General Definitions

+ + + + + + + + + + + + + + + + + +
TypeDefinitionDescription
+
+size_type
+
+
+
+Size_Type
+
+
+

Size type.

+
+ +

Policy Definitions

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
TypeDefinitionDescription
+
+trigger_policy
+
+
+
+Trigger_Policy
+
+
+

Trigger policy type.

+
+
+size_policy
+
+
+
+Size_Policy
+
+
+

Size policy type.

+
+
+external_size_access
+
+
+
+External_Size_Access
+
+
+

Indicates whether sizes can be accessed + externally.

+
+ +

Public Methods

+ +

Constructors, Destructor, and + Related

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDescription
+
+  hash_standard_resize_policy
+  ()
+
+
+

Default constructor.

+
+
+  hash_standard_resize_policy
+  (const Size_Policy &r_size_policy)
+
+
+

constructor taking some policies r_size_policy will be copied by the + Size_Policy + object of this object.

+
+
+  hash_standard_resize_policy
+  (const Size_Policy &r_size_policy,
+    const Trigger_Policy &r_trigger_policy)
+
+
+

constructor taking some policies. r_size_policy will be copied by the + Size_Policy + object of this object. r_trigger_policy will be copied by + the Trigger_Policy + object of this object.

+
+
+virtual 
+  ~hash_standard_resize_policy
+  ()
+
+
+

Destructor.

+
+
+inline void 
+  swap
+  (hash_standard_resize_policy &other)
+
+
+

Swaps content.

+
+ +

Policy Access Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDescription
+
+Size_Policy &
+  get_size_policy
+  ()
+
+
+

Access to the Size_Policy object + used.

+
+
+const Size_Policy &
+  get_size_policy
+  () const
+
+
+

Const access to the Size_Policy object + used.

+
+
+Trigger_Policy &
+  get_trigger_policy
+  ()
+
+
+

Access to the Trigger_Policy + object used.

+
+
+const Trigger_Policy &
+  get_trigger_policy
+  () const
+
+
+

Access to the Trigger_Policy + object used.

+
+ +

Size Access Methods

+ +

These methods are available only if the external size + parameter indicates that external size access is allowed.

+ + + + + + + + + + + + + + + + + + + +
MethodDescription
+
+inline size_type 
+  get_actual_size
+  () const
+
+
+

Returns the actual size of the container.

+ +

This method returns the number of entries (used and + unused) in the container. It is different from the + container's size method, which returns the number of used + entries. Calling this method will not compile when + External_Size_Access + == false.

+
+
+void 
+  resize
+  (size_type suggested_new_size)
+
+
+

Resizes the container to suggested_new_size, a suggested size + (the actual size will be determined by the Size_Policy + object).

+ +

Calling this method will not compile when External_Size_Access + == false.

+
+ +

Protected Methods

+ +

Insert Search + Notifications.

+ +

Notifications called during an insert operation.

+ + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDescription
+
+inline void
+  notify_insert_search_start
+  ()
+
+
+

Notifies a search started.

+
+
+inline void
+  notify_insert_search_collision
+  ()
+
+
+

Notifies a search encountered a collision.

+
+
+inline void
+  notify_insert_search_end
+  ()
+
+
+

Notifies a search ended.

+
+ +

Find Search + Notifications.

+ +

Notifications called during a find operation.

+ + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDescription
+
+inline void
+  notify_find_search_start
+  ()
+
+
+

Notifies a search started.

+
+
+inline void
+  notify_find_search_collision
+  ()
+
+
+

Notifies a search encountered a collision.

+
+
+inline void
+  notify_find_search_end
+  ()
+
+
+

Notifies a search ended.

+
+ +

Erase Search + Notifications.

+ +

Notifications called during an insert operation.

+ + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDescription
+
+inline void
+  notify_erase_search_start
+  ()
+
+
+

Notifies a search started.

+
+
+inline void
+  notify_erase_search_collision
+  ()
+
+
+

Notifies a search encountered a collision.

+
+
+inline void
+  notify_erase_search_end
+  ()
+
+
+

Notifies a search ended.

+
+ +

Content Change + Notifications

+ +

Notifications called when the content of the table changes + in a way that can affect the resize policy.

+ + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDescription
+
+inline void
+  notify_inserted
+  (size_type num_e)
+
+
+

Notifies an element was inserted.

+
+
+inline void
+  notify_erased
+  (size_type num_e)
+
+
+

Notifies an element was erased.

+
+
+void 
+  notify_cleared
+  ()
+
+
+

Notifies the table was cleared.

+
+ +

Size Change + Notifications

+ +

Notifications called when the table changes size.

+ + + + + + + + + + + + + +
MethodDescription
+
+void
+  notify_resized
+  (size_type new_size)
+
+
+

Notifies the table was resized to new_size.

+
+ +

Queries

+ +

Called to query whether/how to resize.

+ + + + + + + + + + + + + + + + + + + +
MethodDescription
+
+inline bool
+  is_resize_needed
+  () const
+
+
+

Queries whether a resize is needed.

+
+
+size_type
+  get_new_size
+  (size_type size, 
+    size_type num_used_e) const
+
+
+

Queries what the new size should be, when the container + is resized naturally. The current size of the container + is size, and the number + of used entries within the container is num_used_e.

+
+ +

Private Methods

+ +

Overrides

+ + + + + + + + + + + + + +
MethodDescription
+
+virtual void
+  do_resize
+  (size_type new_size)
+
+
+

Resizes to new_size.

+
+
+ + diff --git a/libstdc++-v3/doc/html/ext/pb_ds/hash_text_find_find_timing_test.html b/libstdc++-v3/doc/html/ext/pb_ds/hash_text_find_find_timing_test.html new file mode 100644 index 00000000000..fafa245a93f --- /dev/null +++ b/libstdc++-v3/doc/html/ext/pb_ds/hash_text_find_find_timing_test.html @@ -0,0 +1,164 @@ + + + + + +Hash Text Find Timing Test + + + +
+

Hash-Based Text find Find Timing Test

+

Description

+

This test inserts a number of values with keys from an + arbitrary text ([ wickland96thirty ]) into + a container, then performs a series of finds using + find . It measures the average time for find + as a function of the number of values inserted.

+

(The test was executed with text_find_timing_test + thirty_years_among_the_dead_preproc.txt 200 200 2100)

+

Purpose

+

The test checks the effect of different range-hashing + functions, trigger policies, and cache-hashing policies (see + Design::Associative + Containers::Associative Containers::Hash-Based Containers::Hash + Policies and Design::Associative + Containers::Hash-Based Containers::Resize Policies ).

+

Results

+

Figures NCCG, NCCM + and NCCL show the results for the native + and collision-chaining types in g++, msvc++, and + local, + respetively.

+
+
+
+
+
no image
NCCG: Native and collision-chaining hash text find timing test using find - g++

In the above figure, the names in the legends have the following meaning:

+
    +
  1. +n_hash_map_ncah- +std::tr1::unordered_map with cache_hash_code = false
  2. +
  3. +cc_hash_mod_prime_nea_lc_1div8_1div1_nsth_map- +cc_hash_table +with Comb_Hash_Fn = direct_mod_range_hashing +, and Resize_Policy = hash_standard_resize_policy + with Size_Policy = hash_prime_size_policy +, and Trigger_Policy = hash_load_check_resize_trigger + with αmin = 1/8 and αmax = 1/1
  4. +
  5. +cc_hash_mask_exp_nea_lc_1div8_1div2_sth_map- +cc_hash_table +with Comb_Hash_Fn = direct_mask_range_hashing +, and Resize_Policy = hash_standard_resize_policy + with Size_Policy = hash_exponential_size_policy +, and Trigger_Policy = hash_load_check_resize_trigger + with αmin = 1/8 and αmax = 1/2
  6. +
  7. +cc_hash_mask_exp_nea_lc_1div8_1div1_nsth_map- +cc_hash_table +with Comb_Hash_Fn = direct_mask_range_hashing +, and Resize_Policy = hash_standard_resize_policy + with Size_Policy = hash_exponential_size_policy +, and Trigger_Policy = hash_load_check_resize_trigger + with αmin = 1/8 and αmax = 1/1
  8. +
  9. +cc_hash_mask_exp_nea_lc_1div8_1div2_nsth_map- +cc_hash_table +with Comb_Hash_Fn = direct_mask_range_hashing +, and Resize_Policy = hash_standard_resize_policy + with Size_Policy = hash_exponential_size_policy +, and Trigger_Policy = hash_load_check_resize_trigger + with αmin = 1/8 and αmax = 1/2
  10. +
+
+
+
+
+
+
+
+
+
+
no image
NCCM: Native and collision-chaining hash text find timing test using find - msvc++

In the above figure, the names in the legends have the following meaning:

+
    +
  1. +n_hash_map_ncah- +stdext::hash_map
  2. +
  3. +cc_hash_mod_prime_nea_lc_1div8_1div1_nsth_map- +cc_hash_table +with Comb_Hash_Fn = direct_mod_range_hashing +, and Resize_Policy = hash_standard_resize_policy + with Size_Policy = hash_prime_size_policy +, and Trigger_Policy = hash_load_check_resize_trigger + with αmin = 1/8 and αmax = 1/1
  4. +
  5. +cc_hash_mask_exp_nea_lc_1div8_1div1_nsth_map- +cc_hash_table +with Comb_Hash_Fn = direct_mask_range_hashing +, and Resize_Policy = hash_standard_resize_policy + with Size_Policy = hash_exponential_size_policy +, and Trigger_Policy = hash_load_check_resize_trigger + with αmin = 1/8 and αmax = 1/1
  6. +
  7. +cc_hash_mask_exp_nea_lc_1div8_1div2_nsth_map- +cc_hash_table +with Comb_Hash_Fn = direct_mask_range_hashing +, and Resize_Policy = hash_standard_resize_policy + with Size_Policy = hash_exponential_size_policy +, and Trigger_Policy = hash_load_check_resize_trigger + with αmin = 1/8 and αmax = 1/2
  8. +
  9. +cc_hash_mask_exp_nea_lc_1div8_1div2_sth_map- +cc_hash_table +with Comb_Hash_Fn = direct_mask_range_hashing +, and Resize_Policy = hash_standard_resize_policy + with Size_Policy = hash_exponential_size_policy +, and Trigger_Policy = hash_load_check_resize_trigger + with αmin = 1/8 and αmax = 1/2
  10. +
+
+
+
+
+
+
+
+
+
+
no image
NCCL: Native and collision-chaining hash text find timing test using find - local
+
+
+
+
+

Observations

+

In this setting, the range-hashing scheme (See Design::Associative + Containers::Hash-Based Containers::Hash Policies ) affects + performance more than other policies. As Figure NCCG shows, containers using mod-based + range-hashing (including the native hash-based container, which + is currently hard-wired to this scheme) have lower performance + than those using mask-based range-hashing. A modulo-based + range-hashing scheme's main benefit is that it takes into + account all hash-value bits. Standard string hash-functions are + designed to create hash values that are nearly-uniform as is [ + knuth98sorting + ].

+

Trigger policies (see Design::Associative + Containers::Hash-Based Containers::Resize Policies ), + i.e. the load-checks constants, affect performance to a + lesser extent.

+

Perhaps surprisingly, storing the hash value alongside each + entry affects performance only marginally, at least in + pb_ds 's implementation. (Unfortunately, it was not + possible to run the tests with std::tr1::unordered_map + 's cache_hash_code = true , as it appeared to + malfuntion.)

+

Observations::Hash-Based + Containers' Policies summarizes some observations on + hash-based containers' policies.

+
+ + diff --git a/libstdc++-v3/doc/html/ext/pb_ds/hash_zlob_random_int_find_find_timing_test.html b/libstdc++-v3/doc/html/ext/pb_ds/hash_zlob_random_int_find_find_timing_test.html new file mode 100644 index 00000000000..f7156b1b7a6 --- /dev/null +++ b/libstdc++-v3/doc/html/ext/pb_ds/hash_zlob_random_int_find_find_timing_test.html @@ -0,0 +1,163 @@ + + + + + +Hash Skewed Distribution Memory Use Test + + + +
+

Hash-Based Skewed-Distribution Random-Integer find + Find Timing Test

+

Description

+

This test inserts a number of values with a markedly + non-uniform i.i.d. integer keys into a container, then performs + a series of finds using find . It measures the average + time for find as a function of the number of values in + the containers. The keys are generated as follows. First, a + uniform integer is created; it is then shifted left 8 bits.

+

(The test was executed with hash_zlob_random_int_find_timing_test + 200 200 2100)

+

Purpose

+

The test checks the effect of different range-hashing + functions and trigger policies (see Design::Associative + Containers::Hash-Based Containers::Hash Policies and + Design::Associative + Containers::Hash-Based Containers::Resize Policies).

+

Results

+

Figures NHG, NHM, and + NHL show the results for various hash-based + associative-containers in g++, MSVC++, and + local, + respectively.

+
+
+
+
+
no image
NHG: Skewed-distribution random int find timing test using find - g++

In the above figure, the names in the legends have the following meaning:

+
    +
  1. +cc_hash_mask_exp_nea_lc_1div8_1div1_nsth_map- +cc_hash_table +with Comb_Hash_Fn = direct_mask_range_hashing +, and Resize_Policy = hash_standard_resize_policy + with Size_Policy = hash_exponential_size_policy +, and Trigger_Policy = hash_load_check_resize_trigger + with αmin = 1/8 and αmax = 1/1
  2. +
  3. +gp_hash_mod_quadp_prime_nea_lc_1div8_1div2_nsth_map- +gp_hash_table + with Comb_Hash_Fn = direct_mod_range_hashing +, Resize_Policy = hash_standard_resize_policy + with Size_Policy = hash_prime_size_policy +, and Trigger_Policy = hash_load_check_resize_trigger + with αmin = 1/8 and αmax = 1/2, and Probe_Fn = quadratic_probe_fn +
  4. +
  5. +n_hash_map_ncah- +std::tr1::unordered_map with cache_hash_code = false
  6. +
  7. +cc_hash_mod_prime_nea_lc_1div8_1div1_nsth_map- +cc_hash_table +with Comb_Hash_Fn = direct_mod_range_hashing +, and Resize_Policy = hash_standard_resize_policy + with Size_Policy = hash_prime_size_policy +, and Trigger_Policy = hash_load_check_resize_trigger + with αmin = 1/8 and αmax = 1/1
  8. +
+
+
+
+
+
+
+
+
+
+
no image
NHM: Skewed-distribution random int find timing test using find - msvc++

In the above figure, the names in the legends have the following meaning:

+
    +
  1. +n_hash_map_ncah- +stdext::hash_map
  2. +
  3. +cc_hash_mask_exp_nea_lc_1div8_1div1_nsth_map- +cc_hash_table +with Comb_Hash_Fn = direct_mask_range_hashing +, and Resize_Policy = hash_standard_resize_policy + with Size_Policy = hash_exponential_size_policy +, and Trigger_Policy = hash_load_check_resize_trigger + with αmin = 1/8 and αmax = 1/1
  4. +
  5. +gp_hash_mod_quadp_prime_nea_lc_1div8_1div2_nsth_map- +gp_hash_table + with Comb_Hash_Fn = direct_mod_range_hashing +, Resize_Policy = hash_standard_resize_policy + with Size_Policy = hash_prime_size_policy +, and Trigger_Policy = hash_load_check_resize_trigger + with αmin = 1/8 and αmax = 1/2, and Probe_Fn = quadratic_probe_fn +
  6. +
  7. +cc_hash_mod_prime_nea_lc_1div8_1div1_nsth_map- +cc_hash_table +with Comb_Hash_Fn = direct_mod_range_hashing +, and Resize_Policy = hash_standard_resize_policy + with Size_Policy = hash_prime_size_policy +, and Trigger_Policy = hash_load_check_resize_trigger + with αmin = 1/8 and αmax = 1/1
  8. +
+
+
+
+
+
+
+
+
+
+
no image
NHL: Skewed-distribution random int find timing test using find - local
+
+
+
+
+

Observations

+

In this setting, the keys' distribution is so skewed that + the unerlying hash-table type affects performance marginally. + (This is in contrast with Hash-Based Text + find Find Timing Test , Hash-Based + Random-Integer find Find Timing Test , Hash-Based + Random-Integer Subscript Find Timing Test and Hash-Based + Random-Integer Subscript Insert Timing Test .)

+

The range-hashing scheme affects performance dramatically. A + mask-based range-hashing scheme effectively maps all values + into the same bucket. Access degenerates into a search within + an unordered linked-list. In Figures NHG and + NHM , it should be noted that + std::tr1::unordered_map and stdext::hash_map + are hard-wired currently to mod-based and mask-based schemes, + respectively.

+

When observing the settings of this test, it is apparent + that the keys' distribution is far from natural. One might ask + if the test is not contrived to show that, in some cases, + mod-based range hashing does better than mask-based range + hashing. This is, in fact just the case. We did not encounter a + more natural case in which mod-based range hashing is better. + In our opnion, real-life key distributions are handled better + with an appropriate hash function and a mask-based + range-hashing function. (shift_mask.cc + shows an example of handling this a-priori known skewed + distribution with a mask-based range-hashing function). If hash + performance is bad, a Χ2 test can be used + to check how to transform it into a more uniform + distribution.

+

For this reason, pb_ds's default range-hashing + function is mask-based.

+

Observations::Hash-Based + Container Types summarizes some observations on hash-based + containers; Observations::Hash-Based + Containers' Policies summarizes some observations on + hash-based containers' policies.

+
+ + diff --git a/libstdc++-v3/doc/html/ext/pb_ds/hash_zlob_random_int_find_timing_test_gcc.png b/libstdc++-v3/doc/html/ext/pb_ds/hash_zlob_random_int_find_timing_test_gcc.png new file mode 100644 index 00000000000..8d170db1a2a Binary files /dev/null and b/libstdc++-v3/doc/html/ext/pb_ds/hash_zlob_random_int_find_timing_test_gcc.png differ diff --git a/libstdc++-v3/doc/html/ext/pb_ds/hash_zlob_random_int_find_timing_test_local.png b/libstdc++-v3/doc/html/ext/pb_ds/hash_zlob_random_int_find_timing_test_local.png new file mode 100644 index 00000000000..0be2f00fa63 Binary files /dev/null and b/libstdc++-v3/doc/html/ext/pb_ds/hash_zlob_random_int_find_timing_test_local.png differ diff --git a/libstdc++-v3/doc/html/ext/pb_ds/hash_zlob_random_int_find_timing_test_msvc.png b/libstdc++-v3/doc/html/ext/pb_ds/hash_zlob_random_int_find_timing_test_msvc.png new file mode 100644 index 00000000000..874e7a780e6 Binary files /dev/null and b/libstdc++-v3/doc/html/ext/pb_ds/hash_zlob_random_int_find_timing_test_msvc.png differ diff --git a/libstdc++-v3/doc/html/ext/pb_ds/index.html b/libstdc++-v3/doc/html/ext/pb_ds/index.html new file mode 100644 index 00000000000..4c73c2e915a --- /dev/null +++ b/libstdc++-v3/doc/html/ext/pb_ds/index.html @@ -0,0 +1,146 @@ + + + + + + + Policy-Based Data Structures + + + + +
+

Policy-Based Data Structures

+ +
Ami Tavory and Vladimir Dreizin, IBM Haifa Research + Laboratories, and Benjamin Kosnik, Red Hat
+ +
pbassoc@gmail.com
+ +

This is a library of policy-based elementary + data structures: associative containers and priority queues. It + is designed for high-performance, flexibility, semantic safety, + and conformance to the corresponding containers in std + and std::tr1 (except for some points where it differs by + design).

+ +

The documentation is organized as follows:

+ +
    +
  1. + Introductory + +
      +
    1. Introduction
    2. + +
    3. Motivation
    4. + +
    5. Usage + Prerequisites
    6. +
    +
  2. + +
  3. + Interface + +
      +
    1. Short Tutorial
    2. + +
    3. Concepts
    4. + +
    5. Specifics
    6. +
    +
  4. + +
  5. + Design + +
      +
    1. + Associative Containers + +
        +
      1. Data-Structure + Genericity and Interface
      2. + +
      3. Tree-Based + Containers
      4. + +
      5. Trie-Based + Containers
      6. + +
      7. Hash-Based + Containers
      8. + +
      9. List-Based + Containers
      10. +
      +
    2. + +
    3. Priority Queues
    4. +
    +
  6. + +
  7. + Examples + +
      +
    1. Associative + Containers
    2. + +
    3. Priority Queues
    4. +
    +
  8. + +
  9. + Tests + +
      +
    1. + Associative Containers + +
        +
      1. Regression + Tests
      2. + +
      3. Performance + Tests
      4. +
      +
    2. + +
    3. + Priority Queues + +
        +
      1. Regression + Tests
      2. + +
      3. Performance + Tests
      4. +
      +
    4. +
    +
  10. + +
  11. + Misc. + +
      +
    1. Acknowledgments
    2. + +
    3. Contact
    4. + +
    5. Disclaimer and + Copyright
    6. + +
    7. References
    8. +
    +
  12. +
+
+ + diff --git a/libstdc++-v3/doc/html/ext/pb_ds/insert_error.html b/libstdc++-v3/doc/html/ext/pb_ds/insert_error.html new file mode 100644 index 00000000000..f67160fe582 --- /dev/null +++ b/libstdc++-v3/doc/html/ext/pb_ds/insert_error.html @@ -0,0 +1,53 @@ + + + + + + +insert_error Interface + + + + +
+

insert_error Interface

+ +

An entry cannot be inserted into a container object for logical +reasons (not, e.g., if memory is unavailable, in which case the +allocator's exception will be thrown).

+ +

This exception may be thrown, e.g., when a probe sequence in + a probing hash table does not encounter any free positions, + even though free positions are available.

+ +

Defined in: exception.hpp

+ +

Base Classes

+ + + + + + + + + + + + + +
ClassDerivation Type
+
+insert_error
+
+
+

public

+
+
+ + diff --git a/libstdc++-v3/doc/html/ext/pb_ds/insert_resize_sequence_diagram1.png b/libstdc++-v3/doc/html/ext/pb_ds/insert_resize_sequence_diagram1.png new file mode 100644 index 00000000000..f64764ec931 Binary files /dev/null and b/libstdc++-v3/doc/html/ext/pb_ds/insert_resize_sequence_diagram1.png differ diff --git a/libstdc++-v3/doc/html/ext/pb_ds/insert_resize_sequence_diagram2.png b/libstdc++-v3/doc/html/ext/pb_ds/insert_resize_sequence_diagram2.png new file mode 100644 index 00000000000..e4645973eeb Binary files /dev/null and b/libstdc++-v3/doc/html/ext/pb_ds/insert_resize_sequence_diagram2.png differ diff --git a/libstdc++-v3/doc/html/ext/pb_ds/insert_resize_sequence_diagram3.png b/libstdc++-v3/doc/html/ext/pb_ds/insert_resize_sequence_diagram3.png new file mode 100644 index 00000000000..5535c5fe603 Binary files /dev/null and b/libstdc++-v3/doc/html/ext/pb_ds/insert_resize_sequence_diagram3.png differ diff --git a/libstdc++-v3/doc/html/ext/pb_ds/interface.html b/libstdc++-v3/doc/html/ext/pb_ds/interface.html new file mode 100644 index 00000000000..a48a8bbadde --- /dev/null +++ b/libstdc++-v3/doc/html/ext/pb_ds/interface.html @@ -0,0 +1,446 @@ + + + + + + +Interface + + + + +
+

Interface Specifics

+ +

Following are the library's interface specifics. Short Tutorial is a short tutorial, and + Concepts describes some + concepts.

+
+ +

Namespace

+ +

All code is enclosed in namespace pb_ds. Nested within + this is namespace detail, which contains the parts of this + library that are considered implementation details.

+
+ +

Containers

+ +

Associative Containers

+ +
    +
  1. container_base - + abstract base class for associative containers.
  2. + +
  3. Hash-based: + +
      +
    1. basic_hash_table + - abstract base class for hash-based + containers
    2. + +
    3. cc_hash_table + - concrete collision-chaining hash-based + containers
    4. + +
    5. gp_hash_table + - concrete (general) probing hash-based + containers
    6. +
    +
  4. + +
  5. Tree-based: + +
      +
    1. basic_tree + - abstract base class for tree and trie based + containers
    2. + +
    3. tree + - concrete base class for tree-based + containers
    4. + +
    5. trie + - concrete base class for trie-based + containers
    6. +
    +
  6. + +
  7. List-based: + +
      +
    1. list_update - + singly-linked list with update-policy container
    2. +
    +
  8. +
+ +

Priority + Queues

+ +
    +
  1. priority_queue + - priority queue
  2. +
+
+ +

Container Tags and + Traits

+ +

Container Tags

+ +

Common

+ +
    +
  1. container_tag - + base class for data structure tags
  2. +
+ +

Associative-Containers

+ +
    +
  1. associative_container_tag - + base class for associative-container data structure tags
  2. + +
  3. basic_hash_tag - + base class for hash-based structure tags
  4. + +
  5. cc_hash_tag + - collision-chaining hash structure tag
  6. + +
  7. gp_hash_tag + - (general) probing hash structure tag
  8. + +
  9. basic_tree_tag + - base class for tree-like structure tags
  10. + +
  11. tree_tag - + base class for tree structure tags
  12. + +
  13. rb_tree_tag + - red-black tree structure tag/li>
  14. + +
  15. splay_tree_tag - + splay tree structure tag
  16. + +
  17. ov_tree_tag + - ordered-vector tree structure tag
  18. + +
  19. trie_tag - + trie structure tag
  20. + +
  21. pat_trie_tag - + PATRICIA trie structure tag
  22. + +
  23. list_update_tag - list + (with updates) structure tag
  24. +
+ +

Priority-Queues

+ +
    +
  1. priority_queue_tag - base + class for priority-queue data structure tags
  2. + +
  3. pairing_heap_tag - + pairing-heap structure tag.
  4. + +
  5. binomial_heap_tag + - binomial-heap structure tag
  6. + +
  7. rc_binomial_heap_tag + - redundant-counter binomial-heap (i.e., a heap where + binomial trees form a sequence that is similar to a + de-amortized bit-addition algorithm) structure tag
  8. + +
  9. binary_heap_tag - + binary heap (based on an array or an array of nodes) + structure tag
  10. + +
  11. thin_heap_tag - thin + heap (an alternative [kt99fat_heaps] to + Fibonacci heap) data structure tag.
  12. +
+ +

Invalidation-Guarantee + Tags

+ +
    +
  1. basic_invalidation_guarantee + - weakest invalidation guarantee
  2. + +
  3. point_invalidation_guarantee + - stronger invalidation guarantee
  4. + +
  5. range_invalidation_guarantee + - strongest invalidation guarantee
  6. +
+ +

Container + Traits

+ +
    +
  1. container_traits - + traits for determining underlying data structure + properties
  2. +
+
+ +

Container Policy Classes

+ +

Hash Policies

+ +

Hash and Probe Policies

+ +
    +
  1. Hash Functions: + +
      +
    1. null_hash_fn + - type indicating one-step range-hashing
    2. +
    +
  2. + +
  3. Range-Hashing Functions: + +
      +
    1. Sample + range-hashing function - interface required of a + range-hashing functor
    2. + +
    3. direct_mask_range_hashing + - (bit) mask-based range hashing functor
    4. + +
    5. direct_mod_range_hashing + - modulo-based range hashing functor
    6. +
    +
  4. + +
  5. Probe Functions: + +
      +
    1. Sample probe + function - interface required of a probe functor
    2. + +
    3. null_probe_fn - type + indicating one-step ranged-probe
    4. + +
    5. linear_probe_fn - + linear-probe functor
    6. + +
    7. quadratic_probe_fn- + quadratic-probe functor
    8. +
    +
  6. + +
  7. Ranged-Hash Functions: + +
      +
    1. Sample + ranged-hash function - interface required of a + ranged-hash functor
    2. +
    +
  8. + +
  9. Ranged-Probe Functions: + +
      +
    1. Sample + ranged-probe function - interface required of a + ranged-probe functor
    2. +
    +
  10. +
+ +

Resize Policies

+
    +
  1. Resize Policies: + +
      +
    1. Sample resize + policy - interface required of a resize policy
    2. + +
    3. hash_standard_resize_policy + - standard resize policy
    4. +
    +
  2. + +
  3. Size Policies: + +
      +
    1. Sample size + policy - interface required of a size policy
    2. + +
    3. hash_exponential_size_policy + - exponential size policy (typically used with (bit) mask + range-hashing)
    4. + +
    5. hash_prime_size_policy + - prime size policy (typically used with modulo + range-hashing)
    6. +
    +
  4. + +
  5. Trigger Policies: + +
      +
    1. Sample trigger + policy - interface required of a trigger policy
    2. + +
    3. hash_load_check_resize_trigger + - trigger policy based on load checks
    4. + +
    5. cc_hash_max_collision_check_resize_trigger + - trigger policy based on collision checks
    6. +
    +
  6. +
+ +

Tree Policies

+ +

Tree Node-Update Policies

+ + +
    +
  1. Sample node +updater policy - interface required of a tree +node-updating functor
  2. + +
  3. null_tree_node_update +- null policy indicating no updates are required
  4. + +
  5. tree_order_statistics_node_update +- updater enabling order statistics queries
  6. +
+ +

Trie Policies

+ + +

Trie Element-Access Traits

+ +
    +
  1. Sample + element-access traits - interface required of + element-access traits
  2. + +
  3. string_trie_e_access_traits + - String element-access traits
  4. +
+ +

Trie Node-Update Policies

+ + +
    +
  1. Sample node +updater policy - interface required of a trie node +updater
  2. + +
  3. null_trie_node_update +- null policy indicating no updates are required
  4. + +
  5. trie_prefix_search_node_update +- updater enabling prefix searches
  6. + +
  7. trie_order_statistics_node_update +- updater enabling order statistics queries
  8. +
+ +

List Policies

+ +

List Update Policies

+ + +
    +
  1. Sample list update + policy - interface required of a list update policy
  2. + +
  3. move_to_front_lu_policy + - move-to-front update algorithm
  4. + +
  5. counter_lu_policy - + counter update algorithm
  6. +
+ +

Mapped-Type Policies

+ + +
    +
  1. null_mapped_type - data + policy indicating that a container is a "set"
  2. +
+
+ +

Exceptions

+ + +
    +
  1. container_error + - base class for all policy-based data structure errors
  2. + +
  3. insert_error
  4. + +
  5. join_error
  6. + +
  7. resize_error
  8. +
+ +
+ + diff --git a/libstdc++-v3/doc/html/ext/pb_ds/introduction.html b/libstdc++-v3/doc/html/ext/pb_ds/introduction.html new file mode 100644 index 00000000000..b3ccbd76aee --- /dev/null +++ b/libstdc++-v3/doc/html/ext/pb_ds/introduction.html @@ -0,0 +1,120 @@ + + + + + + + Introduction + + + + +
+

Introduction

+ +

This section describes what problems the library attempts to + solve. Motivation describes the + reasons we think it solves these problems better than similar + libraries.

+ +

Associative Containers

+ +
    +
  1. Associative containers depend on their policies to a very + large extent. Implicitly hard-wiring policies can hamper their + performance and limit their functionality. An efficient + hash-based container, for example, requires policies for + testing key equivalence, hashing keys, translating hash + values into positions within the hash table, and determining + when and how to resize the table internally. A tree-based + container can efficiently support order statistics, + i.e., the ability to query what is the order of each + key within the sequence of keys in the container, but only if + the container is supplied with a policy to internally update + meta-data. There are many other such examples.

  2. + +
  3. Ideally, all associative containers would share the same + interface. Unfortunately, underlying data structures and + mapping semantics differentiate between different containers. + For example, suppose one writes a generic function + manipulating an associative container Cntnr: +
    +template<typename Cntnr>
    +  void
    +  some_op_sequence(Cntnr& r_cnt)
    +  {
    +    ...
    +  }
    +
    + +then what can one assume about Cntnr? The answer +varies according to its underlying data structure. If the +underlying data structure of Cntnr is based on a tree or +trie, then the order of elements is well defined; otherwise, it is +not, in general. If the underlying data structure of Cntnr +is based on a collision-chaining hash table, then modifying +r_Cntnr will not invalidate its iterators' order; if the +underlying data structure is a probing hash table, then this is not +the case. If the underlying data structure is based on a tree or +trie, then r_cnt can efficiently be split; otherwise, it +cannot, in general. If the underlying data structure is a red-black +tree, then splitting r_cnt is exception-free; if it is an +ordered-vector tree, exceptions can be thrown. +

  4. +
+ +

Priority Queues

+ +

Priority queues are useful when one needs to efficiently + access a minimum (or maximum) value as the set of values + changes.

+ +
    +
  1. Most useful data structures for priority queues have a + relatively simple structure, as they are geared toward + relatively simple requirements. Unfortunately, these structures + do not support access to an arbitrary value, which turns out to + be necessary in many algorithms. Say, decreasing an arbitrary + value in a graph algorithm. Therefore, some extra mechanism is + necessary and must be invented for accessing arbitrary + values. There are at least two alternatives: embedding an + associative container in a priority queue, or allowing + cross-referencing through iterators. The first solution adds + significant overhead; the second solution requires a precise + definition of iterator invalidation. Which is the next + point...

  2. + +
  3. Priority queues, like hash-based containers, store values in + an order that is meaningless and undefined externally. For + example, a push operation can internally reorganize the + values. Because of this characteristic, describing a priority + queues' iterator is difficult: on one hand, the values to which + iterators point can remain valid, but on the other, the logical + order of iterators can change unpredictably.

  4. + +
  5. Roughly speaking, any element that is both inserted to a + priority queue (e.g., through push) and removed + from it (e.g., through pop), incurs a + logarithmic overhead (in the amortized sense). Different + underlying data structures place the actual cost differently: + some are optimized for amortized complexity, whereas others + guarantee that specific operations only have a constant + cost. One underlying data structure might be chosen if modifying + a value is frequent (Dijkstra's shortest-path algorithm), + whereas a different one might be chosen + otherwise. Unfortunately, an array-based binary heap - an + underlying data structure that optimizes (in the amortized + sense) push and pop operations, differs from + the others in terms of its invalidation guarantees. Other design + decisions also impact the cost and placement of the overhead, at + the expense of more difference in the the kinds of operations + that the underlying data structure can support. These + differences pose a challenge when creating a uniform interface + for priority queues.

  6. +
+
+ + diff --git a/libstdc++-v3/doc/html/ext/pb_ds/invalidation_guarantee_cd.png b/libstdc++-v3/doc/html/ext/pb_ds/invalidation_guarantee_cd.png new file mode 100644 index 00000000000..1f9d1243c6a Binary files /dev/null and b/libstdc++-v3/doc/html/ext/pb_ds/invalidation_guarantee_cd.png differ diff --git a/libstdc++-v3/doc/html/ext/pb_ds/invalidation_guarantee_erase.png b/libstdc++-v3/doc/html/ext/pb_ds/invalidation_guarantee_erase.png new file mode 100644 index 00000000000..940a27f7142 Binary files /dev/null and b/libstdc++-v3/doc/html/ext/pb_ds/invalidation_guarantee_erase.png differ diff --git a/libstdc++-v3/doc/html/ext/pb_ds/join_error.html b/libstdc++-v3/doc/html/ext/pb_ds/join_error.html new file mode 100644 index 00000000000..3441e1fb20b --- /dev/null +++ b/libstdc++-v3/doc/html/ext/pb_ds/join_error.html @@ -0,0 +1,48 @@ + + + + + + +join_error Interface + + + + +
+

join_error Interface

+ +

A join cannot be performed logical reasons (i.e., the ranges of the + two container objects + being joined + overlaps.

+ +

Defined in: exception.hpp

+ +

Base Classes

+ + + + + + + + + + + + + +
ClassDerivation Type
+
join_error
+
+
+

public

+
+
+ + diff --git a/libstdc++-v3/doc/html/ext/pb_ds/linear_probe_fn.html b/libstdc++-v3/doc/html/ext/pb_ds/linear_probe_fn.html new file mode 100644 index 00000000000..2141c2657ce --- /dev/null +++ b/libstdc++-v3/doc/html/ext/pb_ds/linear_probe_fn.html @@ -0,0 +1,140 @@ + + + + + + + linear_probe_fn Interface + + + + +
+

linear_probe_fn Interface

+ +

A probe sequence policy using fixed increments.

+ +

Defined in: hash_policy.hpp

+ +

Template Parameters

+ + + + + + + + + + + + + + + + + +
ParameterDescriptionDefault Value
+
+typename Size_Type 
+
+
+

Size type.

+
size_t
+ +

Public Types and + Constants

+ +

General Definitions

+ + + + + + + + + + + + + + + + + +
TypeDefinitionDescription
+
+size_type
+
+
+
+Size_Type
+
+
+

Size type.

+
+ +

Public Methods

+ +

Constructors, Destructor, and + Related

+ + + + + + + + + + + + + +
MethodDescription
+
+void
+  swap
+  (linear_probe_fn &other)
+
+
+

Swaps content.

+
+ +

Protected Methods

+ +

Offset Methods

+ + + + + + + + + + + + + +
MethodDescription
+
+inline size_type
+  operator()
+  (size_type i) const
+
+
+

Returns the i-th + offset from the hash value.

+
+
+ + diff --git a/libstdc++-v3/doc/html/ext/pb_ds/list_update.html b/libstdc++-v3/doc/html/ext/pb_ds/list_update.html new file mode 100644 index 00000000000..93785acfd9c --- /dev/null +++ b/libstdc++-v3/doc/html/ext/pb_ds/list_update.html @@ -0,0 +1,316 @@ + + + + + + + list_update Interface + + + + +
+

list_update Interface

+ +

A list-update based associative container.

+ +

Defined in: assoc_container.hpp

+ +

Template Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterDescriptionDefault Value
+
+typename Key
+
+
+

Key type.

+
-
+
+typename Mapped
+
+
+

Mapped type.

+
-
+
+class Eq_Fn 
+
+
+

Equivalence functor.

+
+
+std::equal_to<Key>
+
+
+
+class Update_Policy 
+
+
+

Update policy (determines when an element will be + moved to the front of the list.

+
move_to_front_lu_policy
+
+class Allocator 
+
+
+

Allocator type.

+
+
+std::allocator<char>
+
+
+ +

Base Classes

+ + + + + + + + + + + + + +
ClassDerivation Type
+
+container_base
+
+
+

public

+
+ +

Public Types and + Constants

+ +

Policy definitions.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
TypeDefinitionDescription
+
+eq_fn
+
+
+
+Eq_Fn
+
+
+

Equivalence functor type.

+
+
+update_policy
+
+
+
+Update_Policy
+
+
+

List update policy type.

+
+
+allocator
+
+
+
+Allocator
+
+
+

Allocator + type.

+
+ +

Public Methods

+ +

Constructors, Destructor, and + Related

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDescription
+
+  list_update
+  ()
+
+
+

Default constructor.

+
+
+template<
+    class It>
+  list_update
+  (It first_it, 
+    It last_it)
+
+
+

Constructor taking iterators to a range of + value_types. The value_types between first_it and last_it will be inserted into the + container object.

+
+
+  list_update
+  (const list_update &other)
+
+
+

Copy constructor.

+
+
+virtual 
+  ~list_update
+  ()
+
+
+

Destructor.

+
+
+list_update &
+  operator=
+  (const list_update &other)
+
+
+

Assignment operator.

+
+
+void
+  swap
+  (list_update &other)
+
+
+

Swaps content.

+
+
+ + diff --git a/libstdc++-v3/doc/html/ext/pb_ds/list_update_tag.html b/libstdc++-v3/doc/html/ext/pb_ds/list_update_tag.html new file mode 100644 index 00000000000..a35dc8cdab8 --- /dev/null +++ b/libstdc++-v3/doc/html/ext/pb_ds/list_update_tag.html @@ -0,0 +1,47 @@ + + + + + + + list_update_tag Interface + + + + +
+

list_update_tag Interface

+ +

List-update data structure tag.

+ +

Defined in: tag_and_trait.hpp

+ +

Base Classes

+ + + + + + + + + + + + + +
ClassDerivation Type
+
+associative_container_tag
+
+
+

public

+
+
+ + diff --git a/libstdc++-v3/doc/html/ext/pb_ds/lu.png b/libstdc++-v3/doc/html/ext/pb_ds/lu.png new file mode 100644 index 00000000000..7c96dcaf665 Binary files /dev/null and b/libstdc++-v3/doc/html/ext/pb_ds/lu.png differ diff --git a/libstdc++-v3/doc/html/ext/pb_ds/lu_based_containers.html b/libstdc++-v3/doc/html/ext/pb_ds/lu_based_containers.html new file mode 100644 index 00000000000..c8693437d9e --- /dev/null +++ b/libstdc++-v3/doc/html/ext/pb_ds/lu_based_containers.html @@ -0,0 +1,229 @@ + + + + + + + List-Based Containers + + + + +
+

List-Update Design

+ +

Overview

+ +

The list-based container has the following declaration:

+
+template<
+    typename Key,
+    typename Mapped,
+    typename Eq_Fn = std::equal_to<Key>,
+    typename Update_Policy = move_to_front_lu_policy<>,
+    typename Allocator = std::allocator<char> >
+class list_update;
+
+ +

The parameters have the following meaning:

+ +
    +
  1. Key is the key type.
  2. + +
  3. Mapped is the mapped-policy, and is explained in + Tutorial::Associative + Containers::Associative Containers Others than Maps.
  4. + +
  5. Eq_Fn is a key equivalence functor.
  6. + +
  7. Update_Policy is a policy updating positions in + the list based on access patterns. It is described in the + following subsection.
  8. + +
  9. Allocator is an allocator + type.
  10. +
+ +

A list-based associative container is a container that + stores elements in a linked-list. It does not order the + elements by any particular order related to the keys. + List-based containers are primarily useful for creating + "multimaps" (see Motivation::Associative + Containers::Avoiding Multiple Keys and Tutorial::Associative + Containers::Associative Containers Others than Maps). In + fact, list-based containers are designed in pb_ds + expressly for this purpose. This is explained further in + Use for "Multimaps".

+ +

List-based containers might also be useful for some rare + cases, where a key is encapsulated to the extent that only + key-equivalence can be tested. Hash-based containers need to + know how to transform a key into a size type, and tree-based + containers need to know if some key is larger than another. + List-based associative containers, conversely, only need to + know if two keys are equivalent.

+ +

Since a list-based associative container does not order + elements by keys, is it possible to order the list in some + useful manner? Remarkably, many on-line competitive [motwani95random] + algorithms exist for reordering lists to reflect access + prediction [andrew04mtf].

+ +

List + Updates

+ +

General Terms

+ +

Figure A simple list shows a + simple list of integer keys. If we search for the integer 6, we + are paying an overhead: the link with key 6 is only the fifth + link; if it were the first link, it could be accessed + faster.

+ +
no image
+ +
A simple list.
+ +

List-update algorithms reorder lists as elements are + accessed. They try to determine, by the access history, which + keys to move to the front of the list. Some of these algorithms + require adding some metadata alongside each entry.

+ +

For example, Figure The counter algorithm + -A shows the counter algorithm. Each node contains both a key + and a count metadata (shown in bold). When an element is + accessed (e.g. 6) its count is incremented, as shown in + Figure The counter algorithm -B. If the count + reaches some predetermined value, say 10, as shown in Figure + The counter algorithm -C, the count is set to + 0 and the node is moved to the front of the list, as in Figure + The counter algorithm -D.

+ +
+
+ +
The counter algorithm.
+ +

Implementation

+ +

pb_ds allows instantiating lists with policies + implementing any algorithm moving nodes to the front of the + list (policies implementing algorithms interchanging nodes are + unsupported).

+ +

Associative containers based on lists are parametrized by a + Update_Policy parameter. This parameter defines the + type of metadata each node contains, how to create the + metadata, and how to decide, using this metadata, whether to + move a node to the front of the list. A list-based associative + container object derives (publicly) from its update policy. + Figure A list and its update + policy shows the scheme, as well as some predefined + policies (which are explained below).

+ +
+
+ +
A list and its update policy.
+ +

An instantiation of Update_Policy must define + internally update_metadata as the metadata it + requires. Internally, each node of the list contains, besides + the usual key and data, an instance of typename + Update_Policy::update_metadata.

+ +

An instantiation of Update_Policy must define + internally two operators:

+
+update_metadata
+operator()();
+
+bool
+operator()(update_metadata &);
+
+ +

The first is called by the container object, when creating a + new node, to create the node's metadata. The second is called + by the container object, when a node is accessed (e.g., + when a find operation's key is equivalent to the key of the + node), to determine whether to move the node to the front of + the list.

+ +

The library contains two predefined implementations of + list-update policies [andrew04mtf]. The first is + counter_lu_policy, which + implements the counter algorithm described above. The second is + move_to_front_lu_policy, + which unconditionally move an accessed element to the front of + the list. The latter type is very useful in pb_ds, + since there is no need to associate metadata with each element + (this is explained further in Use for + "Multimaps").

+ +

Use for "Multimaps"

+ +

In pb_ds, there are no equivalents for the STL's + multimaps and multisets; instead one uses an associative + container mapping primary keys to secondary keys (see Motivation::Associative + Containers::Alternative to Multiple Equivalent Keys and + Tutorial::Associative + Containers::Associative Containers Others than Maps).

+ +

List-based containers are especially useful as associative + containers for secondary keys. In fact, they are implemented + here expressly for this purpose.

+ +

To begin with, these containers use very little per-entry + structure memory overhead, since they can be implemented as + singly-linked lists. (Arrays use even lower per-entry memory + overhead, but they are less flexible in moving around entries, + and have weaker invalidation guarantees).

+ +

More importantly, though, list-based containers use very + little per-container memory overhead. The memory overhead of an + empty list-based container is practically that of a pointer. + This is important for when they are used as secondary + associative-containers in situations where the average ratio of + secondary keys to primary keys is low (or even 1).

+ +

In order to reduce the per-container memory overhead as much + as possible, they are implemented as closely as possible to + singly-linked lists.

+ +
    +
  1. List-based containers do not store internally the number + of values that they hold. This means that their size + method has linear complexity (just like std::list). + Note that finding the number of equivalent-key values in an + STL multimap also has linear complexity (because it must be + done, e.g., via std::distance of the + multimap's equal_range method), but usually with + higher constants.
  2. + +
  3. Most associative-container objects each hold a policy + object (e.g., a hash-based container object holds a + hash functor). List-based containers, conversely, only have + class-wide policy objects.
  4. +
+ +

See also Associative-Container + Performance Tests::Observations::Mapping-Semantics + Considerations.

+
+ + diff --git a/libstdc++-v3/doc/html/ext/pb_ds/misc.html b/libstdc++-v3/doc/html/ext/pb_ds/misc.html new file mode 100644 index 00000000000..01029e13454 --- /dev/null +++ b/libstdc++-v3/doc/html/ext/pb_ds/misc.html @@ -0,0 +1,26 @@ + + + + + + + Misc. + + + + +
+

Misc.

+ +

Acks + contains acknowledgments; Contact + contains contact information;Disclaimer and Copyright is a standard + disclaimer, and References + contains references.

+
+ + diff --git a/libstdc++-v3/doc/html/ext/pb_ds/motivation.html b/libstdc++-v3/doc/html/ext/pb_ds/motivation.html new file mode 100644 index 00000000000..420fc645103 --- /dev/null +++ b/libstdc++-v3/doc/html/ext/pb_ds/motivation.html @@ -0,0 +1,993 @@ + + + + + + + Motivation + + + + +
+

Motivation

+ +

Many fine associative-container libraries were already + written, most notably, the STL's associative containers. Why + then write another library? This section shows some possible + advantages of this library, when considering the challenges in + Introduction. Many of these + points stem from the fact that the STL introduced + associative-containers in a two-step process (first + standardizing tree-based containers, only then adding + hash-based containers, which are fundamentally different), did + not standardize priority queues as containers, and (in our + opinion) overloads the iterator concept.

+ +

Associative Containers

+ +

More + Configuration Choices

+ +

Associative containers require a relatively large number of + policies to function efficiently in various settings. In some + cases this is needed for making their common operations more + efficient, and in other cases this allows them to support a + larger set of operations

+ +
    +
  1. Hash-based containers, for example, support look-up and + insertion methods (e.g., find and + insert). In order to locate elements quickly, they + are supplied a hash functor, which instruct how to transform + a key object into some size type; e.g., a hash functor + might transform "hello" into 1123002298. A + hash table, though, requires transforming each key object + into some size-type type in some specific domain; + e.g., a hash table with a 128-long table might + transform "hello" into position 63. The policy by + which the hash value is transformed into a position within + the table can dramatically affect performance (see Design::Associative + Containers::Hash-Based Containers::Hash Policies). + Hash-based containers also do not resize naturally (as + opposed to tree-based containers, for example). The + appropriate resize policy is unfortunately intertwined with + the policy that transforms hash value into a position within + the table (see Design::Associative + Containers::Hash-Based Containers::Resize Policies). + +

    Associative-Container + Performance Tests::Hash-Based Containers quantifies + some of these points.

    +
  2. + +
  3. Tree-based containers, for example, also support look-up + and insertion methods, and are primarily useful when + maintaining order between elements is important. In some + cases, though, one can utilize their balancing algorithms for + completely different purposes. + +

    Figure Metadata for + order-statistics and interval intersections-A, for + example, shows a tree whose each node contains two entries: + a floating-point key, and some size-type metadata + (in bold beneath it) that is the number of nodes in the + sub-tree. (E.g., the root has key 0.99, and has 5 + nodes (including itself) in its sub-tree.) A container based + on this data structure can obviously answer efficiently + whether 0.3 is in the container object, but it can also + answer what is the order of 0.3 among all those in the + container object [clrs2001] (see Associative Container + Examples::Tree-Like-Based Containers (Trees and + Tries)).

    + +

    As another example, Figure Metadata for order-statistics and + interval intersections-B shows a tree whose each node + contains two entries: a half-open geometric line interval, + and a number metadata (in bold beneath it) that is + the largest endpoint of all intervals in its sub-tree. + (E.g., the root describes the interval [20, + 36), and the largest endpoint in its sub-tree is 99.) A + container based on this data structure can obviously answer + efficiently whether [3, 41) is in the container + object, but it can also answer efficiently whether the + container object has intervals that intersect [3, + 41) (see Associative Container + Examples::Tree-Like-Based Containers (Trees and + Tries)). These types of queries are very useful in + geometric algorithms and lease-management algorithms.

    + +

    It is important to note, however, that as the trees are + modified, their internal structure changes. To maintain + these invariants, one must supply some policy that is aware + of these changes (see Design::Associative + Containers::Tree-Based Containers::Node Invariants); + without this, it would be better to use a linked list (in + itself very efficient for these purposes).

    + +

    Associative-Container + Performance Tests::Tree-Like-Based Containers + quantifies some of these points.

    +
  4. +
+ +
+
+ +
Metadata for order-statistics and interval + intersections.
+ +

More + Data Structures and Traits

+ +

The STL contains associative containers based on red-black + trees and collision-chaining hash tables. These are obviously + very useful, but they are not ideal for all types of + settings.

+ +

Figure Different underlying + data structures shows different underlying data structures + (the ones currently supported in pb_ds). A shows a + collision-chaining hash-table, B shows a probing hash-table, C + shows a red-black tree, D shows a splay tree, E shows a tree + based on an ordered vector(implicit in the order of the + elements), F shows a PATRICIA trie, and G shows a list-based + container with update policies.

+ +

Each of these data structures has some performance benefits, + in terms of speed, size or both (see Associative-Container + Performance Tests and Associative-Container + Performance Tests::Observations::Underlying Data-Structure + Families). For now, though, note that e.g., + vector-based trees and probing hash tables manipulate memory + more efficiently than red-black trees and collision-chaining + hash tables, and that list-based associative containers are + very useful for constructing "multimaps" (see Alternative to Multiple Equivalent + Keys, Associative Container + Performance Tests::Multimaps, and Associative Container + Performance Tests::Observations::Mapping-Semantics + Considerations).

+ +
no image
+ +
Different underlying data structures.
+ +

Now consider a function manipulating a generic associative + container, e.g.,

+
+template<
+    class Cntnr>
+int 
+    some_op_sequence
+    (Cntnr &r_cnt)
+{
+    ...
+}
+
+ +

Ideally, the underlying data structure of Cntnr + would not affect what can be done with r_cnt. + Unfortunately, this is not the case.

+ +

For example, if Cntnr is std::map, then + the function can use std::for_each(r_cnt.find(foo), + r_cnt.find(bar), foobar) in order to apply foobar + to all elements between foo and bar. If + Cntnr is a hash-based container, then this call's + results are undefined.

+ +

Also, if Cntnr is tree-based, the type and object + of the comparison functor can be accessed. If Cntnr is + hash based, these queries are nonsensical.

+ +

There are various other differences based on the container's + underlying data structure. For one, they can be constructed by, + and queried for, different policies. Furthermore:

+ +
    +
  1. Containers based on C, D, E and F store elements in a + meaningful order; the others store elements in a meaningless + (and probably time-varying) order. By implication, only + containers based on C, D, E and F can support erase + operations taking an iterator and returning an iterator to + the following element without performance loss (see Slightly Different Methods::Methods + Related to Erase).
  2. + +
  3. Containers based on C, D, E, and F can be split and + joined efficiently, while the others cannot. Containers based + on C and D, furthermore, can guarantee that this is + exception-free; containers based on E cannot guarantee + this.
  4. + +
  5. Containers based on all but E can guarantee that erasing + an element is exception free; containers based on E cannot + guarantee this. Containers based on all but B and E can + guarantee that modifying an object of their type does not + invalidate iterators or references to their elements, while + containers based on B and E cannot. Containers based on C, D, + and E can furthermore make a stronger guarantee, namely that + modifying an object of their type does not affect the order + of iterators.
  6. +
+ +

A unified tag and traits system (as used for the STL's + iterators, for example) can ease generic manipulation of + associative containers based on different underlying + data structures (see Tutorial::Associative + Containers::Determining Containers' Attributes and Design::Associative + Containers::Data-Structure Genericity::Data-Structure Tags and + Traits).

+ +

Differentiating + between Iterator Types

+ +

Iterators are centric to the STL's design, because of the + container/algorithm/iterator decomposition that allows an + algorithm to operate on a range through iterators of some + sequence (e.g., one originating from a container). + Iterators, then, are useful because they allow going over a + sequence. The STL also uses iterators for accessing a + specific element - e.g., when an associative + container returns one through find. The STL, however, + consistently uses the same types of iterators for both + purposes: going over a range, and accessing a specific found + element. Before the introduction of hash-based containers to + the STL, this made sense (with the exception of priority + queues, which are discussed in Priority + Queues).

+ +

Using the STL's associative containers together with + non-order-preserving associative containers (and also because + of priority-queues container), there is a possible need for + different types of iterators for self-organizing containers - + the iterator concept seems overloaded to mean two different + things (in some cases). The following subsections explain this; + Tutorial::Associative + Containers::Point-Type and Range-Type Methods explains an + alternative design which does not complicate the use of + order-preserving containers, but is better for unordered + containers; Design::Associative + Containers::Data-Structure Genericity::Point-Type and + Range-Type Methods explains the design further.

+ +

Using Point-Type Iterators for + Range-Type Operations

+ +

Suppose cntnr is some associative container, and + say c is an object of type cntnr. Then what + will be the outcome of

+
+std::for_each(c.find(1), c.find(5), foo);
+
+ +

If cntnr is a tree-based container object, then an + in-order walk will apply foo to the relevant elements, + e.g., as in Figure Range + iteration in different data structures -A. If c is + a hash-based container, then the order of elements between any + two elements is undefined (and probably time-varying); there is + no guarantee that the elements traversed will coincide with the + logical elements between 1 and 5, e.g., as in + Figure Range iteration in different + data structures-B.

+ +
no image
+ +
Range iteration in different + data structures.
+ +

In our opinion, this problem is not caused just because + red-black trees are order preserving while collision-chaining + hash tables are (generally) not - it is more fundamental. Most + of the STL's containers order sequences in a well-defined + manner that is determined by their interface: calling + insert on a tree-based container modifies its sequence + in a predictable way, as does calling push_back on a + list or a vector. Conversely, collision-chaining hash tables, + probing hash tables, priority queues, and list-based containers + (which are very useful for "multimaps") are self-organizing + data structures; the effect of each operation modifies their + sequences in a manner that is (practically) determined by their + implementation.

+ +

Consequently, applying an algorithm to a sequence obtained + from most containers may or may not make sense, but + applying it to a sub-sequence of a self-organizing container + does not.

+ +

The Cost of Enabling Range + Capabilities to Point-Type Iterators

+ +

Suppose c is some collision-chaining hash-based + container object, and one calls c.find(3). Then what + composes the returned iterator?

+ +

Figure Point-type + iterators in hash tables-A shows the simplest (and most + efficient) implementation of a collision-chaining hash table. + The little box marked point_iterator shows an object + that contains a pointer to the element's node. Note that this + "iterator" has no way to move to the next element (i.e., + it cannot support operator++). Conversely, the + little box marked iterator stores both a pointer to + the element, as well as some other information (e.g., + the bucket number of the element). the second iterator, then, + is "heavier" than the first one- it requires more time and + space. If we were to use a different container to + cross-reference into this hash-table using these iterators - it + would take much more space. As noted in Using Point-Type Iterators for + Range-Type Operations, nothing much can be done by + incrementing these iterators, so why is this extra information + needed?

+ +

Alternatively, one might create a collision-chaining + hash-table where the lists might be linked, forming a + monolithic total-element list, as in Figure Point-type iterators in hash + tables-B (this seems similar to the Dinkumware design + [dinkumware_stl]). + Here the iterators are as light as can be, but the hash-table's + operations are more complicated.

+ +
no image
+ +
Point-type iterators in hash tables.
+ +

It should be noted that containers based on + collision-chaining hash-tables are not the only ones with this + type of behavior; many other self-organizing data structures + display it as well.

+ +

Invalidation + Guarantees

+ +

Consider the following snippet:

+
+it = c.find(3);
+
+c.erase(5);
+
+ +

Following the call to erase, what is the validity + of it: can it be de-referenced? can it be + incremented?

+ +

The answer depends on the underlying data structure of the + container. Figure Effect of erase in different + underlying data structures shows three cases: A1 and A2 + show a red-black tree; B1 and B2 show a probing hash-table; C1 + and C2 show a collision-chaining hash table.

+ +
no image
+ +
Effect of erase in different underlying + data structures.
+ +
    +
  1. Erasing 5 from A1 yields A2. Clearly, an iterator to 3 + can be de-referenced and incremented. The sequence of + iterators changed, but in a way that is well-defined by the + interface.
  2. + +
  3. Erasing 5 from B1 yields B2. Clearly, an iterator to 3 is + not valid at all - it cannot be de-referenced or incremented; + the order of iterators changed in a way that is (practically) + determined by the implementation and not by the + interface.
  4. + +
  5. Erasing 5 from C1 yields C2. Here the situation is more + complicated. On the one hand, there is no problem in + de-referencing it. On the other hand, the order of + iterators changed in a way that is (practically) determined + by the implementation and not by the + interface.
  6. +
+ +

So in classic STL, it is not always possible to express + whether it is valid or not. This is true also for + insert, e.g.. Again, the iterator concept seems + overloaded.

+ +

Slightly + Different Methods

+ +

[meyers02both] + points out that a class's methods should comprise only + operations which depend on the class's internal structure; + other operations are best designed as external functions. + Possibly, therefore, the STL's associative containers lack some + useful methods, and provide some other methods which would be + better left out (e.g., [sgi_stl] ).

+ +

Methods + Related to Erase

+ +
    +
  1. Order-preserving STL associative containers provide the + method +
    +iterator 
    +    erase
    +    (iterator it)
    +
    which takes an iterator, erases the corresponding element, +and returns an iterator to the following element. Also hash-based +STL associative containers provide this method. This seemingly +increases genericity between associative containers, since, + e.g., it is possible to use +
    +typename C::iterator it = c.begin();
    +typename C::iterator e_it = c.end();
    +
    +while(it != e_it)
    +    it = pred(*it)? c.erase(it) : ++it;
    +
    in order to erase from a container object + c all element which match a predicate pred. + However, in a different sense this actually + decreases genericity: an integral implication of + this method is that tree-based associative containers' + memory use is linear in the total number of elements they + store, while hash-based containers' memory use is unbounded + in the total number of elements they store. Assume a + hash-based container is allowed to decrease its size when + an element is erased. Then the elements might be rehashed, + which means that there is no "next" element - it is simply + undefined. Consequently, it is possible to infer from the + fact that STL hash-based containers provide this method + that they cannot downsize when elements are erased + (Performance + Tests::Hash-Based Container Tests quantifies this.) As + a consequence, different code is needed to manipulate + different containers, assuming that memory should be + conserved. pb_ds's non-order preserving + associative containers omit this method. +
  2. + +
  3. All of pb_ds's associative containers include a + conditional-erase method +
    +template<
    +    class Pred>
    +size_type
    +    erase_if
    +    (Pred pred)
    +
    which erases all elements matching a predicate. This is +probably the only way to ensure linear-time multiple-item erase +which can actually downsize a container. +
  4. + +
  5. STL associative containers provide methods for + multiple-item erase of the form +
    +size_type
    +    erase
    +    (It b, 
    +        It e)
    +
    erasing a range of elements given by a pair of iterators. For +tree-based or trie-based containers, this can implemented more +efficiently as a (small) sequence of split and join operations. For +other, unordered, containers, this method isn't much better than an +external loop. Moreover, if c is a hash-based container, +then, e.g., c.erase(c.find(2), c.find(5)) is almost +certain to do something different than erasing all elements whose +keys are between 2 and 5, and is likely to produce other undefined +behavior. +
  6. +
+ +

Methods Related to Split and + Join

+ +

It is well-known that tree-based and trie-based container + objects can be efficiently split or joined [clrs2001]. Externally splitting + or joining trees is super-linear, and, furthermore, can throw + exceptions. Split and join methods, consequently, seem good + choices for tree-based container methods, especially, since as + noted just before, they are efficient replacements for erasing + sub-sequences. Performance + Tests::Tree-Like-Based Container Tests quantifies this.

+ +

Methods Related to Insert

+ +

STL associative containers provide methods of the form

+
+template<
+    class It>
+size_type
+    insert
+    (It b,
+        It e);
+
for inserting a range of elements given by a pair of +iterators. At best, this can be implemented as an external loop, +or, even more efficiently, as a join operation (for the case of +tree-based or trie-based containers). Moreover, these methods seem +similar to constructors taking a range given by a pair of +iterators; the constructors, however, are transactional, whereas +the insert methods are not; this is possibly confusing. + +

Functions Related to + Comparison

+ +

Associative containers are parametrized by policies + allowing to test key equivalence; e.g. a hash-based + container can do this through its equivalence functor, and a + tree-based container can do this through its comparison + functor. In addition, some STL associative containers have + global function operators, e.g., + operator== and operator<=, + that allow comparing entire associative containers.

+ +

In our opinion, these functions are better left out. To + begin with, they do not significantly improve over an external + loop. More importantly, however, they are possibly misleading - + operator==, for example, usually checks for + equivalence, or interchangeability, but the associative + container cannot check for values' equivalence, only keys' + equivalence; also, are two containers considered equivalent if + they store the same values in different order? this is an + arbitrary decision.

+ +

Alternative to Multiple Equivalent + Keys

+ +

Maps (or sets) allow mapping (or storing) unique-key values. + The STL, however, also supplies associative containers which + map (or store) multiple values with equivalent keys: + std::multimap, std::multiset, + std::tr1::unordered_multimap, and + unordered_multiset. We first discuss how these might + be used, then why we think it is best to avoid them.

+ +

Suppose one builds a simple bank-account application that + records for each client (identified by an std::string) + and account-id (marked by an unsigned long) - + the balance in the account (described by a + float). Suppose further that ordering this + information is not useful, so a hash-based container is + preferable to a tree based container. Then one can use

+
+std::tr1::unordered_map<std::pair<std::string, unsigned long>, float, ...>
+
which hashes every combination of client and +account-id. This might work well, except for the fact that it +is now impossible to efficiently list all of the accounts of a +specific client (this would practically require iterating over all +entries). Instead, one can use +
+std::tr1::unordered_multimap<std::pair<std::string, unsigned long>, float, ...>
+
which hashes every client, and decides equivalence +based on client only. This will ensure that all accounts +belonging to a specific user are stored consecutively. + +

Also, suppose one wants an integers' priority queue + (i.e., a container that supports push, + pop, and top operations, the last of which + returns the largest int) that also supports + operations such as find and lower_bound. A + reasonable solution is to build an adapter over + std::set<int>. In this adapter, + e.g., push will just call the tree-based + associative container's insert method; pop + will call its end method, and use it to return the + preceding element (which must be the largest). Then this might + work well, except that the container object cannot hold + multiple instances of the same integer (push(4), + e.g., will be a no-op if 4 is already in the + container object). If multiple keys are necessary, then one + might build the adapter over an + std::multiset<int>.

+ +

STL non-unique-mapping containers, then, are + useful when (1) a key can be decomposed in to a primary key and + a secondary key, (2) a key is needed multiple times, or (3) any + combination of (1) and (2).

+ +

Figure Non-unique mapping + containers in the STL's design shows how the STL's design + works internally; in this figure nodes shaded equally represent + equivalent-key values. Equivalent keys are stored consecutively + using the properties of the underlying data structure: binary + search trees (Figure Non-unique + mapping containers in the STL's design-A) store + equivalent-key values consecutively (in the sense of an + in-order walk) naturally; collision-chaining hash tables + (Figure Non-unique mapping + containers in the STL's design-B) store equivalent-key + values in the same bucket, the bucket can be arranged so that + equivalent-key values are consecutive.

+ +
+
+ +
Non-unique mapping containers in the STL's + design.
+ +

Put differently, STL non-unique mapping + associative-containers are associative containers that map + primary keys to linked lists that are embedded into the + container. Figure Effect of + embedded lists in STL multimaps shows again the two + containers from Figure Non-unique + mapping containers in the STL's design, this time with the + embedded linked lists of the grayed nodes marked + explicitly.

+ +
+
+ +
Effect of embedded lists in STL multimaps.
+ +

These embedded linked lists have several disadvantages.

+ +
    +
  1. The underlying data structure embeds the linked lists + according to its own consideration, which means that the + search path for a value might include several different + equivalent-key values. For example, the search path for the + the black node in either of Figures Non-unique mapping containers in the + STL's design A or B, includes more than a single gray + node.
  2. + +
  3. The links of the linked lists are the underlying + data structures' nodes, which typically are quite structured. + E.g., in the case of tree-based containers (Figure + Effect of embedded lists in STL + multimaps-B), each "link" is actually a node with three + pointers (one to a parent and two to children), and a + relatively-complicated iteration algorithm. The linked lists, + therefore, can take up quite a lot of memory, and iterating + over all values equal to a given key (e.g., through + the return value of the STL's equal_range) can be + expensive.
  4. + +
  5. The primary key is stored multiply; this uses more + memory.
  6. + +
  7. Finally, the interface of this design excludes several + useful underlying data structures. E.g., of all the + unordered self-organizing data structures, practically only + collision-chaining hash tables can (efficiently) guarantee + that equivalent-key values are stored consecutively.
  8. +
+ +

The above reasons hold even when the ratio of secondary keys + to primary keys (or average number of identical keys) is small, + but when it is large, there are more severe problems:

+ +
    +
  1. The underlying data structures order the links inside + each embedded linked-lists according to their internal + considerations, which effectively means that each of the + links is unordered. Irrespective of the underlying + data structure, searching for a specific value can degrade to + linear complexity.
  2. + +
  3. Similarly to the above point, it is impossible to apply + to the secondary keys considerations that apply to primary + keys. For example, it is not possible to maintain secondary + keys by sorted order.
  4. + +
  5. While the interface "understands" that all equivalent-key + values constitute a distinct list (e.g., through + equal_range), the underlying data structure + typically does not. This means, e.g., that operations + such as erasing from a tree-based container all values whose + keys are equivalent to a a given key can be super-linear in + the size of the tree; this is also true also for several + other operations that target a specific list.
  6. +
+ +

In pb_ds, therefore, all associative containers map + (or store) unique-key values. One can (1) map primary keys to + secondary associative-containers (i.e., containers of + secondary keys) or non-associative containers (2) map identical + keys to a size-type representing the number of times they + occur, or (3) any combination of (1) and (2). Instead of + allowing multiple equivalent-key values, pb_ds + supplies associative containers based on underlying + data structures that are suitable as secondary + associative-containers (see Associative-Container + Performance Tests::Observations::Mapping-Semantics + Considerations).

+ +

Figures Non-unique mapping + containers in pb_ds A and B show the equivalent + structures in pb_ds's design, to those in Figures + Non-unique mapping containers in + the STL's design A and B, respectively. Each shaded box + represents some size-type or secondary + associative-container.

+ +
+
+ +
Non-unique mapping containers in the + pb_ds.
+ +

In the first example above, then, one would use an + associative container mapping each user to an associative + container which maps each application id to a start time (see + basic_multimap.cc); + in the second example, one would use an associative container + mapping each int to some size-type indicating + the number of times it logically occurs (see basic_multiset.cc).

+ +

Associative-Container + Performance Tests::Multimaps quantifies some of these + points, and Associative-Container + Performance Tests::Observations::Mapping-Semantics + Considerations shows some simple calculations.

+ +

Associative-Container + Examples::Multimaps shows some simple examples of using + "multimaps".

+ +

Design::Associative + Containers::List-Based Containers discusses types of + containers especially suited as secondary + associative-containers.

+ +

Priority Queues

+ +

Slightly Different + Methods

+ +

Priority queues are containers that allow efficiently + inserting values and accessing the maximal value (in the sense + of the container's comparison functor); i.e., their + interface supports push and pop. The STL's + priority queues indeed support these methods, but they support + little else. For algorithmic and software-engineering purposes, + other methods are needed:

+ +
    +
  1. Many graph algorithms [clrs2001] require increasing a + value in a priority queue (again, in the sense of the + container's comparison functor), or joining two + priority-queue objects.
  2. + +
  3. It is sometimes necessary to erase an arbitrary value in + a priority queue. For example, consider the select + function for monitoring file descriptors: +
    +int 
    +    select
    +    (int nfds,             
    +        fd_set *readfds,                
    +        fd_set *writefds,
    +        fd_set *errorfds, 
    +        struct timeval *timeout);
    +
    then, as the select manual page [select_man] states: + +

    The nfds argument specifies the range of file + descriptors to be tested. The select() function tests file + descriptors in the range of 0 to nfds-1.

    + +

    It stands to reason, therefore, that we might wish to + maintain a minimal value for nfds, and priority + queues immediately come to mind. Note, though, that when a + socket is closed, the minimal file description might + change; in the absence of an efficient means to erase an + arbitrary value from a priority queue, we might as well + avoid its use altogether.

    + +

    Priority-Queue + Examples::Cross-Referencing shows examples for these + types of operations.

    +
  4. + +
  5. STL containers typically support iterators. It is + somewhat unusual for std::priority_queue to omit + them (see, e.g., [meyers01stl]). One might + ask why do priority queues need to support iterators, since + they are self-organizing containers with a different purpose + than abstracting sequences. There are several reasons: + +
      +
    1. Iterators (even in self-organizing containers) are + useful for many purposes, e.g., cross-referencing + containers, serialization, and debugging code that uses + these containers.
    2. + +
    3. The STL's hash-based containers support iterators, + even though they too are self-organizing containers with + a different purpose than abstracting sequences.
    4. + +
    5. In STL-like containers, it is natural to specify the + interface of operations for modifying a value or erasing + a value (discussed previously) in terms of a iterators. + This is discussed further in Design::Priority + Queues::Iterators. It should be noted that the STL's + containers also use iterators for accessing and + manipulating a specific value. E.g., in hash-based + containers, one checks the existence of a key by + comparing the iterator returned by find to the + iterator returned by end, and not by comparing a + pointer returned by find to NULL.
    6. +
    +
  6. +
+ +

Performance + Tests::Priority Queues quantifies some of these points.

+ +

More Data + Structures and Traits

+ +

There are three main implementations of priority queues: the + first employs a binary heap, typically one which uses a + sequence; the second uses a tree (or forest of trees), which is + typically less structured than an associative container's tree; + the third simply uses an associative container. These are + shown, respectively, in Figures Underlying Priority-Queue + Data-Structures A1 and A2, B, and C.

+ +
no image
+ +
Underlying Priority-Queue Data-Structures.
+ +

No single implementation can completely replace any of the + others. Some have better push and pop + amortized performance, some have better bounded (worst case) + response time than others, some optimize a single method at the + expense of others, etc.. In general the "best" + implementation is dictated by the problem (see Performance + Tests::Priority Queues::Observations).

+ +

As with associative containers (see Associative Containers::Traits for + Underlying Data-Structures), the more implementations + co-exist, the more necessary a traits mechanism is for handling + generic containers safely and efficiently. This is especially + important for priority queues, since the invalidation + guarantees of one of the most useful data structures - binary + heaps - is markedly different than those of most of the + others.

+ +

Design::Priority + Queues::Traits discusses this further.

+ +

Binary Heap + Implementation

+ +

Binary heaps are one of the most useful underlying + data structures for priority queues. They are very efficient in + terms of memory (since they don't require per-value structure + metadata), and have the best amortized push and + pop performance for primitive types (e.g., + ints).

+ +

The STL's priority_queue implements this data + structure as an adapter over a sequence, typically + std::vector or std::deque, which correspond + to Figures Underlying + Priority-Queue Data-Structures A1 and A2, respectively.

+ +

This is indeed an elegant example of the adapter concept and + the algorithm/container/iterator decomposition (see [nelson96stlpql]). There are + possibly reasons, however, why a binary-heap priority queue + would be better implemented as a container instead of a + sequence adapter:

+ +
    +
  1. std::priority_queue cannot erase values from its + adapted sequence (irrespective of the sequence type). This + means that the memory use of an std::priority_queue + object is always proportional to the maximal number of values + it ever contained, and not to the number of values that it + currently contains (see Priority Queue + Text pop Memory Use Test); this implementation + of binary heaps acts very differently than other underlying + data structures (e.g., pairing heaps).
  2. + +
  3. Some combinations of adapted sequences and value types + are very inefficient or just don't make sense. If one uses + std::priority_queue<std::vector<std::string> + > >, for example, then not only will each + operation perform a logarithmic number of + std::string assignments, but, furthermore, any + operation (including pop) can render the container + useless due to exceptions. Conversely, if one uses + std::priority_queue<std::deque<int> > + >, then each operation uses incurs a logarithmic + number of indirect accesses (through pointers) unnecessarily. + It might be better to let the container make a conservative + deduction whether to use the structure in Figures Underlying Priority-Queue + Data-Structures A1 or A2.
  4. + +
  5. There does not seem to be a systematic way to determine + what exactly can be done with the priority queue. + +
      +
    1. If p is a priority queue adapting an + std::vector, then it is possible to iterate over + all values by using &p.top() and + &p.top() + p.size(), but this will not work + if p is adapting an std::deque; in any + case, one cannot use p.begin() and + p.end(). If a different sequence is adapted, it + is even more difficult to determine what can be + done.
    2. + +
    3. If p is a priority queue adapting an + std::deque, then the reference return by + p.top() will remain valid until it is popped, + but if p adapts an std::vector, the + next push will invalidate it. If a different + sequence is adapted, it is even more difficult to + determine what can be done.
    4. +
    +
  6. + +
  7. Sequence-based binary heaps can still implement + linear-time erase and modify operations. + This means that if one needs, e.g., to erase a small + (say logarithmic) number of values, then one might still + choose this underlying data structure. Using + std::priority_queue, however, this will generally + change the order of growth of the entire sequence of + operations.
  8. +
+
+ + diff --git a/libstdc++-v3/doc/html/ext/pb_ds/move_to_front_lu_policy.html b/libstdc++-v3/doc/html/ext/pb_ds/move_to_front_lu_policy.html new file mode 100644 index 00000000000..35190924e1e --- /dev/null +++ b/libstdc++-v3/doc/html/ext/pb_ds/move_to_front_lu_policy.html @@ -0,0 +1,194 @@ + + + + + + + move_to_front_lu_policy Interface + + + + +
+

move_to_front_lu_policy Interface

+ +

A list-update policy that unconditionally moves elements to + the front of the list.

+ +

Defined in: list_update_policy.hpp

+ +

Template Parameters

+ + + + + + + + + + + + + + + + + +
ParameterDescriptionDefault Value
+
+class Allocator 
+
+
+

Allocator type.

+ +

This is used only for definitions, e.g., the size + type.

+
+
+std::allocator<char>
+
+
+ +

Public Types and + Constants

+ +

Policy Definitions

+ + + + + + + + + + + + + + + + + +
TypeDefinitionDescription
+
+allocator
+
+
+
+Allocator
+
+
+

Allocator + type.

+
+ +

Metadata-Type + Definitions

+ + + + + + + + + + + + + + + + + + + + + + + + + +
TypeDefinitionDescription
+
+metadata_type
+
+
+
+null_lu_metadata
+
+
+

Metadata on which this functor operates.

+ +

In this case, none.

+
+
+metadata_reference
+
+
+
+typename Allocator::template rebind<  
+    metadata_type>::other::reference
+
+
+

Reference to metadata on which this functor + operates.

+
+ +

Public Methods

+ +

Metadata Methods

+ + + + + + + + + + + + + + + + + + + +
MethodDescription
+
+metadata_type
+  operator()
+  () const
+
+
+

Creates a metadata object.

+
+
+inline bool 
+  operator()
+  (metadata_reference r_metadata) const
+
+
+

Decides whether a metadata object should be moved to + the front of the list.

+
+
+ + diff --git a/libstdc++-v3/doc/html/ext/pb_ds/multimap_text_find_timing_test_large.html b/libstdc++-v3/doc/html/ext/pb_ds/multimap_text_find_timing_test_large.html new file mode 100644 index 00000000000..c24acdcf248 --- /dev/null +++ b/libstdc++-v3/doc/html/ext/pb_ds/multimap_text_find_timing_test_large.html @@ -0,0 +1,215 @@ + + + + + +"Multimap" Text Find Timing Test with Large Average + Secondary-Key to Primary-Key Ratio + + + +
+

"Multimap" Text Find Timing Test with Large Average + Secondary-Key to Primary-Key Ratio

+

Description

+

This test inserts a number of pairs into a container. The + first item of each pair is a string from an arbitrary text + [wickland96thirty], and + the second is a uniform i.i.d.integer. The container is a + "multimap" - it considers the first member of each pair as a + primary key, and the second member of each pair as a secondary + key (see Motivation::Associative + Containers::Alternative to Multiple Equivalent Keys). There + are 100 distinct primary keys, and the ratio of secondary keys + to primary keys ranges to about 20.

+

The test measures the average find-time as a function of the + number of values inserted. For pb_ds's containers, it + finds the secondary key from a container obtained from finding + a primary key. For the native multimaps, it searches a range + obtained using std::equal_range on a primary key.

+

(The test was executed with multimap_text_find_timing_test + thirty_years_among_the_dead_preproc.txt 100 3 4 4)

+

Purpose

+

The test checks the find-time scalability of different + "multimap" designs (see Motivation::Associative + Containers::Mapping Semantics).

+

Results

+

Figures NTG, NTM, and + NTL show the results for "multimaps" which + use a tree-based container for primary keys, in g++, msvc++, and + local, + respectively; Figures NHG, NHM, and NHL show the results for + "multimaps" which use a hash-based container for primary keys, + in g++, + msvc++, + and local, + respectively.

+
+
+
+
+
no image
NTG: Native and primary tree-based multimap types find timing test - g++

In the above figure, the names in the legends have the following meaning:

+
    +
  1. +n_mmap- +std::multimap
  2. +
  3. +rb_tree_mmap_lu_mtf_set- +tree + with Tag = rb_tree_tag +, and Node_Update = null_tree_node_update +, mapping each key to list_update + with Update_Policy = move_to_front_lu_policy +
  4. +
  5. +rb_tree_mmap_cc_hash_mask_exp_nea_lc_1div8_1div2_nsth_set- +tree + with Tag = rb_tree_tag +, and Node_Update = null_tree_node_update +, mapping each key to cc_hash_table +with Comb_Hash_Fn = direct_mask_range_hashing +, and Resize_Policy = hash_standard_resize_policy + with Size_Policy = hash_exponential_size_policy +, and Trigger_Policy = hash_load_check_resize_trigger + with αmin = 1/8 and αmax = 1/2
  6. +
+
+
+
+
+
+
+
+
+
+
no image
NTM: Native and primary tree-based multimap types find timing test - msvc++

In the above figure, the names in the legends have the following meaning:

+
    +
  1. +n_mmap- +std::multimap
  2. +
  3. +rb_tree_mmap_lu_mtf_set- +tree + with Tag = rb_tree_tag +, and Node_Update = null_tree_node_update +, mapping each key to list_update + with Update_Policy = move_to_front_lu_policy +
  4. +
  5. +rb_tree_mmap_cc_hash_mask_exp_nea_lc_1div8_1div2_nsth_set- +tree + with Tag = rb_tree_tag +, and Node_Update = null_tree_node_update +, mapping each key to cc_hash_table +with Comb_Hash_Fn = direct_mask_range_hashing +, and Resize_Policy = hash_standard_resize_policy + with Size_Policy = hash_exponential_size_policy +, and Trigger_Policy = hash_load_check_resize_trigger + with αmin = 1/8 and αmax = 1/2
  6. +
+
+
+
+
+
+
+
+
+
+
no image
NTL: Native and primary tree-based multimap types find timing test - local
+
+
+
+
+
+
+
+
+
no image
NHG: Native and primary hash-based multimap types find timing test - g++

In the above figure, the names in the legends have the following meaning:

+
    +
  1. +n_hash_mmap- +__gnucxx::hash_multimap
  2. +
  3. +cc_hash_mask_exp_nea_lc_1div8_1div2_nsth_mmap_lu_mtf_set- +cc_hash_table +with Comb_Hash_Fn = direct_mask_range_hashing +, and Resize_Policy = hash_standard_resize_policy + with Size_Policy = hash_exponential_size_policy +, and Trigger_Policy = hash_load_check_resize_trigger + with αmin = 1/8 and αmax = 1/2, mapping each key to list_update + with Update_Policy = move_to_front_lu_policy +
  4. +
  5. +cc_hash_mask_exp_nea_lc_1div8_1div2_nsth_mmap_cc_hash_mask_exp_nea_lc_1div8_1div2_nsth_set- +cc_hash_table +with Comb_Hash_Fn = direct_mask_range_hashing +, and Resize_Policy = hash_standard_resize_policy + with Size_Policy = hash_exponential_size_policy +, and Trigger_Policy = hash_load_check_resize_trigger + with αmin = 1/8 and αmax = 1/2, mapping each key to cc_hash_table +with Comb_Hash_Fn = direct_mask_range_hashing +, and Resize_Policy = hash_standard_resize_policy + with Size_Policy = hash_exponential_size_policy +, and Trigger_Policy = hash_load_check_resize_trigger + with αmin = 1/8 and αmax = 1/2
  6. +
+
+
+
+
+
+
+
+
+
+
no image
NHM: Native and primary hash-based multimap types find timing test - msvc++

In the above figure, the names in the legends have the following meaning:

+
    +
  1. +n_hash_mmap- +stdext::hash_multimap
  2. +
  3. +cc_hash_mask_exp_nea_lc_1div8_1div2_nsth_mmap_lu_mtf_set- +cc_hash_table +with Comb_Hash_Fn = direct_mask_range_hashing +, and Resize_Policy = hash_standard_resize_policy + with Size_Policy = hash_exponential_size_policy +, and Trigger_Policy = hash_load_check_resize_trigger + with αmin = 1/8 and αmax = 1/2, mapping each key to list_update + with Update_Policy = move_to_front_lu_policy +
  4. +
  5. +cc_hash_mask_exp_nea_lc_1div8_1div2_nsth_mmap_cc_hash_mask_exp_nea_lc_1div8_1div2_nsth_set- +cc_hash_table +with Comb_Hash_Fn = direct_mask_range_hashing +, and Resize_Policy = hash_standard_resize_policy + with Size_Policy = hash_exponential_size_policy +, and Trigger_Policy = hash_load_check_resize_trigger + with αmin = 1/8 and αmax = 1/2, mapping each key to cc_hash_table +with Comb_Hash_Fn = direct_mask_range_hashing +, and Resize_Policy = hash_standard_resize_policy + with Size_Policy = hash_exponential_size_policy +, and Trigger_Policy = hash_load_check_resize_trigger + with αmin = 1/8 and αmax = 1/2
  6. +
+
+
+
+
+
+
+
+
+
+
no image
NHL: Native and primary hash-based multimap types find timing test - local
+
+
+
+
+

Observations

+

See Observations::Mapping-Semantics + Considerations.

+
+ + diff --git a/libstdc++-v3/doc/html/ext/pb_ds/multimap_text_find_timing_test_large_s2p_hash_gcc.png b/libstdc++-v3/doc/html/ext/pb_ds/multimap_text_find_timing_test_large_s2p_hash_gcc.png new file mode 100644 index 00000000000..03a62f52b04 Binary files /dev/null and b/libstdc++-v3/doc/html/ext/pb_ds/multimap_text_find_timing_test_large_s2p_hash_gcc.png differ diff --git a/libstdc++-v3/doc/html/ext/pb_ds/multimap_text_find_timing_test_large_s2p_hash_local.png b/libstdc++-v3/doc/html/ext/pb_ds/multimap_text_find_timing_test_large_s2p_hash_local.png new file mode 100644 index 00000000000..32a61cac9bd Binary files /dev/null and b/libstdc++-v3/doc/html/ext/pb_ds/multimap_text_find_timing_test_large_s2p_hash_local.png differ diff --git a/libstdc++-v3/doc/html/ext/pb_ds/multimap_text_find_timing_test_large_s2p_hash_msvc.png b/libstdc++-v3/doc/html/ext/pb_ds/multimap_text_find_timing_test_large_s2p_hash_msvc.png new file mode 100644 index 00000000000..4462d289afd Binary files /dev/null and b/libstdc++-v3/doc/html/ext/pb_ds/multimap_text_find_timing_test_large_s2p_hash_msvc.png differ diff --git a/libstdc++-v3/doc/html/ext/pb_ds/multimap_text_find_timing_test_large_s2p_tree_gcc.png b/libstdc++-v3/doc/html/ext/pb_ds/multimap_text_find_timing_test_large_s2p_tree_gcc.png new file mode 100644 index 00000000000..89e464481fd Binary files /dev/null and b/libstdc++-v3/doc/html/ext/pb_ds/multimap_text_find_timing_test_large_s2p_tree_gcc.png differ diff --git a/libstdc++-v3/doc/html/ext/pb_ds/multimap_text_find_timing_test_large_s2p_tree_local.png b/libstdc++-v3/doc/html/ext/pb_ds/multimap_text_find_timing_test_large_s2p_tree_local.png new file mode 100644 index 00000000000..10b3980edab Binary files /dev/null and b/libstdc++-v3/doc/html/ext/pb_ds/multimap_text_find_timing_test_large_s2p_tree_local.png differ diff --git a/libstdc++-v3/doc/html/ext/pb_ds/multimap_text_find_timing_test_large_s2p_tree_msvc.png b/libstdc++-v3/doc/html/ext/pb_ds/multimap_text_find_timing_test_large_s2p_tree_msvc.png new file mode 100644 index 00000000000..20320953e0d Binary files /dev/null and b/libstdc++-v3/doc/html/ext/pb_ds/multimap_text_find_timing_test_large_s2p_tree_msvc.png differ diff --git a/libstdc++-v3/doc/html/ext/pb_ds/multimap_text_find_timing_test_small.html b/libstdc++-v3/doc/html/ext/pb_ds/multimap_text_find_timing_test_small.html new file mode 100644 index 00000000000..5c0b57706d5 --- /dev/null +++ b/libstdc++-v3/doc/html/ext/pb_ds/multimap_text_find_timing_test_small.html @@ -0,0 +1,215 @@ + + + + + +"Multimap" Text Find Timing Test with Small Average + Secondary-Key to Primary-Key Ratio + + + +
+

"Multimap" Text Find Timing Test with Small Average + Secondary-Key to Primary-Key Ratio

+

Description

+

This test inserts a number of pairs into a container. The + first item of each pair is a string from an arbitrary text + [wickland96thirty], and + the second is a uniform i.i.d.integer. The container is a + "multimap" - it considers the first member of each pair as a + primary key, and the second member of each pair as a secondary + key (see Motivation::Associative + Containers::Alternative to Multiple Equivalent Keys). There + are 400 distinct primary keys, and the ratio of secondary keys + to primary keys ranges from 1 to 5.

+

The test measures the average find-time as a function of the + number of values inserted. For pb_ds's containers, it + finds the secondary key from a container obtained from finding + a primary key. For the native multimaps, it searches a range + obtained using std::equal_range on a primary key.

+

(The test was executed with multimap_text_find_timing_test + thirty_years_among_the_dead_preproc.txt 400 1 1 6)

+

Purpose

+

The test checks the find-time scalability of different + "multimap" designs (see Motivation::Associative + Containers::Mapping Semantics).

+

Results

+

Figures NTG, NTM, and + NTL show the results for "multimaps" which + use a tree-based container for primary keys, in g++, msvc++, and + local, + respectively; Figures NHG, NHM, and NHL show the results for + "multimaps" which use a hash-based container for primary keys, + in g++, + msvc++, + and local, + respectively.

+
+
+
+
+
no image
NTG: NHG Native and primary tree-based multimap types find timing test - g++

In the above figure, the names in the legends have the following meaning:

+
    +
  1. +n_mmap- +std::multimap
  2. +
  3. +rb_tree_mmap_lu_mtf_set- +tree + with Tag = rb_tree_tag +, and Node_Update = null_tree_node_update +, mapping each key to list_update + with Update_Policy = move_to_front_lu_policy +
  4. +
  5. +rb_tree_mmap_cc_hash_mask_exp_nea_lc_1div8_1div2_nsth_set- +tree + with Tag = rb_tree_tag +, and Node_Update = null_tree_node_update +, mapping each key to cc_hash_table +with Comb_Hash_Fn = direct_mask_range_hashing +, and Resize_Policy = hash_standard_resize_policy + with Size_Policy = hash_exponential_size_policy +, and Trigger_Policy = hash_load_check_resize_trigger + with αmin = 1/8 and αmax = 1/2
  6. +
+
+
+
+
+
+
+
+
+
+
no image
NTM: NHM Native and primary tree-based multimap types find timing test - msvc++

In the above figure, the names in the legends have the following meaning:

+
    +
  1. +n_mmap- +std::multimap
  2. +
  3. +rb_tree_mmap_lu_mtf_set- +tree + with Tag = rb_tree_tag +, and Node_Update = null_tree_node_update +, mapping each key to list_update + with Update_Policy = move_to_front_lu_policy +
  4. +
  5. +rb_tree_mmap_cc_hash_mask_exp_nea_lc_1div8_1div2_nsth_set- +tree + with Tag = rb_tree_tag +, and Node_Update = null_tree_node_update +, mapping each key to cc_hash_table +with Comb_Hash_Fn = direct_mask_range_hashing +, and Resize_Policy = hash_standard_resize_policy + with Size_Policy = hash_exponential_size_policy +, and Trigger_Policy = hash_load_check_resize_trigger + with αmin = 1/8 and αmax = 1/2
  6. +
+
+
+
+
+
+
+
+
+
+
no image
NTL: Native and primary tree-based multimap types find timing test - local
+
+
+
+
+
+
+
+
+
no image
NHG: Native and primary hash-based multimap types find timing test - g++

In the above figure, the names in the legends have the following meaning:

+
    +
  1. +n_hash_mmap- +__gnucxx::hash_multimap
  2. +
  3. +cc_hash_mask_exp_nea_lc_1div8_1div2_nsth_mmap_lu_mtf_set- +cc_hash_table +with Comb_Hash_Fn = direct_mask_range_hashing +, and Resize_Policy = hash_standard_resize_policy + with Size_Policy = hash_exponential_size_policy +, and Trigger_Policy = hash_load_check_resize_trigger + with αmin = 1/8 and αmax = 1/2, mapping each key to list_update + with Update_Policy = move_to_front_lu_policy +
  4. +
  5. +cc_hash_mask_exp_nea_lc_1div8_1div2_nsth_mmap_cc_hash_mask_exp_nea_lc_1div8_1div2_nsth_set- +cc_hash_table +with Comb_Hash_Fn = direct_mask_range_hashing +, and Resize_Policy = hash_standard_resize_policy + with Size_Policy = hash_exponential_size_policy +, and Trigger_Policy = hash_load_check_resize_trigger + with αmin = 1/8 and αmax = 1/2, mapping each key to cc_hash_table +with Comb_Hash_Fn = direct_mask_range_hashing +, and Resize_Policy = hash_standard_resize_policy + with Size_Policy = hash_exponential_size_policy +, and Trigger_Policy = hash_load_check_resize_trigger + with αmin = 1/8 and αmax = 1/2
  6. +
+
+
+
+
+
+
+
+
+
+
no image
NHM: Native and primary hash-based multimap types find timing test - msvc++

In the above figure, the names in the legends have the following meaning:

+
    +
  1. +n_hash_mmap- +stdext::hash_multimap
  2. +
  3. +cc_hash_mask_exp_nea_lc_1div8_1div2_nsth_mmap_lu_mtf_set- +cc_hash_table +with Comb_Hash_Fn = direct_mask_range_hashing +, and Resize_Policy = hash_standard_resize_policy + with Size_Policy = hash_exponential_size_policy +, and Trigger_Policy = hash_load_check_resize_trigger + with αmin = 1/8 and αmax = 1/2, mapping each key to list_update + with Update_Policy = move_to_front_lu_policy +
  4. +
  5. +cc_hash_mask_exp_nea_lc_1div8_1div2_nsth_mmap_cc_hash_mask_exp_nea_lc_1div8_1div2_nsth_set- +cc_hash_table +with Comb_Hash_Fn = direct_mask_range_hashing +, and Resize_Policy = hash_standard_resize_policy + with Size_Policy = hash_exponential_size_policy +, and Trigger_Policy = hash_load_check_resize_trigger + with αmin = 1/8 and αmax = 1/2, mapping each key to cc_hash_table +with Comb_Hash_Fn = direct_mask_range_hashing +, and Resize_Policy = hash_standard_resize_policy + with Size_Policy = hash_exponential_size_policy +, and Trigger_Policy = hash_load_check_resize_trigger + with αmin = 1/8 and αmax = 1/2
  6. +
+
+
+
+
+
+
+
+
+
+
no image
NHL: Native and primary hash-based multimap types find timing test - local
+
+
+
+
+

Observations

+

See Observations::Mapping-Semantics + Considerations.

+
+ + diff --git a/libstdc++-v3/doc/html/ext/pb_ds/multimap_text_find_timing_test_small_s2p_hash_gcc.png b/libstdc++-v3/doc/html/ext/pb_ds/multimap_text_find_timing_test_small_s2p_hash_gcc.png new file mode 100644 index 00000000000..60e850937a9 Binary files /dev/null and b/libstdc++-v3/doc/html/ext/pb_ds/multimap_text_find_timing_test_small_s2p_hash_gcc.png differ diff --git a/libstdc++-v3/doc/html/ext/pb_ds/multimap_text_find_timing_test_small_s2p_hash_local.png b/libstdc++-v3/doc/html/ext/pb_ds/multimap_text_find_timing_test_small_s2p_hash_local.png new file mode 100644 index 00000000000..a8fa261177b Binary files /dev/null and b/libstdc++-v3/doc/html/ext/pb_ds/multimap_text_find_timing_test_small_s2p_hash_local.png differ diff --git a/libstdc++-v3/doc/html/ext/pb_ds/multimap_text_find_timing_test_small_s2p_hash_msvc.png b/libstdc++-v3/doc/html/ext/pb_ds/multimap_text_find_timing_test_small_s2p_hash_msvc.png new file mode 100644 index 00000000000..11aa9e07b6a Binary files /dev/null and b/libstdc++-v3/doc/html/ext/pb_ds/multimap_text_find_timing_test_small_s2p_hash_msvc.png differ diff --git a/libstdc++-v3/doc/html/ext/pb_ds/multimap_text_find_timing_test_small_s2p_tree_gcc.png b/libstdc++-v3/doc/html/ext/pb_ds/multimap_text_find_timing_test_small_s2p_tree_gcc.png new file mode 100644 index 00000000000..f54369b15b4 Binary files /dev/null and b/libstdc++-v3/doc/html/ext/pb_ds/multimap_text_find_timing_test_small_s2p_tree_gcc.png differ diff --git a/libstdc++-v3/doc/html/ext/pb_ds/multimap_text_find_timing_test_small_s2p_tree_local.png b/libstdc++-v3/doc/html/ext/pb_ds/multimap_text_find_timing_test_small_s2p_tree_local.png new file mode 100644 index 00000000000..b3d10612f79 Binary files /dev/null and b/libstdc++-v3/doc/html/ext/pb_ds/multimap_text_find_timing_test_small_s2p_tree_local.png differ diff --git a/libstdc++-v3/doc/html/ext/pb_ds/multimap_text_find_timing_test_small_s2p_tree_msvc.png b/libstdc++-v3/doc/html/ext/pb_ds/multimap_text_find_timing_test_small_s2p_tree_msvc.png new file mode 100644 index 00000000000..035fd9389b6 Binary files /dev/null and b/libstdc++-v3/doc/html/ext/pb_ds/multimap_text_find_timing_test_small_s2p_tree_msvc.png differ diff --git a/libstdc++-v3/doc/html/ext/pb_ds/multimap_text_insert_mem_usage_test_large.html b/libstdc++-v3/doc/html/ext/pb_ds/multimap_text_insert_mem_usage_test_large.html new file mode 100644 index 00000000000..c4b1df5c301 --- /dev/null +++ b/libstdc++-v3/doc/html/ext/pb_ds/multimap_text_insert_mem_usage_test_large.html @@ -0,0 +1,210 @@ + + + + + +Hash-List "Multimap" Text Memory Use Test with Large + Average Secondary-Key to Primary-Key Ratio + + + +
+

"Multimap" Text Memory Use Test with Large Average + Secondary-Key to Primary-Key Ratio

+

Description

+

This test inserts a number of pairs into a container. The + first item of each pair is a string from an arbitrary text + [wickland96thirty], and + the second is a uniform i.i.d.integer. The container is a + "multimap" - it considers the first member of each pair as a + primary key, and the second member of each pair as a secondary + key (see Motivation::Associative + Containers::Alternative to Multiple Equivalent Keys). There + are 100 distinct primary keys. The test measures the memory use + as a function of the number of values inserted.

+

(The test was executed with multimap_text_insert_mem_usage_test + thirty_years_among_the_dead_preproc.txt 100 200 2100 100)

+

Purpose

+

The test checks the memory scalability of different + "multimap" designs (see Motivation::Associative + Containers::Mapping Semantics).

+

Results

+

Figures NTG, NTM, and + NTL show the results for "multimaps" which + use a tree-based container for primary keys, in g++, msvc++, and + local, + respectively; Figures NHG, NHM, and NHL show the results for + "multimaps" which use a hash-based container for primary keys, + in g++, + msvc++, + and local, + respectively.

+
+
+
+
+
no image
NTG: NHG Native and primary tree-based multimap types mem usage test - g++

In the above figure, the names in the legends have the following meaning:

+
    +
  1. +rb_tree_mmap_cc_hash_mask_exp_nea_lc_1div8_1div2_nsth_set- +tree + with Tag = rb_tree_tag +, and Node_Update = null_tree_node_update +, mapping each key to cc_hash_table +with Comb_Hash_Fn = direct_mask_range_hashing +, and Resize_Policy = hash_standard_resize_policy + with Size_Policy = hash_exponential_size_policy +, and Trigger_Policy = hash_load_check_resize_trigger + with αmin = 1/8 and αmax = 1/2
  2. +
  3. +n_mmap- +std::multimap
  4. +
  5. +rb_tree_mmap_lu_mtf_set- +tree + with Tag = rb_tree_tag +, and Node_Update = null_tree_node_update +, mapping each key to list_update + with Update_Policy = move_to_front_lu_policy +
  6. +
+
+
+
+
+
+
+
+
+
+
no image
NTM: NHM Native and primary tree-based multimap types mem usage test - msvc++

In the above figure, the names in the legends have the following meaning:

+
    +
  1. +n_mmap- +std::multimap
  2. +
  3. +rb_tree_mmap_cc_hash_mask_exp_nea_lc_1div8_1div2_nsth_set- +tree + with Tag = rb_tree_tag +, and Node_Update = null_tree_node_update +, mapping each key to cc_hash_table +with Comb_Hash_Fn = direct_mask_range_hashing +, and Resize_Policy = hash_standard_resize_policy + with Size_Policy = hash_exponential_size_policy +, and Trigger_Policy = hash_load_check_resize_trigger + with αmin = 1/8 and αmax = 1/2
  4. +
  5. +rb_tree_mmap_lu_mtf_set- +tree + with Tag = rb_tree_tag +, and Node_Update = null_tree_node_update +, mapping each key to list_update + with Update_Policy = move_to_front_lu_policy +
  6. +
+
+
+
+
+
+
+
+
+
+
no image
NTL: Native and primary tree-based multimap types mem usage test - local
+
+
+
+
+
+
+
+
+
no image
NHG: Native and primary hash-based multimap types mem usage test - g++

In the above figure, the names in the legends have the following meaning:

+
    +
  1. +cc_hash_mask_exp_nea_lc_1div8_1div2_nsth_mmap_cc_hash_mask_exp_nea_lc_1div8_1div2_nsth_set- +cc_hash_table +with Comb_Hash_Fn = direct_mask_range_hashing +, and Resize_Policy = hash_standard_resize_policy + with Size_Policy = hash_exponential_size_policy +, and Trigger_Policy = hash_load_check_resize_trigger + with αmin = 1/8 and αmax = 1/2, mapping each key to cc_hash_table +with Comb_Hash_Fn = direct_mask_range_hashing +, and Resize_Policy = hash_standard_resize_policy + with Size_Policy = hash_exponential_size_policy +, and Trigger_Policy = hash_load_check_resize_trigger + with αmin = 1/8 and αmax = 1/2
  2. +
  3. +n_hash_mmap- +__gnucxx::hash_multimap
  4. +
  5. +cc_hash_mask_exp_nea_lc_1div8_1div2_nsth_mmap_lu_mtf_set- +cc_hash_table +with Comb_Hash_Fn = direct_mask_range_hashing +, and Resize_Policy = hash_standard_resize_policy + with Size_Policy = hash_exponential_size_policy +, and Trigger_Policy = hash_load_check_resize_trigger + with αmin = 1/8 and αmax = 1/2, mapping each key to list_update + with Update_Policy = move_to_front_lu_policy +
  6. +
+
+
+
+
+
+
+
+
+
+
no image
NHM: Native and primary hash-based multimap types mem usage test - msvc++

In the above figure, the names in the legends have the following meaning:

+
    +
  1. +n_hash_mmap- +stdext::hash_multimap
  2. +
  3. +cc_hash_mask_exp_nea_lc_1div8_1div2_nsth_mmap_cc_hash_mask_exp_nea_lc_1div8_1div2_nsth_set- +cc_hash_table +with Comb_Hash_Fn = direct_mask_range_hashing +, and Resize_Policy = hash_standard_resize_policy + with Size_Policy = hash_exponential_size_policy +, and Trigger_Policy = hash_load_check_resize_trigger + with αmin = 1/8 and αmax = 1/2, mapping each key to cc_hash_table +with Comb_Hash_Fn = direct_mask_range_hashing +, and Resize_Policy = hash_standard_resize_policy + with Size_Policy = hash_exponential_size_policy +, and Trigger_Policy = hash_load_check_resize_trigger + with αmin = 1/8 and αmax = 1/2
  4. +
  5. +cc_hash_mask_exp_nea_lc_1div8_1div2_nsth_mmap_lu_mtf_set- +cc_hash_table +with Comb_Hash_Fn = direct_mask_range_hashing +, and Resize_Policy = hash_standard_resize_policy + with Size_Policy = hash_exponential_size_policy +, and Trigger_Policy = hash_load_check_resize_trigger + with αmin = 1/8 and αmax = 1/2, mapping each key to list_update + with Update_Policy = move_to_front_lu_policy +
  6. +
+
+
+
+
+
+
+
+
+
+
no image
NHL: Native and primary hash-based multimap types mem usage test - local
+
+
+
+
+

Observations

+

See Observations::Mapping-Semantics + Considerations.

+
+ + diff --git a/libstdc++-v3/doc/html/ext/pb_ds/multimap_text_insert_mem_usage_test_large_s2p_hash_gcc.png b/libstdc++-v3/doc/html/ext/pb_ds/multimap_text_insert_mem_usage_test_large_s2p_hash_gcc.png new file mode 100644 index 00000000000..51a3f8d61c1 Binary files /dev/null and b/libstdc++-v3/doc/html/ext/pb_ds/multimap_text_insert_mem_usage_test_large_s2p_hash_gcc.png differ diff --git a/libstdc++-v3/doc/html/ext/pb_ds/multimap_text_insert_mem_usage_test_large_s2p_hash_local.png b/libstdc++-v3/doc/html/ext/pb_ds/multimap_text_insert_mem_usage_test_large_s2p_hash_local.png new file mode 100644 index 00000000000..8af7100c6e7 Binary files /dev/null and b/libstdc++-v3/doc/html/ext/pb_ds/multimap_text_insert_mem_usage_test_large_s2p_hash_local.png differ diff --git a/libstdc++-v3/doc/html/ext/pb_ds/multimap_text_insert_mem_usage_test_large_s2p_hash_msvc.png b/libstdc++-v3/doc/html/ext/pb_ds/multimap_text_insert_mem_usage_test_large_s2p_hash_msvc.png new file mode 100644 index 00000000000..3a938c0bb0f Binary files /dev/null and b/libstdc++-v3/doc/html/ext/pb_ds/multimap_text_insert_mem_usage_test_large_s2p_hash_msvc.png differ diff --git a/libstdc++-v3/doc/html/ext/pb_ds/multimap_text_insert_mem_usage_test_large_s2p_tree_gcc.png b/libstdc++-v3/doc/html/ext/pb_ds/multimap_text_insert_mem_usage_test_large_s2p_tree_gcc.png new file mode 100644 index 00000000000..a992d8f7cfb Binary files /dev/null and b/libstdc++-v3/doc/html/ext/pb_ds/multimap_text_insert_mem_usage_test_large_s2p_tree_gcc.png differ diff --git a/libstdc++-v3/doc/html/ext/pb_ds/multimap_text_insert_mem_usage_test_large_s2p_tree_local.png b/libstdc++-v3/doc/html/ext/pb_ds/multimap_text_insert_mem_usage_test_large_s2p_tree_local.png new file mode 100644 index 00000000000..63c0c8db797 Binary files /dev/null and b/libstdc++-v3/doc/html/ext/pb_ds/multimap_text_insert_mem_usage_test_large_s2p_tree_local.png differ diff --git a/libstdc++-v3/doc/html/ext/pb_ds/multimap_text_insert_mem_usage_test_large_s2p_tree_msvc.png b/libstdc++-v3/doc/html/ext/pb_ds/multimap_text_insert_mem_usage_test_large_s2p_tree_msvc.png new file mode 100644 index 00000000000..26841bd1073 Binary files /dev/null and b/libstdc++-v3/doc/html/ext/pb_ds/multimap_text_insert_mem_usage_test_large_s2p_tree_msvc.png differ diff --git a/libstdc++-v3/doc/html/ext/pb_ds/multimap_text_insert_mem_usage_test_small.html b/libstdc++-v3/doc/html/ext/pb_ds/multimap_text_insert_mem_usage_test_small.html new file mode 100644 index 00000000000..7b710f309eb --- /dev/null +++ b/libstdc++-v3/doc/html/ext/pb_ds/multimap_text_insert_mem_usage_test_small.html @@ -0,0 +1,212 @@ + + + + + +Hash-List "Multimap" Text Memory Use Test with Small + Average Secondary-Key to Primary-Key Ratio + + + +
+

"Multimap" Text Memory Use Test with Small Average + Secondary-Key to Primary-Key Ratio

+

Description

+

This test inserts a number of pairs into a container. The + first item of each pair is a string from an arbitrary text + [wickland96thirty], and + the second is a uniform i.i.d.integer. The container is a + "multimap" - it considers the first member of each pair as a + primary key, and the second member of each pair as a secondary + key (see Motivation::Associative + Containers::Alternative to Multiple Equivalent Keys). There + are 100 distinct primary keys, and the ratio of secondary keys + to primary keys ranges to about 20.

+

The test measures the memory use as a function of the number + of values inserted.

+

(The test was executed with multimap_text_insert_mem_usage_test + thirty_years_among_the_dead_preproc.txt 100 3 4 4)

+

Purpose

+

The test checks the memory scalability of different + "multimap" designs (see Motivation::Associative + Containers::Mapping Semantics).

+

Results

+

Figures NTG, NTM, and + NTL show the results for "multimaps" which + use a tree-based container for primary keys, in g++, msvc++, and + local, + respectively; Figures NHG, NHM, and NHL show the results for + "multimaps" which use a hash-based container for primary keys, + in g++, + msvc++, + and local, + respectively.

+
+
+
+
+
no image
NTG: Native and primary tree-based multimap types mem usage test - g++

In the above figure, the names in the legends have the following meaning:

+
    +
  1. +rb_tree_mmap_cc_hash_mask_exp_nea_lc_1div8_1div2_nsth_set- +tree + with Tag = rb_tree_tag +, and Node_Update = null_tree_node_update +, mapping each key to cc_hash_table +with Comb_Hash_Fn = direct_mask_range_hashing +, and Resize_Policy = hash_standard_resize_policy + with Size_Policy = hash_exponential_size_policy +, and Trigger_Policy = hash_load_check_resize_trigger + with αmin = 1/8 and αmax = 1/2
  2. +
  3. +n_mmap- +std::multimap
  4. +
  5. +rb_tree_mmap_lu_mtf_set- +tree + with Tag = rb_tree_tag +, and Node_Update = null_tree_node_update +, mapping each key to list_update + with Update_Policy = move_to_front_lu_policy +
  6. +
+
+
+
+
+
+
+
+
+
+
no image
NTM: NHM Native and primary tree-based multimap types mem usage test - msvc++

In the above figure, the names in the legends have the following meaning:

+
    +
  1. +rb_tree_mmap_cc_hash_mask_exp_nea_lc_1div8_1div2_nsth_set- +tree + with Tag = rb_tree_tag +, and Node_Update = null_tree_node_update +, mapping each key to cc_hash_table +with Comb_Hash_Fn = direct_mask_range_hashing +, and Resize_Policy = hash_standard_resize_policy + with Size_Policy = hash_exponential_size_policy +, and Trigger_Policy = hash_load_check_resize_trigger + with αmin = 1/8 and αmax = 1/2
  2. +
  3. +n_mmap- +std::multimap
  4. +
  5. +rb_tree_mmap_lu_mtf_set- +tree + with Tag = rb_tree_tag +, and Node_Update = null_tree_node_update +, mapping each key to list_update + with Update_Policy = move_to_front_lu_policy +
  6. +
+
+
+
+
+
+
+
+
+
+
no image
NTL: Native and primary tree-based multimap types mem usage test - local
+
+
+
+
+
+
+
+
+
no image
NHG: Native and primary hash-based multimap types mem usage test - g++

In the above figure, the names in the legends have the following meaning:

+
    +
  1. +cc_hash_mask_exp_nea_lc_1div8_1div2_nsth_mmap_cc_hash_mask_exp_nea_lc_1div8_1div2_nsth_set- +cc_hash_table +with Comb_Hash_Fn = direct_mask_range_hashing +, and Resize_Policy = hash_standard_resize_policy + with Size_Policy = hash_exponential_size_policy +, and Trigger_Policy = hash_load_check_resize_trigger + with αmin = 1/8 and αmax = 1/2, mapping each key to cc_hash_table +with Comb_Hash_Fn = direct_mask_range_hashing +, and Resize_Policy = hash_standard_resize_policy + with Size_Policy = hash_exponential_size_policy +, and Trigger_Policy = hash_load_check_resize_trigger + with αmin = 1/8 and αmax = 1/2
  2. +
  3. +n_hash_mmap- +__gnucxx::hash_multimap
  4. +
  5. +cc_hash_mask_exp_nea_lc_1div8_1div2_nsth_mmap_lu_mtf_set- +cc_hash_table +with Comb_Hash_Fn = direct_mask_range_hashing +, and Resize_Policy = hash_standard_resize_policy + with Size_Policy = hash_exponential_size_policy +, and Trigger_Policy = hash_load_check_resize_trigger + with αmin = 1/8 and αmax = 1/2, mapping each key to list_update + with Update_Policy = move_to_front_lu_policy +
  6. +
+
+
+
+
+
+
+
+
+
+
no image
NHM: Native and primary hash-based multimap types mem usage test - msvc++

In the above figure, the names in the legends have the following meaning:

+
    +
  1. +cc_hash_mask_exp_nea_lc_1div8_1div2_nsth_mmap_cc_hash_mask_exp_nea_lc_1div8_1div2_nsth_set- +cc_hash_table +with Comb_Hash_Fn = direct_mask_range_hashing +, and Resize_Policy = hash_standard_resize_policy + with Size_Policy = hash_exponential_size_policy +, and Trigger_Policy = hash_load_check_resize_trigger + with αmin = 1/8 and αmax = 1/2, mapping each key to cc_hash_table +with Comb_Hash_Fn = direct_mask_range_hashing +, and Resize_Policy = hash_standard_resize_policy + with Size_Policy = hash_exponential_size_policy +, and Trigger_Policy = hash_load_check_resize_trigger + with αmin = 1/8 and αmax = 1/2
  2. +
  3. +n_hash_mmap- +stdext::hash_multimap
  4. +
  5. +cc_hash_mask_exp_nea_lc_1div8_1div2_nsth_mmap_lu_mtf_set- +cc_hash_table +with Comb_Hash_Fn = direct_mask_range_hashing +, and Resize_Policy = hash_standard_resize_policy + with Size_Policy = hash_exponential_size_policy +, and Trigger_Policy = hash_load_check_resize_trigger + with αmin = 1/8 and αmax = 1/2, mapping each key to list_update + with Update_Policy = move_to_front_lu_policy +
  6. +
+
+
+
+
+
+
+
+
+
+
no image
NHL: Native and primary hash-based multimap types mem usage test - local
+
+
+
+
+

Observations

+

See Observations::Mapping-Semantics + Considerations.

+
+ + diff --git a/libstdc++-v3/doc/html/ext/pb_ds/multimap_text_insert_mem_usage_test_small_s2p_hash_gcc.png b/libstdc++-v3/doc/html/ext/pb_ds/multimap_text_insert_mem_usage_test_small_s2p_hash_gcc.png new file mode 100644 index 00000000000..d3eba9da47e Binary files /dev/null and b/libstdc++-v3/doc/html/ext/pb_ds/multimap_text_insert_mem_usage_test_small_s2p_hash_gcc.png differ diff --git a/libstdc++-v3/doc/html/ext/pb_ds/multimap_text_insert_mem_usage_test_small_s2p_hash_local.png b/libstdc++-v3/doc/html/ext/pb_ds/multimap_text_insert_mem_usage_test_small_s2p_hash_local.png new file mode 100644 index 00000000000..589dccdefa9 Binary files /dev/null and b/libstdc++-v3/doc/html/ext/pb_ds/multimap_text_insert_mem_usage_test_small_s2p_hash_local.png differ diff --git a/libstdc++-v3/doc/html/ext/pb_ds/multimap_text_insert_mem_usage_test_small_s2p_hash_msvc.png b/libstdc++-v3/doc/html/ext/pb_ds/multimap_text_insert_mem_usage_test_small_s2p_hash_msvc.png new file mode 100644 index 00000000000..1828896ee5f Binary files /dev/null and b/libstdc++-v3/doc/html/ext/pb_ds/multimap_text_insert_mem_usage_test_small_s2p_hash_msvc.png differ diff --git a/libstdc++-v3/doc/html/ext/pb_ds/multimap_text_insert_mem_usage_test_small_s2p_tree_gcc.png b/libstdc++-v3/doc/html/ext/pb_ds/multimap_text_insert_mem_usage_test_small_s2p_tree_gcc.png new file mode 100644 index 00000000000..9334bc35bc7 Binary files /dev/null and b/libstdc++-v3/doc/html/ext/pb_ds/multimap_text_insert_mem_usage_test_small_s2p_tree_gcc.png differ diff --git a/libstdc++-v3/doc/html/ext/pb_ds/multimap_text_insert_mem_usage_test_small_s2p_tree_local.png b/libstdc++-v3/doc/html/ext/pb_ds/multimap_text_insert_mem_usage_test_small_s2p_tree_local.png new file mode 100644 index 00000000000..d7322f287a8 Binary files /dev/null and b/libstdc++-v3/doc/html/ext/pb_ds/multimap_text_insert_mem_usage_test_small_s2p_tree_local.png differ diff --git a/libstdc++-v3/doc/html/ext/pb_ds/multimap_text_insert_mem_usage_test_small_s2p_tree_msvc.png b/libstdc++-v3/doc/html/ext/pb_ds/multimap_text_insert_mem_usage_test_small_s2p_tree_msvc.png new file mode 100644 index 00000000000..2f20e57e555 Binary files /dev/null and b/libstdc++-v3/doc/html/ext/pb_ds/multimap_text_insert_mem_usage_test_small_s2p_tree_msvc.png differ diff --git a/libstdc++-v3/doc/html/ext/pb_ds/multimap_text_insert_timing_test_large.html b/libstdc++-v3/doc/html/ext/pb_ds/multimap_text_insert_timing_test_large.html new file mode 100644 index 00000000000..ecdf2a49708 --- /dev/null +++ b/libstdc++-v3/doc/html/ext/pb_ds/multimap_text_insert_timing_test_large.html @@ -0,0 +1,212 @@ + + + + + +"Multimap" Text Insert Timing Test with Large Average + Secondary-Key to Primary-Key Ratio + + + +
+

"Multimap" Text Insert Timing Test with Large Average + Secondary-Key to Primary-Key Ratio

+

Description

+

This test inserts a number of pairs into a container. The + first item of each pair is a string from an arbitrary text + [wickland96thirty], and + the second is a uniform i.i.d.integer. The container is a + "multimap" - it considers the first member of each pair as a + primary key, and the second member of each pair as a secondary + key (see Motivation::Associative + Containers::Alternative to Multiple Equivalent Keys). There + are 100 distinct primary keys, and the ratio of secondary keys + to primary keys ranges to about 20.

+

The test measures the memory use as a function of the number + of values inserted.

+

(The test was executed with multimap_text_insert_mem_usage_test + thirty_years_among_the_dead_preproc.txt 400 1 6 6)

+

Purpose

+

The test checks the insert-time scalability of different + "multimap" designs (see Motivation::Associative + Containers::Mapping Semantics).

+

Results

+

Figures NTG, NTM, and + NTL show the results for "multimaps" which + use a tree-based container for primary keys, in g++, msvc++, and + local, + respectively; Figures NHG, NHM, and NHL show the results for + "multimaps" which use a hash-based container for primary keys, + in g++, + msvc++, + and local, + respectively.

+
+
+
+
+
no image
NTG: Native and primary tree-based multimap types insert timing test - g++

In the above figure, the names in the legends have the following meaning:

+
    +
  1. +n_mmap- +std::multimap
  2. +
  3. +rb_tree_mmap_cc_hash_mask_exp_nea_lc_1div8_1div2_nsth_set- +tree + with Tag = rb_tree_tag +, and Node_Update = null_tree_node_update +, mapping each key to cc_hash_table +with Comb_Hash_Fn = direct_mask_range_hashing +, and Resize_Policy = hash_standard_resize_policy + with Size_Policy = hash_exponential_size_policy +, and Trigger_Policy = hash_load_check_resize_trigger + with αmin = 1/8 and αmax = 1/2
  4. +
  5. +rb_tree_mmap_lu_mtf_set- +tree + with Tag = rb_tree_tag +, and Node_Update = null_tree_node_update +, mapping each key to list_update + with Update_Policy = move_to_front_lu_policy +
  6. +
+
+
+
+
+
+
+
+
+
+
no image
NTM: NHM Native and primary tree-based multimap types insert timing test - msvc++

In the above figure, the names in the legends have the following meaning:

+
    +
  1. +rb_tree_mmap_cc_hash_mask_exp_nea_lc_1div8_1div2_nsth_set- +tree + with Tag = rb_tree_tag +, and Node_Update = null_tree_node_update +, mapping each key to cc_hash_table +with Comb_Hash_Fn = direct_mask_range_hashing +, and Resize_Policy = hash_standard_resize_policy + with Size_Policy = hash_exponential_size_policy +, and Trigger_Policy = hash_load_check_resize_trigger + with αmin = 1/8 and αmax = 1/2
  2. +
  3. +n_mmap- +std::multimap
  4. +
  5. +rb_tree_mmap_lu_mtf_set- +tree + with Tag = rb_tree_tag +, and Node_Update = null_tree_node_update +, mapping each key to list_update + with Update_Policy = move_to_front_lu_policy +
  6. +
+
+
+
+
+
+
+
+
+
+
no image
NTL: Native and primary tree-based multimap types insert timing test - local
+
+
+
+
+
+
+
+
+
no image
NHG: Native and primary hash-based multimap types insert timing test - g++

In the above figure, the names in the legends have the following meaning:

+
    +
  1. +n_hash_mmap- +__gnucxx::hash_multimap
  2. +
  3. +cc_hash_mask_exp_nea_lc_1div8_1div2_nsth_mmap_cc_hash_mask_exp_nea_lc_1div8_1div2_nsth_set- +cc_hash_table +with Comb_Hash_Fn = direct_mask_range_hashing +, and Resize_Policy = hash_standard_resize_policy + with Size_Policy = hash_exponential_size_policy +, and Trigger_Policy = hash_load_check_resize_trigger + with αmin = 1/8 and αmax = 1/2, mapping each key to cc_hash_table +with Comb_Hash_Fn = direct_mask_range_hashing +, and Resize_Policy = hash_standard_resize_policy + with Size_Policy = hash_exponential_size_policy +, and Trigger_Policy = hash_load_check_resize_trigger + with αmin = 1/8 and αmax = 1/2
  4. +
  5. +cc_hash_mask_exp_nea_lc_1div8_1div2_nsth_mmap_lu_mtf_set- +cc_hash_table +with Comb_Hash_Fn = direct_mask_range_hashing +, and Resize_Policy = hash_standard_resize_policy + with Size_Policy = hash_exponential_size_policy +, and Trigger_Policy = hash_load_check_resize_trigger + with αmin = 1/8 and αmax = 1/2, mapping each key to list_update + with Update_Policy = move_to_front_lu_policy +
  6. +
+
+
+
+
+
+
+
+
+
+
no image
NHM: Native and primary hash-based multimap types insert timing test - msvc++

In the above figure, the names in the legends have the following meaning:

+
    +
  1. +n_hash_mmap- +stdext::hash_multimap
  2. +
  3. +cc_hash_mask_exp_nea_lc_1div8_1div2_nsth_mmap_cc_hash_mask_exp_nea_lc_1div8_1div2_nsth_set- +cc_hash_table +with Comb_Hash_Fn = direct_mask_range_hashing +, and Resize_Policy = hash_standard_resize_policy + with Size_Policy = hash_exponential_size_policy +, and Trigger_Policy = hash_load_check_resize_trigger + with αmin = 1/8 and αmax = 1/2, mapping each key to cc_hash_table +with Comb_Hash_Fn = direct_mask_range_hashing +, and Resize_Policy = hash_standard_resize_policy + with Size_Policy = hash_exponential_size_policy +, and Trigger_Policy = hash_load_check_resize_trigger + with αmin = 1/8 and αmax = 1/2
  4. +
  5. +cc_hash_mask_exp_nea_lc_1div8_1div2_nsth_mmap_lu_mtf_set- +cc_hash_table +with Comb_Hash_Fn = direct_mask_range_hashing +, and Resize_Policy = hash_standard_resize_policy + with Size_Policy = hash_exponential_size_policy +, and Trigger_Policy = hash_load_check_resize_trigger + with αmin = 1/8 and αmax = 1/2, mapping each key to list_update + with Update_Policy = move_to_front_lu_policy +
  6. +
+
+
+
+
+
+
+
+
+
+
no image
NHL: Native and primary hash-based multimap types insert timing test - local
+
+
+
+
+

Observations

+

See Observations::Mapping-Semantics + Considerations.

+
+ + diff --git a/libstdc++-v3/doc/html/ext/pb_ds/multimap_text_insert_timing_test_large_s2p_hash_gcc.png b/libstdc++-v3/doc/html/ext/pb_ds/multimap_text_insert_timing_test_large_s2p_hash_gcc.png new file mode 100644 index 00000000000..55b0bf46732 Binary files /dev/null and b/libstdc++-v3/doc/html/ext/pb_ds/multimap_text_insert_timing_test_large_s2p_hash_gcc.png differ diff --git a/libstdc++-v3/doc/html/ext/pb_ds/multimap_text_insert_timing_test_large_s2p_hash_local.png b/libstdc++-v3/doc/html/ext/pb_ds/multimap_text_insert_timing_test_large_s2p_hash_local.png new file mode 100644 index 00000000000..5f89460087a Binary files /dev/null and b/libstdc++-v3/doc/html/ext/pb_ds/multimap_text_insert_timing_test_large_s2p_hash_local.png differ diff --git a/libstdc++-v3/doc/html/ext/pb_ds/multimap_text_insert_timing_test_large_s2p_hash_msvc.png b/libstdc++-v3/doc/html/ext/pb_ds/multimap_text_insert_timing_test_large_s2p_hash_msvc.png new file mode 100644 index 00000000000..02f5d0b20ae Binary files /dev/null and b/libstdc++-v3/doc/html/ext/pb_ds/multimap_text_insert_timing_test_large_s2p_hash_msvc.png differ diff --git a/libstdc++-v3/doc/html/ext/pb_ds/multimap_text_insert_timing_test_large_s2p_tree_gcc.png b/libstdc++-v3/doc/html/ext/pb_ds/multimap_text_insert_timing_test_large_s2p_tree_gcc.png new file mode 100644 index 00000000000..83366eb3756 Binary files /dev/null and b/libstdc++-v3/doc/html/ext/pb_ds/multimap_text_insert_timing_test_large_s2p_tree_gcc.png differ diff --git a/libstdc++-v3/doc/html/ext/pb_ds/multimap_text_insert_timing_test_large_s2p_tree_local.png b/libstdc++-v3/doc/html/ext/pb_ds/multimap_text_insert_timing_test_large_s2p_tree_local.png new file mode 100644 index 00000000000..2b496b48d78 Binary files /dev/null and b/libstdc++-v3/doc/html/ext/pb_ds/multimap_text_insert_timing_test_large_s2p_tree_local.png differ diff --git a/libstdc++-v3/doc/html/ext/pb_ds/multimap_text_insert_timing_test_large_s2p_tree_msvc.png b/libstdc++-v3/doc/html/ext/pb_ds/multimap_text_insert_timing_test_large_s2p_tree_msvc.png new file mode 100644 index 00000000000..47196bff7f2 Binary files /dev/null and b/libstdc++-v3/doc/html/ext/pb_ds/multimap_text_insert_timing_test_large_s2p_tree_msvc.png differ diff --git a/libstdc++-v3/doc/html/ext/pb_ds/multimap_text_insert_timing_test_small.html b/libstdc++-v3/doc/html/ext/pb_ds/multimap_text_insert_timing_test_small.html new file mode 100644 index 00000000000..ae0bd0bb36b --- /dev/null +++ b/libstdc++-v3/doc/html/ext/pb_ds/multimap_text_insert_timing_test_small.html @@ -0,0 +1,217 @@ + + + + + +"Multimap" Text Insert Timing Test with Small Average + Secondary-Key to Primary-Key Ratio + + + +
+

"Multimap" Text Insert Timing Test with Small Average + Secondary-Key to Primary-Key Ratio

+

Description

+

This test inserts a number of pairs into a container. The + first item of each pair is a string from an arbitrary text + [wickland96thirty], and + the second is a uniform i.i.d.integer. The container is a + "multimap" - it considers the first member of each pair as a + primary key, and the second member of each pair as a secondary + key (see Motivation::Associative + Containers::Alternative to Multiple Equivalent Keys). There + are 400 distinct primary keys, and the ratio of secondary keys + to primary keys ranges from 1 to 5.

+

The test measures the average insert-time as a function of + the number of values inserted. For pb_ds's containers, + it inserts a primary key into the primary associative + container, then a secondary key into the secondary associative + container. For the native multimaps, it obtains a range using + std::equal_range, and inserts a value only if it was + not contained already.

+

(The test was executed with multimap_text_insert_timing_test + thirty_years_among_the_dead_preproc.txt 400 1 1 6)

+

Purpose

+

The test checks the insert-time scalability of different + "multimap" designs (see Motivation::Associative + Containers::Alternative to Multiple Equivalent Keys).

+

Results

+

Figures NTG, NTM, and + NTL show the results for "multimaps" which + use a tree-based container for primary keys, in g++, msvc++, and + local, + respectively; Figures NHG, NHM, and NHL show the results for + "multimaps" which use a hash-based container for primary keys, + in g++, + msvc++, + and local, + respectively.

+
+
+
+
+
no image
NTG: Native and primary tree-based multimap types insert timing test - g++

In the above figure, the names in the legends have the following meaning:

+
    +
  1. +n_mmap- +std::multimap
  2. +
  3. +rb_tree_mmap_cc_hash_mask_exp_nea_lc_1div8_1div2_nsth_set- +tree + with Tag = rb_tree_tag +, and Node_Update = null_tree_node_update +, mapping each key to cc_hash_table +with Comb_Hash_Fn = direct_mask_range_hashing +, and Resize_Policy = hash_standard_resize_policy + with Size_Policy = hash_exponential_size_policy +, and Trigger_Policy = hash_load_check_resize_trigger + with αmin = 1/8 and αmax = 1/2
  4. +
  5. +rb_tree_mmap_lu_mtf_set- +tree + with Tag = rb_tree_tag +, and Node_Update = null_tree_node_update +, mapping each key to list_update + with Update_Policy = move_to_front_lu_policy +
  6. +
+
+
+
+
+
+
+
+
+
+
no image
NTM: NHM Native and primary tree-based multimap types insert timing test - msvc++

In the above figure, the names in the legends have the following meaning:

+
    +
  1. +rb_tree_mmap_cc_hash_mask_exp_nea_lc_1div8_1div2_nsth_set- +tree + with Tag = rb_tree_tag +, and Node_Update = null_tree_node_update +, mapping each key to cc_hash_table +with Comb_Hash_Fn = direct_mask_range_hashing +, and Resize_Policy = hash_standard_resize_policy + with Size_Policy = hash_exponential_size_policy +, and Trigger_Policy = hash_load_check_resize_trigger + with αmin = 1/8 and αmax = 1/2
  2. +
  3. +n_mmap- +std::multimap
  4. +
  5. +rb_tree_mmap_lu_mtf_set- +tree + with Tag = rb_tree_tag +, and Node_Update = null_tree_node_update +, mapping each key to list_update + with Update_Policy = move_to_front_lu_policy +
  6. +
+
+
+
+
+
+
+
+
+
+
no image
NTL: Native and primary tree-based multimap types insert timing test - local
+
+
+
+
+
+
+
+
+
no image
NHG: Native and primary hash-based multimap types insert timing test - g++

In the above figure, the names in the legends have the following meaning:

+
    +
  1. +n_hash_mmap- +__gnucxx::hash_multimap
  2. +
  3. +cc_hash_mask_exp_nea_lc_1div8_1div2_nsth_mmap_cc_hash_mask_exp_nea_lc_1div8_1div2_nsth_set- +cc_hash_table +with Comb_Hash_Fn = direct_mask_range_hashing +, and Resize_Policy = hash_standard_resize_policy + with Size_Policy = hash_exponential_size_policy +, and Trigger_Policy = hash_load_check_resize_trigger + with αmin = 1/8 and αmax = 1/2, mapping each key to cc_hash_table +with Comb_Hash_Fn = direct_mask_range_hashing +, and Resize_Policy = hash_standard_resize_policy + with Size_Policy = hash_exponential_size_policy +, and Trigger_Policy = hash_load_check_resize_trigger + with αmin = 1/8 and αmax = 1/2
  4. +
  5. +cc_hash_mask_exp_nea_lc_1div8_1div2_nsth_mmap_lu_mtf_set- +cc_hash_table +with Comb_Hash_Fn = direct_mask_range_hashing +, and Resize_Policy = hash_standard_resize_policy + with Size_Policy = hash_exponential_size_policy +, and Trigger_Policy = hash_load_check_resize_trigger + with αmin = 1/8 and αmax = 1/2, mapping each key to list_update + with Update_Policy = move_to_front_lu_policy +
  6. +
+
+
+
+
+
+
+
+
+
+
no image
NHM: Native and primary hash-based multimap types insert timing test - msvc++

In the above figure, the names in the legends have the following meaning:

+
    +
  1. +cc_hash_mask_exp_nea_lc_1div8_1div2_nsth_mmap_cc_hash_mask_exp_nea_lc_1div8_1div2_nsth_set- +cc_hash_table +with Comb_Hash_Fn = direct_mask_range_hashing +, and Resize_Policy = hash_standard_resize_policy + with Size_Policy = hash_exponential_size_policy +, and Trigger_Policy = hash_load_check_resize_trigger + with αmin = 1/8 and αmax = 1/2, mapping each key to cc_hash_table +with Comb_Hash_Fn = direct_mask_range_hashing +, and Resize_Policy = hash_standard_resize_policy + with Size_Policy = hash_exponential_size_policy +, and Trigger_Policy = hash_load_check_resize_trigger + with αmin = 1/8 and αmax = 1/2
  2. +
  3. +n_hash_mmap- +stdext::hash_multimap
  4. +
  5. +cc_hash_mask_exp_nea_lc_1div8_1div2_nsth_mmap_lu_mtf_set- +cc_hash_table +with Comb_Hash_Fn = direct_mask_range_hashing +, and Resize_Policy = hash_standard_resize_policy + with Size_Policy = hash_exponential_size_policy +, and Trigger_Policy = hash_load_check_resize_trigger + with αmin = 1/8 and αmax = 1/2, mapping each key to list_update + with Update_Policy = move_to_front_lu_policy +
  6. +
+
+
+
+
+
+
+
+
+
+
no image
NHL: Native and primary hash-based multimap types insert timing test - local
+
+
+
+
+

Observations

+

See Observations::Mapping-Semantics + Considerations.

+
+ + diff --git a/libstdc++-v3/doc/html/ext/pb_ds/multimap_text_insert_timing_test_small_s2p_hash_gcc.png b/libstdc++-v3/doc/html/ext/pb_ds/multimap_text_insert_timing_test_small_s2p_hash_gcc.png new file mode 100644 index 00000000000..3c2d87ecfac Binary files /dev/null and b/libstdc++-v3/doc/html/ext/pb_ds/multimap_text_insert_timing_test_small_s2p_hash_gcc.png differ diff --git a/libstdc++-v3/doc/html/ext/pb_ds/multimap_text_insert_timing_test_small_s2p_hash_local.png b/libstdc++-v3/doc/html/ext/pb_ds/multimap_text_insert_timing_test_small_s2p_hash_local.png new file mode 100644 index 00000000000..4af78faa524 Binary files /dev/null and b/libstdc++-v3/doc/html/ext/pb_ds/multimap_text_insert_timing_test_small_s2p_hash_local.png differ diff --git a/libstdc++-v3/doc/html/ext/pb_ds/multimap_text_insert_timing_test_small_s2p_hash_msvc.png b/libstdc++-v3/doc/html/ext/pb_ds/multimap_text_insert_timing_test_small_s2p_hash_msvc.png new file mode 100644 index 00000000000..81d5839044e Binary files /dev/null and b/libstdc++-v3/doc/html/ext/pb_ds/multimap_text_insert_timing_test_small_s2p_hash_msvc.png differ diff --git a/libstdc++-v3/doc/html/ext/pb_ds/multimap_text_insert_timing_test_small_s2p_tree_gcc.png b/libstdc++-v3/doc/html/ext/pb_ds/multimap_text_insert_timing_test_small_s2p_tree_gcc.png new file mode 100644 index 00000000000..368f07350c2 Binary files /dev/null and b/libstdc++-v3/doc/html/ext/pb_ds/multimap_text_insert_timing_test_small_s2p_tree_gcc.png differ diff --git a/libstdc++-v3/doc/html/ext/pb_ds/multimap_text_insert_timing_test_small_s2p_tree_local.png b/libstdc++-v3/doc/html/ext/pb_ds/multimap_text_insert_timing_test_small_s2p_tree_local.png new file mode 100644 index 00000000000..40b5b2c4327 Binary files /dev/null and b/libstdc++-v3/doc/html/ext/pb_ds/multimap_text_insert_timing_test_small_s2p_tree_local.png differ diff --git a/libstdc++-v3/doc/html/ext/pb_ds/multimap_text_insert_timing_test_small_s2p_tree_msvc.png b/libstdc++-v3/doc/html/ext/pb_ds/multimap_text_insert_timing_test_small_s2p_tree_msvc.png new file mode 100644 index 00000000000..99f2d690fa5 Binary files /dev/null and b/libstdc++-v3/doc/html/ext/pb_ds/multimap_text_insert_timing_test_small_s2p_tree_msvc.png differ diff --git a/libstdc++-v3/doc/html/ext/pb_ds/node_invariant_invalidations.png b/libstdc++-v3/doc/html/ext/pb_ds/node_invariant_invalidations.png new file mode 100644 index 00000000000..bbd91842ba8 Binary files /dev/null and b/libstdc++-v3/doc/html/ext/pb_ds/node_invariant_invalidations.png differ diff --git a/libstdc++-v3/doc/html/ext/pb_ds/node_invariants.png b/libstdc++-v3/doc/html/ext/pb_ds/node_invariants.png new file mode 100644 index 00000000000..b375f5168d7 Binary files /dev/null and b/libstdc++-v3/doc/html/ext/pb_ds/node_invariants.png differ diff --git a/libstdc++-v3/doc/html/ext/pb_ds/null_hash_fn.html b/libstdc++-v3/doc/html/ext/pb_ds/null_hash_fn.html new file mode 100644 index 00000000000..5d952245975 --- /dev/null +++ b/libstdc++-v3/doc/html/ext/pb_ds/null_hash_fn.html @@ -0,0 +1,32 @@ + + + + + + + null_hash_fn Interface + + + + +
+

null_hash_fn Interface

+ +

A "null" hash function, indicating that the combining hash + function is actually a ranged hash function.

+ +

Interface::Concepts::Null + Policy Classes explains the concept of a null policy. See + also Design::Hash-Based + Containers::Hash Policies.

+ +

Defined in: hash_policy.hpp

+
+ + diff --git a/libstdc++-v3/doc/html/ext/pb_ds/null_lu_metadata.html b/libstdc++-v3/doc/html/ext/pb_ds/null_lu_metadata.html new file mode 100644 index 00000000000..1cbf9cc347d --- /dev/null +++ b/libstdc++-v3/doc/html/ext/pb_ds/null_lu_metadata.html @@ -0,0 +1,25 @@ + + + + + + + null_lu_metadata Interface + + + + +
+

null_lu_metadata Interface

+ +

A null type that means that each link in a list-based + container does not actually need metadata.

+ +

Defined in: list_update_policy.hpp

+
+ + diff --git a/libstdc++-v3/doc/html/ext/pb_ds/null_mapped_type.html b/libstdc++-v3/doc/html/ext/pb_ds/null_mapped_type.html new file mode 100644 index 00000000000..5be7359e09f --- /dev/null +++ b/libstdc++-v3/doc/html/ext/pb_ds/null_mapped_type.html @@ -0,0 +1,25 @@ + + + + + + + null_mapped_type Interface + + + + +
+

null_mapped_type Interface

+ +

A mapped-policy indicating that an associative container is + a "set"

+ +

Defined in: tag_and_trait.hpp

+
+ + diff --git a/libstdc++-v3/doc/html/ext/pb_ds/null_probe_fn.html b/libstdc++-v3/doc/html/ext/pb_ds/null_probe_fn.html new file mode 100644 index 00000000000..af9379b8cf3 --- /dev/null +++ b/libstdc++-v3/doc/html/ext/pb_ds/null_probe_fn.html @@ -0,0 +1,29 @@ + + + + + + + null_probe_fn Interface + + + + +
+

null_probe_fn Interface

+ +

A "null" probe function, indicating that the combining probe + function is actually a ranged probe function.

+ +

Interface::Concepts::Null + Policy Classes explains the concept of a null policy.

+ +

Defined in: hash_policy.hpp

+
+ + diff --git a/libstdc++-v3/doc/html/ext/pb_ds/null_tree_node_update.html b/libstdc++-v3/doc/html/ext/pb_ds/null_tree_node_update.html new file mode 100644 index 00000000000..98960ed9bf9 --- /dev/null +++ b/libstdc++-v3/doc/html/ext/pb_ds/null_tree_node_update.html @@ -0,0 +1,101 @@ + + + + + + + null_tree_node_update Interface + + + + +
+

null_tree_node_update Interface

+ +

A "null" node updater, indicating that no node updates are + required.

+ +

Interface::Concepts::Null + Policy Classes explains the concept of a null policy.

+ +

Defined in: tree_policy.hpp

+ +

Template Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterDescriptionDefault Value
+
+class Const_Node_Iterator
+
+
+

Const node iterator type.

+
-
+
+class Node_Iterator
+
+
+

Node iterator type.

+
-
+
+class Cmp_Fn
+
+
+

Comparison functor.

+
-
+
+class Allocator
+
+
+

Allocator type.

+
-
+
+ + diff --git a/libstdc++-v3/doc/html/ext/pb_ds/null_trie_node_update.html b/libstdc++-v3/doc/html/ext/pb_ds/null_trie_node_update.html new file mode 100644 index 00000000000..c6c0844bc60 --- /dev/null +++ b/libstdc++-v3/doc/html/ext/pb_ds/null_trie_node_update.html @@ -0,0 +1,102 @@ + + + + + + + null_trie_node_update Interface + + + + +
+

null_trie_node_update Interface

+ +

A "null" node updater, indicating that no node updates are + required.

+ +

Interface::Concepts::Null + Policy Classes explains the concept of a null policy.

+ +

Defined in: trie_policy.hpp

+ +

Template Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterDescriptionDefault Value
+
+class Const_Node_Iterator
+
+
+

Const node iterator type.

+
-
+
+class Node_Iterator
+
+
+

Node iterator type.

+
-
+
+class E_Access_Traits
+
+
+

Comparison functor.

+
-
+
+class Allocator
+
+
+

Allocator type.

+
-
+
+ + diff --git a/libstdc++-v3/doc/html/ext/pb_ds/ov_tree_tag.html b/libstdc++-v3/doc/html/ext/pb_ds/ov_tree_tag.html new file mode 100644 index 00000000000..8da2d50d015 --- /dev/null +++ b/libstdc++-v3/doc/html/ext/pb_ds/ov_tree_tag.html @@ -0,0 +1,47 @@ + + + + + + + ov_tree_tag Interface + + + + +
+

ov_tree_tag Interface

+ +

Ordered-vector tree data structure tag.

+ +

Defined in: tag_and_trait.hpp

+ +

Base Classes

+ + + + + + + + + + + + + +
ClassDerivation Type
+
+tree_tag
+
+
+

public

+
+
+ + diff --git a/libstdc++-v3/doc/html/ext/pb_ds/pairing_heap_tag.html b/libstdc++-v3/doc/html/ext/pb_ds/pairing_heap_tag.html new file mode 100644 index 00000000000..756e886b6e6 --- /dev/null +++ b/libstdc++-v3/doc/html/ext/pb_ds/pairing_heap_tag.html @@ -0,0 +1,47 @@ + + + + + + + pairing_heap_tag Interface + + + + +
+

pairing_heap_tag Interface

+ +

Pairing-heap data structure tag.

+ +

Defined in: tag_and_trait.hpp

+ +

Base Classes

+ + + + + + + + + + + + + +
ClassDerivation Type
+
+priority_queue_tag
+
+
+

public

+
+
+ + diff --git a/libstdc++-v3/doc/html/ext/pb_ds/pairing_priority_queue_text_push_pop_timing_test_gcc.png b/libstdc++-v3/doc/html/ext/pb_ds/pairing_priority_queue_text_push_pop_timing_test_gcc.png new file mode 100644 index 00000000000..4168787ecad Binary files /dev/null and b/libstdc++-v3/doc/html/ext/pb_ds/pairing_priority_queue_text_push_pop_timing_test_gcc.png differ diff --git a/libstdc++-v3/doc/html/ext/pb_ds/pairing_priority_queue_text_push_pop_timing_test_local.png b/libstdc++-v3/doc/html/ext/pb_ds/pairing_priority_queue_text_push_pop_timing_test_local.png new file mode 100644 index 00000000000..97ca4e9daad Binary files /dev/null and b/libstdc++-v3/doc/html/ext/pb_ds/pairing_priority_queue_text_push_pop_timing_test_local.png differ diff --git a/libstdc++-v3/doc/html/ext/pb_ds/pairing_priority_queue_text_push_pop_timing_test_msvc.png b/libstdc++-v3/doc/html/ext/pb_ds/pairing_priority_queue_text_push_pop_timing_test_msvc.png new file mode 100644 index 00000000000..42b707965ff Binary files /dev/null and b/libstdc++-v3/doc/html/ext/pb_ds/pairing_priority_queue_text_push_pop_timing_test_msvc.png differ diff --git a/libstdc++-v3/doc/html/ext/pb_ds/pairing_priority_queue_text_push_timing_test_gcc.png b/libstdc++-v3/doc/html/ext/pb_ds/pairing_priority_queue_text_push_timing_test_gcc.png new file mode 100644 index 00000000000..9a7ce6c361f Binary files /dev/null and b/libstdc++-v3/doc/html/ext/pb_ds/pairing_priority_queue_text_push_timing_test_gcc.png differ diff --git a/libstdc++-v3/doc/html/ext/pb_ds/pairing_priority_queue_text_push_timing_test_local.png b/libstdc++-v3/doc/html/ext/pb_ds/pairing_priority_queue_text_push_timing_test_local.png new file mode 100644 index 00000000000..cedcb4cf4b2 Binary files /dev/null and b/libstdc++-v3/doc/html/ext/pb_ds/pairing_priority_queue_text_push_timing_test_local.png differ diff --git a/libstdc++-v3/doc/html/ext/pb_ds/pairing_priority_queue_text_push_timing_test_msvc.png b/libstdc++-v3/doc/html/ext/pb_ds/pairing_priority_queue_text_push_timing_test_msvc.png new file mode 100644 index 00000000000..d5488efcf48 Binary files /dev/null and b/libstdc++-v3/doc/html/ext/pb_ds/pairing_priority_queue_text_push_timing_test_msvc.png differ diff --git a/libstdc++-v3/doc/html/ext/pb_ds/pat_trie.png b/libstdc++-v3/doc/html/ext/pb_ds/pat_trie.png new file mode 100644 index 00000000000..e7129a1a67b Binary files /dev/null and b/libstdc++-v3/doc/html/ext/pb_ds/pat_trie.png differ diff --git a/libstdc++-v3/doc/html/ext/pb_ds/pat_trie_tag.html b/libstdc++-v3/doc/html/ext/pb_ds/pat_trie_tag.html new file mode 100644 index 00000000000..459546df778 --- /dev/null +++ b/libstdc++-v3/doc/html/ext/pb_ds/pat_trie_tag.html @@ -0,0 +1,47 @@ + + + + + + + pat_trie_tag Interface + + + + +
+

pat_trie_tag Interface

+ +

PATRICIA trie data structure tag.

+ +

Defined in: tag_and_trait.hpp

+ +

Base Classes

+ + + + + + + + + + + + + +
ClassDerivation Type
+
+tree_tag
+
+
+

public

+
+
+ + diff --git a/libstdc++-v3/doc/html/ext/pb_ds/point_invalidation_guarantee.html b/libstdc++-v3/doc/html/ext/pb_ds/point_invalidation_guarantee.html new file mode 100644 index 00000000000..ba2eee6dfc4 --- /dev/null +++ b/libstdc++-v3/doc/html/ext/pb_ds/point_invalidation_guarantee.html @@ -0,0 +1,51 @@ + + + + + + + point_invalidation_guarantee Interface + + + + +
+

point_invalidation_guarantee Interface

+ +

Signifies an invalidation guarantee that includes all those + of its base, and additionally, that any point-type iterator, + pointer, or reference to a container object's mapped value type + is valid as long as its corresponding entry has not be erased, + regardless of modifications to the container object.

+ +

Defined in: tag_and_trait.hpp

+ +

Base Classes

+ + + + + + + + + + + + + +
ClassDerivation Type
+
+basic_invalidation_guarantee
+
+
+

public

+
+
+ + diff --git a/libstdc++-v3/doc/html/ext/pb_ds/point_iterators_cd.png b/libstdc++-v3/doc/html/ext/pb_ds/point_iterators_cd.png new file mode 100644 index 00000000000..25a69fc6e8b Binary files /dev/null and b/libstdc++-v3/doc/html/ext/pb_ds/point_iterators_cd.png differ diff --git a/libstdc++-v3/doc/html/ext/pb_ds/point_iterators_range_ops_1.png b/libstdc++-v3/doc/html/ext/pb_ds/point_iterators_range_ops_1.png new file mode 100644 index 00000000000..c5bc8e5d6c0 Binary files /dev/null and b/libstdc++-v3/doc/html/ext/pb_ds/point_iterators_range_ops_1.png differ diff --git a/libstdc++-v3/doc/html/ext/pb_ds/point_iterators_range_ops_2.png b/libstdc++-v3/doc/html/ext/pb_ds/point_iterators_range_ops_2.png new file mode 100644 index 00000000000..c3f94ee93bc Binary files /dev/null and b/libstdc++-v3/doc/html/ext/pb_ds/point_iterators_range_ops_2.png differ diff --git a/libstdc++-v3/doc/html/ext/pb_ds/pq_container_traits.html b/libstdc++-v3/doc/html/ext/pb_ds/pq_container_traits.html new file mode 100644 index 00000000000..2ff5ed7c644 --- /dev/null +++ b/libstdc++-v3/doc/html/ext/pb_ds/pq_container_traits.html @@ -0,0 +1,132 @@ + + + + + + + container_traits Interface + + + + +
+

container_traits Interface

+ +

Traits of a priority-queue container based on its underlying + data structure.

+ +

Defined in: tag_and_trait.hpp

+ +

Template Parameters

+ + + + + + + + + + + + + + + + + +
ParameterDescriptionDefault Value
+
+class Cntnr
+
+
+

Container type.

+
-
+ +

Public Types and + Constants

+ +

Container Attributes

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
TypeDefinitionDescription
+
+container_category
+
+
+
+Underlying data structure.
+
+
+

Data structure category.

+
+
+invalidation_guarantee
+
+
+
+Invalidation guarantee.
+
+
+

Invalidation-guarantee type.

+ +

This is either basic_invalidation_guarantee, + point_invalidation_guarantee, or + range_invalidation_guarantee

+
+
+split_join_can_throw
+
+
+
+True only if split or join operations can throw.
+
+
+

Split-join throw indicator.

+
+
+ + diff --git a/libstdc++-v3/doc/html/ext/pb_ds/pq_design.html b/libstdc++-v3/doc/html/ext/pb_ds/pq_design.html new file mode 100644 index 00000000000..95956004527 --- /dev/null +++ b/libstdc++-v3/doc/html/ext/pb_ds/pq_design.html @@ -0,0 +1,381 @@ + + + + + + + Priority-Queues + + + + +
+

Priority-Queue Design

+ +

Overview

+ +

The priority-queue container has the following + declaration:

+
+template<
+    typename Value_Type,
+    typename Cmp_Fn = std::less<Value_Type>,
+    typename Tag = pairing_heap_tag,
+    typename Allocator = std::allocator<char> >
+class priority_queue;
+
+ +

The parameters have the following meaning:

+ +
    +
  1. Value_Type is the value type.
  2. + +
  3. Cmp_Fn is a value comparison functor
  4. + +
  5. Tag specifies which underlying data structure + to use.
  6. + +
  7. Allocator is an allocator + type.
  8. +
+ +

The Tag parameter specifies which underlying + data structure to use. Instantiating it by pairing_heap_tag, + binary_heap_tag, + binomial_heap_tag, + rc_binomial_heap_tag, + or thin_heap_tag, + specifies, respectively, an underlying pairing heap [fredman86pairing], + binary heap [clrs2001], + binomial heap [clrs2001], a binomial heap with + a redundant binary counter [maverik_lowerbounds], + or a thin heap [kt99fat_heas]. These are + explained further in Implementations.

+ +

As mentioned in Tutorial::Priority Queues, + __gnu_pbds::priority_queue + shares most of the same interface with std::priority_queue. + E.g. if q is a priority queue of type + Q, then q.top() will return the "largest" + value in the container (according to typename + Q::cmp_fn). __gnu_pbds::priority_queue + has a larger (and very slightly different) interface than + std::priority_queue, however, since typically + push and pop are deemed insufficient for + manipulating priority-queues.

+ +

Different settings require different priority-queue + implementations which are described in Implementations; Traits + discusses ways to differentiate between the different traits of + different implementations.

+ +

Iterators

+ +

There are many different underlying-data structures for + implementing priority queues. Unfortunately, most such + structures are oriented towards making push and + top efficient, and consequently don't allow efficient + access of other elements: for instance, they cannot support an efficient + find method. In the use case where it + is important to both access and "do something with" an + arbitrary value, one would be out of luck. For example, many graph algorithms require + modifying a value (typically increasing it in the sense of the + priority queue's comparison functor).

+ +

In order to access and manipulate an arbitrary value in a + priority queue, one needs to reference the internals of the + priority queue from some form of an associative container - + this is unavoidable. Of course, in order to maintain the + encapsulation of the priority queue, this needs to be done in a + way that minimizes exposure to implementation internals.

+ +

In pb_ds the priority queue's insert + method returns an iterator, which if valid can be used for subsequent modify and + erase operations. This both preserves the priority + queue's encapsulation, and allows accessing arbitrary values (since the + returned iterators from the push operation can be + stored in some form of associative container).

+ +

Priority queues' iterators present a problem regarding their + invalidation guarantees. One assumes that calling + operator++ on an iterator will associate it + with the "next" value. Priority-queues are + self-organizing: each operation changes what the "next" value + means. Consequently, it does not make sense that push + will return an iterator that can be incremented - this can have + no possible use. Also, as in the case of hash-based containers, + it is awkward to define if a subsequent push operation + invalidates a prior returned iterator: it invalidates it in the + sense that its "next" value is not related to what it + previously considered to be its "next" value. However, it might not + invalidate it, in the sense that it can be + de-referenced and used for modify and erase + operations.

+ +

Similarly to the case of the other unordered associative + containers, pb_ds uses a distinction between + point-type and range type iterators. A priority queue's iterator can always be + converted to a point_iterator, and a + const_iterator can always be converted to a + const_point_iterator.

+ +

The following snippet demonstrates manipulating an arbitrary + value:

+
+// A priority queue of integers.
+priority_queue<int> p;
+
+// Insert some values into the priority queue.
+priority_queue<int>::point_iterator it = p.push(0);
+
+p.push(1);
+p.push(2);
+
+// Now modify a value.
+p.modify(it, 3);
+
+assert(p.top() == 3);
+
+ +

(Priority Queue + Examples::Cross-Referencing shows a more detailed + example.)

+ +

It should be noted that an alternative design could embed an + associative container in a priority queue. Could, but most probably should not. To begin with, it should be noted that one + could always encapsulate a priority queue and an associative + container mapping values to priority queue iterators with no + performance loss. One cannot, however, "un-encapsulate" a + priority queue embedding an associative container, which might + lead to performance loss. Assume, that one needs to + associate each value with some data unrelated to priority + queues. Then using pb_ds's design, one could use an + associative container mapping each value to a pair consisting + of this data and a priority queue's iterator. Using the + embedded method would need to use two associative + containers. Similar problems might arise in cases where a value + can reside simultaneously in many priority queues.

+ +

Implementations

+ +

There are three main implementations of priority queues: the + first employs a binary heap, typically one which uses a + sequence; the second uses a tree (or forest of trees), which is + typically less structured than an associative container's tree; + the third simply uses an associative container. These are + shown, respectively, in Figures Underlying Priority-Queue + Data-Structures A1 and A2, Figure Underlying Priority-Queue + Data-Structures B, and Figures Underlying Priority-Queue + Data-Structures C.

+ +
no image
+ +
Underlying Priority-Queue Data-Structures.
+ +

Roughly speaking, any value that is both pushed and popped + from a priority queue must incur a logarithmic expense (in the + amortized sense). Any priority queue implementation that would + avoid this, would violate known bounds on comparison-based + sorting (see, e.g., [clrs2001] and brodal96priority]).

+ +

Most implementations do + not differ in the asymptotic amortized complexity of + push and pop operations, but they differ in + the constants involved, in the complexity of other operations + (e.g., modify), and in the worst-case + complexity of single operations. In general, the more + "structured" an implementation (i.e., the more internal + invariants it possesses) - the higher its amortized complexity + of push and pop operations.

+ +

pb_ds implements different algorithms using a + single class: priority_queue. + Instantiating the Tag template parameter, "selects" + the implementation:

+ +
    +
  1. Instantiating Tag = binary_heap_tag creates + a binary heap of the form in Figures Underlying Priority-Queue + Data-Structures A1 or A2. The former is internally + selected by priority_queue + if Value_Type is instantiated by a primitive type + (e.g., an int); the latter is + internally selected for all other types (e.g., + std::string). This implementations is relatively + unstructured, and so has good push and pop + performance; it is the "best-in-kind" for primitive + types, e.g., ints. Conversely, it has + high worst-case performance, and can support only linear-time + modify and erase operations; this is + explained further in Traits.
  2. + +
  3. Instantiating Tag = pairing_heap_tag + creates a pairing heap of the form in Figure Underlying Priority-Queue + Data-Structures B. This implementations too is relatively + unstructured, and so has good push and pop + performance; it is the "best-in-kind" for non-primitive + types, e.g., std:strings. It also has very + good worst-case push and join performance + (O(1)), but has high worst-case pop + complexity.
  4. + +
  5. Instantiating Tag = binomial_heap_tag + creates a binomial heap of the form in Figure Underlying Priority-Queue + Data-Structures B. This implementations is more + structured than a pairing heap, and so has worse + push and pop performance. Conversely, it + has sub-linear worst-case bounds for pop, + e.g., and so it might be preferred in cases where + responsiveness is important.
  6. + +
  7. Instantiating Tag = rc_binomial_heap_tag + creates a binomial heap of the form in Figure Underlying Priority-Queue + Data-Structures B, accompanied by a redundant counter + which governs the trees. This implementations is therefore + more structured than a binomial heap, and so has worse + push and pop performance. Conversely, it + guarantees O(1) push complexity, and so it + might be preferred in cases where the responsiveness of a + binomial heap is insufficient.
  8. + +
  9. Instantiating Tag = thin_heap_tag creates a + thin heap of the form in Figure Underlying Priority-Queue + Data-Structures B. This implementations too is more + structured than a pairing heap, and so has worse + push and pop performance. Conversely, it + has better worst-case and identical amortized complexities + than a Fibonacci heap, and so might be more appropriate for + some graph algorithms.
  10. +
+ +

Priority-Queue + Performance Tests shows some results for the above, and + discusses these points further.

+ +

Of course, one can use any order-preserving associative + container as a priority queue, as in Figure Underlying Priority-Queue + Data-Structures C, possibly by creating an adapter class + over the associative container (much as + std::priority_queue can adapt std::vector). + This has the advantage that no cross-referencing is necessary + at all; the priority queue itself is an associative container. + Most associative containers are too structured to compete with + priority queues in terms of push and pop + performance.

+ +

Traits

+ +

It would be nice if all priority queues could + share exactly the same behavior regardless of implementation. Sadly, this is not possible. Just one for instance is in join operations: joining + two binary heaps might throw an exception (not corrupt + any of the heaps on which it operates), but joining two pairing + heaps is exception free.

+ +

Tags and traits are very useful for manipulating generic + types. __gnu_pbds::priority_queue + publicly defines container_category as one of the tags + discussed in Implementations. Given any + container Cntnr, the tag of the underlying + data structure can be found via typename + Cntnr::container_category; this is one of the types shown in + Figure Data-structure tag class + hierarchy.

+ +
+
+ +
Data-structure tag class hierarchy.
+ +

Additionally, a traits mechanism can be used to query a + container type for its attributes. Given any container + Cntnr, then __gnu_pbds::container_traits<Cntnr> + is a traits class identifying the properties of the + container.

+ +

To find if a container might throw if two of its objects are + joined, one can use container_traits<Cntnr>::split_join_can_throw, + for example.

+ +

Different priority-queue implementations have different invalidation guarantees. This is + especially important, since as explained in Iterators, there is no way to access an arbitrary + value of priority queues except for iterators. Similarly to + associative containers, one can use + container_traits<Cntnr>::invalidation_guarantee + to get the invalidation guarantee type of a priority queue.

+ +

It is easy to understand from Figure Underlying Priority-Queue + Data-Structures, what container_traits<Cntnr>::invalidation_guarantee + will be for different implementations. All implementations of + type Underlying + Priority-Queue Data-Structures B have point_invalidation_guarantee: + the container can freely internally reorganize the nodes - + range-type iterators are invalidated, but point-type iterators + are always valid. Implementations of type Underlying Priority-Queue + Data-Structures A1 and A2 have basic_invalidation_guarantee: + the container can freely internally reallocate the array - both + point-type and range-type iterators might be invalidated.

+ +

This has major implications, and constitutes a good reason to avoid + using binary heaps. A binary heap can perform modify + or erase efficiently given a valid point-type + iterator. However, inn order to supply it with a valid point-type + iterator, one needs to iterate (linearly) over all + values, then supply the relevant iterator (recall that a + range-type iterator can always be converted to a point-type + iterator). This means that if the number of modify or + erase operations is non-negligible (say + super-logarithmic in the total sequence of operations) - binary + heaps will perform badly.

+
+
+
+
+ + diff --git a/libstdc++-v3/doc/html/ext/pb_ds/pq_different_underlying_dss.png b/libstdc++-v3/doc/html/ext/pb_ds/pq_different_underlying_dss.png new file mode 100644 index 00000000000..9d84791fc0d Binary files /dev/null and b/libstdc++-v3/doc/html/ext/pb_ds/pq_different_underlying_dss.png differ diff --git a/libstdc++-v3/doc/html/ext/pb_ds/pq_examples.html b/libstdc++-v3/doc/html/ext/pb_ds/pq_examples.html new file mode 100644 index 00000000000..ee8e9305486 --- /dev/null +++ b/libstdc++-v3/doc/html/ext/pb_ds/pq_examples.html @@ -0,0 +1,60 @@ + + + + + + + Examples + + + + +
+

Priority-Queue Examples

+ +

Basic Use

+ +
    +
  1. basic_priority_queue.cc + Basic use of priority queues.
  2. + +
  3. priority_queue_split_join.cc + Splitting and joining priority queues.
  4. + +
  5. priority_queue_erase_if.cc + Conditionally erasing values from a container object.
  6. +
+ +

Generics

+ +
    +
  1. priority_queue_container_traits.cc + Using container_traits + to query about underlying data structure behavior.
  2. +
+ +

Cross Referencing

+ + +
    +
  1. priority_queue_xref.cc + Cross referencing an associative container and a priority + queue.
  2. + +
  3. priority_queue_dijkstra.cc + Cross referencing a vector and a priority queue using a + very simple version of Dijkstra's shortest path + algorithm.
  4. +
+
+ + diff --git a/libstdc++-v3/doc/html/ext/pb_ds/pq_performance_tests.html b/libstdc++-v3/doc/html/ext/pb_ds/pq_performance_tests.html new file mode 100644 index 00000000000..3a6b2691208 --- /dev/null +++ b/libstdc++-v3/doc/html/ext/pb_ds/pq_performance_tests.html @@ -0,0 +1,332 @@ + + + + + +Priority-Queue Performance Tests + + + +
+

Priority-Queue Performance Tests

+

Settings

+

This section describes performance tests and their results. + In the following, g++, msvc++, and local (the build used for generating this + documentation) stand for three different builds:

+
+
+

g++

+
    +
  • CPU speed - cpu MHz : 2660.644
  • +
  • Memory - MemTotal: 484412 kB
  • +
  • Platform - + Linux-2.6.12-9-386-i686-with-debian-testing-unstable
  • +
  • Compiler - g++ (GCC) 4.0.2 20050808 (prerelease) + (Ubuntu 4.0.1-4ubuntu9) Copyright (C) 2005 Free Software + Foundation, Inc. This is free software; see the source + for copying conditions. There is NO warranty; not even + for MERCHANTABILITY or FITNESS FOR A PARTICULAR + PURPOSE.
  • +
+
+
+
+
+
+

msvc++

+
    +
  • CPU speed - cpu MHz : 2660.554
  • +
  • Memory - MemTotal: 484412 kB
  • +
  • Platform - Windows XP Pro
  • +
  • Compiler - Microsoft (R) 32-bit C/C++ Optimizing + Compiler Version 13.10.3077 for 80x86 Copyright (C) + Microsoft Corporation 1984-2002. All rights + reserved.
  • +
+
+
+
+

local

    +
  • CPU speed - cpu MHz : 2250.000
  • +
  • Memory - MemTotal: 2076248 kB
  • +
  • Platform - Linux-2.6.16-1.2133_FC5-i686-with-redhat-5-Bordeaux
  • +
  • Compiler - g++ (GCC) 4.1.1 20060525 (Red Hat 4.1.1-1) +Copyright (C) 2006 Free Software Foundation, Inc. +This is free software; see the source for copying conditions. There is NO +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +
  • +
+
+

Tests

+
    +
  1. Priority Queue + Text push Timing Test
  2. +
  3. Priority + Queue Text push and pop Timing + Test
  4. +
  5. Priority + Queue Random Integer push Timing Test
  6. +
  7. Priority + Queue Random Integer push and pop Timing + Test
  8. +
  9. Priority Queue + Text pop Memory Use Test
  10. +
  11. Priority Queue + Text join Timing Test
  12. +
  13. Priority + Queue Text modify Timing Test - I
  14. +
  15. Priority + Queue Text modify Timing Test - II
  16. +
+

Observations

+

Underlying Data Structures + Complexity

+

The following table shows the complexities of the different + underlying data structures in terms of orders of growth. It is + interesting to note that this table implies something about the + constants of the operations as well (see Amortized push + and pop operations).

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
pushpopmodifyerasejoin
+

std::priority_queue

+
+

Θ(n) worst

+

Θ(log(n)) amortized

+
+

Θ(log(n)) Worst

+
+

Theta;(n log(n)) Worst

+

[std note 1]

+
+

Θ(n log(n))

+

[std note 2]

+
+

Θ(n log(n))

+

[std note 1]

+
+

priority_queue

+

with Tag =

+

pairing_heap_tag

+
+

O(1)

+
+

Θ(n) worst

+

Θ(log(n)) amortized

+
+

Θ(n) worst

+

Θ(log(n)) amortized

+
+

Θ(n) worst

+

Θ(log(n)) amortized

+
+

O(1)

+
+

priority_queue

+

with Tag =

+

binary_heap_tag

+
+

Θ(n) worst

+

Θ(log(n)) amortized

+
+

Θ(n) worst

+

Θ(log(n)) amortized

+
+

Θ(n)

+
+

Θ(n)

+
+

Θ(n)

+
+

priority_queue

+

with Tag =

+

binomial_heap_tag

+
+

Θ(log(n)) worst

+

O(1) amortized

+
+

Θ(log(n))

+
+

Θ(log(n))

+
+

Θ(log(n))

+
+

Θ(log(n))

+
+

priority_queue

+

with Tag =

+

rc_binomial_heap_tag

+
+

O(1)

+
+

Θ(log(n))

+
+

Θ(log(n))

+
+

Θ(log(n))

+
+

Θ(log(n))

+
+

priority_queue

+

with Tag =

+

thin_heap_tag

+
+

O(1)

+
+

Θ(n) worst

+

Θ(log(n)) amortized

+
+

Θ(log(n)) worst

+

O(1) amortized,

or + +

Θ(log(n)) amortized

+

[thin_heap_note]

+
+

Θ(n) worst

+

Θ(log(n)) amortized

+
+

Θ(n)

+
+

[std note 1] This + is not a property of the algorithm, but rather due to the fact + that the STL's priority queue implementation does not support + iterators (and consequently the ability to access a specific + value inside it). If the priority queue is adapting an + std::vector, then it is still possible to reduce this + to Θ(n) by adapting over the STL's adapter and + using the fact that top returns a reference to the + first value; if, however, it is adapting an + std::deque, then this is impossible.

+

[std note 2] As + with [std note 1], this is not a + property of the algorithm, but rather the STL's implementation. + Again, if the priority queue is adapting an + std::vector then it is possible to reduce this to + Θ(n), but with a very high constant (one must call + std::make_heap which is an expensive linear + operation); if the priority queue is adapting an + std::dequeu, then this is impossible.

+

[thin_heap_note] A thin heap has + &Theta(log(n)) worst case modify time + always, but the amortized time depends on the nature of the + operation: I) if the operation increases the key (in the sense + of the priority queue's comparison functor), then the amortized + time is O(1), but if II) it decreases it, then the + amortized time is the same as the worst case time. Note that + for most algorithms, I) is important and II) is not.

+

Amortized push + and pop operations

+

In many cases, a priority queue is needed primarily for + sequences of push and pop operations. All of + the underlying data structures have the same amortized + logarithmic complexity, but they differ in terms of + constants.

+

The table above shows that the different data structures are + "constrained" in some respects. In general, if a data structure + has lower worst-case complexity than another, then it will + perform slower in the amortized sense. Thus, for example a + redundant-counter binomial heap (priority_queue with + Tag = rc_binomial_heap_tag) + has lower worst-case push performance than a binomial + heap (priority_queue + with Tag = binomial_heap_tag), + and so its amortized push performance is slower in + terms of constants.

+

As the table shows, the "least constrained" underlying + data structures are binary heaps and pairing heaps. + Consequently, it is not surprising that they perform best in + terms of amortized constants.

+
    +
  1. Pairing heaps seem to perform best for non-primitive + types (e.g., std::strings), as shown by + Priority + Queue Text push Timing Test and Priority + Queue Text push and pop Timing + Test
  2. +
  3. binary heaps seem to perform best for primitive types + (e.g., ints), as shown by Priority + Queue Random Integer push Timing Test and + Priority + Queue Random Integer push and pop Timing + Test.
  4. +
+

Graph Algorithms

+

In some graph algorithms, a decrease-key operation is + required [clrs2001]; + this operation is identical to modify if a value is + increased (in the sense of the priority queue's comparison + functor). The table above and Priority Queue + Text modify Timing Test - I show that a thin heap + (priority_queue with + Tag = thin_heap_tag) + outperforms a pairing heap (priority_queue with + Tag =Tag = pairing_heap_tag), + but the rest of the tests show otherwise.

+

This makes it difficult to decide which implementation to + use in this case. Dijkstra's shortest-path algorithm, for + example, requires Θ(n) push and + pop operations (in the number of vertices), but + O(n2) modify operations, which can + be in practice Θ(n) as well. It is difficult to + find an a-priori characterization of graphs in which the + actual number of modify operations will dwarf + the number of push and pop operations.

+
+ + diff --git a/libstdc++-v3/doc/html/ext/pb_ds/pq_regression_tests.html b/libstdc++-v3/doc/html/ext/pb_ds/pq_regression_tests.html new file mode 100644 index 00000000000..1e894ca6edb --- /dev/null +++ b/libstdc++-v3/doc/html/ext/pb_ds/pq_regression_tests.html @@ -0,0 +1,52 @@ + + + + + + + Priority-Queue Regression Tests + + + + +
+

Priority-Queue Regression Tests

+ +

Description

+ +

The library contains a single comprehensive regression test. + For a given container type in pb_ds, the test creates + an object of the container type and an object of the + corresponding STL type (i.e., + std::priority_queue). It then performs a random + sequence of methods with random arguments (e.g., pushes, + pops, and so forth) on both objects. At each operation, the + test checks the return value of the method, and optionally both + compares pb_ds's object with the STL's object as well + as performing other consistency checks on pb_ds's + object (e.g., that the size returned by the + size method corresponds to the distance between its + begin and end iterators).

+ +

Additionally, the test integrally checks exception safety + and resource leaks. This is done as follows. A special + allocator type, written for the purpose of the test, both + randomly throws an exceptions when allocations are performed, + and tracks allocations and de-allocations. The exceptions thrown + at allocations simulate memory-allocation failures; the + tracking mechanism checks for memory-related bugs (e.g., + resource leaks and multiple de-allocations). Both + pb_ds's containers and the containers' value-types are + configured to use this allocator.

+ +

Tests

+ +

priority_queue_rand.cc + checks all priority queue types.

+
+ + diff --git a/libstdc++-v3/doc/html/ext/pb_ds/pq_tests.html b/libstdc++-v3/doc/html/ext/pb_ds/pq_tests.html new file mode 100644 index 00000000000..de8cb447c71 --- /dev/null +++ b/libstdc++-v3/doc/html/ext/pb_ds/pq_tests.html @@ -0,0 +1,24 @@ + + + + + + + Priority-Queue Tests + + + + +
+

Priority-Queue Tests

+ +

Priority-Queue Regression + Tests describes the regression tests; Priority-Queue Performance + Tests describes the performance tests.

+
+ + diff --git a/libstdc++-v3/doc/html/ext/pb_ds/prerequisites.html b/libstdc++-v3/doc/html/ext/pb_ds/prerequisites.html new file mode 100644 index 00000000000..7c888849918 --- /dev/null +++ b/libstdc++-v3/doc/html/ext/pb_ds/prerequisites.html @@ -0,0 +1,46 @@ + + + + + + + Prerequisites + + + + +
+

Usage Prerequisites

+ +

pb_ds has been successfully tested with the + following compilers:

+ +
    +
  1. g++ 3.3.1, 3.4.4, 4.0, 4.1, and what will be 4.2
  2. + +
  3. Intel icpc 8.1 and 9
  4. + +
  5. Visual C++ .Net 2005
  6. +
+ +

The library contains only header files, and does not require + any other libraries except the STL. All classes are defined in + namespace pb_ds. The library internally uses + macros beginning with PB_DS (e.g., for header + guards), but #undefs anything it + #defines (except for header guards). Compiling + the library in an environment where macros beginning in + PB_DS are defined, may yield unpredictable results in + compilation, execution, or both.

+ +

Further dependencies are necessary to create the visual output + for the performance tests. To create these graphs, two additional + packages will be needed: pychart and Beautiful + Soup. Both are freely available. +

+
+ + diff --git a/libstdc++-v3/doc/html/ext/pb_ds/priority_queue.html b/libstdc++-v3/doc/html/ext/pb_ds/priority_queue.html new file mode 100644 index 00000000000..169953f6d59 --- /dev/null +++ b/libstdc++-v3/doc/html/ext/pb_ds/priority_queue.html @@ -0,0 +1,995 @@ + + + + + + + priority_queue Interface + + + + +
+

priority_queue Interface

+ +

Basic priority queue.

+ +

Defined in: priority_queue.hpp

+ +

Template Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterDescriptionDefault Value
+
+typename Value_Type
+
+
+

Value type.

+
-
+
+class Cmp_Fn 
+
+
+

Comparison functor.

+
+
+std::less<Value_Type>
+
+
+
+class Tag 
+
+
+

Data-structure tag.

+
pairing_heap_tag
+
+class Allocator 
+
+
+

Allocator type.

+
+
+std::allocator<char>
+
+
+ +

Public Types and + Constants

+ +

General Container + Definitions

+ + + + + + + + + + + + + + + + + + + + + + + + + +
TypeDefinitionDescription
+
+size_type
+
+
+
+typename Allocator::size_type
+
+
+

Size type.

+
+
+difference_type
+
+
+
+typename Allocator::difference_type
+
+
+

Difference type.

+
+ +

Categories

+ + + + + + + + + + + + + + + + + +
TypeDefinitionDescription
+
+container_category
+
+
+
+Tag
+
+
+

The underlying mapped-structure tag of the + container.

+ +

This is one of:

+ +
    +
  1. binary_heap_tag
  2. + +
  3. binomial_heap_tag
  4. + +
  5. rc_binomial_heap_tag
  6. + +
  7. pairing_heap_tag
  8. + +
  9. thin_heap_tag
  10. +
+
+ +

Policy Definitions

+ + + + + + + + + + + + + + + + + + + + + + + + + +
TypeDefinitionDescription
+
+cmp_fn
+
+
+
+Cmp_Fn
+
+
+

Comparison functor type.

+
+
+allocator
+
+
+
+Allocator
+
+
+

Allocator + type.

+
+ +

Value-Type Definitions

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
TypeDefinitionDescription
+
+value_type
+
+
+
+Value_Type
+
+
+

Value type.

+
+
+reference
+
+
+
+typename allocator::template rebind<
+    value_type>::other::reference
+
+
+

Value reference type.

+
+
+const_reference
+
+
+
+typename allocator::template rebind<
+    value_type>::other::const_reference
+
+
+

Const value reference type.

+
+
+pointer
+
+
+
+typename allocator::template rebind<
+    value_type>::other::pointer
+
+
+

Value pointer type.

+
+
+const_pointer
+
+
+
+typename allocator::template rebind<
+    value_type>::other::const_pointer
+
+
+

Const Value pointer type.

+
+ +

Iterator Definitions

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
TypeDefinitionDescription
+
+const_point_iterator
+
+
+
+Const point-type iterator.
+
+
+

Const point-type iterator.

+
+
+point_iterator
+
+
+
+Point-type iterator.
+
+
+

Point-type iterator.

+
+
+const_iterator
+
+
+
+Const range-type iterator.
+
+
+

Const range-type iterator.

+
+
+iterator
+
+
+
+Range-type iterator.
+
+
+

Range-type iterator.

+
+ +

Public Methods

+ +

Constructors, Destructor, and + Related

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDescription
+
+  priority_queue
+  ()
+
+
+

Default constructor.

+
+
+  priority_queue
+  (const cmp_fn &r_cmp_fn)
+
+
+

Constructor taking some policy objects. r_cmp_fn will be copied by the + Cmp_Fn object of the + container object.

+
+
+template<
+    class It>
+  priority_queue
+  (It first_it, 
+    It last_it)
+
+
+

Constructor taking iterators to a range of value_types. The + value_types + between first_it and + last_it will be inserted + into the container object.

+
+
+template<
+    class It>
+  priority_queue
+  (It first_it, 
+    It last_it,
+    const cmp_fn &r_cmp_fn)
+
+
+

Constructor taking iterators to a range of value_types and some + policy objects The value_types between + first_it and + last_it will be inserted + into the container object. r_cmp_fn will be copied by the + cmp_fn object of the + container object.

+
+
+  priority_queue
+  (const priority_queue &other)
+
+
+

Copy constructor.

+
+
+virtual 
+  ~priority_queue
+  ()
+
+
+

Destructor.

+
+
+priority_queue &
+  operator=
+  (const priority_queue &other)
+
+
+

Assignment operator.

+
+
+void
+  swap
+  (priority_queue &other)
+
+
+

Swaps content.

+
+ +

Information Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDescription
+
+inline size_type
+  size
+  () const
+
+
+

Returns the number of distinct value_type objects + the container object is storing.

+
+
+inline size_type
+  max_size
+  () const
+
+
+

Returns an upper bound on the number of distinct + value_type + objects this container can store.

+
+
+inline bool
+  empty
+  () const
+
+
+

Returns whether the container object is not storing + any value_type + objects.

+
+ +

Insert Methods

+ + + + + + + + + + + + + +
MethodDescription
+
+inline point_iterator
+  push
+  (const_reference r_val)
+
+
+

Inserts a value_type object. + returns a point_iterator + object associated with the new pushed r_val.

+
+ +

Find Methods

+ + + + + + + + + + + + + +
MethodDescription
+
+inline const_reference 
+  top
+  () const
+
+
+

Returns the const_reference + of the largest value_type in the + container object, i.e., a value_type v_max for + which any other value_type v in the + container object will satisfy !cmp_fn()(v_max, v).

+
+ +

Modify Methods

+ + + + + + + + + + + + + +
MethodDescription
+
+inline void
+  modify
+  (point_iterator it,
+    const_reference r_new_val)
+
+
+

Modifies the value_type associated + with the point_iterator + it into r_new_val.

+ +

To use this method, value_type must be + assignable.

+
+ +

Erase Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDescription
+
+inline void
+  pop
+  ()
+
+
+

Pops the largest value_type.

+ +

If the container object is empty, results are + undefined.

+
+
+inline void
+  erase
+  (point_iterator it)
+
+
+

Erases the value_type associated + with the point_iterator + it.

+
+
+template<
+  class Pred>
+inline size_type 
+  erase_if
+  (Pred prd)
+
+
+

Erases any value_type satisfying + the predicate prd; + returns the number of value_types + erased.

+
+
+void 
+  clear
+  ()
+
+
+

Clears the container object.

+
+ +

Split and join + Methods

+ + + + + + + + + + + + + + + + + + + +
MethodDescription
+
+void 
+  join
+  (priority_queue &other)
+
+
+

Joins two container objects. When this function + returns, other will be + empty.

+ +

When calling this method, other's policies must be + equivalent to this object's policies.

+
+
+template<
+  class Pred>
+inline void
+  split
+  (Pred prd,
+    priority_queue &other)
+
+
+

Splits into two container objects. When this function + returns, other will be + contain only values v for which prd(v) is true.

+ +

When calling this method, other's policies must be + equivalent to this object's policies.

+
+ +

Iteration Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDescription
+
+inline iterator
+  begin
+  ()
+
+
+

Returns an iterator corresponding + to the first value_type in the + container.

+
+
+inline const_iterator
+  begin
+  () const
+
+
+

Returns a const_iterator + corresponding to the first value_type in the + container.

+
+
+inline iterator
+  end
+  ()
+
+
+

Returns an iterator corresponding + to the just-after-last value_type in the + container.

+
+
+inline const_iterator
+  end
+  () const
+
+
+

Returns a const_iterator + corresponding to the just-after-last value_type in the + container.

+
+
+ + diff --git a/libstdc++-v3/doc/html/ext/pb_ds/priority_queue_random_int_push_pop_timing_test.html b/libstdc++-v3/doc/html/ext/pb_ds/priority_queue_random_int_push_pop_timing_test.html new file mode 100644 index 00000000000..e9aec9ceb04 --- /dev/null +++ b/libstdc++-v3/doc/html/ext/pb_ds/priority_queue_random_int_push_pop_timing_test.html @@ -0,0 +1,161 @@ + + + + + +Priority Queue Random Int Push Pop Timing Test + + + +
+

Priority Queue Random Integer push and + pop Timing Test

+

Description

+

This test inserts a number of values with i.i.d. integer + keys into a container using push , then removes them + using pop . It measures the average time for + push and pop as a function of the number of + values.

+

(The test was executed with +priority_queue_random_int_push_pop_timing_test + thirty_years_among_the_dead_preproc.txt 200 200 2100)

+

Purpose

+

The test checks the effect of different underlying + data structures (see Design::Priority + Queues::Implementations).

+

Results

+

Figures NPG, NPM, and + NPL shows the results for the native + priority queues and pb_ds 's priority queues in + g++, + msvc++, and + local, + respectively.

+
+
+
+
+
no image
NPG: Native and pb ds priority queue push pop timing test - g++

In the above figure, the names in the legends have the following meaning:

+
    +
  1. +thin_heap- +priority_queue + with Tag = thin_heap_tag +
  2. +
  3. +rc_binomial_heap- +priority_queue + with Tag = rc_binomial_heap_tag +
  4. +
  5. +binomial_heap- +priority_queue + with Tag = binomial_heap_tag +
  6. +
  7. +pairing_heap- +priority_queue + with Tag = pairing_heap_tag +
  8. +
  9. +n_pq_deque- +std::priority_queue adapting std::deque
  10. +
  11. +n_pq_vector- +std::priority_queue adapting std::vector
  12. +
  13. +binary_heap- +priority_queue + with Tag = binary_heap_tag +
  14. +
+
+
+
+
+
+
+
+
+
+
no image
NPM: Native and pb ds priority queue push pop timing test - msvc++

In the above figure, the names in the legends have the following meaning:

+
    +
  1. +thin_heap- +priority_queue + with Tag = thin_heap_tag +
  2. +
  3. +rc_binomial_heap- +priority_queue + with Tag = rc_binomial_heap_tag +
  4. +
  5. +binomial_heap- +priority_queue + with Tag = binomial_heap_tag +
  6. +
  7. +pairing_heap- +priority_queue + with Tag = pairing_heap_tag +
  8. +
  9. +n_pq_deque- +std::priority_queue adapting std::deque
  10. +
  11. +n_pq_vector- +std::priority_queue adapting std::vector
  12. +
  13. +binary_heap- +priority_queue + with Tag = binary_heap_tag +
  14. +
+
+
+
+
+
+
+
+
+
+
no image
NPL: Native and pb ds priority queue push pop timing test - local
+
+
+
+
+

Observations

+

Binary heaps are the most suited for sequences of + push and pop operations of primitive types + (e.g. ints). This is explained in + Priority + Queue Random Int push Timing Test . (See Priority Queue + Text push Timing Test for the case of primitive + types.)

+

At first glance it seems that the STL's vector-based + priority queue is approximately on par with pb_ds's + corresponding priority queue. There are two differences + however:

+
    +
  1. The STL's priority queue does not downsize the underlying + vector (or deque) as the priority queue becomes smaller + (see Priority Queue + Text pop Memory Use Test). It is therefore + gaining some speed at the expense of space.
  2. +
  3. From Priority + Queue Random Integer push and pop Timing + Test, it seems that the STL's priority queue is slower in + terms of pus operations. Since the number of + pop operations is at most that of push + operations, the test here is the "best" for the STL's + priority queue.
  4. +
+

Priority-Queue + Performance Tests::Observations discusses this further and + summarizes.

+
+ + diff --git a/libstdc++-v3/doc/html/ext/pb_ds/priority_queue_random_int_push_pop_timing_test_gcc.png b/libstdc++-v3/doc/html/ext/pb_ds/priority_queue_random_int_push_pop_timing_test_gcc.png new file mode 100644 index 00000000000..68f5e2b6bdb Binary files /dev/null and b/libstdc++-v3/doc/html/ext/pb_ds/priority_queue_random_int_push_pop_timing_test_gcc.png differ diff --git a/libstdc++-v3/doc/html/ext/pb_ds/priority_queue_random_int_push_pop_timing_test_local.png b/libstdc++-v3/doc/html/ext/pb_ds/priority_queue_random_int_push_pop_timing_test_local.png new file mode 100644 index 00000000000..51f8211f1d4 Binary files /dev/null and b/libstdc++-v3/doc/html/ext/pb_ds/priority_queue_random_int_push_pop_timing_test_local.png differ diff --git a/libstdc++-v3/doc/html/ext/pb_ds/priority_queue_random_int_push_pop_timing_test_msvc.png b/libstdc++-v3/doc/html/ext/pb_ds/priority_queue_random_int_push_pop_timing_test_msvc.png new file mode 100644 index 00000000000..4fc191c8b1c Binary files /dev/null and b/libstdc++-v3/doc/html/ext/pb_ds/priority_queue_random_int_push_pop_timing_test_msvc.png differ diff --git a/libstdc++-v3/doc/html/ext/pb_ds/priority_queue_random_int_push_timing_test.html b/libstdc++-v3/doc/html/ext/pb_ds/priority_queue_random_int_push_timing_test.html new file mode 100644 index 00000000000..65323029bac --- /dev/null +++ b/libstdc++-v3/doc/html/ext/pb_ds/priority_queue_random_int_push_timing_test.html @@ -0,0 +1,200 @@ + + + + + +Priority Queue Random Int Push Timing Test + + + +
+

Priority Queue Random Integer push Timing + Test

+

Description

+

This test inserts a number of values with i.i.d integer keys + into a container using push . It measures the average + time for push as a function of the number of + values.

+

(The test was executed with + priority_queue_random_intpush_timing_test + thirty_years_among_the_dead_preproc.txt 200 200 2100)

+

Purpose

+

The test checks the effect of different underlying + data structures (see Design::Priority + Queues::Implementations).

+

Results

+

Figures NPG, NPM, and + NPL show the results for the native priority + queues and pb_ds 's priority queues in g++, msvc++, and + local, + respectively; Figures NBPG, NBPM, and NBPL shows the + results for the binary-heap based native priority queues and + pb_ds 's priority queues in g++, msvc++, and + local, + respectively

+
+
+
+
+
no image
NPG: Native and pb ds priority queue push timing test - g++

In the above figure, the names in the legends have the following meaning:

+
    +
  1. +rc_binomial_heap- +priority_queue + with Tag = rc_binomial_heap_tag +
  2. +
  3. +binomial_heap- +priority_queue + with Tag = binomial_heap_tag +
  4. +
  5. +n_pq_deque- +std::priority_queue adapting std::deque
  6. +
  7. +pairing_heap- +priority_queue + with Tag = pairing_heap_tag +
  8. +
  9. +thin_heap- +priority_queue + with Tag = thin_heap_tag +
  10. +
  11. +n_pq_vector- +std::priority_queue adapting std::vector
  12. +
  13. +binary_heap- +priority_queue + with Tag = binary_heap_tag +
  14. +
+
+
+
+
+
+
+
+
+
+
no image
NPM: Native and pb ds priority queue push timing test - msvc++

In the above figure, the names in the legends have the following meaning:

+
    +
  1. +rc_binomial_heap- +priority_queue + with Tag = rc_binomial_heap_tag +
  2. +
  3. +binomial_heap- +priority_queue + with Tag = binomial_heap_tag +
  4. +
  5. +pairing_heap- +priority_queue + with Tag = pairing_heap_tag +
  6. +
  7. +thin_heap- +priority_queue + with Tag = thin_heap_tag +
  8. +
  9. +n_pq_deque- +std::priority_queue adapting std::deque
  10. +
  11. +n_pq_vector- +std::priority_queue adapting std::vector
  12. +
  13. +binary_heap- +priority_queue + with Tag = binary_heap_tag +
  14. +
+
+
+
+
+
+
+
+
+
+
no image
NPL: Native and pb ds priority queue push timing test - local
+
+
+
+
+
+
+
+
+
no image
NBPG: Native and pb ds binary priority queue push timing test - g++

In the above figure, the names in the legends have the following meaning:

+
    +
  1. +n_pq_deque- +std::priority_queue adapting std::deque
  2. +
  3. +n_pq_vector- +std::priority_queue adapting std::vector
  4. +
  5. +binary_heap- +priority_queue + with Tag = binary_heap_tag +
  6. +
+
+
+
+
+
+
+
+
+
+
no image
NBPM: Native and pb ds binary priority queue push timing test - msvc++

In the above figure, the names in the legends have the following meaning:

+
    +
  1. +n_pq_deque- +std::priority_queue adapting std::deque
  2. +
  3. +n_pq_vector- +std::priority_queue adapting std::vector
  4. +
  5. +binary_heap- +priority_queue + with Tag = binary_heap_tag +
  6. +
+
+
+
+
+
+
+
+
+
+
no image
NBPL: Native and pb ds binary priority queue push timing test - local
+
+
+
+
+

Observations

+

Binary heaps are the most suited for sequences of + push and pop operations of primitive types + (e.g. ints). They are less constrained + than any other type, and since it is very efficient to store + such types in arrays, they outperform even pairing heaps. (See + Priority + Queue Text push Timing Test for the case of + non-primitive types.)

+

Priority-Queue + Performance Tests::Observations discusses this further and + summarizes.

+
+ + diff --git a/libstdc++-v3/doc/html/ext/pb_ds/priority_queue_random_int_push_timing_test_gcc.png b/libstdc++-v3/doc/html/ext/pb_ds/priority_queue_random_int_push_timing_test_gcc.png new file mode 100644 index 00000000000..ee8c9b7d9a9 Binary files /dev/null and b/libstdc++-v3/doc/html/ext/pb_ds/priority_queue_random_int_push_timing_test_gcc.png differ diff --git a/libstdc++-v3/doc/html/ext/pb_ds/priority_queue_random_int_push_timing_test_local.png b/libstdc++-v3/doc/html/ext/pb_ds/priority_queue_random_int_push_timing_test_local.png new file mode 100644 index 00000000000..dead185fa4f Binary files /dev/null and b/libstdc++-v3/doc/html/ext/pb_ds/priority_queue_random_int_push_timing_test_local.png differ diff --git a/libstdc++-v3/doc/html/ext/pb_ds/priority_queue_random_int_push_timing_test_msvc.png b/libstdc++-v3/doc/html/ext/pb_ds/priority_queue_random_int_push_timing_test_msvc.png new file mode 100644 index 00000000000..0a1a8eaefbc Binary files /dev/null and b/libstdc++-v3/doc/html/ext/pb_ds/priority_queue_random_int_push_timing_test_msvc.png differ diff --git a/libstdc++-v3/doc/html/ext/pb_ds/priority_queue_tag.html b/libstdc++-v3/doc/html/ext/pb_ds/priority_queue_tag.html new file mode 100644 index 00000000000..4bad6ee6e82 --- /dev/null +++ b/libstdc++-v3/doc/html/ext/pb_ds/priority_queue_tag.html @@ -0,0 +1,47 @@ + + + + + + + priority_queue_tag Interface + + + + +
+

priority_queue_tag Interface

+ +

Basic priority-queue data structure tag.

+ +

Defined in: tag_and_trait.hpp

+ +

Base Classes

+ + + + + + + + + + + + + +
ClassDerivation Type
+
+container_tag
+
+
+

public

+
+
+ + diff --git a/libstdc++-v3/doc/html/ext/pb_ds/priority_queue_tag_cd.png b/libstdc++-v3/doc/html/ext/pb_ds/priority_queue_tag_cd.png new file mode 100644 index 00000000000..ed8d875f0f8 Binary files /dev/null and b/libstdc++-v3/doc/html/ext/pb_ds/priority_queue_tag_cd.png differ diff --git a/libstdc++-v3/doc/html/ext/pb_ds/priority_queue_tag_cd.svg b/libstdc++-v3/doc/html/ext/pb_ds/priority_queue_tag_cd.svg new file mode 100644 index 00000000000..be007aecb8d --- /dev/null +++ b/libstdc++-v3/doc/html/ext/pb_ds/priority_queue_tag_cd.svg @@ -0,0 +1,368 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + Benjamin Kosnik + + + + + + + + + pairing_heap_tag + bionomial_heap_tag + + priority_queue_tag + + + rc_binomial_heap_tag + + binary_heap_tag + + + thin_heap_tag + + + + diff --git a/libstdc++-v3/doc/html/ext/pb_ds/priority_queue_text_join_timing_test.html b/libstdc++-v3/doc/html/ext/pb_ds/priority_queue_text_join_timing_test.html new file mode 100644 index 00000000000..4710ea96bcf --- /dev/null +++ b/libstdc++-v3/doc/html/ext/pb_ds/priority_queue_text_join_timing_test.html @@ -0,0 +1,141 @@ + + + + + +Priority Queue Text Join Timing Test + + + +
+

Priority Queue Text join Timing Test

+

Description

+

This test inserts a number of values with keys from an + arbitrary text ([ wickland96thirty ]) into + two containers, then merges the containers. It uses + join for pb_ds's priority queues; for the + STL's priority queues, it successively pops values from one + container and pushes them into the other. The test measures the + average time as a function of the number of values.

+

(The test was executed with priority_queue_text_join_timing_test + thirty_years_among_the_dead_preproc.txt 200 200 2100)

+

Purpose

+

The test checks the effect of different underlying + data structures (see Design::Priority + Queues::Implementations).

+

Results

+

Figures NPG, NPM, and + NPL show the results for the native priority + queues and pb_ds 's priority queues in g++, msvc, and local, + respectively.

+
+
+
+
+
no image
NPG: Native tree and pb ds priority queue push timing test - g++

In the above figure, the names in the legends have the following meaning:

+
    +
  1. +n_pq_deque- +std::priority_queue adapting std::deque
  2. +
  3. +n_pq_vector- +std::priority_queue adapting std::vector
  4. +
  5. +binary_heap- +priority_queue + with Tag = binary_heap_tag +
  6. +
  7. +thin_heap- +priority_queue + with Tag = thin_heap_tag +
  8. +
  9. +rc_binomial_heap- +priority_queue + with Tag = rc_binomial_heap_tag +
  10. +
  11. +pairing_heap- +priority_queue + with Tag = pairing_heap_tag +
  12. +
  13. +binomial_heap- +priority_queue + with Tag = binomial_heap_tag +
  14. +
+
+
+
+
+
+
+
+
+
+
no image
NPM: Native tree and pb ds priority queue push timing test - msvc++

In the above figure, the names in the legends have the following meaning:

+
    +
  1. +n_pq_deque- +std::priority_queue adapting std::deque
  2. +
  3. +n_pq_vector- +std::priority_queue adapting std::vector
  4. +
  5. +binary_heap- +priority_queue + with Tag = binary_heap_tag +
  6. +
  7. +thin_heap- +priority_queue + with Tag = thin_heap_tag +
  8. +
  9. +rc_binomial_heap- +priority_queue + with Tag = rc_binomial_heap_tag +
  10. +
  11. +pairing_heap- +priority_queue + with Tag = pairing_heap_tag +
  12. +
  13. +binomial_heap- +priority_queue + with Tag = binomial_heap_tag +
  14. +
+
+
+
+
+
+
+
+
+
+
no image
NPL: Native tree and pb ds priority queue push timing test - local
+
+
+
+
+

Observations

+

In this test the node-based heaps perform join in + either logarithmic or constant time. The binary heap requires + linear time, since the well-known heapify algorithm [clrs2001] is linear.

+

It would be possible to apply the heapify algorithm to the + STL containers, if they would support iteration (which they + don't). Barring iterators, it is still somehow possible to + perform linear-time merge on a std::vector-based STL + priority queue, using top() and size() (since + they are enough to expose the underlying array), but this is + impossible for a std::deque-based STL priority queue. + Without heapify, the cost is super-linear.

+
+ + diff --git a/libstdc++-v3/doc/html/ext/pb_ds/priority_queue_text_join_timing_test_gcc.png b/libstdc++-v3/doc/html/ext/pb_ds/priority_queue_text_join_timing_test_gcc.png new file mode 100644 index 00000000000..a48bb358605 Binary files /dev/null and b/libstdc++-v3/doc/html/ext/pb_ds/priority_queue_text_join_timing_test_gcc.png differ diff --git a/libstdc++-v3/doc/html/ext/pb_ds/priority_queue_text_join_timing_test_local.png b/libstdc++-v3/doc/html/ext/pb_ds/priority_queue_text_join_timing_test_local.png new file mode 100644 index 00000000000..1701b4d8a61 Binary files /dev/null and b/libstdc++-v3/doc/html/ext/pb_ds/priority_queue_text_join_timing_test_local.png differ diff --git a/libstdc++-v3/doc/html/ext/pb_ds/priority_queue_text_join_timing_test_msvc.png b/libstdc++-v3/doc/html/ext/pb_ds/priority_queue_text_join_timing_test_msvc.png new file mode 100644 index 00000000000..0575b99c0c3 Binary files /dev/null and b/libstdc++-v3/doc/html/ext/pb_ds/priority_queue_text_join_timing_test_msvc.png differ diff --git a/libstdc++-v3/doc/html/ext/pb_ds/priority_queue_text_modify_down_timing_test.html b/libstdc++-v3/doc/html/ext/pb_ds/priority_queue_text_modify_down_timing_test.html new file mode 100644 index 00000000000..6935957207c --- /dev/null +++ b/libstdc++-v3/doc/html/ext/pb_ds/priority_queue_text_modify_down_timing_test.html @@ -0,0 +1,204 @@ + + + + + +Priority Queue Text Modify (Down) Timing Test + + + +
+

Priority Queue Text modify Timing Test - II

+

Description

+

This test inserts a number of values with keys from an + arbitrary text ([ wickland96thirty ]) into + into a container then modifies each one "down" (i.e., it + makes it smaller). It uses modify for pb_ds's + priority queues; for the STL's priority queues, it pops values + from a container until it reaches the value that should be + modified, then pushes values back in. It measures the average + time for modify as a function of the number of + values.

+

(The test was executed with priority_queue_text_modify_down_timing_test + thirty_years_among_the_dead_preproc.txt 200 200 2100 f)

+

Purpose

+

The main purpose of this test is to contrast Priority Queue + Text modify Timing Test - I.

+

Results

+

Figures NPG, NPM, and + NPL show the results for the native priority + queues and pb_ds 's priority queues in g++, msvc++, and + local, + respectively; Figures NRTG, NRTM, and NRTL show the results + for the pairing heap and thin heaps in g++, msvc++, and + local, + respectively,

+
+
+
+
+
no image
NPG: Native and pb ds priority queue modify timing test - g++

In the above figure, the names in the legends have the following meaning:

+
    +
  1. +n_pq_deque- +std::priority_queue adapting std::deque
  2. +
  3. +n_pq_vector- +std::priority_queue adapting std::vector
  4. +
  5. +binary_heap- +priority_queue + with Tag = binary_heap_tag +
  6. +
  7. +thin_heap- +priority_queue + with Tag = thin_heap_tag +
  8. +
  9. +rc_binomial_heap- +priority_queue + with Tag = rc_binomial_heap_tag +
  10. +
  11. +binomial_heap- +priority_queue + with Tag = binomial_heap_tag +
  12. +
  13. +pairing_heap- +priority_queue + with Tag = pairing_heap_tag +
  14. +
+
+
+
+
+
+
+
+
+
+
no image
NPM: Native and pb ds priority queue modify timing test - msvc++

In the above figure, the names in the legends have the following meaning:

+
    +
  1. +n_pq_deque- +std::priority_queue adapting std::deque
  2. +
  3. +n_pq_vector- +std::priority_queue adapting std::vector
  4. +
  5. +binary_heap- +priority_queue + with Tag = binary_heap_tag +
  6. +
  7. +thin_heap- +priority_queue + with Tag = thin_heap_tag +
  8. +
  9. +rc_binomial_heap- +priority_queue + with Tag = rc_binomial_heap_tag +
  10. +
  11. +binomial_heap- +priority_queue + with Tag = binomial_heap_tag +
  12. +
  13. +pairing_heap- +priority_queue + with Tag = pairing_heap_tag +
  14. +
+
+
+
+
+
+
+
+
+
+
no image
NPL: Native and pb ds priority queue modify timing test - local
+
+
+
+
+
+
+
+
+
no image
NRTG: Pairing and thin priority queue modify timing test - g++

In the above figure, the names in the legends have the following meaning:

+
    +
  1. +thin_heap- +priority_queue + with Tag = thin_heap_tag +
  2. +
  3. +pairing_heap- +priority_queue + with Tag = pairing_heap_tag +
  4. +
+
+
+
+
+
+
+
+
+
+
no image
NRTM: Pairing and thin priority queue modify timing test - msvc++

In the above figure, the names in the legends have the following meaning:

+
    +
  1. +thin_heap- +priority_queue + with Tag = thin_heap_tag +
  2. +
  3. +pairing_heap- +priority_queue + with Tag = pairing_heap_tag +
  4. +
+
+
+
+
+
+
+
+
+
+
no image
NRTL: Pairing and thin priority queue modify timing test - local
+
+
+
+
+

Observations

+

Most points in these results are similar to Priority Queue + Text modify Timing Test - I.

+

It is interesting to note, however, that as opposed to that + test, a thin heap (priority_queue with + Tag = thin_heap_tag) is + outperformed by a pairing heap (priority_queue with + Tag = pairing_heap_tag). + In this case, both heaps essentially perform an erase + operation followed by a push operation. As the other + tests show, a pairing heap is usually far more efficient than a + thin heap, so this is not surprising.

+

Most algorithms that involve priority queues increase values + (in the sense of the priority queue's comparison functor), and + so Priority Queue + Text modify Timing Test - I is more interesting + than this test.

+
+ + diff --git a/libstdc++-v3/doc/html/ext/pb_ds/priority_queue_text_modify_down_timing_test_gcc.png b/libstdc++-v3/doc/html/ext/pb_ds/priority_queue_text_modify_down_timing_test_gcc.png new file mode 100644 index 00000000000..74cbc652369 Binary files /dev/null and b/libstdc++-v3/doc/html/ext/pb_ds/priority_queue_text_modify_down_timing_test_gcc.png differ diff --git a/libstdc++-v3/doc/html/ext/pb_ds/priority_queue_text_modify_down_timing_test_local.png b/libstdc++-v3/doc/html/ext/pb_ds/priority_queue_text_modify_down_timing_test_local.png new file mode 100644 index 00000000000..2fa9c798804 Binary files /dev/null and b/libstdc++-v3/doc/html/ext/pb_ds/priority_queue_text_modify_down_timing_test_local.png differ diff --git a/libstdc++-v3/doc/html/ext/pb_ds/priority_queue_text_modify_down_timing_test_msvc.png b/libstdc++-v3/doc/html/ext/pb_ds/priority_queue_text_modify_down_timing_test_msvc.png new file mode 100644 index 00000000000..20b66373667 Binary files /dev/null and b/libstdc++-v3/doc/html/ext/pb_ds/priority_queue_text_modify_down_timing_test_msvc.png differ diff --git a/libstdc++-v3/doc/html/ext/pb_ds/priority_queue_text_modify_down_timing_test_pairing_thin_gcc.png b/libstdc++-v3/doc/html/ext/pb_ds/priority_queue_text_modify_down_timing_test_pairing_thin_gcc.png new file mode 100644 index 00000000000..ca901831eff Binary files /dev/null and b/libstdc++-v3/doc/html/ext/pb_ds/priority_queue_text_modify_down_timing_test_pairing_thin_gcc.png differ diff --git a/libstdc++-v3/doc/html/ext/pb_ds/priority_queue_text_modify_down_timing_test_pairing_thin_local.png b/libstdc++-v3/doc/html/ext/pb_ds/priority_queue_text_modify_down_timing_test_pairing_thin_local.png new file mode 100644 index 00000000000..977d167186c Binary files /dev/null and b/libstdc++-v3/doc/html/ext/pb_ds/priority_queue_text_modify_down_timing_test_pairing_thin_local.png differ diff --git a/libstdc++-v3/doc/html/ext/pb_ds/priority_queue_text_modify_down_timing_test_pairing_thin_msvc.png b/libstdc++-v3/doc/html/ext/pb_ds/priority_queue_text_modify_down_timing_test_pairing_thin_msvc.png new file mode 100644 index 00000000000..bf68bf99292 Binary files /dev/null and b/libstdc++-v3/doc/html/ext/pb_ds/priority_queue_text_modify_down_timing_test_pairing_thin_msvc.png differ diff --git a/libstdc++-v3/doc/html/ext/pb_ds/priority_queue_text_modify_up_timing_test.html b/libstdc++-v3/doc/html/ext/pb_ds/priority_queue_text_modify_up_timing_test.html new file mode 100644 index 00000000000..3db4639baa6 --- /dev/null +++ b/libstdc++-v3/doc/html/ext/pb_ds/priority_queue_text_modify_up_timing_test.html @@ -0,0 +1,222 @@ + + + + + +Priority Queue Text Modify (Up) Timing Test + + + +
+

Priority Queue Text modify Timing Test - I

+

Description

+

This test inserts a number of values with keys from an + arbitrary text ([ wickland96thirty ]) into + into a container then modifies each one "up" (i.e., it + makes it larger). It uses modify for pb_ds's + priority queues; for the STL's priority queues, it pops values + from a container until it reaches the value that should be + modified, then pushes values back in. It measures the average + time for modify as a function of the number of + values.

+

(The test was executed with priority_queue_text_modify_up_timing_test + thirty_years_among_the_dead_preproc.txt 200 200 2100 t)

+

Purpose

+

The test checks the effect of different underlying + data structures (see Design::Priority + Queues::Implementations) for graph algorithms settings. + Note that making an arbitrary value larger (in the sense of the + priority queue's comparison functor) corresponds to + decrease-key in standard graph algorithms [clrs2001].

+

Results

+

Figures NPG, NPM, and + NPL show the results for the native priority + queues and pb_ds 's priority queues in g++, msvc++, and + local, + respectively; Figures NRTG, NRTM, and NRTL show the results + for the pairing heap and thin heaps in g++, msvc++, and + local, + respectively,

+
+
+
+
+
no image
NPG: Native and pb ds priority queue modify timing test - g++

In the above figure, the names in the legends have the following meaning:

+
    +
  1. +n_pq_deque- +std::priority_queue adapting std::deque
  2. +
  3. +n_pq_vector- +std::priority_queue adapting std::vector
  4. +
  5. +binary_heap- +priority_queue + with Tag = binary_heap_tag +
  6. +
  7. +rc_binomial_heap- +priority_queue + with Tag = rc_binomial_heap_tag +
  8. +
  9. +pairing_heap- +priority_queue + with Tag = pairing_heap_tag +
  10. +
  11. +binomial_heap- +priority_queue + with Tag = binomial_heap_tag +
  12. +
  13. +thin_heap- +priority_queue + with Tag = thin_heap_tag +
  14. +
+
+
+
+
+
+
+
+
+
+
no image
NPM: Native and pb ds priority queue modify timing test - msvc++

In the above figure, the names in the legends have the following meaning:

+
    +
  1. +n_pq_deque- +std::priority_queue adapting std::deque
  2. +
  3. +n_pq_vector- +std::priority_queue adapting std::vector
  4. +
  5. +binary_heap- +priority_queue + with Tag = binary_heap_tag +
  6. +
  7. +rc_binomial_heap- +priority_queue + with Tag = rc_binomial_heap_tag +
  8. +
  9. +pairing_heap- +priority_queue + with Tag = pairing_heap_tag +
  10. +
  11. +binomial_heap- +priority_queue + with Tag = binomial_heap_tag +
  12. +
  13. +thin_heap- +priority_queue + with Tag = thin_heap_tag +
  14. +
+
+
+
+
+
+
+
+
+
+
no image
NPL: Native and pb ds priority queue modify timing test - local
+
+
+
+
+
+
+
+
+
no image
NRTG: Pairing and thin priority queue modify timing test - g++

In the above figure, the names in the legends have the following meaning:

+
    +
  1. +pairing_heap- +priority_queue + with Tag = pairing_heap_tag +
  2. +
  3. +thin_heap- +priority_queue + with Tag = thin_heap_tag +
  4. +
+
+
+
+
+
+
+
+
+
+
no image
NRTM: Pairing and thin priority queue modify timing test - msvc++

In the above figure, the names in the legends have the following meaning:

+
    +
  1. +pairing_heap- +priority_queue + with Tag = pairing_heap_tag +
  2. +
  3. +thin_heap- +priority_queue + with Tag = thin_heap_tag +
  4. +
+
+
+
+
+
+
+
+
+
+
no image
NRTL: Pairing and thin priority queue modify timing test - local
+
+
+
+
+

Observations

+

As noted above, increasing an arbitrary value (in the sense + of the priority queue's comparison functor) is very common in + graph-related algorithms. In this case, a thin heap (priority_queue with + Tag = thin_heap_tag) + outperforms a pairing heap (priority_queue with + Tag = pairing_heap_tag). + Conversely, Priority Queue Text + push Timing Test, Priority Queue + Text push and pop Timing Test, Priority + Queue Random Integer push Timing Test, and + Priority + Queue Random Integer push and pop Timing + Test show that the situation is reversed for other + operations. It is not clear when to prefer one of these two + different types.

+

In this test pb_ds's binary heaps effectively + perform modify in linear time. As explained in Priority Queue Design::Traits, + given a valid point-type iterator, a binary heap can perform + modify logarithmically. The problem is that binary + heaps invalidate their find iterators with each modifying + operation, and so the only way to obtain a valid point-type + iterator is to iterate using a range-type iterator until + finding the appropriate value, then use the range-type iterator + for the modify operation.

+

The explanation for the STL's priority queues' performance + is similar to that in Priority Queue Text + join Timing Test.

+

Priority-Queue + Performance Tests::Observations discusses this further and + summarizes.

+
+ + diff --git a/libstdc++-v3/doc/html/ext/pb_ds/priority_queue_text_modify_up_timing_test_gcc.png b/libstdc++-v3/doc/html/ext/pb_ds/priority_queue_text_modify_up_timing_test_gcc.png new file mode 100644 index 00000000000..d9dedc20cf4 Binary files /dev/null and b/libstdc++-v3/doc/html/ext/pb_ds/priority_queue_text_modify_up_timing_test_gcc.png differ diff --git a/libstdc++-v3/doc/html/ext/pb_ds/priority_queue_text_modify_up_timing_test_local.png b/libstdc++-v3/doc/html/ext/pb_ds/priority_queue_text_modify_up_timing_test_local.png new file mode 100644 index 00000000000..31575b452d3 Binary files /dev/null and b/libstdc++-v3/doc/html/ext/pb_ds/priority_queue_text_modify_up_timing_test_local.png differ diff --git a/libstdc++-v3/doc/html/ext/pb_ds/priority_queue_text_modify_up_timing_test_msvc.png b/libstdc++-v3/doc/html/ext/pb_ds/priority_queue_text_modify_up_timing_test_msvc.png new file mode 100644 index 00000000000..4005547c812 Binary files /dev/null and b/libstdc++-v3/doc/html/ext/pb_ds/priority_queue_text_modify_up_timing_test_msvc.png differ diff --git a/libstdc++-v3/doc/html/ext/pb_ds/priority_queue_text_modify_up_timing_test_pairing_thin_gcc.png b/libstdc++-v3/doc/html/ext/pb_ds/priority_queue_text_modify_up_timing_test_pairing_thin_gcc.png new file mode 100644 index 00000000000..1aa5aba94bf Binary files /dev/null and b/libstdc++-v3/doc/html/ext/pb_ds/priority_queue_text_modify_up_timing_test_pairing_thin_gcc.png differ diff --git a/libstdc++-v3/doc/html/ext/pb_ds/priority_queue_text_modify_up_timing_test_pairing_thin_local.png b/libstdc++-v3/doc/html/ext/pb_ds/priority_queue_text_modify_up_timing_test_pairing_thin_local.png new file mode 100644 index 00000000000..b878dde665c Binary files /dev/null and b/libstdc++-v3/doc/html/ext/pb_ds/priority_queue_text_modify_up_timing_test_pairing_thin_local.png differ diff --git a/libstdc++-v3/doc/html/ext/pb_ds/priority_queue_text_modify_up_timing_test_pairing_thin_msvc.png b/libstdc++-v3/doc/html/ext/pb_ds/priority_queue_text_modify_up_timing_test_pairing_thin_msvc.png new file mode 100644 index 00000000000..740594384cb Binary files /dev/null and b/libstdc++-v3/doc/html/ext/pb_ds/priority_queue_text_modify_up_timing_test_pairing_thin_msvc.png differ diff --git a/libstdc++-v3/doc/html/ext/pb_ds/priority_queue_text_pop_mem_usage_test.html b/libstdc++-v3/doc/html/ext/pb_ds/priority_queue_text_pop_mem_usage_test.html new file mode 100644 index 00000000000..8b5388e1770 --- /dev/null +++ b/libstdc++-v3/doc/html/ext/pb_ds/priority_queue_text_pop_mem_usage_test.html @@ -0,0 +1,143 @@ + + + + + +Priority Queue Text Pop Memory Use Test + + + +
+

Priority Queue Text pop Memory Use Test

+

Description

+

This test inserts a number of values with keys from an + arbitrary text ([ wickland96thirty ]) into + a container, then pops them until only one is left in the + container. It measures the memory use as a function of the + number of values pushed to the container.

+

(The test was executed with priority_queue_text_pop_mem_usage_test + thirty_years_among_the_dead_preproc.txt 200 200 2100)

+

Purpose

+

The test checks the effect of different underlying + data structures (see Design::Priority + Queues::Implementations).

+

Results

+

Figures NPG, NPM, and + NPL show the results for the native priority + queues and pb_ds 's priority queues in g++, msvc++, and + local, + respectively.

+
+
+
+
+
no image
NPG: Native and pb ds priority queue pop memory-use test - g++

In the above figure, the names in the legends have the following meaning:

+
    +
  1. +n_pq_vector- +std::priority_queue adapting std::vector
  2. +
  3. +n_pq_deque- +std::priority_queue adapting std::deque
  4. +
  5. +binary_heap- +priority_queue + with Tag = binary_heap_tag +
  6. +
  7. +thin_heap- +priority_queue + with Tag = thin_heap_tag +
  8. +
  9. +binomial_heap- +priority_queue + with Tag = binomial_heap_tag +
  10. +
  11. +rc_binomial_heap- +priority_queue + with Tag = rc_binomial_heap_tag +
  12. +
  13. +pairing_heap- +priority_queue + with Tag = pairing_heap_tag +
  14. +
+
+
+
+
+
+
+
+
+
+
no image
NPM: Native and pb ds priority queue pop memory-use test - msvc++

In the above figure, the names in the legends have the following meaning:

+
    +
  1. +n_pq_vector- +std::priority_queue adapting std::vector
  2. +
  3. +n_pq_deque- +std::priority_queue adapting std::deque
  4. +
  5. +binary_heap- +priority_queue + with Tag = binary_heap_tag +
  6. +
  7. +thin_heap- +priority_queue + with Tag = thin_heap_tag +
  8. +
  9. +binomial_heap- +priority_queue + with Tag = binomial_heap_tag +
  10. +
  11. +rc_binomial_heap- +priority_queue + with Tag = rc_binomial_heap_tag +
  12. +
  13. +pairing_heap- +priority_queue + with Tag = pairing_heap_tag +
  14. +
+
+
+
+
+
+
+
+
+
+
no image
NPL: Native and pb ds priority queue pop memory-use test - local
+
+
+
+
+

Observations

+

The priority queue implementations (excluding the STL's) use + memory proportionally to the number of values they hold: + node-based implementations (e.g., a pairing heap) do so + naturally; pb_ds's binary heap de-allocates memory when + a certain lower threshold is exceeded.

+

Note from Priority Queue + Text push and pop Timing Test and + Priority + Queue Random Integer push and pop Timing + Test that this does not impede performance compared to the + STL's priority queues.

+

(See Hash-Based Erase + Memory Use Test for a similar phenomenon regarding priority + queues.)

+
+ + diff --git a/libstdc++-v3/doc/html/ext/pb_ds/priority_queue_text_pop_mem_usage_test_gcc.png b/libstdc++-v3/doc/html/ext/pb_ds/priority_queue_text_pop_mem_usage_test_gcc.png new file mode 100644 index 00000000000..2c1918d0623 Binary files /dev/null and b/libstdc++-v3/doc/html/ext/pb_ds/priority_queue_text_pop_mem_usage_test_gcc.png differ diff --git a/libstdc++-v3/doc/html/ext/pb_ds/priority_queue_text_pop_mem_usage_test_local.png b/libstdc++-v3/doc/html/ext/pb_ds/priority_queue_text_pop_mem_usage_test_local.png new file mode 100644 index 00000000000..c1413fc93d6 Binary files /dev/null and b/libstdc++-v3/doc/html/ext/pb_ds/priority_queue_text_pop_mem_usage_test_local.png differ diff --git a/libstdc++-v3/doc/html/ext/pb_ds/priority_queue_text_pop_mem_usage_test_msvc.png b/libstdc++-v3/doc/html/ext/pb_ds/priority_queue_text_pop_mem_usage_test_msvc.png new file mode 100644 index 00000000000..9717f498b7a Binary files /dev/null and b/libstdc++-v3/doc/html/ext/pb_ds/priority_queue_text_pop_mem_usage_test_msvc.png differ diff --git a/libstdc++-v3/doc/html/ext/pb_ds/priority_queue_text_push_pop_timing_test.html b/libstdc++-v3/doc/html/ext/pb_ds/priority_queue_text_push_pop_timing_test.html new file mode 100644 index 00000000000..02fe32183a4 --- /dev/null +++ b/libstdc++-v3/doc/html/ext/pb_ds/priority_queue_text_push_pop_timing_test.html @@ -0,0 +1,209 @@ + + + + + +Priority Queue Text Push Pop Timing Test + + + +
+

Priority Queue Text push and pop Timing + Test

+

Description

+

This test inserts a number of values with keys from an + arbitrary text ([ wickland96thirty ]) into + a container using push , then removes them using + pop . It measures the average time for push + as a function of the number of values.

+

(The test was executed with + priority_queue_text_push_pop_timing_test + thirty_years_among_the_dead_preproc.txt 200 200 2100)

+

Purpose

+

The test checks the effect of different underlying + data structures (see Design::Priority + Queues::Implementations).

+

Results

+

Figures NPG, NPM, and + NPL show the results for the native priority + queues and pb_ds 's priority queues in g++, msvc++, and + local, + respectively; Figures NBRG, NBRM, and NBRL show the results + for the native priority queues and pb_ds's pairing + queues in g++, msvc++, and + local, + respectively.

+
+
+
+
+
no image
NPG: Native tree and pb ds priority queue push and pop timing test - g++

In the above figure, the names in the legends have the following meaning:

+
    +
  1. +n_pq_vector- +std::priority_queue adapting std::vector
  2. +
  3. +n_pq_deque- +std::priority_queue adapting std::deque
  4. +
  5. +thin_heap- +priority_queue + with Tag = thin_heap_tag +
  6. +
  7. +rc_binomial_heap- +priority_queue + with Tag = rc_binomial_heap_tag +
  8. +
  9. +binomial_heap- +priority_queue + with Tag = binomial_heap_tag +
  10. +
  11. +binary_heap- +priority_queue + with Tag = binary_heap_tag +
  12. +
  13. +pairing_heap- +priority_queue + with Tag = pairing_heap_tag +
  14. +
+
+
+
+
+
+
+
+
+
+
no image
NPM: Native tree and pb ds priority queue push and pop timing test - msvc++

In the above figure, the names in the legends have the following meaning:

+
    +
  1. +n_pq_deque- +std::priority_queue adapting std::deque
  2. +
  3. +n_pq_vector- +std::priority_queue adapting std::vector
  4. +
  5. +thin_heap- +priority_queue + with Tag = thin_heap_tag +
  6. +
  7. +rc_binomial_heap- +priority_queue + with Tag = rc_binomial_heap_tag +
  8. +
  9. +binomial_heap- +priority_queue + with Tag = binomial_heap_tag +
  10. +
  11. +pairing_heap- +priority_queue + with Tag = pairing_heap_tag +
  12. +
  13. +binary_heap- +priority_queue + with Tag = binary_heap_tag +
  14. +
+
+
+
+
+
+
+
+
+
+
no image
NPL: Native tree and pb ds priority queue push and pop timing test - local
+
+
+
+
+
+
+
+
+
no image
NBRG: Native tree and pb ds pairing priority queue push and pop timing test - g++

In the above figure, the names in the legends have the following meaning:

+
    +
  1. +n_pq_vector- +std::priority_queue adapting std::vector
  2. +
  3. +n_pq_deque- +std::priority_queue adapting std::deque
  4. +
  5. +pairing_heap- +priority_queue + with Tag = pairing_heap_tag +
  6. +
+
+
+
+
+
+
+
+
+
+
no image
NBRM: Native tree and pb ds pairing priority queue push and pop timing test - msvc++

In the above figure, the names in the legends have the following meaning:

+
    +
  1. +n_pq_deque- +std::priority_queue adapting std::deque
  2. +
  3. +n_pq_vector- +std::priority_queue adapting std::vector
  4. +
  5. +pairing_heap- +priority_queue + with Tag = pairing_heap_tag +
  6. +
+
+
+
+
+
+
+
+
+
+
no image
NBRL: Native tree and pb ds pairing priority queue push and pop timing test - local
+
+
+
+
+

Observations

+

These results are very similar to Priority Queue Text + push Timing Test. As stated there, pairing heaps + (priority_queue with + Tag = pairing_heap_tag) + are most suited for push and pop sequences of + non-primitive types such as strings. Observing these two tests, + one can note that a pairing heap outperforms the others in + terms of push operations, but equals binary heaps + (priority_queue with + Tag = binary_heap_tag) if + the number of push and pop operations is + equal. As the number of pop operations is at most + equal to the number of push operations, pairing heaps + are better in this case. See Priority + Queue Random Integer push and pop Timing + Test for a case which is different.

+

Priority-Queue + Performance Tests::Observations discusses this further and + summarizes.

+
+ + diff --git a/libstdc++-v3/doc/html/ext/pb_ds/priority_queue_text_push_pop_timing_test_gcc.png b/libstdc++-v3/doc/html/ext/pb_ds/priority_queue_text_push_pop_timing_test_gcc.png new file mode 100644 index 00000000000..d4886ae5967 Binary files /dev/null and b/libstdc++-v3/doc/html/ext/pb_ds/priority_queue_text_push_pop_timing_test_gcc.png differ diff --git a/libstdc++-v3/doc/html/ext/pb_ds/priority_queue_text_push_pop_timing_test_local.png b/libstdc++-v3/doc/html/ext/pb_ds/priority_queue_text_push_pop_timing_test_local.png new file mode 100644 index 00000000000..a7c5f8987ae Binary files /dev/null and b/libstdc++-v3/doc/html/ext/pb_ds/priority_queue_text_push_pop_timing_test_local.png differ diff --git a/libstdc++-v3/doc/html/ext/pb_ds/priority_queue_text_push_pop_timing_test_msvc.png b/libstdc++-v3/doc/html/ext/pb_ds/priority_queue_text_push_pop_timing_test_msvc.png new file mode 100644 index 00000000000..a5720402b3b Binary files /dev/null and b/libstdc++-v3/doc/html/ext/pb_ds/priority_queue_text_push_pop_timing_test_msvc.png differ diff --git a/libstdc++-v3/doc/html/ext/pb_ds/priority_queue_text_push_timing_test.html b/libstdc++-v3/doc/html/ext/pb_ds/priority_queue_text_push_timing_test.html new file mode 100644 index 00000000000..67ae4b9d510 --- /dev/null +++ b/libstdc++-v3/doc/html/ext/pb_ds/priority_queue_text_push_timing_test.html @@ -0,0 +1,219 @@ + + + + + +Priority Queue Text Push Timing Test + + + +
+

Priority Queue Text push Timing Test

+

Description

+

This test inserts a number of values with keys from an + arbitrary text ([ wickland96thirty ]) into + a container using push . It measures the average time + for push as a function of the number of values + pushed.

+

(The test was executed with priority_queue_text_push_timing_test + thirty_years_among_the_dead_preproc.txt 200 200 2100)

+

Purpose

+

The test checks the effect of different underlying + data structures (see Design::Priority + Queues::Implementations).

+

Results

+

Figures NPG, NPM, and + NPL show the results for the native priority + queues and pb_ds 's priority queues in g++, msvc++, and + local, + respectively; Figures NBRG, NBRM, and NBRL shows the + results for the binary-heap based native priority queues and + pb_ds's pairing-heap priority queues in g++, msvc++, and + local, + respectively

+
+
+
+
+
no image
NPG: Native and pb ds priority queue push timing test - g++

In the above figure, the names in the legends have the following meaning:

+
    +
  1. +n_pq_vector- +std::priority_queue adapting std::vector
  2. +
  3. +n_pq_deque- +std::priority_queue adapting std::deque
  4. +
  5. +binary_heap- +priority_queue + with Tag = binary_heap_tag +
  6. +
  7. +rc_binomial_heap- +priority_queue + with Tag = rc_binomial_heap_tag +
  8. +
  9. +thin_heap- +priority_queue + with Tag = thin_heap_tag +
  10. +
  11. +binomial_heap- +priority_queue + with Tag = binomial_heap_tag +
  12. +
  13. +pairing_heap- +priority_queue + with Tag = pairing_heap_tag +
  14. +
+
+
+
+
+
+
+
+
+
+
no image
NPM: Native and pb ds priority queue push timing test - msvc++

In the above figure, the names in the legends have the following meaning:

+
    +
  1. +n_pq_deque- +std::priority_queue adapting std::deque
  2. +
  3. +rc_binomial_heap- +priority_queue + with Tag = rc_binomial_heap_tag +
  4. +
  5. +binary_heap- +priority_queue + with Tag = binary_heap_tag +
  6. +
  7. +binomial_heap- +priority_queue + with Tag = binomial_heap_tag +
  8. +
  9. +n_pq_vector- +std::priority_queue adapting std::vector
  10. +
  11. +pairing_heap- +priority_queue + with Tag = pairing_heap_tag +
  12. +
  13. +thin_heap- +priority_queue + with Tag = thin_heap_tag +
  14. +
+
+
+
+
+
+
+
+
+
+
no image
NPL: Native and pb ds priority queue push timing test - local
+
+
+
+
+
+
+
+
+
no image
NBRG: Native and pb ds pairing priority queue push timing test - g++

In the above figure, the names in the legends have the following meaning:

+
    +
  1. +n_pq_vector- +std::priority_queue adapting std::vector
  2. +
  3. +n_pq_deque- +std::priority_queue adapting std::deque
  4. +
  5. +thin_heap- +priority_queue + with Tag = thin_heap_tag +
  6. +
  7. +pairing_heap- +priority_queue + with Tag = pairing_heap_tag +
  8. +
+
+
+
+
+
+
+
+
+
+
no image
NBRM: Native and pb ds pairing priority queue push timing test - msvc++

In the above figure, the names in the legends have the following meaning:

+
    +
  1. +n_pq_deque- +std::priority_queue adapting std::deque
  2. +
  3. +n_pq_vector- +std::priority_queue adapting std::vector
  4. +
  5. +pairing_heap- +priority_queue + with Tag = pairing_heap_tag +
  6. +
  7. +thin_heap- +priority_queue + with Tag = thin_heap_tag +
  8. +
+
+
+
+
+
+
+
+
+
+
no image
NBRL: Native and pb ds pairing priority queue push timing test - local
+
+
+
+
+

Observations

+

Pairing heaps (priority_queue with + Tag = pairing_heap_tag) + are the most suited for sequences of push and + pop operations of non-primitive types (e.g. +std::strings). (see also Priority Queue + Text push and pop Timing Test.) They are + less constrained than binomial heaps, e.g., and since + they are node-based, they outperform binary heaps. (See + Priority + Queue Random Integer push Timing Test for the case + of primitive types.)

+

The STL's priority queues do not seem to perform well in + this case: the std::vector implementation needs to + perform a logarithmic sequence of string operations for each + operation, and the deque implementation is possibly hampered by + its need to manipulate a relatively-complex type (deques + support a O(1) push_front, even though it is + not used by std::priority_queue.)

+

Priority-Queue + Performance Tests::Observations discusses this further and + summarizes.

+
+ + diff --git a/libstdc++-v3/doc/html/ext/pb_ds/priority_queue_text_push_timing_test_gcc.png b/libstdc++-v3/doc/html/ext/pb_ds/priority_queue_text_push_timing_test_gcc.png new file mode 100644 index 00000000000..8895f507cfc Binary files /dev/null and b/libstdc++-v3/doc/html/ext/pb_ds/priority_queue_text_push_timing_test_gcc.png differ diff --git a/libstdc++-v3/doc/html/ext/pb_ds/priority_queue_text_push_timing_test_local.png b/libstdc++-v3/doc/html/ext/pb_ds/priority_queue_text_push_timing_test_local.png new file mode 100644 index 00000000000..da7297bffa9 Binary files /dev/null and b/libstdc++-v3/doc/html/ext/pb_ds/priority_queue_text_push_timing_test_local.png differ diff --git a/libstdc++-v3/doc/html/ext/pb_ds/priority_queue_text_push_timing_test_msvc.png b/libstdc++-v3/doc/html/ext/pb_ds/priority_queue_text_push_timing_test_msvc.png new file mode 100644 index 00000000000..ff39ca37dd9 Binary files /dev/null and b/libstdc++-v3/doc/html/ext/pb_ds/priority_queue_text_push_timing_test_msvc.png differ diff --git a/libstdc++-v3/doc/html/ext/pb_ds/quadratic_probe_fn.html b/libstdc++-v3/doc/html/ext/pb_ds/quadratic_probe_fn.html new file mode 100644 index 00000000000..f3209d33881 --- /dev/null +++ b/libstdc++-v3/doc/html/ext/pb_ds/quadratic_probe_fn.html @@ -0,0 +1,141 @@ + + + + + + + quadratic_probe_fn Interface + + + + +
+

quadratic_probe_fn Interface

+ +

A probe sequence policy using square increments.

+ +

Defined in: hash_policy.hpp

+ +

Template Parameters

+ + + + + + + + + + + + + + + + + +
ParameterDescriptionDefault Value
+
+typename Size_Type 
+
+
+

Size type.

+
size_t
+ +

Public Types and + Constants

+ +

General Definitions

+ + + + + + + + + + + + + + + + + +
TypeDefinitionDescription
+
+size_type
+
+
+
+Size_Type
+
+
+

Size type.

+
+ +

Public Methods

+ +

Constructors, Destructor, and + Related

+ + + + + + + + + + + + + +
MethodDescription
+
+void
+  swap
+  (quadratic_probe_fn &other)
+
+
+

Swaps content.

+
+ +

Protected Methods

+ +

Offset Methods

+ + + + + + + + + + + + + +
MethodDescription
+
+inline size_type
+  operator()
+  (size_type i) const
+
+
+

Returns the i-th + offset from the hash value.

+
+
+ + diff --git a/libstdc++-v3/doc/html/ext/pb_ds/random_int_find_find_timing_test_tree_gcc.png b/libstdc++-v3/doc/html/ext/pb_ds/random_int_find_find_timing_test_tree_gcc.png new file mode 100644 index 00000000000..61962704f71 Binary files /dev/null and b/libstdc++-v3/doc/html/ext/pb_ds/random_int_find_find_timing_test_tree_gcc.png differ diff --git a/libstdc++-v3/doc/html/ext/pb_ds/random_int_find_find_timing_test_tree_local.png b/libstdc++-v3/doc/html/ext/pb_ds/random_int_find_find_timing_test_tree_local.png new file mode 100644 index 00000000000..83105202a48 Binary files /dev/null and b/libstdc++-v3/doc/html/ext/pb_ds/random_int_find_find_timing_test_tree_local.png differ diff --git a/libstdc++-v3/doc/html/ext/pb_ds/random_int_find_find_timing_test_tree_msvc.png b/libstdc++-v3/doc/html/ext/pb_ds/random_int_find_find_timing_test_tree_msvc.png new file mode 100644 index 00000000000..2206cef5a90 Binary files /dev/null and b/libstdc++-v3/doc/html/ext/pb_ds/random_int_find_find_timing_test_tree_msvc.png differ diff --git a/libstdc++-v3/doc/html/ext/pb_ds/range_invalidation_guarantee.html b/libstdc++-v3/doc/html/ext/pb_ds/range_invalidation_guarantee.html new file mode 100644 index 00000000000..e59a257a540 --- /dev/null +++ b/libstdc++-v3/doc/html/ext/pb_ds/range_invalidation_guarantee.html @@ -0,0 +1,52 @@ + + + + + + + range_invalidation_guarantee Interface + + + + +
+

range_invalidation_guarantee Interface

+ +

Signifies an invalidation guarantee that includes all those + of its base, and additionally, that any range-type iterator + (including the returns of begin() and end()) is in the correct + relative positions to other range-type iterators as long as its + corresponding entry has not be erased, regardless of + modifications to the container object.

+ +

Defined in: tag_and_trait.hpp

+ +

Base Classes

+ + + + + + + + + + + + + +
ClassDerivation Type
+
+point_invalidation_guarantee
+
+
+

public

+
+
+ + diff --git a/libstdc++-v3/doc/html/ext/pb_ds/rationale_null_node_updator.png b/libstdc++-v3/doc/html/ext/pb_ds/rationale_null_node_updator.png new file mode 100644 index 00000000000..43874891517 Binary files /dev/null and b/libstdc++-v3/doc/html/ext/pb_ds/rationale_null_node_updator.png differ diff --git a/libstdc++-v3/doc/html/ext/pb_ds/rb_tree_tag.html b/libstdc++-v3/doc/html/ext/pb_ds/rb_tree_tag.html new file mode 100644 index 00000000000..600235d5e8d --- /dev/null +++ b/libstdc++-v3/doc/html/ext/pb_ds/rb_tree_tag.html @@ -0,0 +1,47 @@ + + + + + + + rb_tree_tag Interface + + + + +
+

rb_tree_tag Interface

+ +

Red-black tree data structure tag.

+ +

Defined in: tag_and_trait.hpp

+ +

Base Classes

+ + + + + + + + + + + + + +
ClassDerivation Type
+
+tree_tag
+
+
+

public

+
+
+ + diff --git a/libstdc++-v3/doc/html/ext/pb_ds/rc_binomial_heap_tag.html b/libstdc++-v3/doc/html/ext/pb_ds/rc_binomial_heap_tag.html new file mode 100644 index 00000000000..46106f4c585 --- /dev/null +++ b/libstdc++-v3/doc/html/ext/pb_ds/rc_binomial_heap_tag.html @@ -0,0 +1,47 @@ + + + + + + + rc_binomial_heap_tag Interface + + + + +
+

rc_binomial_heap_tag Interface

+ +

Redundant-counter binomial-heap data structure tag.

+ +

Defined in: tag_and_trait.hpp

+ +

Base Classes

+ + + + + + + + + + + + + +
ClassDerivation Type
+
+priority_queue_tag
+
+
+

public

+
+
+ + diff --git a/libstdc++-v3/doc/html/ext/pb_ds/references.html b/libstdc++-v3/doc/html/ext/pb_ds/references.html new file mode 100644 index 00000000000..b96827bd37a --- /dev/null +++ b/libstdc++-v3/doc/html/ext/pb_ds/references.html @@ -0,0 +1,258 @@ + + + + + + + References + + + + +
+

References

+ +
    +
  1. [abrahams97exception] Dave Abrahams, + STL Exception Handling Contract, + http://anubis.dkuug.dk/jtc1/sc22/wg21/docs/papers/1997/N1075.pdf
  2. + +
  3. [alexandrescu01modern] Andrei + Alexandrescu, Modern C++ Design: Generic Programming and + Design Patterns Applied, Addison-Wesley Publishing + Company, 2001
  4. + +
  5. [andrew04mtf] + K. Andrew and D. Gleich, "MTF, Bit, and COMB: A Guide to + Deterministic and Randomized Algorithms for the List Update + Problem"
  6. + +
  7. [austern00noset] Matthew Austern, "Why + You shouldn't use set - and What You Should Use + Instead", C++ Report, April, 2000
  8. + +
  9. [austern01htprop] Matthew Austern, "A + Proposal to Add Hashtables to the Standard Library", + http://anubis.dkuug.dk/jtc1/sc22/wg21/docs/papers/2001/n1326l.html
  10. + +
  11. [austern98segmented] Matthew Austern, + "Segmented iterators and hierarchical algorithms", Generic + Programming, April 1998, pp. 80-90
  12. + +
  13. [boost_timer], + "Boost timer library", http://www.boost.org by Beman + Dawes
  14. + +
  15. [boost_pool], + "Boost pool library", http://www.boost.org by Stephen + Cleary
  16. + +
  17. [boost_type_traits], "Boost + type_traits library", http://www.boost.org by John + Maddock, Steve Cleary, et. al.
  18. + +
  19. [brodal96priority] Gerth Stolting + Brodal, Worst-case + efficient priority queues
  20. + +
  21. [bulka99efficient] D. Bulka, and D. + Mayhew, "Efficient C++ Programming Techniques.", + Addison-Wesley Publishing Company, Addison-Wesley, 1997
  22. + +
  23. [clrs2001] T. H. + Cormen, C. E., Leiserson, R. L. Rivest, C. and Stein, + "Introduction to Algorithms, 2nd ed.", MIT Press, 2001
  24. + +
  25. [dinkumware_stl], "Dinkumware C++ Library + Reference", http://www.dinkumware.com/htm_cpl/index.html
  26. + +
  27. [dubhashi98neg] D. Dubashi, and D. Ranjan, + "Balls and bins: A study in negative dependence.", Random + Structures and Algorithms 13, 2 (1998), 99-124
  28. + +
  29. [fagin79extendible] R. Fagin, J. + Nievergelt, N. Pippenger, and H. R. Strong, "Extendible + hashing - a fast access method for dynamic files", ACM Trans. + Database Syst. 4, 3 (1979), 315-344
  30. + +
  31. [filliatre2000ptset], J. C. + Filliatre, "Ptset: Sets of integers implemented as Patricia + trees", http://www.lri.fr/~filliatr/ftp/ocaml/misc/ptset.ml
  32. + +
  33. [fredman86pairing], M. L. Fredman, R + Sedgewick, D. D. Sleator, R. E. Tarjan, The + pairing heap: a new form of self-adjusting heap
  34. + +
  35. [gamma95designpatterns] E. Gamma, + R. Helm, R. Johnson, and J. Vlissides, "Design Patterns - + Elements of Reusable Object-Oriented Software", + Addison-Wesley Publishing Company, Addison-Wesley, 1995
  36. + +
  37. [garg86order] + A. K. Garg and C. C. Gotlieb, "Order-preserving key + transformations", Trans. Database Syst. 11, 2 (1986), + 213-234
  38. + +
  39. [hyslop02making] J. Hyslop, and H. + Sutter, "Making a real hash of things", C++ Report, May + 2002
  40. + +
  41. [jossutis01stl] N. M. Jossutis, "The C++ + Standard Library - A Tutorial and Reference", Addison-Wesley + Publishing Company, Addison-Wesley, 2001
  42. + +
  43. [kt99fat_heas] Haim Kaplan and Robert E. + Tarjan, New + Heap Data Structures
  44. + +
  45. [kleft00sets] + Klaus Kleft and Angelika Langer, "Are Set Iterators Mutable + or Immutable?", C/C++ Users Jornal, October 2000
  46. + +
  47. [knuth98sorting] D. E. Knuth, "The Art of + Computer Programming - Sorting and Searching", Addison-Wesley + Publishing Company, Addison-Wesley, 1998
  48. + +
  49. [liskov98data] B. Liskov, "Data abstraction + and hierarchy", SIGPLAN Notices 23, 5 (May 1998)
  50. + +
  51. [litwin80lh] W. + Litwin, "Linear hashing: A new tool for file and table + addressing", Proceedings of International Conference on Very + Large Data Bases (June 1980), pp. 212-223
  52. + +
  53. [maverik_lowerbounds] Maverik Woo, + + Deamortization - Part 2: Binomial Heaps
  54. + +
  55. [metrowerks_stl], "Metrowerks CodeWarrior + Pro 7 MSL C++ Reference Manual",
  56. + +
  57. [meyers96more] S. Meyers, "More Effective + C++: 35 New Ways to Improve Your Programs and Designs - 2nd + ed.", Addison-Wesley Publishing Company, Addison-Wesley, + 1996
  58. + +
  59. [meyers00nonmember] S. Meyers, "How + Non-Member Functions Improve Encapsulation", C/C++ Users + Journal, 2000
  60. + +
  61. [meyers01stl] + S. Meyers, "Effective STL: 50 Specific Ways to Improve Your + Use of the Standard Template Library", Addison-Wesley + Publishing Company, Addison-Wesley, 2001
  62. + +
  63. [meyers02both] S. Meyers, "Class Template, + Member Template - or Both?", C/C++ Users Journal, 2003
  64. + +
  65. [motwani95random] R. Motwani, and P. + Raghavan, "Randomized Algorithms", Cambridge University + Press
  66. + +
  67. [mscom] COM: Component Model Object + Technologies
  68. + +
  69. [musser95rationale], David R. Musser, + "Rationale for Adding Hash Tables to the C++ Standard + Template Library"
  70. + +
  71. [musser96stltutorial] D. R. Musser + and A. Saini, "STL Tutorial and Reference Guide", + Addison-Wesley Publishing Company, Addison-Wesley, 1996
  72. + +
  73. [nelson96stlpql] Mark Nelson, Priority + Queues and the STL, Dr. Dobbs Journal, January, 1996
  74. + +
  75. [okasaki98mereable] C. Okasaki and A. + Gill, "Fast mergeable integer maps", In Workshop on ML, pages + 77--86, September 1998. 95
  76. + +
  77. [sgi_stl] SGI, + "Standard Template Library Programmer's Guide", http://www.sgi.com/tech/stl
  78. + +
  79. [select_man] + select + man page.
  80. + +
  81. [sleator84amortized] D. D. Sleator + and R. E. Tarjan, "Amortized Efficiency of List Update + Problems", ACM Symposium on Theory of Computing, 1984
  82. + +
  83. [sleator85self] D. D. Sleator and R. E. + Tarjan, "Self-Adjusting Binary Search Trees", ACM Symposium + on Theory of Computing, 1985
  84. + +
  85. [stepanov94standard] A. A. Stepanov + and M. Lee", "The Standard Template Library"
  86. + +
  87. [stroustrup97cpp] Bjarne Stroustrup, + The C++ Programming Langugage -3rd ed., Addison-Wesley + Publishing Company,Reading, MA, USA, 1997
  88. + +
  89. [vandevoorde2002cpptemplates] + D. Vandevoorde, and N. M. Josuttis, "C++ Templates: The + Complete Guide", Addison-Wesley Publishing Company, + Addison-Wesley, 2002
  90. + +
  91. [wickland96thirty] C. A. Wickland, + "Thirty Years Among the Dead", National Psychological + Institute, Los Angeles, 1996,http://myweb.wvnet.edu/gsa00121/books/amongdead30.zip
  92. +
+
+
+ + diff --git a/libstdc++-v3/doc/html/ext/pb_ds/resize_error.html b/libstdc++-v3/doc/html/ext/pb_ds/resize_error.html new file mode 100644 index 00000000000..cb05b504fb9 --- /dev/null +++ b/libstdc++-v3/doc/html/ext/pb_ds/resize_error.html @@ -0,0 +1,50 @@ + + + + + + +resize_error Interface + + + + +
+

resize_error Interface

+ +

A container cannot be resized.

+ +

Exception thrown when a size policy cannot supply an + adequate size for an external resize.

+ +

Defined in: exception.hpp

+ +

Base Classes

+ + + + + + + + + + + + + +
ClassDerivation Type
+
+   resize_error
+   
+
+

public

+
+
+ + diff --git a/libstdc++-v3/doc/html/ext/pb_ds/resize_policy_cd.png b/libstdc++-v3/doc/html/ext/pb_ds/resize_policy_cd.png new file mode 100644 index 00000000000..338e33c15cc Binary files /dev/null and b/libstdc++-v3/doc/html/ext/pb_ds/resize_policy_cd.png differ diff --git a/libstdc++-v3/doc/html/ext/pb_ds/restoring_node_invariants.png b/libstdc++-v3/doc/html/ext/pb_ds/restoring_node_invariants.png new file mode 100644 index 00000000000..33ba84bfe33 Binary files /dev/null and b/libstdc++-v3/doc/html/ext/pb_ds/restoring_node_invariants.png differ diff --git a/libstdc++-v3/doc/html/ext/pb_ds/sample_probe_fn.html b/libstdc++-v3/doc/html/ext/pb_ds/sample_probe_fn.html new file mode 100644 index 00000000000..3d18650c3b3 --- /dev/null +++ b/libstdc++-v3/doc/html/ext/pb_ds/sample_probe_fn.html @@ -0,0 +1,152 @@ + + + + + + + sample_probe_fn Interface + + + + +
+

sample_probe_fn Interface

+ +

A sample probe policy.

+ +

This class serves to show the interface a probe functor + needs to support.

+ +

Defined in: sample_probe_fn.hpp

+ +

Public Types and + Constants

+ +

General definitions.

+ + + + + + + + + + + + + + + + + +
TypeDefinitionDescription
+
+size_type
+
+
+
+size_t, e.g.
+
+
+

Size type.

+
+ +

Public Methods

+ +

Constructors, destructor, and + related.

+ + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDescription
+
+  sample_probe_fn
+  ()
+
+
+

Default constructor.

+ +

Must be default constructable.

+
+
+  sample_probe_fn
+  (const sample_probe_fn &other)
+
+
+

Copy constructor.

+ +

Must be copy constructable.

+
+
+inline void
+  swap
+  (sample_probe_fn &other)
+
+
+

Swaps content.

+ +

Must be swappable (if there is such a word).

+
+ +

Protected Methods

+ +

Offset methods.

+ + + + + + + + + + + + + +
MethodDescription
+
+inline size_type
+  operator()
+  (const_key_reference r_key,
+    size_type i) const
+
+
+

Returns the i-th + offset from the hash value of some key r_key.

+ +

size_type is the size type on which the + functor operates.

+
+
+ + diff --git a/libstdc++-v3/doc/html/ext/pb_ds/sample_range_hashing.html b/libstdc++-v3/doc/html/ext/pb_ds/sample_range_hashing.html new file mode 100644 index 00000000000..5b1a90023a2 --- /dev/null +++ b/libstdc++-v3/doc/html/ext/pb_ds/sample_range_hashing.html @@ -0,0 +1,172 @@ + + + + + + + sample_range_hashing Interface + + + + +
+

sample_range_hashing Interface

+ +

A sample range-hashing functor.

+ +

This class serves to show the interface a range-hashing + functor needs to support.

+ +

Defined in: sample_range_hashing.hpp

+ +

Public Types and + Constants

+ +

General definitions.

+ + + + + + + + + + + + + + + + + +
TypeDefinitionDescription
+
+size_type
+
+
+
+size_t, e.g.
+
+
+

Size type.

+
+ +

Public Methods

+ +

Constructors, destructor, and + related.

+ + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDescription
+
+  sample_range_hashing
+  ()
+
+
+

Default constructor.

+ +

Must be default constructable.

+
+
+  sample_range_hashing
+  (const sample_range_hashing &other)
+
+
+

Copy constructor.

+ +

Must be copy constructable.

+
+
+inline void
+  swap
+  (sample_range_hashing &other)
+
+
+

Swaps content.

+ +

Must be swappable (if there is such a word).

+
+ +

Protected Methods

+ +

Notification methods.

+ + + + + + + + + + + + + +
MethodDescription
+
+void 
+  notify_resized
+  (size_type size)
+
+
+

Notifies the policy object that the container's size + has changed to size.

+
+ +

Operators.

+ + + + + + + + + + + + + +
MethodDescription
+
+inline size_type
+  operator()
+  (size_type hash) const
+
+
+

Transforms the hash value hash into a ranged-hash value.

+
+
+ + diff --git a/libstdc++-v3/doc/html/ext/pb_ds/sample_ranged_hash_fn.html b/libstdc++-v3/doc/html/ext/pb_ds/sample_ranged_hash_fn.html new file mode 100644 index 00000000000..f8e47ab64c2 --- /dev/null +++ b/libstdc++-v3/doc/html/ext/pb_ds/sample_ranged_hash_fn.html @@ -0,0 +1,171 @@ + + + + + + + sample_ranged_hash_fn Interface + + + + +
+

sample_ranged_hash_fn Interface

+ +

A sample ranged-hash functor.

+ +

This class serves to show the interface a ranged-hash + functor needs to support.

+ +

Defined in: sample_ranged_hash_fn.hpp

+ +

Public Types and + Constants

+ +

General definitions.

+ + + + + + + + + + + + + + + + + +
TypeDefinitionDescription
+
+size_type
+
+
+
+size_t, e.g.
+
+
+

Size type.

+
+ +

Public Methods

+ +

Constructors, destructor, and + related.

+ + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDescription
+
+  sample_ranged_hash_fn
+  ()
+
+
+

Default constructor.

+ +

Must be default constructable.

+
+
+  sample_ranged_hash_fn
+  (const sample_ranged_hash_fn &other)
+
+
+

Copy constructor.

+ +

Must be copy constructable.

+
+
+inline void
+  swap
+  (sample_ranged_hash_fn &other)
+
+
+

Swaps content.

+ +

Must be swappable (if there is such a word).

+
+ +

Protected Methods

+ +

Notification methods.

+ + + + + + + + + + + + + +
MethodDescription
+
+void 
+  notify_resized
+  (size_type size)
+
+
+

Notifies the policy object that the container's size + has changed to size.

+
+ +

Operators.

+ + + + + + + + + + + + + +
MethodDescription
+
+inline size_type 
+  operator()
+  (const_key_reference r_key) const
+
+
+

Transforms r_key into + a position within the table.

+
+
+ + diff --git a/libstdc++-v3/doc/html/ext/pb_ds/sample_ranged_probe_fn.html b/libstdc++-v3/doc/html/ext/pb_ds/sample_ranged_probe_fn.html new file mode 100644 index 00000000000..b0e744cd331 --- /dev/null +++ b/libstdc++-v3/doc/html/ext/pb_ds/sample_ranged_probe_fn.html @@ -0,0 +1,178 @@ + + + + + + + sample_ranged_probe_fn Interface + + + + +
+

sample_ranged_probe_fn Interface

+ +

A sample ranged-probe functor.

+ +

This class serves to show the interface a ranged-probe + functor needs to support.

+ +

Defined in: sample_ranged_probe_fn.hpp

+ +

Public Types and + Constants

+ +

General definitions.

+ + + + + + + + + + + + + + + + + +
TypeDefinitionDescription
+
+size_type
+
+
+
+size_t, e.g.
+
+
+

Size type.

+
+ +

Public Methods

+ +

Constructors, destructor, and + related.

+ + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDescription
+
+  sample_ranged_probe_fn
+  ()
+
+
+

Default constructor.

+ +

Must be default constructable.

+
+
+  sample_ranged_probe_fn
+  (const sample_ranged_probe_fn &other)
+
+
+

Copy constructor.

+ +

Must be copy constructable.

+
+
+inline void
+  swap
+  (sample_ranged_probe_fn &other)
+
+
+

Swaps content.

+ +

Must be swappable (if there is such a word).

+
+ +

Protected Methods

+ +

Notification methods.

+ + + + + + + + + + + + + +
MethodDescription
+
+void 
+  notify_resized
+  (size_type size)
+
+
+

Notifies the policy object that the container's size + has changed to size.

+
+ +

Operators.

+ + + + + + + + + + + + + +
MethodDescription
+
+inline size_type 
+  operator()
+  (const_key_reference r_key,
+    size_t hash,
+    size_type i) const
+
+
+

Transforms the const key reference + r_key into the i-th position within the table. This + method is called for + each collision within the probe sequence.

+
+
+ + diff --git a/libstdc++-v3/doc/html/ext/pb_ds/sample_resize_policy.html b/libstdc++-v3/doc/html/ext/pb_ds/sample_resize_policy.html new file mode 100644 index 00000000000..7807ace1daa --- /dev/null +++ b/libstdc++-v3/doc/html/ext/pb_ds/sample_resize_policy.html @@ -0,0 +1,413 @@ + + + + + + + sample_resize_policy Interface + + + + +
+

sample_resize_policy Interface

+ +

A sample resize policy.

+ +

This class serves to show the interface a resize policy + needs to support.

+ +

Defined in: sample_resize_policy.hpp

+ +

Public Types and + Constants

+ +

General definitions.

+ + + + + + + + + + + + + + + + + +
TypeDefinitionDescription
+
+size_type
+
+
+
+size_t, e.g.
+
+
+

Size type.

+
+ +

Public Methods

+ +

Constructors, destructor, and + related.

+ + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDescription
+
+  sample_resize_policy
+  ()
+
+
+

Default constructor.

+ +

Must be default constructable.

+
+
+  sample_range_hashing
+  (const sample_resize_policy &other)
+
+
+

Copy constructor.

+ +

Must be copy constructable.

+
+
+inline void
+  swap
+  (sample_resize_policy &other)
+
+
+

Swaps content.

+ +

Must be swappable (if there is such a word).

+
+ +

Protected Methods

+ +

Insert search + notifications.

+ +

Notifications called during an insert operation.

+ + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDescription
+
+inline void
+  notify_insert_search_start
+  ()
+
+
+

Notifies a search started.

+
+
+inline void
+  notify_insert_search_collision
+  ()
+
+
+

Notifies a search encountered a collision.

+
+
+inline void
+  notify_insert_search_end
+  ()
+
+
+

Notifies a search ended.

+
+ +

Find search + notifications.

+ +

Notifications called during a find operation.

+ + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDescription
+
+inline void
+  notify_find_search_start
+  ()
+
+
+

Notifies a search started.

+
+
+inline void
+  notify_find_search_collision
+  ()
+
+
+

Notifies a search encountered a collision.

+
+
+inline void
+  notify_find_search_end
+  ()
+
+
+

Notifies a search ended.

+
+ +

Erase search + notifications.

+ +

Notifications called during an insert operation.

+ + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDescription
+
+inline void
+  notify_erase_search_start
+  ()
+
+
+

Notifies a search started.

+
+
+inline void
+  notify_erase_search_collision
+  ()
+
+
+

Notifies a search encountered a collision.

+
+
+inline void
+  notify_erase_search_end
+  ()
+
+
+

Notifies a search ended.

+
+ +

Content change + notifications.

+ +

Notifications called when the content of the table changes + in a way that can affect the resize policy.

+ + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDescription
+
+inline void
+  notify_inserted
+  (size_type num_e)
+
+
+

Notifies an element was inserted.

+
+
+inline void
+  notify_erased
+  (size_type num_e)
+
+
+

Notifies an element was erased.

+
+
+void 
+  notify_cleared
+  ()
+
+
+

Notifies the table was cleared.

+
+ +

Size change + notifications.

+ +

Notifications called when the table changes size.

+ + + + + + + + + + + + + +
MethodDescription
+
+void
+  notify_resized
+  (size_type new_size)
+
+
+

Notifies the table was resized to new_size.

+
+ +

Queries.

+ +

Called to query whether/how to resize.

+ + + + + + + + + + + + + + + + + + + +
MethodDescription
+
+inline bool
+  is_resize_needed
+  () const
+
+
+

Queries whether a resize is needed.

+
+
+size_type
+  get_new_size
+  (size_type size, 
+    size_type num_used_e) const
+
+
+

Queries what the new size should be.

+
+
+ + diff --git a/libstdc++-v3/doc/html/ext/pb_ds/sample_resize_trigger.html b/libstdc++-v3/doc/html/ext/pb_ds/sample_resize_trigger.html new file mode 100644 index 00000000000..d7042bc2c23 --- /dev/null +++ b/libstdc++-v3/doc/html/ext/pb_ds/sample_resize_trigger.html @@ -0,0 +1,462 @@ + + + + + + + sample_resize_trigger Interface + + + + +
+

sample_resize_trigger Interface

+ +

A sample resize trigger policy.

+ +

This class serves to show the interface a trigger policy + needs to support.

+ +

Defined in: + sample_resize_trigger.hpp

+ +

Public Types and + Constants

+ +

General definitions.

+ + + + + + + + + + + + + + + + + +
TypeDefinitionDescription
+
+size_type
+
+
+
+size_t, e.g.
+
+
+

Size type.

+
+ +

Public Methods

+ +

Constructors, destructor, and + related.

+ + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDescription
+
+  sample_resize_trigger
+  ()
+
+
+

Default constructor.

+ +

Must be default constructable.

+
+
+  sample_range_hashing
+  (const sample_resize_trigger &other)
+
+
+

Copy constructor.

+ +

Must be copy constructable.

+
+
+inline void
+  swap
+  (sample_resize_trigger &other)
+
+
+

Swaps content.

+ +

Must be swappable (if there is such a word).

+
+ +

Protected Methods

+ +

Insert search + notifications.

+ +

Notifications called during an insert operation.

+ + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDescription
+
+inline void
+  notify_insert_search_start
+  ()
+
+
+

Notifies a search started.

+
+
+inline void
+  notify_insert_search_collision
+  ()
+
+
+

Notifies a search encountered a collision.

+
+
+inline void
+  notify_insert_search_end
+  ()
+
+
+

Notifies a search ended.

+
+ +

Find search + notifications.

+ +

Notifications called during a find operation.

+ + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDescription
+
+inline void
+  notify_find_search_start
+  ()
+
+
+

Notifies a search started.

+
+
+inline void
+  notify_find_search_collision
+  ()
+
+
+

Notifies a search encountered a collision.

+
+
+inline void
+  notify_find_search_end
+  ()
+
+
+

Notifies a search ended.

+
+ +

Erase search + notifications.

+ +

Notifications called during an insert operation.

+ + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDescription
+
+inline void
+  notify_erase_search_start
+  ()
+
+
+

Notifies a search started.

+
+
+inline void
+  notify_erase_search_collision
+  ()
+
+
+

Notifies a search encountered a collision.

+
+
+inline void
+  notify_erase_search_end
+  ()
+
+
+

Notifies a search ended.

+
+ +

Content change + notifications.

+ +

Notifications called when the content of the table changes + in a way that can affect the resize policy.

+ + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDescription
+
+inline void
+  notify_inserted
+  (size_type num_entries)
+
+
+

Notifies an element was inserted. the total number of + entries in the table is num_entries.

+
+
+inline void
+  notify_erased
+  (size_type num_entries)
+
+
+

Notifies an element was erased.

+
+
+void 
+  notify_cleared
+  ()
+
+
+

Notifies the table was cleared.

+
+ +

Size change + notifications.

+ +

Notifications called when the table changes size.

+ + + + + + + + + + + + + + + + + + + +
MethodDescription
+
+void
+  notify_resized
+  (size_type new_size)
+
+
+

Notifies the table was resized as a result of this + object's signifying that a resize is needed.

+
+
+void
+  notify_externally_resized
+  (size_type new_size)
+
+
+

Notifies the table was resized externally.

+
+ +

Queries.

+ +

Called to query whether/how to resize.

+ + + + + + + + + + + + + + + + + + + +
MethodDescription
+
+inline bool 
+  is_resize_needed
+  () const
+
+
+

Queries whether a resize is needed.

+
+
+inline bool
+  is_grow_needed
+  (size_type size, 
+    size_type num_entries) const
+
+
+

Queries whether a grow is needed.

+ +

This method is called only if this object indicated + resize is needed. The actual size of the table is size, and the number of entries in + it is num_entries.

+
+ +

Private Methods

+ +

Overrides.

+ + + + + + + + + + + + + +
MethodDescription
+
+virtual void
+  do_resize
+  (size_type new_size)
+
+
+

Resizes to new_size.

+
+
+ + diff --git a/libstdc++-v3/doc/html/ext/pb_ds/sample_size_policy.html b/libstdc++-v3/doc/html/ext/pb_ds/sample_size_policy.html new file mode 100644 index 00000000000..e7f58e7e4c4 --- /dev/null +++ b/libstdc++-v3/doc/html/ext/pb_ds/sample_size_policy.html @@ -0,0 +1,163 @@ + + + + + + + sample_size_policy Interface + + + + +
+

sample_size_policy Interface

+ +

A sample size policy.

+ +

This class serves to show the interface a size policy needs + to support.

+ +

Defined in: sample_size_policy.hpp

+ +

Public Types and + Constants

+ +

General definitions.

+ + + + + + + + + + + + + + + + + +
TypeDefinitionDescription
+
+size_type
+
+
+
+size_t, e.g.
+
+
+

Size type.

+
+ +

Public Methods

+ +

Constructors, destructor, and + related.

+ + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDescription
+
+  sample_size_policy
+  ()
+
+
+

Default constructor.

+ +

Must be default constructable.

+
+
+  sample_range_hashing
+  (const sample_size_policy &other)
+
+
+

Copy constructor.

+ +

Must be copy constructable.

+
+
+inline void
+  swap
+  (sample_size_policy &other)
+
+
+

Swaps content.

+ +

Must be swappable (if there is such a word).

+
+ +

Protected Methods

+ +

Size methods

+ + + + + + + + + + + + + + + + + + + +
MethodDescription
+
+inline size_type
+  get_nearest_larger_size
+  (size_type size) const
+
+
+

Given a size size, + returns a size that is larger.

+
+
+inline size_type
+  get_nearest_smaller_size
+  (size_type size) const
+
+
+

Given a size size, + returns a size that is smaller.

+
+
+ + diff --git a/libstdc++-v3/doc/html/ext/pb_ds/sample_tree_node_update.html b/libstdc++-v3/doc/html/ext/pb_ds/sample_tree_node_update.html new file mode 100644 index 00000000000..2cfab0a24f3 --- /dev/null +++ b/libstdc++-v3/doc/html/ext/pb_ds/sample_tree_node_update.html @@ -0,0 +1,193 @@ + + + + + + + sample_tree_node_update Interface + + + + +
+

sample_tree_node_update Interface

+ +

A sample node updater.

+ +

This class serves to show the interface a node update + functor needs to support.

+ +

Defined in: + sample_tree_node_update.hpp

+ +

Template Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterDescriptionDefault Value
+
+class Const_Node_Iterator
+
+
+

Const node iterator type.

+
-
+
+class Node_Iterator
+
+
+

Node iterator type.

+
-
+
+class Cmp_Fn
+
+
+

Comparison functor.

+
-
+
+class Allocator
+
+
+

Allocator type.

+
-
+ +

Public Types and + Constants

+ +

Metadata definitions.

+ + + + + + + + + + + + + + + + + +
TypeDefinitionDescription
+
+metadata_type
+
+
+
+size_t
+
+
+

Metadata type.

+ +

This can be any type; size_t is merely an example.

+
+ +

Protected Methods

+ +

Conclassors, declassor, and + related.

+ + + + + + + + + + + + + +
MethodDescription
+
+  sample_tree_node_update
+  ()
+
+
+

Default constructor.

+ +

Must be default constructable.

+
+ +

Operators.

+ + + + + + + + + + + + + +
MethodDescription
+
+inline void
+  operator()
+  (node_iterator node_it,
+    const_node_iterator end_nd_it) const
+
+
+

Updates the rank of a node through a node_iterator node_it; end_nd_it is the end node + iterator.

+
+
+ + diff --git a/libstdc++-v3/doc/html/ext/pb_ds/sample_trie_e_access_traits.html b/libstdc++-v3/doc/html/ext/pb_ds/sample_trie_e_access_traits.html new file mode 100644 index 00000000000..b663e508758 --- /dev/null +++ b/libstdc++-v3/doc/html/ext/pb_ds/sample_trie_e_access_traits.html @@ -0,0 +1,231 @@ + + + + + + + sample_trie_e_access_traits Interface + + + + +
+

sample_trie_e_access_traits Interface

+ +

A sample trie element-access traits.

+ +

This class serves to show the interface an element- access + traits class needs to support.

+ +

Defined in: + sample_trie_e_access_traits.hpp

+ +

Public Types and + Constants

+ +

General definitions.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
TypeDefinitionDescription
+
+size_type
+
+
+
+size_t, e.g.
+
+
+

Size type.

+
+
+key_type
+
+
+
+std::string, e.g.
+
+
+

Key type.

+
+
+const_key_reference
+
+
+
+const string &, e.g.
+
+
+

Const key reference type.

+
+ +

Element definitions.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
TypeDefinitionDescription
+
+const_iterator
+
+
+
+string::const_iterator, e.g.
+
+
+

Element const iterator type.

+
+
+e_type
+
+
+
+char, e.g.
+
+
+

Element type.

+
+
+max_size
+
+
+
+4, e.g.
+
+
+

Number of distinct elements.

+
+ +

Public Methods

+ +

Access methods.

+ + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDescription
+
+inline static const_iterator
+  begin
+  (const_key_reference r_key)
+
+
+

Returns a const_iterator to + the first element of r_key.

+
+
+inline static const_iterator
+  end
+  (const_key_reference r_key)
+
+
+

Returns a const_iterator to + the after-last element of r_key.

+
+
+inline static size_type
+  e_pos
+  (e_type e)
+
+
+

Maps an element to a + position.

+
+
+ + diff --git a/libstdc++-v3/doc/html/ext/pb_ds/sample_trie_node_update.html b/libstdc++-v3/doc/html/ext/pb_ds/sample_trie_node_update.html new file mode 100644 index 00000000000..beab37cd9cd --- /dev/null +++ b/libstdc++-v3/doc/html/ext/pb_ds/sample_trie_node_update.html @@ -0,0 +1,194 @@ + + + + + + + sample_trie_node_update Interface + + + + +
+

sample_trie_node_update Interface

+ +

A sample node updater.

+ +

This class serves to show the interface a node update + functor needs to support.

+ +

Defined in: + sample_trie_node_update.hpp

+ +

Template Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterDescriptionDefault Value
+
+class Const_Node_Iterator
+
+
+

Const node iterator type.

+
-
+
+class Node_Iterator
+
+
+

Node iterator type.

+
-
+
+class E_Access_Traits
+
+
+

Comparison functor.

+
-
+
+class Allocator
+
+
+

Allocator type.

+
-
+ +

Public Types and + Constants

+ +

Metadata definitions.

+ + + + + + + + + + + + + + + + + +
TypeDefinitionDescription
+
+metadata_type
+
+
+
+size_t
+
+
+

Metadata type.

+ +

This can be any type; size_t is merely an example.

+
+ +

Protected Methods

+ +

Conclassors, declassor, and + related.

+ + + + + + + + + + + + + +
MethodDescription
+
+  sample_trie_node_update
+  ()
+
+
+

Default constructor.

+ +

Must be default constructable.

+
+ +

Operators.

+ + + + + + + + + + + + + +
MethodDescription
+
+inline void
+  operator()
+  (node_iterator node_it,
+    const_node_iterator end_nd_it) const
+
+
+

Updates the rank of a node through a node_iterator node_it; end_nd_it is the end node + iterator.

+
+
+ + diff --git a/libstdc++-v3/doc/html/ext/pb_ds/sample_update_policy.html b/libstdc++-v3/doc/html/ext/pb_ds/sample_update_policy.html new file mode 100644 index 00000000000..f671bcdc25a --- /dev/null +++ b/libstdc++-v3/doc/html/ext/pb_ds/sample_update_policy.html @@ -0,0 +1,178 @@ + + + + + + + sample_update_policy Interface + + + + +
+

sample_update_policy Interface

+ +

A sample list-update policy.

+ +

This class serves to show the interface a list update + functor needs to support.

+ +

Defined in: sample_update_policy.hpp

+ +

Public Methods

+ +

Constructors, destructor, and + related.

+ + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDescription
+
+  sample_update_policy
+  ()
+
+
+

Default constructor.

+ +

Must be default constructable.

+
+
+  sample_update_policy
+  (const sample_update_policy &other)
+
+
+

Copy constructor.

+ +

Must be copy constructable.

+
+
+inline void
+  swap
+  (sample_update_policy &other)
+
+
+

Swaps content.

+ +

Must be swappable (if there is such a word).

+
+ +

Protected Types and + Constants

+ +

Metadata definitions.

+ + + + + + + + + + + + + + + + + +
TypeDefinitionDescription
+
+metadata_type
+
+
+
+Some metadata type.
+
+
+

Metadata on which this functor operates.

+ +

The class must declare the metadata + type on which it operates; the list-update based + containers will append to each node an object of this + type.

+
+ +

Protected Methods

+ +

Metadata operations.

+ + + + + + + + + + + + + + + + + + + +
MethodDescription
+
+metadata_type
+  operator()
+  () const
+
+
+

Creates a metadata object.

+ +

A list-update based container object will call this + method to create a metadata type when a node is + created.

+
+
+bool 
+  operator()
+  (metadata_reference r_data) const
+
+
+

Decides whether a metadata object should be moved to + the front of the list. A list-update based containers + object will call this method to decide whether to move a + node to the front of the list. The method should return + true if the node should be moved to the + front of the list.

+ +

metadata_reference is a reference to a + metadata_type.

+
+
+ + diff --git a/libstdc++-v3/doc/html/ext/pb_ds/simple_list.png b/libstdc++-v3/doc/html/ext/pb_ds/simple_list.png new file mode 100644 index 00000000000..9a05d3f5e4f Binary files /dev/null and b/libstdc++-v3/doc/html/ext/pb_ds/simple_list.png differ diff --git a/libstdc++-v3/doc/html/ext/pb_ds/splay_tree_tag.html b/libstdc++-v3/doc/html/ext/pb_ds/splay_tree_tag.html new file mode 100644 index 00000000000..98c56ce695f --- /dev/null +++ b/libstdc++-v3/doc/html/ext/pb_ds/splay_tree_tag.html @@ -0,0 +1,47 @@ + + + + + + + splay_tree_tag Interface + + + + +
+

splay_tree_tag Interface

+ +

Splay tree data structure tag.

+ +

Defined in: tag_and_trait.hpp

+ +

Base Classes

+ + + + + + + + + + + + + +
ClassDerivation Type
+
+tree_tag
+
+
+

public

+
+
+ + diff --git a/libstdc++-v3/doc/html/ext/pb_ds/string_trie_e_access_traits.html b/libstdc++-v3/doc/html/ext/pb_ds/string_trie_e_access_traits.html new file mode 100644 index 00000000000..10fa2af1c9d --- /dev/null +++ b/libstdc++-v3/doc/html/ext/pb_ds/string_trie_e_access_traits.html @@ -0,0 +1,400 @@ + + + + + + + string_trie_e_access_traits Interface + + + + +
+

string_trie_e_access_traits Interface

+ +

Element access traits for string types.

+ +

Defined in: trie_policy.hpp

+ +

Template Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterDescriptionDefault Value
+
+class String 
+
+
+

String type.

+
std::string
+
+typename String::value_type Min_E_Val 
+
+
+

Minimal element.

+
SCHAR_MIN
+
+typename String::value_type Max_E_Val 
+
+
+

Maximal element.

+
SCHAR_MAX
+
+bool Reverse 
+
+
+

Indicates whether reverse iteration should be + used.

+
false
+
+class Allocator 
+
+
+

Allocator type.

+
+
+std::allocator<char>
+
+
+ +

Public Types and + Constants

+ +

General Definitions

+ + + + + + + + + + + + + + + + + +
TypeDefinitionDescription
+
+size_type
+
+
+
+typename Allocator::size_type
+
+
+

Size type.

+
+ +

Key-Type Definitions

+ + + + + + + + + + + + + + + + + + + + + + + + + +
TypeDefinitionDescription
+
+key_type
+
+
+
+String
+
+
+

Key type.

+
+
+const_key_reference
+
+
+
+typename Allocator::template rebind<
+    key_type>::other::const_reference
+
+
+

Const key reference type.

+
+ +

Element-Type + Definitions

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
TypeDefinitionDescription
+
+reverse
+
+
+
+Reverse
+
+
+

Reverse + iteration indicator.

+
+
+const_iterator
+
+
+
+typename __gnu_pbds::detail::__conditional_type<
+    Reverse,
+    typename String::const_reverse_iterator,
+    typename String::const_iterator>::__type
+
+
+

Element const iterator type.

+
+
+e_type
+
+
+
+typename std::iterator_traits<const_iterator>::value_type
+
+
+

Element type.

+
+
+min_e_val
+
+
+
+Min_E_Val
+
+
+

Minimal element.

+
+
+max_e_val
+
+
+
+Max_E_Val
+
+
+

Maximal element.

+
+
+max_size
+
+
+
+max_e_val - min_e_val + 1
+
+
+

Number of distinct elements.

+
+ +

Public Methods

+ +

Access Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDescription
+
+inline static const_iterator
+  begin
+  (const_key_reference r_key)
+
+
+

Returns a const_iterator to + the first element of r_key.

+
+
+inline static const_iterator
+  end
+  (const_key_reference r_key)
+
+
+

Returns a const_iterator to + the after-last element of r_key.

+
+
+inline static size_type
+  e_pos
+  (e_type e)
+
+
+

Maps an eelement to a + position.

+
+
+ + diff --git a/libstdc++-v3/doc/html/ext/pb_ds/tests.html b/libstdc++-v3/doc/html/ext/pb_ds/tests.html new file mode 100644 index 00000000000..ab5d54bb4ff --- /dev/null +++ b/libstdc++-v3/doc/html/ext/pb_ds/tests.html @@ -0,0 +1,24 @@ + + + + + + + Tests + + + + +
+

Tests

+ +

Associative-Container Tests + describes tests for associative containers; Priority-Queue Tests describes tests for + priority queues.

+
+ + diff --git a/libstdc++-v3/doc/html/ext/pb_ds/text_find_timing_test_hash_gcc.png b/libstdc++-v3/doc/html/ext/pb_ds/text_find_timing_test_hash_gcc.png new file mode 100644 index 00000000000..59247ec6ad9 Binary files /dev/null and b/libstdc++-v3/doc/html/ext/pb_ds/text_find_timing_test_hash_gcc.png differ diff --git a/libstdc++-v3/doc/html/ext/pb_ds/text_find_timing_test_hash_local.png b/libstdc++-v3/doc/html/ext/pb_ds/text_find_timing_test_hash_local.png new file mode 100644 index 00000000000..d85980f30fb Binary files /dev/null and b/libstdc++-v3/doc/html/ext/pb_ds/text_find_timing_test_hash_local.png differ diff --git a/libstdc++-v3/doc/html/ext/pb_ds/text_find_timing_test_hash_msvc.png b/libstdc++-v3/doc/html/ext/pb_ds/text_find_timing_test_hash_msvc.png new file mode 100644 index 00000000000..227164568f5 Binary files /dev/null and b/libstdc++-v3/doc/html/ext/pb_ds/text_find_timing_test_hash_msvc.png differ diff --git a/libstdc++-v3/doc/html/ext/pb_ds/text_find_timing_test_tree_like_gcc.png b/libstdc++-v3/doc/html/ext/pb_ds/text_find_timing_test_tree_like_gcc.png new file mode 100644 index 00000000000..8b6c4f0f058 Binary files /dev/null and b/libstdc++-v3/doc/html/ext/pb_ds/text_find_timing_test_tree_like_gcc.png differ diff --git a/libstdc++-v3/doc/html/ext/pb_ds/text_find_timing_test_tree_like_local.png b/libstdc++-v3/doc/html/ext/pb_ds/text_find_timing_test_tree_like_local.png new file mode 100644 index 00000000000..b7fdc474644 Binary files /dev/null and b/libstdc++-v3/doc/html/ext/pb_ds/text_find_timing_test_tree_like_local.png differ diff --git a/libstdc++-v3/doc/html/ext/pb_ds/text_find_timing_test_tree_like_msvc.png b/libstdc++-v3/doc/html/ext/pb_ds/text_find_timing_test_tree_like_msvc.png new file mode 100644 index 00000000000..dc82a4e7e82 Binary files /dev/null and b/libstdc++-v3/doc/html/ext/pb_ds/text_find_timing_test_tree_like_msvc.png differ diff --git a/libstdc++-v3/doc/html/ext/pb_ds/thin_heap_tag.html b/libstdc++-v3/doc/html/ext/pb_ds/thin_heap_tag.html new file mode 100644 index 00000000000..a8e9d4d721c --- /dev/null +++ b/libstdc++-v3/doc/html/ext/pb_ds/thin_heap_tag.html @@ -0,0 +1,47 @@ + + + + + + + thin_heap_tag Interface + + + + +
+

thin_heap_tag Interface

+ +

Thin heap data structure tag.

+ +

Defined in: tag_and_trait.hpp

+ +

Base Classes

+ + + + + + + + + + + + + +
ClassDerivation Type
+
+priority_queue_tag
+
+
+

public

+
+
+ + diff --git a/libstdc++-v3/doc/html/ext/pb_ds/tree.html b/libstdc++-v3/doc/html/ext/pb_ds/tree.html new file mode 100644 index 00000000000..d836bda123b --- /dev/null +++ b/libstdc++-v3/doc/html/ext/pb_ds/tree.html @@ -0,0 +1,516 @@ + + + + + + + tree Interface + + + + +
+

tree Interface

+ +

A concrete basic tree-based associative container.

+ +

Defined in: assoc_container.hpp

+ +

Template Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterDescriptionDefault Value
+
+typename Key
+
+
+

Key type.

+
-
+
+typename Mapped
+
+
+

Mapped type.

+
-
+
+class Cmp_Fn 
+
+
+

Comparison functor.

+
+
+std::less<Key>
+
+
+
+class Tag 
+
+
+

Mapped-structure tag.

+
rb_tree_tag
+
+template< 
+  typename Const_Node_Iterator, 
+  typename Node_Iterator, 
+  class Cmp_Fn_, 
+  typename Allocator_>
+class Node_Update 
+
+
+

Node updater type.

+ +

Design::Tree-Based + Containers::Node Invariants explains this + concept.

+
null_tree_node_update
+
+class Allocator 
+
+
+

Allocator type.

+
+
+std::allocator<char>
+
+
+ +

Base Classes

+ + + + + + + + + + + + + +
ClassDerivation Type
+
+basic_tree
+
+
+

public

+
+ +

Public Types and + Constants

+ +

Policy Definitions

+ + + + + + + + + + + + + + + + + +
TypeDefinitionDescription
+
+cmp_fn
+
+
+
+Cmp_Fn
+
+
+

Comparison functor type.

+
+ +

Iterator Definitions

+ + + + + + + + + + + + + + + + + + + + + + + + + +
TypeDefinitionDescription
+
+const_node_iterator
+
+
+
+const_node_iterator
+
+
+

Const node iterator.

+
+
+node_iterator
+
+
+
+node_iterator
+
+
+

Node iterator.

+
+ +

Public Methods

+ +

Constructors, Destructor, and + Related

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDescription
+
+  tree
+  ()
+
+
+

Default constructor.

+
+
+  tree
+  (const cmp_fn &r_cmp_fn)
+
+
+

Constructor taking some policy objects. r_cmp_fn will be copied by the + Cmp_Fn object of the + container object.

+
+
+template<
+    class It>
+  tree
+  (It first_it, 
+    It last_it)
+
+
+

Constructor taking iterators to a range of + value_types. The value_types between first_it and last_it will be inserted into the + container object.

+
+
+template<
+    class It>
+  tree
+  (It first_it, 
+    It last_it,
+    const cmp_fn &r_cmp_fn)
+
+
+

Constructor taking iterators to a range of value_types + and some policy objects The value_types between + first_it and + last_it will be inserted + into the container object. r_cmp_fn will be copied by the + cmp_fn object of the + container object.

+
+
+  tree
+  (const tree &other)
+
+
+

Copy constructor.

+
+
+virtual 
+  ~tree
+  ()
+
+
+

Destructor.

+
+
+tree &
+  operator=
+  (const tree &other)
+
+
+

Assignment operator.

+
+
+void
+  swap
+  (tree &other)
+
+
+

Swaps content.

+
+ +

Policy Access Methods

+ + + + + + + + + + + + + + + + + + + +
MethodDescription
+
+cmp_fn &
+  get_cmp_fn
+  ()
+
+
+

Access to the cmp_fn object.

+
+
+const cmp_fn &
+  get_cmp_fn
+  () const
+
+
+

Const access to the cmp_fn object.

+
+ +

Node-Iteration Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDescription
+
+node_iterator
+  node_begin
+  ()
+
+
+

Returns a node_iterator + corresponding to the node at the root of the tree.

+
+
+const_node_iterator
+  node_begin
+  () const
+
+
+

Returns a const_node_iterator + corresponding to the node at the root of the tree.

+
+
+node_iterator
+  node_end
+  ()
+
+
+

Returns a node_iterator + corresponding to a node just after a leaf of the + tree.

+
+
+const_node_iterator
+  node_end
+  () const
+
+
+

Returns a const_node_iterator + corresponding to a node just after a leaf of the + tree.

+
+
+ + diff --git a/libstdc++-v3/doc/html/ext/pb_ds/tree_based_containers.html b/libstdc++-v3/doc/html/ext/pb_ds/tree_based_containers.html new file mode 100644 index 00000000000..7a1b554b26b --- /dev/null +++ b/libstdc++-v3/doc/html/ext/pb_ds/tree_based_containers.html @@ -0,0 +1,358 @@ + + + + + + + Tree-Based Containers + + + + +
+

Tree Design

+ +

Overview

+ +

The tree-based container has the following declaration:

+
+template<
+    typename Key,
+    typename Mapped,
+    typename Cmp_Fn = std::less<Key>,
+    typename Tag = rb_tree_tag,
+    template<
+        typename Const_Node_Iterator,
+        typename Node_Iterator,
+        typename Cmp_Fn_,
+        typename Allocator_>
+    class Node_Update = null_tree_node_update,
+    typename Allocator = std::allocator<char> >
+class tree;
+
+ +

The parameters have the following meaning:

+ +
    +
  1. Key is the key type.
  2. + +
  3. Mapped is the mapped-policy.
  4. + +
  5. Cmp_Fn is a key comparison functor
  6. + +
  7. Tag specifies which underlying data structure + to use.
  8. + +
  9. Node_Update is a policy for updating node + invariants. This is described in Node + Invariants.
  10. + +
  11. Allocator is an allocator + type.
  12. +
+ +

The Tag parameter specifies which underlying + data structure to use. Instantiating it by rb_tree_tag, splay_tree_tag, or + ov_tree_tag, + specifies an underlying red-black tree, splay tree, or + ordered-vector tree, respectively; any other tag is illegal. + Note that containers based on the former two contain more types + and methods than the latter (e.g., + reverse_iterator and rbegin), and different + exception and invalidation guarantees.

+ +

Node + Invariants

+ +

Consider the two trees in Figures Some node invariants A and B. The first + is a tree of floats; the second is a tree of pairs, each + signifying a geometric line interval. Each element in a tree is refered to as a node of the tree. Of course, each of + these trees can support the usual queries: the first can easily + search for 0.4; the second can easily search for + std::make_pair(10, 41).

+ +

Each of these trees can efficiently support other queries. + The first can efficiently determine that the 2rd key in the + tree is 0.3; the second can efficiently determine + whether any of its intervals overlaps + std::make_pair(29,42) (useful in geometric + applications or distributed file systems with leases, for + example). (See tree_order_statistics.cc + and tree_intervals.cc + for examples.) It should be noted that an std::set can + only solve these types of problems with linear complexity.

+ +

In order to do so, each tree stores some metadata in + each node, and maintains node invariants clrs2001]. The first stores in + each node the size of the sub-tree rooted at the node; the + second stores at each node the maximal endpoint of the + intervals at the sub-tree rooted at the node.

+ +
+
+ +
Some node invariants.
+ +

Supporting such trees is difficult for a number of + reasons:

+ +
    +
  1. There must be a way to specify what a node's metadata + should be (if any).
  2. + +
  3. Various operations can invalidate node invariants. + E.g., Figure Invalidation of node + invariants shows how a right rotation, performed on A, + results in B, with nodes x and y having + corrupted invariants (the grayed nodes in C); Figure Invalidation of node + invariants shows how an insert, performed on D, results + in E, with nodes x and y having corrupted + invariants (the grayed nodes in F). It is not feasible to + know outside the tree the effect of an operation on the nodes + of the tree.
  4. + +
  5. The search paths of standard associative containers are + defined by comparisons between keys, and not through + metadata.
  6. + +
  7. It is not feasible to know in advance which methods trees + can support. Besides the usual find method, the + first tree can support a find_by_order method, while + the second can support an overlaps method.
  8. +
+ +
no image
+ +
Invalidation of node invariants.
+ +

These problems are solved by a combination of two means: + node iterators, and template-template node updater + parameters.

+ +

Node Iterators

+ +

Each tree-based container defines two additional iterator + types, const_node_iterator + and node_iterator. + These iterators allow descending from a node to one of its + children. Node iterator allow search paths different than those + determined by the comparison functor. tree + supports the methods:

+
+    const_node_iterator
+    node_begin() const;
+
+    node_iterator
+    node_begin();
+
+    const_node_iterator
+    node_end() const;
+
+    node_iterator
+    node_end(); 
+
+ +

The first pairs return node iterators corresponding to the + root node of the tree; the latter pair returns node iterators + corresponding to a just-after-leaf node.

+ +

Node Updater + (Template-Template) Parameters

+ +

The tree-based containers are parametrized by a + Node_Update template-template parameter. A tree-based + container instantiates Node_Update to some + node_update class, and publicly + subclasses node_update. Figure + A tree and its update + policy shows this scheme, as well as some predefined + policies (which are explained below).

+ +
no image
+ +
A tree and its update policy.
+ +

node_update (an instantiation of + Node_Update) must define metadata_type as + the type of metadata it requires. For order statistics, + e.g., metadata_type might be size_t. + The tree defines within each node a metadata_type + object.

+ +

node_update must also define the following method + for restoring node invariants:

+
+    void 
+    operator()(node_iterator nd_it, const_node_iterator end_nd_it)
+
+ +

In this method, nd_it is a node_iterator + corresponding to a node whose A) all descendants have valid + invariants, and B) its own invariants might be violated; + end_nd_it is a const_node_iterator + corresponding to a just-after-leaf node. This method should + correct the node invariants of the node pointed to by + nd_it. For example, say node x in Figure + Restoring node + invariants-A has an invalid invariant, but its' children, + y and z have valid invariants. After the + invocation, all three nodes should have valid invariants, as in + Figure Restoring node + invariants-B.

+ +
no image
+ +
Invalidation of node invariants.
+ +

When a tree operation might invalidate some node invariant, + it invokes this method in its node_update base to + restore the invariant. For example, Figure Insert update sequence diagram shows + an insert operation (point A); the tree performs some + operations, and calls the update functor three times (points B, + C, and D). (It is well known that any insert, + erase, split or join, can restore + all node invariants by a small number of node invariant updates + [clrs2001].)

+ +
+
+ +
Insert update sequence diagram.
+ +

To complete the description of the scheme, three questions + need to be answered:

+ +
    +
  1. How can a tree which supports order statistics define a + method such as find_by_order?
  2. + +
  3. How can the node updater base access methods of the + tree?
  4. + +
  5. How can the following cyclic dependency be resolved? + node_update is a base class of the tree, yet it + uses node iterators defined in the tree (its child).
  6. +
+ +

The first two questions are answered by the fact that + node_update (an instantiation of + Node_Update) is a public base class + of the tree. Consequently:

+ +
    +
  1. Any public methods of node_update are + automatically methods of the tree [alexandrescu01modern]. + Thus an order-statistics node updater, tree_order_statistics_node_update + defines the find_by_order method; any tree + instantiated by this policy consequently supports this method + as well.
  2. + +
  3. In C++, if a base class declares a method as + virtual, it is virtual in its + subclasses. If node_update needs to access one of + the tree's methods, say the member function end, it simply + declares that method as virtual + abstract.
  4. +
+ +

The cyclic dependency is solved through template-template + parameters. Node_Update is parametrized by the tree's node iterators, its comparison + functor, and its allocator type. Thus, + instantiations of Node_Update have all information required.

+ +

pb_ds assumes that constructing a metadata object and modifying it + are exception free. Suppose that during some method, say + insert, a metadata-related operation + (e.g., changing the value of a metadata) throws an + exception. Ack! Rolling back the method is unusually complex.

+ +

In Interface::Concepts::Null + Policy Classes a distinction was made between redundant + policies and null policies. Node invariants show a + case where null policies are required.

+ +

Assume a regular tree is required, one which need not + support order statistics or interval overlap queries. + Seemingly, in this case a redundant policy - a policy which + doesn't affect nodes' contents would suffice. This, would lead + to the following drawbacks:

+ +
    +
  1. Each node would carry a useless metadata object, wasting + space.
  2. + +
  3. The tree cannot know if its Node_Update policy + actually modifies a node's metadata (this is halting + reducible). In Figure Useless update path , + assume the shaded node is inserted. The tree would have to + traverse the useless path shown to the root, applying + redundant updates all the way.
  4. +
+ +
no image
+ +
Useless update path.
+ +

A null policy class, null_tree_node_update + solves both these problems. The tree detects that node + invariants are irrelevant, and defines all accordingly.

+ +

Additional + Methods

+ +

Tree-based containers support split and join methods. + It is possible to split a tree so that it passes + all nodes with keys larger than a given key to a different + tree. These methods have the following advantages over the + alternative of externally inserting to the destination + tree and erasing from the source tree:

+ +
    +
  1. These methods are efficient - red-black trees are split + and joined in poly-logarithmic complexity; ordered-vector + trees are split and joined at linear complexity. The + alternatives have super-linear complexity.
  2. + +
  3. Aside from orders of growth, these operations perform + few allocations and de-allocations. For red-black trees, allocations are not performed, + and the methods are exception-free.
  4. +
+
+ + diff --git a/libstdc++-v3/doc/html/ext/pb_ds/tree_node_iterator.html b/libstdc++-v3/doc/html/ext/pb_ds/tree_node_iterator.html new file mode 100644 index 00000000000..ba09b5b4db2 --- /dev/null +++ b/libstdc++-v3/doc/html/ext/pb_ds/tree_node_iterator.html @@ -0,0 +1,143 @@ + + + + + + + tree::node_iterator Interface + + + + +
+

tree::node_iterator + Interface

+ +

Node iterator.

+ +

This is an iterator to an iterator - it + iterates over nodes, and de-referencing it returns one of the + tree's iterators

+ +

Base Classes

+ + + + + + + + + + + + + +
ClassDerivation Type
+
+tree::const_node_iterator
+
+
+

public

+
+ +

Public Methods

+ +

Constructors, Destructor, and + Related

+ + + + + + + + + + + + + +
MethodDescription
+
+inline 
+  node_iterator
+  ()
+
+
+

Default constructor.

+
+ +

Access Methods

+ + + + + + + + + + + + + +
MethodDescription
+
+inline container_base::iterator
+  operator*
+  () const
+
+
+

Access.

+
+ +

Movement Methods

+ + + + + + + + + + + + + + + + + + + +
MethodDescription
+
+inline node_iterator
+  get_l_child
+  () const
+
+
+

Returns the node iterator associated with the left + node.

+
+
+inline node_iterator
+  get_r_child
+  () const
+
+
+

Returns the node iterator associated with the right + node.

+
+
+ + diff --git a/libstdc++-v3/doc/html/ext/pb_ds/tree_node_updator_policy_cd.png b/libstdc++-v3/doc/html/ext/pb_ds/tree_node_updator_policy_cd.png new file mode 100644 index 00000000000..5cae5781a18 Binary files /dev/null and b/libstdc++-v3/doc/html/ext/pb_ds/tree_node_updator_policy_cd.png differ diff --git a/libstdc++-v3/doc/html/ext/pb_ds/tree_order_statistics_node_update.html b/libstdc++-v3/doc/html/ext/pb_ds/tree_order_statistics_node_update.html new file mode 100644 index 00000000000..449966b0e4f --- /dev/null +++ b/libstdc++-v3/doc/html/ext/pb_ds/tree_order_statistics_node_update.html @@ -0,0 +1,678 @@ + + + + + + + tree_order_statistics_node_update Interface + + + + +
+

tree_order_statistics_node_update Interface

+ +

Functor updating ranks of entrees.

+ +

Defined in: tree_policy.hpp

+ +

Template Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterDescriptionDefault Value
+
+class Const_Node_Iterator
+
+
+

Const node iterator type.

+
-
+
+class Node_Iterator
+
+
+

Node iterator type.

+
-
+
+class Cmp_Fn
+
+
+

Comparison functor.

+
-
+
+class Allocator
+
+
+

Allocator type.

+
-
+ +

Public Types and + Constants

+ +

Policy Definitions

+ + + + + + + + + + + + + + + + + + + + + + + + + +
TypeDefinitionDescription
+
+cmp_fn
+
+
+
+Cmp_Fn
+
+
+

Allocator + type.

+
+
+allocator
+
+
+
+Allocator
+
+
+

Allocator + type.

+
+ +

General Definitions

+ + + + + + + + + + + + + + + + + +
TypeDefinitionDescription
+
+size_type
+
+
+
+typename allocator::size_type
+
+
+

Size type.

+
+ +

Key-type Definitions

+ + + + + + + + + + + + + + + + + + + + + + + + + +
TypeDefinitionDescription
+
+key_type
+
+
+
+The instantiating container's key type.
+
+
+

Key type.

+
+
+const_key_reference
+
+
+
+The instantiating container's const key reference type.
+
+
+

Const key reference.

+
+ +

Metadata-Type + Definitions

+ + + + + + + + + + + + + + + + + +
TypeDefinitionDescription
+
+metadata_type
+
+
+
+size_type
+
+
+

Metadata type.

+
+ +

Iterator Definitions

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
TypeDefinitionDescription
+
+const_node_iterator
+
+
+
+Const_Node_Iterator
+
+
+

Const node iterator type.

+
+
+node_iterator
+
+
+
+Node_Iterator
+
+
+

Node iterator type.

+
+
+const_iterator
+
+
+
+typename const_node_iterator::value_type
+
+
+

Const iterator type.

+
+
+iterator
+
+
+
+typename node_iterator::value_type
+
+
+

Iterator type.

+
+ +

Public Methods

+ +

Find-Type Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDescription
+
+inline const_iterator
+  find_by_order
+  (size_type order) const
+
+
+

Finds an entry by order. Returns a const_iterator to + the entry with the order order, or a const_iterator to + the container object's end if order is at least the size of the + container object.

+
+
+inline iterator
+  find_by_order
+  (size_type order)
+
+
+

Finds an entry by order. Returns an iterator to the entry + with the order order, or + an iterator to + the container object's end if order is at least the size of the + container object.

+
+
+inline size_type
+  order_of_key
+  (const_key_reference r_key) const
+
+
+

Returns the order of a key within a sequence. For + example, if r_key is the + smallest key, this method will return 0; if r_key is a key between the smallest + and next key, this method will return 1; if r_key is a key larger than the + largest key, this method will return the size of r_c.

+
+ +

Protected Types and + Constants

+ +

Value-type + Definitions

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
TypeDefinitionDescription
+
+const_reference
+
+
+
+The instantiating container's const reference  type.
+
+
+

Const reference to the container's value-type.

+
+
+const_pointer
+
+
+
+The instantiating container's const pointer  type.
+
+
+

Const pointer to the container's value-type.

+
+
+const_metadata_reference
+
+
+
+typename Allocator::template rebind<
+    metadata_type>::other::const_reference
+
+
+

Const metadata reference.

+
+
+metadata_reference
+
+
+
+typename Allocator::template rebind<
+    metadata_type>::other::reference
+
+
+

Metadata reference.

+
+ +

Protected Methods

+ +

Operators

+ + + + + + + + + + + + + +
MethodDescription
+
+inline void
+  operator()
+  (node_iterator node_it,
+    const_node_iterator end_nd_it) const
+
+
+

Updates the rank of a node through a node_iterator + node_it; end_nd_it is the end node iterator.

+
+ +

Constructors, destructor, and + related

+ + + + + + + + + + + + + +
MethodDescription
+
+virtual 
+  ~tree_order_statistics_node_update
+  ()
+
+
+

Destructor.

+
+ +

Private Methods

+ +

Overrides

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDescription
+
+virtual const_node_iterator
+  node_begin
+  () const = 0
+
+
+

Returns the const_node_iterator + associated with the tree's root node.

+
+
+virtual node_iterator
+  node_begin
+  () = 0
+
+
+

Returns the node_iterator + associated with the tree's root node.

+
+
+virtual const_node_iterator
+  node_end
+  () const = 0
+
+
+

Returns the const_node_iterator + associated with a just-after leaf node.

+
+
+virtual node_iterator
+  node_end
+  () = 0
+
+
+

Returns the node_iterator + associated with a just-after leaf node.

+
+
+virtual cmp_fn &
+  get_cmp_fn
+  () = 0
+
+
+

Access to the cmp_fn object.

+
+
+ + diff --git a/libstdc++-v3/doc/html/ext/pb_ds/tree_order_statistics_timing_test.html b/libstdc++-v3/doc/html/ext/pb_ds/tree_order_statistics_timing_test.html new file mode 100644 index 00000000000..0d7579027a3 --- /dev/null +++ b/libstdc++-v3/doc/html/ext/pb_ds/tree_order_statistics_timing_test.html @@ -0,0 +1,118 @@ + + + + + +Tree Order Statistics Timing Test + + + +
+

Tree Order-Statistics Timing Test

+

Description

+

This test creates a container, inserts random integers into + the the container, and then checks the order-statistics of the + container's values. (If the container is one of pb_ds + 's trees, it does this with the order_of_key method of + tree_order_statistics_node_update + ; otherwise, it uses the find method and + std::distance .) It measures the average time for such + queries as a function of the number of values inserted.

+

(The test was executed with tree_order_statistics_timing_test + 200 200 2100)

+

Purpose

+

The test checks the performance difference of policies based + on node-invariant as opposed to a external functions. (see + Design::Associative + Containers::Tree-Based Containers::Node Invariants .)

+

Results

+

Figures NTG, NTM, and + NTL show the results for the native and + tree-based containers in g++, msvc++, and + local, + respectively.

+
+
+
+
+
no image
NTG: Native and tree-based container order-statistics queries - g++

In the above figure, the names in the legends have the following meaning:

+
    +
  1. +n_set- +std::set
  2. +
  3. +splay_tree_ost_set- +tree + with Tag = splay_tree_tag +, and Node_Update = tree_order_statistics_node_update +
  4. +
  5. +rb_tree_ost_set- +tree + with Tag = rb_tree_tag +, and Node_Update = tree_order_statistics_node_update +
  6. +
+
+
+
+
+
+
+
+
+
+
no image
NTM: Native and tree-based container order-statistics queries - msvc++

In the above figure, the names in the legends have the following meaning:

+
    +
  1. +n_set- +std::set
  2. +
  3. +splay_tree_ost_set- +tree + with Tag = splay_tree_tag +, and Node_Update = tree_order_statistics_node_update +
  4. +
  5. +rb_tree_ost_set- +tree + with Tag = rb_tree_tag +, and Node_Update = tree_order_statistics_node_update +
  6. +
+
+
+
+
+
+
+
+
+
+
no image
NTL: Native and tree-based container order-statistics queries - local
+
+
+
+
+

Observations

+

In this test, the native red-black tree can support + order-statistics queries only externally, by performing a + find (alternatively, lower_bound or + upper_bound ) and then using std::distance . + This is clearly linear, and it is not that surprising that the + cost is high.

+

pb_ds 's tree-based containers use in this test the + order_of_key method of tree_order_statistics_node_update. + This method has only linear complexity in the length of the + root-node path. Unfortunately, the average path of a splay tree + (tree + with Tag = splay_tree_tag ) can + be higher than logarithmic; the longest path of a red-black + tree (tree + with Tag = rb_tree_tag ) is + logarithmic in the number of elements. Consequently, the splay + tree has worse performance than the red-black tree.

+
+ + diff --git a/libstdc++-v3/doc/html/ext/pb_ds/tree_order_statistics_timing_test_gcc.png b/libstdc++-v3/doc/html/ext/pb_ds/tree_order_statistics_timing_test_gcc.png new file mode 100644 index 00000000000..bdb00d07a7f Binary files /dev/null and b/libstdc++-v3/doc/html/ext/pb_ds/tree_order_statistics_timing_test_gcc.png differ diff --git a/libstdc++-v3/doc/html/ext/pb_ds/tree_order_statistics_timing_test_local.png b/libstdc++-v3/doc/html/ext/pb_ds/tree_order_statistics_timing_test_local.png new file mode 100644 index 00000000000..2b921743f7c Binary files /dev/null and b/libstdc++-v3/doc/html/ext/pb_ds/tree_order_statistics_timing_test_local.png differ diff --git a/libstdc++-v3/doc/html/ext/pb_ds/tree_order_statistics_timing_test_msvc.png b/libstdc++-v3/doc/html/ext/pb_ds/tree_order_statistics_timing_test_msvc.png new file mode 100644 index 00000000000..76dcbee44fd Binary files /dev/null and b/libstdc++-v3/doc/html/ext/pb_ds/tree_order_statistics_timing_test_msvc.png differ diff --git a/libstdc++-v3/doc/html/ext/pb_ds/tree_random_int_find_find_timing_test.html b/libstdc++-v3/doc/html/ext/pb_ds/tree_random_int_find_find_timing_test.html new file mode 100644 index 00000000000..9317cfc948d --- /dev/null +++ b/libstdc++-v3/doc/html/ext/pb_ds/tree_random_int_find_find_timing_test.html @@ -0,0 +1,160 @@ + + + + + +Tree Text Find Timing Test + + + +
+

Tree-Based and Trie-Based Text find Find Timing + Test

+

Description

+

This test inserts a number of values with keys from an + arbitrary text ([wickland96thirty]) into + a container, then performs a series of finds using + find. It measures the average time for find + as a function of the number of values inserted.

+

(The test was executed with text_find_timing_test + thirty_years_among_the_dead_preproc.txt 200 200 2100)

+

Purpose

+

The test checks the effect of different underlying + data structures.

+

Results

+

Figures NTTG, NTTM, + and NTTL show the results for the native, + tree-based, and trie-based types in g++, local, and + local, + respectively.

+
+
+
+
+
no image
NTTG: Native, tree-based, random int find timing test using find - g++

In the above figure, the names in the legends have the following meaning:

+
    +
  1. +splay_tree_map- +tree + with Tag = splay_tree_tag +, and Node_Update = null_tree_node_update +
  2. +
  3. +ov_tree_map- +tree + with Tag = ov_tree_tag +, and Node_Update = null_tree_node_update +
  4. +
  5. +n_map- +std::map
  6. +
  7. +rb_tree_map- +tree + with Tag = rb_tree_tag +, and Node_Update = null_tree_node_update +
  8. +
+
+
+
+
+
+
+
+
no image
NTTM: Native, tree-based, random int find timing test using find - msvc++

In the above figure, the names in the legends have the following meaning:

+
    +
  1. +splay_tree_map- +tree + with Tag = splay_tree_tag +, and Node_Update = null_tree_node_update +
  2. +
  3. +ov_tree_map- +tree + with Tag = ov_tree_tag +, and Node_Update = null_tree_node_update +
  4. +
  5. +n_map- +std::map
  6. +
  7. +rb_tree_map- +tree + with Tag = rb_tree_tag +, and Node_Update = null_tree_node_update +
  8. +
+
+
+
+
+
+
+
+
no image
NTTL: Native, tree-based, random int find timing test using find - local
+
+
+

Observations

+

For this setting, a splay tree (tree + with Tag = splay_tree_tag) + does not do well. This is possibly due to two + reasons:

+
    +
  1. A splay tree is not guaranteed to be balanced + [motwani95random]. + If a splay tree contains n nodes, its + average root-leaf path can be m >> + log(n).
  2. +
  3. Assume a specific root-leaf search path has + length m, and the search-target node has + distance m' from the root. A red-black + tree will require m + 1 comparisons to + find the required node; a splay tree will require + 2 m' comparisons. A splay tree, + consequently, can perform many more comparisons + than a red-black tree.
  4. +
+

An ordered-vector tree (tree + with Tag = ov_tree_tag), + a red-black tree (tree + with Tag = rb_tree_tag), + and the native red-black tree all share + approximately the same performance.

+

An ordered-vector tree is slightly slower than + red-black trees, since it requires, in order to + find a key, more math operations than they do. + Conversely, an ordered-vector tree requires far + lower space than the others. ([austern00noset], + however, seems to have an implementation that is + also faster than a red-black tree).

+

A PATRICIA trie (trie + with Tag = pat_trie_tag) + has good look-up performance, due to its large + fan-out in this case. In this setting, a PATRICIA + trie has lookup performance comparable to a hash + table (see Hash-Based + Text find Find Timing Test), but it is + order preserving. This is not that surprising, + since a large fan-out PATRICIA trie works like a + hash table with collisions resolved by a sub-trie. + A large fan-out PATRICIA trie does not do well on + modifications (see Tree-Based and + Trie-Based Text Insert Timing Test). It is + possibly beneficial to semi-static settings, + therefore.

+

+ Observations::Tree-Like-Based Container Types + summarizes some observations on tree-based and + trie-based containers.

+
+
+
+
+
+
+
+ + diff --git a/libstdc++-v3/doc/html/ext/pb_ds/tree_split_join_timing_test.html b/libstdc++-v3/doc/html/ext/pb_ds/tree_split_join_timing_test.html new file mode 100644 index 00000000000..11db03d3ca0 --- /dev/null +++ b/libstdc++-v3/doc/html/ext/pb_ds/tree_split_join_timing_test.html @@ -0,0 +1,143 @@ + + + + + +Tree Split Join Timing Test + + + +
+

Tree Split-Join Timing Test

+

Description

+

This test a container, inserts into a number of values, + splits the container at the median, and joins the two + containers. (If the containers are one of pb_ds 's + trees, it splits and joins with the split and + join method; otherwise, it uses the erase and + insert methods.) It measures the time for splitting + and joining the containers as a function of the number of + values inserted.

+

(The test was executed with tree_split_join_timing_test + 200 200 2100)

+

Purpose

+

The test checks the performance difference of join + as opposed to a sequence of insert operations; by + implication, this test checks the most efficient way to erase a + sub-sequence from a tree-like-based container, since this can + always be performed by a small sequence of splits and joins + (see Motivation::Associative + Containers::Slightly Different Methods::Methods Related to + Split and Join and Design::Associative + Containers::Tree-Based Containers::Additional Methods + .)

+

Results

+

Figures NTG, NTM, and + NTL show the results for the native and + tree-based containers in g++, msvc++, and + local, + respectively.

+
+
+
+
+
no image
NTG: Native and tree-based container splits and joins - g++

In the above figure, the names in the legends have the following meaning:

+
    +
  1. +n_set- +std::set
  2. +
  3. +splay_tree_set- +tree + with Tag = splay_tree_tag +, and Node_Update = null_tree_node_update +
  4. +
  5. +rb_tree_set- +tree + with Tag = rb_tree_tag +, and Node_Update = null_tree_node_update +
  6. +
  7. +ov_tree_set- +tree + with Tag = ov_tree_tag +, and Node_Update = null_tree_node_update +
  8. +
+
+
+
+
+
+
+
+
+
+
no image
NTM: Native and tree-based container splits and joins - msvc++

In the above figure, the names in the legends have the following meaning:

+
    +
  1. +n_set- +std::set
  2. +
  3. +splay_tree_set- +tree + with Tag = splay_tree_tag +, and Node_Update = null_tree_node_update +
  4. +
  5. +rb_tree_set- +tree + with Tag = rb_tree_tag +, and Node_Update = null_tree_node_update +
  6. +
  7. +ov_tree_set- +tree + with Tag = ov_tree_tag +, and Node_Update = null_tree_node_update +
  8. +
+
+
+
+
+
+
+
+
+
+
no image
NTL: Native and tree-based container splits and joins - local
+
+
+
+
+

Observations

+

In this test, the native red-black trees must be split and + joined externally, through a sequence of erase and + insert operations. This is clearly super-linear, and + it is not that surprising that the cost is high.

+

pb_ds 's tree-based containers use in this test the + split and join methods, which have lower + complexity: the join method of a splay tree ( tree + with Tag = splay_tree_tag ) is + quadratic in the length of the longest root-leaf path, and + linear in the total number of elements; the join + method of a red-black tree ( tree + with Tag = rb_tree_tag ) or an + ordered-vector tree ( tree + with Tag = ov_tree_tag ) is linear + in the number of elements.

+

Asides from orders of growth, pb_ds 's trees access + their allocator very little in these operations, and some of + them do not access it at all. This leads to lower constants in + their complexity, and, for some containers, to exception-free + splits and joins (which can be determined via container_traits).

+

It is important to note that split and + join are not esoteric methods - they are the most + efficient means of erasing a contiguous range of values from a + tree based container.

+
+ + diff --git a/libstdc++-v3/doc/html/ext/pb_ds/tree_split_join_timing_test_gcc.png b/libstdc++-v3/doc/html/ext/pb_ds/tree_split_join_timing_test_gcc.png new file mode 100644 index 00000000000..88867eca6bd Binary files /dev/null and b/libstdc++-v3/doc/html/ext/pb_ds/tree_split_join_timing_test_gcc.png differ diff --git a/libstdc++-v3/doc/html/ext/pb_ds/tree_split_join_timing_test_local.png b/libstdc++-v3/doc/html/ext/pb_ds/tree_split_join_timing_test_local.png new file mode 100644 index 00000000000..131d24a1a12 Binary files /dev/null and b/libstdc++-v3/doc/html/ext/pb_ds/tree_split_join_timing_test_local.png differ diff --git a/libstdc++-v3/doc/html/ext/pb_ds/tree_split_join_timing_test_msvc.png b/libstdc++-v3/doc/html/ext/pb_ds/tree_split_join_timing_test_msvc.png new file mode 100644 index 00000000000..37ed1b2e7c0 Binary files /dev/null and b/libstdc++-v3/doc/html/ext/pb_ds/tree_split_join_timing_test_msvc.png differ diff --git a/libstdc++-v3/doc/html/ext/pb_ds/tree_tag.html b/libstdc++-v3/doc/html/ext/pb_ds/tree_tag.html new file mode 100644 index 00000000000..e4b20607805 --- /dev/null +++ b/libstdc++-v3/doc/html/ext/pb_ds/tree_tag.html @@ -0,0 +1,47 @@ + + + + + + + tree_tag Interface + + + + +
+

tree_tag Interface

+ +

Basic tree data structure tag.

+ +

Defined in: tag_and_trait.hpp

+ +

Base Classes

+ + + + + + + + + + + + + +
ClassDerivation Type
+
+basic_tree_tag
+
+
+

public

+
+
+ + diff --git a/libstdc++-v3/doc/html/ext/pb_ds/tree_text_find_find_timing_test.html b/libstdc++-v3/doc/html/ext/pb_ds/tree_text_find_find_timing_test.html new file mode 100644 index 00000000000..283bdf098cd --- /dev/null +++ b/libstdc++-v3/doc/html/ext/pb_ds/tree_text_find_find_timing_test.html @@ -0,0 +1,162 @@ + + + + + +Tree Text Find Timing Test + + + +
+

Tree-Based and Trie-Based Text find Find Timing + Test

+

Description

+

This test inserts a number of values with keys from an + arbitrary text ([wickland96thirty]) into + a container, then performs a series of finds using + find. It measures the average time for find + as a function of the number of values inserted.

+

(The test was executed with text_find_timing_test + thirty_years_among_the_dead_preproc.txt 200 200 2100)

+

Purpose

+

The test checks the effect of different underlying + data structures.

+

Results

+

Figures NTTG, NTTM, + and NTTL show the results for the native, + tree-based, and trie-based types in g++, local, and + local, + respectively.

+
+
+
+
+
no image
NTTG: Native, tree-based, and trie-based, text find timing test using find - g++

In the above figure, the names in the legends have the following meaning:

+
    +
  1. +splay_tree_map- +tree + with Tag = splay_tree_tag +, and Node_Update = null_tree_node_update +
  2. +
  3. +ov_tree_map- +tree + with Tag = ov_tree_tag +, and Node_Update = null_tree_node_update +
  4. +
  5. +rb_tree_map- +tree + with Tag = rb_tree_tag +, and Node_Update = null_tree_node_update +
  6. +
  7. +n_map- +std::map
  8. +
  9. +pat_trie_map- +trie + with Tag = pat_trie_tag +, and Node_Update = null_trie_node_update +
  10. +
+
+
+
+
+
+
+
+
+
+
no image
NTTM: Native, tree-based, and trie-based, text find timing test using find - msvc++

In the above figure, the names in the legends have the following meaning:

+
    +
  1. +splay_tree_map- +tree + with Tag = splay_tree_tag +, and Node_Update = null_tree_node_update +
  2. +
  3. +ov_tree_map- +tree + with Tag = ov_tree_tag +, and Node_Update = null_tree_node_update +
  4. +
  5. +rb_tree_map- +tree + with Tag = rb_tree_tag +, and Node_Update = null_tree_node_update +
  6. +
  7. +n_map- +std::map
  8. +
  9. +pat_trie_map- +trie + with Tag = pat_trie_tag +, and Node_Update = null_trie_node_update +
  10. +
+
+
+
+
+
+
+
+
+
+
no image
NTTL: Native, tree-based, and trie-based, text find timing test using find - local
+
+
+
+
+

Observations

+

For this setting, a splay tree (tree + with Tag = splay_tree_tag) does + not do well. This is possibly due to two reasons:

+
    +
  1. A splay tree is not guaranteed to be balanced [motwani95random]. If a + splay tree contains n nodes, its average root-leaf + path can be m >> log(n).
  2. +
  3. Assume a specific root-leaf search path has length + m, and the search-target node has distance m' + from the root. A red-black tree will require m + 1 + comparisons to find the required node; a splay tree will + require 2 m' comparisons. A splay tree, consequently, + can perform many more comparisons than a red-black tree.
  4. +
+

An ordered-vector tree (tree + with Tag = ov_tree_tag), a red-black + tree (tree + with Tag = rb_tree_tag), and the + native red-black tree all share approximately the same + performance.

+

An ordered-vector tree is slightly slower than red-black + trees, since it requires, in order to find a key, more math + operations than they do. Conversely, an ordered-vector tree + requires far lower space than the others. ([austern00noset], however, + seems to have an implementation that is also faster than a + red-black tree).

+

A PATRICIA trie (trie + with Tag = pat_trie_tag) has good + look-up performance, due to its large fan-out in this case. In + this setting, a PATRICIA trie has look-up performance comparable + to a hash table (see Hash-Based Text + find Find Timing Test), but it is order + preserving. This is not that surprising, since a large-fan-out + PATRICIA trie works like a hash table with collisions resolved + by a sub-trie. A large-fan-out PATRICIA trie does not do well on + modifications (see Tree-Based and Trie-Based + Text Insert Timing Test). It is possibly beneficial to + semi-static settings, therefore.

+

Observations::Tree-Like-Based + Container Types summarizes some observations on tree-based + and trie-based containers.

+
+ + diff --git a/libstdc++-v3/doc/html/ext/pb_ds/tree_text_insert_timing_test.html b/libstdc++-v3/doc/html/ext/pb_ds/tree_text_insert_timing_test.html new file mode 100644 index 00000000000..6f0e26c00d6 --- /dev/null +++ b/libstdc++-v3/doc/html/ext/pb_ds/tree_text_insert_timing_test.html @@ -0,0 +1,226 @@ + + + + + +Tree Text Insert Timing Test + + + +
+

Tree-Based and Trie-Based Text Insert Timing Test

+

Description

+

This test inserts a number of values with keys from an + arbitrary text ([ wickland96thirty ]) into + a container using insert . It measures the average + time for insert as a function of the number of values + inserted.

+

(The test was executed with tree_text_insert_timing_test + thirty_years_among_the_dead_preproc.txt 200 200 2100)

+

Purpose

+

The test checks the effect of different underlying + data structures.

+

Results

+

Figures NNTG, NVTG, + and NPTG show the results for the native + tree and pb_ds's node-based trees, the native tree and + pb_ds's vector-based trees, and the native tree + andpb_ds's PATRICIA-trie, respectively, in g++; Figures + NNTM, NVTM, and + NPTM show the same in msvc++; Figures + NNTL, NVTL, and + NPTL show the same in local.

+
+
+
+
+
no image
NNTG: Native tree and node-based trees text insert timing test using insert - g++

In the above figure, the names in the legends have the following meaning:

+
    +
  1. +splay_tree_map- +tree + with Tag = splay_tree_tag +, and Node_Update = null_tree_node_update +
  2. +
  3. +n_map- +std::map
  4. +
  5. +rb_tree_map- +tree + with Tag = rb_tree_tag +, and Node_Update = null_tree_node_update +
  6. +
+
+
+
+
+
+
+
+
+
+
no image
NVTG: Native tree and vector-based tree text insert timing test using insert - g++

In the above figure, the names in the legends have the following meaning:

+
    +
  1. +ov_tree_map- +tree + with Tag = ov_tree_tag +, and Node_Update = null_tree_node_update +
  2. +
  3. +n_map- +std::map
  4. +
+
+
+
+
+
+
+
+
+
+
no image
NPTG: Native tree and PATRICIA trie text insert timing test using insert - g++

In the above figure, the names in the legends have the following meaning:

+
    +
  1. +n_map- +std::map
  2. +
  3. +pat_trie_map- +trie + with Tag = pat_trie_tag +, and Node_Update = null_trie_node_update +
  4. +
+
+
+
+
+
+
+
+
+
+
no image
NNTM: Native tree and node-based trees text insert timing test using insert - msvc++

In the above figure, the names in the legends have the following meaning:

+
    +
  1. +splay_tree_map- +tree + with Tag = splay_tree_tag +, and Node_Update = null_tree_node_update +
  2. +
  3. +n_map- +std::map
  4. +
  5. +rb_tree_map- +tree + with Tag = rb_tree_tag +, and Node_Update = null_tree_node_update +
  6. +
+
+
+
+
+
+
+
+
+
+
no image
NVTM: Native tree and vector-based tree text insert timing test using insert - msvc++

In the above figure, the names in the legends have the following meaning:

+
    +
  1. +ov_tree_map- +tree + with Tag = ov_tree_tag +, and Node_Update = null_tree_node_update +
  2. +
  3. +n_map- +std::map
  4. +
+
+
+
+
+
+
+
+
+
+
no image
NPTM: Native tree and PATRICIA trie text insert timing test using insert - msvc++

In the above figure, the names in the legends have the following meaning:

+
    +
  1. +pat_trie_map- +trie + with Tag = pat_trie_tag +, and Node_Update = null_trie_node_update +
  2. +
  3. +n_map- +std::map
  4. +
+
+
+
+
+
+
+
+
+
+
no image
NNTL: Native tree and node-based trees text insert timing test using insert - local
+
+
+
+
+
+
+
+
+
no image
NVTL: Native tree and vector-based tree text insert timing test using insert - local
+
+
+
+
+
+
+
+
+
no image
NPTL: Native tree and PATRICIA trie text insert timing test using insert - local
+
+
+
+
+

Observations

+

Observing Figure NNTG , for this + setting, a splay tree, ( tree + with Tag = splay_tree_tag ) does + not do well. This was covered in Tree-Based and + Trie-Based Text find Find Timing Test . The two + red-black trees perform better.

+

Observing Figure NVTG, an ordered-vector + tree ( tree + with Tag = ov_tree_tag) performs + abysmally. Inserting into this type of tree has linear + complexity [ austern00noset].

+

Observing Figure NPTG , A PATRICIA trie + ( trie + with Tag = pat_trie_tag ) has + abysmal performance, as well. This is not that surprising, + since a large-fan-out PATRICIA trie works like a hash table with + collisions resolved by a sub-trie. Each time a collision is + encountered, a new "hash-table" is built A large fan-out + PATRICIA trie, however, doe does well in look-ups (see Tree-Based and + Trie-Based Text find Find Timing Test ). It is + possibly beneficial to semi-static settings, therefore.

+

Observations::Tree-Like-Based + Container Types summarizes some observations on tree-based + and trie-based containers.

+
+ + diff --git a/libstdc++-v3/doc/html/ext/pb_ds/tree_text_insert_timing_test_node_tree_gcc.png b/libstdc++-v3/doc/html/ext/pb_ds/tree_text_insert_timing_test_node_tree_gcc.png new file mode 100644 index 00000000000..22d8f6fc213 Binary files /dev/null and b/libstdc++-v3/doc/html/ext/pb_ds/tree_text_insert_timing_test_node_tree_gcc.png differ diff --git a/libstdc++-v3/doc/html/ext/pb_ds/tree_text_insert_timing_test_node_tree_local.png b/libstdc++-v3/doc/html/ext/pb_ds/tree_text_insert_timing_test_node_tree_local.png new file mode 100644 index 00000000000..bb100084b3f Binary files /dev/null and b/libstdc++-v3/doc/html/ext/pb_ds/tree_text_insert_timing_test_node_tree_local.png differ diff --git a/libstdc++-v3/doc/html/ext/pb_ds/tree_text_insert_timing_test_node_tree_msvc.png b/libstdc++-v3/doc/html/ext/pb_ds/tree_text_insert_timing_test_node_tree_msvc.png new file mode 100644 index 00000000000..18b219851c2 Binary files /dev/null and b/libstdc++-v3/doc/html/ext/pb_ds/tree_text_insert_timing_test_node_tree_msvc.png differ diff --git a/libstdc++-v3/doc/html/ext/pb_ds/tree_text_insert_timing_test_pat_trie_gcc.png b/libstdc++-v3/doc/html/ext/pb_ds/tree_text_insert_timing_test_pat_trie_gcc.png new file mode 100644 index 00000000000..5fe063e63c2 Binary files /dev/null and b/libstdc++-v3/doc/html/ext/pb_ds/tree_text_insert_timing_test_pat_trie_gcc.png differ diff --git a/libstdc++-v3/doc/html/ext/pb_ds/tree_text_insert_timing_test_pat_trie_local.png b/libstdc++-v3/doc/html/ext/pb_ds/tree_text_insert_timing_test_pat_trie_local.png new file mode 100644 index 00000000000..228de144222 Binary files /dev/null and b/libstdc++-v3/doc/html/ext/pb_ds/tree_text_insert_timing_test_pat_trie_local.png differ diff --git a/libstdc++-v3/doc/html/ext/pb_ds/tree_text_insert_timing_test_pat_trie_msvc.png b/libstdc++-v3/doc/html/ext/pb_ds/tree_text_insert_timing_test_pat_trie_msvc.png new file mode 100644 index 00000000000..9f13db0c093 Binary files /dev/null and b/libstdc++-v3/doc/html/ext/pb_ds/tree_text_insert_timing_test_pat_trie_msvc.png differ diff --git a/libstdc++-v3/doc/html/ext/pb_ds/tree_text_insert_timing_test_vector_tree_gcc.png b/libstdc++-v3/doc/html/ext/pb_ds/tree_text_insert_timing_test_vector_tree_gcc.png new file mode 100644 index 00000000000..dd85dcd7ca2 Binary files /dev/null and b/libstdc++-v3/doc/html/ext/pb_ds/tree_text_insert_timing_test_vector_tree_gcc.png differ diff --git a/libstdc++-v3/doc/html/ext/pb_ds/tree_text_insert_timing_test_vector_tree_local.png b/libstdc++-v3/doc/html/ext/pb_ds/tree_text_insert_timing_test_vector_tree_local.png new file mode 100644 index 00000000000..cecb8a10750 Binary files /dev/null and b/libstdc++-v3/doc/html/ext/pb_ds/tree_text_insert_timing_test_vector_tree_local.png differ diff --git a/libstdc++-v3/doc/html/ext/pb_ds/tree_text_insert_timing_test_vector_tree_msvc.png b/libstdc++-v3/doc/html/ext/pb_ds/tree_text_insert_timing_test_vector_tree_msvc.png new file mode 100644 index 00000000000..8c07313910f Binary files /dev/null and b/libstdc++-v3/doc/html/ext/pb_ds/tree_text_insert_timing_test_vector_tree_msvc.png differ diff --git a/libstdc++-v3/doc/html/ext/pb_ds/tree_text_lor_find_find_timing_test.html b/libstdc++-v3/doc/html/ext/pb_ds/tree_text_lor_find_find_timing_test.html new file mode 100644 index 00000000000..48d0112c6ea --- /dev/null +++ b/libstdc++-v3/doc/html/ext/pb_ds/tree_text_lor_find_find_timing_test.html @@ -0,0 +1,126 @@ + + + + + +Tree Text Locality of Reference Find Timing Test + + + +
+

Tree-Based Locality-of-Reference Text find Find + Timing Test

+

Description

+

This test inserts a number of values with keys from an + arbitrary text ([ wickland96thirty ]) into + a container, then performs a series of finds using + find . It is different than Tree-Based and + Trie-Based Text find Find Timing Test in the + sequence of finds it performs: this test performs multiple + find s on the same key before moving on to the next + key. It measures the average time for find as a + function of the number of values inserted.

+

(The test was executed with tree_text_lor_find_timing_test + thirty_years_among_the_dead_preproc.txt 200 200 2100)

+

Purpose

+

The test checks the effect of different underlying + data structures in a locality-of-reference setting.

+

Results

+

Figures NTG, NTM, and + NTL show the results for the native and + pb_ds tree-based types in g++, msvc++ and + local, + respectively.

+
+
+
+
+
no image
NTG: Native and tree-based locality-of-reference text find timing test using find - g++

In the above figure, the names in the legends have the following meaning:

+
    +
  1. +ov_tree_map- +tree + with Tag = ov_tree_tag +, and Node_Update = null_tree_node_update +
  2. +
  3. +rb_tree_map- +tree + with Tag = rb_tree_tag +, and Node_Update = null_tree_node_update +
  4. +
  5. +n_map- +std::map
  6. +
  7. +splay_tree_map- +tree + with Tag = splay_tree_tag +, and Node_Update = null_tree_node_update +
  8. +
+
+
+
+
+
+
+
+
+
+
no image
NTM: Native and tree-based locality-of-reference text find timing test using find - msvc++

In the above figure, the names in the legends have the following meaning:

+
    +
  1. +ov_tree_map- +tree + with Tag = ov_tree_tag +, and Node_Update = null_tree_node_update +
  2. +
  3. +rb_tree_map- +tree + with Tag = rb_tree_tag +, and Node_Update = null_tree_node_update +
  4. +
  5. +n_map- +std::map
  6. +
  7. +splay_tree_map- +tree + with Tag = splay_tree_tag +, and Node_Update = null_tree_node_update +
  8. +
+
+
+
+
+
+
+
+
+
+
no image
NTL: Native and tree-based locality-of-reference text find timing test using find - local
+
+
+
+
+

Observations

+

For this setting, an ordered-vector tree ( tree + with Tag = ov_tree_tag ), a + red-black tree ( tree + with Tag = rb_tree_tag ), and the + native red-black tree all share approximately the same + performance.

+

A splay tree ( tree + with Tag = splay_tree_tag ) does + much better, since each (successful) find "bubbles" the + corresponding node to the root of the tree.

+

Observations::Tree-Like-Based + Container Types summarizes some observations on tree-based + and trie-based containers.

+
+ + diff --git a/libstdc++-v3/doc/html/ext/pb_ds/tree_text_lor_find_timing_test_gcc.png b/libstdc++-v3/doc/html/ext/pb_ds/tree_text_lor_find_timing_test_gcc.png new file mode 100644 index 00000000000..cf5174d99c1 Binary files /dev/null and b/libstdc++-v3/doc/html/ext/pb_ds/tree_text_lor_find_timing_test_gcc.png differ diff --git a/libstdc++-v3/doc/html/ext/pb_ds/tree_text_lor_find_timing_test_local.png b/libstdc++-v3/doc/html/ext/pb_ds/tree_text_lor_find_timing_test_local.png new file mode 100644 index 00000000000..26f71510ff0 Binary files /dev/null and b/libstdc++-v3/doc/html/ext/pb_ds/tree_text_lor_find_timing_test_local.png differ diff --git a/libstdc++-v3/doc/html/ext/pb_ds/tree_text_lor_find_timing_test_msvc.png b/libstdc++-v3/doc/html/ext/pb_ds/tree_text_lor_find_timing_test_msvc.png new file mode 100644 index 00000000000..583a027f3dc Binary files /dev/null and b/libstdc++-v3/doc/html/ext/pb_ds/tree_text_lor_find_timing_test_msvc.png differ diff --git a/libstdc++-v3/doc/html/ext/pb_ds/trie.html b/libstdc++-v3/doc/html/ext/pb_ds/trie.html new file mode 100644 index 00000000000..71a86883386 --- /dev/null +++ b/libstdc++-v3/doc/html/ext/pb_ds/trie.html @@ -0,0 +1,489 @@ + + + + + + + trie Interface + + + + +
+

trie Interface

+ +

A concrete basic trie-based associative container.

+ +

Defined in: assoc_container.hpp

+ +

Template Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterDescriptionDefault Value
+
+typename Key
+
+
+

Key type.

+
-
+
+typename Mapped
+
+
+

Mapped type.

+
-
+
+class E_Access_Traits 
+
+
+

Element-access traits.

+
-
+
+class Tag 
+
+
+

Data-structure tag.

+
pat_trie_tag
+
+template< 
+  typename Const_Node_Iterator, 
+  typename Node_Iterator, 
+  class E_Access_Traits_, 
+  typename Allocator_>
+class Node_Update 
+
+
+

Node updater type.

+ +

Design::Tree-Based + Containers::Node Invariants explains this + concept.

+
null_trie_node_update
+
+class Allocator 
+
+
+

Allocator type.

+
+
+std::allocator<char>
+
+
+ +

Public Types and + Constants

+ +

Policy Definitions

+ + + + + + + + + + + + + + + + + +
TypeDefinitionDescription
+
+e_access_traits
+
+
+
+E_Access_Traits
+
+
+

Element access traits type.

+
+ +

Iterator Definitions

+ + + + + + + + + + + + + + + + + + + + + + + + + +
TypeDefinitionDescription
+
+const_node_iterator
+
+
+
+const_node_iterator
+
+
+

Const node iterator.

+
+
+node_iterator
+
+
+
+node_iterator
+
+
+

Node iterator.

+
+ +

Public Methods

+ +

Constructors, Destructor, and + Related

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDescription
+
+  trie
+  ()
+
+
+

Default constructor.

+
+
+  trie
+  (const E_Access_Traits &r_e_access_traits)
+
+
+

Constructor taking some policy objects. r_e_access_traits will be copied by + the E_Access_Traits + object of the container object.

+
+
+template<
+    class It>
+  trie
+  (It first_it, 
+    It last_it)
+
+
+

Constructor taking iterators to a range of + value_types. The value_types between first_it and last_it will be inserted into the + container object.

+
+
+template<
+    class It>
+  trie
+  (It first_it, 
+    It last_it,
+    const E_Access_Traits &r_e_access_traits)
+
+
+

Constructor taking iterators to a range of value_types + and some policy objects. The value_types between + first_it and + last_it will be inserted + into the container object.

+
+
+  trie
+  (const trie &other)
+
+
+

Copy constructor.

+
+
+virtual 
+  ~trie
+  ()
+
+
+

Destructor.

+
+
+trie &
+  operator=
+  (const trie &other)
+
+
+

Assignment operator.

+
+
+void
+  swap
+  (trie &other)
+
+
+

Swaps content.

+
+ +

Policy Access Methods

+ + + + + + + + + + + + + + + + + + + +
MethodDescription
+
+e_access_traits &
+  get_e_access_traits
+  ()
+
+
+

Access to the comb_hash_fn object.

+
+
+e_access_traits &
+  get_e_access_traits
+  () const
+
+
+

Const access to the comb_hash_fn object.

+
+ +

Node-Iteration Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDescription
+
+node_iterator
+  node_begin
+  ()
+
+
+

Returns a node_iterator + corresponding to the node at the root of the trie.

+
+
+const_node_iterator
+  node_begin
+  () const
+
+
+

Returns a const_node_iterator + corresponding to the node at the root of the trie.

+
+
+node_iterator
+  node_end
+  ()
+
+
+

Returns a node_iterator + corresponding to a node just after a leaf of the + trie.

+
+
+const_node_iterator
+  node_end
+  () const
+
+
+

Returns a const_node_iterator + corresponding to a node just after a leaf of the + trie.

+
+
+ + diff --git a/libstdc++-v3/doc/html/ext/pb_ds/trie_based_containers.html b/libstdc++-v3/doc/html/ext/pb_ds/trie_based_containers.html new file mode 100644 index 00000000000..8b670bc11dc --- /dev/null +++ b/libstdc++-v3/doc/html/ext/pb_ds/trie_based_containers.html @@ -0,0 +1,241 @@ + + + + + + + Trie-Based Containers + + + + +
+

Trie Design

+ +

Overview

+ +

The trie-based container has the following declaration:

+
+template<
+    typename Key,
+    typename Mapped,
+    typename Cmp_Fn = std::less<Key>,
+    typename Tag =  pat_trie_tag,
+    template<
+        typename Const_Node_Iterator,
+        typename Node_Iterator,
+        typename E_Access_Traits_,
+        typename Allocator_>
+    class Node_Update = null_trie_node_update,
+    typename Allocator = std::allocator<char> >
+class trie;
+
+ +

The parameters have the following meaning:

+ +
    +
  1. Key is the key type.
  2. + +
  3. Mapped is the mapped-policy, and is explained in + Tutorial::Associative + Containers::Associative Containers Others than Maps.
  4. + +
  5. E_Access_Traits is described in Element-Access Traits.
  6. + +
  7. Tag specifies which underlying data structure + to use, and is described shortly.
  8. + +
  9. Node_Update is a policy for updating node + invariants. This is described in Node + Invariants.
  10. + +
  11. Allocator is an allocator + type.
  12. +
+ +

The Tag parameter specifies which underlying + data structure to use. Instantiating it by pat_trie_tag, specifies an + underlying PATRICIA trie (explained shortly); any other tag is + currently illegal.

+
+ +

Following is a description of a (PATRICIA) trie + (pb_ds follows specifically [okasaki98mereable] and + [filliatre2000ptset]).

+ +

A (PATRICIA) trie is similar to a tree, but with the + following differences:

+ +
    +
  1. It explicitly views keys as a sequence of elements. + E.g., a trie can view a string as a sequence of + characters; a trie can view a number as a sequence of + bits.
  2. + +
  3. It is not (necessarily) binary. Each node has fan-out n + + 1, where n is the number of distinct + elements.
  4. + +
  5. It stores values only at leaf nodes.
  6. + +
  7. Internal nodes have the properties that A) each has at + least two children, and B) each shares the same prefix with + any of its descendant.
  8. +
+ +

Element-Access Traits shows + an example of such a trie.

+ +

A (PATRICIA) trie has some useful properties:

+ +
    +
  1. It can be configured to use large node fan-out, giving it + very efficient find performance (albeit at insertion + complexity and size).
  2. + +
  3. It works well for common-prefix keys.
  4. + +
  5. It can support efficiently queries such as which keys + match a certain prefix. This is sometimes useful in + file systems and routers.
  6. +
+ +

(We would like to thank Matt Austern for the suggestion to + include tries.)

+ +

Element-Access Traits

+ +

A trie inherently views its keys as sequences of elements. + For example, a trie can view a string as a sequence of + characters. A trie needs to map each of n elements to a + number in {0, n - 1}. For example, a trie can map a + character c to + static_cast<size_t>(c).

+ +

Seemingly, then, a trie can assume that its keys support + (const) iterators, and that the value_type of this + iterator can be cast to a size_t. There are several + reasons, though, to decouple the mechanism by which the trie + accesses its keys' elements from the trie:

+ +
    +
  1. In some cases, the numerical value of an element is + inappropriate. Consider a trie storing DNA strings. It is + logical to use a trie with a fan-out of 5 = 1 + |{'A', 'C', + 'G', 'T'}|. This requires mapping 'T' to 3, though.
  2. + +
  3. In some cases the keys' iterators are different than what + is needed. For example, a trie can be used to search for + common suffixes, by using strings' + reverse_iterator. As another example, a trie mapping + UNICODE strings would have a huge fan-out if each node would + branch on a UNICODE character; instead, one can define an + iterator iterating over 8-bit (or less) groups.
  4. +
+ +

trie is, + consequently, parametrized by E_Access_Traits - + traits which instruct how to access sequences' elements. + string_trie_e_access_traits + is a traits class for strings. Each such traits define some + types, e.g.,

+
+typename E_Access_Traits::const_iterator
+
+ +

is a const iterator iterating over a key's elements. The + traits class must also define methods for obtaining an iterator + to the first and last element of a key.

+ +

Figure A PATRICIA trie shows a + (PATRICIA) trie resulting from inserting the words: "I wish + that I could ever see a poem lovely as a trie" (which, + unfortunately, does not rhyme).

+ +

The leaf nodes contain values; each internal node contains + two typename E_Access_Traits::const_iterator + objects, indicating the maximal common prefix of all keys in + the sub-tree. For example, the shaded internal node roots a + sub-tree with leafs "a" and "as". The maximal common prefix is + "a". The internal node contains, consequently, to const + iterators, one pointing to 'a', and the other to + 's'.

+ +
no image
+ +
A PATRICIA trie.
+ +

Node + Invariants

+ +

Trie-based containers support node invariants, as do + tree-based containers (see Tree-Based + Containers::Node Invariants). There are two minor + differences, though, which, unfortunately, thwart sharing them + sharing the same node-updating policies:

+ +
    +
  1. A trie's Node_Update template-template + parameter is parametrized by E_Access_Traits, while + a tree's Node_Update template-template parameter is + parametrized by Cmp_Fn.
  2. + +
  3. Tree-based containers store values in all nodes, while + trie-based containers (at least in this implementation) store + values in leafs.
  4. +
+ +

Figure A trie and its update + policy shows the scheme, as well as some predefined + policies (which are explained below).

+ +
no image
+ +
A trie and its update policy.
+ +

pb_ds offers the following pre-defined trie node + updating policies:

+ +
    +
  1. trie_order_statistics_node_update + supports order statistics.
  2. + +
  3. trie_prefix_search_node_update + supports searching for ranges that match a given prefix. See + trie_prefix_search.cc.
  4. + +
  5. null_trie_node_update + is the null node updater.
  6. +
+ +

Additional + Methods

+ +

Trie-based containers support split and join methods; the + rationale is equal to that of tree-based containers supporting + these methods (see Tree-Based + Containers::Additional Methods).

+
+ + diff --git a/libstdc++-v3/doc/html/ext/pb_ds/trie_const_node_iterator.html b/libstdc++-v3/doc/html/ext/pb_ds/trie_const_node_iterator.html new file mode 100644 index 00000000000..0869a7c2f5b --- /dev/null +++ b/libstdc++-v3/doc/html/ext/pb_ds/trie_const_node_iterator.html @@ -0,0 +1,478 @@ + + + + + + + trie::const_node_iterator + Interface + + + + +
+

trie::const_node_iterator + Interface

+ +

Const node iterator.

+ +

This is an "iterator to an iterator" - it iterates over + nodes, and de-referencing it returns one of the tree's const + iterators

+ +

Public Types and + Constants

+ +

General Container + Definitions

+ + + + + + + + + + + + + + + + + +
TypeDefinitionDescription
+
+size_type
+
+
+
+container_base::size_type
+
+
+

Size type.

+
+ +

Iterator Definitions

+ + + + + + + + + + + + + + + + + + + + + + + + + +
TypeDefinitionDescription
+
+iterator_category
+
+
+
+trivial_iterator_tag
+
+
+

Category.

+ +

This tag identifies that the iterator has none of the + STL's iterators' movement abilities.

+
+
+difference_type
+
+
+
+void
+
+
+

Difference type.

+
+ +

Value-Type Definitions

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
TypeDefinitionDescription
+
+value_type
+
+
+
+container_base::const_iterator
+
+
+

Iterator's value type.

+
+
+reference
+
+
+
+value_type
+
+
+

Iterator's reference type.

+
+
+const_reference
+
+
+
+value_type
+
+
+

Iterator's const reference type.

+
+
+e_access_traits
+
+
+
+trie::e_access_traits
+
+
+

Element access traits.

+
+
+const_e_iterator
+
+
+
+typename e_access_traits::const_iterator
+
+
+

A key's element const iterator.

+
+ +

Metadata Definitions

+ +

These are only defined if + basic_tree::Node_Update + is not null_trie_node_update

+ + + + + + + + + + + + + + + + + + + + + + + + + +
TypeDefinitionDescription
+
+metadata_type
+
+
+
+typename basic_tree::Node_Update::metadata_type
+
+
+

Metadata type.

+
+
+const_metadata_reference
+
+
+
+typename Allocator::template rebind<
+    metadata_type>::other::const_reference
+
+
+

Const metadata reference type.

+
+ +

Public Methods

+ +

Constructors, Destructor, and + Related

+ + + + + + + + + + + + + +
MethodDescription
+
+inline 
+  const_node_iterator
+  ()
+
+
+

Default constructor.

+
+ +

Access Methods

+ + + + + + + + + + + + + + + + + + + +
MethodDescription
+
+inline std::pair<
+    const_e_iterator,
+    const_e_iterator>
+  valid_prefix
+  () const
+
+
+

Subtree valid prefix.

+ +

Returns the common prefix range of all nodes in this + node's subtree.

+
+
+inline const_reference
+  operator*
+  () const
+
+
+

Const access; returns the const iterator associated + with the current leaf.

+ +

Should be called only for leaf nodes.

+
+ +

Metadata Access Methods

+ +

These are only defined if + basic_tree::Node_Update + is not null_trie_node_update

+ + + + + + + + + + + + + +
MethodDescription
+
+inline const_metadata_reference
+  get_metadata
+  () const
+
+
+

Metadata access.

+
+ +

Movement Methods

+ + + + + + + + + + + + + + + + + + + +
MethodDescription
+
+inline size_type
+  num_children
+  () const
+
+
+

Returns the number of children in the corresponding + node.

+ +

If the number of children is 0, then the corresponding + node is a leaf; otherwise, it is not a leaf.

+
+
+const_node_iterator
+  get_child
+  (size_type i) const
+
+
+

Returns a const node iterator to the corresponding + node's i-th child.

+
+ +

Comparison Methods

+ + + + + + + + + + + + + + + + + + + +
MethodDescription
+
+inline bool
+  operator==
+  (const const_node_iterator &other) const
+
+
+

Compares content to a different iterator object.

+
+
+inline bool
+  operator!=
+  (const const_node_iterator &other) const
+
+
+

Compares content (negatively) to a different iterator + object.

+
+
+ + diff --git a/libstdc++-v3/doc/html/ext/pb_ds/trie_node_iterator.html b/libstdc++-v3/doc/html/ext/pb_ds/trie_node_iterator.html new file mode 100644 index 00000000000..55029c4cb91 --- /dev/null +++ b/libstdc++-v3/doc/html/ext/pb_ds/trie_node_iterator.html @@ -0,0 +1,235 @@ + + + + + + + trie::node_iterator Interface + + + + +
+

trie::node_iterator + Interface

+ +

Node iterator.

+ +

This is an "iterator to an iterator" - it iterates over + nodes, and de-referencing it returns one of the tree's + iterators

+ +

Base Classes

+ + + + + + + + + + + + + +
ClassDerivation Type
+
+trie::const_node_iterator
+
+
+

public

+
+ +

Public Types and + Constants

+ +

General Container + Definitions

+ + + + + + + + + + + + + + + + + +
TypeDefinitionDescription
+
+size_type
+
+
+
+typename trie::const_node_iterator::size_type
+
+
+

Size type.

+
+ +

Value-Type Definitions

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
TypeDefinitionDescription
+
+value_type
+
+
+
+container_base::iterator
+
+
+

Iterator's value type.

+
+
+reference
+
+
+
+value_type
+
+
+

Iterator's reference type.

+
+
+const_reference
+
+
+
+value_type
+
+
+

Iterator's const reference type.

+
+ +

Public Methods

+ +

Constructors, Destructor, and + Related

+ + + + + + + + + + + + + +
MethodDescription
+
+inline 
+  pat_trie_node_it_
+  () 
+
+
+

Default constructor.

+
+ +

Access Methods

+ + + + + + + + + + + + + +
MethodDescription
+
+inline reference
+  operator*
+  () const
+
+
+

Access; returns the iterator associated with the + current leaf.

+ +

Should be called only for leaf nodes.

+
+ +

Movement Methods

+ + + + + + + + + + + + + +
MethodDescription
+
+node_iterator
+  get_child
+  (size_type i) const
+
+
+

Returns a node iterator to the corresponding node's + i-th child.

+
+
+ + diff --git a/libstdc++-v3/doc/html/ext/pb_ds/trie_node_updator_policy_cd.png b/libstdc++-v3/doc/html/ext/pb_ds/trie_node_updator_policy_cd.png new file mode 100644 index 00000000000..4376929ec28 Binary files /dev/null and b/libstdc++-v3/doc/html/ext/pb_ds/trie_node_updator_policy_cd.png differ diff --git a/libstdc++-v3/doc/html/ext/pb_ds/trie_order_statistics_node_update.html b/libstdc++-v3/doc/html/ext/pb_ds/trie_order_statistics_node_update.html new file mode 100644 index 00000000000..dcc236ff520 --- /dev/null +++ b/libstdc++-v3/doc/html/ext/pb_ds/trie_order_statistics_node_update.html @@ -0,0 +1,770 @@ + + + + + + + trie_order_statistics_node_update Interface + + + + +
+

trie_order_statistics_node_update Interface

+ +

Functor updating ranks of entrees.

+ +

Defined in: trie_policy.hpp

+ +

Template Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterDescriptionDefault Value
+
+class Const_Node_Iterator
+
+
+

Const node iterator type.

+
-
+
+class Node_Iterator
+
+
+

Node iterator type.

+
-
+
+class E_Access_Traits
+
+
+

Comparison functor.

+
-
+
+class Allocator
+
+
+

Allocator type.

+
-
+ +

Public Types and + Constants

+ +

Policy Definitions

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
TypeDefinitionDescription
+
+e_access_traits
+
+
+
+E_Access_Traits
+
+
+

Element access traits.

+
+
+const_e_iterator
+
+
+
+typename e_access_traits::const_iterator
+
+
+

Const element iterator.

+
+
+allocator
+
+
+
+Allocator
+
+
+

Allocator + type.

+
+ +

General Definitions

+ + + + + + + + + + + + + + + + + +
TypeDefinitionDescription
+
+size_type
+
+
+
+typename allocator::size_type
+
+
+

Size type.

+
+ +

Key-Type Definitions

+ + + + + + + + + + + + + + + + + + + + + + + + + +
TypeDefinitionDescription
+
+key_type
+
+
+
+The instantiating container's key type.
+
+
+

Key type.

+
+
+const_key_reference
+
+
+
+The instantiating container's const key reference type.
+
+
+

Const key reference.

+
+ +

Metadata-Type + Definitions

+ + + + + + + + + + + + + + + + + +
TypeDefinitionDescription
+
+metadata_type
+
+
+
+size_type
+
+
+

Metadata type.

+
+ +

Iterator Definitions

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
TypeDefinitionDescription
+
+const_node_iterator
+
+
+
+Const_Node_Iterator
+
+
+

Const node iterator type.

+
+
+node_iterator
+
+
+
+Node_Iterator
+
+
+

Node iterator type.

+
+
+const_iterator
+
+
+
+typename const_node_iterator::value_type
+
+
+

Const iterator type.

+
+
+iterator
+
+
+
+typename node_iterator::value_type
+
+
+

Iterator type.

+
+ +

Public Methods

+ +

Find-Type Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDescription
+
+inline const_iterator
+  find_by_order
+  (size_type order) const
+
+
+

Finds an entry by order. Returns a const_iterator to + the entry with the order order, or a const_iterator to + the container object's end if order is at least the size of the + container object.

+
+
+inline iterator
+  find_by_order
+  (size_type order)
+
+
+

Finds an entry by order. Returns an iterator to the entry + with the order order, or + an iterator to + the container object's end if order is at least the size of the + container object.

+
+
+inline size_type
+  order_of_key
+  (const_key_reference r_key) const
+
+
+

Returns the order of a key within a sequence. For + example, if r_key is the + smallest key, this method will return 0; if r_key is a key between the smallest + and next key, this method will return 1; if r_key is a key larger than the + largest key, this method will return the size of r_c.

+
+
+inline size_type
+  order_of_prefix
+  (const_e_iterator b,
+    const_e_iterator e) const
+
+
+

Returns the order of a prefix within a sequence. For + eexample, if [b, + e] is the smallest + prefix, this method will return 0; if r_key is a key + bbetween the smallest and + next key, this method will return 1; if r_key is a key + larger than the largest key, this method will return the + size of r_c.

+
+ +

Protected Types and + Constants

+ +

Value-Type + Definitions

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
TypeDefinitionDescription
+
+const_reference
+
+
+
+The instantiating container's const reference  type.
+
+
+

Const reference to the container's value-type.

+
+
+const_pointer
+
+
+
+The instantiating container's const pointer  type.
+
+
+

Const pointer to the container's value-type.

+
+
+const_metadata_reference
+
+
+
+typename Allocator::template rebind<
+    metadata_type>::other::const_reference
+
+
+

Const metadata reference.

+
+
+metadata_reference
+
+
+
+typename Allocator::template rebind<
+    metadata_type>::other::reference
+
+
+

Metadata reference.

+
+ +

Protected Methods

+ +

Operators

+ + + + + + + + + + + + + +
MethodDescription
+
+inline void
+  operator()
+  (node_iterator node_it,
+    const_node_iterator end_nd_it) const
+
+
+

Updates the rank of a node through a node_iterator + node_it; end_nd_it is the end node iterator.

+
+ +

Constructors, destructor, and + related

+ + + + + + + + + + + + + +
MethodDescription
+
+virtual 
+  ~trie_order_statistics_node_update
+  ()
+
+
+

Destructor.

+
+ +

Private Methods

+ +

Overrides

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDescription
+
+virtual bool
+  empty
+  () const = 0
+
+
+

Returns true if the container is + empty.

+
+
+virtual iterator
+  begin
+  () = 0
+
+
+

Returns the iterator associated with + the trie's first element.

+
+
+virtual iterator
+  end
+  () = 0
+
+
+

Returns the iterator associated with + the trie's just-after-last element.

+
+
+virtual const_node_iterator
+  node_begin
+  () const = 0
+
+
+

Returns the const_node_iterator + associated with the trie's root node.

+
+
+virtual node_iterator
+  node_begin
+  () = 0
+
+
+

Returns the node_iterator + associated with the trie's root node.

+
+
+virtual const_node_iterator
+  node_end
+  () const = 0
+
+
+

Returns the const_node_iterator + associated with a just-after leaf node.

+
+
+virtual node_iterator
+  node_end
+  () = 0
+
+
+

Returns the node_iterator + associated with a just-after leaf node.

+
+
+virtual e_access_traits &
+  get_e_access_traits
+  () = 0
+
+
+

Access to the cmp_fn object.

+
+
+ + diff --git a/libstdc++-v3/doc/html/ext/pb_ds/trie_prefix_search_node_update.html b/libstdc++-v3/doc/html/ext/pb_ds/trie_prefix_search_node_update.html new file mode 100644 index 00000000000..da6efa2f18f --- /dev/null +++ b/libstdc++-v3/doc/html/ext/pb_ds/trie_prefix_search_node_update.html @@ -0,0 +1,628 @@ + + + + + + + trie_prefix_search_node_update Interface + + + + +
+

trie_prefix_search_node_update Interface

+ +

A node updater that allows tries to be searched for the + range of values that match a certain prefix.

+ +

Defined in: trie_policy.hpp

+ +

Template Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterDescriptionDefault Value
+
+class Const_Node_Iterator
+
+
+

Const node iterator type.

+
-
+
+class Node_Iterator
+
+
+

Node iterator type.

+
-
+
+class E_Access_Traits
+
+
+

Comparison functor.

+
-
+
+class Allocator
+
+
+

Allocator type.

+
-
+ +

Public Types and + Constants

+ +

Key-Type Definitions

+ + + + + + + + + + + + + + + + + + + + + + + + + +
TypeDefinitionDescription
+
+key_type
+
+
+
+The instantiating container's key type.
+
+
+

Key type.

+
+
+const_key_reference
+
+
+
+The instantiating container's const key reference type.
+
+
+

Const key reference.

+
+ +

Policy Definitions

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
TypeDefinitionDescription
+
+e_access_traits
+
+
+
+E_Access_Traits
+
+
+

Element access traits.

+
+
+const_e_iterator
+
+
+
+typename e_access_traits::const_iterator
+
+
+

Const element iterator.

+
+
+allocator
+
+
+
+Allocator
+
+
+

Allocator + type.

+
+ +

General Definitions

+ + + + + + + + + + + + + + + + + +
TypeDefinitionDescription
+
+size_type
+
+
+
+typename allocator::size_type
+
+
+

Size type.

+
+ +

Metadata-Type + Definitions

+ + + + + + + + + + + + + + + + + +
TypeDefinitionDescription
+
+metadata_type
+
+
+
+__gnu_pbds::detail::null_node_metadata
+
+
+

Metadata type.

+
+ +

Iterator Definitions

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
TypeDefinitionDescription
+
+const_node_iterator
+
+
+
+Const_Node_Iterator
+
+
+

Const node iterator type.

+
+
+node_iterator
+
+
+
+Node_Iterator
+
+
+

Node iterator type.

+
+
+const_iterator
+
+
+
+typename const_node_iterator::value_type
+
+
+

Const iterator type.

+
+
+iterator
+
+
+
+typename node_iterator::value_type
+
+
+

Iterator type.

+
+ +

Public Methods

+ +

Find Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDescription
+
+std::pair<
+    const_iterator,
+    const_iterator>
+  prefix_range
+  (const_key_reference r_key) const
+
+
+

Finds the const iterator range + corresponding to all values whose prefixes match + r_key.

+
+
+std::pair<
+    iterator,
+    iterator>
+  prefix_range
+  (const_key_reference r_key)
+
+
+

Finds the iterator range + corresponding to all values whose prefixes match + r_key.

+
+
+std::pair<
+    const_iterator,
+    const_iterator>
+  prefix_range
+  (const_e_iterator b,
+    const_e_iterator e) const
+
+
+

Finds the const iterator range + corresponding to all values whose prefixes match [b, + e).

+
+
+std::pair<
+    iterator,
+    iterator>
+  prefix_range
+  (const_e_iterator b,
+    const_e_iterator e)
+
+
+

Finds the iterator range + corresponding to all values whose prefixes match [b, + e).

+
+ +

Protected Methods

+ +

Operators

+ + + + + + + + + + + + + +
MethodDescription
+
+inline void
+  operator()
+  (node_iterator node_it,
+    const_node_iterator end_nd_it) const
+
+
+

Called to update a node's metadata.

+
+ +

Private Methods

+ +

Overrides

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDescription
+
+virtual const_iterator
+  end
+  () const = 0
+
+
+

Returns the const iterator associated with + the just-after last element.

+
+
+virtual iterator
+  end
+  () = 0
+
+
+

Returns the iterator associated with + the just-after last element.

+
+
+virtual const_node_iterator
+  node_begin
+  () const = 0
+
+
+

Returns the const_node_iterator + associated with the trie's root node.

+
+
+virtual node_iterator
+  node_begin
+  () = 0
+
+
+

Returns the node_iterator + associated with the trie's root node.

+
+
+virtual const_node_iterator
+  node_end
+  () const = 0
+
+
+

Returns the const_node_iterator + associated with a just-after leaf node.

+
+
+virtual node_iterator
+  node_end
+  () = 0
+
+
+

Returns the node_iterator + associated with a just-after leaf node.

+
+
+virtual const e_access_traits &
+  get_e_access_traits
+  () const = 0
+
+
+

Access to the cmp_fn object.

+
+
+ + diff --git a/libstdc++-v3/doc/html/ext/pb_ds/trie_tag.html b/libstdc++-v3/doc/html/ext/pb_ds/trie_tag.html new file mode 100644 index 00000000000..6d2def4e77f --- /dev/null +++ b/libstdc++-v3/doc/html/ext/pb_ds/trie_tag.html @@ -0,0 +1,47 @@ + + + + + + + trie_tag Interface + + + + +
+

trie_tag Interface

+ +

Basic trie data structure tag.

+ +

Defined in: tag_and_trait.hpp

+ +

Base Classes

+ + + + + + + + + + + + + +
ClassDerivation Type
+
+basic_tree_tag
+
+
+

public

+
+
+ + diff --git a/libstdc++-v3/doc/html/ext/pb_ds/trivial_iterator_tag.html b/libstdc++-v3/doc/html/ext/pb_ds/trivial_iterator_tag.html new file mode 100644 index 00000000000..be9813be3cb --- /dev/null +++ b/libstdc++-v3/doc/html/ext/pb_ds/trivial_iterator_tag.html @@ -0,0 +1,25 @@ + + + + + + + trivial_iterator_tag Interface + + + + +
+

trivial_iterator_tag Interface

+ +

A \quot;trivial\quot; iterator tag. Signifies that the + iterators has none of the STL's movement abilities.

+ +

Defined in: tag_and_trait.hpp

+
+ + diff --git a/libstdc++-v3/doc/html/ext/pb_ds/tutorial.html b/libstdc++-v3/doc/html/ext/pb_ds/tutorial.html new file mode 100644 index 00000000000..029204b3b20 --- /dev/null +++ b/libstdc++-v3/doc/html/ext/pb_ds/tutorial.html @@ -0,0 +1,670 @@ + + + + + + + Tutorial + + + + +
+

Short Tutorial

+ +

Following is a short tutorial illustrating the main points + of pb_ds. Concepts + describes and summarizes some concepts.

+ +

Associative + Containers

+ +

Basic Use

+ +

For the most part, pb_ds's containers have the same + interface as the STL's, except for the names used for the + container classes themselves. For example, this shows basic + operations on a collision-chaining hash-based container:

+ +
+cc_hash_table<int, char> c;
+
+c[2] = 'b';
+
+assert(c.find(1) == c.end());
+
+ +

The container is called cc_hash_table as + opposed to unordered_map, since "unordered map" does + not necessarily mean a hash-based map (as the STL implicitly + implies). For example, list-based associative containers, which + are very useful for the construction of "multimaps" (see + Associative-Container + Performance Tests::Observations::Mapping-Semantics + Considerations), are also unordered. It is also not called + hash_map since there are more ways than one to + implement hash tables.

+ +

This snippet shows a red-black tree based container:

+
+tree<int, char> c;
+
+c[2] = 'b';
+
+assert(c.find(2) != c.end());
+
+ +

The container is called tree + as opposed to map, since "map" doesn't say that + much.

+ +

Most of the STL's familiar methods are unchanged. + E.g., being, end, size, + empty, and clear, do just the same as is + customary. Associative-Container + Examples::Basic use, and especially basic_map.cc, + show examples of this.

+ +

This isn't to say that things are exactly as one would expect, +given the container requirments and interfaces in the C++ +standard.

+ + +

The names of containers' policies and policy accessors are + different than those of the STL. For example, if C is + some type of hash-based container, then

+
+C::hash_fn
+
gives the type of its hash functor, and if c is some +hash-based container object, then +
+c.get_hash_fn()
+
+ +

will return a reference to its hash-functor object.

+ +

Similarly, if C is some type of tree-based + container, then

+
+C::cmp_fn
+
gives the type of its comparison functor, and if c +is some tree-based container object, then +
+c.get_cmp_fn()
+
+ +

will return a reference to its comparison-functor + object.

+ +

It would be nice to give names consistent with those in the + existing C++ standard (inclusive of TR1). Unfortunately, these + standard containers don't consistently name types and + methods. For example, std::tr1::unordered_map uses + hasher for the hash functor, but std::map uses + key_compare for the comparison functor. Also, we could + not find an accessor for std::tr1::unordered_map's hash + functor, but std::map uses compare for accessing + the comparison functor.

+ +

Instead, pb_ds attempts to be internally consistent, and +uses standard-derived terminology if possible. +

+ +

Another source of difference is in scope: pb_ds + contains more types of associative containers than the STL, and + more opportunities to configure these new containers, since + different types of associative containers are useful in different + settings (see Associative-Container + Performance Tests::Observations::Underlying Data-Structure + Families).

+ +

pb_ds contains different classes for hash-based containers, + tree-based containers, trie-based containers, and list-based + containers. Inteface::Containers::Associative + Containers lists the containers. Design::Associative + Containers::Hash-Based Containers, Design::Associative + Containers::Tree-Based Containers, Design::Associative + Containers::Trie-Based Containers, and Design::Associative + Containers::List-Based Containers, explain some more about + these types of containers, respectively.

+ +

Since associative containers share parts of their interface, + they are organized as a class hierarchy; it is shown in Figure + Class hierarchy.

+ +
+
+ +
Class hierarchy.
+ +

Each type or method is defined in the most-common ancestor + in which it makes sense: + basic_map.cc + shows an example of most of the associative-container + types.

+ + +

For example, all associative containers support iteration. + Consequently, container_base has the + interface:

+
+template<...>
+class container_base
+{
+    ...
+    
+public:
+    ...
+    
+    const_iterator
+    begin() const;
+    
+    iterator
+    begin();
+
+    const_iterator
+    end() const;
+    
+    iterator
+    end();
+        
+    ...
+};
+
+ +

and so all associative containers inherent this method. + Conversely, both collision-chaining and (general) probing + hash-based associative containers have a hash functor, so + basic_hash_table + has the interface:

+
+template<...>
+class basic_hash_table : public container_base
+{
+    ...
+    
+public:
+    ...
+    
+    const hash_fn&
+    get_hash_fn() const;
+        
+    hash_fn&
+    get_hash_fn();
+    ...
+};
+
+ +

and so all hash-based associative containers inherit the + same hash-functor accessor methods.

+ +

This is discussed further in Design::Associative Containers::Data-Structure + Genericity.

+ +

Configuring + Associative Containers

+ +

In general, each of pb_ds's containers is + parametrized by more policies than those of the STL's. For + example, the STL's hash-based container is parametrized as + follows:

+
+template<
+    typename Key,
+    typename Mapped,
+    typename Hash,
+    typename Pred,
+    typename Allocator,
+    bool Cache_Hashe_Code>
+class unordered_map;
+
+ +

and so can be configured by key type, mapped type, a functor + that translates keys to unsigned integral types, an equivalence + predicate, an allocator, and an indicator whether to store hash + values with each entry. pb_ds's collision-chaining + hash-based container is parametrized as

+
+template<
+    typename Key,
+    typename Mapped,
+    typename Hash_Fn,
+    typename Eq_Fn,
+    typename Comb_Hash_Fn,
+    typename Resize_Policy
+    bool Store_Hash
+    typename Allocator>
+class cc_hash_table;
+
+ +

and so can be configured by the first four types of + std::tr1::unordered_map, then a policy for translating + the key-hash result into a position within the table, then a + policy by which the table resizes, an indicator whether to + store hash values with each entry, and an allocator (which is + typically the last template parameter in STL containers).

+ +

Nearly all policy parameters have default values, so this + need not be considered for casual use. It is important to note, + however, that hash-based containers' policies can dramatically + alter their performance in different settings, and that + tree-based containers' policies can make them useful for other + purposes than just look-up.

+ +

Design::Associative + Containers::Hash-Based Containers, Design::Associative + Containers::Tree-Based Containers, Design::Associative + Containers::Trie-Based Containers, and Design::Associative + Containers::List-Based Containers, explain some more about + configuring hash based, tree based, trie based, and list base + containers, respectively. Interface::Container Policy + Classes shows the different policy classes for configuring + associative containers. Examples::Hash-Based + Containers, Examples::Tree-Like-Based + Containers, and Examples::Trie-Based + Containers show examples for this.

+ +

Determining + Containers' Attributes

+ +

Associative-containers' underlying data structures obviously + affect their performance; Unfortunately, they can also affect + their interface. When manipulating generically associative + containers, it is often useful to be able to statically + determine what they can support and what the cannot. (This was + discussed in Motivation::Associative + Containers::Data-Structure Genericity.)

+ +

Happily, the STL provides a good solution to a similar + problem - that of the different behavior of iterators. If + It is an iterator, then

+
+typename std::iterator_traits<It>::iterator_category
+
+ +

is one of a small number of pre-defined + structs, and,

+
+typename std::iterator_traits<It>::value_type
+
+ +

is the value type to which the iterator "points".

+ +

Similarly, in pb_ds, if C is an + associative container, then

+
+typename container_traits<C>::container_category
+
is one of a small number of pre-defined +structs, each one corresponding to a class in +Figure Class hierarchy. These tags are listed in +Interface::Associative +Containers::Data-Structure Tags and Traits::Data-Structure +Tags::Associative-Containers; + Design::Associative Containers::Data-Structure Tags and + Traits explains this further; Design::Associative + Containers::Data-Structure Tags and Traits::Data-structure tag + class hierarchy shows a class diagram. + +

In most cases, however, the exact underlying data structure + is not really important, but only one of its attributes: + whether it guarantees storing elements by key order, for + example. For this one can use

+
+typename container_traits<C>::order_preserving
+
+ +

This is described further in Design::Data-Structure Genericity; assoc_container_traits.cc + shows an example of querying containers' attributes.

+ +

Point-Type + and Range-Type Methods and Iterators

(This subsection + addresses points from Motivation::Associative + Containers::Differentiating between Iterator Types.) + +

pb_ds differentiates between two types of methods + and iterators: point-type, and range-type. For example, + find and insert are point-type methods, since + they each deal with a specific element; their returned + iterators are point-type iterators. begin and + end are range-type methods, since they are not used to + find a specific element, but rather to go over all elements in + a container object; their returned iterators are range-type + iterators.

+ +

Most containers store elements in an order that is + determined by their interface. Correspondingly, it is fine that + their point-type iterators are synonymous with their range-type + iterators. For example, in the following snippet

+
+std::for_each(c.find(1), c.find(5), foo);
+
two point-type iterators (returned by find) are used +for a range-type purpose - going over all elements whose key is +between 1 and 5. + +

Conversely, the above snippet makes no sense for + self-organizing containers - ones that order (and reorder) + their elements by implementation. It would be nice to have a + uniform iterator system that would allow the above snippet to + compile only if it made sense.

+ +

This could trivially be done by specializing + std::for_each for the case of iterators returned by + std::tr1::unordered_map, but this would only solve the + problem for one algorithm and one container. Fundamentally, the + problem is that one can loop using a self-organizing + container's point-type iterators.

+ +

pb_ds's containers define two families of + iterators: const_point_iterator and + point_iterator are the iterator types returned by + point-type methods; const_iterator and + iterator are the iterator types returned by range-type + methods.

+
+class <- some container ->
+{
+public:
+    ...
+
+    typedef <- something -> const_iterator;
+
+    typedef <- something -> iterator;
+
+    typedef <- something -> const_point_iterator;
+
+    typedef <- something -> point_iterator;
+ 
+    ...
+
+public:
+    ...
+
+    const_iterator begin () const;
+
+    iterator begin();
+
+    const_point_iterator find(...) const;
+
+    point_iterator find(...);
+};
+
+ +

Design::Associative + Containers::Data-Structure Genericity::Point-Type and + Range-Type Methods and Iterators discusses the relationship + between point-type and range-type iterators in general; for + containers whose interface defines sequence order, however, it + is very simple: point-type and range-type iterators are exactly + the same, which means that the above snippet will compile if it + is used for an order-preserving associative container.

+ +

For self-organizing containers, however, (hash-based + containers as a special example), the preceding snippet will + not compile, because their point-type iterators do not support + operator++.

+ +

In any case, both for order-preserving and self-organizing + containers, the following snippet will compile:

+
+typename Cntnr::point_iterator it = c.find(2);
+
+ +

because a range-type iterator can always be converted to a + point-type iterator.

+ +

Design::Associative + Containers::Data-Structure Genericity::Point-Type and + Range-Type Methods and Iterators discusses this + further.

+ +

Motivation::Associative + Containers::Differentiating between Iterator Types also + raised the point that a container's iterators might have + different invalidation rules concerning their de-referencing + abilities and movement abilities. This now corresponds exactly + to the question of whether point-type and range-type iterators + are valid. As explained in Determining + Containers' Attributes, container_traits allows + querying a container for its data structure attributes. The + iterator-invalidation guarantees are certainly a property of + the underlying data structure, and so

+
+container_traits<C>::invalidation_guarantee
+
+ +

gives one of three pre-determined types that answer this + query. This is explained further in Design::Associative + Containers::Data-Structure Genericity::Point-Type and + Range-Type Methods and Iterators.

+ +

Distinguishing between Maps and Sets

+ +

Anyone familiar with the STL knows that there are four kinds + of associative containers: maps, sets, multimaps, and + multisets. Basic Use discussed how + to use maps, i.e. containers that associate each key to + some data.

+ +

Sets are associative containers that simply store keys - + they do not map them to anything. In the STL, each map class + has a corresponding set class. E.g., + std::map<int, char> maps each + int to a char, but + std::set<int, char> simply stores + ints. In pb_ds, however, there are no + distinct classes for maps and sets. Instead, an associative + container's Mapped template parameter is a policy: if + it is instantiated by null_mapped_type, then it + is a "set"; otherwise, it is a "map". E.g.,

+
+cc_hash_table<int, char>
+
is a "map" mapping each int value to a + char, but +
+cc_hash_table<int, null_mapped_type>
+
is a type that uniquely stores int values. + +

Once the Mapped template parameter is instantiated + by null_mapped_type, then + the "set" acts very similarly to the STL's sets - it does not + map each key to a distinct null_mapped_type object. Also, + , the container's value_type is essentially + its key_type - just as with the STL's sets. For a simple example, see basic_set.cc + .

+ +

The STL's multimaps and multisets allow, respectively, + non-uniquely mapping keys and non-uniquely storing keys. As + discussed in Motivation::Associative + Containers::Alternative to Multiple Equivalent Keys, the + reasons why this might be necessary are 1) that a key might be + decomposed into a primary key and a secondary key, 2) that a + key might appear more than once, or 3) any arbitrary + combination of 1)s and 2)s. Correspondingly, + one should use 1) "maps" mapping primary keys to secondary + keys, 2) "maps" mapping keys to size types, or 3) any arbitrary + combination of 1)s and 2)s. Thus, for example, an + std::multiset<int> might be used to store + multiple instances of integers, but using pb_ds's + containers, one might use

+
+tree<int, size_t>
+
i.e., a "map" of ints to +size_ts. + +

Associative-Container + Examples::"Multimaps" and "Multisets" shows some simple + examples.

+ +

These "multimaps" and "multisets" might be confusing to + anyone familiar with the STL's std::multimap and + std::multiset, because there is no clear + correspondence between the two. For example, in some cases + where one uses std::multiset in the STL, one might use + in pb_ds a "multimap" of "multisets" - i.e., a + container that maps primary keys each to an associative + container that maps each secondary key to the number of times + it occurs.

+ +

When one uses a "multimap," one should choose with care the + type of container used for secondary keys. This is further + explained in Associative-Container + Performance Tests::Observations::Mapping-Semantics + Considerations.

+ +
+

Priority Queues

+ +

Basic Use

+ +

pb_ds's priority_queue container is + similar to the STL's in interface. For example:

+
+priority_queue<int> p;
+
+p.push(2);
+p.push(4);
+p.push(1);
+
+assert(p.top() == 4);
+
+p.pop();
+
+assert(p.top() == 2);
+
+assert(p.size() == 2);
+assert(!p.empty());
+
+ +

Configuring Priority + Queues

+ +

As opposed to associative containers, priority queues have + relatively few configuration options. The priority queue is + parametrized as follows:

+
+template<
+    typename Value_Type,
+    typename Cmp_Fn,
+    typename Tag,
+    typename Allocator>
+class priority_queue;
+
+ +

The Value_Type, Cmp_Fn, and + Allocator parameters are the container's value type, + comparison-functor type, and allocator type, respectively; + these are very similar to the STL's priority queue. The + Tag parameter is different: there are a number of + pre-defined tag types corresponding to binary heaps, binomial + heaps, etc., and Tag should be instantiated + by one of them. Interface::Data-Structure Tags and + Traits::Data Structure Tags::Priority-Queues lists the + possible types, Priority-Queue + Design explains this further, and basic_priority_queue.cc + shows an example.

+ +

Note that as opposed to the STL's priority queue, priority_queue is not a + sequence-adapter; it is a regular container.

+ +

Supporting + More Operations

+ +

priority_queue's + push method returns a point-type iterator, which can + be used for modifying or erasing arbitrary values. For + example:

+
+priority_queue<int> p;
+
+priority_queue<int>::point_iterator it = p.push(3);
+
+p.modify(it, 4);
+
+ +

These types of operations are necessary for making priority + queues useful for different applications, especially graph + applications. Priority-Queue + Examples::Cross-Referencing gives some examples.

+ +

Determining Container + Attributes

+ +

Similarly to container_traits (described + in Associative Containers::Determining + Containers' Attributes), container_traits can be used to + statically determine priority-queues' attributes:

+
+container_traits<C>::container_category
+
is one of a small number of predefined tag structures that +identifies the underlying data structure, and +
+container_traits<C>::invalidation_guarantee
+
+ +

is its invalidation guarantee. Invalidation guarantees are + especially important regarding priority queues, since in + pb_ds's design, iterators are practically the only way + to manipulate them.

+ +

Design::Priority + Queues::Traits discusses this further. Priority-Queue + Examples::Generics shows an example.

+
+ + diff --git a/libstdc++-v3/doc/html/ext/pb_ds/update_policy_cd.png b/libstdc++-v3/doc/html/ext/pb_ds/update_policy_cd.png new file mode 100644 index 00000000000..115a751c350 Binary files /dev/null and b/libstdc++-v3/doc/html/ext/pb_ds/update_policy_cd.png differ diff --git a/libstdc++-v3/doc/html/ext/pb_ds/update_seq_diagram.png b/libstdc++-v3/doc/html/ext/pb_ds/update_seq_diagram.png new file mode 100644 index 00000000000..880a50edf8e Binary files /dev/null and b/libstdc++-v3/doc/html/ext/pb_ds/update_seq_diagram.png differ diff --git a/libstdc++-v3/doc/html/ext/sgiexts.html b/libstdc++-v3/doc/html/ext/sgiexts.html new file mode 100644 index 00000000000..64b8e3138c1 --- /dev/null +++ b/libstdc++-v3/doc/html/ext/sgiexts.html @@ -0,0 +1,253 @@ + + + + + + + + + + HP/SGI STL extensions + + + + + + + + +

HP/SGI STL extensions

+ +

This page describes the extensions that SGI made to the STL subset + of the Standard C++ Library, which also includes work from the + originating HP codebase. This work is the basis for much of + libstdc++, and where possible these extensions have been + preserved. +

+ +

What follows is a listing of these extensions, according to the + chapters of the library that they extend + (see the chapter-specific + notes for a description). Not every chapter has extensions, + and existing extensions may be removed (or moved) as their + functionality is standardized. +

+ +

Descriptions range from the scanty to the verbose. Also check + the generated documentation + for notes and comments, especially for entries marked with '*'. + For more complete doumentation, see the SGI website. + For really complete documentation, consider perusing a + copy of Matt Austern's book "Generic Programming and the STL." +

+ +

Back to the libstdc++ extensions. +

+ + + +
+

Chapter 20

+

The <functional> header contains many additional functors and + helper functions, extending section 20.3. They are implemented in the + file stl_function.h: +

+
    +
  • identity_element for addition and multiplication. *
  • +
  • The functor identity, whose operator() + returns the argument unchanged. *
  • +
  • Composition functors unary_function and + binary_function, and their helpers compose1 + and compose2. *
  • +
  • select1st and select2nd, to strip pairs. *
  • +
  • project1st and project2nd. *
  • +
  • A set of functors/functions which always return the same result. They + are constant_void_fun, constant_binary_fun, + constant_unary_fun, constant0, + constant1, and constant2. *
  • +
  • The class subtractive_rng. *
  • +
  • mem_fun adaptor helpers mem_fun1 and + mem_fun1_ref are provided for backwards compatibility.
  • +
+

20.4.1 can use several different allocators; they are described on the + main extensions page. +

+

20.4.3 is extended with a special version of + get_temporary_buffer taking a second argument. The argument + is a pointer, which is ignored, but can be used to specify the template + type (instead of using explicit function template arguments like the + standard version does). That is, in addition to +

+
+   get_temporary_buffer<int>(5);
+ you can also use +
+   get_temporary_buffer(5, (int*)0);
+

A class temporary_buffer is given in stl_tempbuf.h. * +

+

The specialized algorithms of section 20.4.4 are extended with + uninitialized_copy_n. * +

+

Return to the main extensions page or + to the homepage. +

+ + +
+

Chapter 23

+

A few extensions and nods to backwards-compatibility have been made with + containers. Those dealing with older SGI-style allocators are dealt with + elsewhere. The remaining ones all deal with bits: +

+

The old pre-standard bit_vector class is present for + backwards compatibility. It is simply a typedef for the + vector<bool> specialization. +

+

The bitset class has a number of extensions, described in the + rest of this item. First, we'll mention that this implementation of + bitset<N> is specialized for cases where N number of + bits will fit into a single word of storage. If your choice of N is + within that range (<=32 on i686-pc-linux-gnu, for example), then all + of the operations will be faster. +

+

There are + versions of single-bit test, set, reset, and flip member functions which + do no range-checking. If we call them member functions of an instantiation + of "bitset<N>," then their names and signatures are: +

+
+   bitset<N>&   _Unchecked_set   (size_t pos);
+   bitset<N>&   _Unchecked_set   (size_t pos, int val);
+   bitset<N>&   _Unchecked_reset (size_t pos);
+   bitset<N>&   _Unchecked_flip  (size_t pos);
+   bool         _Unchecked_test  (size_t pos);
+

Note that these may in fact be removed in the future, although we have + no present plans to do so (and there doesn't seem to be any immediate + reason to). +

+

The semantics of member function operator[] are not specified + in the C++ standard. A long-standing defect report calls for sensible + obvious semantics, which are already implemented here: op[] + on a const bitset returns a bool, and for a non-const bitset returns a + reference (a nested type). However, this implementation does + no range-checking on the index argument, which is in keeping with other + containers' op[] requirements. The defect report's proposed + resolution calls for range-checking to be done. We'll just wait and see... +

+

Finally, two additional searching functions have been added. They return + the index of the first "on" bit, and the index of the first + "on" bit that is after prev, respectively: +

+
+   size_t _Find_first() const;
+   size_t _Find_next (size_t prev) const;
+

The same caveat given for the _Unchecked_* functions applies here also. +

+

Return to the main extensions page or + to the homepage. +

+ + +
+

Chapter 24

+

24.3.2 describes struct iterator, which didn't exist in the + original HP STL implementation (the language wasn't rich enough at the + time). For backwards compatibility, base classes are provided which + declare the same nested typedefs: +

+
    +
  • input_iterator
  • +
  • output_iterator
  • +
  • forward_iterator
  • +
  • bidirectional_iterator
  • +
  • random_access_iterator
  • +
+

24.3.4 describes iterator operation distance, which takes + two iterators and returns a result. It is extended by another signature + which takes two iterators and a reference to a result. The result is + modified, and the function returns nothing. +

+

Return to the main extensions page or + to the homepage. +

+ + +
+

Chapter 25

+

25.1.6 (count, count_if) is extended with two more versions of count + and count_if. The standard versions return their results. The + additional signatures return void, but take a final parameter by + reference to which they assign their results, e.g., +

+
+   void count (first, last, value, n);
+

25.2 (mutating algorithms) is extended with two families of signatures, + random_sample and random_sample_n. +

+

25.2.1 (copy) is extended with +

+
+   copy_n (_InputIter first, _Size count, _OutputIter result);
+

which copies the first 'count' elements at 'first' into 'result'. +

+

25.3 (sorting 'n' heaps 'n' stuff) is extended with some helper + predicates. Look in the doxygen-generated pages for notes on these. +

+
    +
  • is_heap tests whether or not a range is a heap.
  • +
  • is_sorted tests whether or not a range is sorted in + nondescending order.
  • +
+

25.3.8 (lexigraphical_compare) is extended with +

+
+   lexicographical_compare_3way(_InputIter1 first1, _InputIter1 last1,
+                                 _InputIter2 first2, _InputIter2 last2)
+

which does... what? +

+

Return to the main extensions page or + to the homepage. +

+ + +
+

Chapter 26

+

26.4, the generalized numeric operations such as accumulate, are extended + with the following functions: +

+
+   power (x, n);
+   power (x, n, moniod_operation);
+

Returns, in FORTRAN syntax, "x ** n" where n>=0. In the + case of n == 0, returns the identity element for the + monoid operation. The two-argument signature uses multiplication (for + a true "power" implementation), but addition is supported as well. + The operation functor must be associative. +

+

The iota function wins the award for Extension With the + Coolest Name. It "assigns sequentially increasing values to a range. + That is, it assigns value to *first, value + 1 to *(first + 1) and so + on." Quoted from SGI documentation. +

+
+   void iota(_ForwardIter first, _ForwardIter last, _Tp value);
+

Return to the main extensions page or + to the homepage. +

+ + + + +
+

+See license.html for copying conditions. +Comments and suggestions are welcome, and may be sent to +the libstdc++ mailing list. +

+ + + + diff --git a/libstdc++-v3/doc/html/faq/index.html b/libstdc++-v3/doc/html/faq/index.html new file mode 100644 index 00000000000..ff6cd65c9a6 --- /dev/null +++ b/libstdc++-v3/doc/html/faq/index.html @@ -0,0 +1,1215 @@ + + + + + + + + + libstdc++ FAQ + + + + + + +

libstdc++ Frequently Asked Questions

+ +

+ The latest version of this document is always available at + + http://gcc.gnu.org/onlinedocs/libstdc++/faq/. The main documentation + page is at + + http://gcc.gnu.org/onlinedocs/libstdc++/documentation.html. +

+ +

+ To the libstdc++ homepage. +

+ + +
+

Questions

+
    +
  1. General Information + +
      +
    1. What is libstdc++?
    2. +
    3. Why should I use libstdc++?
    4. +
    5. Who's in charge of it?
    6. +
    7. [removed]
    8. +
    9. When is libstdc++ going to be finished?
    10. +
    11. How do I contribute to the effort?
    12. +
    13. What happened to libg++? I need that!
    14. +
    15. What if I have more questions?
    16. +
    17. What are the license terms for libstdc++?
    18. +
    +
  2. + +
  3. Installation +
      +
    1. How do I install libstdc++?
    2. +
    3. [removed]
    4. +
    5. What is this SVN thing that you keep + mentioning?
    6. +
    7. How do I know if it works?
    8. +
    9. This library is HUGE! And what's libsupc++?
    10. +
    11. Why do I get an error saying + libstdc++.so.X is missing when I + run my program?
    12. +
    +
  4. + +
  5. Platform-Specific Issues +
      +
    1. Can libstdc++ be used with <my + favorite compiler>?
    2. +
    3. [removed]
    4. +
    5. [removed]
    6. +
    7. I can't use 'long long' on Solaris
    8. +
    9. _XOPEN_SOURCE / + _GNU_SOURCE / etc is always defined +
    10. +
    11. OS X ctype.h is broken! How can I hack it?
    12. +
    13. Threading is broken on i386
    14. +
    15. Recent GNU/Linux glibc required?
    16. +
    17. Can't use wchar_t/wstring on FreeBSD
    18. +
    19. MIPS atomic operations
    20. +
    +
  6. + +
  7. Known Bugs and Non-Bugs +
      +
    1. What works already?
    2. +
    3. Bugs in gcc/g++ (not libstdc++)
    4. +
    5. Bugs in the C++ language/lib specification
    6. +
    7. Things in libstdc++ that only look like bugs +
    8. +
    9. Aw, that's easy to fix!
    10. +
    +
  8. + +
  9. Miscellaneous +
      +
    1. string::iterator is not char*; + vector<T>::iterator is not T*
    2. +
    3. What's next after libstdc++?
    4. +
    5. What about the STL from SGI?
    6. +
    7. Extensions and Backward Compatibility
    8. +
    9. Does libstdc++ support TR1?
    10. +
    11. Is libstdc++ thread-safe?
    12. +
    13. How do I get a copy of the ISO C++ Standard?
    14. +
    15. What's an ABI and why is it so messy?
    16. +
    17. How do I make std::vector<T>::capacity() + == std::vector<T>::size?
    18. +
    +
  10. + +
+ +
+ + + +

1.0 General Information

+ +

1.1 What is libstdc++?

+

The GNU Standard C++ Library v3 is an + ongoing project to implement the ISO 14882 Standard C++ library + as described in chapters 17 through 27 and annex D. + For those who want to see exactly how + far the project has come, or just want the latest + bleeding-edge code, the up-to-date source is available over + anonymous SVN, and can even be browsed over the + web. +

+ +
+

1.2 Why should I use libstdc++?

+

The completion of the ISO C++ standardization gave the + C++ community a powerful set of reuseable tools in the form + of the C++ Standard Library. However, all existing C++ + implementations are (as the Draft Standard used to say) + "incomplet and incorrekt," and many suffer from + limitations of the compilers that use them. +

+

The GNU C/C++/FORTRAN/<pick-a-language> compiler + (gcc, g++, etc) is widely considered to be + one of the leading compilers in the world. Its development + is overseen by the + GCC team. All of + the rapid development and near-legendary + portability + that are the hallmarks of an open-source project are being + applied to libstdc++. +

+

That means that all of the Standard classes and functions + (such as string, vector<>, iostreams, + and algorithms) will be freely available and fully compliant. + Programmers will no longer need to "roll their own" + nor be worried about platform-specific incompatibilities. +

+ +
+

1.3 Who's in charge of it?

+

The libstdc++ project is contributed to by several developers + all over the world, in the same way as GCC or Linux. + Benjamin Kosnik, Gabriel Dos Reis, Phil Edwards, Ulrich Drepper, + Loren James Rittle, and Paolo Carlini are the lead maintainers of + the SVN archive. +

+

Development and discussion is held on the libstdc++ mailing + list. Subscribing to the list, or searching the list + archives, is open to everyone. You can read instructions for + doing so on the homepage. + If you have questions, ideas, code, or are just curious, sign up! +

+ +
+

1.4 How do I get libstdc++?

+ +

Stable versions of libstdc++-v3 are included with releases of + the GCC compilers. +

+ +
+

1.5 When is libstdc++ going to be finished?

+ +

Nathan Myers gave the best of all possible answers, responding to a + Usenet article asking this question: Sooner, if you help. +

+ +
+

1.6 How do I contribute to the effort?

+

Here is a + page devoted to this topic. Subscribing to the mailing + list (see above, or the homepage) is a very good idea if you + have something to contribute, or if you have spare time and + want to help. Contributions don't have to be in the form of + source code; anybody who is willing to help write + documentation, for example, or has found a bug in code that + we all thought was working, is more than welcome! +

+ +
+

1.7 What happened to libg++? I need that!

+

The most recent libg++ README states that libg++ is no longer + being actively maintained. It should not be used for new + projects, and is only being kicked along to support older code. +

+

The libg++ was designed and created when there was no Standard + to provide guidance. Classes like linked lists are now provided + for by list<T> and do not need to be created by + genclass. (For that matter, templates exist now and + are well-supported, whereas genclass (mostly) predates them.) +

+

There are other classes in libg++ that are not specified in the + ISO Standard (e.g., statistical analysis). While there are a + lot of really useful things that are used by a lot of people + (e.g., statistics :-), the Standards Committee couldn't include + everything, and so a lot of those "obvious" classes + didn't get included. +

+

Since libstdc++ is an implementation of the Standard Library, we + have no plans at this time to include non-Standard utilities + in the implementation, however handy they are. (The extensions + provided in the SGI STL aren't maintained by us and don't get + a lot of our attention, because they don't require a lot of our + time.) It is entirely plausible that the "useful stuff" + from libg++ might be extracted into an updated utilities library, + but nobody has started such a project yet. +

+

(The Boost site houses free + C++ libraries that do varying things, and happened to be started + by members of the Standards Committee. Certain "useful + stuff" classes will probably migrate there.) +

+

For the bold and/or desperate, the + GCC extensions page + describes where to find the last libg++ source. +

+ +
+

1.8 What if I have more questions?

+

If you have read the README file, and your + question remains unanswered, then just ask the mailing list. + At present, you do not need to be subscribed to the list to + send a message to it. More information is available on the + homepage (including how to browse the list archives); to send + to the list, use + libstdc++@gcc.gnu.org. +

+

If you have a question that you think should be included here, + or if you have a question about a question/answer here, + contact Phil Edwards + or Gabriel Dos Reis. +

+ +
+

1.9 What are the license terms for libstdc++?

+

See our license description + for these and related questions. +

+ +
+

2.0 Installation

+

2.1 How do I install libstdc++?

+

Complete instructions are not given here (this is a FAQ, not + an installation document), but the tools required are few: +

+
    +
  • A 3.x or later release of GCC. Either install a suitable + package for your system, or compile GCC from the sources. + Note that building GCC + is much easier and more automated than building the GCC + 2.[78] series was. If you are using GCC 2.95, you can + still build earlier snapshots of libstdc++ but you + should consult the documentation that comes with the + sources, the instructions are no longer included here. +
  • +
  • GNU Make is required to build GCC 3.4 and later. +
  • +
  • The GNU Autotools are needed if you are messing with + the configury or makefiles. +
  • +
+

The file documentation.html + links to documentation of the steps necessary to build, install, + and use the library. Instructions for configuring the library + with flags such as --enable-threads are there also. +

+

The top-level install.html file contains + the exact build and installation instructions. You may wish to + browse those files over ViewVC ahead of time to get a feel for + what's required. +

+ +
+

2.2 [removed]

+

This question has become moot and has been removed. The stub + is here to preserve numbering (and hence links/bookmarks). +

+ +
+

2.3 What is this SVN thing that you + keep mentioning?

+

Subversion is one of several revision control packages. + It was selected for GNU projects because it's free (speech), free (beer), + and very high quality. The + Subversion home page has a better description. +

+

The "anonymous client checkout" feature of SVN is + similar to anonymous FTP in that it allows anyone to retrieve + the latest libstdc++ sources. +

+

After the first of April, American users will have a + "/pharmacy" command-line option... + +

+ +
+

2.4 How do I know if it works?

+

libstdc++ comes with its own testsuite. You do not need + to actually install the library ("make + install") to run the testsuite, but you do need + DejaGNU, as described + here. +

+

To run the testsuite on the library after building it, use + "make check" while in your build directory. To run + the testsuite on the library after building and installing it, + use "make check-install" instead. +

+

If you find bugs in the testsuite programs themselves, or if you + think of a new test program that should be added to the suite, + please write up your idea and send it to the list! +

+ +
+

2.5 This library is HUGE! And what's libsupc++?

+

Usually the size of libraries on disk isn't noticeable. When a + link editor (or simply "linker") pulls things from a + static archive library, only the necessary object files are copied + into your executable, not the entire library. Unfortunately, even + if you only need a single function or variable from an object file, + the entire object file is extracted. (There's nothing unique to C++ + or libstdc++ about this; it's just common behavior, given here + for background reasons.) +

+

Some of the object files which make up libstdc++.a are rather large. + If you create a statically-linked executable with + -static, those large object files are suddenly part + of your executable. Historically the best way around this was to + only place a very few functions (often only a single one) in each + source/object file; then extracting a single function is the same + as extracting a single .o file. For libstdc++ this is only + possible to a certain extent; the object files in question contain + template classes and template functions, pre-instantiated, and + splitting those up causes severe maintenance headaches. +

+

It's not a bug, and it's not really a problem. Nevertheless, some + people don't like it, so here are two pseudo-solutions: +

+

If the only functions from libstdc++.a which you need are + language support functions (those listed in clause 18 of the + standard, e.g., new and delete), + then try linking against libsupc++.a (Using + gcc instead of g++ and explicitly + linking in -lsupc++ for the final link step will + do it). This library contains only those support routines, + one per object file. But if you are using anything from the + rest of the library, such as IOStreams or vectors, then + you'll still need pieces from libstdc++.a. +

+

The second method is one we hope to incorporate into the library + build process. Some platforms can place each function and variable + into its own section in a .o file. The GNU linker can then perform + garbage collection on unused sections; this reduces the situation + to only copying needed functions into the executable, as before, + but all happens automatically. +

+

Unfortunately the garbage collection in GNU ld is buggy; sections + (corresponding to functions and variables) which are used + are mistakenly removed, leading to horrible crashes when your + executable starts up. For the time being, this feature is not used + when building the library. +

+ +
+

2.6 Why do I get an error saying + libstdc++.so.X is missing when I run + my program?

+

Depending on your platform and library version, the message might + be similar to one of the following: +

+
+    ./a.out: error while loading shared libraries: libstdc++.so.6: cannot open shared object file: No such file or directory
+
+    /usr/libexec/ld-elf.so.1: Shared object "libstdc++.so.6" not found 
+ +

This doesn't mean that the shared library isn't installed, only + that the dynamic linker can't find it. When a dynamically-linked + executable is run the linker finds and loads the required shared + libraries by searching a pre-configured list of directories. If + the directory where you've installed libstdc++ is not in this + list then the libraries won't be found. The simplest way to fix + this is to use the LD_LIBRARY_PATH environment + variable, which is a colon-separated list of directories in which + the linker will search for shared libraries: +

+
+    LD_LIBRARY_PATH=${prefix}/lib:$LD_LIBRARY_PATH
+    export LD_LIBRARY_PATH 
+

The exact environment variable to use will depend on your platform, + e.g. DYLD_LIBRARY_PATH for Darwin, + LD_LIBRARY_PATH_32/LD_LIBRARY_PATH_64 for Solaris 32-/64-bit, + LD_LIBRARYN32_PATH/LD_LIBRARY64_PATH for Irix N32/64-bit ABIs + and SHLIB_PATH for HP-UX. +

+

See the man pages for ld(1), ldd(1) and + ldconfig(8) for more information. The dynamic linker + has different names on different platforms but the man page is + usually called something such as ld.so / rtld / dld.so. +

+ +
+

3.0 Platform-Specific Issues

+

3.1 Can libstdc++ be used with <my + favorite compiler>?

+

Probably not. Yet.

+

Because GCC advances so rapidly, development and testing of + libstdc++ is being done almost entirely under that compiler. + If you are curious about whether other, lesser compilers + (*grin*) support libstdc++, you are more than welcome to try. + Configuring and building the library (see above) will still + require certain tools, however. Also keep in mind that + building libstdc++ does not imply that your compiler + will be able to use all of the features found in the + C++ Standard Library. +

+

Since the goal of ISO Standardization is for all C++ + implementations to be able to share code, the final libstdc++ + should, in theory, be usable under any ISO-compliant + compiler. It will still be targeted and optimized for + GCC/g++, however. +

+ +
+

3.2 [removed]

+

This question has become moot and has been removed. The stub + is here to preserve numbering (and hence links/bookmarks). +

+ +
+

3.3 [removed]

+

This question has become moot and has been removed. The stub + is here to preserve numbering (and hence links/bookmarks). +

+ +
+

3.4 I can't use 'long long' on Solaris

+

By default we try to support the C99 long long type. + This requires that certain functions from your C library be present. +

+

Up through release 3.0.2 the tests performed were too general, and + this feature was disabled when it did not need to be. The most + commonly reported platform affected was Solaris. +

+

This has been fixed for 3.0.3 and onwards. +

+ +
+

3.5 _XOPEN_SOURCE / _GNU_SOURCE + / etc is always defined

+

On Solaris, g++ (but not gcc) always defines the preprocessor + macro _XOPEN_SOURCE. On GNU/Linux, the same happens + with _GNU_SOURCE. (This is not an exhaustive list; + other macros and other platforms are also affected.) +

+

These macros are typically used in C library headers, guarding new + versions of functions from their older versions. The C++ standard + library includes the C standard library, but it requires the C90 + version, which for backwards-compatibility reasons is often not the + default for many vendors. +

+

More to the point, the C++ standard requires behavior which is only + available on certain platforms after certain symbols are defined. + Usually the issue involves I/O-related typedefs. In order to + ensure correctness, the compiler simply predefines those symbols. +

+

Note that it's not enough to #define them only when the library is + being built (during installation). Since we don't have an 'export' + keyword, much of the library exists as headers, which means that + the symbols must also be defined as your programs are parsed and + compiled. +

+

To see which symbols are defined, look for CPLUSPLUS_CPP_SPEC in + the gcc config headers for your target (and try changing them to + see what happens when building complicated code). You can also run + "g++ -E -dM - < /dev/null" to display + a list of predefined macros for any particular installation. +

+

This has been discussed on the mailing lists + quite a bit. +

+

This method is something of a wart. We'd like to find a cleaner + solution, but nobody yet has contributed the time. +

+ +
+

3.6 OS X ctype.h is broken! How can I hack it?

+

This is a long-standing bug in the OS X support. Fortunately, + the patch is quite simple, and well-known. + Here's a + link to the solution. +

+ +
+

3.7 Threading is broken on i386

+

Support for atomic integer operations is/was broken on i386 + platforms. The assembly code accidentally used opcodes that are + only available on the i486 and later. So if you configured GCC + to target, for example, i386-linux, but actually used the programs + on an i686, then you would encounter no problems. Only when + actually running the code on a i386 will the problem appear. +

+

This is fixed in 3.2.2. +

+ +
+

3.8 Recent GNU/Linux glibc required?

+

When running on GNU/Linux, libstdc++ 3.2.1 (shared library version + 5.0.1) and later uses localization and formatting code from the system + C library (glibc) version 2.2.5. That version of glibc is over a + year old and contains necessary bugfixes. Many GNU/Linux distros make + glibc version 2.3.x available now. +

+

The guideline is simple: the more recent the C++ library, the + more recent the C library. (This is also documented in the main + GCC installation instructions.) +

+ +
+

3.9 Can't use wchar_t/wstring on FreeBSD

+

At the moment there are a few problems in FreeBSD's support for + wide character functions, and as a result the libstdc++ configury + decides that wchar_t support should be disabled. Once the underlying + problems are fixed in FreeBSD (soon), the library support will + automatically enable itself. +

+

You can fix the problems yourself, and learn more about the situation, + by reading + + this short thread ("_GLIBCPP_USE_WCHAR_T undefined in + FreeBSD's c++config.h?"). +

+ +
+

3.10 MIPS atomic operations

+

The atomic locking routines for MIPS targets requires MIPS II + and later. A patch went in just after the 3.3 release to + make mips* use the generic implementation instead. You can also + configure for mipsel-elf as a workaround. +

+

mips*-*-linux* continues to use the MIPS II routines, and more + work in this area is expected. +

+ +
+

4.0 Known Bugs and Non-Bugs

+ Note that this section can get rapidly outdated -- such is the + nature of an open-source project. For the latest information, join + the mailing list or look through GCC bugzilla. + +

For 3.0.1, the most common "bug" is an apparently missing + "../" in include/Makefile, resulting in files + like gthr.h and gthr-single.h not being found. Please read + the configuration + instructions for GCC, + specifically the part about configuring in a separate build directory, + and how strongly recommended it is. Building in the source directory + is fragile, is rarely tested, and tends to break, as in this case. + This was fixed for 3.0.2. +

+ +

For 3.1, the most common "bug" is a parse error when using + <fstream>, ending with a message, + "bits/basic_file.h:52: parse error before `{' + token." Please read + the installation instructions for + GCC, specifically the part about not installing newer versions on + top of older versions. If you install 3.1 over a 3.0.x release, then + the wrong basic_file.h header will be found (its location changed + between releases). +

+ +

Please do not report these as bugs. We know about them. + Reporting this -- or any other problem that's already been fixed -- + hinders the development of GCC, because we have to take time to + respond to your report. Thank you. +

+ +
+

4.1 What works already?

+

Short answer: Pretty much everything works except for some + corner cases. Also, localization is incomplete. For whether it works + well, or as you expect it to work, see 5.2. +

+

Long answer: See the implementation status pages for C++98, + TR1, and C++0x. +

+ +
+

4.2 Bugs in gcc/g++ (not libstdc++)

+

This is by no means meant to be complete nor exhaustive, but + mentions some problems that users may encounter when building + or using libstdc++. If you are experiencing one of these + problems, you can find more information on the libstdc++ and + the GCC mailing lists. +

+

Before reporting a bug, examine the + bugs database with the + category set to "libstdc++". +

+
    +
  • Debugging is problematic, due to bugs in line-number generation + (mostly fixed in the compiler) and gdb lagging behind the + compiler (lack of personnel). We recommend configuring the + compiler using --with-dwarf2 if the DWARF2 + debugging format is not already the default on your platform. + Also, +changing your + GDB settings can have a profound effect on your C++ debugging + experiences. :-)
  • +
+ +
+

4.3 Bugs in the C++ language/lib specification

+

Yes, unfortunately, there are some. In a + message + to the list, Nathan Myers announced that he has started a list of + problems in the ISO C++ Standard itself, especially with + regard to the chapters that concern the library. The list + itself is + posted on his + website. Developers who are having problems interpreting + the Standard may wish to consult his notes. +

+

For those people who are not part of the ISO Library Group + (i.e., nearly all of us needing to read this page in the first + place :-), a public list of the library defects is occasionally + published here. + Some of these have resulted in code changes. +

+ +
+

4.4 Things in libstdc++ that only look like bugs

+

There are things which are not bugs in the compiler (4.2) nor + the language specification (4.3), but aren't really bugs in + libstdc++, either. Really! Please do not report these as bugs. +

+

-Weffc++ + The biggest of these is the quadzillions of warnings about the + library headers emitted when -Weffc++ is used. Making + libstdc++ "-Weffc++-clean" is not a goal of the project, + for a few reasons. Mainly, that option tries to enforce + object-oriented programming, while the Standard Library isn't + necessarily trying to be OO. +

+

reopening a stream fails + Did I just say that -Weffc++ was our biggest false-bug report? + I lied. (It used to be.) Today it seems to be reports that after + executing a sequence like +

+
+    #include <fstream>
+    ...
+    std::fstream  fs("a_file");
+    // .
+    // . do things with fs...
+    // .
+    fs.close();
+    fs.open("a_new_file");
+

all operations on the re-opened fs will fail, or at + least act very strangely. Yes, they often will, especially if + fs reached the EOF state on the previous file. The + reason is that the state flags are not cleared + on a successful call to open(). The standard unfortunately did + not specify behavior in this case, and to everybody's great sorrow, + the proposed LWG resolution in + DR #22 is to leave the flags unchanged. You must insert a call + to fs.clear() between the calls to close() and open(), + and then everything will work like we all expect it to work. + Update: for GCC 4.0 we implemented the resolution + of DR #409 and open() now calls + clear() on success! +

+

rel_ops + Another is the rel_ops namespace and the template + comparison operator functions contained therein. If they become + visible in the same namespace as other comparison functions + (e.g., 'using' them and the <iterator> header), + then you will suddenly be faced with huge numbers of ambiguity + errors. This was discussed on the -v3 list; Nathan Myers + sums + things up here. The collisions with vector/string iterator + types have been fixed for 3.1. +

+

The g++-3 headers are not ours

+

If you have found an extremely broken header file which is + causing problems for you, look carefully before submitting a + "high" priority bug report (which you probably shouldn't + do anyhow; see the last paragraph of the page describing + the GCC bug database). +

+

If the headers are in ${prefix}/include/g++-3, or if + the installed library's name looks like libstdc++-2.10.a + or libstdc++-libc6-2.10.so, then you are using the old + libstdc++-v2 library, which is nonstandard and unmaintained. Do not + report problems with -v2 to the -v3 mailing list. +

+

For GCC versions 3.0 and 3.1 the libstdc++ header files are + installed in ${prefix}/include/g++-v3 (see the 'v'?). + Starting with version 3.2 the headers are installed in + ${prefix}/include/c++/${version} as this prevents + headers from previous versions being found by mistake. +

+

glibc + If you're on a GNU/Linux system and have just upgraded to + glibc 2.2, but are still using gcc 2.95.2, then you should have + read the glibc FAQ, specifically 2.34: +

+
+2.34.   When compiling C++ programs, I get a compilation error in streambuf.h.
+
+{BH} You are using g++ 2.95.2? After upgrading to glibc 2.2, you need to
+apply a patch to the include files in /usr/include/g++, because the fpos_t
+type has changed in glibc 2.2.  The patch is at
+http://clisp.cons.org/~haible/gccinclude-glibc-2.2-compat.diff
+   
+

Note that 2.95.x shipped with the + old v2 library which is no longer + maintained. Also note that gcc 2.95.3 fixes this problem, but + requires a separate patch for libstdc++. +

+

concept checks + If you see compilation errors containing messages about + fooConcept and a constraints + member function, then most likely you have violated one of the + requirements for types used during instantiation of template + containers and functions. For example, EqualityComparableConcept + appears if your types must be comparable with == and you have not + provided this capability (a typo, or wrong visibility, or you + just plain forgot, etc). +

+

More information, including how to optionally enable/disable the + checks, is available + here. +

+

dlopen/dlsym + If you are using the C++ library across dynamically-loaded + objects, make certain that you are passing the correct options + when compiling and linking: +

+
+    // compile your library components
+    g++ -fPIC -c a.cc
+    g++ -fPIC -c b.cc
+    ...
+    g++ -fPIC -c z.cc
+
+    // create your library
+    g++ -fPIC -shared -rdynamic -o libfoo.so a.o b.o ... z.o
+
+    // link the executable
+    g++ -fPIC -rdynamic -o foo ... -L. -lfoo -ldl
+

"memory leaks" in containers + A few people have reported that the standard containers appear + to leak memory when tested with memory checkers such as + valgrind. + The library's default allocators keep free memory in a pool + for later reuse, rather than returning it to the OS. Although + this memory is always reachable by the library and is never + lost, memory debugging tools can report it as a leak. If you + want to test the library for memory leaks please read + Tips for memory leak hunting + first. +

+ +

list::size() is O(n)! + See the Containers + chapter. +

+
+

4.5 Aw, that's easy to fix!

+

If you have found a bug in the library and you think you have + a working fix, then send it in! The main GCC site has a page + on submitting + patches that covers the procedure, but for libstdc++ you + should also send the patch to our mailing list in addition to + the GCC patches mailing list. The libstdc++ + contributors' page + also talks about how to submit patches. +

+

In addition to the description, the patch, and the ChangeLog + entry, it is a Good Thing if you can additionally create a small + test program to test for the presence of the bug that your + patch fixes. Bugs have a way of being reintroduced; if an old + bug creeps back in, it will be caught immediately by the + testsuite -- but only if such a test exists. +

+ +
+

5.0 Miscellaneous

+

5.1 string::iterator is not char*; + vector<T>::iterator is not T*

+

If you have code that depends on container<T> iterators + being implemented as pointer-to-T, your code is broken. +

+

While there are arguments for iterators to be implemented in + that manner, A) they aren't very good ones in the long term, + and B) they were never guaranteed by the Standard anyway. The + type-safety achieved by making iterators a real class rather + than a typedef for T* outweighs nearly all opposing + arguments. +

+

Code which does assume that a vector iterator i + is a pointer can often be fixed by changing i in + certain expressions to &*i . Future revisions + of the Standard are expected to bless this usage for + vector<> (but not for basic_string<>). +

+ +
+

5.2 What's next after libstdc++?

+

Hopefully, not much. The goal of libstdc++ is to produce + a fully-compliant, fully-portable Standard Library. After that, + we're mostly done: there won't be any more compliance + work to do. However: +

+
    +
  1. The ISO Committee will meet periodically to review Defect Reports + in the C++ Standard. Undoubtedly some of these will result in + changes to the Standard, which will be reflected in patches to + libstdc++. Some of that is already happening, see 4.3. Some of + those changes are being predicted by the library maintainers, and + we add code to the library based on what the current proposed + resolution specifies. Those additions are listed in + the extensions page. +

  2. +
  3. Performance tuning. Lots of performance tuning was done for the + 3.x releases, including memory expansion in container classes and + buffer usage in synchronized stream objects. + Later performance-related work includes "move semantics" + for containers and (optional) non-reference-counted strings (which + can give performance benefits for multithreaded programs.) +

  4. +
  5. An ABI for libstdc++ is being developed, so that + multiple binary-incompatible copies of the library can be replaced + with a single backwards-compatible library, like libgcc_s.so is. +

  6. +
  7. The current libstdc++ contains extensions to the Library which + must be explicitly requested by client code (for example, the + hash tables from SGI). Other extensions may be added to + libstdc++ if they seem to be "standard" enough. + (For example, the "long long" type from C99.) + Bugfixes and rewrites (to improve or fix thread safety, for + instance) will of course be a continuing task. +

  8. +
  9. There is an effort underway to add significant extensions to + the standard library specification. The latest version of this effort is + described in + + The C++ Library Technical Report 1. + See 5.5. +

  10. +
+

This + question about the next libstdc++ prompted some brief but + interesting + speculation. +

+ +
+

5.3 What about the STL from SGI?

+

The STL from SGI, + version 3.3, was the final merge of the STL codebase. The + code in libstdc++ contains many fixes and changes, and + the SGI code is no longer under active + development. We expect that no future merges will take place. +

+

In particular, string is not from SGI and makes no + use of their "rope" class (which is included as an + optional extension), nor is valarray and some others. + Classes like vector<> are, however we have + made significant changes to them since then. +

+

The FAQ for SGI's STL (one jump off of their main page) is + recommended reading. +

+ +
+

5.4 Extensions and Backward Compatibility

+

Headers in the ext and backward + subdirectories should be referred to by their relative paths: + +

+
+      #include <backward/hash_map> 
+

rather than using -I or other options. This is more + portable and forward-compatible. (The situation is the same as + that of other headers whose directories are not searched directly, + e.g., <sys/stat.h>, <X11/Xlib.h>. +

+ +

At this time most of the features of the SGI STL extension have been + replaced by standardized libraries. + In particular, the unordered_map and unordered_set containers of TR1 + are suitable replacement for the non-standard hash_map and hash_set + containers in the SGI STL. See 5.5 for more details. +

+ +

The extensions are no longer in the global or std + namespaces, instead they are declared in the __gnu_cxx + namespace. For maximum portability, consider defining a namespace + alias to use to talk about extensions, e.g.: +

+
+      #ifdef __GNUC__
+      #if __GNUC__ < 3
+        #include <hash_map.h>
+        namespace extension { using ::hash_map; }; // inherit globals
+      #else
+        #include <backward/hash_map>
+        #if __GNUC__ == 3 && __GNUC_MINOR__ == 0
+          namespace extension = std;               // GCC 3.0
+        #else
+          namespace extension = ::__gnu_cxx;       // GCC 3.1 and later
+        #endif
+      #endif
+      #else      // ...  there are other compilers, right?
+        namespace extension = std;
+      #endif
+
+      extension::hash_map<int,int> my_map; 
+

This is a bit cleaner than defining typedefs for all the + instantiations you might need. +

+

Note: explicit template specializations must + be declared in the same namespace as the original template. + This means you cannot use a namespace alias when declaring + an explicit specialization. +

+

Extensions to the library have + their own page. +

+ +
+

5.5 Does libstdc++ support TR1?

+ +

The C++ Standard Library Technical Report adds many new features to + the library. The latest version of this effort is described in + + Technical Report 1. +

+ +

libstdc++ strives to implement all of TR1. + An overview of the implementation status + is available. +

+ +

Briefly, the features of TR1 and the current status are: +

+ +

Reference_wrapper - Complete - + Useful to pass references to functions that take their parameters + by value. +

+ +

Reference-counted smart pointers - Complete - + The shared_ptr and weak_ptr allow several object to know about a + pointer and whether it is valid. When the last reference to the + pointer is destroyed the pointer is freed. +

+ +

Function objects - Complete - + Function return types (i.e., result_of), the functions template + mem_fn (a generalization of mem_fun and mem_fun_red), function + object binders (e.g., bind, a generalization of bind1st and bind2nd), + and polymorphic function wrappers (e.g, class template function). +

+ +

Type traits - Complete - + The type_traits class gives templates the ability to probe + information about the input type and enable type-dependent logic + to be performed without the need of template specializations. +

+ +

A random number engine - Complete - + This library contains random number generators with several different + choices of distribution. +

+ +

Tuples - Complete - + The tuple class implements small heterogeneous arrays. This is an + enhanced pair. In fact, the standard pair is enhanced with a tuple + interface. +

+ +

Fixed-size arrays - Complete - + The array class implements small fixed-sized arrays with container + semantics. +

+ +

Unordered containers - Complete - + The unordered_set, unordered_map, unordered_multiset, and + unordered_multimap containers are hashed versions of the map, set, + multimap, and multiset containers respectively. These classes are + suitable replacements for the SGI STL hash_map and hash_set + extensions. +

+ +

C99 compatibility - Under construction - + There are many features designed to minimize the divergence of the C + and the C++ languages. +

+ +

Special functions - Complete - + Twenty-three mathematical functions familiar to physicists and + engineers are included: cylindrical and spherical Bessel and Neumann + functions, hypergeometric functions, Laguerre polynomials, Legendre + functions, elliptic integrals, exponential integrals and the Riemann + zeta function all for your computing pleasure. +

+ +

A regular expression engine + This library provides for regular expression objects with traversal + of text with return of subexpressions. +

+ +
+

5.6 Is libstdc++ thread-safe?

+

The library strives to be thread-safe when all of the following + conditions are met: +

+
    +
  • The system's libc is itself thread-safe,
  • +
  • The compiler in use reports a thread model other than 'single'. This can be tested via output from gcc -v. Multi-thread capable versions of gcc output something like this: +
    +%gcc -v
    +Using built-in specs.
    +...
    +Thread model: posix
    +gcc version 4.1.2 20070925 (Red Hat 4.1.2-33)
    +
    + +

    Look for "Thread model" lines that aren't equal to "single."

    +
  • +
  • Requisite command-line flags are used for atomic operations and threading. Examples of this include -pthread and -march=native, although specifics vary depending on the host environment. See Machine Dependent Options.
  • +
  • An implementation of atomicity.h functions + exists for the architecture in question. See the internals documentation for more details.
  • + +
+

The user-code must guard against concurrent method calls which may + access any particular library object's state. Typically, the + application programmer may infer what object locks must be held + based on the objects referenced in a method call. Without getting + into great detail, here is an example which requires user-level + locks: +

+
+     library_class_a shared_object_a;
+
+     thread_main () {
+       library_class_b *object_b = new library_class_b;
+       shared_object_a.add_b (object_b);   // must hold lock for shared_object_a
+       shared_object_a.mutate ();          // must hold lock for shared_object_a
+     }
+
+     // Multiple copies of thread_main() are started in independent threads.
+

Under the assumption that object_a and object_b are never exposed to + another thread, here is an example that should not require any + user-level locks: +

+
+     thread_main () {
+       library_class_a object_a;
+       library_class_b *object_b = new library_class_b;
+       object_a.add_b (object_b);
+       object_a.mutate ();
+     } 
+

All library objects are safe to use in a multithreaded program as + long as each thread carefully locks out access by any other + thread while it uses any object visible to another thread, i.e., + treat library objects like any other shared resource. In general, + this requirement includes both read and write access to objects; + unless otherwise documented as safe, do not assume that two threads + may access a shared standard library object at the same time. +

+

See chapters 17 (library + introduction), 23 + (containers), and 27 (I/O) for + more information. +

+ +
+

5.7 How do I get a copy of the ISO C++ Standard?

+

Copies of the full ISO 14882 standard are available on line via the + ISO mirror site for committee members. Non-members, or those who + have not paid for the privilege of sitting on the committee and + sustained their two-meeting commitment for voting rights, may get a + copy of the standard from their respective national standards + organization. In the USA, this national standards organization is + ANSI and their website is right here. + (And if you've already registered with them, clicking this link will + take you to directly to the place where you can +buy + the standard on-line. +

+

Who is your country's member body? Visit the + ISO homepage and find out! +

+

The 2003 version of the standard (the 1998 version plus TC1) is + available in print, ISBN 0-470-84674-7. +

+ +
+

5.8 What's an ABI and why is it so messy?

+

"ABI" stands for "Application Binary Interface." + Conventionally, it refers to a great mass of details about how + arguments are arranged on the call stack and/or in registers, and + how various types are arranged and padded in structs. A single CPU + design may suffer multiple ABIs designed by different development + tool vendors who made different choices, or even by the same vendor + for different target applications or compiler versions. In ideal + circumstances the CPU designer presents one ABI and all the OSes and + compilers use it. In practice every ABI omits details that compiler + implementers (consciously or accidentally) must choose for themselves. +

+

That ABI definition suffices for compilers to generate code so a + program can interact safely with an OS and its lowest-level libraries. + Users usually want an ABI to encompass more detail, allowing libraries + built with different compilers (or different releases of the same + compiler!) to be linked together. For C++, this includes many more + details than for C, and CPU designers (for good reasons elaborated + below) have not stepped up to publish C++ ABIs. The details include + virtual function implementation, struct inheritance layout, name + mangling, and exception handling. Such an ABI has been defined for + GNU C++, and is immediately useful for embedded work relying only on + a "free-standing implementation" that doesn't include (much + of) the standard library. It is a good basis for the work to come. +

+

A useful C++ ABI must also incorporate many details of the standard + library implementation. For a C ABI, the layouts of a few structs + (such as FILE, stat, jmpbuf, and the like) and a few macros suffice. + For C++, the details include the complete set of names of functions + and types used, the offsets of class members and virtual functions, + and the actual definitions of all inlines. C++ exposes many more + library details to the caller than C does. It makes defining + a complete ABI a much bigger undertaking, and requires not just + documenting library implementation details, but carefully designing + those details so that future bug fixes and optimizations don't + force breaking the ABI. +

+

There are ways to help isolate library implementation details from the + ABI, but they trade off against speed. Library details used in + inner loops (e.g., getchar) must be exposed and frozen for all + time, but many others may reasonably be kept hidden from user code, + so they may later be changed. Deciding which, and implementing + the decisions, must happen before you can reasonably document a + candidate C++ ABI that encompasses the standard library. +

+ +
+

5.9 How do I make std::vector<T>::capacity() + == std::vector<T>::size()?

+ +

The standard idiom for deallocating a std::vector<T>'s + unused memory is to create a temporary copy of the vector and swap their + contents, e.g. for std::vector<T> v +

+
+     std::vector<T>(v).swap(v);
+   
+

The copy will take O(n) time and the swap is constant time. +

+

See Shrink-to-fit strings for + a similar solution for strings. +

+ + + +
+

+See license.html for copying conditions. +Comments and suggestions are welcome, and may be sent to +the libstdc++ mailing list. +

+ + + + + diff --git a/libstdc++-v3/doc/html/install.html b/libstdc++-v3/doc/html/install.html new file mode 100644 index 00000000000..3166ebc0a86 --- /dev/null +++ b/libstdc++-v3/doc/html/install.html @@ -0,0 +1,240 @@ + + + + + + + + + + libstdc++ Installation Instructions + + + + + +

Getting started: configure, build, install

+ +

+ The latest version of this document is always available at + + http://gcc.gnu.org/onlinedocs/libstdc++/install.html. +

+ +

+ To the libstdc++ homepage. +

+ + + +
+

Contents

+ +

Because libstdc++ is part of GCC, the primary source for + installation instructions is + the GCC install page. + Additional data is given here only where it applies to libstdc++. +

+ + + +
+ + + +

Tools you will need beforehand

+

The list of software needed to build the library is kept with the + rest of the compiler, at + + http://gcc.gnu.org/install/prerequisites.html. The same page + also lists the tools you will need if you wish to modify the source. +

+ +

As of GCC 4.0.1 the minimum version of binutils required to build + libstdc++ is 2.15.90.0.1.1. You can get snapshots + (as well as releases) of binutils from + + ftp://sources.redhat.com/pub/binutils. + Older releases of libstdc++ do not require such a recent version, + but to take full advantage of useful space-saving features and + bug-fixes you should use a recent binutils if possible. + The configure process will automatically detect and use these + features if the underlying support is present. +

+ +

Finally, a few system-specific requirements:

+
+
linux
+ +
If gcc 3.1.0 or later on is being used on linux, an attempt + will be made to use "C" library functionality necessary for C++ + named locale support. For gcc 3.2.1 and later, this means that + glibc 2.2.5 or later is required and the "C" library de_DE locale + information must be installed. + +

+ Note however that the sanity checks involving the de_DE locale are + skipped when an explicit --enable-clocale=gnu configure option is + used: only the basic checks are carried out, defending against + misconfigurations. +

+ +

+ If the 'gnu' locale model is being used, the following locales + are used and tested in the libstdc++ testsuites. The first column + is the name of the locale, the second is the character set it is + expected to use. +

+
+de_DE               ISO-8859-1
+de_DE@euro          ISO-8859-15
+en_HK               ISO-8859-1
+en_PH               ISO-8859-1
+en_US               ISO-8859-1
+en_US.ISO-8859-1    ISO-8859-1
+en_US.ISO-8859-15   ISO-8859-15
+en_US.UTF-8         UTF-8
+es_ES               ISO-8859-1
+es_MX               ISO-8859-1
+fr_FR               ISO-8859-1
+fr_FR@euro          ISO-8859-15
+is_IS               UTF-8
+it_IT               ISO-8859-1
+ja_JP.eucjp         EUC-JP
+se_NO.UTF-8         UTF-8
+ta_IN               UTF-8
+zh_TW               BIG5
+
+

Failure to have the underlying "C" library locale + information installed will mean that C++ named locales for the + above regions will not work: because of this, the libstdc++ + testsuite will skip the named locale tests. If this isn't an + issue, don't worry about it. If named locales are needed, the + underlying locale information must be installed. Note that + rebuilding libstdc++ after the "C" locales are installed is not + necessary. +

+ +

To install support for locales, do only one of the following: +

+ +
    +
  • install all locales +
      +
    • with RedHat Linux: +

      export LC_ALL=C

      +

      rpm -e glibc-common --nodeps

      +

      rpm -i --define "_install_langs all" + glibc-common-2.2.5-34.i386.rpm

      +
    • +
    • (instructions for other operating systems solicited)
    • +
    +
  • +
  • install just the necessary locales +
      +
    • with Debian Linux: +

      Add the above list, as shown, to the file + /etc/locale.gen

      +

      run /usr/sbin/locale-gen

      +
    • +
    • on most Unix-like operating systems: +

      localedef -i de_DE -f ISO-8859-1 de_DE

      +

      (repeat for each entry in the above list)

      +
    • +
    • (instructions for other operating systems solicited)
    • +
    +
  • +
+
+
+ +
+ +

Configuring

+

If you have never done this before, you should read the basic + GCC Installation + Instructions first. Read all of them. + Twice. +

+

When building libstdc++ you'll have to configure + the entire gccsrcdir directory. The full list of libstdc++ + specific configuration options, not dependent on the specific compiler + release being used, can be found here. +

+

Consider possibly using --enable-languages=c++ to save time by only + building the C++ language parts. +

+ +
+   cd gccbuilddir
+   gccsrcdir/configure --prefix=destdir --other-opts...
+ + +
+

Using the library

+

Find the new library at runtime (shared linking only)

+

If you only built a static library (libstdc++.a), or if you + specified static linking, you don't have to worry about this. + But if you built a shared library (libstdc++.so) and linked + against it, then you will need to find that library when you + run the executable. +

+

Methods vary for different platforms and different styles, but + the usual ones are printed to the screen during installation. + They include: +

+
    +
  • At runtime set LD_LIBRARY_PATH in your environment correctly, + so that the shared library for libstdc++ can be found and + loaded. Be certain that you understand all of the other + implications and behavior of LD_LIBRARY_PATH first (few + people do, and they get into trouble). +
  • +
  • Compile the path to find the library at runtime into the + program. This can be done by passing certain options to g++, + which will in turn pass them on to the linker. The exact + format of the options is dependent on which linker you use: +
      +
    • GNU ld (default on Linux): -Wl,--rpath,destdir/lib
    • +
    • IRIX ld: -Wl,-rpath,destdir/lib
    • +
    • Solaris ld: -Wl,-Rdestdir/lib
    • +
    • More...? Let us know!
    • +
    +
  • +
+

Use the ldd(1) utility to show which library the system + thinks it will get at runtime. +

+

A libstdc++.la file is also installed, for use with Libtool. If + you use Libtool to create your executables, these details are + taken care of for you. +

+ + + + + + +
+

+See license.html for copying conditions. +Comments and suggestions are welcome, and may be sent to +the libstdc++ mailing list. +

+ + + + + diff --git a/libstdc++-v3/doc/html/lib3styles.css b/libstdc++-v3/doc/html/lib3styles.css new file mode 100644 index 00000000000..ee88c366cd4 --- /dev/null +++ b/libstdc++-v3/doc/html/lib3styles.css @@ -0,0 +1,6 @@ +.centered { text-align: center } +.tocheader { font-size: large } +.fineprint { font-size: x-small } +.larger { font-size: large } +BODY { background: #FFFFFF } +PRE { text-align: left ; margin-left: 1em } diff --git a/libstdc++-v3/doc/html/test.html b/libstdc++-v3/doc/html/test.html new file mode 100644 index 00000000000..8a8694c2d6e --- /dev/null +++ b/libstdc++-v3/doc/html/test.html @@ -0,0 +1,722 @@ + + + + + + + + + + libstdc++ Testing Instructions + + + + +

Testing Details

+ +

+ The latest version of this document is always available at + + http://gcc.gnu.org/onlinedocs/libstdc++/test.html. +

+ +

+ To the libstdc++ homepage. +

+ + +
+

Contents

+ + +
+ + + +

Testsuite organization and naming conventions

+

+ The directory libsrcdir/testsuite contains the + individual test cases organized in sub-directories corresponding + to chapters of the C++ standard (detailed below), the dejagnu + test harness support files, and sources to various testsuite + utilities that are packaged in a separate testing library. +

+ +

All test cases for functionality required by the runtime + components of the C++ standard (ISO 14882) are files within the + following directories. +

+ +
+17_intro
+18_support
+19_diagnostics
+20_util
+21_strings
+22_locale
+23_containers
+25_algorithms
+26_numerics
+27_io
+   
+ +

+ In addition, the following directories include test files: +

+ +
+tr1		  Tests for components as described by the Technical Report on Standard Library Extensions (TR1).
+backward	  Tests for backwards compatibility and deprecated features.
+demangle	  Tests for __cxa_demangle, the IA 64 C++ ABI demangler
+ext		  Tests for extensions.
+performance	  Tests for performance analysis, and performance regressions.
+thread		  Tests for threads.
+   
+ +

+ Some directories don't have test files, but instead contain + auxiliary information (more information): +

+ +
+config		  Files for the dejagnu test harness.
+lib		  Files for the dejagnu test harness.
+libstdc++*     	  Files for the dejagnu test harness.
+data		  Sample text files for testing input and output.
+util		  Files for libtestc++, utilities and testing routines.
+   
+ +

+ Within a directory that includes test files, there may be + additional subdirectories, or files. Originally, test cases + were appended to one file that represented a particular section + of the chapter under test, and was named accordingly. For + instance, to test items related to 21.3.6.1 - + basic_string::find [lib.string::find] in the standard, + the following was used: +

+
+21_strings/find.cc
+   
+

+ However, that practice soon became a liability as the test cases + became huge and unwieldy, and testing new or extended + functionality (like wide characters or named locales) became + frustrating, leading to aggressive pruning of test cases on some + platforms that covered up implementation errors. Now, the test + suite has a policy of one file, one test case, which solves the + above issues and gives finer grained results and more manageable + error debugging. As an example, the test case quoted above + becomes: +

+
+21_strings/basic_string/find/char/1.cc
+21_strings/basic_string/find/char/2.cc
+21_strings/basic_string/find/char/3.cc
+21_strings/basic_string/find/wchar_t/1.cc
+21_strings/basic_string/find/wchar_t/2.cc
+21_strings/basic_string/find/wchar_t/3.cc
+   
+ +

+ All new tests should be written with the policy of one test + case, one file in mind. +

+ +

+ In addition, there are some special names and suffixes that are + used within the testsuite to designate particular kinds of + tests. +

+ +
    +
  • + _xin.cc +

    + This test case expects some kind of interactive input in order + to finish or pass. At the moment, the interactive tests are not + run by default. Instead, they are run by hand, like: +

    +
     
    +g++ 27_io/objects/char/3_xin.cc
    +cat 27_io/objects/char/3_xin.in | a.out
    +     
    +
  • +
  • + .in +

    + This file contains the expected input for the corresponding + _xin.cc test case. +

    +
  • +
  • + _neg.cc +

    + This test case is expected to fail: it's a negative test. At the + moment, these are almost always compile time errors. +

    +
  • +
  • + char +

    + This can either be a directory name or part of a longer file + name, and indicates that this file, or the files within this + directory are testing the char instantiation of a + template. +

    +
  • +
  • + wchar_t +

    + This can either be a directory name or part of a longer file + name, and indicates that this file, or the files within this + directory are testing the wchar_t instantiation of + a template. Some hosts do not support wchar_t + functionality, so for these targets, all of these tests will not + be run. +

    +
  • +
  • + thread +

    + This can either be a directory name or part of a longer file + name, and indicates that this file, or the files within this + directory are testing situations where multiple threads are + being used. +

    +
  • +
  • + performance +

    + This can either be an enclosing directory name or part of a + specific file name. This indicates a test that is used to + analyze runtime performance, for performance regression testing, + or for other optimization related analysis. At the moment, these + test cases are not run by default. +

    +
  • +
+ +
+

Utilities: abi_check and libtestc++

+

+ The testsuite directory also contains some files that implement + functionality that is intended to make writing test cases easier, + or to avoid duplication, or to provide error checking in a way that + is consistent across platforms and test harnesses. A stand-alone + executable, called abi_check, and a static library called + libtestc++ are constructed. Both of these items are not + installed, and only used during testing. +

+ +

+ These files include the following functionality: +

+ +
    +
  • + testsuite_abi.h, + testsuite_abi.cc, + testsuite_abi_check.cc +

    + Creates the executable abi_check. + Used to check correctness of symbol versioning, visibility of + exported symbols, and compatibility on symbols in the shared + library, for hosts that support this feature. More information + can be found in the ABI documentation here +

    +
  • +
  • + testsuite_allocator.h, + testsuite_allocator.cc +

    + Contains specialized allocators that keep track of construction + and destruction. Also, support for overriding global new and + delete operators, including verification that new and delete + are called during execution, and that allocation over max_size + fails. +

    +
  • +
  • + testsuite_character.h +

    + Contains std::char_traits and + std::codecvt specializations for a user-defined + POD. +

    +
  • +
  • + testsuite_hooks.h, + testsuite_hooks.cc +

    + A large number of utilities, including: +

    +
      +
    • VERIFY
    • +
    • set_memory_limits
    • +
    • verify_demangle
    • +
    • run_tests_wrapped_locale
    • +
    • run_tests_wrapped_env
    • +
    • try_named_locale
    • +
    • try_mkfifo
    • +
    • func_callback
    • +
    • counter
    • +
    • copy_tracker
    • +
    • copy_constructor
    • +
    • assignment_operator
    • +
    • destructor
    • +
    • pod_char, pod_int and associated char_traits specializations
    • +
    +

    +
  • +
  • + testsuite_io.h +

    + Error, exception, and constraint checking for + std::streambuf, std::basic_stringbuf, std::basic_filebuf. +

    +
  • +
  • + testsuite_iterators.h +

    + Wrappers for various iterators. +

    +
  • +
  • + testsuite_performance.h +

    + A number of class abstractions for performance counters, and + reporting functions including: +

    +
      +
    • time_counter
    • +
    • resource_counter
    • +
    • report_performance
    • +
    +

    +
  • +
+ +
+

How to write a new test case

+ +

+ The first step in making a new test case is to choose the correct + directory and file name, given the organization as previously + described. +

+ +

+ All files are copyright the FSF, and GPL'd: this is very + important. The first copyright year should correspond to the date + the file was checked in to SVN. +

+ +

+ As per the dejagnu instructions, always return 0 from main to + indicate success. +

+ +

+ A bunch of utility functions and classes have already been + abstracted out into the testsuite utility library, + libtestc++. To use this functionality, just include the + appropriate header file: the library or specific object files will + automatically be linked in as part of the testsuite run. +

+ +

+ For a test that needs to take advantage of the dejagnu test + harness, what follows below is a list of special keyword that + harness uses. Basically, a test case contains dg-keywords (see + dg.exp) indicating what to do and what kinds of behavior are to be + expected. New test cases should be written with the new style + DejaGnu framework in mind. +

+ +

+ To ease transition, here is the list of dg-keyword documentation + lifted from dg.exp. +

+ +
+# The currently supported options are:
+#
+# dg-prms-id N
+#	set prms_id to N
+#
+# dg-options "options ..." [{ target selector }]
+#	specify special options to pass to the tool (eg: compiler)
+#
+# dg-do do-what-keyword [{ target/xfail selector }]
+#	`do-what-keyword' is tool specific and is passed unchanged to
+#	${tool}-dg-test.  An example is gcc where `keyword' can be any of:
+#	preprocess|compile|assemble|link|run
+#	and will do one of: produce a .i, produce a .s, produce a .o,
+#	produce an a.out, or produce an a.out and run it (the default is
+#	compile).
+#
+# dg-error regexp comment [{ target/xfail selector } [{.|0|linenum}]]
+#	indicate an error message <regexp> is expected on this line
+#	(the test fails if it doesn't occur)
+#	Linenum=0 for general tool messages (eg: -V arg missing).
+#	"." means the current line.
+#
+# dg-warning regexp comment [{ target/xfail selector } [{.|0|linenum}]]
+#	indicate a warning message <regexp> is expected on this line
+#	(the test fails if it doesn't occur)
+#
+# dg-bogus regexp comment [{ target/xfail selector } [{.|0|linenum}]]
+#	indicate a bogus error message <regexp> use to occur here
+#	(the test fails if it does occur)
+#
+# dg-build regexp comment [{ target/xfail selector }]
+#	indicate the build use to fail for some reason
+#	(errors covered here include bad assembler generated, tool crashes,
+#	and link failures)
+#	(the test fails if it does occur)
+#
+# dg-excess-errors comment [{ target/xfail selector }]
+#	indicate excess errors are expected (any line)
+#	(this should only be used sparingly and temporarily)
+#
+# dg-output regexp [{ target selector }]
+#	indicate the expected output of the program is <regexp>
+#	(there may be multiple occurrences of this, they are concatenated)
+#
+# dg-final { tcl code }
+#	add some tcl code to be run at the end
+#	(there may be multiple occurrences of this, they are concatenated)
+#	(unbalanced braces must be \-escaped)
+#
+# "{ target selector }" is a list of expressions that determine whether the
+# test succeeds or fails for a particular target, or in some cases whether the
+# option applies for a particular target.  If the case of `dg-do' it specifies
+# whether the test case is even attempted on the specified target.
+#
+# The target selector is always optional.  The format is one of:
+#
+# { xfail *-*-* ... } - the test is expected to fail for the given targets
+# { target *-*-* ... } - the option only applies to the given targets
+#
+# At least one target must be specified, use *-*-* for "all targets".
+# At present it is not possible to specify both `xfail' and `target'.
+# "native" may be used in place of "*-*-*".
+
+Example 1: Testing compilation only
+// { dg-do compile }
+
+Example 2: Testing for expected warnings on line 36, which all targets fail
+// { dg-warning "string literals" "" { xfail *-*-* } 36
+
+Example 3: Testing for expected warnings on line 36
+// { dg-warning "string literals" "" { target *-*-* } 36
+
+Example 4: Testing for compilation errors on line 41
+// { dg-do compile }
+// { dg-error "no match for" "" { target *-*-* } 41 }
+
+Example 5: Testing with special command line settings, or without the
+use of pre-compiled headers, in particular the stdc++.h.gch file. Any
+options here will override the DEFAULT_CXXFLAGS and PCH_CXXFLAGS set
+up in the normal.exp file.
+// { dg-options "-O0" { target *-*-* } }
+
+ +

+ More examples can be found in the libstdc++-v3/testsuite/*/*.cc files. +

+ +
+

Options for running the tests

+ +

There are several options for running tests, including testing + the regression tests, testing a subset of the regression tests, + testing the performance tests, testing just compilation, testing + installed tools, etc. In addition, there is a special rule for + checking the exported symbols of the shared library. +

+ +

You can check the status of the build without installing it + using the dejagnu harness, much like the rest of the gcc tools.

+
 make check
+

in the libbuilddir directory.

+

or

+
 make check-target-libstdc++-v3
+

in the gccbuilddir directory.

+ +

+ These commands are functionally equivalent and will create a + 'testsuite' directory underneath libbuilddir containing + the results of the tests. Two results files will be generated: + libstdc++.sum, which is a PASS/FAIL summary for each + test, and libstdc++.log which is a log of the exact + command line passed to the compiler, the compiler output, and + the executable output (if any). +

+ + +

+To debug the dejagnu test harness during runs, try invoking with a +specific argument to the variable RUNTESTFLAGS, as below. +

+ +
+make check-target-libstdc++-v3 RUNTESTFLAGS="-v"
+
+or +
+make check-target-libstdc++-v3 RUNTESTFLAGS="-v -v"
+
+ +

+To run a subset of the library tests, you will need to generate the +testsuite_files file by running make testsuite_files +in the libbuilddir/testsuite directory, described below. +Edit the file to remove the tests you don't want and then run the +testsuite as normal. +

+ + +

+There are two ways to run on a simulator: set up DEJAGNU to point to a +specially crafted site.exp, or pass down --target_board flags. +

+Example flags to pass down for various embedded builds are as follows: +
+--target=powerpc-eabism (libgloss/sim)
+make check-target-libstdc++-v3 RUNTESTFLAGS="--target_board=powerpc-sim"
+
+--target=calmrisc32 (libgloss/sid)
+make check-target-libstdc++-v3 RUNTESTFLAGS="--target_board=calmrisc32-sid"
+
+--target=xscale-elf (newlib/sim)
+make check-target-libstdc++-v3 RUNTESTFLAGS="--target_board=arm-sim"
+
+ +

Also, here is an example of how to run the libstdc++ testsuite for a +multilibed build directory with different ABI settings: +

+
+make check-target-libstdc++-v3 RUNTESTFLAGS='--target_board \"unix{-mabi=32,,-mabi=64}\"'
+
+ +

+You can run the tests with a compiler and library that have already +been installed. Make sure that the compiler (e.g., g++) +is in your PATH. If you are using shared libraries, then +you must also ensure that the directory containing the shared version +of libstdc++ is in your LD_LIBRARY_PATH, or equivalent. +If your GCC source tree is at /path/to/gcc, then you can +run the tests as follows: +

+
+runtest --tool libstdc++ --srcdir=/path/to/gcc/libstdc++-v3/testsuite
+
+

+The testsuite will create a number of files in the directory in which you +run this command,. Some of those files might use the same name as +files created by other testsuites (like the ones for GCC and G++), so +you should not try to run all the testsuites in parallel from the same +directory. +

+ +

In addition, there are some testing options that are mostly of + interest to library maintainers and system integrators. As such, + these tests may not work on all cpu and host combinations, and may need to + be executed in the libbuilddir/testsuite directory. These options + include, but are not necessarily limited to, the following: +

+ +
+   make testsuite_files
+

+ Five files are generated that determine what test files + are run. These files are: +

+
    +
  • + testsuite_files +

    This is a list of all the test cases that will be run. Each + test case is on a separate line, given with an absolute path + from the libsrcdir/testsuite directory. +

    +
  • + +
  • + testsuite_files_interactive +

    This is a list of all the interactive test cases, using the + same format as the file list above. These tests are not run by default. +

    +
  • + +
  • + testsuite_files_performance +

    This is a list of all the performance test cases, using the + same format as the file list above. These tests are not run by default. +

    +
  • + +
  • + testsuite_thread +

    This file indicates that the host system can run tests which + incolved multiple threads. +

    +
  • + +
  • + testsuite_wchar_t +

    This file indicates that the host system can run the wchar_t + tests, and corresponds to the macro definition + _GLIBCXX_USE_WCHAR_T in the file c++config.h. +

    +
  • +
+ +
+   make check-abi
+

The library ABI can be tested. This involves testing the shared + library against an ABI-defining previous version of symbol exports.

+ +
+   make check-compile
+

This rule compiles, but does not link or execute, the + testsuite_files test cases and displays the output on stdout.

+ +
+   make check-performance
+

This rule runs through the testsuite_files_performance + test cases and collects information for performance analysis and + can be used to spot performance regressions. Various timing + information is collected, as well as number of hard page faults, + and memory used. This is not run by default, and the implementation + is in flux. +

+ +

+ We are interested in any strange failures of the + testsuite; please see FAQ 2.4 + for which files to examine. +

+ +
+

Running debug-mode tests

+

To run the libstdc++ test suite under the debug mode, + edit libstdc++-v3/scripts/testsuite_flags to add the + compile-time flag -D_GLIBCXX_DEBUG to the result + printed by the --build-cxx option. Additionally, add + the -D_GLIBCXX_DEBUG_PEDANTIC flag to turn on pedantic + checking. The libstdc++ test suite should produce precisely the same + results under debug mode that it does under release mode: any + deviation indicates an error in either the library or the test + suite.

+ +
+

Future

+ +

+Shared runs need to be implemented, for targets that support shared libraries. +

+ +

+Diffing of expected output to standard streams needs to be finished off. +

+ +

+The V3 testing framework supports, or will eventually support, +additional keywords for the purpose of easing the job of writing +test cases. All V3-keywords are of the form @xxx@. +Currently plans for supported keywords include: +

+ +
+
@require@ <files>
+
+

+ The existence of <files> is essential for the test to complete + successfully. For example, a test case foo.C using bar.baz as + input file could say +

+
+	    // @require@ bar.baz
+

+ The special variable % stands for the rootname, e.g. the + file-name without its `.C' extension. Example of use (taken + verbatim from 27_io/filebuf.cc) +

+
+	   // @require@ %-*.tst %-*.txt
+
+
@diff@ <first-list> <second-list>
+
+

+ After the test case compiles and ran successfully, diff + <first-list> against <second-list>, these lists should + have the same length. The test fails if diff returns non-zero a + pair of files. +

+
+
+ +
+

DejaGNU internals

+ +

This is information for those looking at making changes to the testsuite +structure, and/or needing to trace dejagnu's actions with --verbose. This +will not be useful to people who are "merely" adding new tests to the existing +structure. +

+ +

The first key point when working with dejagnu is the idea of a "tool". +Files, directories, and functions are all implicitly used when they are +named after the tool in use. Here, the tool will always be "libstdc++". +

+ +

The lib subdir contains support routines. The +lib/libstdc++.exp file ("support library") is loaded +automagically, and must explicitly load the others. For example, files can +be copied from the core compiler's support directory into lib. +

+ +

Some routines in lib/libstdc++.exp are callbacks, some are +our own. Callbacks must be prefixed with the name of the tool. To easily +distinguish the others, by convention our own routines are named "v3-*". +

+ +

The next key point when working with dejagnu is "test files". Any +directory whose name starts with the tool name will be searched for test files. +(We have only one.) In those directories, any .exp file is +considered a test file, and will be run in turn. Our main test file is called +normal.exp; it runs all the tests in testsuite_files using the +callbacks loaded from the support library. +

+ +

The config directory is searched for any particular "target +board" information unique to this library. This is currently unused and sets +only default variables. +

+ + + + +
+

+See license.html for copying conditions. +Comments and suggestions are welcome, and may be sent to +the libstdc++ mailing list. +

+ + + + diff --git a/libstdc++-v3/docs/doxygen/Intro.3 b/libstdc++-v3/docs/doxygen/Intro.3 deleted file mode 100644 index cb3ff2e4a1e..00000000000 --- a/libstdc++-v3/docs/doxygen/Intro.3 +++ /dev/null @@ -1,132 +0,0 @@ -.\" t -.\" This man page is released under the FDL as part of libstdc++. -.TH C++Intro 3 "20 May 2004" "GNU libstdc++" "Standard C++ Library" -.SH NAME -C++Intro \- Introduction to the GNU libstdc++ man pages -.SH DESCRIPTION -This man page serves as a brief introduction to the GNU implementation of -the Standard C++ Library. For a better introduction and more complete -documentation, see the -.B libstdc++ -homepage listed at the end. -.P -All standard library entities are declared within -.I namespace std -and have manual entries beginning with "std::". For example, to see -documentation of the template class -.I std::vector -one would use "man std::vector". Some entities do not have a separate man -page; for those see the main listing in "man Namespace_std". -.P -All the man pages are automatically generated by Doxygen. For more -information on this tool, see the HTML counterpart to these man pages. -.P -Some man pages do not correspond to individual classes or functions. Rather -they describe categories of the Standard Library. (For a more thorough -introduction to the various categories, consult a text such as Josuttis' -or Austern's.) These category pages are: -.P -.\" These are separated by ONE TAB. Nothing else. I don't like it either. -.TS -lB l. -C++Intro This page. -Namespace_std A listing of the contents of std::. -Namespace___gnu_cxx A listing of the contents of __gnu_cxx::. -Containers An introduction to container classes. -Sequences Linear containers. -Assoc_containers Key-based containers. -Iterator_types Programatically distinguishing iterators/pointers. -Intro_functors An introduction to function objects, or functors. -Arithmetic_functors Functors for basic math. -Binder_functors Functors which "remember" an argument. -Comparison_functors Functors wrapping built-in comparisons. -Func_ptr_functors Functors for use with pointers to functions. -Logical_functors Functors wrapping the Boolean operations. -Member_ptr_functor Functors for use with pointers to members. -Negation_functors Functors which negate their contents. -SGIextensions A list of the extensions from the SGI STL subset. - -.TE -.P -The HTML documentation typically goes into much more depth. -.SH FILES -Lots! -.SS Standard Headers -These headers will be found automatically, unless you instruct the compiler -otherwise. -.TS -lB lB lB lB. - - - - - - -646 - - - - - -.TE -.SS Backwards-Compatibility Headers -For GCC 3.0 these headers will be found automatically, unless you instruct -the compiler otherwise. You should not depend on this, instead you should -read FAQ 5.4 and use a -.B backward/ -prefix. -.TS -lB lB lB lB. - -.TE -.SS Extension Headers -These headers will only be found automatically if you include the leading -.B ext/ -in the name. Otherwise you need to read FAQ 5.4. -.\" Easy way to generate these columns of headers is to use GNU ls(1): -.\" ls -w 40 file1 file2... | sed 's=[a-z_][a-z_]*==g' -.TS -lB lB. - - - - - - - - -.TE -.SS Libraries -.TP -.I libstdc++.a -The library implementation in static archive form. If you did not configure -libstdc++ to use shared libraries, this will always be used. Otherwise -it will only be used if the user requests it. -.TP -.I libsupc++.a -This library contains C++ language support routines. Usually you will never -need to know about it, but it can be useful. See FAQ 2.5. -.TP -.I libstdc++.so[.N] -The library implementation in shared object form. This will be used in -preference to the static archive form by default. N will be a number equal -to or greater than 3. If N is in the 2.x series, then you are looking at -the old libstdc++-v2 library, which we do not maintain. -.TP -.I libstdc++.la -.TP -.I libsupc++.la -These are Libtool library files, and should only be used when working with -that tool. -.SH CONFORMING TO -Almost conforming to -.BI "International Standard ISO/IEC 14882:1998(E), " "Programming Languages --- C++" -(aka the C++ standard), in addition to corrections proposed by the Library -Working Group, -.SM JTC1/SC22/WG21. -.SH SEE ALSO -.UR -http://gcc.gnu.org/libstdc++/ -.UE -for the Frequently Asked Questions, online documentation, and much, much more! -.\" vim:ts=8:noet: diff --git a/libstdc++-v3/docs/doxygen/TODO b/libstdc++-v3/docs/doxygen/TODO deleted file mode 100644 index d50c65d8bab..00000000000 --- a/libstdc++-v3/docs/doxygen/TODO +++ /dev/null @@ -1,70 +0,0 @@ - -The approach I've been using for a given header is to recursively do each -of the "bits" headers which make up the standard header. So, e.g., while -there are four headers making up , three of them were already -documented in the course of doing other headers. - -"Untouched" means I've deliberately skipped it for various reasons, or -haven't gotten to it yet. It /will/ be done (by somebody, eventually.) - -If you document an area and need to skip (for whatever reason) a non-trivial -entity (i.e., one that should be documented), go ahead and add the comment -markup, and use the homegrown @doctodo tag. See include/bits/stl_iterator.h -for examples of this. Doing so will at least cause doxygen to consider the -entitiy as documented and include it in the output. It will also add the -entity to the generated TODO page. - - - Area Still needs to be doxygen-documented ------------------------------------------------------------ - -c17 FINISHED (Nothing in Clause 17 "exists" in terms of code.) -c18 FINISHED, Note A -c19 Note A -c20 Note A -c21 Public functions basic_string done, Note B -c22 Most still to do; see docs/html/22_locale/* -c23 See doxygroups.cc and Note B. Notes on what invalidates - iterators need to be added. -c24 stl_iterator.h (__normal_iterator, other small TODO bits) - stream iterators -c25 stl_algo.h (lots of stuff) -c26 , , stl_numeric.h[26.4], Note A -c27 ios_base callbacks and local storage - basic_ios::copyfmt() - std_streambuf.h's __copy_streambufs() - " " _M_* protected memfns (data has been done) - fstream and sstream protected members - -backward/* Not scanned by doxygen. Should it be? Doubtful. - -ext/* Some of the SGI algorithm/functional extensions. - All of rope/hashing/slist need docs. - -__gnu_cxx Tricky. Right now ext/* are in this namespace. - ------------------------------------------------------------ - -NOTES: - -A) So far I have not tried to document any of the headers. So entities -such as atexit() are undocumented throughout the library. Since we usually -do not have the C code (to which the doxygen comments would be attached), -this would need to be done in entirely separate files, a la doxygroups.cc. - -B) Huge chunks of containers and strings are described in common "Tables" -in the standard. These are pseudo-duplicated in tables.html. We can -use doxygen hooks like @pre and @see to reference the tables. Then the -individual classes do like the standard does, and only document members for -which additional info is available. - - -STYLE: -stl_deque.h, stl_pair.h, and stl_algobase.h have good examples of what I've -been using for class, namespace-scope, and function documentation, respectively. -These should serve as starting points. /Please/ maintain the inter-word and -inter-sentence spacing, as this might be generated and/or scanned in the -future. - - -vim:ts=4:et: diff --git a/libstdc++-v3/docs/doxygen/doxygroups.cc b/libstdc++-v3/docs/doxygen/doxygroups.cc deleted file mode 100644 index 68d142fdbfb..00000000000 --- a/libstdc++-v3/docs/doxygen/doxygroups.cc +++ /dev/null @@ -1,238 +0,0 @@ -/* - Copyright (C) 2001, 2002, 2005 Free Software Foundation, Inc. - See license.html for license. - - This just provides documentation for stuff that doesn't need to be in the - source headers themselves. It is a ".cc" file for the sole cheesy reason - that it triggers many different text editors into doing Nice Things when - typing comments. However, it is mentioned nowhere except the *cfg.in files. - - Some actual code (declarations) is exposed here, but no compiler ever - sees it. The decls must be visible to doxygen, and sometimes their real - declarations are not visible, or not visible in a way we want. - - Pieces separated by '// //' lines will usually not be presented to the - user on the same page. -*/ - -// // // // // // // // // // // // // // // // // // // // // // // // -/** @namespace std - * @brief Everything defined by the ISO C++ Standard is within - * namespace std. -*/ -/** @namespace std::__detail - * @brief Implementation details not part of the namespace std interface. -*/ -/** @namespace std::tr1 - * @brief Everything defined by the ISO C++ TR1 is within namespace std::tr1. -*/ -/** @namespace std::tr1::__detail - * @brief Implementation details not part of the namespace std::tr1 interface. -*/ -/** @namespace __gnu_cxx - * @brief GNU extensions for public use. -*/ -/** @namespace __gnu_cxx::__detail - * @brief Implementation details not part of the namespace __gnu_cxx - * interface. -*/ -/** @namespace __gnu_cxx::typelist - * @brief GNU typelist extensions for public compile-time use. -*/ -/** @namespace __gnu_internal - * @brief GNU implemenation details, not for public use or - * export. Used only when anonymous namespaces cannot be substituted. -*/ -/** @namespace __gnu_debug - * @brief GNU debug classes for public use. -*/ -// // // // // // // // // // // // // // // // // // // // // // // // -/** @addtogroup SGIextensions STL extensions from SGI -Because libstdc++ based its implementation of the STL subsections of -the library on the SGI 3.3 implementation, we inherited their extensions -as well. - -They are additionally documented in the - -online documentation, a copy of which is also shipped with the -library source code (in .../docs/html/documentation.html). You can also -read the documentation on SGI's -site, which is still running even though the code is not maintained. - -NB that the following notes are pulled from various -comments all over the place, so they may seem stilted. -
-*/ - -// // // // // // // // // // // // // // // // // // // // // // // // -// This is standalone because, unlike the functor introduction, there is no -// single header file which serves as a base "all containers must include -// this header". We do some quoting of 14882 here. -/** @addtogroup Containers Containers -Containers are collections of objects. - -A container may hold any type which meets certain requirements, but the type -of contained object is chosen at compile time, and all objects in a given -container must be of the same type. (Polymorphism is possible by declaring a -container of pointers to a base class and then populating it with pointers to -instances of derived classes. Variant value types such as the @c any class -from Boost can also be used. - -All contained types must be @c Assignable and @c CopyConstructible. -Specific containers may place additional requirements on the types of -their contained objects. - -Containers manage memory allocation and deallocation themselves when -storing your objects. The objects are destroyed when the container is -itself destroyed. Note that if you are storing pointers in a container, -@c delete is @e not automatically called on the pointers before destroying them. - -All containers must meet certain requirements, summarized in -tables. - -The standard containers are further refined into -@link Sequences Sequences@endlink and -@link Assoc_containers Associative Containers@endlink. -*/ - -/** @addtogroup Sequences Sequences -Sequences arrange a collection of objects into a strictly linear order. - -The differences between sequences are usually due to one or both of the -following: - - memory management - - algorithmic complexity - -As an example of the first case, @c vector is required to use a contiguous -memory layout, while other sequences such as @c deque are not. - -The prime reason for choosing one sequence over another should be based on -the second category of differences, algorithmic complexity. For example, if -you need to perform many inserts and removals from the middle of a sequence, -@c list would be ideal. But if you need to perform constant-time access to -random elements of the sequence, then @c list should not be used. - -All sequences must meet certain requirements, summarized in -tables. -*/ - -/** @addtogroup Assoc_containers Associative Containers -Associative containers allow fast retrieval of data based on keys. - -Each container type is parameterized on a @c Key type, and an ordering -relation used to sort the elements of the container. - -There should be more text here. - -All associative containers must meet certain requirements, summarized in -tables. -*/ - -// // // // // // // // // // // // // // // // // // // // // // // // -/** @namespace abi - * @brief The cross-vendor C++ Application Binary Interface. A - * namespace alias to __cxxabiv1. - * - * A brief overview of an ABI is given in the libstdc++ FAQ, question - * 5.8 (you may have a copy of the FAQ locally, or you can view the online - * version at http://gcc.gnu.org/onlinedocs/libstdc++/faq/index.html#5_8). - * - * GCC subscribes to a relatively-new cross-vendor ABI for C++, sometimes - * called the IA64 ABI because it happens to be the native ABI for that - * platform. It is summarized at http://www.codesourcery.com/cxx-abi/ - * along with the current specification. - * - * For users of GCC greater than or equal to 3.x, entry points are - * available in , which notes, "It is not normally - * necessary for user programs to include this header, or use the - * entry points directly. However, this header is available should - * that be needed." -*/ - -namespace abi { -/** -@brief New ABI-mandated entry point in the C++ runtime library for demangling. - -@param mangled_name A NUL-terminated character string containing the name - to be demangled. - -@param output_buffer A region of memory, allocated with malloc, of - @a *length bytes, into which the demangled name - is stored. If @a output_buffer is not long enough, - it is expanded using realloc. @a output_buffer may - instead be NULL; in that case, the demangled name is - placed in a region of memory allocated with malloc. - -@param length If @a length is non-NULL, the length of the buffer containing - the demangled name is placed in @a *length. - -@param status @a *status is set to one of the following values: - - 0: The demangling operation succeeded. - - -1: A memory allocation failiure occurred. - - -2: @a mangled_name is not a valid name under the C++ ABI - mangling rules. - - -3: One of the arguments is invalid. - -@return A pointer to the start of the NUL-terminated demangled name, or NULL - if the demangling fails. The caller is responsible for deallocating - this memory using @c free. - - -The demangling is performed using the C++ ABI mangling rules, with -GNU extensions. For example, this function is used -in __gnu_cxx::__verbose_terminate_handler. See -http://gcc.gnu.org/onlinedocs/libstdc++/18_support/howto.html#5 for other -examples of use. - -@note The same demangling functionality is available via libiberty -(@c and @c libiberty.a) in GCC 3.1 and later, but that -requires explicit installation (@c --enable-install-libiberty) and uses a -different API, although the ABI is unchanged. -*/ -char* __cxa_demangle (const char* mangled_name, char* output_buffer, - size_t* length, int* status); -} // namespace abi - -// // // // // // // // // // // // // // // // // // // // // // // // -/** @addtogroup binarysearch Binary search algorithms -These algorithms are variations of a classic binary search. They all assume -that the sequence being searched is already sorted. - -The number of comparisons will be logarithmic (and as few as possible). -The number of steps through the sequence will be logarithmic for -random-access iterators (e.g., pointers), and linear otherwise. - -The LWG has passed Defect Report 270, which notes: The proposed -resolution reinterprets binary search. Instead of thinking about searching -for a value in a sorted range, we view that as an important special -case of a more general algorithm: searching for the partition point in a -partitioned range. We also add a guarantee that the old wording did not: -we ensure that the upper bound is no earlier than the lower bound, that -the pair returned by equal_range is a valid range, and that the first part -of that pair is the lower bound. - -The actual effect of the first sentence is that a comparison functor -passed by the user doesn't necessarily need to induce a strict weak ordering -relation. Rather, it partitions the range. -*/ - -// // // // // // // // // // // // // // // // // // // // // // // // -/** @addtogroup setoperations Set operation algorithms -These algorithms are common set operations performed on sequences that are -already sorted. - -The number of comparisons will be linear. -*/ - -// // // // // // // // // // // // // // // // // // // // // // // // - -// // // // // // // // // // // // // // // // // // // // // // // // -/* * @addtogroup groupname description of group -placeholder text -*/ - -// // // // // // // // // // // // // // // // // // // // // // // // - -// vim:et:noai: - diff --git a/libstdc++-v3/docs/doxygen/guide.html b/libstdc++-v3/docs/doxygen/guide.html deleted file mode 100644 index 30c8725e8e0..00000000000 --- a/libstdc++-v3/docs/doxygen/guide.html +++ /dev/null @@ -1,112 +0,0 @@ - - - - - Build and Writing Guide for libstdc++ Doxygen - - - - - -

libstdc++ Source Documentation

- -

This file is docs/doxygen/guide.html in the libstdc++ source tree. It - is not included in the generated pages (no real point to doing that). -

- - - -
- -

Creating the pages

-

The Makefile rules 'make doxygen', - 'make doxygen-maint', and 'make doxygen-man' - in the libstdc++ build directory generate the user-level HTML docs, the - maintainer-level HTML docs, and the man pages, respectively. Prerequisite - tools are Bash 2.x, - - - Doxygen - , a working version of g++ somewhere in the PATH, and - the GNU coreutils. - - In addition, to generate the pretty pictures, the - Graphviz - package will need to be installed. - (g++ is used to build a program which manipulates man pages. GNU versions - of find, xargs, and possibly sed and grep are used, just because the GNU - versions make things very easy.) -

- -

Careful observers will see that the Makefile rules simply call a script - from the source tree, run_doxygen, which does the actual work - of running Doxygen and then (most importantly) massaging the output files. - If for some reason you prefer to not go through the Makefile, you can call - this script directly. (Start by passing '--help'.) -

- -

If you wish to tweak the Doxygen settings, do so by editing - docs/doxygen/user.cfg.in. Notes to v3-hackers are written in - triple-# comments. -

- -

Writing the markup

-

In general, libstdc++ files should be formatted according to the GNU - C++ Coding Standard rules found in the file - C++STYLE. - Before any doxygen-specific formatting tweaks are made, please try to make - sure that the initial formatting is sound. -

- -

Adding Doxygen markup to a file (informally called "doxygenating") is very - simple. The Doxygen manual can be found - here. - We try to use a very-recent version of Doxygen. -

- -

Doxygen style guide

-

[incomplete and constantly evolving]

- -

For classes, use deque/vector/list and std::pair as examples. For - functions, see their member functions, and the free functions in - stl_algobase.h. Member functions of other container-like - types should read similarly to these member functions. -

- -

These points accompany the first list in section 3.1 of the Doxygen manual: -

-
    -
  1. Use the Javadoc style...
  2. -
  3. ...not the Qt style. The intermediate *'s are preferred.
  4. -
  5. Use the triple-slash style only for one-line comments (the "brief" mode). - Very recent versions of Doxygen permit full-mode comments in triple-slash - blocks, but the formatting still comes out wonky.
  6. -
  7. This is disgusting. Don't do this.
  8. -
- -

Use the @-style of commands, not the !-style. Please be careful about - whitespace in your markup comments. Most of the time it doesn't matter; - doxygen absorbs most whitespace, and both HTML and *roff are agnostic about - whitespace. However, in <pre> blocks and @code/@endcode sections, - spacing can have "interesting" effects. -

- -

Use either kind of grouping, as appropriate. doxygroups.cc - exists for this purpose. See stl_iterator.h for a good - example of the "other" kind of grouping. -

- -

Please use markup tags like @p and @a when referring to things such as the - names of function parameters. Use @e for emphasis when necessary. Use @c - to refer to other standard names. (Examples of all these abound in the - present code.) -

- - - diff --git a/libstdc++-v3/docs/doxygen/mainpage.html b/libstdc++-v3/docs/doxygen/mainpage.html deleted file mode 100644 index 2f57764fae8..00000000000 --- a/libstdc++-v3/docs/doxygen/mainpage.html +++ /dev/null @@ -1,101 +0,0 @@ - - - -libstdc++ Source: Main Index - - - - - - -

libstdc++ Source Documentation

- -

Documentation Overview

- -

@LEVEL@-level docs, generated @DATE@.

- -

There are two types of documentation for libstdc++. One is the - distribution documentation, which can be read online at - http://gcc.gnu.org/onlinedocs/libstdc++/documentation.html - or offline from docs/html/documentation.html in the library source - directory. -

- -

The other type is the source documentation, of which this is the first page. - Both "user-level" and "maintainer-level" source - documentation is produced: user-level docs are for the users of this - library. The maint-level docs are for those interested in the underlying - workings of the library; they include all the user-level docs plus - additional notes and additional classes/functions/etc. -

- -

Here are entry points to all the pages generated by Doxygen: -

-

- -

If you are using Doxygen for your own projects, you can use - a tag file for the appropriate version and - an entry such as -

- TAGFILES = "libstdc++.tag = - http://gcc.gnu.org/onlinedocs/libstdc++/latest-doxygen" -
- Be sure to adjust the URL for the right version. If you download a - local copy of the source documentation for faster viewing, you can use - the doxytag/installdox programs (part of Doxygen) to adjust the links - for you. -

- -

Generating the documentation

-

These HTML pages are automatically generated, along with the man pages. - See docs/doxygen/guide.html in the source tree for how to - create (and write) the pages. - -

License, Copyright, and Other Lawyerly Verbosity

-

The libstdc++ documentation is released under - - these terms. -

-

Part of the generated documentation involved comments and notes from - SGI, who says we gotta say this: -

- Permission to use, copy, modify, distribute and sell this software and its - documentation for any purpose is hereby granted without fee, provided - that the below copyright notice appears in all copies and that both - the copyright notice and this permission notice appear in supporting - documentation. Silicon Graphics makes no representations about the - suitability of this software for any purpose. It is provided "as is" - without express or implied warranty. -

- Copyright © 1994 - Hewlett-Packard Company -
-

-

Part of the generated documentation is quoted from the ISO C++ Standard, - which is Copyright © 1998 by Information Technology Industry Council. -

- - - diff --git a/libstdc++-v3/docs/doxygen/run_doxygen b/libstdc++-v3/docs/doxygen/run_doxygen deleted file mode 100644 index 2aca793e14a..00000000000 --- a/libstdc++-v3/docs/doxygen/run_doxygen +++ /dev/null @@ -1,328 +0,0 @@ -#!/bin/bash - -# Runs doxygen and massages the output files. -# Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc. -# -# Synopsis: run_doxygen --mode=[user|maint|man] --host_alias= \ -# v3srcdir v3builddir -# -# Originally hacked together by Phil Edwards - - -# We can check now that the version of doxygen is >= this variable. -DOXYVER=1.3.9 - -find_doxygen() { - local -r v_required=`echo $DOXYVER | \ - awk -F. '{if(NF<3)$3=0;print ($1*100+$2)*100+$3}'` - local testing_version doxygen maybedoxy v_found - # thank you goat book - set `IFS=:; X="$PATH:/usr/local/bin:/bin:/usr/bin"; echo $X` - for dir - do - # AC_EXEEXT could come in useful here - maybedoxy="$dir/doxygen" - test -f "$maybedoxy" && testing_version=`$maybedoxy --version` - if test -n "$testing_version"; then - v_found=`echo $testing_version | \ - awk -F. '{if(NF<3)$3=0;print ($1*100+$2)*100+$3}'` - if test $v_found -ge $v_required; then - doxygen="$maybedoxy" - break - fi - fi - done - if test -z "$doxygen"; then - echo run_doxygen error: Could not find Doxygen $DOXYVER in path. 1>&2 - print_usage - fi - # We need to use other tools from the same package/version. - echo :: Using Doxygen tools from ${dir}. - PATH=$dir:$PATH - hash -r -} - -print_usage() { - cat 1>&2 <] - - MODE is one of: - user Generate user-level HTML library documentation. - maint Generate maintainers' HTML documentation (lots more; - exposes non-public members, etc). - man Generate user-level man pages. - - BUILD_ALIAS is the GCC build alias set at configure time. - - more options when i think of them - -Note: Requires Doxygen ${DOXYVER} or later; get it at - ftp://ftp.stack.nl/pub/users/dimitri/doxygen-${DOXYVER}.src.tar.gz - -EOF - exit 1 -} - -parse_options() { - for o - do - # Blatantly ripped from autoconf, er, I mean, "gratefully standing - # on the shoulders of those giants who have gone before us." - case "$o" in - -*=*) arg=`echo "$o" | sed 's/[-_a-zA-Z0-9]*=//'` ;; - *) arg= ;; - esac - - case "$o" in - --mode=*) - mode=$arg ;; - --host_alias=*) - host_alias=$arg ;; - --mode | --host_alias | --help | -h) - print_usage ;; - *) - # this turned out to be a mess, maybe change to --srcdir=, etc - if test $srcdir = unset; then - srcdir=$o - elif test $outdir = unset; then - builddir=${o} - outdir=${o}/docs/doxygen - else - echo run_doxygen error: Too many arguments 1>&2 - exit 1 - fi - ;; - esac - done -} - - -# script begins here -mode=unset -host_alias=unset -srcdir=unset -outdir=unset -do_html=false -do_man=false -enabled_sections= -generate_tagfile= -DATEtext=`date '+%Y-%m-%d'` - -# Show how this script is called. -echo run_doxygen $* - -parse_options $* -find_doxygen - -if test $srcdir = unset || test $outdir = unset || test $mode = unset || test $host_alias = unset; then - # this could be better - echo run_doxygen error: You have not given enough information...! 1>&2 - print_usage -fi - -case x"$mode" in - xuser) - do_html=true - LEVELtext='User' - generate_tagfile="$outdir/html_$mode/libstdc++.tag" - ;; - xmaint) - do_html=true - enabled_sections=maint - LEVELtext='Maintainer' - generate_tagfile="$outdir/html_$mode/libstdc++.tag" - ;; - xman) - do_man=true - ;; - *) - echo run_doxygen error: $mode is an invalid mode 1>&2 - exit 1 ;; -esac - -#rm -rf $outdir -mkdir -p $outdir -chmod u+w $outdir - -# work around a stupid doxygen bug -if $do_man; then - mkdir -p $outdir/man/man3/ext - chmod -R u+w $outdir/man/man3/ext -fi - -( - set -e - cd $builddir - sed -e "s=@outdir@=${outdir}=g" \ - -e "s=@srcdir@=${srcdir}=g" \ - -e "s=@builddir@=${builddir}=g" \ - -e "s=@host_alias@=${host_alias}=g" \ - -e "s=@html_output_dir@=html_${mode}=" \ - -e "s=@enabled_sections@=${enabled_sections}=" \ - -e "s=@do_html@=${do_html}=" \ - -e "s=@do_man@=${do_man}=" \ - -e "s=@generate_tagfile@=${generate_tagfile}=" \ - ${srcdir}/docs/doxygen/user.cfg.in > ${outdir}/${mode}.cfg - echo :: NOTE that this may take some time... - echo doxygen ${outdir}/${mode}.cfg - doxygen ${outdir}/${mode}.cfg - echo :: Finished, exit code was $? -) -ret=$? -test $ret -ne 0 && exit $ret - -if $do_html; then - cd ${outdir}/html_${mode} - - #doxytag -t libstdc++.tag . > /dev/null 2>&1 - sed -e '//d' libstdc++.tag > TEMP - mv TEMP libstdc++.tag - - sed -e "s=@LEVEL@=${LEVELtext}=" \ - -e "s=@DATE@=${DATEtext}=" \ - ${srcdir}/docs/doxygen/mainpage.html > index.html - - # The following bit of line noise changes annoying - # std::foo < typename _Ugly1, typename _Ugly2, .... _DefaultUgly17 > - # to user-friendly - # std::foo - # in the major "Compound List" page. - sed -e 's=\(::[[:alnum:]_]*\)< .* >=\1=' annotated.html > annstrip.html - mv annstrip.html annotated.html - - # Work around a bug in doxygen 1.3. - for f in class*html struct*html; do - sed '1,10s!^ Template!<title>Template !' $f > TEMP - mv TEMP $f - done - - cp ${srcdir}/docs/doxygen/tables.html tables.html - echo :: - echo :: HTML pages begin with - echo :: ${outdir}/html_${mode}/index.html -fi - -# Mess with the man pages. We don't need documentation of the internal -# headers, since the man pages for those contain nothing useful anyhow. The -# man pages for doxygen modules need to be renamed (or deleted). And the -# generated #include lines need to be changed from the internal names to the -# standard ones (e.g., "#include <stl_tempbuf.h>" -> "#include <memory>"). -if $do_man; then -echo :: -echo :: Fixing up the man pages... -cd $outdir/man/man3 - -# here's the other end of the "stupid doxygen bug" mentioned above -rm -rf ext - -# File names with embedded spaces (EVIL!) need to be....? renamed or removed? -find . -name "* *" -print0 | xargs -0r rm # requires GNU tools - -# can leave SGIextensions.3 alone, it's an okay name -mv s20_3_1_base.3 Intro_functors.3 -mv s20_3_2_arithmetic.3 Arithmetic_functors.3 -mv s20_3_3_comparisons.3 Comparison_functors.3 -mv s20_3_4_logical.3 Logical_functors.3 -mv s20_3_5_negators.3 Negation_functors.3 -mv s20_3_6_binder.3 Binder_functors.3 -mv s20_3_7_adaptors.3 Func_ptr_functors.3 -mv s20_3_8_memadaptors.3 Member_ptr_functors.3 -mv iterator_tags.3 Iterator_types.3 -mv std.3 Namespace_std.3 -mv __gnu_cxx.3 Namespace___gnu_cxx.3 - -# man pages are for functions/types/other entities, not source files -# directly. who the heck would type "man foo.h" anyhow? -find . -name "[a-z]*" -a ! -name "std_*" -print | xargs rm -rm -f *.h.3 *config* *.cc.3 *.tcc.3 *_t.3 -# this is used to examine what we would have deleted, for debugging -#mkdir trash -#find . -name "[a-z]*" -a ! -name "std_*" -print | xargs -i mv {} trash -#mv *.h.3 *config* *.cc.3 *.tcc.3 *_t.3 trash - -# Standardize the displayed header names. If anyone who knows perl cares -# enough to rewrite all this, feel free. This only gets run once a century, -# and I'm off getting coffee then anyhow, so I didn't care enough to make -# this super-fast. -g++ ${srcdir}/docs/doxygen/stdheader.cc -o ./stdheader -problematic=`egrep -l '#include <.*_.*>' [a-z]*.3` -for f in $problematic; do - # this is also slow, but safe and easy to debug - oldh=`sed -n '/fC#include </s/.*<\(.*\)>.*/\1/p' $f` - newh=`echo $oldh | ./stdheader` - sed "s=${oldh}=${newh}=" $f > TEMP - mv TEMP $f -done -rm stdheader - -# Some of the pages for generated modules have text that confuses certain -# implementations of man(1), e.g., Linux's. We need to have another top-level -# *roff tag to /stop/ the .SH NAME entry. -#problematic=`egrep --files-without-match '^\.SH SYNOPSIS' [A-Z]*.3` -problematic='Containers.3 Sequences.3 Assoc_containers.3 Iterator_types.3' -for f in $problematic; do - sed '/^\.SH NAME/{ -n -a\ -\ -.SH SYNOPSIS - }' $f > TEMP - mv TEMP $f -done - -# Also, break this (generated) line up. It's ugly as sin. -problematic=`grep -l '[^^]Definition at line' *.3` -for f in $problematic; do - sed 's/Definition at line/\ -.PP\ -&/' $f > TEMP - mv TEMP $f -done - -cp ${srcdir}/docs/doxygen/Intro.3 C++Intro.3 - -# Why didn't I do this at the start? Were rabid weasels eating my brain? -# Who the fsck would "man std_vector" when the class isn't named that? -for f in std_tr1_*; do - newname=`echo $f | sed 's/^std_tr1_/std::tr1::/'` - mv $f $newname -done -for f in std_*; do - newname=`echo $f | sed 's/^std_/std::/'` - mv $f $newname -done -for f in __gnu_cxx_*; do - newname=`echo $f | sed 's/^__gnu_cxx_/__gnu_cxx::/'` - mv $f $newname -done - -# Generic reoval bits, where there are things in the generated man -# pages that need to be killed. -for f in *_libstdc__-v3_*; do - rm $f -done - -for f in *_src_*; do - rm $f -done - - -# Also, for some reason, typedefs don't get their own man pages. Sigh. -for f in ios streambuf istream ostream iostream stringbuf \ - istringstream ostringstream stringstream filebuf ifstream \ - ofstream fstream string; -do - echo ".so man3/std::basic_${f}.3" > std::${f}.3 - echo ".so man3/std::basic_${f}.3" > std::w${f}.3 -done - -echo :: -echo :: Man pages in ${outdir}/man -fi - -# all done -echo :: - -exit 0 - -# vim:ts=4:et: diff --git a/libstdc++-v3/docs/doxygen/stdheader.cc b/libstdc++-v3/docs/doxygen/stdheader.cc deleted file mode 100644 index a5145419b04..00000000000 --- a/libstdc++-v3/docs/doxygen/stdheader.cc +++ /dev/null @@ -1,170 +0,0 @@ -// This is a slow larval-stage kludge to help massage the generated man -// pages. It's used like this: -const char* const usage = -"\nTakes on stdin, whitespace-separated words of the form\n" -"\n" -" [bits/]stl_foo.h\n" -" [bits/]std_foo.h\n" -"\n" -"and writes on stdout the nearest matching standard header name.\n" -"\n" -"Takes no command-line arguments.\n" -"\n"; - -#include <string> -#include <map> -#include <iostream> - -typedef std::map<std::string, std::string> Map; - -Map headers; - -void init_map() -{ - // Enter the glamourous world of data entry!! Maintain these! - headers["algo.h"] = "algorithm"; - headers["algobase.h"] = "algorithm"; - headers["algorithm.h"] = "algorithm"; - headers["heap.h"] = "algorithm"; - headers["bitset.h"] = "bitset"; - headers["complex.h"] = "complex"; - //headers["construct.h"] stl_construct.h entirely internal - headers["deque.h"] = "deque"; - headers["deque.tcc"] = "deque"; - headers["fstream.h"] = "fstream"; - headers["fstream.tcc"] = "fstream"; - headers["function.h"] = "functional"; - headers["functional.h"] = "functional"; - headers["iomanip.h"] = "iomanip"; - headers["basic_ios.h"] = "ios"; - headers["basic_ios.tcc"] = "ios"; - headers["ios.h"] = "ios"; - headers["iosfwd.h"] = "iosfwd"; - headers["iostream.h"] = "iostream"; - headers["istream.h"] = "istream"; - headers["istream.tcc"] = "istream"; - headers["iterator.h"] = "iterator"; - headers["iterator_base_funcs.h"] = "iterator"; - headers["iterator_base_types.h"] = "iterator"; - headers["stream_iterator.h"] = "iterator"; - headers["streambuf_iterator.h"] = "iterator"; - headers["limits.h"] = "limits"; - headers["list.h"] = "list"; - headers["list.tcc"] = "list"; - headers["codecvt.h"] = "locale"; - headers["locale.h"] = "locale"; - headers["localefwd.h"] = "locale"; - headers["locale_classes.h"] = "locale"; - headers["locale_facets.h"] = "locale"; - headers["locale_facets.tcc"] = "locale"; - headers["map.h"] = "map"; - headers["multimap.h"] = "map"; - headers["memory.h"] = "memory"; - headers["allocator.h"] = "memory"; - headers["raw_storage_iter.h"] = "memory"; - headers["tempbuf.h"] = "memory"; - headers["uninitialized.h"] = "memory"; - headers["numeric.h"] = "numeric"; - headers["ostream.h"] = "ostream"; - headers["ostream.tcc"] = "ostream"; - headers["queue.h"] = "queue"; - headers["set.h"] = "set"; - headers["multiset.h"] = "set"; - headers["sstream.h"] = "sstream"; - headers["sstream.tcc"] = "sstream"; - headers["stack.h"] = "stack"; - headers["functexcept.h"] = "stdexcept"; - headers["stdexcept.h"] = "stdexcept"; - headers["streambuf.h"] = "streambuf"; - headers["streambuf.tcc"] = "streambuf"; - headers["string.h"] = "string"; - headers["char_traits.h"] = "string"; - headers["postypes.h"] = "string"; - headers["basic_string.h"] = "string"; - headers["basic_string.tcc"] = "string"; - headers["tree.h"] = "backward/tree.h"; - headers["pair.h"] = "utility"; - headers["utility.h"] = "utility"; - headers["relops.h"] = "utility"; - headers["gslice.h"] = "valarray"; - headers["gslice_array.h"] = "valarray"; - headers["indirect_array.h"] = "valarray"; - headers["mask_array.h"] = "valarray"; - headers["slice_array.h"] = "valarray"; - headers["valarray.h"] = "valarray"; - headers["valarray_after.h"] = "valarray"; - headers["valarray_before.h"] = "valarray"; - headers["valarray_array.h"] = "valarray"; - headers["valarray_array.tcc"] = "valarray"; - headers["valarray_meta.h"] = "valarray"; - headers["bvector.h"] = "vector"; - headers["vector.h"] = "vector"; - headers["vector.tcc"] = "vector"; - - //headers["concurrence.h"] who knows - //headers["atomicity.h"] who knows - - // C wrappers -- probably was an easier way to do these, but oh well - headers["cassert.h"] = "cassert"; - headers["cctype.h"] = "cctype"; - headers["cerrno.h"] = "cerrno"; - headers["cfloat.h"] = "cfloat"; - headers["climits.h"] = "climits"; - headers["clocale.h"] = "clocale"; - headers["cmath.h"] = "cmath"; - headers["csetjmp.h"] = "csetjmp"; - headers["csignal.h"] = "csignal"; - headers["cstdarg.h"] = "cstdarg"; - headers["cstddef.h"] = "cstddef"; - headers["cstdio.h"] = "cstdio"; - headers["cstdlib.h"] = "cstdlib"; - headers["cstring.h"] = "cstring"; - headers["ctime.h"] = "ctime"; - headers["cwchar.h"] = "cwchar"; - headers["cwctype.h"] = "cwctype"; -} - - -void do_word (std::string const& longheader) -{ - std::string::size_type start = 0; - - // if it doesn't contain a "." then it's already a std header - if (longheader.find(".") == std::string::npos) - { - std::cout << longheader << '\n'; - return; - } - - if (longheader.substr(start,5) == "bits/") start += 5; - if ((longheader.substr(start,4) == "stl_") || - (longheader.substr(start,4) == "std_")) - { - start += 4; - } - - // come on, gdb, find `p' already... - const char* p = longheader.substr(start).c_str(); - Map::iterator word = headers.find(p); - if (word != headers.end()) - std::cout << word->second << '\n'; - else std::cout << "MAYBE_AN_ERROR_MESSAGE_HERE\n"; -} - - -int main (int argc, char**) -{ - if (argc > 1) - { - std::cerr << usage; - exit(0); - } - - init_map(); - - std::string w; - while (std::cin >> w) - do_word (w); -} - - diff --git a/libstdc++-v3/docs/doxygen/style.css b/libstdc++-v3/docs/doxygen/style.css deleted file mode 100644 index c49c37cdfd9..00000000000 --- a/libstdc++-v3/docs/doxygen/style.css +++ /dev/null @@ -1,74 +0,0 @@ -BODY { - background: white; - font-size: small; -} -H1 { text-align: center; font-size: large } -H2 { text-align: left; font-size: medium; } -H3 { text-align: left; font-size: small; } -CODE { font-size: small; } -CAPTION { font-weight: normal } -A.qindex {} -A.qindexRef {} -A.el { text-decoration: none; font-size: small; font-weight: normal } -A.elRef { text-decoration: none; font-size: small; font-weight: normal } -A.code { text-decoration: none; font-weight: normal; color: #4444ee } -A.codeRef { font-weight: normal; color: #4444ee } -A:hover { text-decoration: none; background-color: #f2f2ff } -DL.el { margin-left: -1cm } -DIV.fragment { width: 100%; border: none; background-color: #eeeeee } -DIV.ah { - background-color: black; - font-weight: normal; - color: #ffffff; - margin-bottom: 3px; - margin-top: 3px -} -DIV.groupHeader { - margin-left: 16px; - margin-top: 12px; - margin-bottom: 6px; - font-weight: normal -} -DIV.groupText { margin-left: 16px; font-style: italic; font-size: small } -TD.md { background-color: #f2f2ff; font-size: small; } -TD.mdname1 { background-color: #f2f2ff; font-size: small; color: #602020; } -TD.mdname { - background-color: #f2f2ff; - font-weight: normal; - font-size: small; - color: #602020; - width: 600px -} -TD.indexkey { - background-color: #eeeeff; - font-weight: normal; - font-size: small; - padding-right : 10px; - padding-top : 2px; - padding-left : 10px; - padding-bottom : 2px; - margin-left : 0px; - margin-right : 0px; - margin-top : 2px; - margin-bottom : 2px -} -TD.indexvalue { - background-color: #eeeeff; - font-style: italic; - font-size: small; - padding-right : 10px; - padding-top : 2px; - padding-left : 10px; - padding-bottom : 2px; - margin-left : 0px; - margin-right : 0px; - margin-top : 2px; - margin-bottom : 2px -} -span.keyword { color: #008000 } -span.keywordtype { color: #604020 } -span.keywordflow { color: #e08000 } -span.comment { color: #800000 } -span.preprocessor { color: #806020 } -span.stringliteral { color: #002080 } -span.charliteral { color: #008080 } diff --git a/libstdc++-v3/docs/doxygen/tables.html b/libstdc++-v3/docs/doxygen/tables.html deleted file mode 100644 index 74ac3e2165d..00000000000 --- a/libstdc++-v3/docs/doxygen/tables.html +++ /dev/null @@ -1,645 +0,0 @@ -<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> -<html> -<head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1"> -<title>Tables - - - - - -

Tables

- -

Most of the requirements on containers are presented in the ISO standard - in the form of tables. In order to avoid massive duplication of effort - while documenting all the classes, we follow the standard's lead and - present the base information here. Individual classes will only document - their departures from these tables (removed functions, additional functions, - changes, etc). -

- -

We will not try to duplicate all of the surrounding text (footnotes, - explanations, etc.) from the standard, because that would also entail a - duplication of effort. Some of the surrounding text has been paraphrased - here for clarity. If you are uncertain about the meaning or interpretation - of these notes, consult a good textbook, and/or purchase your own copy of - the standard (it's cheap, see our FAQ). -

- -

The table numbers are the same as those used in the standard. Tables can - be jumped to using their number, e.g., "tables.html#67". Only - Tables 65 through 69 are presented. Some of the active Defect Reports - are also noted or incorporated. -

- -
- -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Table 65 --- Container Requirements

-Anything calling itself a container must meet these minimum requirements. -
expressionresult typeoperational semanticsnotes, pre-/post-conditions, assertionscomplexity
X::value_typeT T is Assignablecompile time
X::referencelvalue of T  compile time
X::const_referenceconst lvalue of T  compile time
X::iteratoriterator type pointing to T Any iterator category except output iterator. - Convertible to X::const_iterator.compile time
X::const_iteratoriterator type pointing to const T Any iterator category except output iterator.compile time
X::difference_typesigned integral type identical to the difference type of X::iterator and X::const_iteratorcompile time
X::size_typeunsigned integral type size_type can represent any non-negative value of difference_typecompile time
X u;  post: u.size() == 0constant
X();  X().size == 0constant
X(a);  a == X(a)linear
X u(a);
X u = a;
  post: u == a. Equivalent to: X u; u = a;linear
(&a)->~X();void dtor is applied to every element of a; all the memory is deallocatedlinear
a.begin()iterator; const_iterator for constant a  constant
a.end()iterator; const_iterator for constant a  constant
a == bconvertible to bool == is an equivalence relation. a.size()==b.size() && - equal(a.begin(),a.end(),b.begin())linear
a != bconvertible to bool equivalent to !(a==b)linear
a.swap(b)void swap(a,b)may or may not have constant complexity
r = aX& r == alinear
a.size()size_typea.end() - a.begin() may or may not have constant complexity
a.max_size()size_typesize() of the largest possible container may or may not have constant complexity
a.empty()convertible to boola.size() == 0 constant
a < bconvertible to boollexographical_compare( a.begin, a.end(), b.begin(), b.end())pre: < is defined for T and is a total ordering relationlinear
a > bconvertible to boolb < a linear
a <= bconvertible to bool!(a > b) linear
a >= bconvertible to bool!(a < b) linear

- - -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Table 66 --- Reversible Container Requirements

-If a container's iterator is bidirectional or random-access, then the -container also meets these requirements. -Deque, list, vector, map, multimap, set, and multiset are such containers. -
expressionresult typenotes, pre-/post-conditions, assertionscomplexity
X::reverse_iteratoriterator type pointing to Treverse_iterator<iterator>compile time
X::const_reverse_iteratoriterator type pointing to const Treverse_iterator<const_iterator>compile time
a.rbegin()reverse_iterator; const_reverse_iterator for constant areverse_iterator(end())constant
a.rend()reverse_iterator; const_reverse_iterator for constant areverse_iterator(begin())constant

- - -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Table 67 --- Sequence Requirements

-These are in addition to the requirements of containers. -Deque, list, and vector are such containers. -
expressionresult typenotes, pre-/post-conditions, assertions
X(n,t)
X a(n,t)
 constructs a sequence with n copies of t
post: size() == n
X(i,j)
X a(i,j)
 constructs a sequence equal to the range [i,j)
- post: size() == distance(i,j)
a.insert(p,t)iterator (points to the inserted copy of t)inserts a copy of t before p
a.insert(p,n,t)voidinserts n copies of t before p
a.insert(p,i,j)voidinserts copies of elements in [i,j) before p
- pre: i, j are not iterators into a
a.erase(q)iterator (points to the element following q (prior to erasure))erases the element pointed to by q
a.erase(q1,q1)iterator (points to the element pointed to by q2 (prior to erasure))erases the elements in the range [q1,q2)
a.clear()voiderase(begin(),end())
post: size() == 0

- - -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Table 68 --- Optional Sequence Operations

-These operations are only included in containers when the operation can be -done in constant time. -
expressionresult typeoperational semanticscontainer
a.front()reference; const_reference for constant a*a.begin()vector, list, deque
a.back()reference; const_reference for constant a*--a.end()vector, list, deque
a.push_front(x)voida.insert(a.begin(),x)list, deque
a.push_back(x)voida.insert(a.end(),x)vector, list, deque
a.pop_front()voida.erase(a.begin())list, deque
a.pop_back()voida.erase(--a.end())vector, list, deque
a[n]reference; const_reference for constant a*(a.begin() + n)vector, deque
a.at(n)reference; const_reference for constant a*(a.begin() + n)
throws out_of_range if n>=a.size()
vector, deque

- - -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Table 69 --- Associative Container Requirements

-These are in addition to the requirements of containers. -Map, multimap, set, and multiset are such containers. An associative -container supports unique keys (and is written as -a_uniq instead of a) if it may contain at most -one element for each key. Otherwise it supports equivalent keys -(and is written a_eq). Examples of the former are set and map, -examples of the latter are multiset and multimap. -
expressionresult typenotes, pre-/post-conditions, assertionscomplexity
X::key_typeKeyKey is Assignablecompile time
X::key_compareComparedefaults to less<key_type>compile time
X::value_comparea binary predicate typesame as key_compare for set and multiset; an ordering relation on - pairs induced by the first component (Key) for map and multimapcompile time
X(c)
X a(c)
 constructs an empty container which uses c as a comparison objectconstant
X()
X a
 constructs an empty container using Compare() as a comparison objectconstant
X(i,j,c)
X a(i,j,c)
 constructs an empty container and inserts elements from the range [i,j) - into it; uses c as a comparison objectNlogN in general where N is distance(i,j); linear if [i,j) is - sorted with value_comp()
X(i,j)
X a(i,j)
 same as previous, but uses Compare() as a comparison objectsame as previous
a.key_comp()X::key_comparereturns the comparison object out of which a was constructedconstant
a.value_comp()X::value_comparereturns an object constructed out of the comparison objectconstant
a_uniq.insert(t)pair<iterator,bool>"Inserts t if and only if there is no element in the container with - key equivalent to the key of t. The bool component of the returned pair - is true -iff- the insertion took place, and the iterator component of - the pair points to the element with key equivalent to the key of - t." logarithmic
a_eq.insert(t)iteratorinserts t, returns the iterator pointing to the inserted elementlogarithmic
a.insert(p,t)iteratorpossibly inserts t (depending on whether a_uniq or a_eq); returns iterator - pointing to the element with key equivalent to the key of t; iterator p - is a hint pointing to where the insert should start to searchlogarithmic in general, amortized constant if t is inserted right - after p
- [but see DR 233 and our - specific notes]
a.insert(i,j)voidpre: i, j are not iterators into a. possibly inserts each element from - the range [i,j) (depending on whether a_uniq or a_eq)Nlog(size()+N) where N is distance(i,j) in general
a.erase(k)size_typeerases all elements with key equivalent to k; returns number of erased - elementslog(size()) + count(k)
a.erase(q)voiderases the element pointed to by qamortized constant
a.erase(q1,q2)voiderases all the elements in the range [q1,q2)log(size()) + distance(q1,q2)
a.clear()voiderases everything; post: size() == 0linear
a.find(k)iterator; const_iterator for constant areturns iterator pointing to element with key equivalent to k, or - a.end() if no such element foundlogarithmic
a.count(k)size_typereturns number of elements with key equivalent to klog(size()) + count(k)
a.lower_bound(k)iterator; const_iterator for constant areturns iterator pointing to the first element with key not less than klogarithmic
a.upper_bound(k)iterator; const_iterator for constant areturns iterator pointing to the first element with key greater than klogarithmic
a.equal_range(k)pair<iterator,iterator>; - pair<const_iterator, const_iterator> for constant aequivalent to make_pair(a.lower_bound(k), a.upper_bound(k))logarithmic

- - -
-

-See mainpage.html for copying conditions. -See the libstdc++ homepage -for more information. -

- - - - - diff --git a/libstdc++-v3/docs/doxygen/user.cfg.in b/libstdc++-v3/docs/doxygen/user.cfg.in deleted file mode 100644 index 20a041e0f99..00000000000 --- a/libstdc++-v3/docs/doxygen/user.cfg.in +++ /dev/null @@ -1,1436 +0,0 @@ -# Doxyfile 1.5.1 - -# This file describes the settings to be used by the documentation system -# doxygen (www.doxygen.org) for a project -# -# All text after a hash (#) is considered a comment and will be ignored -# The format is: -# TAG = value [value, ...] -# For lists items can also be appended using: -# TAG += value [value, ...] -# Values that contain spaces should be placed between quotes (" ") - -#--------------------------------------------------------------------------- -# Project related configuration options -#--------------------------------------------------------------------------- - -# The PROJECT_NAME tag is a single word (or a sequence of words surrounded -# by quotes) that should identify the project. - -PROJECT_NAME = libstdc++ - -# The PROJECT_NUMBER tag can be used to enter a project or revision number. -# This could be handy for archiving the generated documentation or -# if some version control system is used. - -PROJECT_NUMBER = - -# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) -# base path where the generated documentation will be put. -# If a relative path is entered, it will be relative to the location -# where doxygen was started. If left blank the current directory will be used. - -OUTPUT_DIRECTORY = @outdir@ - -# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create -# 4096 sub-directories (in 2 levels) under the output directory of each output -# format and will distribute the generated files over these directories. -# Enabling this option can be useful when feeding doxygen a huge amount of -# source files, where putting all generated files in the same directory would -# otherwise cause performance problems for the file system. - -CREATE_SUBDIRS = NO - -# The OUTPUT_LANGUAGE tag is used to specify the language in which all -# documentation generated by doxygen is written. Doxygen will use this -# information to generate all constant output in the proper language. -# The default language is English, other supported languages are: -# Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional, -# Croatian, Czech, Danish, Dutch, Finnish, French, German, Greek, Hungarian, -# Italian, Japanese, Japanese-en (Japanese with English messages), Korean, -# Korean-en, Lithuanian, Norwegian, Polish, Portuguese, Romanian, Russian, -# Serbian, Slovak, Slovene, Spanish, Swedish, and Ukrainian. - -OUTPUT_LANGUAGE = English - -# This tag can be used to specify the encoding used in the generated -# output. The encoding is not always determined by the language that -# is chosen, but also whether or not the output is meant for Windows -# or non-Windows users. In case there is a difference, setting the -# USE_WINDOWS_ENCODING tag to YES forces the Windows encoding (this is -# the default for the Windows binary), whereas setting the tag to NO -# uses a Unix-style encoding (the default for all platforms other than -# Windows). - -USE_WINDOWS_ENCODING = NO - -# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will -# include brief member descriptions after the members that are listed in -# the file and class documentation (similar to JavaDoc). -# Set to NO to disable this. - -BRIEF_MEMBER_DESC = NO - -# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will -# prepend the brief description of a member or function before the -# detailed description. Note: if both HIDE_UNDOC_MEMBERS and -# BRIEF_MEMBER_DESC are set to NO, the brief descriptions will be -# completely suppressed. - -REPEAT_BRIEF = NO - -# This tag implements a quasi-intelligent brief description abbreviator -# that is used to form the text in various listings. Each string -# in this list, if found as the leading text of the brief description, will be -# stripped from the text and the result after processing the whole list, is -# used as the annotated text. Otherwise, the brief description is used as-is. -# If left blank, the following values are used ("$name" is automatically -# replaced with the name of the entity): "The $name class" "The $name widget" -# "The $name file" "is" "provides" "specifies" "contains" -# "represents" "a" "an" "the" - -ABBREVIATE_BRIEF = - -# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then -# Doxygen will generate a detailed section even if there is only a brief -# description. - -ALWAYS_DETAILED_SEC = YES - -# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show -# all inherited members of a class in the documentation of that class -# as if those members were ordinary class members. Constructors, -# destructors and assignment operators of the base classes will not be -# shown. - -INLINE_INHERITED_MEMB = YES - -# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full -# path before files name in the file list and in the header files. If set -# to NO the shortest path that makes the file name unique will be used. - -FULL_PATH_NAMES = NO - -# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag -# can be used to strip a user-defined part of the path. Stripping is -# only done if one of the specified strings matches the left-hand part of -# the path. The tag can be used to show relative paths in the file list. -# If left blank the directory from which doxygen is run is used as the -# path to strip. - -STRIP_FROM_PATH = - -# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of -# the path mentioned in the documentation of a class, which tells -# the reader which header file to include in order to use a class. -# If left blank only the name of the header file containing the class -# definition is used. Otherwise one should specify the include paths that -# are normally passed to the compiler using the -I flag. - -STRIP_FROM_INC_PATH = - -# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter -# (but less readable) file names. This can be useful is your file systems -# doesn't support long names like on DOS, Mac, or CD-ROM. - -SHORT_NAMES = NO - -# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen -# will interpret the first line (until the first dot) of a JavaDoc-style -# comment as the brief description. If set to NO, the JavaDoc -# comments will behave just like the Qt-style comments (thus requiring an -# explicit @brief command for a brief description. - -JAVADOC_AUTOBRIEF = NO - -# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen -# treat a multi-line C++ special comment block (i.e. a block of //! or /// -# comments) as a brief description. This used to be the default behaviour. -# The new default is to treat a multi-line C++ comment block as a detailed -# description. Set this tag to YES if you prefer the old behaviour instead. - -MULTILINE_CPP_IS_BRIEF = YES - -# If the DETAILS_AT_TOP tag is set to YES then Doxygen -# will output the detailed description near the top, like JavaDoc. -# If set to NO, the detailed description appears after the member -# documentation. - -DETAILS_AT_TOP = YES - -# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented -# member inherits the documentation from any documented member that it -# re-implements. - -INHERIT_DOCS = YES - -# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce -# a new page for each member. If set to NO, the documentation of a member will -# be part of the file/class/namespace that contains it. - -SEPARATE_MEMBER_PAGES = NO - -# The TAB_SIZE tag can be used to set the number of spaces in a tab. -# Doxygen uses this value to replace tabs by spaces in code fragments. - -TAB_SIZE = 4 - -# This tag can be used to specify a number of aliases that acts -# as commands in the documentation. An alias has the form "name=value". -# For example adding "sideeffect=\par Side Effects:\n" will allow you to -# put the command \sideeffect (or @sideeffect) in the documentation, which -# will result in a user-defined paragraph with heading "Side Effects:". -# You can put \n's in the value part of an alias to insert newlines. - -ALIASES = "doctodo=@todo\nDoc me! See docs/doxygen/TODO and http://gcc.gnu.org/ml/libstdc++/2002-02/msg00003.html for more." \ - "isiosfwd=One of the @link s27_2_iosfwd I/O forward declarations @endlink" - -# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C -# sources only. Doxygen will then generate output that is more tailored for C. -# For instance, some of the names that are used will be different. The list -# of all members will be omitted, etc. - -OPTIMIZE_OUTPUT_FOR_C = NO - -# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of -# Java sources only. Doxygen will then generate output that is more -# tailored for Java. For instance, namespaces will be presented as -# packages, qualified scopes will look different, etc. - -OPTIMIZE_OUTPUT_JAVA = NO - -# If you use STL classes (i.e. std::string, std::vector, etc.) but do -# not want to include (a tag file for) the STL sources as input, then -# you should set this tag to YES in order to let doxygen match -# functions declarations and definitions whose arguments contain STL -# classes (e.g. func(std::string); v.s. func(std::string) {}). This -# also make the inheritance and collaboration diagrams that involve -# STL classes more complete and accurate. - -BUILTIN_STL_SUPPORT = NO - -# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC -# tag is set to YES, then doxygen will reuse the documentation of the first -# member in the group (if any) for the other members of the group. By default -# all members of a group must be documented explicitly. - -DISTRIBUTE_GROUP_DOC = YES - -# Set the SUBGROUPING tag to YES (the default) to allow class member groups of -# the same type (for instance a group of public functions) to be put as a -# subgroup of that type (e.g. under the Public Functions section). Set it to -# NO to prevent subgrouping. Alternatively, this can be done per class using -# the \nosubgrouping command. - -SUBGROUPING = YES - -#--------------------------------------------------------------------------- -# Build related configuration options -#--------------------------------------------------------------------------- - -# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in -# documentation are documented, even if no documentation was available. -# Private class members and static file members will be hidden unless -# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES - -EXTRACT_ALL = NO - -# If the EXTRACT_PRIVATE tag is set to YES all private members of a class -# will be included in the documentation. - -EXTRACT_PRIVATE = NO - -# If the EXTRACT_STATIC tag is set to YES all static members of a file -# will be included in the documentation. - -EXTRACT_STATIC = YES - -# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) -# defined locally in source files will be included in the documentation. -# If set to NO only classes defined in header files are included. - -EXTRACT_LOCAL_CLASSES = YES - -# This flag is only useful for Objective-C code. When set to YES local -# methods, which are defined in the implementation section but not in -# the interface are included in the documentation. -# If set to NO (the default) only methods in the interface are included. - -EXTRACT_LOCAL_METHODS = YES - -# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all -# undocumented members of documented classes, files or namespaces. -# If set to NO (the default) these members will be included in the -# various overviews, but no documentation section is generated. -# This option has no effect if EXTRACT_ALL is enabled. - -HIDE_UNDOC_MEMBERS = NO - -# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all -# undocumented classes that are normally visible in the class hierarchy. -# If set to NO (the default) these classes will be included in the various -# overviews. This option has no effect if EXTRACT_ALL is enabled. - -HIDE_UNDOC_CLASSES = YES - -# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all -# friend (class|struct|union) declarations. -# If set to NO (the default) these declarations will be included in the -# documentation. - -HIDE_FRIEND_COMPOUNDS = NO - -# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any -# documentation blocks found inside the body of a function. -# If set to NO (the default) these blocks will be appended to the -# function's detailed documentation block. - -HIDE_IN_BODY_DOCS = NO - -# The INTERNAL_DOCS tag determines if documentation -# that is typed after a \internal command is included. If the tag is set -# to NO (the default) then the documentation will be excluded. -# Set it to YES to include the internal documentation. - -INTERNAL_DOCS = NO - -# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate -# file names in lower-case letters. If set to YES upper-case letters are also -# allowed. This is useful if you have classes or files whose names only differ -# in case and if your file system supports case sensitive file names. Windows -# and Mac users are advised to set this option to NO. - -CASE_SENSE_NAMES = NO - -# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen -# will show members with their full class and namespace scopes in the -# documentation. If set to YES the scope will be hidden. - -HIDE_SCOPE_NAMES = NO -#HIDE_SCOPE_NAMES = YES - -# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then -# Doxygen will put a list of the files that are included by a file in -# the documentation of that file. - -SHOW_INCLUDE_FILES = NO - -# If the INLINE_INFO tag is set to YES (the default) then a tag [inline] -# is inserted in the documentation for inline members. - -INLINE_INFO = YES - -# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen -# will sort the (detailed) documentation of file and class members -# alphabetically by member name. If set to NO the members will appear in -# declaration order. - -SORT_MEMBER_DOCS = YES - -# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the -# brief documentation of file, namespace and class members alphabetically -# by member name. If set to NO (the default) the members will appear in -# declaration order. - -SORT_BRIEF_DOCS = YES - -# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be -# sorted by fully-qualified names, including namespaces. If set to -# NO (the default), the class list will be sorted only by class name, -# not including the namespace part. -# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. -# Note: This option applies only to the class list, not to the -# alphabetical list. - -#SORT_BY_SCOPE_NAME = NO -SORT_BY_SCOPE_NAME = YES - -# The GENERATE_TODOLIST tag can be used to enable (YES) or -# disable (NO) the todo list. This list is created by putting \todo -# commands in the documentation. - -GENERATE_TODOLIST = YES - -# The GENERATE_TESTLIST tag can be used to enable (YES) or -# disable (NO) the test list. This list is created by putting \test -# commands in the documentation. - -GENERATE_TESTLIST = NO - -# The GENERATE_BUGLIST tag can be used to enable (YES) or -# disable (NO) the bug list. This list is created by putting \bug -# commands in the documentation. - -GENERATE_BUGLIST = YES - -# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or -# disable (NO) the deprecated list. This list is created by putting -# \deprecated commands in the documentation. - -GENERATE_DEPRECATEDLIST= YES - -# The ENABLED_SECTIONS tag can be used to enable conditional -# documentation sections, marked by \if sectionname ... \endif. - -ENABLED_SECTIONS = @enabled_sections@ - -# The MAX_INITIALIZER_LINES tag determines the maximum number of lines -# the initial value of a variable or define consists of for it to appear in -# the documentation. If the initializer consists of more lines than specified -# here it will be hidden. Use a value of 0 to hide initializers completely. -# The appearance of the initializer of individual variables and defines in the -# documentation can be controlled using \showinitializer or \hideinitializer -# command in the documentation regardless of this setting. - -MAX_INITIALIZER_LINES = 0 - -# Set the SHOW_USED_FILES tag to NO to disable the list of files generated -# at the bottom of the documentation of classes and structs. If set to YES the -# list will mention the files that were used to generate the documentation. - -SHOW_USED_FILES = YES - -# If the sources in your project are distributed over multiple -# directories then setting the SHOW_DIRECTORIES tag to YES will show -# the directory hierarchy in the documentation. The default is NO. - -SHOW_DIRECTORIES = YES - -# The FILE_VERSION_FILTER tag can be used to specify a program or -# script that doxygen should invoke to get the current version for -# each file (typically from the version control system). Doxygen will -# invoke the program by executing (via popen()) the command -# , where is the value of the -# FILE_VERSION_FILTER tag, and is the name of an input -# file provided by doxygen. Whatever the program writes to standard -# output is used as the file version. See the manual for examples. - -FILE_VERSION_FILTER = - -#--------------------------------------------------------------------------- -# configuration options related to warning and progress messages -#--------------------------------------------------------------------------- - -# The QUIET tag can be used to turn on/off the messages that are generated -# by doxygen. Possible values are YES and NO. If left blank NO is used. - -QUIET = NO - -# The WARNINGS tag can be used to turn on/off the warning messages that are -# generated by doxygen. Possible values are YES and NO. If left blank -# NO is used. - -WARNINGS = YES - -# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings -# for undocumented members. If EXTRACT_ALL is set to YES then this flag will -# automatically be disabled. - -WARN_IF_UNDOCUMENTED = NO - -# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for -# potential errors in the documentation, such as not documenting some -# parameters in a documented function, or documenting parameters that -# don't exist or using markup commands wrongly. - -WARN_IF_DOC_ERROR = NO - -# This WARN_NO_PARAMDOC option can be abled to get warnings for -# functions that are documented, but have no documentation for their -# parameters or return value. If set to NO (the default) doxygen will -# only warn about wrong or incomplete parameter documentation, but not -# about the absence of documentation. - -WARN_NO_PARAMDOC = NO - -# The WARN_FORMAT tag determines the format of the warning messages that -# doxygen can produce. The string should contain the $file, $line, and $text -# tags, which will be replaced by the file and line number from which the -# warning originated and the warning text. Optionally the format may contain -# $version, which will be replaced by the version of the file (if it could -# be obtained via FILE_VERSION_FILTER) - -WARN_FORMAT = "$file:$line: $text" - -# The WARN_LOGFILE tag can be used to specify a file to which warning -# and error messages should be written. If left blank the output is written -# to stderr. - -WARN_LOGFILE = - -#--------------------------------------------------------------------------- -# configuration options related to the input files -#--------------------------------------------------------------------------- - -# The INPUT tag can be used to specify the files and/or directories -# that contain documented source files. You may enter file names like -# "myfile.cpp" or directories like "/usr/src/myproject". Separate the -# files or directories with spaces. - -INPUT = @srcdir@/docs/doxygen/doxygroups.cc \ - @srcdir@/include/precompiled/stdc++.h \ - @srcdir@/include/precompiled/stdtr1c++.h \ - @srcdir@/include/precompiled/extc++.h \ - @srcdir@/libsupc++/cxxabi.h \ - @srcdir@/libsupc++/exception \ - @srcdir@/libsupc++/new \ - @srcdir@/libsupc++/typeinfo \ - include/@host_alias@/bits \ - include/bits \ - include/debug \ - include/parallel \ - include/ext \ - include/tr1 \ - include/tr1_impl \ - include/algorithm \ - include/array \ - include/bitset \ - include/cassert \ - include/ccomplex \ - include/cctype \ - include/cerrno \ - include/cfenv \ - include/cfloat \ - include/cinttypes \ - include/ciso646 \ - include/climits \ - include/clocale \ - include/cmath \ - include/csetjmp \ - include/csignal \ - include/cstdarg \ - include/cstdbool \ - include/cstddef \ - include/cstdint \ - include/cstdio \ - include/cstdlib \ - include/cstring \ - include/ctgmath \ - include/ctime \ - include/cwchar \ - include/cwctype \ - include/deque \ - include/fstream \ - include/functional \ - include/iomanip \ - include/ios \ - include/iosfwd \ - include/iostream \ - include/istream \ - include/iterator \ - include/limits \ - include/list \ - include/locale \ - include/map \ - include/memory \ - include/numeric \ - include/ostream \ - include/queue \ - include/random \ - include/regex \ - include/set \ - include/sstream \ - include/stack \ - include/stdexcept \ - include/streambuf \ - include/string \ - include/system_error \ - include/tuple \ - include/type_traits \ - include/unordered_map \ - include/unordered_set \ - include/utility \ - include/valarray \ - include/vector \ - include/backward/hash_map \ - include/backward/hash_set \ - include/debug/bitset \ - include/debug/deque \ - include/debug/list \ - include/debug/map \ - include/debug/set \ - include/debug/string \ - include/debug/vector \ - include/ext/algorithm \ - include/ext/functional \ - include/ext/iterator \ - include/ext/memory \ - include/ext/numeric \ - include/ext/rb_tree \ - include/ext/rope \ - include/ext/slist \ - include/ext/pb_ds \ - include/ext/pb_ds/detail \ - include/parallel/algorithm \ - include/parallel/numeric \ - include/tr1/array \ - include/tr1/ccomplex \ - include/tr1/cctype \ - include/tr1/cfenv \ - include/tr1/cfloat \ - include/tr1/cinttypes \ - include/tr1/climits \ - include/tr1/cmath \ - include/tr1/complex \ - include/tr1/cstdarg \ - include/tr1/cstdbool \ - include/tr1/cstdint \ - include/tr1/cstdio \ - include/tr1/cstdlib \ - include/tr1/ctgmath \ - include/tr1/ctime \ - include/tr1/cwchar \ - include/tr1/cwctype \ - include/tr1/functional \ - include/tr1/hashtable.h \ - include/tr1/memory \ - include/tr1/random \ - include/tr1/regex \ - include/tr1/tuple \ - include/tr1/type_traits \ - include/tr1/unordered_map \ - include/tr1/unordered_set \ - include/tr1_impl/utility \ - include/tr1_impl/array \ - include/tr1_impl/cctype \ - include/tr1_impl/cfenv \ - include/tr1_impl/cinttypes \ - include/tr1_impl/cmath \ - include/tr1_impl/complex \ - include/tr1_impl/cstdint \ - include/tr1_impl/cstdio \ - include/tr1_impl/cstdlib \ - include/tr1_impl/cwchar \ - include/tr1_impl/cwctype \ - include/tr1_impl/functional \ - include/tr1_impl/hashtable \ - include/tr1_impl/random \ - include/tr1_impl/regex \ - include/tr1_impl/tuple \ - include/tr1_impl/type_traits \ - include/tr1_impl/unordered_map \ - include/tr1_impl/unordered_set \ - include/tr1_impl/utility - -# If the value of the INPUT tag contains directories, you can use the -# FILE_PATTERNS tag to specify one or more wildcard pattern (like -# *.cpp and *.h) to filter out the source-files in the directories. If -# left blank the following patterns are tested: *.c *.cc *.cxx *.cpp -# *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx *.hpp *.h++ -# *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.py - -FILE_PATTERNS = *.h \ - *.hpp \ - *.tcc - -# The RECURSIVE tag can be used to turn specify whether or not subdirectories -# should be searched for input files as well. Possible values are YES and NO. -# If left blank NO is used. - -RECURSIVE = NO - -# The EXCLUDE tag can be used to specify files and/or directories that -# should excluded from the INPUT source files. This way you can easily -# exclude a subdirectory from a directory tree whose root is specified -# with the INPUT tag. - -EXCLUDE = Makefile - -# The EXCLUDE_SYMLINKS tag can be used select whether or not files or -# directories that are symbolic links (a Unix filesystem feature) are excluded -# from the input. - -EXCLUDE_SYMLINKS = NO - -# If the value of the INPUT tag contains directories, you can use the -# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude -# certain files from those directories. Note that the wildcards are matched -# against the file with absolute path, so to exclude all test directories -# for example use the pattern */test/* - -EXCLUDE_PATTERNS = stamp-* \ - *stdc++.h* \ - *stdtr1c++.h* \ - *extc++.h* \ - */.svn/* - -# The EXAMPLE_PATH tag can be used to specify one or more files or -# directories that contain example code fragments that are included (see -# the \include command). - -EXAMPLE_PATH = - -# If the value of the EXAMPLE_PATH tag contains directories, you can use the -# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp -# and *.h) to filter out the source-files in the directories. If left -# blank all files are included. - -EXAMPLE_PATTERNS = - -# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be -# searched for input files to be used with the \include or \dontinclude -# commands irrespective of the value of the RECURSIVE tag. -# Possible values are YES and NO. If left blank NO is used. - -EXAMPLE_RECURSIVE = NO - -# The IMAGE_PATH tag can be used to specify one or more files or -# directories that contain image that are included in the documentation (see -# the \image command). - -IMAGE_PATH = - -# The INPUT_FILTER tag can be used to specify a program that doxygen should -# invoke to filter for each input file. Doxygen will invoke the filter program -# by executing (via popen()) the command , where -# is the value of the INPUT_FILTER tag, and is the name of an -# input file. Doxygen will then use the output that the filter program writes -# to standard output. If FILTER_PATTERNS is specified, this tag will be -# ignored. - -INPUT_FILTER = - -# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern -# basis. Doxygen will compare the file name with each pattern and apply the -# filter if there is a match. The filters are a list of the form: -# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further -# info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER -# is applied to all files. - -FILTER_PATTERNS = - -# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using -# INPUT_FILTER) will be used to filter the input files when producing source -# files to browse (i.e. when SOURCE_BROWSER is set to YES). - -FILTER_SOURCE_FILES = NO - -#--------------------------------------------------------------------------- -# configuration options related to source browsing -#--------------------------------------------------------------------------- - -# If the SOURCE_BROWSER tag is set to YES then a list of source files -# will be generated. Documented entities will be cross-referenced with -# these sources. Note: To get rid of all source code in the generated -# output, make sure also VERBATIM_HEADERS is set to NO. - -SOURCE_BROWSER = YES - -# Setting the INLINE_SOURCES tag to YES will include the body -# of functions and classes directly in the documentation. - -INLINE_SOURCES = NO - -# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct -# doxygen to hide any special comment blocks from generated source code -# fragments. Normal C and C++ comments will always remain visible. - -STRIP_CODE_COMMENTS = NO - -# If the REFERENCED_BY_RELATION tag is set to YES (the default) -# then for each documented function all documented -# functions referencing it will be listed. - -REFERENCED_BY_RELATION = YES - -# If the REFERENCES_RELATION tag is set to YES (the default) -# then for each documented function all documented entities -# called/used by that function will be listed. - -REFERENCES_RELATION = YES - -# If the REFERENCES_LINK_SOURCE tag is set to YES (the default) -# and SOURCE_BROWSER tag is set to YES, then the hyperlinks from -# functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will -# link to the source code. Otherwise they will link to the documentstion. - -REFERENCES_LINK_SOURCE = YES - -# If the USE_HTAGS tag is set to YES then the references to source code -# will point to the HTML generated by the htags(1) tool instead of doxygen -# built-in source browser. The htags tool is part of GNU's global source -# tagging system (see http://www.gnu.org/software/global/global.html). You -# will need version 4.8.6 or higher. - -USE_HTAGS = NO - -# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen -# will generate a verbatim copy of the header file for each class for -# which an include is specified. Set to NO to disable this. - -VERBATIM_HEADERS = NO - -#--------------------------------------------------------------------------- -# configuration options related to the alphabetical class index -#--------------------------------------------------------------------------- - -# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index -# of all compounds will be generated. Enable this if the project -# contains a lot of classes, structs, unions or interfaces. - -ALPHABETICAL_INDEX = YES - -# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then -# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns -# in which this list will be split (can be a number in the range [1..20]) - -COLS_IN_ALPHA_INDEX = 2 - -# In case all classes in a project start with a common prefix, all -# classes will be put under the same header in the alphabetical index. -# The IGNORE_PREFIX tag can be used to specify one or more prefixes that -# should be ignored while generating the index headers. - -#IGNORE_PREFIX = std \ -# std::tr1 \ -# __gnu_cxx \ -# __gnu_debug -IGNORE_PREFIX = - -#--------------------------------------------------------------------------- -# configuration options related to the HTML output -#--------------------------------------------------------------------------- - -# If the GENERATE_HTML tag is set to YES (the default) Doxygen will -# generate HTML output. - -GENERATE_HTML = @do_html@ - -# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. -# If a relative path is entered the value of OUTPUT_DIRECTORY will be -# put in front of it. If left blank `html' will be used as the default path. - -HTML_OUTPUT = @html_output_dir@ - -# The HTML_FILE_EXTENSION tag can be used to specify the file extension for -# each generated HTML page (for example: .htm,.php,.asp). If it is left blank -# doxygen will generate files with .html extension. - -HTML_FILE_EXTENSION = .html - -# The HTML_HEADER tag can be used to specify a personal HTML header for -# each generated HTML page. If it is left blank doxygen will generate a -# standard header. - -HTML_HEADER = - -# The HTML_FOOTER tag can be used to specify a personal HTML footer for -# each generated HTML page. If it is left blank doxygen will generate a -# standard footer. - -HTML_FOOTER = - -# The HTML_STYLESHEET tag can be used to specify a user-defined cascading -# style sheet that is used by each HTML page. It can be used to -# fine-tune the look of the HTML output. If the tag is left blank doxygen -# will generate a default style sheet. Note that doxygen will try to copy -# the style sheet file to the HTML output directory, so don't put your own -# stylesheet in the HTML output directory as well, or it will be erased! - -HTML_STYLESHEET = @srcdir@/docs/doxygen/style.css - -# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, -# files or namespaces will be aligned in HTML using tables. If set to -# NO a bullet list will be used. - -HTML_ALIGN_MEMBERS = NO - -# If the GENERATE_HTMLHELP tag is set to YES, additional index files -# will be generated that can be used as input for tools like the -# Microsoft HTML help workshop to generate a compressed HTML help file (.chm) -# of the generated HTML documentation. - -GENERATE_HTMLHELP = NO - -# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can -# be used to specify the file name of the resulting .chm file. You -# can add a path in front of the file if the result should not be -# written to the html output directory. - -CHM_FILE = - -# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can -# be used to specify the location (absolute path including file name) of -# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run -# the HTML help compiler on the generated index.hhp. - -HHC_LOCATION = - -# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag -# controls if a separate .chi index file is generated (YES) or that -# it should be included in the master .chm file (NO). - -GENERATE_CHI = NO - -# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag -# controls whether a binary table of contents is generated (YES) or a -# normal table of contents (NO) in the .chm file. - -BINARY_TOC = NO - -# The TOC_EXPAND flag can be set to YES to add extra items for group members -# to the contents of the HTML help documentation and to the tree view. - -TOC_EXPAND = NO - -# The DISABLE_INDEX tag can be used to turn on/off the condensed index at -# top of each HTML page. The value NO (the default) enables the index and -# the value YES disables it. - -DISABLE_INDEX = YES - -# This tag can be used to set the number of enum values (range [1..20]) -# that doxygen will group on one line in the generated HTML documentation. - -ENUM_VALUES_PER_LINE = 4 - -# If the GENERATE_TREEVIEW tag is set to YES, a side panel will be -# generated containing a tree-like index structure (just like the one that -# is generated for HTML Help). For this to work a browser that supports -# JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+, -# Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are -# probably better off using the HTML help feature. - -GENERATE_TREEVIEW = YES - -# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be -# used to set the initial width (in pixels) of the frame in which the tree -# is shown. - -TREEVIEW_WIDTH = 250 - -#--------------------------------------------------------------------------- -# configuration options related to the LaTeX output -#--------------------------------------------------------------------------- - -# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will -# generate Latex output. - -GENERATE_LATEX = NO - -# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. -# If a relative path is entered the value of OUTPUT_DIRECTORY will be -# put in front of it. If left blank `latex' will be used as the default path. - -LATEX_OUTPUT = latex - -# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be -# invoked. If left blank `latex' will be used as the default command name. - -LATEX_CMD_NAME = latex - -# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to -# generate index for LaTeX. If left blank `makeindex' will be used as the -# default command name. - -MAKEINDEX_CMD_NAME = makeindex - -# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact -# LaTeX documents. This may be useful for small projects and may help to -# save some trees in general. - -COMPACT_LATEX = NO - -# The PAPER_TYPE tag can be used to set the paper type that is used -# by the printer. Possible values are: a4, a4wide, letter, legal and -# executive. If left blank a4wide will be used. - -PAPER_TYPE = letter - -# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX -# packages that should be included in the LaTeX output. - -EXTRA_PACKAGES = amsmath - -# The LATEX_HEADER tag can be used to specify a personal LaTeX header for -# the generated latex document. The header should contain everything until -# the first chapter. If it is left blank doxygen will generate a -# standard header. Notice: only use this tag if you know what you are doing! - -LATEX_HEADER = - -# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated -# is prepared for conversion to pdf (using ps2pdf). The pdf file will -# contain links (just like the HTML output) instead of page references -# This makes the output suitable for online browsing using a pdf viewer. - -PDF_HYPERLINKS = NO - -# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of -# plain latex in the generated Makefile. Set this option to YES to get a -# higher quality PDF documentation. - -USE_PDFLATEX = NO - -# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. -# command to the generated LaTeX files. This will instruct LaTeX to keep -# running if errors occur, instead of asking the user for help. -# This option is also used when generating formulas in HTML. - -LATEX_BATCHMODE = NO - -# If LATEX_HIDE_INDICES is set to YES then doxygen will not -# include the index chapters (such as File Index, Compound Index, etc.) -# in the output. - -LATEX_HIDE_INDICES = NO - -#--------------------------------------------------------------------------- -# configuration options related to the RTF output -#--------------------------------------------------------------------------- - -# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output -# The RTF output is optimized for Word 97 and may not look very pretty with -# other RTF readers or editors. - -GENERATE_RTF = NO - -# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. -# If a relative path is entered the value of OUTPUT_DIRECTORY will be -# put in front of it. If left blank `rtf' will be used as the default path. - -RTF_OUTPUT = rtf - -# If the COMPACT_RTF tag is set to YES Doxygen generates more compact -# RTF documents. This may be useful for small projects and may help to -# save some trees in general. - -COMPACT_RTF = NO - -# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated -# will contain hyperlink fields. The RTF file will -# contain links (just like the HTML output) instead of page references. -# This makes the output suitable for online browsing using WORD or other -# programs which support those fields. -# Note: wordpad (write) and others do not support links. - -RTF_HYPERLINKS = NO - -# Load stylesheet definitions from file. Syntax is similar to doxygen's -# config file, i.e. a series of assignments. You only have to provide -# replacements, missing definitions are set to their default value. - -RTF_STYLESHEET_FILE = - -# Set optional variables used in the generation of an rtf document. -# Syntax is similar to doxygen's config file. - -RTF_EXTENSIONS_FILE = - -#--------------------------------------------------------------------------- -# configuration options related to the man page output -#--------------------------------------------------------------------------- - -# If the GENERATE_MAN tag is set to YES (the default) Doxygen will -# generate man pages - -GENERATE_MAN = @do_man@ - -# The MAN_OUTPUT tag is used to specify where the man pages will be put. -# If a relative path is entered the value of OUTPUT_DIRECTORY will be -# put in front of it. If left blank `man' will be used as the default path. - -MAN_OUTPUT = man - -# The MAN_EXTENSION tag determines the extension that is added to -# the generated man pages (default is the subroutine's section .3) - -MAN_EXTENSION = .3 - -# If the MAN_LINKS tag is set to YES and Doxygen generates man output, -# then it will generate one additional man file for each entity -# documented in the real man page(s). These additional files -# only source the real man page, but without them the man command -# would be unable to find the correct page. The default is NO. - -MAN_LINKS = NO - -#--------------------------------------------------------------------------- -# configuration options related to the XML output -#--------------------------------------------------------------------------- - -# If the GENERATE_XML tag is set to YES Doxygen will -# generate an XML file that captures the structure of -# the code including all documentation. - -GENERATE_XML = YES - -# The XML_OUTPUT tag is used to specify where the XML pages will be put. -# If a relative path is entered the value of OUTPUT_DIRECTORY will be -# put in front of it. If left blank `xml' will be used as the default path. - -XML_OUTPUT = xml - -# The XML_SCHEMA tag can be used to specify an XML schema, -# which can be used by a validating XML parser to check the -# syntax of the XML files. - -XML_SCHEMA = - -# The XML_DTD tag can be used to specify an XML DTD, -# which can be used by a validating XML parser to check the -# syntax of the XML files. - -XML_DTD = - -# If the XML_PROGRAMLISTING tag is set to YES Doxygen will -# dump the program listings (including syntax highlighting -# and cross-referencing information) to the XML output. Note that -# enabling this will significantly increase the size of the XML output. - -XML_PROGRAMLISTING = YES - -#--------------------------------------------------------------------------- -# configuration options for the AutoGen Definitions output -#--------------------------------------------------------------------------- - -# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will -# generate an AutoGen Definitions (see autogen.sf.net) file -# that captures the structure of the code including all -# documentation. Note that this feature is still experimental -# and incomplete at the moment. - -GENERATE_AUTOGEN_DEF = NO - -#--------------------------------------------------------------------------- -# configuration options related to the Perl module output -#--------------------------------------------------------------------------- - -# If the GENERATE_PERLMOD tag is set to YES Doxygen will -# generate a Perl module file that captures the structure of -# the code including all documentation. Note that this -# feature is still experimental and incomplete at the -# moment. - -GENERATE_PERLMOD = NO - -# If the PERLMOD_LATEX tag is set to YES Doxygen will generate -# the necessary Makefile rules, Perl scripts and LaTeX code to be able -# to generate PDF and DVI output from the Perl module output. - -PERLMOD_LATEX = NO - -# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be -# nicely formatted so it can be parsed by a human reader. This is useful -# if you want to understand what is going on. On the other hand, if this -# tag is set to NO the size of the Perl module output will be much smaller -# and Perl will parse it just the same. - -PERLMOD_PRETTY = YES - -# The names of the make variables in the generated doxyrules.make file -# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. -# This is useful so different doxyrules.make files included by the same -# Makefile don't overwrite each other's variables. - -PERLMOD_MAKEVAR_PREFIX = - -#--------------------------------------------------------------------------- -# Configuration options related to the preprocessor -#--------------------------------------------------------------------------- - -# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will -# evaluate all C-preprocessor directives found in the sources and include -# files. - -ENABLE_PREPROCESSING = YES - -# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro -# names in the source code. If set to NO (the default) only conditional -# compilation will be performed. Macro expansion can be done in a controlled -# way by setting EXPAND_ONLY_PREDEF to YES. -# GLIBCXX NOTE: Necessary for namespaces to be sorted correctly. - -MACRO_EXPANSION = YES - -# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES -# then the macro expansion is limited to the macros specified with the -# PREDEFINED and EXPAND_AS_DEFINED tags. - -EXPAND_ONLY_PREDEF = NO - -# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files -# in the INCLUDE_PATH (see below) will be search if a #include is found. - -SEARCH_INCLUDES = YES - -# The INCLUDE_PATH tag can be used to specify one or more directories that -# contain include files that are not input files but should be processed by -# the preprocessor. - -INCLUDE_PATH = - -# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard -# patterns (like *.h and *.hpp) to filter out the header-files in the -# directories. If left blank, the patterns specified with FILE_PATTERNS will -# be used. - -INCLUDE_FILE_PATTERNS = - -# The PREDEFINED tag can be used to specify one or more macro names -# that are defined before the preprocessor is started (similar to the -# -D option of gcc). The argument of the tag is a list of macros of -# the form: name or name=definition (no spaces). If the definition and -# the = are omitted =1 is assumed. To prevent a macro definition from -# being undefined via #undef or recursively expanded use the := -# operator instead of the = operator. - -PREDEFINED = __GTHREADS \ - _GLIBCXX_STD=std \ - _GLIBCXX_TR1=tr1 \ - "_GLIBCXX_BEGIN_NAMESPACE(name)=namespace name {" \ - "_GLIBCXX_BEGIN_NESTED_NAMESPACE(name, unused)=namespace name {" \ - _GLIBCXX_END_NAMESPACE=} \ - _GLIBCXX_END_NESTED_NAMESPACE=} \ - "_GLIBCXX_TEMPLATE_ARGS=..." \ - _GLIBCXX_DEPRECATED \ - _GLIBCXX_USE_WCHAR_T \ - _GLIBCXX_USE_LONG_LONG \ - __glibcxx_function_requires=// \ - __glibcxx_class_requires=// \ - __glibcxx_class_requires2=// \ - __glibcxx_class_requires3=// \ - __glibcxx_class_requires4=// - -# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES -# then this tag can be used to specify a list of macro names that -# should be expanded. The macro definition that is found in the -# sources will be used. Use the PREDEFINED tag if you want to use a -# different macro definition. - -EXPAND_AS_DEFINED = - -# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then -# doxygen's preprocessor will remove all function-like macros that are alone -# on a line, have an all uppercase name, and do not end with a semicolon. Such -# function macros are typically used for boiler-plate code, and will confuse -# the parser if not removed. - -SKIP_FUNCTION_MACROS = YES - -#--------------------------------------------------------------------------- -# Configuration::additions related to external references -#--------------------------------------------------------------------------- - -# The TAGFILES option can be used to specify one or more tagfiles. -# Optionally an initial location of the external documentation -# can be added for each tagfile. The format of a tag file without -# this location is as follows: -# TAGFILES = file1 file2 ... -# Adding location for the tag files is done as follows: -# TAGFILES = file1=loc1 "file2 = loc2" ... -# where "loc1" and "loc2" can be relative or absolute paths or -# URLs. If a location is present for each tag, the installdox tool -# does not have to be run to correct the links. -# Note that each tag file must have a unique name -# (where the name does NOT include the path) -# If a tag file is not located in the directory in which doxygen -# is run, you must also specify the path to the tagfile here. - -TAGFILES = - -# When a file name is specified after GENERATE_TAGFILE, doxygen will create -# a tag file that is based on the input files it reads. - -GENERATE_TAGFILE = @generate_tagfile@ - -# If the ALLEXTERNALS tag is set to YES all external classes will be listed -# in the class index. If set to NO only the inherited external classes -# will be listed. - -ALLEXTERNALS = YES - -# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed -# in the modules index. If set to NO, only the current project's groups will -# be listed. - -EXTERNAL_GROUPS = YES - -# The PERL_PATH should be the absolute path and name of the perl script -# interpreter (i.e. the result of `which perl'). - -PERL_PATH = /usr/bin/perl - -#--------------------------------------------------------------------------- -# Configuration options related to the dot tool -#--------------------------------------------------------------------------- - -# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will -# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes -# with base or super classes. Setting the tag to NO turns the diagrams -# off. Note that this option is superseded by the HAVE_DOT option -# below. This is only a fallback. It is recommended to install and use -# dot, since it yields more powerful graphs. - -CLASS_DIAGRAMS = YES - -# If set to YES, the inheritance and collaboration graphs will hide -# inheritance and usage relations if the target is undocumented -# or is not a class. - -HIDE_UNDOC_RELATIONS = NO - -# If you set the HAVE_DOT tag to YES then doxygen will assume the dot -# tool is available from the path. This tool is part of Graphviz, a -# graph visualization toolkit from AT&T and Lucent Bell Labs. The -# other options in this section have no effect if this option is set -# to NO (the default) - -HAVE_DOT = YES - -# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen -# will generate a graph for each documented class showing the direct and -# indirect inheritance relations. Setting this tag to YES will force the -# the CLASS_DIAGRAMS tag to NO. - -CLASS_GRAPH = YES - -# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen -# will generate a graph for each documented class showing the direct and -# indirect implementation dependencies (inheritance, containment, and -# class references variables) of the class with other documented classes. - -COLLABORATION_GRAPH = NO - -# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen -# will generate a graph for groups, showing the direct groups dependencies - -GROUP_GRAPHS = YES - -# If the UML_LOOK tag is set to YES doxygen will generate inheritance and -# collaboration diagrams in a style similar to the OMG's Unified Modeling -# Language. - -UML_LOOK = NO - -# If set to YES, the inheritance and collaboration graphs will show the -# relations between templates and their instances. - -TEMPLATE_RELATIONS = YES - -# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT -# tags are set to YES then doxygen will generate a graph for each documented -# file showing the direct and indirect include dependencies of the file with -# other documented files. - -INCLUDE_GRAPH = NO - -# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and -# HAVE_DOT tags are set to YES then doxygen will generate a graph for each -# documented header file showing the documented files that directly or -# indirectly include this file. - -INCLUDED_BY_GRAPH = NO - -# If the CALL_GRAPH and HAVE_DOT tags are set to YES then doxygen will -# generate a call dependency graph for every global function or class -# method. Note that enabling this option will significantly increase -# the time of a run. So in most cases it will be better to enable -# call graphs for selected functions only using the \callgraph -# command. - -CALL_GRAPH = NO - -# If the CALLER_GRAPH and HAVE_DOT tags are set to YES then doxygen -# will generate a caller dependency graph for every global function or -# class method. Note that enabling this option will significantly -# increase the time of a run. So in most cases it will be better to -# enable caller graphs for selected functions only using the -# \callergraph command. - -CALLER_GRAPH = NO - -# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen -# will graphical hierarchy of all classes instead of a textual one. - -GRAPHICAL_HIERARCHY = YES - -# If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES -# then doxygen will show the dependencies a directory has on other directories -# in a graphical way. The dependency relations are determined by the #include -# relations between the files in the directories. - -DIRECTORY_GRAPH = YES - -# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images -# generated by dot. Possible values are png, jpg, or gif -# If left blank png will be used. - -#DOT_IMAGE_FORMAT = svg -DOT_IMAGE_FORMAT = png - -# The tag DOT_PATH can be used to specify the path where the dot tool can be -# found. If left blank, it is assumed the dot tool can be found in the path. - -DOT_PATH = - -# The DOTFILE_DIRS tag can be used to specify one or more directories that -# contain dot files that are included in the documentation (see the -# \dotfile command). - -DOTFILE_DIRS = - -# The MAX_DOT_GRAPH_WIDTH tag can be used to set the maximum allowed width -# (in pixels) of the graphs generated by dot. If a graph becomes larger than -# this value, doxygen will try to truncate the graph, so that it fits within -# the specified constraint. Beware that most browsers cannot cope with very -# large images. - -MAX_DOT_GRAPH_WIDTH = 1024 - -# The MAX_DOT_GRAPH_HEIGHT tag can be used to set the maximum allows height -# (in pixels) of the graphs generated by dot. If a graph becomes larger than -# this value, doxygen will try to truncate the graph, so that it fits within -# the specified constraint. Beware that most browsers cannot cope with very -# large images. - -MAX_DOT_GRAPH_HEIGHT = 1024 - -# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of -# the graphs generated by dot. A depth value of 3 means that only -# nodes reachable from the root by following a path via at most 3 -# edges will be shown. Nodes that lay further from the root node will -# be omitted. Note that setting this option to 1 or 2 may greatly -# reduce the computation time needed for large code bases. Also note -# that a graph may be further truncated if the graph's image -# dimensions are not sufficient to fit the graph (see -# MAX_DOT_GRAPH_WIDTH and MAX_DOT_GRAPH_HEIGHT). If 0 is used for the -# depth value (the default), the graph is not depth-constrained. - -MAX_DOT_GRAPH_DEPTH = 0 - -# Set the DOT_TRANSPARENT tag to YES to generate images with a -# transparent background. This is disabled by default, which results -# in a white background. Warning: Depending on the platform used, -# enabling this option may lead to badly anti-aliased labels on the -# edges of a graph (i.e. they become hard to read). - -DOT_TRANSPARENT = NO - -# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output -# files in one run (i.e. multiple -o and -T options on the command line). This -# makes dot run faster, but since only newer versions of dot (>1.8.10) -# support this, this feature is disabled by default. - -DOT_MULTI_TARGETS = YES - -# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will -# generate a legend page explaining the meaning of the various boxes and -# arrows in the dot generated graphs. - -GENERATE_LEGEND = NO - -# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will -# remove the intermediate dot files that are used to generate -# the various graphs. - -DOT_CLEANUP = YES - -#--------------------------------------------------------------------------- -# Configuration::additions related to the search engine -#--------------------------------------------------------------------------- - -# The SEARCHENGINE tag specifies whether or not a search engine should be -# used. If set to NO the values of all tags below this one will be ignored. - -SEARCHENGINE = NO diff --git a/libstdc++-v3/docs/html/17_intro/BADNAMES b/libstdc++-v3/docs/html/17_intro/BADNAMES deleted file mode 100644 index a904704ee39..00000000000 --- a/libstdc++-v3/docs/html/17_intro/BADNAMES +++ /dev/null @@ -1,182 +0,0 @@ - -This is the list of names "reserved to the implementation" that -have been claimed by certain compilers and system headers of interest, -and should not be used in the library. It will grow, of course. -We generally are interested in names that are not all-caps, except -for those like "_T" - -For Solarix: -_B -_C -_L -_N -_P -_S -_U -_X -_E1 -.. -_E24 - -Irix adds: -_A -_G - -MS adds: -_T - -BSD adds: -__used -__unused -__inline -_Complex -__istype -__maskrune -__tolower -__toupper -__wchar_t -__wint_t -_res -_res_ext -__tg_* - -For GCC: - - [Note that this list is out of date. It applies to the old - name-mangling; in G++ 3.0 and higher a different name-mangling is - used. In addition, many of the bugs relating to G++ interpreting - these names as operators have been fixed.] - - The full set of __* identifiers (combined from gcc/cp/lex.c and - gcc/cplus-dem.c) that are either old or new, but are definitely - recognized by the demangler, is: - -__aa -__aad -__ad -__addr -__adv -__aer -__als -__alshift -__amd -__ami -__aml -__amu -__aor -__apl -__array -__ars -__arshift -__as -__bit_and -__bit_ior -__bit_not -__bit_xor -__call -__cl -__cm -__cn -__co -__component -__compound -__cond -__convert -__delete -__dl -__dv -__eq -__er -__ge -__gt -__indirect -__le -__ls -__lt -__max -__md -__method_call -__mi -__min -__minus -__ml -__mm -__mn -__mult -__mx -__ne -__negate -__new -__nop -__nt -__nw -__oo -__op -__or -__pl -__plus -__postdecrement -__postincrement -__pp -__pt -__rf -__rm -__rs -__sz -__trunc_div -__trunc_mod -__truth_andif -__truth_not -__truth_orif -__vc -__vd -__vn - -SGI badnames: -__builtin_alloca -__builtin_fsqrt -__builtin_sqrt -__builtin_fabs -__builtin_dabs -__builtin_cast_f2i -__builtin_cast_i2f -__builtin_cast_d2ll -__builtin_cast_ll2d -__builtin_copy_dhi2i -__builtin_copy_i2dhi -__builtin_copy_dlo2i -__builtin_copy_i2dlo -__add_and_fetch -__sub_and_fetch -__or_and_fetch -__xor_and_fetch -__and_and_fetch -__nand_and_fetch -__mpy_and_fetch -__min_and_fetch -__max_and_fetch -__fetch_and_add -__fetch_and_sub -__fetch_and_or -__fetch_and_xor -__fetch_and_and -__fetch_and_nand -__fetch_and_mpy -__fetch_and_min -__fetch_and_max -__lock_test_and_set -__lock_release -__lock_acquire -__compare_and_swap -__synchronize -__high_multiply -__unix -__sgi -__linux__ -__i386__ -__i486__ -__cplusplus -__embedded_cplusplus -// long double conversion members mangled as __opr -// http://gcc.gnu.org/ml/libstdc++/1999-q4/msg00060.html -_opr diff --git a/libstdc++-v3/docs/html/17_intro/C++STYLE b/libstdc++-v3/docs/html/17_intro/C++STYLE deleted file mode 100644 index 9eca719a32b..00000000000 --- a/libstdc++-v3/docs/html/17_intro/C++STYLE +++ /dev/null @@ -1,399 +0,0 @@ - -C++ Standard Library Coding Style Guidelines -------------------------------------- - -This library is written to appropriate C++ coding standards. As such, -it is intended to precede the recommendations of the GNU Coding -Standard, which can be referenced in full here: - -http://www.gnu.org/prep/standards/standards.html#Formatting - -The rest of this is also interesting reading, but skip the "Design -Advice" part. - -The GCC coding conventions are here, and are also useful: -http://gcc.gnu.org/codingconventions.html - -In addition, because it doesn't seem to be stated explicitly anywhere -else, there is an 80 column source limit. - -ChangeLog entries for member functions should use the -classname::member function name syntax as follows: - -1999-04-15 Dennis Ritchie - - * src/basic_file.cc (__basic_file::open): Fix thinko in - _G_HAVE_IO_FILE_OPEN bits. - -Notable areas of divergence from what may be previous local practice -(particularly for GNU C) include: - -01. Pointers and references - char* p = "flop"; - char& c = *p; - -NOT- - char *p = "flop"; // wrong - char &c = *p; // wrong - - Reason: In C++, definitions are mixed with executable code. Here, - p is being initialized, not *p. This is near-universal - practice among C++ programmers; it is normal for C hackers - to switch spontaneously as they gain experience. - -02. Operator names and parentheses - operator==(type) - -NOT- - operator == (type) // wrong - - Reason: The == is part of the function name. Separating - it makes the declaration look like an expression. - -03. Function names and parentheses - void mangle() - -NOT- - void mangle () // wrong - - Reason: no space before parentheses (except after a control-flow - keyword) is near-universal practice for C++. It identifies the - parentheses as the function-call operator or declarator, as - opposed to an expression or other overloaded use of parentheses. - -04. Template function indentation - template - void - template_function(args) - { } - -NOT- - template - void template_function(args) {}; - - Reason: In class definitions, without indentation whitespace is - needed both above and below the declaration to distinguish - it visually from other members. (Also, re: "typename" - rather than "class".) T often could be int, which is - not a class. ("class", here, is an anachronism.) - -05. Template class indentation - template - class basic_ios : public ios_base - { - public: - // Types: - }; - -NOT- - template - class basic_ios : public ios_base - { - public: - // Types: - }; - -NOT- - template - class basic_ios : public ios_base - { - public: - // Types: - }; - -06. Enumerators - enum - { - space = _ISspace, - print = _ISprint, - cntrl = _IScntrl - }; - -NOT- - enum { space = _ISspace, print = _ISprint, cntrl = _IScntrl }; - -07. Member initialization lists - All one line, separate from class name. - - gribble::gribble() - : _M_private_data(0), _M_more_stuff(0), _M_helper(0); - { } - -NOT- - gribble::gribble() : _M_private_data(0), _M_more_stuff(0), _M_helper(0); - { } - -08. Try/Catch blocks - try - { - // - } - catch (...) - { - // - } - -NOT- - try { - // - } catch(...) { - // - } - -09. Member functions declarations and definitions - Keywords such as extern, static, export, explicit, inline, etc - go on the line above the function name. Thus - - virtual int - foo() - -NOT- - virtual int foo() - - Reason: GNU coding conventions dictate return types for functions - are on a separate line than the function name and parameter list - for definitions. For C++, where we have member functions that can - be either inline definitions or declarations, keeping to this - standard allows all member function names for a given class to be - aligned to the same margin, increasing readibility. - - -10. Invocation of member functions with "this->" - For non-uglified names, use this->name to call the function. - - this->sync() - -NOT- - sync() - - Reason: Koenig lookup. - -11. Namespaces - namespace std - { - blah blah blah; - } // namespace std - - -NOT- - - namespace std { - blah blah blah; - } // namespace std - -12. Spacing under protected and private in class declarations: - space above, none below - ie - - public: - int foo; - - -NOT- - public: - - int foo; - -13. Spacing WRT return statements. - no extra spacing before returns, no parenthesis - ie - - } - return __ret; - - -NOT- - } - - return __ret; - - -NOT- - - } - return (__ret); - - -14. Location of global variables. - All global variables of class type, whether in the "user visable" - space (e.g., cin) or the implementation namespace, must be defined - as a character array with the appropriate alignment and then later - re-initialized to the correct value. - - This is due to startup issues on certain platforms, such as AIX. - For more explanation and examples, see src/globals.cc. All such - variables should be contained in that file, for simplicity. - -15. Exception abstractions - Use the exception abstractions found in functexcept.h, which allow - C++ programmers to use this library with -fno-exceptions. (Even if - that is rarely advisable, it's a necessary evil for backwards - compatibility.) - -16. Exception error messages - All start with the name of the function where the exception is - thrown, and then (optional) descriptive text is added. Example: - - __throw_logic_error(__N("basic_string::_S_construct NULL not valid")); - - Reason: The verbose terminate handler prints out exception::what(), - as well as the typeinfo for the thrown exception. As this is the - default terminate handler, by putting location info into the - exception string, a very useful error message is printed out for - uncaught exceptions. So useful, in fact, that non-programmers can - give useful error messages, and programmers can intelligently - speculate what went wrong without even using a debugger. - -17. The doxygen style guide to comments is a separate document, - see index. - -The library currently has a mixture of GNU-C and modern C++ coding -styles. The GNU C usages will be combed out gradually. - -Name patterns: - -For nonstandard names appearing in Standard headers, we are constrained -to use names that begin with underscores. This is called "uglification". -The convention is: - - Local and argument names: __[a-z].* - - Examples: __count __ix __s1 - - Type names and template formal-argument names: _[A-Z][^_].* - - Examples: _Helper _CharT _N - - Member data and function names: _M_.* - - Examples: _M_num_elements _M_initialize () - - Static data members, constants, and enumerations: _S_.* - - Examples: _S_max_elements _S_default_value - -Don't use names in the same scope that differ only in the prefix, -e.g. _S_top and _M_top. See BADNAMES for a list of forbidden names. -(The most tempting of these seem to be and "_T" and "__sz".) - -Names must never have "__" internally; it would confuse name -unmanglers on some targets. Also, never use "__[0-9]", same reason. - --------------------------- - -[BY EXAMPLE] - -#ifndef _HEADER_ -#define _HEADER_ 1 - -namespace std -{ - class gribble - { - public: - gribble() throw(); - - gribble(const gribble&); - - explicit - gribble(int __howmany); - - gribble& - operator=(const gribble&); - - virtual - ~gribble() throw (); - - // Start with a capital letter, end with a period. - inline void - public_member(const char* __arg) const; - - // In-class function definitions should be restricted to one-liners. - int - one_line() { return 0 } - - int - two_lines(const char* arg) - { return strchr(arg, 'a'); } - - inline int - three_lines(); // inline, but defined below. - - // Note indentation. - template - void - public_template() const throw(); - - template - void - other_template(); - - private: - class _Helper; - - int _M_private_data; - int _M_more_stuff; - _Helper* _M_helper; - int _M_private_function(); - - enum _Enum - { - _S_one, - _S_two - }; - - static void - _S_initialize_library(); - }; - -// More-or-less-standard language features described by lack, not presence. -# ifndef _G_NO_LONGLONG - extern long long _G_global_with_a_good_long_name; // avoid globals! -# endif - - // Avoid in-class inline definitions, define separately; - // likewise for member class definitions: - inline int - gribble::public_member() const - { int __local = 0; return __local; } - - class gribble::_Helper - { - int _M_stuff; - - friend class gribble; - }; -} - -// Names beginning with "__": only for arguments and -// local variables; never use "__" in a type name, or -// within any name; never use "__[0-9]". - -#endif /* _HEADER_ */ - - -namespace std -{ - template // notice: "typename", not "class", no space - long_return_value_type - function_name(char* pointer, // "char *pointer" is wrong. - char* argument, - const Reference& ref) - { - // int a_local; /* wrong; see below. */ - if (test) - { - nested code - } - - int a_local = 0; // declare variable at first use. - - // char a, b, *p; /* wrong */ - char a = 'a'; - char b = a + 1; - char* c = "abc"; // each variable goes on its own line, always. - - // except maybe here... - for (unsigned i = 0, mask = 1; mask; ++i, mask <<= 1) { - // ... - } - } - - gribble::gribble() - : _M_private_data(0), _M_more_stuff(0), _M_helper(0); - { } - - inline int - gribble::three_lines() - { - // doesn't fit in one line. - } -} // namespace std - - - diff --git a/libstdc++-v3/docs/html/17_intro/COPYING b/libstdc++-v3/docs/html/17_intro/COPYING deleted file mode 100644 index 623b6258a13..00000000000 --- a/libstdc++-v3/docs/html/17_intro/COPYING +++ /dev/null @@ -1,340 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 - - Copyright (C) 1989, 1991 Free Software Foundation, Inc. - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. This -General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to -using it. (Some other Free Software Foundation software is covered by -the GNU Library General Public License instead.) You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -this service if you wish), that you receive source code or can get it -if you want it, that you can change the software or use pieces of it -in new free programs; and that you know you can do these things. - - To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. You must make sure that they, too, receive or can get the -source code. And you must show them these terms so they know their -rights. - - We protect your rights with two steps: (1) copyright the software, and -(2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. - - Also, for each author's protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors' reputations. - - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that redistributors of a free -program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any -patent must be licensed for everyone's free use or not licensed at all. - - The precise terms and conditions for copying, distribution and -modification follow. - - GNU GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License applies to any program or other work which contains -a notice placed by the copyright holder saying it may be distributed -under the terms of this General Public License. The "Program", below, -refers to any such program or work, and a "work based on the Program" -means either the Program or any derivative work under copyright law: -that is to say, a work containing the Program or a portion of it, -either verbatim or with modifications and/or translated into another -language. (Hereinafter, translation is included without limitation in -the term "modification".) Each licensee is addressed as "you". - -Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running the Program is not restricted, and the output from the Program -is covered only if its contents constitute a work based on the -Program (independent of having been made by running the Program). -Whether that is true depends on what the Program does. - - 1. You may copy and distribute verbatim copies of the Program's -source code as you receive it, in any medium, provided that you -conspicuously and appropriately publish on each copy an appropriate -copyright notice and disclaimer of warranty; keep intact all the -notices that refer to this License and to the absence of any warranty; -and give any other recipients of the Program a copy of this License -along with the Program. - -You may charge a fee for the physical act of transferring a copy, and -you may at your option offer warranty protection in exchange for a fee. - - 2. You may modify your copy or copies of the Program or any portion -of it, thus forming a work based on the Program, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) You must cause the modified files to carry prominent notices - stating that you changed the files and the date of any change. - - b) You must cause any work that you distribute or publish, that in - whole or in part contains or is derived from the Program or any - part thereof, to be licensed as a whole at no charge to all third - parties under the terms of this License. - - c) If the modified program normally reads commands interactively - when run, you must cause it, when started running for such - interactive use in the most ordinary way, to print or display an - announcement including an appropriate copyright notice and a - notice that there is no warranty (or else, saying that you provide - a warranty) and that users may redistribute the program under - these conditions, and telling the user how to view a copy of this - License. (Exception: if the Program itself is interactive but - does not normally print such an announcement, your work based on - the Program is not required to print an announcement.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Program, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Program, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Program. - -In addition, mere aggregation of another work not based on the Program -with the Program (or with a work based on the Program) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may copy and distribute the Program (or a work based on it, -under Section 2) in object code or executable form under the terms of -Sections 1 and 2 above provided that you also do one of the following: - - a) Accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of Sections - 1 and 2 above on a medium customarily used for software interchange; or, - - b) Accompany it with a written offer, valid for at least three - years, to give any third party, for a charge no more than your - cost of physically performing source distribution, a complete - machine-readable copy of the corresponding source code, to be - distributed under the terms of Sections 1 and 2 above on a medium - customarily used for software interchange; or, - - c) Accompany it with the information you received as to the offer - to distribute corresponding source code. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form with such - an offer, in accord with Subsection b above.) - -The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, complete source -code means all the source code for all modules it contains, plus any -associated interface definition files, plus the scripts used to -control compilation and installation of the executable. However, as a -special exception, the source code distributed need not include -anything that is normally distributed (in either source or binary -form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component -itself accompanies the executable. - -If distribution of executable or object code is made by offering -access to copy from a designated place, then offering equivalent -access to copy the source code from the same place counts as -distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. - - 4. You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License. Any attempt -otherwise to copy, modify, sublicense or distribute the Program is -void, and will automatically terminate your rights under this License. -However, parties who have received copies, or rights, from you under -this License will not have their licenses terminated so long as such -parties remain in full compliance. - - 5. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Program or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Program (or any work based on the -Program), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Program or works based on it. - - 6. Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the -original licensor to copy, distribute or modify the Program subject to -these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties to -this License. - - 7. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Program at all. For example, if a patent -license would not permit royalty-free redistribution of the Program by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Program. - -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply and the section as a whole is intended to apply in other -circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system, which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 8. If the distribution and/or use of the Program is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Program under this License -may add an explicit geographical distribution limitation excluding -those countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. - - 9. The Free Software Foundation may publish revised and/or new versions -of the General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - -Each version is given a distinguishing version number. If the Program -specifies a version number of this License which applies to it and "any -later version", you have the option of following the terms and conditions -either of that version or of any later version published by the Free -Software Foundation. If the Program does not specify a version number of -this License, you may choose any version ever published by the Free Software -Foundation. - - 10. If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author -to ask for permission. For software which is copyrighted by the Free -Software Foundation, write to the Free Software Foundation; we sometimes -make exceptions for this. Our decision will be guided by the two goals -of preserving the free status of all derivatives of our free software and -of promoting the sharing and reuse of software generally. - - NO WARRANTY - - 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY -FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN -OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES -PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED -OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS -TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE -PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, -REPAIR OR CORRECTION. - - 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, -INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING -OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED -TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY -YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER -PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE -POSSIBILITY OF SUCH DAMAGES. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY 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 Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - - -Also add information on how to contact you by electronic and paper mail. - -If the program is interactive, make it output a short notice like this -when it starts in an interactive mode: - - Gnomovision version 69, Copyright (C) year name of author - Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, the commands you use may -be called something other than `show w' and `show c'; they could even be -mouse-clicks or menu items--whatever suits your program. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the program, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the program - `Gnomovision' (which makes passes at compilers) written by James Hacker. - - , 1 April 1989 - Ty Coon, President of Vice - -This General Public License does not permit incorporating your program into -proprietary programs. If your program is a subroutine library, you may -consider it more useful to permit linking proprietary applications with the -library. If this is what you want to do, use the GNU Library General -Public License instead of this License. diff --git a/libstdc++-v3/docs/html/17_intro/COPYING.DOC b/libstdc++-v3/docs/html/17_intro/COPYING.DOC deleted file mode 100644 index 1a864561bd4..00000000000 --- a/libstdc++-v3/docs/html/17_intro/COPYING.DOC +++ /dev/null @@ -1,355 +0,0 @@ - GNU Free Documentation License - Version 1.1, March 2000 - - Copyright (C) 2000 Free Software Foundation, Inc. - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - -0. PREAMBLE - -The purpose of this License is to make a manual, textbook, or other -written document "free" in the sense of freedom: to assure everyone -the effective freedom to copy and redistribute it, with or without -modifying it, either commercially or noncommercially. Secondarily, -this License preserves for the author and publisher a way to get -credit for their work, while not being considered responsible for -modifications made by others. - -This License is a kind of "copyleft", which means that derivative -works of the document must themselves be free in the same sense. It -complements the GNU General Public License, which is a copyleft -license designed for free software. - -We have designed this License in order to use it for manuals for free -software, because free software needs free documentation: a free -program should come with manuals providing the same freedoms that the -software does. But this License is not limited to software manuals; -it can be used for any textual work, regardless of subject matter or -whether it is published as a printed book. We recommend this License -principally for works whose purpose is instruction or reference. - - -1. APPLICABILITY AND DEFINITIONS - -This License applies to any manual or other work that contains a -notice placed by the copyright holder saying it can be distributed -under the terms of this License. The "Document", below, refers to any -such manual or work. Any member of the public is a licensee, and is -addressed as "you". - -A "Modified Version" of the Document means any work containing the -Document or a portion of it, either copied verbatim, or with -modifications and/or translated into another language. - -A "Secondary Section" is a named appendix or a front-matter section of -the Document that deals exclusively with the relationship of the -publishers or authors of the Document to the Document's overall subject -(or to related matters) and contains nothing that could fall directly -within that overall subject. (For example, if the Document is in part a -textbook of mathematics, a Secondary Section may not explain any -mathematics.) The relationship could be a matter of historical -connection with the subject or with related matters, or of legal, -commercial, philosophical, ethical or political position regarding -them. - -The "Invariant Sections" are certain Secondary Sections whose titles -are designated, as being those of Invariant Sections, in the notice -that says that the Document is released under this License. - -The "Cover Texts" are certain short passages of text that are listed, -as Front-Cover Texts or Back-Cover Texts, in the notice that says that -the Document is released under this License. - -A "Transparent" copy of the Document means a machine-readable copy, -represented in a format whose specification is available to the -general public, whose contents can be viewed and edited directly and -straightforwardly with generic text editors or (for images composed of -pixels) generic paint programs or (for drawings) some widely available -drawing editor, and that is suitable for input to text formatters or -for automatic translation to a variety of formats suitable for input -to text formatters. A copy made in an otherwise Transparent file -format whose markup has been designed to thwart or discourage -subsequent modification by readers is not Transparent. A copy that is -not "Transparent" is called "Opaque". - -Examples of suitable formats for Transparent copies include plain -ASCII without markup, Texinfo input format, LaTeX input format, SGML -or XML using a publicly available DTD, and standard-conforming simple -HTML designed for human modification. Opaque formats include -PostScript, PDF, proprietary formats that can be read and edited only -by proprietary word processors, SGML or XML for which the DTD and/or -processing tools are not generally available, and the -machine-generated HTML produced by some word processors for output -purposes only. - -The "Title Page" means, for a printed book, the title page itself, -plus such following pages as are needed to hold, legibly, the material -this License requires to appear in the title page. For works in -formats which do not have any title page as such, "Title Page" means -the text near the most prominent appearance of the work's title, -preceding the beginning of the body of the text. - - -2. VERBATIM COPYING - -You may copy and distribute the Document in any medium, either -commercially or noncommercially, provided that this License, the -copyright notices, and the license notice saying this License applies -to the Document are reproduced in all copies, and that you add no other -conditions whatsoever to those of this License. You may not use -technical measures to obstruct or control the reading or further -copying of the copies you make or distribute. However, you may accept -compensation in exchange for copies. If you distribute a large enough -number of copies you must also follow the conditions in section 3. - -You may also lend copies, under the same conditions stated above, and -you may publicly display copies. - - -3. COPYING IN QUANTITY - -If you publish printed copies of the Document numbering more than 100, -and the Document's license notice requires Cover Texts, you must enclose -the copies in covers that carry, clearly and legibly, all these Cover -Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on -the back cover. Both covers must also clearly and legibly identify -you as the publisher of these copies. The front cover must present -the full title with all words of the title equally prominent and -visible. You may add other material on the covers in addition. -Copying with changes limited to the covers, as long as they preserve -the title of the Document and satisfy these conditions, can be treated -as verbatim copying in other respects. - -If the required texts for either cover are too voluminous to fit -legibly, you should put the first ones listed (as many as fit -reasonably) on the actual cover, and continue the rest onto adjacent -pages. - -If you publish or distribute Opaque copies of the Document numbering -more than 100, you must either include a machine-readable Transparent -copy along with each Opaque copy, or state in or with each Opaque copy -a publicly-accessible computer-network location containing a complete -Transparent copy of the Document, free of added material, which the -general network-using public has access to download anonymously at no -charge using public-standard network protocols. If you use the latter -option, you must take reasonably prudent steps, when you begin -distribution of Opaque copies in quantity, to ensure that this -Transparent copy will remain thus accessible at the stated location -until at least one year after the last time you distribute an Opaque -copy (directly or through your agents or retailers) of that edition to -the public. - -It is requested, but not required, that you contact the authors of the -Document well before redistributing any large number of copies, to give -them a chance to provide you with an updated version of the Document. - - -4. MODIFICATIONS - -You may copy and distribute a Modified Version of the Document under -the conditions of sections 2 and 3 above, provided that you release -the Modified Version under precisely this License, with the Modified -Version filling the role of the Document, thus licensing distribution -and modification of the Modified Version to whoever possesses a copy -of it. In addition, you must do these things in the Modified Version: - -A. Use in the Title Page (and on the covers, if any) a title distinct - from that of the Document, and from those of previous versions - (which should, if there were any, be listed in the History section - of the Document). You may use the same title as a previous version - if the original publisher of that version gives permission. -B. List on the Title Page, as authors, one or more persons or entities - responsible for authorship of the modifications in the Modified - Version, together with at least five of the principal authors of the - Document (all of its principal authors, if it has less than five). -C. State on the Title page the name of the publisher of the - Modified Version, as the publisher. -D. Preserve all the copyright notices of the Document. -E. Add an appropriate copyright notice for your modifications - adjacent to the other copyright notices. -F. Include, immediately after the copyright notices, a license notice - giving the public permission to use the Modified Version under the - terms of this License, in the form shown in the Addendum below. -G. Preserve in that license notice the full lists of Invariant Sections - and required Cover Texts given in the Document's license notice. -H. Include an unaltered copy of this License. -I. Preserve the section entitled "History", and its title, and add to - it an item stating at least the title, year, new authors, and - publisher of the Modified Version as given on the Title Page. If - there is no section entitled "History" in the Document, create one - stating the title, year, authors, and publisher of the Document as - given on its Title Page, then add an item describing the Modified - Version as stated in the previous sentence. -J. Preserve the network location, if any, given in the Document for - public access to a Transparent copy of the Document, and likewise - the network locations given in the Document for previous versions - it was based on. These may be placed in the "History" section. - You may omit a network location for a work that was published at - least four years before the Document itself, or if the original - publisher of the version it refers to gives permission. -K. In any section entitled "Acknowledgements" or "Dedications", - preserve the section's title, and preserve in the section all the - substance and tone of each of the contributor acknowledgements - and/or dedications given therein. -L. Preserve all the Invariant Sections of the Document, - unaltered in their text and in their titles. Section numbers - or the equivalent are not considered part of the section titles. -M. Delete any section entitled "Endorsements". Such a section - may not be included in the Modified Version. -N. Do not retitle any existing section as "Endorsements" - or to conflict in title with any Invariant Section. - -If the Modified Version includes new front-matter sections or -appendices that qualify as Secondary Sections and contain no material -copied from the Document, you may at your option designate some or all -of these sections as invariant. To do this, add their titles to the -list of Invariant Sections in the Modified Version's license notice. -These titles must be distinct from any other section titles. - -You may add a section entitled "Endorsements", provided it contains -nothing but endorsements of your Modified Version by various -parties--for example, statements of peer review or that the text has -been approved by an organization as the authoritative definition of a -standard. - -You may add a passage of up to five words as a Front-Cover Text, and a -passage of up to 25 words as a Back-Cover Text, to the end of the list -of Cover Texts in the Modified Version. Only one passage of -Front-Cover Text and one of Back-Cover Text may be added by (or -through arrangements made by) any one entity. If the Document already -includes a cover text for the same cover, previously added by you or -by arrangement made by the same entity you are acting on behalf of, -you may not add another; but you may replace the old one, on explicit -permission from the previous publisher that added the old one. - -The author(s) and publisher(s) of the Document do not by this License -give permission to use their names for publicity for or to assert or -imply endorsement of any Modified Version. - - -5. COMBINING DOCUMENTS - -You may combine the Document with other documents released under this -License, under the terms defined in section 4 above for modified -versions, provided that you include in the combination all of the -Invariant Sections of all of the original documents, unmodified, and -list them all as Invariant Sections of your combined work in its -license notice. - -The combined work need only contain one copy of this License, and -multiple identical Invariant Sections may be replaced with a single -copy. If there are multiple Invariant Sections with the same name but -different contents, make the title of each such section unique by -adding at the end of it, in parentheses, the name of the original -author or publisher of that section if known, or else a unique number. -Make the same adjustment to the section titles in the list of -Invariant Sections in the license notice of the combined work. - -In the combination, you must combine any sections entitled "History" -in the various original documents, forming one section entitled -"History"; likewise combine any sections entitled "Acknowledgements", -and any sections entitled "Dedications". You must delete all sections -entitled "Endorsements." - - -6. COLLECTIONS OF DOCUMENTS - -You may make a collection consisting of the Document and other documents -released under this License, and replace the individual copies of this -License in the various documents with a single copy that is included in -the collection, provided that you follow the rules of this License for -verbatim copying of each of the documents in all other respects. - -You may extract a single document from such a collection, and distribute -it individually under this License, provided you insert a copy of this -License into the extracted document, and follow this License in all -other respects regarding verbatim copying of that document. - - -7. AGGREGATION WITH INDEPENDENT WORKS - -A compilation of the Document or its derivatives with other separate -and independent documents or works, in or on a volume of a storage or -distribution medium, does not as a whole count as a Modified Version -of the Document, provided no compilation copyright is claimed for the -compilation. Such a compilation is called an "aggregate", and this -License does not apply to the other self-contained works thus compiled -with the Document, on account of their being thus compiled, if they -are not themselves derivative works of the Document. - -If the Cover Text requirement of section 3 is applicable to these -copies of the Document, then if the Document is less than one quarter -of the entire aggregate, the Document's Cover Texts may be placed on -covers that surround only the Document within the aggregate. -Otherwise they must appear on covers around the whole aggregate. - - -8. TRANSLATION - -Translation is considered a kind of modification, so you may -distribute translations of the Document under the terms of section 4. -Replacing Invariant Sections with translations requires special -permission from their copyright holders, but you may include -translations of some or all Invariant Sections in addition to the -original versions of these Invariant Sections. You may include a -translation of this License provided that you also include the -original English version of this License. In case of a disagreement -between the translation and the original English version of this -License, the original English version will prevail. - - -9. TERMINATION - -You may not copy, modify, sublicense, or distribute the Document except -as expressly provided for under this License. Any other attempt to -copy, modify, sublicense or distribute the Document is void, and will -automatically terminate your rights under this License. However, -parties who have received copies, or rights, from you under this -License will not have their licenses terminated so long as such -parties remain in full compliance. - - -10. FUTURE REVISIONS OF THIS LICENSE - -The Free Software Foundation may publish new, revised versions -of the GNU Free Documentation License from time to time. Such new -versions will be similar in spirit to the present version, but may -differ in detail to address new problems or concerns. See -http://www.gnu.org/copyleft/. - -Each version of the License is given a distinguishing version number. -If the Document specifies that a particular numbered version of this -License "or any later version" applies to it, you have the option of -following the terms and conditions either of that specified version or -of any later version that has been published (not as a draft) by the -Free Software Foundation. If the Document does not specify a version -number of this License, you may choose any version ever published (not -as a draft) by the Free Software Foundation. - - -ADDENDUM: How to use this License for your documents - -To use this License in a document you have written, include a copy of -the License in the document and put the following copyright and -license notices just after the title page: - - Copyright (c) YEAR YOUR NAME. - Permission is granted to copy, distribute and/or modify this document - under the terms of the GNU Free Documentation License, Version 1.1 - or any later version published by the Free Software Foundation; - with the Invariant Sections being LIST THEIR TITLES, with the - Front-Cover Texts being LIST, and with the Back-Cover Texts being LIST. - A copy of the license is included in the section entitled "GNU - Free Documentation License". - -If you have no Invariant Sections, write "with no Invariant Sections" -instead of saying which ones are invariant. If you have no -Front-Cover Texts, write "no Front-Cover Texts" instead of -"Front-Cover Texts being LIST"; likewise for Back-Cover Texts. - -If your document contains nontrivial examples of program code, we -recommend releasing these examples in parallel under your choice of -free software license, such as the GNU General Public License, -to permit their use in free software. diff --git a/libstdc++-v3/docs/html/17_intro/DESIGN b/libstdc++-v3/docs/html/17_intro/DESIGN deleted file mode 100644 index 5af3d9aed3b..00000000000 --- a/libstdc++-v3/docs/html/17_intro/DESIGN +++ /dev/null @@ -1,859 +0,0 @@ - -Standard C++ Library Design Document ------------------------------------- - -This is an overview of libstdc++-v3, with particular attention -to projects to be done and how they fit into the whole. - -The Library ------------ - -This paper is covers two major areas: - - - Features and policies not mentioned in the standard that - the quality of the library implementation depends on, including - extensions and "implementation-defined" features; - - - Plans for required but unimplemented library features and - optimizations to them. - -Overhead --------- - -The standard defines a large library, much larger than the standard -C library. A naive implementation would suffer substantial overhead -in compile time, executable size, and speed, rendering it unusable -in many (particularly embedded) applications. The alternative demands -care in construction, and some compiler support, but there is no -need for library subsets. - -What are the sources of this overhead? There are four main causes: - - - The library is specified almost entirely as templates, which - with current compilers must be included in-line, resulting in - very slow builds as tens or hundreds of thousands of lines - of function definitions are read for each user source file. - Indeed, the entire SGI STL, as well as the dos Reis valarray, - are provided purely as header files, largely for simplicity in - porting. Iostream/locale is (or will be) as large again. - - - The library is very flexible, specifying a multitude of hooks - where users can insert their own code in place of defaults. - When these hooks are not used, any time and code expended to - support that flexibility is wasted. - - - Templates are often described as causing to "code bloat". In - practice, this refers (when it refers to anything real) to several - independent processes. First, when a class template is manually - instantiated in its entirely, current compilers place the definitions - for all members in a single object file, so that a program linking - to one member gets definitions of all. Second, template functions - which do not actually depend on the template argument are, under - current compilers, generated anew for each instantiation, rather - than being shared with other instantiations. Third, some of the - flexibility mentioned above comes from virtual functions (both in - regular classes and template classes) which current linkers add - to the executable file even when they manifestly cannot be called. - - - The library is specified to use a language feature, exceptions, - which in the current gcc compiler ABI imposes a run time and - code space cost to handle the possibility of exceptions even when - they are not used. Under the new ABI (accessed with -fnew-abi), - there is a space overhead and a small reduction in code efficiency - resulting from lost optimization opportunities associated with - non-local branches associated with exceptions. - -What can be done to eliminate this overhead? A variety of coding -techniques, and compiler, linker and library improvements and -extensions may be used, as covered below. Most are not difficult, -and some are already implemented in varying degrees. - -Overhead: Compilation Time --------------------------- - -Providing "ready-instantiated" template code in object code archives -allows us to avoid generating and optimizing template instantiations -in each compilation unit which uses them. However, the number of such -instantiations that are useful to provide is limited, and anyway this -is not enough, by itself, to minimize compilation time. In particular, -it does not reduce time spent parsing conforming headers. - -Quicker header parsing will depend on library extensions and compiler -improvements. One approach is some variation on the techniques -previously marketed as "pre-compiled headers", now standardized as -support for the "export" keyword. "Exported" template definitions -can be placed (once) in a "repository" -- really just a library, but -of template definitions rather than object code -- to be drawn upon -at link time when an instantiation is needed, rather than placed in -header files to be parsed along with every compilation unit. - -Until "export" is implemented we can put some of the lengthy template -definitions in #if guards or alternative headers so that users can skip -over the the full definitions when they need only the ready-instantiated -specializations. - -To be precise, this means that certain headers which define -templates which users normally use only for certain arguments -can be instrumented to avoid exposing the template definitions -to the compiler unless a macro is defined. For example, in -, we might have: - - template class basic_string { - ... // member declarations - }; - ... // operator declarations - - #ifdef _STRICT_ISO_ - # if _G_NO_TEMPLATE_EXPORT - # include // headers needed by definitions - # ... - # include // member and global template definitions. - # endif - #endif - -Users who compile without specifying a strict-ISO-conforming flag -would not see many of the template definitions they now see, and rely -instead on ready-instantiated specializations in the library. This -technique would be useful for the following substantial components: -string, locale/iostreams, valarray. It would *not* be useful or -usable with the following: containers, algorithms, iterators, -allocator. Since these constitute a large (though decreasing) -fraction of the library, the benefit the technique offers is -limited. - -The language specifies the semantics of the "export" keyword, but -the gcc compiler does not yet support it. When it does, problems -with large template inclusions can largely disappear, given some -minor library reorganization, along with the need for the apparatus -described above. - -Overhead: Flexibility Cost --------------------------- - -The library offers many places where users can specify operations -to be performed by the library in place of defaults. Sometimes -this seems to require that the library use a more-roundabout, and -possibly slower, way to accomplish the default requirements than -would be used otherwise. - -The primary protection against this overhead is thorough compiler -optimization, to crush out layers of inline function interfaces. -Kuck & Associates has demonstrated the practicality of this kind -of optimization. - -The second line of defense against this overhead is explicit -specialization. By defining helper function templates, and writing -specialized code for the default case, overhead can be eliminated -for that case without sacrificing flexibility. This takes full -advantage of any ability of the optimizer to crush out degenerate -code. - -The library specifies many virtual functions which current linkers -load even when they cannot be called. Some minor improvements to the -compiler and to ld would eliminate any such overhead by simply -omitting virtual functions that the complete program does not call. -A prototype of this work has already been done. For targets where -GNU ld is not used, a "pre-linker" could do the same job. - -The main areas in the standard interface where user flexibility -can result in overhead are: - - - Allocators: Containers are specified to use user-definable - allocator types and objects, making tuning for the container - characteristics tricky. - - - Locales: the standard specifies locale objects used to implement - iostream operations, involving many virtual functions which use - streambuf iterators. - - - Algorithms and containers: these may be instantiated on any type, - frequently duplicating code for identical operations. - - - Iostreams and strings: users are permitted to use these on their - own types, and specify the operations the stream must use on these - types. - -Note that these sources of overhead are _avoidable_. The techniques -to avoid them are covered below. - -Code Bloat ----------- - -In the SGI STL, and in some other headers, many of the templates -are defined "inline" -- either explicitly or by their placement -in class definitions -- which should not be inline. This is a -source of code bloat. Matt had remarked that he was relying on -the compiler to recognize what was too big to benefit from inlining, -and generate it out-of-line automatically. However, this also can -result in code bloat except where the linker can eliminate the extra -copies. - -Fixing these cases will require an audit of all inline functions -defined in the library to determine which merit inlining, and moving -the rest out of line. This is an issue mainly in chapters 23, 25, and -27. Of course it can be done incrementally, and we should generally -accept patches that move large functions out of line and into ".tcc" -files, which can later be pulled into a repository. Compiler/linker -improvements to recognize very large inline functions and move them -out-of-line, but shared among compilation units, could make this -work unnecessary. - -Pre-instantiating template specializations currently produces large -amounts of dead code which bloats statically linked programs. The -current state of the static library, libstdc++.a, is intolerable on -this account, and will fuel further confused speculation about a need -for a library "subset". A compiler improvement that treats each -instantiated function as a separate object file, for linking purposes, -would be one solution to this problem. An alternative would be to -split up the manual instantiation files into dozens upon dozens of -little files, each compiled separately, but an abortive attempt at -this was done for and, though it is far from complete, it -is already a nuisance. A better interim solution (just until we have -"export") is badly needed. - -When building a shared library, the current compiler/linker cannot -automatically generate the instantiatiations needed. This creates a -miserable situation; it means any time something is changed in the -library, before a shared library can be built someone must manually -copy the declarations of all templates that are needed by other parts -of the library to an "instantiation" file, and add it to the build -system to be compiled and linked to the library. This process is -readily automated, and should be automated as soon as possible. -Users building their own shared libraries experience identical -frustrations. - -Sharing common aspects of template definitions among instantiations -can radically reduce code bloat. The compiler could help a great -deal here by recognizing when a function depends on nothing about -a template parameter, or only on its size, and giving the resulting -function a link-name "equate" that allows it to be shared with other -instantiations. Implementation code could take advantage of the -capability by factoring out code that does not depend on the template -argument into separate functions to be merged by the compiler. - -Until such a compiler optimization is implemented, much can be done -manually (if tediously) in this direction. One such optimization is -to derive class templates from non-template classes, and move as much -implementation as possible into the base class. Another is to partial- -specialize certain common instantiations, such as vector, to share -code for instantiations on all types T. While these techniques work, -they are far from the complete solution that a compiler improvement -would afford. - -Overhead: Expensive Language Features -------------------------------------- - -The main "expensive" language feature used in the standard library -is exception support, which requires compiling in cleanup code with -static table data to locate it, and linking in library code to use -the table. For small embedded programs the amount of such library -code and table data is assumed by some to be excessive. Under the -"new" ABI this perception is generally exaggerated, although in some -cases it may actually be excessive. - -To implement a library which does not use exceptions directly is -not difficult given minor compiler support (to "turn off" exceptions -and ignore exception constructs), and results in no great library -maintenance difficulties. To be precise, given "-fno-exceptions", -the compiler should treat "try" blocks as ordinary blocks, and -"catch" blocks as dead code to ignore or eliminate. Compiler -support is not strictly necessary, except in the case of "function -try blocks"; otherwise the following macros almost suffice: - - #define throw(X) - #define try if (true) - #define catch(X) else if (false) - -However, there may be a need to use function try blocks in the -library implementation, and use of macros in this way can make -correct diagnostics impossible. Furthermore, use of this scheme -would require the library to call a function to re-throw exceptions -from a try block. Implementing the above semantics in the compiler -is preferable. - -Given the support above (however implemented) it only remains to -replace code that "throws" with a call to a well-documented "handler" -function in a separate compilation unit which may be replaced by -the user. The main source of exceptions that would be difficult -for users to avoid is memory allocation failures, but users can -define their own memory allocation primitives that never throw. -Otherwise, the complete list of such handlers, and which library -functions may call them, would be needed for users to be able to -implement the necessary substitutes. (Fortunately, they have the -source code.) - -Opportunities -------------- - -The template capabilities of C++ offer enormous opportunities for -optimizing common library operations, well beyond what would be -considered "eliminating overhead". In particular, many operations -done in Glibc with macros that depend on proprietary language -extensions can be implemented in pristine Standard C++. For example, -the chapter 25 algorithms, and even C library functions such as strchr, -can be specialized for the case of static arrays of known (small) size. - -Detailed optimization opportunities are identified below where -the component where they would appear is discussed. Of course new -opportunities will be identified during implementation. - -Unimplemented Required Library Features ---------------------------------------- - -The standard specifies hundreds of components, grouped broadly by -chapter. These are listed in excruciating detail in the CHECKLIST -file. - - 17 general - 18 support - 19 diagnostics - 20 utilities - 21 string - 22 locale - 23 containers - 24 iterators - 25 algorithms - 26 numerics - 27 iostreams - Annex D backward compatibility - -Anyone participating in implementation of the library should obtain -a copy of the standard, ISO 14882. People in the U.S. can obtain an -electronic copy for US$18 from ANSI's web site. Those from other -countries should visit http://www.iso.ch/ to find out the location -of their country's representation in ISO, in order to know who can -sell them a copy. - -The emphasis in the following sections is on unimplemented features -and optimization opportunities. - -Chapter 17 General -------------------- - -Chapter 17 concerns overall library requirements. - -The standard doesn't mention threads. A multi-thread (MT) extension -primarily affects operators new and delete (18), allocator (20), -string (21), locale (22), and iostreams (27). The common underlying -support needed for this is discussed under chapter 20. - -The standard requirements on names from the C headers create a -lot of work, mostly done. Names in the C headers must be visible -in the std:: and sometimes the global namespace; the names in the -two scopes must refer to the same object. More stringent is that -Koenig lookup implies that any types specified as defined in std:: -really are defined in std::. Names optionally implemented as -macros in C cannot be macros in C++. (An overview may be read at -). The scripts "inclosure" -and "mkcshadow", and the directories shadow/ and cshadow/, are the -beginning of an effort to conform in this area. - -A correct conforming definition of C header names based on underlying -C library headers, and practical linking of conforming namespaced -customer code with third-party C libraries depends ultimately on -an ABI change, allowing namespaced C type names to be mangled into -type names as if they were global, somewhat as C function names in a -namespace, or C++ global variable names, are left unmangled. Perhaps -another "extern" mode, such as 'extern "C-global"' would be an -appropriate place for such type definitions. Such a type would -affect mangling as follows: - - namespace A { - struct X {}; - extern "C-global" { // or maybe just 'extern "C"' - struct Y {}; - }; - } - void f(A::X*); // mangles to f__FPQ21A1X - void f(A::Y*); // mangles to f__FP1Y - -(It may be that this is really the appropriate semantics for regular -'extern "C"', and 'extern "C-global"', as an extension, would not be -necessary.) This would allow functions declared in non-standard C headers -(and thus fixable by neither us nor users) to link properly with functions -declared using C types defined in properly-namespaced headers. The -problem this solves is that C headers (which C++ programmers do persist -in using) frequently forward-declare C struct tags without including -the header where the type is defined, as in - - struct tm; - void munge(tm*); - -Without some compiler accommodation, munge cannot be called by correct -C++ code using a pointer to a correctly-scoped tm* value. - -The current C headers use the preprocessor extension "#include_next", -which the compiler complains about when run "-pedantic". -(Incidentally, it appears that "-fpedantic" is currently ignored, -probably a bug.) The solution in the C compiler is to use -"-isystem" rather than "-I", but unfortunately in g++ this seems -also to wrap the whole header in an 'extern "C"' block, so it's -unusable for C++ headers. The correct solution appears to be to -allow the various special include-directory options, if not given -an argument, to affect subsequent include-directory options additively, -so that if one said - - -pedantic -iprefix $(prefix) \ - -idirafter -ino-pedantic -ino-extern-c -iwithprefix -I g++-v3 \ - -iwithprefix -I g++-v3/ext - -the compiler would search $(prefix)/g++-v3 and not report -pedantic warnings for files found there, but treat files in -$(prefix)/g++-v3/ext pedantically. (The undocumented semantics -of "-isystem" in g++ stink. Can they be rescinded? If not it -must be replaced with something more rationally behaved.) - -All the C headers need the treatment above; in the standard these -headers are mentioned in various chapters. Below, I have only -mentioned those that present interesting implementation issues. - -The components identified as "mostly complete", below, have not been -audited for conformance. In many cases where the library passes -conformance tests we have non-conforming extensions that must be -wrapped in #if guards for "pedantic" use, and in some cases renamed -in a conforming way for continued use in the implementation regardless -of conformance flags. - -The STL portion of the library still depends on a header -stl/bits/stl_config.h full of #ifdef clauses. This apparatus -should be replaced with autoconf/automake machinery. - -The SGI STL defines a type_traits<> template, specialized for -many types in their code including the built-in numeric and -pointer types and some library types, to direct optimizations of -standard functions. The SGI compiler has been extended to generate -specializations of this template automatically for user types, -so that use of STL templates on user types can take advantage of -these optimizations. Specializations for other, non-STL, types -would make more optimizations possible, but extending the gcc -compiler in the same way would be much better. Probably the next -round of standardization will ratify this, but probably with -changes, so it probably should be renamed to place it in the -implementation namespace. - -The SGI STL also defines a large number of extensions visible in -standard headers. (Other extensions that appear in separate headers -have been sequestered in subdirectories ext/ and backward/.) All -these extensions should be moved to other headers where possible, -and in any case wrapped in a namespace (not std!), and (where kept -in a standard header) girded about with macro guards. Some cannot be -moved out of standard headers because they are used to implement -standard features. The canonical method for accommodating these -is to use a protected name, aliased in macro guards to a user-space -name. Unfortunately C++ offers no satisfactory template typedef -mechanism, so very ad-hoc and unsatisfactory aliasing must be used -instead. - -Implementation of a template typedef mechanism should have the highest -priority among possible extensions, on the same level as implementation -of the template "export" feature. - -Chapter 18 Language support ----------------------------- - -Headers: -C headers: - (also 21, 25, 26) - -This defines the built-in exceptions, rtti, numeric_limits<>, -operator new and delete. Much of this is provided by the -compiler in its static runtime library. - -Work to do includes defining numeric_limits<> specializations in -separate files for all target architectures. Values for integer types -except for bool and wchar_t are readily obtained from the C header -, but values for the remaining numeric types (bool, wchar_t, -float, double, long double) must be entered manually. This is -largely dog work except for those members whose values are not -easily deduced from available documentation. Also, this involves -some work in target configuration to identify the correct choice of -file to build against and to install. - -The definitions of the various operators new and delete must be -made thread-safe, which depends on a portable exclusion mechanism, -discussed under chapter 20. Of course there is always plenty of -room for improvements to the speed of operators new and delete. - -, in Glibc, defines some macros that gcc does not allow to -be wrapped into an inline function. Probably this header will demand -attention whenever a new target is chosen. The functions atexit(), -exit(), and abort() in cstdlib have different semantics in C++, so -must be re-implemented for C++. - -Chapter 19 Diagnostics ------------------------ - -Headers: -C headers: - -This defines the standard exception objects, which are "mostly complete". -Cygnus has a version, and now SGI provides a slightly different one. -It makes little difference which we use. - -The C global name "errno", which C allows to be a variable or a macro, -is required in C++ to be a macro. For MT it must typically result in -a function call. - -Chapter 20 Utilities ---------------------- -Headers: -C header: (also in 18) - -SGI STL provides "mostly complete" versions of all the components -defined in this chapter. However, the auto_ptr<> implementation -is known to be wrong. Furthermore, the standard definition of it -is known to be unimplementable as written. A minor change to the -standard would fix it, and auto_ptr<> should be adjusted to match. - -Multi-threading affects the allocator implementation, and there must -be configuration/installation choices for different users' MT -requirements. Anyway, users will want to tune allocator options -to support different target conditions, MT or no. - -The primitives used for MT implementation should be exposed, as an -extension, for users' own work. We need cross-CPU "mutex" support, -multi-processor shared-memory atomic integer operations, and single- -processor uninterruptible integer operations, and all three configurable -to be stubbed out for non-MT use, or to use an appropriately-loaded -dynamic library for the actual runtime environment, or statically -compiled in for cases where the target architecture is known. - -Chapter 21 String ------------------- -Headers: -C headers: (also in 27) - (also in 18, 25, 26) - -We have "mostly-complete" char_traits<> implementations. Many of the -char_traits operations might be optimized further using existing -proprietary language extensions. - -We have a "mostly-complete" basic_string<> implementation. The work -to manually instantiate char and wchar_t specializations in object -files to improve link-time behavior is extremely unsatisfactory, -literally tripling library-build time with no commensurate improvement -in static program link sizes. It must be redone. (Similar work is -needed for some components in chapters 22 and 27.) - -Other work needed for strings is MT-safety, as discussed under the -chapter 20 heading. - -The standard C type mbstate_t from and used in char_traits<> -must be different in C++ than in C, because in C++ the default constructor -value mbstate_t() must be the "base" or "ground" sequence state. -(According to the likely resolution of a recently raised Core issue, -this may become unnecessary. However, there are other reasons to -use a state type not as limited as whatever the C library provides.) -If we might want to provide conversions from (e.g.) internally- -represented EUC-wide to externally-represented Unicode, or vice- -versa, the mbstate_t we choose will need to be more accommodating -than what might be provided by an underlying C library. - -There remain some basic_string template-member functions which do -not overload properly with their non-template brethren. The infamous -hack akin to what was done in vector<> is needed, to conform to -23.1.1 para 10. The CHECKLIST items for basic_string marked 'X', -or incomplete, are so marked for this reason. - -Replacing the string iterators, which currently are simple character -pointers, with class objects would greatly increase the safety of the -client interface, and also permit a "debug" mode in which range, -ownership, and validity are rigorously checked. The current use of -raw pointers as string iterators is evil. vector<> iterators need the -same treatment. Note that the current implementation freely mixes -pointers and iterators, and that must be fixed before safer iterators -can be introduced. - -Some of the functions in are different from the C version. -generally overloaded on const and non-const argument pointers. For -example, in strchr is overloaded. The functions isupper -etc. in typically implemented as macros in C are functions -in C++, because they are overloaded with others of the same name -defined in . - -Many of the functions required in and cannot be -implemented using underlying C facilities on intended targets because -such facilities only partly exist. - -Chapter 22 Locale ------------------- -Headers: -C headers: - -We have a "mostly complete" class locale, with the exception of -code for constructing, and handling the names of, named locales. -The ways that locales are named (particularly when categories -(e.g. LC_TIME, LC_COLLATE) are different) varies among all target -environments. This code must be written in various versions and -chosen by configuration parameters. - -Members of many of the facets defined in are stubs. Generally, -there are two sets of facets: the base class facets (which are supposed -to implement the "C" locale) and the "byname" facets, which are supposed -to read files to determine their behavior. The base ctype<>, collate<>, -and numpunct<> facets are "mostly complete", except that the table of -bitmask values used for "is" operations, and corresponding mask values, -are still defined in libio and just included/linked. (We will need to -implement these tables independently, soon, but should take advantage -of libio where possible.) The num_put<>::put members for integer types -are "mostly complete". - -A complete list of what has and has not been implemented may be -found in CHECKLIST. However, note that the current definition of -codecvt is wrong. It should simply write -out the raw bytes representing the wide characters, rather than -trying to convert each to a corresponding single "char" value. - -Some of the facets are more important than others. Specifically, -the members of ctype<>, numpunct<>, num_put<>, and num_get<> facets -are used by other library facilities defined in , , -and , and the codecvt<> facet is used by basic_filebuf<> -in , so a conforming iostream implementation depends on -these. - -The "long long" type eventually must be supported, but code mentioning -it should be wrapped in #if guards to allow pedantic-mode compiling. - -Performance of num_put<> and num_get<> depend critically on -caching computed values in ios_base objects, and on extensions -to the interface with streambufs. - -Specifically: retrieving a copy of the locale object, extracting -the needed facets, and gathering data from them, for each call to -(e.g.) operator<< would be prohibitively slow. To cache format -data for use by num_put<> and num_get<> we have a _Format_cache<> -object stored in the ios_base::pword() array. This is constructed -and initialized lazily, and is organized purely for utility. It -is discarded when a new locale with different facets is imbued. - -Using only the public interfaces of the iterator arguments to the -facet functions would limit performance by forbidding "vector-style" -character operations. The streambuf iterator optimizations are -described under chapter 24, but facets can also bypass the streambuf -iterators via explicit specializations and operate directly on the -streambufs, and use extended interfaces to get direct access to the -streambuf internal buffer arrays. These extensions are mentioned -under chapter 27. These optimizations are particularly important -for input parsing. - -Unused virtual members of locale facets can be omitted, as mentioned -above, by a smart linker. - -Chapter 23 Containers ----------------------- -Headers: - -All the components in chapter 23 are implemented in the SGI STL. -They are "mostly complete"; they include a large number of -nonconforming extensions which must be wrapped. Some of these -are used internally and must be renamed or duplicated. - -The SGI components are optimized for large-memory environments. For -embedded targets, different criteria might be more appropriate. Users -will want to be able to tune this behavior. We should provide -ways for users to compile the library with different memory usage -characteristics. - -A lot more work is needed on factoring out common code from different -specializations to reduce code size here and in chapter 25. The -easiest fix for this would be a compiler/ABI improvement that allows -the compiler to recognize when a specialization depends only on the -size (or other gross quality) of a template argument, and allow the -linker to share the code with similar specializations. In its -absence, many of the algorithms and containers can be partial- -specialized, at least for the case of pointers, but this only solves -a small part of the problem. Use of a type_traits-style template -allows a few more optimization opportunities, more if the compiler -can generate the specializations automatically. - -As an optimization, containers can specialize on the default allocator -and bypass it, or take advantage of details of its implementation -after it has been improved upon. - -Replacing the vector iterators, which currently are simple element -pointers, with class objects would greatly increase the safety of the -client interface, and also permit a "debug" mode in which range, -ownership, and validity are rigorously checked. The current use of -pointers for iterators is evil. - -As mentioned for chapter 24, the deque iterator is a good example of -an opportunity to implement a "staged" iterator that would benefit -from specializations of some algorithms. - -Chapter 24 Iterators ---------------------- -Headers: - -Standard iterators are "mostly complete", with the exception of -the stream iterators, which are not yet templatized on the -stream type. Also, the base class template iterator<> appears -to be wrong, so everything derived from it must also be wrong, -currently. - -The streambuf iterators (currently located in stl/bits/std_iterator.h, -but should be under bits/) can be rewritten to take advantage of -friendship with the streambuf implementation. - -Matt Austern has identified opportunities where certain iterator -types, particularly including streambuf iterators and deque -iterators, have a "two-stage" quality, such that an intermediate -limit can be checked much more quickly than the true limit on -range operations. If identified with a member of iterator_traits, -algorithms may be specialized for this case. Of course the -iterators that have this quality can be identified by specializing -a traits class. - -Many of the algorithms must be specialized for the streambuf -iterators, to take advantage of block-mode operations, in order -to allow iostream/locale operations' performance not to suffer. -It may be that they could be treated as staged iterators and -take advantage of those optimizations. - -Chapter 25 Algorithms ----------------------- -Headers: -C headers: (also in 18, 21, 26)) - -The algorithms are "mostly complete". As mentioned above, they -are optimized for speed at the expense of code and data size. - -Specializations of many of the algorithms for non-STL types would -give performance improvements, but we must use great care not to -interfere with fragile template overloading semantics for the -standard interfaces. Conventionally the standard function template -interface is an inline which delegates to a non-standard function -which is then overloaded (this is already done in many places in -the library). Particularly appealing opportunities for the sake of -iostream performance are for copy and find applied to streambuf -iterators or (as noted elsewhere) for staged iterators, of which -the streambuf iterators are a good example. - -The bsearch and qsort functions cannot be overloaded properly as -required by the standard because gcc does not yet allow overloading -on the extern-"C"-ness of a function pointer. - -Chapter 26 Numerics --------------------- -Headers: -C headers: , (also 18, 21, 25) - -Numeric components: Gabriel dos Reis's valarray, Drepper's complex, -and the few algorithms from the STL are "mostly done". Of course -optimization opportunities abound for the numerically literate. It -is not clear whether the valarray implementation really conforms -fully, in the assumptions it makes about aliasing (and lack thereof) -in its arguments. - -The C div() and ldiv() functions are interesting, because they are the -only case where a C library function returns a class object by value. -Since the C++ type div_t must be different from the underlying C type -(which is in the wrong namespace) the underlying functions div() and -ldiv() cannot be re-used efficiently. Fortunately they are trivial to -re-implement. - -Chapter 27 Iostreams ---------------------- -Headers: - -C headers: (also in 21) - -Iostream is currently in a very incomplete state. , , -ios_base, and basic_ios<> are "mostly complete". basic_streambuf<> and -basic_ostream<> are well along, but basic_istream<> has had little work -done. The standard stream objects, and have been -started; basic_filebuf<> "write" functions have been implemented just -enough to do "hello, world". - -Most of the istream and ostream operators << and >> (with the exception -of the op<<(integer) ones) have not been changed to use locale primitives, -sentry objects, or char_traits members. - -All these templates should be manually instantiated for char and -wchar_t in a way that links only used members into user programs. - -Streambuf is fertile ground for optimization extensions. An extended -interface giving iterator access to its internal buffer would be very -useful for other library components. - -Iostream operations (primarily operators << and >>) can take advantage -of the case where user code has not specified a locale, and bypass locale -operations entirely. The current implementation of op<::put, -for the integer types, demonstrates how they can cache encoding details -from the locale on each operation. There is lots more room for -optimization in this area. - -The definition of the relationship between the standard streams -cout et al. and stdout et al. requires something like a "stdiobuf". -The SGI solution of using double-indirection to actually use a -stdio FILE object for buffering is unsatisfactory, because it -interferes with peephole loop optimizations. - -The header work has begun. stringbuf can benefit from -friendship with basic_string<> and basic_string<>::_Rep to use -those objects directly as buffers, and avoid allocating and making -copies. - -The basic_filebuf<> template is a complex beast. It is specified to -use the locale facet codecvt<> to translate characters between native -files and the locale character encoding. In general this involves -two buffers, one of "char" representing the file and another of -"char_type", for the stream, with codecvt<> translating. The process -is complicated by the variable-length nature of the translation, and -the need to seek to corresponding places in the two representations. -For the case of basic_filebuf, when no translation is needed, -a single buffer suffices. A specialized filebuf can be used to reduce -code space overhead when no locale has been imbued. Matt Austern's -work at SGI will be useful, perhaps directly as a source of code, or -at least as an example to draw on. - -Filebuf, almost uniquely (cf. operator new), depends heavily on -underlying environmental facilities. In current releases iostream -depends fairly heavily on libio constant definitions, but it should -be made independent. It also depends on operating system primitives -for file operations. There is immense room for optimizations using -(e.g.) mmap for reading. The shadow/ directory wraps, besides the -standard C headers, the libio.h and unistd.h headers, for use mainly -by filebuf. These wrappings have not been completed, though there -is scaffolding in place. - -The encapulation of certain C header names presents an -interesting problem. It is possible to define an inline std::fprintf() -implemented in terms of the 'extern "C"' vfprintf(), but there is no -standard vfscanf() to use to implement std::fscanf(). It appears that -vfscanf but be re-implemented in C++ for targets where no vfscanf -extension has been defined. This is interesting in that it seems -to be the only significant case in the C library where this kind of -rewriting is necessary. (Of course Glibc provides the vfscanf() -extension.) (The functions related to exit() must be rewritten -for other reasons.) - - -Annex D -------- -Headers: - -Annex D defines many non-library features, and many minor -modifications to various headers, and a complete header. -It is "mostly done", except that the libstdc++-2 -header has not been adopted into the library, or checked to -verify that it matches the draft in those details that were -clarified by the committee. Certainly it must at least be -moved into the std namespace. - -We still need to wrap all the deprecated features in #if guards -so that pedantic compile modes can detect their use. - -Nonstandard Extensions ----------------------- -Headers: - (etc.) - -User code has come to depend on a variety of nonstandard components -that we must not omit. Much of this code can be adopted from -libstdc++-v2 or from the SGI STL. This particularly includes -, , and various SGI extensions such -as . Many of these are already placed in the -subdirectories ext/ and backward/. (Note that it is better to -include them via "" or "" than -to search the subdirectory itself via a "-I" directive. - diff --git a/libstdc++-v3/docs/html/17_intro/TODO b/libstdc++-v3/docs/html/17_intro/TODO deleted file mode 100644 index a0a257c4876..00000000000 --- a/libstdc++-v3/docs/html/17_intro/TODO +++ /dev/null @@ -1,164 +0,0 @@ -std::allocator - - - persistent allocator - - - shared memory allocator (use or link to boost::shmem::allocator) - -std::string - - - document __gnu_cxx::__versa_string, add new policies - (Policy-based design incorporating COW - vs. deep copy issues, MT scalability - See Andrei Alexandrescu, June 2001, C/C++ Users Journal - "Generic: A Policy-Based basic_string Implementation" - http://www.cuj.com/documents/s=7994/cujcexp1906alexandr/) - - - operator!= and utility/rel_ops operators need to be made safe with - string and vector iterator classes. basic_string::reverse_iterator may - be implemented incorrectly, or need things like - operator==(__normal_iterator, const char*&), and swap(vector) - - - 'do the right thing' ctor fixing needs to be done for string. This - is still subject to some debate on the library issues list, so I - suggest punting till the dust clears. - - - fix template members of basic_string<> to overload iterators and - non-iterators properly. (This is the infamous hack as in vector<> etc - 23.1.1 para 10.) - -std::locale - - - implement __convert_to_v and __convert_from_v without "C" library - functions and and LANG environment variable dependencies. - - - use localedata to implement generic named (non-MT-safe) locales? - Figure out a way to use ICU data, like libjava? Re-package and use - the glibc localedata, even if we aren't on linux? Need a generic - locale model that does something besides the "C" locale. - - - make locale::classic() separate from named locale code. This will - improve the static linkage situation, but will require new - initialization code. In particular, we need lazy-initialization of - locale::classic(), and maybe the has_facet/use_facet functions for all - the required facets. The end goal is a self-contained - locale_init.cc, or one with transitive closure without the locale - instantiations (locale-inst.cc) or the named locale bits - (localename.cc). - - - Jerry(?)/Paolo(?) work on __float_to_char. - - - minimize ctype convertion in data facets, see numpunct/num_put/num_get - -std::basic_filebuf, 27_io - - - wfilebuf, get variable-encoding working and tested, including - positioning and seeking. (I think this may be done now) - - - wfilebuf testsuite (getting there...) - - - look ahead for unbuffered io, so know when multiple putc's can be - coalesced. - - - unlocked __basic_file + new mutext class - - - optimized the sentries for istream/ostream - - - v2 vs. v3 speed - - - add optimization hooks (esp. whitespace eating) to streambuf - - add _M_begin() and _M_end() to streambuf - - add algorithm specializations for [io]streambuf_iterator (copy find etc.) - -testsuite - - - valgrind hooks into make check so can tell memory leakage - Some commentary on the valgrind users list - - - add hooks for qmtest, pychart, other for visual diffs - - - automatic testing of interactive tests - - - diffing generated output files - - - provide testsuites for numerics. - - - make check-abi needs to have full symbol checking. Scope the LSB - testsuite, see what's going on with the typeinfo etc. bits. - - - try to do a better job of ABI testing, with instantiations of all - standard-specified types checked, not just exported symbols. - -g++/binutils - - - compression for wide versions of basic types, not just narrow - -threads - - - create MT abstraction layer for atomicity to pthreads. - - - solution for threads + C++. - -other/random - -- relocations, work on getting these down - -- issues with __builtin_memcpy and std::copy from Jerry Quinn - http://gcc.gnu.org/ml/libstdc++/2003-02/msg00056.html - http://gcc.gnu.org/ml/libstdc++/2003-02/msg00302.html - http://gcc.gnu.org/ml/gcc/2003-10/msg01305.html - -- fix dependency tracking for includes (.h, .tcc) during build process. - -- coordinate with "C" library people the "C" compatibility headers. - -- Think about naming all member data and member functions consistently - as per - funtions: _M_verb_adverb - data: _M_noun_adjective - -- A C++STYLE guide that deals with nested namespaces, and that -everybody can live with. - -- exception specifications need to be reviewed for all parts of the -library support and utility areas, particularly . Part of this is -a standards issue, where the 27_io standard is really in an odd -spot. Do the work to make this consistent. - -- C-related issues WRT to io and filepos, mbstate_t. Seeking in wide -streams. May need to define operators for mbstate_t so that -'mbstate_t& == mbstate_t' is something that can be done. - -- scoping/linking issues WRT to C structs need to be worked out. See -Nathan's commentary on cantrip, http://www.cantrip.org/cheaders.html - -- auto_ptr: seems to be some disagreement on what is -standards-conformant behavior, specially on conversion operators. - -- list::assignment operator needs const_cast - -- a cleaner division between pointers-to-value_type and true iterators -needs to be drawn throughout the entire STL implementation. - -- priority_queue conversions may be non-conformant - -- Protect valarray::result_type (not Standard) and make it work with - the various helper classes. - -- Make sure `valarray & == _Expr<_BinClos,bool>' - is defined - -- All of the Library working group closed issues need to be -addressed. Some of them proposed resolutions are already in the v-3 -sources, with macro-guards. Also, same with the TR. - -- need to think about doing a .texi or DocBook manual, instead of all -these HTML pages. In addition, it would be nice to have a full manual, -instead of a lot of ad-hoc pages. Weaknesses include numerics, locale, -and io. - -- add FAQ entries -- improve the install instructions - -- add HOWTO entries - -- do more doxygen manpages - diff --git a/libstdc++-v3/docs/html/17_intro/abi.html b/libstdc++-v3/docs/html/17_intro/abi.html deleted file mode 100644 index c27de61515c..00000000000 --- a/libstdc++-v3/docs/html/17_intro/abi.html +++ /dev/null @@ -1,991 +0,0 @@ - - - - - - - - - - Standard C++ Library ABI - - - - - - -

C++ Standard Library ABI

- -

- The latest version of this document is always available at - - http://gcc.gnu.org/onlinedocs/libstdc++/abi.html. -

- -

- To the libstdc++ homepage. -

- - -
-

- The C++ interface -

- -

C++ applications often dependent on specific language support -routines, say for throwing exceptions, or catching exceptions, and -perhaps also dependent on features in the C++ Standard Library. -

- -

The C++ Standard Library has many include files, types defined in -those include files, specific named functions, and other behavior. The -text of these behaviors, as written in source include files, is called -the Application Programing Interface, or API. -

- -

Furthermore, C++ source that is compiled into object files is - transformed by the compiler: it arranges objects with specific - alignment and in a particular layout, mangling names according to a - well-defined algorithm, has specific arrangements for the support of - virtual functions, etc. These details are defined as the compiler - Application Binary Interface, or ABI. The GNU C++ compiler uses an - industry-standard C++ ABI starting with version 3. Details can be - found in the - ABI specification. -

- -

- The GNU C++ compiler, g++, has a compiler command line option to - switch between various different C++ ABIs. This explicit version - switch is the flag -fabi-version. In addition, some - g++ command line options may change the ABI as a side-effect of - use. Such flags include -fpack-struct and - -fno-exceptions, but include others: see the complete - list in the GCC manual under the heading Options - for Code Generation Conventions. -

- -

The configure options used when building a specific libstdc++ -version may also impact the resulting library ABI. The available -configure options, and their impact on the library ABI, are documented - -here. -

- -

Putting all of these ideas together results in the C++ Standard -library ABI, which is the compilation of a given library API by a -given compiler ABI. In a nutshell: -

- - library API + compiler ABI = library ABI - -

- The library ABI is mostly of interest for end-users who have - unresolved symbols and are linking dynamically to the C++ Standard - library, and who thus must be careful to compile their application - with a compiler that is compatible with the available C++ Standard - library binary. In this case, compatible is defined with the equation - above: given an application compiled with a given compiler ABI and - library API, it will work correctly with a Standard C++ Library - created with the same constraints. -

- -

- To use a specific version of the C++ ABI, one must use a - corresponding GNU C++ toolchain (Ie, g++ and libstdc++) that - implements the C++ ABI in question. -

- -

- Versioning -

- -

The C++ interface has evolved throughout the history of the GNU -C++ toolchain. With each release, various details have been changed so -as to give distinct versions to the C++ interface. -

- -
- Goals of versioning -
- -

Extending existing, stable ABIs. Versioning gives subsequent stable -releases series libraries the ability to add new symbols and add -functionality, all the while retaining backwards compatibility with -the previous releases in the series. Note: the reverse is not true. It -is not possible to take binaries linked with the latest version of a -release series (if symbols have been added) and expect the initial -release of the series to remain link compatible. -

- -

Allows multiple, incompatible ABIs to coexist at the same time. -

- -

-

- -
- Version History -
-

- How can this complexity be managed? What does C++ versioning mean? - Because library and compiler changes often make binaries compiled - with one version of the GNU tools incompatible with binaries - compiled with other (either newer or older) versions of the same GNU - tools, specific techniques are used to make managing this complexity - easier. -

- -

- The following techniques are used: -

- -
    - -
  • Release versioning on the libgcc_s.so binary. This is -implemented via file names and the ELF DT_SONAME mechanism (at least -on ELF systems).

    - -

    It is versioned as follows: -

    -
      -
    • gcc-3.0.0: libgcc_s.so.1
    • -
    • gcc-3.0.1: libgcc_s.so.1
    • -
    • gcc-3.0.2: libgcc_s.so.1
    • -
    • gcc-3.0.3: libgcc_s.so.1
    • -
    • gcc-3.0.4: libgcc_s.so.1
    • -
    • gcc-3.1.0: libgcc_s.so.1
    • -
    • gcc-3.1.1: libgcc_s.so.1
    • -
    • gcc-3.2.0: libgcc_s.so.1
    • -
    • gcc-3.2.1: libgcc_s.so.1
    • -
    • gcc-3.2.2: libgcc_s.so.1
    • -
    • gcc-3.2.3: libgcc_s.so.1
    • -
    • gcc-3.3.0: libgcc_s.so.1
    • -
    • gcc-3.3.1: libgcc_s.so.1
    • -
    • gcc-3.3.2: libgcc_s.so.1
    • -
    • gcc-3.3.3: libgcc_s.so.1
    • -
    • gcc-3.4.x, gcc-4.0.x, gcc-4.1.x, gcc-4.2.x: on m68k-linux and - hppa-linux this is either libgcc_s.so.1 (when configuring - --with-sjlj-exceptions) or libgcc_s.so.2. For all - others, this is libgcc_s.so.1.
    -

    -
  • - -
  • Symbol versioning on the libgcc_s.so binary. -

    mapfile: gcc/libgcc-std.ver

    - -

    It is versioned with the following labels and version - definitions, where the version definition is the maximum for a - particular release. Labels are cumulative. If a particular release - is not listed, it has the same version labels as the preceeding - release.

    -
      -
    • gcc-3.0.0: GCC_3.0
    • -
    • gcc-3.3.0: GCC_3.3
    • -
    • gcc-3.3.1: GCC_3.3.1
    • -
    • gcc-3.3.2: GCC_3.3.2
    • -
    • gcc-3.3.4: GCC_3.3.4
    • -
    • gcc-3.4.0: GCC_3.4
    • -
    • gcc-3.4.2: GCC_3.4.2
    • -
    • gcc-3.4.4: GCC_3.4.4
    • -
    • gcc-4.0.0: GCC_4.0.0
    • -
    • gcc-4.1.0: GCC_4.1.0
    • -
    • gcc-4.2.0: GCC_4.2.0
    • -
    -

    -
  • - -
  • Release versioning on the libstdc++.so binary, implemented in the same was as the libgcc_s.so binary, above. - -

    It is versioned as follows: -

    -
      -
    • gcc-3.0.0: libstdc++.so.3.0.0
    • -
    • gcc-3.0.1: libstdc++.so.3.0.1
    • -
    • gcc-3.0.2: libstdc++.so.3.0.2
    • -
    • gcc-3.0.3: libstdc++.so.3.0.2 (Error should be libstdc++.so.3.0.3)
    • -
    • gcc-3.0.4: libstdc++.so.3.0.4
    • -
    • gcc-3.1.0: libstdc++.so.4.0.0
    • -
    • gcc-3.1.1: libstdc++.so.4.0.1
    • -
    • gcc-3.2.0: libstdc++.so.5.0.0
    • -
    • gcc-3.2.1: libstdc++.so.5.0.1
    • -
    • gcc-3.2.2: libstdc++.so.5.0.2
    • -
    • gcc-3.2.3: libstdc++.so.5.0.3 (Not strictly required)
    • -
    • gcc-3.3.0: libstdc++.so.5.0.4
    • -
    • gcc-3.3.1: libstdc++.so.5.0.5
    • -
    • gcc-3.3.2: libstdc++.so.5.0.5
    • -
    • gcc-3.3.3: libstdc++.so.5.0.5
    • -
    • gcc-3.4.0: libstdc++.so.6.0.0
    • -
    • gcc-3.4.1: libstdc++.so.6.0.1
    • -
    • gcc-3.4.2: libstdc++.so.6.0.2
    • -
    • gcc-3.4.3: libstdc++.so.6.0.3
    • -
    • gcc-3.4.4: libstdc++.so.6.0.3
    • -
    • gcc-3.4.5: libstdc++.so.6.0.3
    • -
    • gcc-3.4.6: libstdc++.so.6.0.3
    • -
    • gcc-4.0.0: libstdc++.so.6.0.4
    • -
    • gcc-4.0.1: libstdc++.so.6.0.5
    • -
    • gcc-4.0.2: libstdc++.so.6.0.6
    • -
    • gcc-4.0.3: libstdc++.so.6.0.7
    • -
    • gcc-4.1.0: libstdc++.so.6.0.7
    • -
    • gcc-4.1.1: libstdc++.so.6.0.8
    • -
    • gcc-4.1.2: libstdc++.so.6.0.8
    • -
    • gcc-4.2.0: libstdc++.so.6.0.9
    • -
    -

    -
  • - -
  • Symbol versioning on the libstdc++.so binary. - -

    mapfile: libstdc++/config/linker-map.gnu

    -

    It is versioned with the following labels and version - definitions, where the version definition is the maximum for a - particular release. Note, only symbol which are newly introduced - will use the maximum version definition. Thus, for release series - with the same label, but incremented version definitions, the later - release has both versions. (An example of this would be the - gcc-3.2.1 release, which has GLIBCPP_3.2.1 for new symbols and - GLIBCPP_3.2 for symbols that were introduced in the gcc-3.2.0 - release.) If a particular release is not listed, it has the same - version labels as the preceeding release. -

    -
      -
    • gcc-3.0.0: (Error, not versioned)
    • -
    • gcc-3.0.1: (Error, not versioned)
    • -
    • gcc-3.0.2: (Error, not versioned)
    • -
    • gcc-3.0.3: (Error, not versioned)
    • -
    • gcc-3.0.4: (Error, not versioned)
    • -
    • gcc-3.1.0: GLIBCPP_3.1, CXXABI_1
    • -
    • gcc-3.1.1: GLIBCPP_3.1, CXXABI_1
    • -
    • gcc-3.2.0: GLIBCPP_3.2, CXXABI_1.2
    • -
    • gcc-3.2.1: GLIBCPP_3.2.1, CXXABI_1.2
    • -
    • gcc-3.2.2: GLIBCPP_3.2.2, CXXABI_1.2
    • -
    • gcc-3.2.3: GLIBCPP_3.2.2, CXXABI_1.2
    • -
    • gcc-3.3.0: GLIBCPP_3.2.2, CXXABI_1.2.1
    • -
    • gcc-3.3.1: GLIBCPP_3.2.3, CXXABI_1.2.1
    • -
    • gcc-3.3.2: GLIBCPP_3.2.3, CXXABI_1.2.1
    • -
    • gcc-3.3.3: GLIBCPP_3.2.3, CXXABI_1.2.1
    • -
    • gcc-3.4.0: GLIBCXX_3.4, CXXABI_1.3
    • -
    • gcc-3.4.1: GLIBCXX_3.4.1, CXXABI_1.3
    • -
    • gcc-3.4.2: GLIBCXX_3.4.2
    • -
    • gcc-3.4.3: GLIBCXX_3.4.3
    • -
    • gcc-4.0.0: GLIBCXX_3.4.4, CXXABI_1.3.1
    • -
    • gcc-4.0.1: GLIBCXX_3.4.5
    • -
    • gcc-4.0.2: GLIBCXX_3.4.6
    • -
    • gcc-4.0.3: GLIBCXX_3.4.7
    • -
    • gcc-4.1.1: GLIBCXX_3.4.8
    • -
    • gcc-4.2.0: GLIBCXX_3.4.9
    • -
    -

    -
  • - -
  • -

    Incremental bumping of a compiler pre-defined macro, - __GXX_ABI_VERSION. This macro is defined as the version of the - compiler v3 ABI, with g++ 3.0.x being version 100. This macro will - be automatically defined whenever g++ is used (the curious can - test this by invoking g++ with the '-v' flag.) -

    - -

    - This macro was defined in the file "lang-specs.h" in the gcc/cp directory. - Later versions defined it in "c-common.c" in the gcc directory, and from - G++ 3.4 it is defined in c-cppbuiltin.c and its value determined by the - '-fabi-version' command line option. -

    - -

    - It is versioned as follows, where 'n' is given by '-fabi-version=n': -

    -
      -
    • gcc-3.0.x: 100
    • -
    • gcc-3.1.x: 100 (Error, should be 101)
    • -
    • gcc-3.2.x: 102
    • -
    • gcc-3.3.x: 102
    • -
    • gcc-3.4.x, gcc-4.0.x, gcc-4.1.x, gcc-4.2.x: 102 (when n=1)
    • -
    • gcc-3.4.x, gcc-4.0.x, gcc-4.1.x, gcc-4.2.x: 1000 + n (when n>1)
    • -
    • gcc-3.4.x, gcc-4.0.x, gcc-4.1.x, gcc-4.2.x: 999999 (when n=0)
    • -
    -

    -
  • - -
  • -

    Changes to the default compiler option for - -fabi-version. -

    -

    - It is versioned as follows: -

    -
      -
    • gcc-3.0.x: (Error, not versioned)
    • -
    • gcc-3.1.x: (Error, not versioned)
    • -
    • gcc-3.2.x: -fabi-version=1
    • -
    • gcc-3.3.x: -fabi-version=1
    • -
    • gcc-3.4.x, gcc-4.0.x, gcc-4.1.x, gcc-4.2.x: -fabi-version=2
    • -
    -

    -
  • - -
  • -

    Incremental bumping of a library pre-defined macro. For releases - before 3.4.0, the macro is __GLIBCPP__. For later releases, it's - __GLIBCXX__. (The libstdc++ project generously changed from CPP to - CXX throughout its source to allow the "C" pre-processor the CPP - macro namespace.) These macros are defined as the date the library - was released, in compressed ISO date format, as an unsigned long. -

    - -

    - This macro is defined in the file "c++config" in the - "libstdc++/include/bits" directory. (Up to gcc-4.1.0, it was - changed every night by an automated script. Since gcc-4.1.0, it is - the same value as gcc/DATESTAMP.) -

    -

    - It is versioned as follows: -

    -
      -
    • gcc-3.0.0: 20010615
    • -
    • gcc-3.0.1: 20010819
    • -
    • gcc-3.0.2: 20011023
    • -
    • gcc-3.0.3: 20011220
    • -
    • gcc-3.0.4: 20020220
    • -
    • gcc-3.1.0: 20020514
    • -
    • gcc-3.1.1: 20020725
    • -
    • gcc-3.2.0: 20020814
    • -
    • gcc-3.2.1: 20021119
    • -
    • gcc-3.2.2: 20030205
    • -
    • gcc-3.2.3: 20030422
    • -
    • gcc-3.3.0: 20030513
    • -
    • gcc-3.3.1: 20030804
    • -
    • gcc-3.3.2: 20031016
    • -
    • gcc-3.3.3: 20040214
    • -
    • gcc-3.4.0: 20040419
    • -
    • gcc-3.4.1: 20040701
    • -
    • gcc-3.4.2: 20040906
    • -
    • gcc-3.4.3: 20041105
    • -
    • gcc-3.4.4: 20050519
    • -
    • gcc-3.4.5: 20051201
    • -
    • gcc-3.4.6: 20060306
    • -
    • gcc-4.0.0: 20050421
    • -
    • gcc-4.0.1: 20050707
    • -
    • gcc-4.0.2: 20050921
    • -
    • gcc-4.0.3: 20060309
    • -
    • gcc-4.1.0: 20060228
    • -
    • gcc-4.1.1: 20060524
    • -
    • gcc-4.1.2: 20070214
    • -
    • gcc-4.2.0: 20070514
    • -
    -

    -
  • - -
  • -

    - Incremental bumping of a library pre-defined macro, - _GLIBCPP_VERSION. This macro is defined as the released version of - the library, as a string literal. This is only implemented in - gcc-3.1.0 releases and higher, and is deprecated in 3.4 (where it - is called _GLIBCXX_VERSION). -

    - -

    - This macro is defined in the file "c++config" in the - "libstdc++/include/bits" directory and is generated - automatically by autoconf as part of the configure-time generation - of config.h. -

    - -

    - It is versioned as follows: -

    -
      -
    • gcc-3.0.0: "3.0.0"
    • -
    • gcc-3.0.1: "3.0.0" (Error, should be "3.0.1")
    • -
    • gcc-3.0.2: "3.0.0" (Error, should be "3.0.2")
    • -
    • gcc-3.0.3: "3.0.0" (Error, should be "3.0.3")
    • -
    • gcc-3.0.4: "3.0.0" (Error, should be "3.0.4")
    • -
    • gcc-3.1.0: "3.1.0"
    • -
    • gcc-3.1.1: "3.1.1"
    • -
    • gcc-3.2.0: "3.2"
    • -
    • gcc-3.2.1: "3.2.1"
    • -
    • gcc-3.2.2: "3.2.2"
    • -
    • gcc-3.2.3: "3.2.3"
    • -
    • gcc-3.3.0: "3.3"
    • -
    • gcc-3.3.1: "3.3.1"
    • -
    • gcc-3.3.2: "3.3.2"
    • -
    • gcc-3.3.3: "3.3.3"
    • -
    • gcc-3.4.x: "version-unused"
    • -
    • gcc-4.0.x: "version-unused"
    • -
    • gcc-4.1.x: "version-unused"
    • -
    • gcc-4.2.x: "version-unused"
    • -
    -

    -
  • - -
  • -

    - Matching each specific C++ compiler release to a specific set of - C++ include files. This is only implemented in gcc-3.1.1 releases - and higher. -

    -

    - All C++ includes are installed in include/c++, then nest in a - directory hierarchy corresponding to the C++ compiler's released - version. This version corresponds to the variable "gcc_version" in - "libstdc++/acinclude.m4," and more details can be found in that - file's macro GLIBCXX_CONFIGURE (GLIBCPP_CONFIGURE before gcc-3.4.0). -

    -

    - C++ includes are versioned as follows: -

    -
      -
    • gcc-3.0.0: include/g++-v3
    • -
    • gcc-3.0.1: include/g++-v3
    • -
    • gcc-3.0.2: include/g++-v3
    • -
    • gcc-3.0.3: include/g++-v3
    • -
    • gcc-3.0.4: include/g++-v3
    • -
    • gcc-3.1.0: include/g++-v3
    • -
    • gcc-3.1.1: include/c++/3.1.1
    • -
    • gcc-3.2.0: include/c++/3.2
    • -
    • gcc-3.2.1: include/c++/3.2.1
    • -
    • gcc-3.2.2: include/c++/3.2.2
    • -
    • gcc-3.2.3: include/c++/3.2.3
    • -
    • gcc-3.3.0: include/c++/3.3
    • -
    • gcc-3.3.1: include/c++/3.3.1
    • -
    • gcc-3.3.2: include/c++/3.3.2
    • -
    • gcc-3.3.3: include/c++/3.3.3
    • -
    • gcc-3.4.0: include/c++/3.4.0
    • -
    • gcc-3.4.1: include/c++/3.4.1
    • -
    • gcc-3.4.2: include/c++/3.4.2
    • -
    • gcc-3.4.3: include/c++/3.4.3
    • -
    • gcc-3.4.4: include/c++/3.4.4
    • -
    • gcc-3.4.5: include/c++/3.4.5
    • -
    • gcc-3.4.6: include/c++/3.4.6
    • -
    • gcc-4.0.0: include/c++/4.0.0
    • -
    • gcc-4.0.1: include/c++/4.0.1
    • -
    • gcc-4.0.2: include/c++/4.0.2
    • -
    • gcc-4.0.3: include/c++/4.0.3
    • -
    • gcc-4.1.0: include/c++/4.1.0
    • -
    • gcc-4.1.1: include/c++/4.1.1
    • -
    • gcc-4.1.2: include/c++/4.1.2
    • -
    • gcc-4.2.0: include/c++/4.2.0
    • -
    -

    -
  • -
-

- Taken together, these techniques can accurately specify interface - and implementation changes in the GNU C++ tools themselves. Used - properly, they allow both the GNU C++ tools implementation, and - programs using them, an evolving yet controlled development that - maintains backward compatibility. -

- - - -
- Minimum requirements for a versioned ABI -
-

- Minimum environment that supports a versioned ABI: A supported - dynamic linker, a GNU linker of sufficient vintage to understand - demangled C++ name globbing (ld), a shared executable compiled with - g++, and shared libraries (libgcc_s, libstdc++) compiled by a - compiler (g++) with a compatible ABI. Phew. -

- -

- On top of all that, an additional constraint: libstdc++ did not - attempt to version symbols (or age gracefully, really) until version - 3.1.0. -

- -

- Most modern Linux and BSD versions, particularly ones using - gcc-3.1.x tools and more recent vintages, will meet the requirements above. -

- - -
- What configure options impact symbol versioning? -
-

- It turns out that most of the configure options that change default - behavior will impact the mangled names of exported symbols, and thus - impact versioning and compatibility. -

- -

- For more information on configure options, including ABI impacts, see: - http://gcc.gnu.org/onlinedocs/libstdc++/configopts.html -

- -

- There is one flag that explicitly deals with symbol versioning: - --enable-symvers. -

- -

- In particular, libstdc++/acinclude.m4 has a macro called - GLIBCXX_ENABLE_SYMVERS that defaults to yes (or the argument passed - in via --enable-symvers=foo). At that point, the macro attempts to - make sure that all the requirement for symbol versioning are in - place. For more information, please consult acinclude.m4. -

- - -
- How to tell if symbol versioning is, indeed, active? -
-

- When the GNU C++ library is being built with symbol versioning on, - you should see the following at configure time for libstdc++: -

- - - checking versioning on shared library symbols... gnu - -

- If you don't see this line in the configure output, or if this line - appears but the last word is 'no', then you are out of luck. -

- -

- If the compiler is pre-installed, a quick way to test is to compile - the following (or any) simple C++ file and link it to the shared - libstdc++ library: -

- -
-#include <iostream>
-
-int main()
-{ std::cout << "hello" << std::endl; return 0; }
-
-%g++ hello.cc -o hello.out
-
-%ldd hello.out
-        libstdc++.so.5 => /usr/lib/libstdc++.so.5 (0x00764000)
-        libm.so.6 => /lib/tls/libm.so.6 (0x004a8000)
-        libgcc_s.so.1 => /mnt/hd/bld/gcc/gcc/libgcc_s.so.1 (0x40016000)
-        libc.so.6 => /lib/tls/libc.so.6 (0x0036d000)
-        /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x00355000)
-
-%nm hello.out
-
- -

-If you see symbols in the resulting output with "GLIBCXX_3" as part -of the name, then the executable is versioned. Here's an example: -

- - U _ZNSt8ios_base4InitC1Ev@@GLIBCXX_3.4 - -

- Library allowed ABI changes -

-

-The following will cause the library minor version number to -increase, say from "libstdc++.so.3.0.4" to "libstdc++.so.3.0.5". -

-
    -
  • adding an exported global or static data member
  • -
  • adding an exported function, static or non-virtual member function
  • -
  • adding an exported symbol or symbols by additional instantiations
  • -
-

-

-

-Other allowed changes are possible. -

- - -

- Library disallowed ABI changes -

- -

-The following non-exhaustive list will cause the library major version -number to increase, say from "libstdc++.so.3.0.4" to -"libstdc++.so.4.0.0". -

-
    -
  • changes in the gcc/g++ compiler ABI
  • -
  • changing size of an exported symbol
  • -
  • changing alignment of an exported symbol
  • -
  • changing the layout of an exported symbol
  • -
  • changing mangling on an exported symbol
  • -
  • deleting an exported symbol
  • -
  • changing the inheritance properties of a type by adding or removing - base classes
  • -
  • - changing the size, alignment, or layout of types - specified in the C++ standard. These may not necessarily be - instantiated or otherwise exported in the library binary, and - include all the required locale facets, as well as things like - std::basic_streambuf, et al. -
  • - -
  • adding an explicit copy constructor or destructor to a -class that would otherwise have implicit versions. This will change -the way the compiler deals with this class in by-value return -statements or parameters: instead of being passing instances of this -class in registers, the compiler will be forced to use memory. See this part - of the C++ ABI documentation for further details. -
  • - -
- -

- Library implementation strategy

- -
    -
  • Separation of interface and implementation -

    This is accomplished by two techniques that separate the API from -the ABI: forcing undefined references to link against a library binary -for definitions. -

    - -
    -
    Include files have declarations, source files have defines
    - -
    For non-templatized types, such as much of class - locale, the appropriate standard C++ include, say - locale, can contain full declarations, while various - source files (say locale.cc, locale_init.cc, - localename.cc) contain definitions.
    - -
    Extern template on required types
    - -
    For parts of the standard that have an explicit list of required - instantiations, the GNU extension syntax extern template - can be used to control where template definitions - reside. By marking required instantiations as extern - template in include files, and providing explicit - instantiations in the appropriate instantiation files, non-inlined - template functions can be versioned. This technique is mostly used - on parts of the standard that require char and - wchar_t instantiations, and includes - basic_string, the locale facets, and the types in - iostreams.
    - -
    -

    In addition, these techniques have the additional benefit that - they reduce binary size, which can increase runtime performance. -

    -
  • - -
  • Namespaces linking symbol definitions to export mapfiles - -

    All symbols in the shared library binary are processed by a linker -script at build time that either allows or disallows external -linkage. Because of this, some symbols, regardless of normal C/C++ -linkage, are not visible. Symbols that are internal have several -appealing characteristics: by not exporting the symbols, there are no -relocations when the shared library is started and thus this makes for -faster runtime loading performance by the underlying dynamic loading -mechanism. In addition, they have the possibility of changing without -impacting ABI compatibility. -

    - -

    The following namespaces are transformed by the mapfile:

    - -
    -
    namespace std
    -
    Defaults to exporting all symbols in label -GLIBCXX that do not begin with an underscore, ie -__test_func would not be exported by default. Select -exceptional symbols are allowed to be visible.
    - -
    namespace __gnu_cxx
    -
    Defaults to not exporting any symbols in label -GLIBCXX, select items are allowed to be visible.
    - -
    namespace __gnu_internal
    -
    Defaults to not exported, no items are allowed to be visible.
    - -
    namespace __cxxabiv1, aliased to namespace abi
    -
    Defaults to not exporting any symbols in label -CXXABI, select items are allowed to be visible.
    -
    -

    -

    -
  • - -
  • Freezing the API -

    Disallowed changes, as above, are not made on a stable release -branch. Enforcement tends to be less strict with GNU extensions that -standard includes.

    -
  • -
- -

- Testing ABI changes -

- -

-Testing for GNU C++ ABI changes is composed of two distinct areas: -testing the C++ compiler (g++) for compiler changes, and testing the -C++ library (libstdc++) for library changes. -

- -

-Testing the C++ compiler ABI can be done various ways. -

- -

-One. -Intel ABI checker. More information can be obtained -here. -

- -

-Two. -The second is yet unreleased, but has been announced on the gcc -mailing list. It is yet unspecified if these tools will be freely -available, and able to be included in a GNU project. Please contact -Mark Mitchell (mark@codesourcery.com) for more details, and current -status. -

- -

-Three. -Involves using the vlad.consistency test framework. This has also been -discussed on the gcc mailing lists. -

- -

-Testing the C++ library ABI can also be done various ways. -

- -

-One. -(Brendan Kehoe, Jeff Law suggestion to run 'make check-c++' two ways, -one with a new compiler and an old library, and the other with an old -compiler and a new library, and look for testsuite regressions) -

- -

-Details on how to set this kind of test up can be found here: -http://gcc.gnu.org/ml/gcc/2002-08/msg00142.html -

- -

-Two. -Use the 'make check-abi' rule in the libstdc++ Makefile. -

- -

-This is a proactive check the library ABI. Currently, exported symbol -names that are either weak or defined are checked against a last known -good baseline. Currently, this baseline is keyed off of 3.4.0 -binaries, as this was the last time the .so number was incremented. In -addition, all exported names are demangled, and the exported objects -are checked to make sure they are the same size as the same object in -the baseline. - -Notice that each baseline is relative to a default -configured library and compiler: in particular, if options such as ---enable-clocale, or --with-cpu, in case of multilibs, are used at -configure time, the check may fail, either because of substantive -differences or because of limitations of the current checking -machinery. -

- -

-This dataset is insufficient, yet a start. Also needed is a -comprehensive check for all user-visible types part of the standard -library for sizeof() and alignof() changes. -

- -

-Verifying compatible layouts of objects is not even attempted. It -should be possible to use sizeof, alignof, and offsetof to compute -offsets for each structure and type in the standard library, saving to -another datafile. Then, compute this in a similar way for new -binaries, and look for differences. -

- -

-Another approach might be to use the -fdump-class-hierarchy flag to -get information. However, currently this approach gives insufficient -data for use in library testing, as class data members, their offsets, -and other detailed data is not displayed with this flag. -(See g++/7470 on how this was used to find bugs.) -

- -

-Perhaps there are other C++ ABI checkers. If so, please notify -us. We'd like to know about them! -

- -

- Testing Multi-ABI binaries -

- -

-A "C" application, dynamically linked to two shared libraries, liba, -libb. The dependent library liba is C++ shared library compiled with -gcc-3.3.x, and uses io, exceptions, locale, etc. The dependent library -libb is a C++ shared library compiled with gcc-3.4.x, and also uses io, -exceptions, locale, etc. -

- -

As above, libone is constructed as follows:

-
-%$bld/H-x86-gcc-3.4.0/bin/g++ -fPIC -DPIC -c a.cc
-
-%$bld/H-x86-gcc-3.4.0/bin/g++ -shared -Wl,-soname -Wl,libone.so.1 -Wl,-O1 -Wl,-z,defs a.o -o libone.so.1.0.0
-
-%ln -s libone.so.1.0.0 libone.so
-
-%$bld/H-x86-gcc-3.4.0/bin/g++ -c a.cc
-
-%ar cru libone.a a.o 
-
- -

And, libtwo is constructed as follows:

- -
-%$bld/H-x86-gcc-3.3.3/bin/g++ -fPIC -DPIC -c b.cc
-
-%$bld/H-x86-gcc-3.3.3/bin/g++ -shared -Wl,-soname -Wl,libtwo.so.1 -Wl,-O1 -Wl,-z,defs b.o -o libtwo.so.1.0.0
-
-%ln -s libtwo.so.1.0.0 libtwo.so
-
-%$bld/H-x86-gcc-3.3.3/bin/g++ -c b.cc
-
-%ar cru libtwo.a b.o 
-
- -

...with the resulting libraries looking like

-
-%ldd libone.so.1.0.0
-        libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x40016000)
-        libm.so.6 => /lib/tls/libm.so.6 (0x400fa000)
-        libgcc_s.so.1 => /mnt/hd/bld/gcc/gcc/libgcc_s.so.1 (0x4011c000)
-        libc.so.6 => /lib/tls/libc.so.6 (0x40125000)
-        /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x00355000)
-
-%ldd libtwo.so.1.0.0
-        libstdc++.so.5 => /usr/lib/libstdc++.so.5 (0x40027000)
-        libm.so.6 => /lib/tls/libm.so.6 (0x400e1000)
-        libgcc_s.so.1 => /mnt/hd/bld/gcc/gcc/libgcc_s.so.1 (0x40103000)
-        libc.so.6 => /lib/tls/libc.so.6 (0x4010c000)
-        /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x00355000)
-
-
- -

Then, the "C" compiler is used to compile a source file that uses -functions from each library.

-
-gcc test.c -g -O2 -L. -lone -ltwo /usr/lib/libstdc++.so.5 /usr/lib/libstdc++.so.6
-
- -

-Which gives the expected: -

-
-%ldd a.out
-        libstdc++.so.5 => /usr/lib/libstdc++.so.5 (0x00764000)
-        libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x40015000)
-        libc.so.6 => /lib/tls/libc.so.6 (0x0036d000)
-        libm.so.6 => /lib/tls/libm.so.6 (0x004a8000)
-        libgcc_s.so.1 => /mnt/hd/bld/gcc/gcc/libgcc_s.so.1 (0x400e5000)
-        /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x00355000)
-
- -

-This resulting binary, when executed, will be able to safely use code -from both liba, and the dependent libstdc++.so.6, and libb, with the -dependent libstdc++.so.5. -

- - -

- Outstanding Issues -

- -

Some features in the C++ language make versioning especially -difficult. In particular, compiler generated constructs such as -implicit instantiations for templates, typeinfo information, and -virtual tables all may cause ABI leakage across shared library -boundaries. Because of this, mixing C++ ABI's is not recommended at -this time. -

- -

For more background on this issue, see these bugzilla entries:

- -

-24660: versioning weak symbols in libstdc++ -

- -

-19664: libstdc++ headers should have pop/push of the visibility around the declarations -

- -

- Bibliography / Further Reading -

- -

-ABIcheck, a vague idea of checking ABI compatibility -
-http://abicheck.sourceforge.net/ -

- -

-C++ ABI reference -
-http://www.codesourcery.com/cxx-abi/ -

- -

-Intel ABI documentation, "Intel® Compilers for Linux* -Compatibility with the GNU Compilers" -
-http://developer.intel.com/software/products/compilers/techtopics/LinuxCompilersCompatibility.htm -

- -

-Sun Solaris 2.9 docs -
-Linker and Libraries Guide (document 816-1386) -
-C++ Migration Guide (document 816-2459) -
-http://docs.sun.com/db/prod/solaris.9 -
-http://docs.sun.com/?p=/doc/816-1386&a=load -

- -

-Ulrich Drepper, "ELF Symbol Versioning" -
-http://people.redhat.com/drepper/symbol-versioning -

- -

-C++ ABI for the ARM Architecture -
-http://www.arm.com/miscPDFs/8033.pdf -

- -

-Benjamin Kosnik, ISO C++ J16/06-0046 -
-Dynamic Shared Objects: Survey and Issues -

- -

-Benjamin Kosnik, ISO C++ J16/06-0083 -
-Versioning With Namespaces -

- - - - diff --git a/libstdc++-v3/docs/html/17_intro/api.html b/libstdc++-v3/docs/html/17_intro/api.html deleted file mode 100644 index 1d1e36d90d2..00000000000 --- a/libstdc++-v3/docs/html/17_intro/api.html +++ /dev/null @@ -1,290 +0,0 @@ - - - - - - - - - - API Evolution and Deprecation History - - - - - - -

API Evolution and Deprecation History

- -

- The latest version of this document is always available at - - http://gcc.gnu.org/onlinedocs/libstdc++/17_intro/api.html. -

- -

- To the libstdc++ homepage. -

- - - -
-

- API Evolution, Deprecation, and History of User Visible Changes -

- -

A list of user-visible changes, by release version. -

- -

- 3.0 -

- -

-Extensions moved to include/ext. -

- -

-Include files from the SGI/HP sources that pre-date the ISO standard -are added. These files are placed into -the include/backward directory and a deprecated warning -is added that notifies on inclusion (-Wno-deprecated -deactivates the warning.) -

- -

Deprecated include <backward/strstream> added.

- -

Removal of include <builtinbuf.h>, <indstream.h>, <parsestream.h>, <PlotFile.h>, <SFile.h>, <stdiostream.h>, and <stream.h>.

- - -

- 3.1 -

- -

-Extensions from SGI/HP moved from namespace std -to namespace __gnu_cxx. As part of this, the following -new includes are -added: <ext/algorithm>, <ext/functional>, <ext/iterator>, <ext/memory>, and <ext/numeric>. -

- -

-Extensions to basic_filebuf introduced: __gnu_cxx::enc_filebuf, and __gnu_cxx::stdio_filebuf. -

- -

-Extensions to tree data structures added in <ext/rb_tree>. -

- -

-Removal of <ext/tree>, moved to <backward/tree.h>. -

- - -

- 3.2 -

-

Symbol versioning introduced for shared library.

- -

Removal of include <backward/strstream.h>.

- -

- 3.3 -

-

Allocator changes. Change __malloc_alloc to malloc_allocator and __new_alloc to new_allocator.

- -

Error handling in iostreams cleaned up, made consistent.

- - -

- 3.4 -

-

-Large file support. -

- -

Extensions for generic characters and char_traits added in <ext/pod_char_traits.h>. -

- -

-Support for wchar_t specializations of basic_filebuf enhanced to support UTF-8 and Unicode, depending on host. More hosts support basic wchar_t functionality. -

- -

-Support for char_traits beyond builtin types. -

- -

-Conformant allocator class and usage in containers. As -part of this, the following extensions are -added: <ext/bitmap_allocator.h>, <ext/debug_allocator.h>, <ext/mt_allocator.h>, <ext/malloc_allocator.h>,<ext/new_allocator.h>, <ext/pool_allocator.h>. -

- - -

-Debug mode first appears. -

- -

-PCH support. -

- -

-Macro guard for libstdc++ changed, from _GLIBCPP_ to _GLIBCXX_. -

- -

-Extension <ext/stdio_sync_filebuf.h> added. -

- -

-Extension <ext/demangle.h> added. -

- - -

- 4.0 -

-

-TR1 features first appear. -

- -

-Extension allocator <ext/array_allocator.h> added. -

- -

-Extension codecvt specializations moved to <ext/codecvt_specializations.h>. -

- -

-Removal of <ext/demangle.h>. -

- - -

- 4.1 -

- -

-Removal of <cassert> from all standard headers: now has to be explicitly included for std::assert calls. -

- -

Extensions for policy-based data structures first added. New includes, -types, namespace pb_assoc. -

- - - -

Extensions for typelists added in <ext/typelist.h>. -

- -

Extension for policy-based basic_string first added: __gnu_cxx::__versa_string in <ext/vstring.h>. -

- -

- 4.2 -

- -

Default visibility attributes applied to namespace std. Support for -fvisibility. -

- -

TR1 <random>, <complex>, and C compatibility headers added.

- -

Extensions for concurrent programming consolidated -into <ext/concurrence.h> and <ext/atomicity.h>, -including change of namespace to __gnu_cxx in some -cases. Added types -include _Lock_policy, __concurrence_lock_error, __concurrence_unlock_error, __mutex, __scoped_lock.

- -

Extensions for type traits consolidated -into <ext/type_traits.h>. Additional traits are added -(__conditional_type, __enable_if, others.) -

- -

Extensions for policy-based data structures revised. New includes, -types, namespace moved to __pb_ds. -

- -

Extensions for debug mode modified: now nested in namespace -std::__debug and extensions in namespace -__gnu_cxx::__debug.

- -

Extensions added: <ext/typelist.h> -and <ext/throw_allocator.h>. -

- -

- 4.3 -

- -

-C++0X features first appear. -

- -

TR1 <regex> and <cmath>'s mathematical special function added.

- -

-Backward include edit. -

-
    -
  • Removed: <algobase.h> <algo.h> <alloc.h> <bvector.h> <complex.h> -defalloc.h> <deque.h> <fstream.h> <function.h> <hash_map.h> <hash_set.h> -hashtable.h> <heap.h> <iomanip.h> <iostream.h> <istream.h> <iterator.h> -list.h> <map.h> <multimap.h> <multiset.h> <new.h> <ostream.h> <pair.h> <queue.h> <rope.h> <set.h> <slist.h> <stack.h> <streambuf.h> <stream.h> <tempbuf.h> -<tree.h> <vector.h> -
  • -
  • Added: <hash_map> and <hash_set>
  • -
  • Added in C++0x: <auto_ptr.h> and <binders.h>
  • -
- -

-Header dependency streamlining. -

- -
    -
  • <algorithm> no longer includes <climits>, <cstring>, or <iosfwd>
  • -
  • <bitset> no longer includes <istream> or <ostream>, adds <iosfwd>
  • -
  • <functional> no longer includes <cstddef>
  • -
  • <iomanip> no longer includes <istream>, <istream>, or <functional>, adds <ioswd>
  • -
  • <numeric> no longer includes <iterator>
  • -
  • <string> no longer includes <algorithm> or <memory>
  • - -
  • <valarray> no longer includes <numeric> or <cstdlib>
  • -
  • <tr1/hashtable> no longer includes <memory> or <functional>
  • -
  • <tr1/memory> no longer includes <algorithm>
  • -
  • <tr1/random> no longer includes <algorithm> or <fstream>
  • -
- -

-Debug mode for <unordered_map> and <unordered_set>. -

- -

-Parallel mode first appears. -

- -

Variadic template implementations of items in <tuple> and - <functional>. -

- -

Default what implementations give more elaborate - exception strings for bad_cast, - bad_typeid, bad_exception, and - bad_alloc. -

- -

-PCH binary files no longer installed. Instead, the source files are installed. -

- -

-Namespace pb_ds moved to __gnu_pb_ds. -

- - - - diff --git a/libstdc++-v3/docs/html/17_intro/backwards_compatibility.html b/libstdc++-v3/docs/html/17_intro/backwards_compatibility.html deleted file mode 100644 index c9af980f0fc..00000000000 --- a/libstdc++-v3/docs/html/17_intro/backwards_compatibility.html +++ /dev/null @@ -1,1073 +0,0 @@ - - - - - - - - - - Backwards Compatibility - - - - - - -

Backwards Compatibility

- -

- The latest version of this document is always available at - - http://gcc.gnu.org/onlinedocs/libstdc++/17_intro/backwards_compatibility.html. -

- -

- To the libstdc++ homepage. -

- - -
-

- First. -

- -

The first generation GNU C++ library was called libg++. It was a -separate GNU project, although reliably paired with GCC. Rumors imply -that it had a working relationship with at least two kinds of -dinosaur. -

- -

Known Issues include many of the limitations of its immediate ancestor.

- -

Portability notes and known implementation limitations are as follows.

- -
No ios_base
- -

At least some older implementations don't have std::ios_base, so you should use std::ios::badbit, std::ios::failbit and std::ios::eofbit and std::ios::goodbit. -

- -
No cout in ostream.h, no cin in istream.h
- -

- In earlier versions of the standard, - <fstream.h>, - <ostream.h> - and <istream.h> - used to define - cout, cin and so on. ISO C++ specifies that one needs to include - <iostream> - explicitly to get the required definitions. -

-

Some include adjustment may be required.

- - -

This project is no longer maintained or supported, and the sources -archived. The code is considered replaced and rewritten. -

- -
-

- Second. -

-

The second generation GNU C++ library was called libstdc++, or -libstdc++-v2. It spans the time between libg++ and pre-ISO C++ -standardization and is usually associated with the following GCC -releases: egcs 1.x, gcc 2.95, and gcc 2.96. -

- -

The STL portions of this library are based on SGI/HP STL release 3.11. -

- -

Portability notes and known implementation limitations are as follows.

- -
Namespace std:: not supported
- -

- Some care is required to support C++ compiler and or library - implementation that do not have the standard library in - namespace std. -

-

- The following sections list some possible solutions to support compilers - that cannot ignore std::-qualified names. -

- -

First, see if the compiler has a flag for this. Namespace - back-portability-issues are generally not a problem for g++ - compilers that do not have libstdc++ in std::, as - the compilers use -fno-honor-std (ignore - std::, :: = std::) by default. That - is, the responsibility for enabling or disabling - std:: is on the user; the maintainer does not have - to care about it. This probably applies to some other compilers - as well. -

- -

Second, experiment with a variety of pre-processor tricks.

- -

By defining std as a macro, fully-qualified namespace calls become global. Volia.

- -
-#ifdef WICKEDLY_OLD_COMPILER
-# define std
-#endif
-
-(thanks to Juergen Heinzl who posted this solution on gnu.gcc.help) - -

Another pre-processor based approach is to define a -macro NAMESPACE_STD, which is defined to either -"" or "std" based on a compile-type test. On GNU -systems, this can be done with autotools by means of an autoconf test -(see below) for HAVE_NAMESPACE_STD, then using that to -set a value for the NAMESPACE_STD macro. At that point, -one is able to use NAMESPACE_STD::string, which will -evaluate to std::string or -::string (ie, in the global namespace on systems that do -not put string in std::).

- -
-dnl @synopsis AC_CXX_NAMESPACE_STD
-dnl
-dnl If the compiler supports namespace std, define
-dnl HAVE_NAMESPACE_STD.
-dnl
-dnl @category Cxx
-dnl @author Todd Veldhuizen
-dnl @author Luc Maisonobe <luc@spaceroots.org>
-dnl @version 2004-02-04
-dnl @license AllPermissive
-AC_DEFUN([AC_CXX_NAMESPACE_STD], [
-  AC_CACHE_CHECK(if g++ supports namespace std,
-  ac_cv_cxx_have_std_namespace,
-  [AC_LANG_SAVE
-  AC_LANG_CPLUSPLUS
-  AC_TRY_COMPILE([#include <iostream> 
-                  std::istream& is = std::cin;],,
-  ac_cv_cxx_have_std_namespace=yes, ac_cv_cxx_have_std_namespace=no)
-  AC_LANG_RESTORE
-  ])
-  if test "$ac_cv_cxx_have_std_namespace" = yes; then
-    AC_DEFINE(HAVE_NAMESPACE_STD,,[Define if g++ supports namespace std. ])
-  fi
-])
-
- -
Illegal iterator usage
-

- The following illustrate implementation-allowed illegal iterator - use, and then correct use. -

- -
  • you cannot do - ostream::operator<<(iterator) to print the - address of the iterator => use operator<< - &*iterator instead -

  • -
  • you cannot clear an iterator's reference - (iterator = 0) => use - iterator = iterator_type(); -

  • -
  • -if (iterator) won't work any - more => use if (iterator != iterator_type()) -

  • -
- -
isspace from <cctype> is a macro -
- -

Glibc 2.0.x and 2.1.x define <ctype.h> -functionality as macros (isspace, isalpha etc.). -

- -

-This implementations of libstdc++, however, keep these functions as -macros, and so it is not back-portable to use fully qualified -names. For example: -

- -
 
-#include <cctype> 
-int main() { std::isspace('X'); } 
-
- -

Results in something like this: -

- -
 
-std:: (__ctype_b[(int) ( ( 'X' ) )] & (unsigned short int) _ISspace ) ; 
-
- - -

A solution is to modify a header-file so that the compiler tells -<ctype.h> to define functions instead of macros: -

- -
-// This keeps isalnum, et al from being propagated as macros. 
-#if __linux__
-# define __NO_CTYPE 1
-#endif
-
- -

Then, include <ctype.h> -

- -

-Another problem arises if you put a using namespace std; -declaration at the top, and include <ctype.h>. This -will result in ambiguities between the definitions in the global -namespace (<ctype.h>) and the definitions in namespace -std:: (<cctype>). -

- -
No vector::at, deque::at, string::at
- -

- One solution is to add an autoconf-test for this: -

-
-AC_MSG_CHECKING(for container::at)
-AC_TRY_COMPILE(
-[
-#include <vector>
-#include <deque>
-#include <string>
-	
-using namespace std;
-],
-[
-deque<int> test_deque(3);
-test_deque.at(2);
-vector<int> test_vector(2);
-test_vector.at(1);
-string test_string("test_string");
-test_string.at(3);
-],
-[AC_MSG_RESULT(yes)
-AC_DEFINE(HAVE_CONTAINER_AT)],
-[AC_MSG_RESULT(no)])
-
- -

-If you are using other (non-GNU) compilers it might be a good idea -to check for string::at separately. -

- -
No std::char_traits<char>::eof
- -

-Use some kind of autoconf test, plus this: -

-
 
-#ifdef HAVE_CHAR_TRAITS
-#define CPP_EOF std::char_traits<char>::eof()
-#else
-#define CPP_EOF EOF
-#endif
-
- -
No string::clear
- -

- There are two functions for deleting the contents of a string: - clear and erase (the latter - returns the string). -

- -
-void 
-clear() { _M_mutate(0, this->size(), 0); }
-
-
-basic_string& 
-erase(size_type __pos = 0, size_type __n = npos)
-{ 
-  return this->replace(_M_check(__pos), _M_fold(__pos, __n),
-                          _M_data(), _M_data()); 
-}
-
- -

- Unfortunately, ut clear is not - implemented in this version, so you should use - erase (which is probably faster than - operator=(charT*)). -

- -
Removal of ostream::form and -istream::scan extensions
- -

These are no longer supported. Please use - - stringstreams instead. -

- -
No basic_stringbuf, basic_stringstream
- -

-Although the ISO standard -i/ostringstream-classes are provided, (<sstream>), for compatibility with older implementations the pre-ISO i/ostrstream (<strstream>) interface is also provided, with these caveats: -

- -
    -
  • strstream is considered to be - deprecated -

  • -
  • strstream is limited to - char -

  • -
  • with ostringstream you don't - have to take care of terminating the string or freeing its - memory -

  • -
  • istringstream can be re-filled - (clear(); str(input);) -

  • -
-

- You can then use output-stringstreams like this: -

- -
-#ifdef HAVE_SSTREAM
-# include <sstream>
-#else
-# include <strstream>
-#endif
-
-#ifdef HAVE_SSTREAM
-  std::ostringstream oss;
-#else
-  std::ostrstream oss;
-#endif
-
-oss << "Name=" << m_name << ", number=" << m_number << std::endl;
-...
-#ifndef HAVE_SSTREAM
-  oss << std::ends; // terminate the char*-string
-#endif
-
-// str() returns char* for ostrstream and a string for ostringstream
-// this also causes ostrstream to think that the buffer's memory
-// is yours
-m_label.set_text(oss.str());
-#ifndef HAVE_SSTREAM
-  // let the ostrstream take care of freeing the memory
-  oss.freeze(false);
-#endif
-
- -

- Input-stringstreams can be used similarly: -

- -
 
-std::string input;
-...
-#ifdef HAVE_SSTREAM
-std::istringstream iss(input);
-#else
-std::istrstream iss(input.c_str());
-#endif
-
-int i;
-iss >> i; 
-
- -

One (the only?) restriction is that an istrstream cannot be re-filled: -

- -
-std::istringstream iss(numerator);
-iss >> m_num;
-// this is not possible with istrstream
-iss.clear();
-iss.str(denominator);
-iss >> m_den;
- 
- -

-If you don't care about speed, you can put these conversions in - a template-function: -

-
-template <class X>
-void fromString(const string& input, X& any)
-{
-#ifdef HAVE_SSTREAM
-std::istringstream iss(input);
-#else
-std::istrstream iss(input.c_str());
-#endif
-X temp;
-iss >> temp;
-if (iss.fail())
-throw runtime_error(..)
-any = temp;
-}
-
- -

Another example of using stringstreams is in this howto. -

- -

There is additional information in the libstdc++-v2 info files, in -particular "info iostream". -

- -
Little or no wide character support
- -
No templatized iostreams
- -
Thread safety issues
- -

This project is no longer maintained or supported, and the sources -archived. The code is considered replaced and rewritten. -

- - -
-

- Third. -

-

The third generation GNU C++ library is called libstdc++, or -libstdc++-v3. -

- -

The subset commonly known as the Standard Template Library - (chapters 23 through 25, mostly) is adapted from the final release - of the SGI STL (version 3.3), with extensive changes. -

- -

A more formal description of the V3 goals can be found in the - official design document. -

- -

Portability notes and known implementation limitations are as follows.

- -
Pre-ISO headers moved to backwards or removed
- -

The pre-ISO C++ headers - (iostream.h, defalloc.h etc.) are - available, unlike previous libstdc++ versions, but inclusion - generates a warning that you are using deprecated headers. -

- -

This compatibility layer is constructed by including the - standard C++ headers, and injecting any items in - std:: into the global namespace. -

-

For those of you new to ISO C++ (welcome, time travelers!), no, - that isn't a typo. Yes, the headers really have new names. - Marshall Cline's C++ FAQ Lite has a good explanation in item - [27.4]. -

- -

Some include adjustment may be required. What follows is an -autoconf test that defines PRE_STDCXX_HEADERS when they -exist.

- -
-# AC_HEADER_PRE_STDCXX
-AC_DEFUN([AC_HEADER_PRE_STDCXX], [
-  AC_CACHE_CHECK(for pre-ISO C++ include files,
-  ac_cv_cxx_pre_stdcxx,
-  [AC_LANG_SAVE
-  AC_LANG_CPLUSPLUS
-  ac_save_CXXFLAGS="$CXXFLAGS"
-  CXXFLAGS="$CXXFLAGS -Wno-deprecated"	
-
-  # Omit defalloc.h, as compilation with newer compilers is problematic.
-  AC_TRY_COMPILE([
-  #include <new.h>
-  #include <iterator.h>
-  #include <alloc.h>
-  #include <set.h>
-  #include <hashtable.h>
-  #include <hash_set.h>
-  #include <fstream.h>
-  #include <tempbuf.h>
-  #include <istream.h>
-  #include <bvector.h>
-  #include <stack.h>
-  #include <rope.h>
-  #include <complex.h>
-  #include <ostream.h>
-  #include <heap.h>
-  #include <iostream.h>
-  #include <function.h>
-  #include <multimap.h>
-  #include <pair.h>
-  #include <stream.h>
-  #include <iomanip.h>
-  #include <slist.h>
-  #include <tree.h>
-  #include <vector.h>
-  #include <deque.h>
-  #include <multiset.h>
-  #include <list.h>
-  #include <map.h>
-  #include <algobase.h>
-  #include <hash_map.h>
-  #include <algo.h>
-  #include <queue.h>
-  #include <streambuf.h>
-  ],,
-  ac_cv_cxx_pre_stdcxx=yes, ac_cv_cxx_pre_stdcxx=no)
-  CXXFLAGS="$ac_save_CXXFLAGS"
-  AC_LANG_RESTORE
-  ])
-  if test "$ac_cv_cxx_pre_stdcxx" = yes; then
-    AC_DEFINE(PRE_STDCXX_HEADERS,,[Define if pre-ISO C++ header files are present. ])
-  fi
-])
-
- -

Porting between pre-ISO headers and ISO headers is simple: headers -like <vector.h> can be replaced with <vector> and a using -directive using namespace std; can be put at the global -scope. This should be enough to get this code compiling, assuming the -other usage is correct. -

- -
Extension headers hash_map, hash_set moved to ext or backwards
- -

Header files hash_map and hash_set moved -to ext/hash_map and ext/hash_set, -respectively. At the same time, all types in these files are enclosed -in namespace __gnu_cxx. Later versions move deprecate -these files, and suggest using TR1's unordered_map -and unordered_set instead. -

- -

The following autoconf tests check for working HP/SGI hash containers. -

- -
-# AC_HEADER_EXT_HASH_MAP
-AC_DEFUN([AC_HEADER_EXT_HASH_MAP], [
-  AC_CACHE_CHECK(for ext/hash_map,
-  ac_cv_cxx_ext_hash_map,
-  [AC_LANG_SAVE
-  AC_LANG_CPLUSPLUS
-  ac_save_CXXFLAGS="$CXXFLAGS"
-  CXXFLAGS="$CXXFLAGS -Werror"	
-  AC_TRY_COMPILE([#include <ext/hash_map>], [using __gnu_cxx::hash_map;],
-  ac_cv_cxx_ext_hash_map=yes, ac_cv_cxx_ext_hash_map=no)
-  CXXFLAGS="$ac_save_CXXFLAGS"
-  AC_LANG_RESTORE
-  ])
-  if test "$ac_cv_cxx_ext_hash_map" = yes; then
-    AC_DEFINE(HAVE_EXT_HASH_MAP,,[Define if ext/hash_map is present. ])
-  fi
-])
-
- -
-# AC_HEADER_EXT_HASH_SET
-AC_DEFUN([AC_HEADER_EXT_HASH_SET], [
-  AC_CACHE_CHECK(for ext/hash_set,
-  ac_cv_cxx_ext_hash_set,
-  [AC_LANG_SAVE
-  AC_LANG_CPLUSPLUS
-  ac_save_CXXFLAGS="$CXXFLAGS"
-  CXXFLAGS="$CXXFLAGS -Werror"	
-  AC_TRY_COMPILE([#include <ext/hash_set>], [using __gnu_cxx::hash_set;],
-  ac_cv_cxx_ext_hash_set=yes, ac_cv_cxx_ext_hash_set=no)
-  CXXFLAGS="$ac_save_CXXFLAGS"
-  AC_LANG_RESTORE
-  ])
-  if test "$ac_cv_cxx_ext_hash_set" = yes; then
-    AC_DEFINE(HAVE_EXT_HASH_SET,,[Define if ext/hash_set is present. ])
-  fi
-])
-
- - -
-No ios::nocreate/ios::noreplace. -
- -

The existence of ios::nocreate being used for -input-streams has been confirmed, most probably because the author -thought it would be more correct to specify nocreate explicitly. So -it can be left out for input-streams. -

- -

For output streams, "nocreate" is probably the default, -unless you specify std::ios::trunc ? To be safe, you can -open the file for reading, check if it has been opened, and then -decide whether you want to create/replace or not. To my knowledge, -even older implementations support app, ate -and trunc (except for app ?). -

- - -
-No stream::attach(int fd) -
- -

- Phil Edwards writes: It was considered and rejected for the ISO - standard. Not all environments use file descriptors. Of those - that do, not all of them use integers to represent them. -

- -

- For a portable solution (among systems which use - filedescriptors), you need to implement a subclass of - std::streambuf (or - std::basic_streambuf<..>) which opens a file - given a descriptor, and then pass an instance of this to the - stream-constructor. -

- -

- An extension is available that implements this. - <ext/stdio_filebuf.h> contains a derived class called - __gnu_cxx::stdio_filebuf. - This class can be constructed from a C FILE* or a file - descriptor, and provides the fd() function. -

- -

- For another example of this, refer to - fdstream example - by Nicolai Josuttis. -

- -
-Support for C++98 dialect. -
- -

Check for complete library coverage of the C++1998/2003 standard. -

- -
-
-# AC_HEADER_STDCXX_98
-AC_DEFUN([AC_HEADER_STDCXX_98], [
-  AC_CACHE_CHECK(for ISO C++ 98 include files,
-  ac_cv_cxx_stdcxx_98,
-  [AC_LANG_SAVE
-  AC_LANG_CPLUSPLUS
-  AC_TRY_COMPILE([
-    #include <cassert>
-    #include <cctype>
-    #include <cerrno>
-    #include <cfloat>
-    #include <ciso646>
-    #include <climits>
-    #include <clocale>
-    #include <cmath>
-    #include <csetjmp>
-    #include <csignal>
-    #include <cstdarg>
-    #include <cstddef>
-    #include <cstdio>
-    #include <cstdlib>
-    #include <cstring>
-    #include <ctime>
-
-    #include <algorithm>
-    #include <bitset>
-    #include <complex>
-    #include <deque>
-    #include <exception>
-    #include <fstream>
-    #include <functional>
-    #include <iomanip>
-    #include <ios>
-    #include <iosfwd>
-    #include <iostream>
-    #include <istream>
-    #include <iterator>
-    #include <limits>
-    #include <list>
-    #include <locale>
-    #include <map>
-    #include <memory>
-    #include <new>
-    #include <numeric>
-    #include <ostream>
-    #include <queue>
-    #include <set>
-    #include <sstream>
-    #include <stack>
-    #include <stdexcept>
-    #include <streambuf>
-    #include <string>
-    #include <typeinfo>
-    #include <utility>
-    #include <valarray>
-    #include <vector>
-  ],,
-  ac_cv_cxx_stdcxx_98=yes, ac_cv_cxx_stdcxx_98=no)
-  AC_LANG_RESTORE
-  ])
-  if test "$ac_cv_cxx_stdcxx_98" = yes; then
-    AC_DEFINE(STDCXX_98_HEADERS,,[Define if ISO C++ 1998 header files are present. ])
-  fi
-])
-
- - -
-Support for C++TR1 dialect. -
- -

Check for library coverage of the TR1 standard. -

- -
-
-# AC_HEADER_STDCXX_TR1
-AC_DEFUN([AC_HEADER_STDCXX_TR1], [
-  AC_CACHE_CHECK(for ISO C++ TR1 include files,
-  ac_cv_cxx_stdcxx_tr1,
-  [AC_LANG_SAVE
-  AC_LANG_CPLUSPLUS
-  AC_TRY_COMPILE([
-  #include <tr1/array>
-  #include <tr1/ccomplex>
-  #include <tr1/cctype>
-  #include <tr1/cfenv>
-  #include <tr1/cfloat>
-  #include <tr1/cinttypes>
-  #include <tr1/climits>
-  #include <tr1/cmath>
-  #include <tr1/complex>
-  #include <tr1/cstdarg>
-  #include <tr1/cstdbool>
-  #include <tr1/cstdint>
-  #include <tr1/cstdio>
-  #include <tr1/cstdlib>
-  #include <tr1/ctgmath>
-  #include <tr1/ctime>
-  #include <tr1/cwchar>
-  #include <tr1/cwctype>
-  #include <tr1/functional>
-  #include <tr1/memory>
-  #include <tr1/random>
-  #include <tr1/regex>
-  #include <tr1/tuple>
-  #include <tr1/type_traits>
-  #include <tr1/unordered_set>
-  #include <tr1/unordered_map>
-  #include <tr1/utility>
-  ],,
-  ac_cv_cxx_stdcxx_tr1=yes, ac_cv_cxx_stdcxx_tr1=no)
-  AC_LANG_RESTORE
-  ])
-  if test "$ac_cv_cxx_stdcxx_tr1" = yes; then
-    AC_DEFINE(STDCXX_TR1_HEADERS,,[Define if ISO C++ TR1 header files are present. ])
-  fi
-])
-
- -

An alternative is to check just for specific TR1 includes, such as <unordered_map> and <unordered_set>. -

- -
-# AC_HEADER_TR1_UNORDERED_MAP
-AC_DEFUN([AC_HEADER_TR1_UNORDERED_MAP], [
-  AC_CACHE_CHECK(for tr1/unordered_map,
-  ac_cv_cxx_tr1_unordered_map,
-  [AC_LANG_SAVE
-  AC_LANG_CPLUSPLUS
-  AC_TRY_COMPILE([#include <tr1/unordered_map>], [using std::tr1::unordered_map;],
-  ac_cv_cxx_tr1_unordered_map=yes, ac_cv_cxx_tr1_unordered_map=no)
-  AC_LANG_RESTORE
-  ])
-  if test "$ac_cv_cxx_tr1_unordered_map" = yes; then
-    AC_DEFINE(HAVE_TR1_UNORDERED_MAP,,[Define if tr1/unordered_map is present. ])
-  fi
-])
-
- -
-# AC_HEADER_TR1_UNORDERED_SET
-AC_DEFUN([AC_HEADER_TR1_UNORDERED_SET], [
-  AC_CACHE_CHECK(for tr1/unordered_set,
-  ac_cv_cxx_tr1_unordered_set,
-  [AC_LANG_SAVE
-  AC_LANG_CPLUSPLUS
-  AC_TRY_COMPILE([#include <tr1/unordered_set>], [using std::tr1::unordered_set;],
-  ac_cv_cxx_tr1_unordered_set=yes, ac_cv_cxx_tr1_unordered_set=no)
-  AC_LANG_RESTORE
-  ])
-  if test "$ac_cv_cxx_tr1_unordered_set" = yes; then
-    AC_DEFINE(HAVE_TR1_UNORDERED_SET,,[Define if tr1/unordered_set is present. ])
-  fi
-])
-
- - - -
-Support for C++0x dialect. -
- -

Check for baseline language coverage in the compiler for the C++0xstandard. -

- -
-# AC_COMPILE_STDCXX_OX
-AC_DEFUN([AC_COMPILE_STDCXX_0X], [
-  AC_CACHE_CHECK(if g++ supports C++0x features without additional flags,
-  ac_cv_cxx_compile_cxx0x_native,
-  [AC_LANG_SAVE
-  AC_LANG_CPLUSPLUS
-  AC_TRY_COMPILE([
-  template <typename T>
-    struct check 
-    {
-      static_assert(sizeof(int) <= sizeof(T), "not big enough");
-    };
-
-    typedef check<check<bool>> right_angle_brackets;
-
-    int a;
-    decltype(a) b;
-
-    typedef check<int> check_type;
-    check_type c;
-    check_type&& cr = c;],,
-  ac_cv_cxx_compile_cxx0x_native=yes, ac_cv_cxx_compile_cxx0x_native=no)
-  AC_LANG_RESTORE
-  ])
-
-  AC_CACHE_CHECK(if g++ supports C++0x features with -std=c++0x,
-  ac_cv_cxx_compile_cxx0x_cxx,
-  [AC_LANG_SAVE
-  AC_LANG_CPLUSPLUS
-  ac_save_CXXFLAGS="$CXXFLAGS"
-  CXXFLAGS="$CXXFLAGS -std=c++0x"	
-  AC_TRY_COMPILE([
-  template <typename T>
-    struct check 
-    {
-      static_assert(sizeof(int) <= sizeof(T), "not big enough");
-    };
-
-    typedef check<check<bool>> right_angle_brackets;
-
-    int a;
-    decltype(a) b;
-
-    typedef check<int> check_type;
-    check_type c;
-    check_type&& cr = c;],,
-  ac_cv_cxx_compile_cxx0x_cxx=yes, ac_cv_cxx_compile_cxx0x_cxx=no)
-  CXXFLAGS="$ac_save_CXXFLAGS"
-  AC_LANG_RESTORE
-  ])
-
-  AC_CACHE_CHECK(if g++ supports C++0x features with -std=gnu++0x,
-  ac_cv_cxx_compile_cxx0x_gxx,
-  [AC_LANG_SAVE
-  AC_LANG_CPLUSPLUS
-  ac_save_CXXFLAGS="$CXXFLAGS"
-  CXXFLAGS="$CXXFLAGS -std=gnu++0x"	
-  AC_TRY_COMPILE([
-  template <typename T>
-    struct check 
-    {
-      static_assert(sizeof(int) <= sizeof(T), "not big enough");
-    };
-
-    typedef check<check<bool>> right_angle_brackets;
-
-    int a;
-    decltype(a) b;
-
-    typedef check<int> check_type;
-    check_type c;
-    check_type&& cr = c;],,
-  ac_cv_cxx_compile_cxx0x_gxx=yes, ac_cv_cxx_compile_cxx0x_gxx=no)
-  CXXFLAGS="$ac_save_CXXFLAGS"
-  AC_LANG_RESTORE
-  ])
-
-  if test "$ac_cv_cxx_compile_cxx0x_native" = yes || 
-     test "$ac_cv_cxx_compile_cxx0x_cxx" = yes || 
-     test "$ac_cv_cxx_compile_cxx0x_gxx" = yes; then
-    AC_DEFINE(HAVE_STDCXX_0X,,[Define if g++ supports C++0x features. ])
-  fi
-])
-
- - -

Check for library coverage of the C++0xstandard. -

- -
-
-# AC_HEADER_STDCXX_0X
-AC_DEFUN([AC_HEADER_STDCXX_0X], [
-  AC_CACHE_CHECK(for ISO C++ 0x include files,
-  ac_cv_cxx_stdcxx_0x,
-  [AC_REQUIRE([AC_COMPILE_STDCXX_0X])
-  AC_LANG_SAVE
-  AC_LANG_CPLUSPLUS
-  ac_save_CXXFLAGS="$CXXFLAGS"
-  CXXFLAGS="$CXXFLAGS -std=gnu++0x"	
-
-  AC_TRY_COMPILE([
-    #include <cassert>
-    #include <ccomplex>
-    #include <cctype>
-    #include <cerrno>
-    #include <cfenv>
-    #include <cfloat>
-    #include <cinttypes>
-    #include <ciso646>
-    #include <climits>
-    #include <clocale>
-    #include <cmath>
-    #include <csetjmp>
-    #include <csignal>
-    #include <cstdarg>
-    #include <cstdbool>
-    #include <cstddef>
-    #include <cstdint>
-    #include <cstdio>
-    #include <cstdlib>
-    #include <cstring>
-    #include <ctgmath>
-    #include <ctime>
-    #include <cwchar>
-    #include <cwctype>
-
-    #include <algorithm>
-    #include <array>
-    #include <bitset>
-    #include <complex>
-    #include <deque>
-    #include <exception>
-    #include <fstream>
-    #include <functional>
-    #include <iomanip>
-    #include <ios>
-    #include <iosfwd>
-    #include <iostream>
-    #include <istream>
-    #include <iterator>
-    #include <limits>
-    #include <list>
-    #include <locale>
-    #include <map>
-    #include <memory>
-    #include <new>
-    #include <numeric>
-    #include <ostream>
-    #include <queue>
-    #include <random>
-    #include <regex>
-    #include <set>
-    #include <sstream>
-    #include <stack>
-    #include <stdexcept>
-    #include <streambuf>
-    #include <string>
-    #include <tuple>
-    #include <typeinfo>
-    #include <type_traits>
-    #include <unordered_map>
-    #include <unordered_set>
-    #include <utility>
-    #include <valarray>
-    #include <vector>
-  ],,
-  ac_cv_cxx_stdcxx_0x=yes, ac_cv_cxx_stdcxx_0x=no)
-  AC_LANG_RESTORE
-  CXXFLAGS="$ac_save_CXXFLAGS"
-  ])
-  if test "$ac_cv_cxx_stdcxx_0x" = yes; then
-    AC_DEFINE(STDCXX_0X_HEADERS,,[Define if ISO C++ 0x header files are present. ])
-  fi
-])
-
- -

As is the case for TR1 support, these autoconf macros can be made for a finer-grained, per-header-file check. For <unordered_map> -

- -
-
-# AC_HEADER_UNORDERED_MAP
-AC_DEFUN([AC_HEADER_UNORDERED_MAP], [
-  AC_CACHE_CHECK(for unordered_map,
-  ac_cv_cxx_unordered_map,
-  [AC_REQUIRE([AC_COMPILE_STDCXX_0X])
-  AC_LANG_SAVE
-  AC_LANG_CPLUSPLUS
-  ac_save_CXXFLAGS="$CXXFLAGS"
-  CXXFLAGS="$CXXFLAGS -std=gnu++0x"	
-  AC_TRY_COMPILE([#include <unordered_map>], [using std::unordered_map;],
-  ac_cv_cxx_unordered_map=yes, ac_cv_cxx_unordered_map=no)
-  CXXFLAGS="$ac_save_CXXFLAGS"
-  AC_LANG_RESTORE
-  ])
-  if test "$ac_cv_cxx_unordered_map" = yes; then
-    AC_DEFINE(HAVE_UNORDERED_MAP,,[Define if unordered_map is present. ])
-  fi
-])
-
- -
-# AC_HEADER_UNORDERED_SET
-AC_DEFUN([AC_HEADER_UNORDERED_SET], [
-  AC_CACHE_CHECK(for unordered_set,
-  ac_cv_cxx_unordered_set,
-  [AC_REQUIRE([AC_COMPILE_STDCXX_0X])
-  AC_LANG_SAVE
-  AC_LANG_CPLUSPLUS
-  ac_save_CXXFLAGS="$CXXFLAGS"
-  CXXFLAGS="$CXXFLAGS -std=gnu++0x"	
-  AC_TRY_COMPILE([#include <unordered_set>], [using std::unordered_set;],
-  ac_cv_cxx_unordered_set=yes, ac_cv_cxx_unordered_set=no)
-  CXXFLAGS="$ac_save_CXXFLAGS"
-  AC_LANG_RESTORE
-  ])
-  if test "$ac_cv_cxx_unordered_set" = yes; then
-    AC_DEFINE(HAVE_UNORDERED_SET,,[Define if unordered_set is present. ])
-  fi
-])
-
- - -
-Container iterator_type is not necessarily container value_type* -
- - -
-

- Fourth, and future -

- -
-

- Links -

- -

-Migrating to gcc-4.1, by Dan Kegel. -

- -

-Building the whole Debian archive with GCC 4.1: a summary, by Martin Michlmayr -

- -

-Migration guide for GCC-3.2 -

- - - - diff --git a/libstdc++-v3/docs/html/17_intro/c++0x_status.html b/libstdc++-v3/docs/html/17_intro/c++0x_status.html deleted file mode 100644 index cfc28ed44a5..00000000000 --- a/libstdc++-v3/docs/html/17_intro/c++0x_status.html +++ /dev/null @@ -1,2290 +0,0 @@ - - - - - - - - - - - - Status of C++0x features in GCC - - GNU Project - Free Software Foundation (FSF) - - - - - - -

- Status of C++0x features in GCC -

- -

-This table is based on the table of contents of ISO/IEC -Doc No: N2461=07-0331 Date: 2007-10-22 -Working Draft, Standard for Programming Language C++ -

- -

-In this implementation -std=gnu++0x or --std=c++0x flags must be used to enable language and -library features. The pre-defined symbol -__GXX_EXPERIMENTAL_CXX0X__ is used to check for the -presence of the required flag. -

- -

-This page describes the C++0x support in mainline GCC SVN, not in any -particular release. -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
SectionDescriptionDoneBrokenMissingComments
20General Utilities
20.2Utility Componentsincomplete
20.2.1Operatorspartial
20.2.2forward/move helperspartial
20.2.3Pairsdone
20.3Header <tuple> synopsisdone
20.3.1Class template tupledone
20.3.1.1Constructiondone
20.3.1.2Tuple creation functionsdone
20.3.1.3Tuple helper classesdone
20.3.1.4Element accessdone
20.3.1.5Relational operatorsdone
20.4Metaprogramming and type traits
20.4.1Requirementsdone
20.4.2Header <type_traits> synopsisdone
20.4.3Helper classesdone
20.4.4General Requirementsdone
20.4.5Unary Type Traitsdone
20.4.5.1Primary Type Categoriesdone
20.4.5.2Composite type traitsdone
20.4.5.3Type propertiesdone
20.4.6Relationships between typesdone
20.4.7Transformations between typesdone
20.4.7.1Const-volatile modificationsdone
20.4.7.2Reference modificationsdone
20.4.7.3Array modificationsdone
20.4.7.4Pointer modificationsdone
20.4.8Other transformationsdone
20.4.9Implementation requirementsdone
20.5 Function Objectsdone
20.5Additions to header <functional> synopsisdone
20.5.1Definitionsdone
20.5.2Requirementsdone
20.5.3Basedone
20.5.4Function return typesdone
20.5.5Class template reference_wrapperdone
20.5.5.1reference_wrapper construct/copy/destroydone
20.5.5.2reference_wrapper assignmentdone
20.5.5.3reference_wrapper accessdone
20.5.5.4reference_wrapper invocationdone
20.5.5.5reference_wrapper helper functionsdone
20.5.14Function template mem_fndone
20.5.11Template function binddone
20.5.11.1Function object bindersdone
20.5.11.1.1Class template is_bind_expressiondone
20.5.11.1.2Class template is_placeholderdone
20.5.11.1.3Function template binddone
20.5.11.1.4Placeholdersdone
20.5.15Polymorphic function wrappersdone
20.5.15.1Class bad_function_calldone
20.5.15.1.1bad_function_call constructordone
20.5.15.2Class template functiondone
20.5.15.2.1function construct/copy/destroydone
20.5.15.2.2function modifiersdone
20.5.15.2.3function capacitydone
20.5.15.2.4function invocationdone
20.5.15.2.5function target accessdone
20.5.15.2.7null pointer comparison operatorsdone
20.5.15.2.8specialized algorithmsdone
20.5.16Class template hashdone
20.6Additions to header <memory> synopsispartialmissing unique_ptr
20.6.5Class template unique_ptrmissing
20.6.6Smart pointersdone
20.6.6.1Class bad_weak_ptrdone
20.6.6.2Class template shared_ptrdone1
20.6.6.2.1shared_ptr constructorsdone
20.6.6.2.2shared_ptr destructordone
20.6.6.2.3shared_ptr assignmentdone
20.6.6.2.4shared_ptr modifiersdone
20.6.6.2.5shared_ptr observersdone
20.6.6.2.6shared_ptr creationdone - N2351 -
20.6.6.2.7shared_ptr comparisondone
20.6.6.2.8shared_ptr I/Odone
20.6.6.2.9shared_ptr specialized algorithmsdone
20.6.6.2.10shared_ptr castsdone
20.6.6.2.11get_deleterdone
20.6.6.3Class template weak_ptrdone
20.6.6.3.1weak_ptr constructorsdone
20.6.6.3.2weak_ptr destructordone
20.6.6.3.3weak_ptr assignmentdone
20.6.6.3.4weak_ptr modifiersdone
20.6.6.3.5weak_ptr observersdone
20.6.6.3.6weak_ptr comparisondone
20.6.6.3.7weak_ptr specialized algorithmsdone
20.6.6.4Class template enable_shared_from_thisdone
23Containers
23.2.1Header <array> synopsisdone
23.2.1Class template arraydone
23.2.1.1array constructors, copy, and assignmentdone
23.2.1.2array specialized algorithmsdone
23.2.1.3array sizedone
23.2.1.4array datadone
23.2.1.5Zero sized arraysdone
23.2.1.6Tuple interface to class template arraydone
23.4Unordered associative containersdone
23.4.1Class template unordered_mapdone
23.4.1.1unordered_map constructorsdone
23.4.1.2unordered_map element accessdone
23.4.1.3unordered_map swapdone
23.4.2Class template unordered_multimapdone
23.4.2.1unordered_multimap constructorsdone
23.4.2.2unordered_multimap swapdone
23.4.3Class template unordered_setdone
23.4.3.1unordered_set constructorsdone
23.4.3.2unordered_set swapdone
23.4.4Class template unordered_multisetdone
23.4.4.1unordered_multiset constructorsdone
23.4.4.2unordered_multiset swapdone
26Numerics
26.4Random number generationdone
26.4.1Requirementsdone
26.4.2Header <random> synopsispartial
26.4.3Random number engine class templatesdone
26.4.3.1Class template linear_congruential_enginedone
26.4.3.2Class template mersenne_twister_enginedone
26.4.3.3Class template subtract_with_carry_enginedone
26.4.4Random number engine adaptor class templatesdone
26.4.4.1Class template discard_block_enginedone
26.4.4.2Class template independent_bits_enginedone
26.4.4.3Class template shuffle_order_enginedone
26.4.4.4Class template xor_combine_enginedoneoperator()() per N2079
26.4.5Engines and engine adaptors with predefined parametersdone
26.4.6Class random_devicedone
26.4.7Utilitiesdone
26.4.7.1Class seed_seqmissing
26.4.7.2Function template generate_cannonicalmissing
26.4.8Random number generation class templatesdone
26.4.8.1Uniform distributionspartial
26.4.8.1Class template uniform_int_distributionmissing
26.4.8.1Class template uniform_real_distributionmissing
26.4.8.2Bernoulli distributionspartial
26.4.8.2.1Class bernoulli_distributiondone
26.4.8.2.2Class template binomial_distributiondone
26.4.8.2.3Class template geometric_distributiondone
26.4.8.2.4Class template negative_binomial_distributionmissing
26.4.8.3Poisson distributionspartial
26.4.8.3.1Class template poisson_distributiondone
26.4.8.3.2Class template exponential_distributiondone
26.4.8.3.3Class template gamma_distributiondone
26.4.8.3.4Class template weibull_distributionmissing
26.4.8.3.5Class template extreme_value_distributionmissing
26.4.8.4Normal distributionspartial
26.4.8.4.1Class template normal_distributiondone
26.4.8.4.2Class template lognormal_distributionmissing
26.4.8.4.3Class template chi_squared_distributionmissing
26.4.8.4.4Class template cauchy_distributionmissing
26.4.8.4.5Class template fisher_f_distributionmissing
26.4.8.4.6Class template student_t_distributionmissing
26.4.8.5Sampling distributionsmissing
26.4.8.5.1Class template discrete_distributionmissing
26.4.8.5.1Class template piecewise_constant_distributionmissing
26.4.8.5.1Class template general_pdf_distributionmissing
28Regular expressions
28.1Definitionsmissing
28.2Requirementsmissing
28.3Regular expressions summarymissing
28.4Header <regex> synopsismissing
28.5Namespace tr1::regex_constantsmissing
28.5.1Bitmask Type syntax_option_typemissing
28.5.2Bitmask Type regex_constants::match_flag_typemissing
28.5.3Implementation defined error_typemissing
28.6Class regex_errormissing
28.7Class template regex_traitsmissing
28.8Class template basic_regexmissing
28.8.1basic_regex constantsmissing
28.8.2basic_regex constructorsmissing
28.8.3basic_regex assignmissing
28.8.4basic_regex constant operationsmissing
28.8.5basic_regex localemissing
28.8.6basic_regex swapmissing
28.8.7basic_regex non-member functionsmissing
28.8.7.1basic_regex non-member swapmissing
28.9Class template sub_matchmissing
28.9.1sub_match membersmissing
28.9.2sub_match non-member operatorsmissing
28.10Class template match_resultsmissing
28.10.1match_results constructorsmissing
28.10.2match_results sizemissing
28.10.3match_results element accessmissing
28.10.4match_results formattingmissing
28.10.5match_results allocatormissing
28.10.6match_results swapmissing
28.11Regular expression algorithmsmissing
28.11.1exceptionsmissing
28.11.2regex_matchmissing
28.11.3regex_searchmissing
28.11.4regex_replacemissing
28.12Regular expression Iteratorsmissing
28.12.1Class template regex_iteratormissing
28.12.1.1regex_iterator constructorsmissing
28.12.1.2regex_iterator comparisonsmissing
28.12.1.3regex_iterator dereferencemissing
28.12.1.4regex_iterator incrementmissing
28.12.2Class template regex_token_iteratormissing
28.12.2.1regex_token_iterator constructorsmissing
28.12.2.2regex_token_iterator comparisonsmissing
28.12.2.3regex_token_iterator dereferencemissing
28.12.2.4regex_token_iterator incrementmissing
28.13Modified ECMAScript regular expression grammarmissing
CC compatibility
C2.1Additions to header <complex>done
C2.1.1Synopsisdone
C2.1.2Function acosdone
C2.1.3Function asindone
C2.1.4Function atandone
C2.1.5Function acoshdone
C2.1.6Function asinhdone
C2.1.7Function atanhdone
C2.1.8Function fabsdone
C2.1.9Additional Overloadsdone
C2.2Header <ccomplex>missingDR 551
C2.3Header <complex.h>missingDR 551
C2.4Additions to header <cctype>done
C2.4.1Synopsisdone
C2.4.2Function isblankdone
C2.5Additions to header <ctype.h>done
C2.6Header <cfenv>done
C2.6.1Synopsisdone
C2.6.2Definitionsdone
C2.7Header <fenv.h>done
C2.8Additions to header <cfloat>done
C2.9Additions to header <float.h>done
C2.10Additions to header <ios>missing
C2.10.1Synopsismissing
C2.10.2Function hexfloatmissing
C2.11Header <cinttypes>done
C2.11.1SynopsisdoneDR 557
C2.11.2Definitionsdone
C2.12Header <inttypes.h>done
C2.13Additions to header <climits>done
C2.14Additions to header <limits.h>done
C2.15Additions to header <locale>missing
C2.16Additions to header <cmath>done
C2.16.1Synopsisdone
C2.16.2Definitionsdone
C2.16.3Function template definitionsdone
C2.16.4Additional overloadsdoneDR 568; DR 550
C2.17Additions to header <math.h>done
C2.18Additions to header <cstdarg>done
C2.19Additions to header <stdarg.h>done
C2.20The header <cstdbool>done
C2.21The header <stdbool.h>done
C2.22The header <cstdint>done
C2.22.1Synopsisdone
C2.22.2Definitionsdone
C2.23The header <stdint.h>done
C2.24Additions to header <cstdio>done
C2.24.1Synopsisdone
C2.24.2Definitionsdone
C2.24.3Additional format specifiersdoneC library responsibility
C2.24.4Additions to header <stdio.h>done
C2.25Additions to header <cstdlib>done
C2.25.1Synopsisdone
C2.25.2Definitionsdone
C2.25.3Function absdone
C2.25.4Function divdone
C2.26Additions to header <stdlib.h>done
C2.27Header <ctgmath>doneDR 551
C2.28Header <tgmath.h>doneDR 551
C2.29Additions to header <ctime>doneC library responsibility
C2.30Additions to header <cwchar>done
C2.30.1Synopsisdone
C2.30.2Definitionsdone
C2.30.3Additional wide format specifiersdoneC library responsibility
C2.31Additions to header <wchar.h>done
C2.32Additions to header <cwctype>done
C2.32.1Synopsisdone
C2.32.2Function iswblankdone
C2.33Additions to header <wctype.h>done
DCompatibility Features
D.6Old iostream membersdone
D.8Bindersdone33911
D.9Class template auto_ptrdone33911
- -

Footnotes

- -
    - -
  1. - - The shared_ptr implementation uses some code from the - Boost - shared_ptr library. -
  2. - -
- -

-Please send FSF & GNU inquiries & questions to -gnu@gnu.org. -There are also other ways -to contact the FSF. -

- -

-These pages are maintained by -the GCC team. -

- -
-For questions related to the use of GCC, please consult these web -pages and the GCC manuals. If -that fails, the gcc-help@gcc.gnu.org -mailing list might help.
-Please send comments on these web pages and the development of GCC to our -developer mailing list at gcc@gnu.org -or gcc@gcc.gnu.org. All of our lists -have public archives. -
- -

-Copyright (C) Free Software Foundation, Inc., -51 Franklin St, Fifth Floor, Boston, MA 02110, USA. -

-

-Verbatim copying and distribution of this entire article is -permitted in any medium, provided this notice is preserved. -

- - - - - - -
- Last modified 2007-10-30 - - - Valid XHTML 1.0 - -
- - - diff --git a/libstdc++-v3/docs/html/17_intro/c++1998_status.html b/libstdc++-v3/docs/html/17_intro/c++1998_status.html deleted file mode 100644 index 7865e649982..00000000000 --- a/libstdc++-v3/docs/html/17_intro/c++1998_status.html +++ /dev/null @@ -1,6004 +0,0 @@ -
-
-   Completion Checklist for the Standard C++ Library
-   Updated: 2003-04-25
-
-   Status Code Legend:
-    M - Missing
-    S - Present as stub.
-    X - Partially implemented, or buggy.
-    T - Implemented, pending test/inspection.
-    V - Verified to pass all available test suites.
-    Q - Qualified by inspection for non-testable correctness.
-    P - Portability verified.
-    C - Certified.
-
-   Lexical notes:
-   Only status codes appear in column 0.  Notes relating to conformance
-   issues appear [in brackets].
-
-   Note that this checklist does not (yet) include all emendations
-   recommended by the ISO Library Working Group:
-   http://anubis.dkuug.dk/jtc1/sc22/wg21/docs/lwg-toc.html
-
-   Detailed explanation of status codes:
-
-    M - Missing:  The name is not visible to programs that include
-        the specified header, either at compile or link stage.
-
-    S - Present as stub:  A program can use the name, but no implementation
-        is provided.  Programs that use the name link correctly, but
-        cannot usefully be run.
-
-    X - Partially implemented, or buggy:  Some implementation has been
-        provided, but it is known or believed not to conform fully.
-        It may have an incorrect base class, wrong namespace, wrong
-        storage class, or simply not fully implement requirements.
-        However, it may be sufficiently usable to help test other
-        components.
-
-    T - Implemented, pending test/inspection:  Implementation believed
-        to be complete, and informal testing suggests it is ready for
-        formal verification.
-
-    V - Verified, passes all test suites:  Verified to satisfy all
-        generically testable conformance requirements.
-
-    Q - Qualified by inspection for non-testable correctness:
-        Inspected, "implementation-defined" documentation accepted,
-        local usability criteria satisfied, formally inspected for
-        other untestable conformance.  (Untestable requirements
-        include exception-safety, thread-safety, worst-case
-        complexity, memory cleanliness, usefulness.)
-
-    P - Portability verified:  Qualified on all primary target platforms.
-
-    C - Certified:  Formally certified to have passed all tests,
-        inspections, qualifications; approved under "signing authority"
-        to be used to satisfy contractual guarantees.
-
-   ----------------------------------------------------------------------
-                          
-                                 
-                                  
-X                          
-                             
-                      
-          
-
-   [C header names must be in std:: to qualify.  Related to shadow/ dir.]
-                
-                
-X               
-                
-
-    Macro:
-X   errno,  declared  or  defined in .
-
-    Macro fn:
-X   setjmp(jmp_buf), declared or defined in 
-X   va_end(va_list), declared or defined in 
-
-    Types:
-X   clock_t, div_t, FILE, fpos_t, lconv, ldiv_t, mbstate_t,
-X   ptrdiff_t, sig_atomic_t, size_t,  time_t,  tm,  va_list,
-X   wctrans_t, wctype_t, and wint_t.
-
-   1 Which  of  the functions in the C++ Standard Library are not reentrant
-    subroutines is implementation-defined.
-
-   18.1  Types                                        [lib.support.types]
-X      
-X      NULL
-X      offsetof
-X      ptrdiff_t
-X      size_t
-
-   18.2  Implementation properties                   [lib.support.limits]
-
-    , , and 
-
-   18.2.1  Numeric limits                                    [lib.limits]
-
-X   template class numeric_limits;
-
-T   enum float_round_style;
-T   enum float_denorm_style;
-
-T   template<> class numeric_limits;
-
-T   template<> class numeric_limits;
-T   template<> class numeric_limits;
-T   template<> class numeric_limits;
-T   template<> class numeric_limits;
-
-T   template<> class numeric_limits;
-T   template<> class numeric_limits;
-T   template<> class numeric_limits;
-T   template<> class numeric_limits;
-T   template<> class numeric_limits;
-T   template<> class numeric_limits;
-
-X   template<> class numeric_limits;
-X   template<> class numeric_limits;
-X   template<> class numeric_limits;
-
-   18.2.1.1  Template class numeric_limits           [lib.numeric.limits]
-T   template class numeric_limits {
-    public:
-T     static const bool is_specialized = false;
-T     static T min() throw();
-T     static T max() throw();
-T     static const int  digits = 0;
-T     static const int  digits10 = 0;
-T     static const bool is_signed = false;
-T     static const bool is_integer = false;
-T     static const bool is_exact = false;
-T     static const int  radix = 0;
-T     static T epsilon() throw();
-T     static T round_error() throw();
-
-T     static const int  min_exponent = 0;
-T     static const int  min_exponent10 = 0;
-T     static const int  max_exponent = 0;
-T     static const int  max_exponent10 = 0;
-
-T     static const bool has_infinity = false;
-T     static const bool has_quiet_NaN = false;
-T     static const bool has_signaling_NaN = false;
-T     static const float_denorm_style has_denorm = denorm_absent;
-T     static const bool has_denorm_loss = false;
-T     static T infinity() throw();
-T     static T quiet_NaN() throw();
-T     static T signaling_NaN() throw();
-T     static T denorm_min() throw();
-
-T     static const bool is_iec559 = false;
-T     static const bool is_bounded = false;
-T     static const bool is_modulo = false;
-
-T     static const bool traps = false;
-T     static const bool tinyness_before = false;
-T     static const float_round_style round_style = round_toward_zero;
-    };
-
-   18.2.1.3  Type float_round_style                     [lib.round.style]
-
-T   enum float_round_style {
-T     round_indeterminate       = -1,
-T     round_toward_zero         =  0,
-T     round_to_nearest          =  1,
-T     round_toward_infinity     =  2,
-T     round_toward_neg_infinity =  3
-    };
-
-   18.2.1.4  Type float_denorm_style                   [lib.denorm.style]
-
-T   enum float_denorm_style {
-T     denorm_indeterminate = -1;
-T     denorm_absent = 0;
-T     denorm present = 1;
-    };
-
-   18.2.1.5  numeric_limits specializations         [lib.numeric.special]
-   
-   [Note: see Note at 18.2.1.  ]
-
-   18.2.2  C Library                                       [lib.c.limits]
-
-   1 Header  (Table 3):
-      CHAR_BIT   INT_MAX    LONG_MIN     SCHAR_MIN   UCHAR_MAX   USHRT_MAX
-X     CHAR_MAX   INT_MIN    MB_LEN_MAX   SHRT_MAX    UINT_MAX
-      CHAR_MIN   LONG_MAX   SCHAR_MAX    SHRT_MIN    ULONG_MAX
-
-   3 Header  (Table 4):
-
-    DBL_DIG          DBL_MIN_EXP      FLT_MIN_10_EXP   LDBL_MAX_10_EXP
-    DBL_EPSILON      FLT_DIG          FLT_MIN_EXP      LDBL_MAX_EXP
-    DBL_MANT_DIG     FLT_EPSILON      FLT_RADIX        LDBL_MIN
-X   DBL_MAX          FLT_MANT_DIG     FLT_ROUNDS       LDBL_MIN_10_EXP
-    DBL_MAX_10_EXP   FLT_MAX          LDBL_DIG         LDBL_MIN_EXP
-    DBL_MAX_EXP      FLT_MAX_10_EXP   LDBL_EPSILON
-    DBL_MIN          FLT_MAX_EXP      LDBL_MANT_DIG
-    DBL_MIN_10_EXP   FLT_MIN          LDBL_MAX
-
-
-        1 Header  (partial), Table 5:
-X             EXIT_FAILURE     EXIT_SUCCESS
-              abort   atexit   exit
-
-S    abort(void)
-S    extern "C" int atexit(void (*f)(void))
-S    extern "C++" int atexit(void (*f)(void))
-S    exit(int status)
-
-   18.4  Dynamic memory management                  [lib.support.dynamic]
-
-   Header  synopsis
-
-T    class bad_alloc;
-T    struct nothrow_t {};
-T    extern const nothrow_t nothrow;
-T    typedef void (*new_handler)();
-T    new_handler set_new_handler(new_handler new_p) throw();
-
-T    void* operator new(std::size_t size) throw(std::bad_alloc);
-T    void* operator new(std::size_t size, const std::nothrow_t&) throw();
-T    void  operator delete(void* ptr) throw();
-T    void  operator delete(void* ptr, const std::nothrow_t&) throw();
-T    void* operator new[](std::size_t size) throw(std::bad_alloc);
-T    void* operator new[](std::size_t size, const std::nothrow_t&) throw();
-T    void  operator delete[](void* ptr) throw();
-T    void  operator delete[](void* ptr, const std::nothrow_t&) throw();
-T    void* operator new  (std::size_t size, void* ptr) throw();
-T    void* operator new[](std::size_t size, void* ptr) throw();
-T    void  operator delete  (void* ptr, void*) throw();
-T    void  operator delete[](void* ptr, void*) throw();
-
-   18.4.2.1  Class bad_alloc                              [lib.bad.alloc]
-
-T   class bad_alloc : public exception {
-    public:
-T     bad_alloc() throw();
-T     bad_alloc(const bad_alloc&) throw();
-T     bad_alloc& operator=(const bad_alloc&) throw();
-T     virtual ~bad_alloc() throw();
-T     virtual const char* what() const throw();
-
-
-
-T  new_handler set_new_handler(new_handler new_p) throw();
-
-
-     Header  synopsis
-
-T    class type_info;
-T    class bad_cast;
-T    class bad_typeid;
-
-   18.5.1 - Class type_info [lib.type.info]
-
-T    class type_info {
-    public:
-T      virtual ~type_info();
-T      bool operator==(const type_info& rhs) const;
-T      bool operator!=(const type_info& rhs) const;
-T      bool before(const type_info& rhs) const;
-T      const char* name() const;
-    private:
-T      type_info(const type_info& rhs);
-T      type_info& operator=(const type_info& rhs);
-    };
-
-   18.5.2 - Class bad_cast [lib.bad.cast]
-
-T  bad_cast() throw();
-T  virtual const char* bad_cast::what() const throw();
-
-   18.5.3  Class bad_typeid                              [lib.bad.typeid]
-
-T    class bad_typeid : public exception {
-    public:
-T      bad_typeid() throw();
-T      bad_typeid(const bad_typeid&) throw();
-T      bad_typeid& operator=(const bad_typeid&) throw();
-T      virtual ~bad_typeid() throw();
-T      virtual const char* what() const throw();
-    };
-
-   18.6  Exception handling                       [lib.support.exception]
-
-T      Header  synopsis
-
-T    class exception;
-T    class bad_exception;
-
-T    typedef void (*unexpected_handler)();
-T    unexpected_handler set_unexpected(unexpected_handler f) throw();
-T    void unexpected();
-T    typedef void (*terminate_handler)();
-T    terminate_handler set_terminate(terminate_handler f) throw();
-T    void terminate();
-T    bool uncaught_exception();
-
-   18.6.1  Class exception                                [lib.exception]
-
-T    class exception {
-     public:
-T      exception() throw();
-T      exception(const exception&) throw();
-T      exception& operator=(const exception&) throw();
-T      virtual ~exception() throw();
-T      virtual const char* what() const throw();
-    };
-
-   18.6.2.1  Class bad_exception                      [lib.bad.exception]
-T    class bad_exception : public exception {
-    public:
-T      bad_exception() throw();
-T      bad_exception(const bad_exception&) throw();
-T      bad_exception& operator=(const bad_exception&) throw();
-T      virtual ~bad_exception() throw();
-T      virtual const char* what() const throw();
-    };
-
-   18.7  Other runtime support                      [lib.support.runtime]
-
-   1 Headers  (variable arguments),    (nonlocal  jumps),
-      (system  clock clock(), time()),  (signal handling),
-    and  (runtime environment getenv(), system()).
-
-                    Table 6--Header  synopsis
-                 Macros:   va_arg    va_end   va_start
-X                Type:     va_list
-
-                    Table 7--Header  synopsis
-
-                          Macro:      setjmp |
-X                         Type:       jmp_buf
-                          Function:   longjmp
-
-                     Table 8--Header  synopsis
-
-                      Macros:      CLOCKS_PER_SEC
-X                     Types:       clock_t
-                      Functions:   clock
-
-                    Table 9--Header  synopsis
-
-X        Macros:      SIGABRT        SIGILL   SIGSEGV   SIG_DFL
-         SIG_IGN      SIGFPE         SIGINT   SIGTERM   SIG_ERR
-         Type:        sig_atomic_t
-         Functions:   raise          signal
-
-                   Table 10--Header  synopsis
-
-X                     Functions:   getenv   system
-
-   19.1  Exception classes                           [lib.std.exceptions]
-
-   Header  synopsis
-
-T     class logic_error;
-T     class domain_error;
-T     class invalid_argument;
-T     class length_error;
-T     class out_of_range;
-T     class runtime_error;
-T     class range_error;
-T     class overflow_error;
-T     class underflow_error;
-
-   19.1.1  Class logic_error                            [lib.logic.error]
-T   class logic_error : public exception {
-    public:
-T     explicit logic_error(const string& what_arg);
-    };
-
-   19.1.2  Class domain_error                          [lib.domain.error]
-
-T   class domain_error : public logic_error {
-    public:
-T     explicit domain_error(const string& what_arg);
-    };
-
-   19.1.3  Class invalid_argument                  [lib.invalid.argument]
-
-T   class invalid_argument : public logic_error {
-    public:
-T     explicit invalid_argument(const string& what_arg);
-    };
-
-   19.1.4  Class length_error                          [lib.length.error]
-
-T   class length_error : public logic_error {
-    public:
-T     explicit length_error(const string& what_arg);
-    };
-
-   19.1.5  Class out_of_range                          [lib.out.of.range]
-
-T   class out_of_range : public logic_error {
-    public:
-T     explicit out_of_range(const string& what_arg);
-    };
-
-
-   19.1.6  Class runtime_error                        [lib.runtime.error]
-
-T   class runtime_error : public exception {
-    public:
-T     explicit runtime_error(const string& what_arg);
-    };
-
-
-   19.1.7  Class range_error                            [lib.range.error]
-
-T   class range_error : public runtime_error {
-    public:
-T     explicit range_error(const string& what_arg);
-    };
-
-   19.1.8  Class overflow_error                      [lib.overflow.error]
-
-T   class overflow_error : public runtime_error {
-    public:
-T     explicit overflow_error(const string& what_arg);
-    };
-
-
-   19.1.9  Class underflow_error                    [lib.underflow.error]
-
-T   class underflow_error : public runtime_error {
-    public:
-T     explicit underflow_error(const string& what_arg);
-    };
-
-
-   19.2  Assertions                                      [lib.assertions]
-
-                    Table 2--Header  synopsis
-
-X                         Macro:   assert
-
-   19.3  Error numbers                                        [lib.errno]
-
-                    Table 3--Header  synopsis
-
-X                    |Macros:   EDOM   ERANGE   errno |
-
-
-   20.2  Utility components                                 [lib.utility]
-
-   Header  synopsis
-
-    // _lib.operators_, operators:
-T    namespace rel_ops {
-T      template bool operator!=(const T&, const T&);
-T      template bool operator> (const T&, const T&);
-T      template bool operator<=(const T&, const T&);
-T      template bool operator>=(const T&, const T&);
-    }
-    // _lib.pairs_, pairs:
-T   template  struct pair;
-T   template 
-      bool operator==(const pair&, const pair&);
-T   template 
-      bool operator< (const pair&, const pair&);
-T   template 
-      bool operator!=(const pair&, const pair&);
-T   template 
-      bool operator> (const pair&, const pair&);
-T   template 
-      bool operator>=(const pair&, const pair&);
-T   template 
-      bool operator<=(const pair&, const pair&);
-T   template  pair make_pair(const T1&, const T2&);
-
-
-   20.2.2  Pairs                                              [lib.pairs]
-
-T  template 
-   struct pair {
-T    typedef T1 first_type;
-T    typedef T2 second_type;
-
-T    T1 first;
-T    T2 second;
-T    pair();
-T    pair(const T1& x, const T2& y);
-T    template pair(const pair &p);
-   };
-
-   20.3  Function objects                          [lib.function.objects]
-
-   Header  synopsis
-
-    // _lib.base_, base:
-V   template  struct unary_function;
-V   template  struct binary_function;
-
-    // _lib.arithmetic.operations_, arithmetic operations:
-V   template  struct plus;
-V   template  struct minus;
-V   template  struct multiplies;
-V   template  struct divides;
-V   template  struct modulus;
-V   template  struct negate;
-    // _lib.comparisons_, comparisons:
-V   template  struct equal_to;
-V   template  struct not_equal_to;
-V   template  struct greater;
-V   template  struct less;
-V   template  struct greater_equal;
-V   template  struct less_equal;
-    // _lib.logical.operations_, logical operations:
-V   template  struct logical_and;
-V   template  struct logical_or;
-V   template  struct logical_not;
-    // _lib.negators_, negators:
-    template  struct unary_negate;
-V   template 
-      unary_negate  not1(const Predicate&);
-V   template  struct binary_negate;
-V   template 
-      binary_negate not2(const Predicate&);
-    // _lib.binders_, binders:
-V   template   class binder1st;
-V   template 
-      binder1st bind1st(const Operation&, const T&);
-V   template  class binder2nd;
-V   template 
-      binder2nd bind2nd(const Operation&, const T&);
-    // _lib.function.pointer.adaptors_, adaptors:
-V   template  class pointer_to_unary_function;
-V   template 
-      pointer_to_unary_function ptr_fun(Result (*)(Arg));
-V   template 
-      class pointer_to_binary_function;
-V   template 
-      pointer_to_binary_function
-        ptr_fun(Result (*)(Arg1,Arg2));
-
-    // _lib.member.pointer.adaptors_, adaptors:
-V   template class mem_fun_t;
-V   template class mem_fun1_t;
-V   template
-        mem_fun_t mem_fun(S (T::*f)());
-V   template
-        mem_fun1_t mem_fun(S (T::*f)(A));
-V   template class mem_fun_ref_t;
-V   template class mem_fun1_ref_t;
-V   template
-        mem_fun_ref_t mem_fun_ref(S (T::*f)());
-V   template
-        mem_fun1_ref_t mem_fun_ref(S (T::*f)(A));
-
-V   template  class const_mem_fun_t;
-V   template  class const_mem_fun1_t;
-V   template 
-      const_mem_fun_t mem_fun(S (T::*f)() const);
-V   template 
-      const_mem_fun1_t mem_fun(S (T::*f)(A) const);
-V   template  class const_mem_fun_ref_t;
-V   template  class const_mem_fun1_ref_t;
-V   template 
-      const_mem_fun_ref_t mem_fun_ref(S (T::*f)() const);
-V   template 
-      const_mem_fun1_ref_t mem_fun_ref(S (T::*f)(A) const);
-   }
-
-   20.3.1  Base                                                [lib.base]
-
-V   template 
-    struct unary_function {
-V     typedef Arg    argument_type;
-V     typedef Result result_type;
-    };
-V   template 
-    struct binary_function {
-V     typedef Arg1   first_argument_type;
-V     typedef Arg2   second_argument_type;
-V     typedef Result result_type;
-    };
-
-   20.3.2  Arithmetic operations              [lib.arithmetic.operations]
-
-T  template  struct plus : binary_function {
-V   T operator()(const T& x, const T& y) const;
-   };
-
-T  template  struct minus : binary_function {
-V   T operator()(const T& x, const T& y) const;
-   };
-
-T  template  struct multiplies : binary_function {
-V   T operator()(const T& x, const T& y) const;
-   };
-
-T  template  struct divides : binary_function {
-V   T operator()(const T& x, const T& y) const;
-   };
-
-T  template  struct modulus : binary_function {
-V   T operator()(const T& x, const T& y) const;
-   };
-
-T  template  struct negate : unary_function {
-V   T operator()(const T& x) const;
-   };
-
-   20.3.3  Comparisons                                  [lib.comparisons]
-
-T  template  struct equal_to : binary_function {
-V   bool operator()(const T& x, const T& y) const;
-   };
-
-T  template  struct not_equal_to : binary_function {
-V   bool operator()(const T& x, const T& y) const;
-   };
-
-T  template  struct greater : binary_function {
-V   bool operator()(const T& x, const T& y) const;
-   };
-
-T  template  struct less : binary_function {
-V   bool operator()(const T& x, const T& y) const;
-   };
-
-T  template  struct greater_equal : binary_function {
-V   bool operator()(const T& x, const T& y) const;
-   };
-
-T  template  struct less_equal : binary_function {
-V   bool operator()(const T& x, const T& y) const;
-   };
-
-   20.3.4  Logical operations                    [lib.logical.operations]
-
-T  template  struct logical_and : binary_function {
-V   bool operator()(const T& x, const T& y) const;
-   };
-
-T  template  struct logical_or : binary_function {
-V   bool operator()(const T& x, const T& y) const;
-   };
-
-T  template  struct logical_not : unary_function {
-V   bool operator()(const T& x) const;
-   };
-
-   20.3.5  Negators                                        [lib.negators]
-
-T  template 
-    class unary_negate
-      : public unary_function {
-   public:
-T   explicit unary_negate(const Predicate& pred);
-V   bool operator()(const typename Predicate::argument_type& x) const;
-   };
-
-T  template 
-    class binary_negate
-      : public binary_function {
-    public:
-T     explicit binary_negate(const Predicate& pred);
-V     bool operator()(const typename Predicate::first_argument_type&  x,
-          const typename Predicate::second_argument_type& y) const;
-    };
-
-
-   20.3.6  Binders                                          [lib.binders]
-
-   20.3.6.1  Template class binder1st                    [lib.binder.1st]
-T   template 
-    class binder1st
-      : public unary_function {
-    protected:
-T     Operation                      op;
-T     typename Operation::first_argument_type value;
-    public:
-V     binder1st(const Operation& x,
-                const typename Operation::first_argument_type& y);
-V     typename Operation::result_type
-        operator()(const typename Operation::second_argument_type& x) const;
-    };
-
-   20.3.6.2  bind1st                                       [lib.bind.1st]
-
-V  template 
-    binder1st bind1st(const Operation& op, const T& x);
-
-   20.3.6.3  Template class binder2nd                    [lib.binder.2nd]
-T   template 
-    class binder2nd
-      : public unary_function {
-    protected:
-T     Operation                       op;
-T     typename Operation::second_argument_type value;
-    public:
-V     binder2nd(const Operation& x,
-                const typename Operation::second_argument_type& y);
-V     typename Operation::result_type
-        operator()(const typename Operation::first_argument_type& x) const;
-    };
-
-   20.3.6.4  bind2nd                                       [lib.bind.2nd]
-
-T  template 
-    binder2nd bind2nd(const Operation& op, const T& x);
-
-
-   20.3.7  Adaptors for pointers to       [lib.function.pointer.adaptors]
-       functions
-
-   1 To  allow  pointers to (unary and binary) functions to work with func-
-   tion adaptors the library provides:
-
-T   template 
-    class pointer_to_unary_function : public unary_function {
-    public:
-T     explicit pointer_to_unary_function(Result (*f)(Arg));
-V     Result operator()(Arg x) const;
-    };
-
-T  template 
-    pointer_to_unary_function ptr_fun(Result (*f)(Arg));
-
-T       template 
-        class pointer_to_binary_function :
-          public binary_function {
-        public:
-T         explicit pointer_to_binary_function(Result (*f)(Arg1, Arg2));
-V         Result operator()(Arg1 x, Arg2 y) const;
-        };
-
-
-   20.3.8  Adaptors for pointers to         [lib.member.pointer.adaptors]
-       members
-
-T  template  class mem_fun_t
-          : public unary_function {
-   public:
-T   explicit mem_fun_t(S (T::*p)());
-V   S operator()(T* p) const;
-   };
-
-T   template  class mem_fun1_t
-          : public binary_function {
-    public:
-T     explicit mem_fun1_t(S (T::*p)(A));
-V     S operator()(T* p, A x) const;
-   };
-
-V   template mem_fun_t
-       mem_fun(S (T::*f)());
-V   template mem_fun1_t
-       mem_fun(S (T::*f)(A));
-
-T   template  class mem_fun_ref_t
-          : public unary_function {
-    public:
-T     explicit mem_fun_ref_t(S (T::*p)());
-V     S operator()(T& p) const;
-   };
-
-T   template  class mem_fun1_ref_t
-          : public binary_function {
-    public:
-T     explicit mem_fun1_ref_t(S (T::*p)(A));
-V     S operator()(T& p, A x) const;
-   };
-
-T   template mem_fun_ref_t
-       mem_fun_ref(S (T::*f)());
-
-T   template mem_fun1_ref_t
-       mem_fun_ref(S (T::*f)(A));
-
-T  template  class const_mem_fun_t
-        : public unary_function {
-   public:
-T   explicit const_mem_fun_t(S (T::*p)() const);
-V   S operator()(const T* p) const;
-   };
-
-T  template  class const_mem_fun1_t
-        : public binary_function {
-   public:
-T   explicit const mem_fun1_t(S (T::*p)(A) const);
-V   S operator()(const T* p, A x) const;
-   };
-
-V   template const_mem_fun_t
-       mem_fun(S (T::*f)() const);
-V   template const_mem_fun1_t
-       mem_fun(S (T::*f)(A) const);
-
-T   template  class const_mem_fun_ref_t
-          : public unary_function {
-    public:
-T     explicit const_mem_fun_ref_t(S (T::*p)() const);
-V     S operator()(const T& p) const;
-   };
-
-T   template  class const_mem_fun1_ref_t
-          : public binary_function {
-    public:
-T     explicit const_mem_fun1_ref_t(S (T::*p)(A) const);
-V     S operator()(const T& p, A x) const;
-   };
-
-T   template const_mem_fun_ref_t
-       mem_fun_ref(S (T::*f)() const);
-
-T   template const_mem_fun1_ref_t
-        mem_fun_ref(S (T::*f)(A) const);
-
-   20.4  Memory                                              [lib.memory]
-
-   Header  synopsis
-
-    // _lib.default.allocator_, the default allocator:
-T   template  class allocator;
-T   template <> class allocator;
-T   template 
-      bool operator==(const allocator&, const allocator&) throw();
-T   template 
-      bool operator!=(const allocator&, const allocator&) throw();
-    // _lib.storage.iterator_, raw storage iterator:
-T   template  class raw_storage_iterator;
-    // _lib.temporary.buffer_, temporary buffers:
-T   template 
-      pair get_temporary_buffer(ptrdiff_t n);
-T   template 
-      void return_temporary_buffer(T* p);
-    // _lib.specialized.algorithms_, specialized algorithms:
-T   template 
-      ForwardIterator
-        uninitialized_copy(InputIterator first, InputIterator last,
-                           ForwardIterator result);
-T   template 
-      void uninitialized_fill(ForwardIterator first, ForwardIterator last,
-                              const T& x);
-T   template 
-      void uninitialized_fill_n(ForwardIterator first, Size n, const T& x);
-    // _lib.auto.ptr_, pointers:
-X   template class auto_ptr;
-   }
-
-   20.4.1  The default allocator                  [lib.default.allocator]
-
-T   template  class allocator;
-    // specialize for void:
-T   template <> class allocator {
-    public:
-T     typedef void*       pointer;
-T     typedef const void* const_pointer;
-      // reference-to-void members are impossible.
-T     typedef void  value_type;
-T     template  struct rebind { typedef allocator other; };
-    };
-
-T   template  class allocator {
-     public:
-T     typedef size_t    size_type;
-T     typedef ptrdiff_t difference_type;
-T     typedef T*        pointer;
-T     typedef const T*  const_pointer;
-T     typedef T&        reference;
-T     typedef const T&  const_reference;
-T     typedef T         value_type;
-T     template  struct rebind { typedef allocator other; };
-T     allocator() throw();
-T     allocator(const allocator&) throw();
-T     template  allocator(const allocator&) throw();
-T    ~allocator() throw();
-T     pointer address(reference x) const;
-T     const_pointer address(const_reference x) const;
-T     pointer allocate(
-        size_type, allocator::const_pointer hint = 0);
-T     void deallocate(pointer p, size_type n);
-T     size_type max_size() const throw();
-T     void construct(pointer p, const T& val);
-T     void destroy(pointer p);
-    };
-
-   20.4.1.2  allocator globals                    [lib.allocator.globals]
-
-T  template 
-    bool operator==(const allocator&, const allocator&) throw();
-T  template 
-    bool operator!=(const allocator&, const allocator&) throw();
-
-   20.4.2  Raw storage iterator                    [lib.storage.iterator]
-
-T   template 
-    class raw_storage_iterator
-      : public iterator {
-    public:
-T     explicit raw_storage_iterator(OutputIterator x);
-T     raw_storage_iterator& operator*();
-T     raw_storage_iterator& operator=(const T& element);
-T     raw_storage_iterator& operator++();
-T     raw_storage_iterator  operator++(int);
-    };
-
-   20.4.3  Temporary buffers                       [lib.temporary.buffer]
-
-T  template 
-    pair get_temporary_buffer(ptrdiff_t n);
-
-T  template  void return_temporary_buffer(T* p);
-
-   20.4.4  Specialized algorithms            [lib.specialized.algorithms]
-
-   20.4.4.1  uninitialized_copy                  [lib.uninitialized.copy]
-
-V  template 
-    ForwardIterator
-      uninitialized_copy(InputIterator first, InputIterator last,
-                         ForwardIterator result);
-
-   20.4.4.2  uninitialized_fill                  [lib.uninitialized.fill]
-
-V  template 
-    void uninitialized_fill(ForwardIterator first, ForwardIterator last,
-                            const T& x);
-
-   20.4.4.3  uninitialized_fill_n              [lib.uninitialized.fill.n]
-
-V  template 
-    void uninitialized_fill_n(ForwardIterator first, Size n, const T& x);
-
-   20.4.5  Template class auto_ptr                         [lib.auto.ptr]
-
-X   template class auto_ptr {
-      template  struct auto_ptr_ref {};
-    public:
-T     typedef X element_type;
-      // _lib.auto.ptr.cons_ construct/copy/destroy:
-T     explicit auto_ptr(X* p =0) throw();
-T     auto_ptr(auto_ptr&) throw();
-T     template auto_ptr(auto_ptr&) throw();
-T     auto_ptr& operator=(auto_ptr&) throw();
-T     template auto_ptr& operator=(auto_ptr&) throw();
-T    ~auto_ptr() throw();
-      // _lib.auto.ptr.members_ members:
-T     X& operator*() const throw();
-T     X* operator->() const throw();
-T     X* get() const throw();
-T     X* release() throw();
-T     void reset(X* p =0) throw();
-
-      // _lib.auto.ptr.conv_ conversions:
-X     auto_ptr(auto_ptr_ref) throw();
-X     template operator auto_ptr_ref() throw();
-X     template operator auto_ptr() throw();
-    };
-
-   20.4.6  C Library                                       [lib.c.malloc]
-
-                    Table 7--Header  synopsis
-
-X                    Functions:   calloc   malloc
-                                  free     realloc
-
-
-                    Table 8--Header  synopsis
-
-X                    Macro:       NULL
-X                    Type:        size_t
-X                    Functions:   memchr    memcmp
-X                    memcpy       memmove   memset
-
-                     Table 9--Header  synopsis
-
-X          Macros:   NULL
-X          Types:    size_t   clock_t    time_t
-X          Struct:   tm
-           Functions:
-X          asctime   clock    difftime   localtime   strftime
-X          ctime     gmtime   mktime     time
-
-   21.1.1  Character traits requirements        [lib.char.traits.require]
-
-   2 The struct template
-T  template struct char_traits;
-   shall be provided in the header  as a basis for  explicit spe-
-   cializations.
-
-
-   21.1.3.1  struct                [lib.char.traits.specializations.char]
-       char_traits
-
-T   template<>
-    struct char_traits {
-T     typedef char        char_type;
-T     typedef int         int_type;
-T     typedef streamoff   off_type;
-T     typedef streampos   pos_type;
-T     typedef mbstate_t   state_type;
-
-T     static void assign(char_type& c1, const char_type& c2);
-T     static bool eq(const char_type& c1, const char_type& c2);
-T     static bool lt(const char_type& c1, const char_type& c2);
-
-T     static int compare(const char_type* s1, const char_type* s2, size_t n);
-T     static size_t length(const char_type* s);
-T     static const char_type* find(const char_type* s, size_t n,
-                                   const char_type& a);
-T     static char_type* move(char_type* s1, const char_type* s2, size_t n);
-T     static char_type* copy(char_type* s1, const char_type* s2, size_t n);
-T     static char_type* assign(char_type* s, size_t n, char_type a);
-
-T     static int_type not_eof(const int_type& c);
-T     static char_type to_char_type(const int_type& c);
-T     static int_type to_int_type(const char_type& c);
-T     static bool eq_int_type(const int_type& c1, const int_type& c2);
-T     static int_type eof();
-    };
-
-   21.1.3.2  struct             [lib.char.traits.specializations.wchar.t]
-       char_traits
-
-V   template<>
-    struct char_traits {
-V     typedef wchar_t      char_type;
-V     typedef wint_t       int_type;
-V     typedef streamoff   off_type;
-V     typedef wstreampos   pos_type;
-V     typedef mbstate_t    state_type;
-
-V     static void assign(char_type& c1, const char_type& c2);
-V     static bool eq(const char_type& c1, const char_type& c2);
-V     static bool lt(const char_type& c1, const char_type& c2);
-
-V     static int compare(const char_type* s1, const char_type* s2, size_t n);
-V     static size_t length(const char_type* s);
-V     static const char_type* find(const char_type* s, size_t n,
-                                   const char_type& a);
-V     static char_type* move(char_type* s1, const char_type* s2, size_t n);
-V     static char_type* copy(char_type* s1, const char_type* s2, size_t n);
-V     static char_type* assign(char_type* s, size_t n, char_type a);
-
-V     static int_type not_eof(const int_type& c);
-V     static char_type to_char_type(const int_type& c);
-V     static int_type to_int_type(const char_type& c);
-V     static bool eq_int_type(const int_type& c1, const int_type& c2);
-V     static int_type eof();
-    };
-
-   21.2  String classes                              [lib.string.classes]
-
-    // _lib.char.traits_, character traits:
-V   template
-      struct char_traits;
-V   template <> struct char_traits;
-V   template <> struct char_traits;
-
-    // _lib.basic.string_, basic_string:
-V   template,
-             class Allocator = allocator >
-      class basic_string;
-V   template
-      basic_string
-        operator+(const basic_string& lhs,
-                  const basic_string& rhs);
-V   template
-      basic_string
-        operator+(const charT* lhs,
-                  const basic_string& rhs);
-V   template
-      basic_string
-        operator+(charT lhs, const basic_string& rhs);
-V   template
-      basic_string
-        operator+(const basic_string& lhs,
-                  const charT* rhs);
-V   template
-      basic_string
-        operator+(const basic_string& lhs, charT rhs);
-
-V   template
-      bool operator==(const basic_string& lhs,
-                      const basic_string& rhs);
-V   template
-      bool operator==(const charT* lhs,
-                      const basic_string& rhs);
-V   template
-      bool operator==(const basic_string& lhs,
-                      const charT* rhs);
-V   template
-      bool operator!=(const basic_string& lhs,
-                      const basic_string& rhs);
-V   template
-      bool operator!=(const charT* lhs,
-                      const basic_string& rhs);
-V   template
-      bool operator!=(const basic_string& lhs,
-                      const charT* rhs);
-V   template
-      bool operator< (const basic_string& lhs,
-                      const basic_string& rhs);
-V   template
-      bool operator< (const basic_string& lhs,
-                      const charT* rhs);
-V   template
-      bool operator< (const charT* lhs,
-                      const basic_string& rhs);
-V   template
-      bool operator> (const basic_string& lhs,
-                      const basic_string& rhs);
-V   template
-      bool operator> (const basic_string& lhs,
-                      const charT* rhs);
-V   template
-      bool operator> (const charT* lhs,
-                      const basic_string& rhs);
-V   template
-      bool operator<=(const basic_string& lhs,
-                      const basic_string& rhs);
-V   template
-      bool operator<=(const basic_string& lhs,
-                      const charT* rhs);
-V   template
-      bool operator<=(const charT* lhs,
-                      const basic_string& rhs);
-V   template
-      bool operator>=(const basic_string& lhs,
-                      const basic_string& rhs);
-V   template
-      bool operator>=(const basic_string& lhs,
-                      const charT* rhs);
-V   template
-      bool operator>=(const charT* lhs,
-                      const basic_string& rhs);
-
-    // _lib.string.special_:
-V   template
-       void swap(basic_string& lhs,
-                 basic_string& rhs);
-V   template
-     basic_istream&
-      operator>>(basic_istream& is,
-                 basic_string& str);
-T   template
-     basic_ostream&
-      operator<<(basic_ostream& os,
-                 const basic_string& str);
-V   template
-     basic_istream&
-       getline(basic_istream& is,
-               basic_string& str,
-               charT delim);
-V   template
-     basic_istream&
-       getline(basic_istream& is,
-               basic_string& str);
-V   typedef basic_string string;
-T   typedef basic_string wstring;
-   }
-
-   21.3  Template class basic_string                   [lib.basic.string]
-
-V  namespace std {
-    template,
-             class Allocator = allocator >
-    class basic_string {
-    public:
-      // types:
-      typedef          traits                     traits_type;
-      typedef typename traits::char_type          value_type;
-      typedef          Allocator                  allocator_type;
-      typedef typename Allocator::size_type       size_type;
-      typedef typename Allocator::difference_type difference_type;
-      typedef typename Allocator::reference       reference;
-      typedef typename Allocator::const_reference const_reference;
-      typedef typename Allocator::pointer         pointer;
-      typedef typename Allocator::const_pointer   const_pointer;
-      typedef implementation defined             iterator;
-      typedef implementation defined             const_iterator;
-      typedef std::reverse_iterator reverse_iterator;
-      typedef std::reverse_iterator const_reverse_iterator;
-      static const size_type npos = -1;
-
-      // _lib.string.cons_ construct/copy/destroy:
-V     explicit basic_string(const Allocator& a = Allocator());
-V     basic_string(const basic_string& str, size_type pos = 0,
-                   size_type n = npos, const Allocator& a = Allocator());
-V     basic_string(const charT* s,
-                   size_type n, const Allocator& a = Allocator());
-V     basic_string(const charT* s, const Allocator& a = Allocator());
-V     basic_string(size_type n, charT c, const Allocator& a = Allocator());
-V     template
-        basic_string(InputIterator begin, InputIterator end,
-                     const Allocator& a = Allocator());
-V    ~basic_string();
-V     basic_string& operator=(const basic_string& str);
-V     basic_string& operator=(const charT* s);
-V     basic_string& operator=(charT c);
-      // _lib.string.iterators_ iterators:
-V     iterator       begin();
-V     const_iterator begin() const;
-V     iterator       end();
-V     const_iterator end() const;
-
-V     reverse_iterator       rbegin();
-V     const_reverse_iterator rbegin() const;
-V     reverse_iterator       rend();
-V     const_reverse_iterator rend() const;
-      // _lib.string.capacity_ capacity:
-V     size_type size() const;
-V     size_type length() const;
-V     size_type max_size() const;
-V     void resize(size_type n, charT c);
-V     void resize(size_type n);
-V     size_type capacity() const;
-V     void reserve(size_type res_arg = 0);
-V     void clear();
-V     bool empty() const;
-      // _lib.string.access_ element access:
-V     const_reference operator[](size_type pos) const;
-V     reference       operator[](size_type pos);
-V     const_reference at(size_type n) const;
-V     reference       at(size_type n);
-      // _lib.string.modifiers_ modifiers:
-V     basic_string& operator+=(const basic_string& str);
-V     basic_string& operator+=(const charT* s);
-V     basic_string& operator+=(charT c);
-V     basic_string& append(const basic_string& str);
-V     basic_string& append(const basic_string& str, size_type pos,
-                           size_type n);
-V     basic_string& append(const charT* s, size_type n);
-V     basic_string& append(const charT* s);
-V     basic_string& append(size_type n, charT c);
-V     template
-        basic_string& append(InputIterator first, InputIterator last);
-V     void push_back(const charT);
-
-V     basic_string& assign(const basic_string&);
-V     basic_string& assign(const basic_string& str, size_type pos,
-                           size_type n);
-V     basic_string& assign(const charT* s, size_type n);
-V     basic_string& assign(const charT* s);
-V     basic_string& assign(size_type n, charT c);
-V     template
-        basic_string& assign(InputIterator first, InputIterator last);
-V     basic_string& insert(size_type pos1, const basic_string& str);
-V     basic_string& insert(size_type pos1, const basic_string& str,
-                           size_type pos2, size_type n);
-V     basic_string& insert(size_type pos, const charT* s, size_type n);
-V     basic_string& insert(size_type pos, const charT* s);
-V     basic_string& insert(size_type pos, size_type n, charT c);
-V     iterator insert(iterator p, charT c);
-V     void     insert(iterator p, size_type n, charT c);
-V     template
-        void insert(iterator p, InputIterator first, InputIterator last);
-V     basic_string& erase(size_type pos = 0, size_type n = npos);
-V     iterator erase(iterator position);
-V     iterator erase(iterator first, iterator last);
-V     basic_string& replace(size_type pos1, size_type n1,
-                            const basic_string& str);
-V     basic_string& replace(size_type pos1, size_type n1,
-                            const basic_string& str,
-                            size_type pos2, size_type n2);
-V     basic_string& replace(size_type pos, size_type n1, const charT* s,
-                            size_type n2);
-V     basic_string& replace(size_type pos, size_type n1, const charT* s);
-V     basic_string& replace(size_type pos, size_type n1, size_type n2,
-                            charT c);
-V     basic_string& replace(iterator i1, iterator i2, const basic_string& str);
-V     basic_string& replace(iterator i1, iterator i2, const charT* s,
-                            size_type n);
-V     basic_string& replace(iterator i1, iterator i2, const charT* s);
-V     basic_string& replace(iterator i1, iterator i2,
-                            size_type n, charT c);
-V     template
-        basic_string& replace(iterator i1, iterator i2,
-                              InputIterator j1, InputIterator j2);
-V     size_type copy(charT* s, size_type n, size_type pos = 0) const;
-V     void swap(basic_string&);
-      // _lib.string.ops_ string operations:
-V     const charT* c_str() const;         // explicit
-V     const charT* data() const;
-V     allocator_type get_allocator() const;
-V     size_type find (const basic_string& str, size_type pos = 0) const;
-V     size_type find (const charT* s, size_type pos, size_type n) const;
-V     size_type find (const charT* s, size_type pos = 0) const;
-V     size_type find (charT c, size_type pos = 0) const;
-V     size_type rfind(const basic_string& str, size_type pos = npos) const;
-V     size_type rfind(const charT* s, size_type pos, size_type n) const;
-V     size_type rfind(const charT* s, size_type pos = npos) const;
-V     size_type rfind(charT c, size_type pos = npos) const;
-
-V     size_type find_first_of(const basic_string& str,
-                              size_type pos = 0) const;
-V     size_type find_first_of(const charT* s,
-                              size_type pos, size_type n) const;
-V     size_type find_first_of(const charT* s, size_type pos = 0) const;
-V     size_type find_first_of(charT c, size_type pos = 0) const;
-V     size_type find_last_of (const basic_string& str,
-                              size_type pos = npos) const;
-V     size_type find_last_of (const charT* s,
-                              size_type pos, size_type n) const;
-V     size_type find_last_of (const charT* s, size_type pos = npos) const;
-V     size_type find_last_of (charT c, size_type pos = npos) const;
-V     size_type find_first_not_of(const basic_string& str,
-                                  size_type pos = 0) const;
-V     size_type find_first_not_of(const charT* s, size_type pos,
-                                  size_type n) const;
-V     size_type find_first_not_of(const charT* s, size_type pos = 0) const;
-V     size_type find_first_not_of(charT c, size_type pos = 0) const;
-V     size_type find_last_not_of (const basic_string& str,
-                                  size_type pos = npos) const;
-V     size_type find_last_not_of (const charT* s, size_type pos,
-                                  size_type n) const;
-V     size_type find_last_not_of (const charT* s,
-                                  size_type pos = npos) const;
-V     size_type find_last_not_of (charT c, size_type pos = npos) const;
-V     basic_string substr(size_type pos = 0, size_type n = npos) const;
-V     int compare(const basic_string& str) const;
-V     int compare(size_type pos1, size_type n1,
-                  const basic_string& str) const;
-V     int compare(size_type pos1, size_type n1,
-                  const basic_string& str,
-                  size_type pos2, size_type n2) const;
-V     int compare(const charT* s) const;
-V     int compare(size_type pos1, size_type n1,
-                  const charT* s, size_type n2 = npos) const;
-    };
-   }
-
-   21.4  Null-terminated sequence utilities               [lib.c.strings]
-
-                    Table 10--Header  synopsis
-
-            isalnum   isdigit   isprint   isupper    tolower
-X           isalpha   isgraph   ispunct   isxdigit   toupper
-            iscntrl   islower   isspace
-
-                   Table 11--Header  synopsis
-
-X  Macro:     WEOF 
-X  Types:     wctrans_t   wctype_t   wint_t 
-   Functions:
-X  iswalnum   iswctype    iswlower   iswspace    towctrans   wctrans
-X  iswalpha   iswdigit    iswprint   iswupper    towlower    wctype
-X  iswcntrl   iswgraph    iswpunct   iswxdigit   towupper
-
-                   Table 12--Header  synopsis
-
-X           Macro:    NULL 
-X           Type:     size_t 
-            Functions:
-X           memchr    strcat    strcspn    strncpy   strtok
-X           memcmp    strchr    strerror   strpbrk   strxfrm
-X           memcpy    strcmp    strlen     strrchr
-X           memmove   strcoll   strncat    strspn
-X           memset    strcpy    strncmp    strstr
-
-                    Table 13--Header  synopsis
-   Macros:    NULL    WCHAR_MAX         WCHAR_MIN   WEOF 
-   Types:     mbstate_t       wint_t    size_t
-   Functions:
-X  btowc      getwchar        ungetwc           wcscpy      wcsrtombs   wmemchr
-X  fgetwc     mbrlen          vfwprintf         wcscspn     wcsspn      wmemcmp
-X  fgetws     mbrtowc         vswprintf         wcsftime    wcsstr      wmemcpy
-X  fputwc     mbsinit         vwprintf          wcslen      wcstod      wmemmove
-X  fputws     mbsrtowcs       wcrtomb           wcsncat     wcstok      wmemset
-X  fwide      putwc           wcscat            wcsncmp     wcstol      wprintf
-X  fwprintf   putwchar        wcschr            wcsncpy     wcstoul     wscanf
-X  fwscanf    swprintf        wcscmp            wcspbrk     wcsxfrm
-X  getwc      swscanf         wcscoll           wcsrchr     wctob
-
-                   Table 14--Header  synopsis
-
-               Macros:   MB_CUR_MAX
-               Functions:
-X              atol      mblen        strtod    wctomb
-X              atof      mbstowcs     strtol    wcstombs
-X              atoi      mbtowc       strtoul
-
-X  const char* strchr(const char* s, int c);
-X       char* strchr(      char* s, int c);
-
-X  const char* strpbrk(const char* s1, const char* s2);
-X       char* strpbrk(      char* s1, const char* s2);
-
-X  const char* strrchr(const char* s, int c);
-X       char* strrchr(      char* s, int c);
-
-X  const char* strstr(const char* s1, const char* s2);
-X       char* strstr(      char* s1, const char* s2);
-
-X  const void* memchr(const void* s, int c, size_t n);
-X       void* memchr(      void* s, int c, size_t n);
-
-X  const wchar_t* wcschr(const wchar_t* s, wchar_t c);
-X       wchar_t* wcschr(      wchar_t* s, wchar_t c);
-
-X  const wchar_t* wcspbrk(const wchar_t* s1, const wchar_t* s2);
-X       wchar_t* wcspbrk(      wchar_t* s1, const wchar_t* s2);
-
-X  const wchar_t* wcsrchr(const wchar_t* s, wchar_t c);
-X       wchar_t* wcsrchr(      wchar_t* s, wchar_t c);
-
-X  const wchar_t* wcsstr(const wchar_t* s1, const wchar_t* s2);
-X       wchar_t* wcsstr(      wchar_t* s1, const wchar_t* s2);
-
-X  const wchar_t* wmemchr(const wchar_t* s, wchar_t c, size_t n);
-X       wchar_t* wmemchr(      wchar_t* s, wchar_t c, size_t n);
-
-   [for initial efforts on the above, see shadow/string.h]
-
-   22.1  Locales                                            [lib.locales]
-
-   Header  synopsis
-
-    // _lib.locale_, locale:
-T   class locale;
-T   template  const Facet& use_facet(const locale&);
-T   template  bool         has_facet(const locale&) throw();
-
-    // _lib.locale.convenience_, convenience interfaces:
-T   template  bool isspace (charT c, const locale& loc);
-T   template  bool isprint (charT c, const locale& loc);
-T   template  bool iscntrl (charT c, const locale& loc);
-T   template  bool isupper (charT c, const locale& loc);
-T   template  bool islower (charT c, const locale& loc);
-T   template  bool isalpha (charT c, const locale& loc);
-T   template  bool isdigit (charT c, const locale& loc);
-T   template  bool ispunct (charT c, const locale& loc);
-T   template  bool isxdigit(charT c, const locale& loc);
-T   template  bool isalnum (charT c, const locale& loc);
-T   template  bool isgraph (charT c, const locale& loc);
-T   template  charT toupper(charT c, const locale& loc);
-T   template  charT tolower(charT c, const locale& loc);
-    // _lib.category.ctype_ and _lib.facet.ctype.special_, ctype:
-    class ctype_base;
-T   template  class ctype;
-T   template <>            class ctype;             // specialization
-S   template  class ctype_byname;
-S   template <>            class ctype_byname;      // specialization
-T   class codecvt_base;
-X   template  class codecvt;
-S   template  class codecvt_byname;
-    // _lib.category.numeric_ and _lib.facet.numpunct_, numeric:
-X   template   class num_get;
-X   template  class num_put;
-T   template  class numpunct;
-S   template  class numpunct_byname;
-    // _lib.category.collate_, collation:
-T   template  class collate;
-S   template  class collate_byname;
-    // _lib.category.time_, date and time:
-T   class time_base;
-S   template   class time_get;
-S   template   class time_get_byname;
-S   template  class time_put;
-S   template  class time_put_byname;
-    // _lib.category.monetary_, money:
-T   class money_base;
-S   template   class money_get;
-S   template  class money_put;
-S   template  class moneypunct;
-S   template  class moneypunct_byname;
-    // _lib.category.messages_, message retrieval:
-T   class messages_base;
-S   template  class messages;
-S   template  class messages_byname;
-
-
-   22.1.1  Class locale                                      [lib.locale]
-
-X   class locale {
-    public:
-      // types:
-T     class facet;
-T     class id;
-T     typedef int category;
-T     static const category   // values assigned here are for exposition only
-T       none     = 0,
-T       collate  = 0x010, ctype    = 0x020,
-T       monetary = 0x040, numeric  = 0x080,
-T       time     = 0x100, messages = 0x200,
-T       all = collate | ctype | monetary | numeric | time  | messages;
-      // construct/copy/destroy:
-T     locale() throw()
-T     locale(const locale& other) throw()
-X     explicit locale(const char* std_name);
-X     locale(const locale& other, const char* std_name, category);
-T     template  locale(const locale& other, Facet* f);
-T     locale(const locale& other, const locale& one, category);
-T    ~locale() throw();           // non-virtual
-T     const locale& operator=(const locale& other) throw();
-T     template  locale combine(const locale& other) const;
-      // locale operations:
-X     basic_string                  name() const;
-T     bool operator==(const locale& other) const;
-T     bool operator!=(const locale& other) const;
-T     template 
-        bool operator()(const basic_string& s1,
-                        const basic_string& s2) const;
-      // global locale objects:
-T     static       locale  global(const locale&);
-T     static const locale& classic();
-    };
-
-   22.1.1.1  locale types                              [lib.locale.types]
-
-   22.1.1.1.1  Type locale::category                [lib.locale.category]
-
-T  typedef int category;
-
-T   none, collate, ctype, monetary, numeric, time, and messages
-
-      [required locale members]
-T     collate, collate
-T     ctype, ctype
-T     codecvt,
-S     codecvt
-T     moneypunct, moneypunct
-T     moneypunct, moneypunct,
-S     money_get, money_get, money_put
-T     numpunct, numpunct,
-X     num_get, num_get
-X     num_put, num_put
-S     time_get, time_get,
-S     time_put, time_put
-S     messages, messages
-
-      [required instantiations]
-S    collate_byname, collate_byname
-S    ctype_byname, ctype_byname
-S    codecvt_byname,
-S    codecvt_byname
-S    moneypunct_byname,
-S    moneypunct_byname,
-S    money_get,
-S    money_put
-S    numpunct_byname, numpunct_byname
-X    num_get, num_put
-S    time_get,
-S    time_get_byname,
-S    time_get,
-S    time_get_byname,
-S    time_put,
-S    time_put_byname,
-S    time_put
-S    time_put_byname
-S    messages_byname, messages_byname
-
-
-   22.1.1.1.2  Class locale::facet                     [lib.locale.facet]
-
-T   class locale::facet {
-    protected:
-T     explicit facet(size_t refs = 0);
-T     virtual ~facet();
-    private:
-T     facet(const facet&);                // not defined
-T     void operator=(const facet&);       // not defined
-    };
-   }
-
-
-   22.1.1.1.3  Class locale::id                           [lib.locale.id]
-
-T   class locale::id {
-    public:
-T     id();
-    private:
-T     void operator=(const id&);  // not defined
-T     id(const id&);              // not defined
-    };
-   }
-
-
-   22.2.1  The ctype category                        [lib.category.ctype]
-
-T   class ctype_base {
-    public:
-T     enum mask {         // numeric values are for exposition only.
-T       space=, print=, cntrl=, upper=, lower=,
-T       alpha=, digit=, punct=, xdigit=,
-T       alnum=, graph=
-      };
-    };
-
-
-   22.2.1.1  Template class ctype                      [lib.locale.ctype]
-
-T   template 
-    class ctype : public locale::facet, public ctype_base {
-    public:
-T     typedef charT char_type;
-T     explicit ctype(size_t refs = 0);
-T     bool         is(mask m, charT c) const;
-T     const charT* is(const charT* low, const charT* high, mask* vec) const;
-T     const charT* scan_is(mask m,
-                           const charT* low, const charT* high) const;
-T     const charT* scan_not(mask m,
-                            const charT* low, const charT* high) const;
-T     charT        toupper(charT c) const;
-T     const charT* toupper(charT* low, const charT* high) const;
-T     charT        tolower(charT c) const;
-T     const charT* tolower(charT* low, const charT* high) const;
-T     charT        widen(char c) const;
-T     const char*  widen(const char* low, const char* high, charT* to) const;
-T     char         narrow(charT c, char dfault) const;
-T     const charT* narrow(const charT* low, const charT*, char dfault,
-                          char* to) const;
-T     static locale::id id;
-
-    protected:
-T    ~ctype();                    // virtual
-T     virtual bool         do_is(mask m, charT c) const;
-T     virtual const charT* do_is(const charT* low, const charT* high,
-                                 mask* vec) const;
-T     virtual const charT* do_scan_is(mask m,
-                              const charT* low, const charT* high) const;
-T     virtual const charT* do_scan_not(mask m,
-                              const charT* low, const charT* high) const;
-T     virtual charT        do_toupper(charT) const;
-T     virtual const charT* do_toupper(charT* low, const charT* high) const;
-T     virtual charT        do_tolower(charT) const;
-T     virtual const charT* do_tolower(charT* low, const charT* high) const;
-T     virtual charT        do_widen(char) const;
-T     virtual const char*  do_widen(const char* low, const char* high,
-                                    charT* dest) const;
-T     virtual char         do_narrow(charT, char dfault) const;
-T     virtual const charT* do_narrow(const charT* low, const charT* high,
-                                     char dfault, char* dest) const;
-    };
-
-
-   22.2.1.2  Template class ctype_byname        [lib.locale.ctype.byname]
-
-X   template 
-    class ctype_byname : public ctype {
-    public:
-T     typedef ctype::mask mask;
-S     explicit ctype_byname(const char*, size_t refs = 0);
-    protected:
-S    ~ctype_byname();             // virtual
-S     virtual bool         do_is(mask m, charT c) const;
-S     virtual const charT* do_is(const charT* low, const charT* high,
-                                 mask* vec) const;
-S     virtual const char*  do_scan_is(mask m,
-                               const charT* low, const charT* high) const;
-S     virtual const char*  do_scan_not(mask m,
-                               const charT* low, const charT* high) const;
-S     virtual charT        do_toupper(charT) const;
-S     virtual const charT* do_toupper(charT* low, const charT* high) const;
-S     virtual charT        do_tolower(charT) const;
-S     virtual const charT* do_tolower(charT* low, const charT* high) const;
-S     virtual charT        do_widen(char) const;
-S     virtual const char*  do_widen(const char* low, const char* high,
-                                    charT* dest) const;
-S     virtual char         do_narrow(charT, char dfault) const;
-S     virtual const charT* do_narrow(const charT* low, const charT* high,
-                                     char dfault, char* dest) const;
-    };
-
-   22.2.1.3  ctype specializations              [lib.facet.ctype.special]
-
-T   template <> class ctype
-      : public locale::facet, public ctype_base {
-    public:
-T     typedef char char_type;
-T     explicit ctype(const mask* tab = 0, bool del = false,
-                     size_t refs = 0);
-T     bool is(mask m, char c) const;
-T     const char* is(const char* low, const char* high, mask* vec) const;
-T     const char* scan_is (mask m,
-                           const char* low, const char* high) const;
-T     const char* scan_not(mask m,
-                           const char* low, const char* high) const;
-T     char        toupper(char c) const;
-T     const char* toupper(char* low, const char* high) const;
-T     char        tolower(char c) const;
-T     const char* tolower(char* low, const char* high) const;
-T     char  widen(char c) const;
-T     const char* widen(const char* low, const char* high, char* to) const;
-T     char  narrow(char c, char dfault) const;
-T     const char* narrow(const char* low, const char* high, char dfault,
-                         char* to) const;
-T     static locale::id id;
-T     static const size_t table_size = IMPLEMENTATION_DEFINED;
-
-    protected:
-T     const mask* table() const throw();
-T     static const mask* classic_table() throw();
-T    ~ctype();                    // virtual
-T     virtual char        do_toupper(char c) const;
-T     virtual const char* do_toupper(char* low, const char* high) const;
-T     virtual char        do_tolower(char c) const;
-T     virtual const char* do_tolower(char* low, const char* high) const;
-
-T     virtual char        do_widen(char c) const;
-T     virtual const char* do_widen(const char* low,
-                                   const char* high,
-                                   char* to) const;
-T     virtual char        do_narrow(char c, char dfault) const;
-T     virtual const char* do_narrow(const char* low,
-                                    const char* high,
-                                    char dfault, char* to) const;
-    };
-
-
-   22.2.1.4  Class                      [lib.locale.ctype.byname.special]
-       ctype_byname
-
-X   template <> class ctype_byname : public ctype {
-    public:
-S     explicit ctype_byname(const char*, size_t refs = 0);
-    protected:
-S    ~ctype_byname();             // virtual
-S     virtual char        do_toupper(char c) const;
-S     virtual const char* do_toupper(char* low, const char* high) const;
-S     virtual char        do_tolower(char c) const;
-S     virtual const char* do_tolower(char* low, const char* high) const;
-
-S     virtual char        do_widen(char c) const;
-S     virtual const char* do_widen(char* low,
-                                   const char* high,
-                                   char* to) const;
-S     virtual char        do_widen(char c) const;
-S     virtual const char* do_widen(char* low, const char* high) const;
-
-    };
-
-
-
-   22.2.1.5  Template class codecvt                  [lib.locale.codecvt]
-
-T  class codecvt_base {
-   public:
-T   enum result { ok, partial, error, noconv };
-   };
-
-T  template 
-   class codecvt : public locale::facet, public codecvt_base {
-   public:
-T   typedef internT  intern_type;
-T   typedef externT  extern_type;
-T   typedef stateT state_type;
-T   explicit codecvt(size_t refs = 0)
-T   result out(stateT& state,
-     const internT* from, const internT* from_end, const internT*& from_next,
-           externT*   to,       externT* to_limit, externT*& to_next) const;
-T   result unshift(stateT& state,
-           externT*   to,        externT* to_limit, externT*& to_next) const;
-T   result in(stateT& state,
-     const externT* from, const externT* from_end, const externT*& from_next,
-           internT*   to,       internT* to_limit, internT*& to_next) const;
-T   int encoding() const throw();
-T   bool always_noconv() const throw();
-T   int length(const stateT&, const externT* from, const externT* end,
-               size_t max) const;
-T   int max_length() const throw();
-T   static locale::id id;
-
-   protected:
-T   ~codecvt();                   // virtual
-T   virtual result do_out(stateT& state,
-     const internT* from, const internT* from_end, const internT*& from_next,
-           externT* to,         externT* to_limit, externT*& to_next) const;
-T   virtual result do_in(stateT& state,
-T    const externT* from, const externT* from_end, const externT*& from_next,
-           internT* to,         internT* to_limit, internT*& to_next) const;
-T   virtual result do_unshift(stateT& state,
-           externT* to,         externT* to_limit, externT*& to_next) const;
-T   virtual int do_encoding() const throw();
-T   virtual bool do_always_noconv() const throw();
-T   virtual int do_length(const stateT&, const externT* from,
-                          const externT* end, size_t max) const;
-T   virtual int do_max_length() const throw();
-   };
-   }
-
-
-   22.2.1.6  Template class                   [lib.locale.codecvt.byname]
-       codecvt_byname
-
-X  template 
-   class codecvt_byname : public codecvt {
-   public:
-S   explicit codecvt_byname(const char*, size_t refs = 0);
-   protected:
-S  ~codecvt_byname();             // virtual
-S   virtual result do_out(stateT& state,
-      const internT* from, const internT* from_end, const internT*& from_next,
-            externT* to,         externT* to_limit, externT*& to_next) const;
-S   virtual result do_in(stateT& state,
-      const externT* from, const externT* from_end, const externT*& from_next,
-            internT* to,         internT* to_limit, internT*& to_next) const;
-S   virtual result do_unshift(stateT& state,
-            externT* to,         externT* to_limit, externT*& to_next) const;
-S   virtual int do_encoding() const throw();
-S   virtual bool do_always_noconv() const throw();
-S   virtual int do_length(const stateT&, const externT* from,
-                          const externT* end, size_t max) const;
-S   virtual result do_unshift(stateT& state,
-           externT* to, externT* to_limit, externT*& to_next) const;
-S   virtual int do_max_length() const throw();
-    };
-
-
-   22.2.2.1  Template class num_get                  [lib.locale.num.get]
-
-X   template  >
-    class num_get : public locale::facet {
-    public:
-T     typedef charT            char_type;
-T     typedef InputIterator    iter_type;
-T     explicit num_get(size_t refs = 0);
-T     iter_type get(iter_type in, iter_type end, ios_base&,
-                    ios_base::iostate& err, bool& v)           const;
-T     iter_type get(iter_type in, iter_type end, ios_base& ,
-                    ios_base::iostate& err, long& v)           const;
-T     iter_type get(iter_type in, iter_type end, ios_base&,
-                    ios_base::iostate& err, unsigned short& v) const;
-T     iter_type get(iter_type in, iter_type end, ios_base&,
-                    ios_base::iostate& err, unsigned int& v)   const;
-T     iter_type get(iter_type in, iter_type end, ios_base&,
-                    ios_base::iostate& err, unsigned long& v)  const;
-T     iter_type get(iter_type in, iter_type end, ios_base&,
-                    ios_base::iostate& err, float& v)          const;
-T     iter_type get(iter_type in, iter_type end, ios_base&,
-                    ios_base::iostate& err, double& v)         const;
-T     iter_type get(iter_type in, iter_type end, ios_base&,
-                    ios_base::iostate& err, long double& v)    const;
-T     iter_type get(iter_type in, iter_type end, ios_base&,
-                    ios_base::iostate& err, void*& v)          const;
-T     static locale::id id;
-
-    protected:
-T    ~num_get();                  // virtual
-T     virtual iter_type do_get(iter_type, iter_type, ios_base&,
-          ios_base::iostate& err, bool& v) const;
-S     virtual iter_type do_get(iter_type, iter_type, ios_base&,
-          ios_base::iostate& err, long& v) const;
-S     virtual iter_type do_get(iter_type, iter_type, ios_base&,
-          ios_base::iostate& err, unsigned short& v) const;
-S     virtual iter_type do_get(iter_type, iter_type, ios_base&,
-          ios_base::iostate& err, unsigned int& v) const;
-S     virtual iter_type do_get(iter_type, iter_type, ios_base&,
-          ios_base::iostate& err, unsigned long& v) const;
-S     virtual iter_type do_get(iter_type, iter_type, ios_base&,
-          ios_base::iostate& err, float& v) const;
-S     virtual iter_type do_get(iter_type, iter_type, ios_base&,
-          ios_base::iostate& err, double& v) const;
-S     virtual iter_type do_get(iter_type, iter_type, ios_base&,
-          ios_base::iostate& err, long double& v) const;
-S     virtual iter_type do_get(iter_type, iter_type, ios_base&,
-          ios_base::iostate& err, void*& v) const;
-    };
-
-
-
-   22.2.2.2  Template class num_put                   [lib.locale.nm.put]
-
-X   template  >
-    class num_put : public locale::facet {
-    public:
-T     typedef charT            char_type;
-T     typedef OutputIterator   iter_type;
-T     explicit num_put(size_t refs = 0);
-T     iter_type put(iter_type s, ios_base& f, char_type fill, bool v) const;
-T     iter_type put(iter_type s, ios_base& f, char_type fill, long v) const;
-T     iter_type put(iter_type s, ios_base& f, char_type fill,
-                    unsigned long v) const;
-T     iter_type put(iter_type s, ios_base& f, char_type fill,
-                    double v) const;
-T     iter_type put(iter_type s, ios_base& f, char_type fill,
-                    long double v) const;
-T     iter_type put(iter_type s, ios_base& f, char_type fill,
-                    const void* v) const;
-T     static locale::id id;
-    protected:
-T    ~num_put();                  // virtual
-T     virtual iter_type do_put(iter_type, ios_base&, char_type fill,
-                               bool v) const;
-T     virtual iter_type do_put(iter_type, ios_base&, char_type fill,
-                               long v) const;
-T     virtual iter_type do_put(iter_type, ios_base&, char_type fill,
-                               unsigned long) const;
-S     virtual iter_type do_put(iter_type, ios_base&, char_type fill,
-                               double v) const;
-S     virtual iter_type do_put(iter_type, ios_base&, char_type fill,
-                               long double v) const;
-T     virtual iter_type do_put(iter_type, ios_base&, char_type fill,
-                               const void* v) const;
-    };
-   }
-
-   22.2.3.1  Template class numpunct                [lib.locale.numpunct]
-
-T   template 
-    class numpunct : public locale::facet {
-    public:
-T     typedef charT               char_type;
-T     typedef basic_string string_type;
-T     explicit numpunct(size_t refs = 0);
-T     char_type    decimal_point()   const;
-T     char_type    thousands_sep()   const;
-T     string       grouping()        const;
-T     string_type  truename()        const;
-T     string_type  falsename()       const;
-T     static locale::id id;
-    protected:
-T    ~numpunct();                 // virtual
-T     virtual char_type    do_decimal_point() const;
-T     virtual char_type    do_thousands_sep() const;
-T     virtual string       do_grouping()      const;
-T     virtual string_type  do_truename()      const;      // for bool
-T     virtual string_type  do_falsename()     const;      // for bool
-    };
-   }
-
-
-
-   22.2.3.2  Template class                  [lib.locale.numpunct.byname]
-       numpunct_byname
-
-X   template 
-    class numpunct_byname : public numpunct {
-   // this class is specialized for char and wchar_t.
-    public:
-T     typedef charT                char_type;
-T     typedef basic_string  string_type;
-S     explicit numpunct_byname(const char*, size_t refs = 0);
-    protected:
-S    ~numpunct_byname();          // virtual
-S     virtual char_type    do_decimal_point() const;
-S     virtual char_type    do_thousands_sep() const;
-S     virtual string       do_grouping()      const;
-S     virtual string_type  do_truename()      const;      // for bool
-S     virtual string_type  do_falsename()     const;      // for bool
-    };
-
-
-   22.2.4.1  Template class collate                  [lib.locale.collate]
-
-T   template 
-    class collate : public locale::facet {
-    public:
-T     typedef charT               char_type;
-T     typedef basic_string string_type;
-T     explicit collate(size_t refs = 0);
-T     int compare(const charT* low1, const charT* high1,
-                  const charT* low2, const charT* high2) const;
-T     string_type transform(const charT* low, const charT* high) const;
-T     long hash(const charT* low, const charT* high) const;
-T     static locale::id id;
-    protected:
-T    ~collate();                  // virtual
-T     virtual int    do_compare(const charT* low1, const charT* high1,
-                                const charT* low2, const charT* high2) const;
-T     virtual string_type do_transform
-                               (const charT* low, const charT* high) const;
-T     virtual long   do_hash   (const charT* low, const charT* high) const;
-    };
-
-
-   22.2.4.2  Template class                   [lib.locale.collate.byname]
-       collate_byname
-
-X   template 
-    class collate_byname : public collate {
-    public:
-T     typedef basic_string string_type;
-T     explicit collate_byname(const char*, size_t refs = 0);
-    protected:
-S    ~collate_byname();           // virtual
-S     virtual int    do_compare(const charT* low1, const charT* high1,
-                                const charT* low2, const charT* high2) const;
-S     virtual string_type do_transform
-                               (const charT* low, const charT* high) const;
-S     virtual long   do_hash   (const charT* low, const charT* high) const;
-    };
-
-
-   22.2.5.1  Template class time_get                [lib.locale.time.get]
-
-T   class time_base {
-    public:
-T     enum dateorder { no_order, dmy, mdy, ymd, ydm };
-    };
-
-    [Note: semantics of time_get members are implementation-defined.
-     To complete implementation requires documenting behavior.]
-
-X   template  >
-    class time_get : public locale::facet, public time_base {
-    public:
-T     typedef charT            char_type;
-T     typedef InputIterator    iter_type;
-T     explicit time_get(size_t refs = 0);
-
-T     dateorder date_order()  const { return do_date_order(); }
-T     iter_type get_time(iter_type s, iter_type end, ios_base& f,
-                         ios_base::iostate& err, tm* t)  const;
-T     iter_type get_date(iter_type s, iter_type end, ios_base& f,
-                         ios_base::iostate& err, tm* t)  const;
-T     iter_type get_weekday(iter_type s, iter_type end, ios_base& f,
-                            ios_base::iostate& err, tm* t) const;
-T     iter_type get_monthname(iter_type s, iter_type end, ios_base& f,
-                              ios_base::iostate& err, tm* t) const;
-T     iter_type get_year(iter_type s, iter_type end, ios_base& f,
-                         ios_base::iostate& err, tm* t) const;
-T     static locale::id id;
-    protected:
-     ~time_get();                 // virtual
-X     virtual dateorder do_date_order()  const;
-S     virtual iter_type do_get_time(iter_type s, iter_type end, ios_base&,
-                                    ios_base::iostate& err, tm* t) const;
-S     virtual iter_type do_get_date(iter_type s, iter_type end, ios_base&,
-                                    ios_base::iostate& err, tm* t) const;
-S     virtual iter_type do_get_weekday(iter_type s, iter_type end, ios_base&,
-                                       ios_base::iostate& err, tm* t) const;
-S     virtual iter_type do_get_monthname(iter_type s, ios_base&,
-                                         ios_base::iostate& err, tm* t) const;
-S     virtual iter_type do_get_year(iter_type s, iter_type end, ios_base&,
-                                    ios_base::iostate& err, tm* t) const;
-    };
-
-
-
-   22.2.5.2  Template class                  [lib.locale.time.get.byname]
-       time_get_byname
-
-X   template  >
-    class time_get_byname : public time_get {
-    public:
-T     typedef time_base::dateorder dateorder;
-T     typedef InputIterator        iter_type
-
-S     explicit time_get_byname(const char*, size_t refs = 0);
-    protected:
-S    ~time_get_byname();          // virtual
-S     virtual dateorder do_date_order()  const;
-S     virtual iter_type do_get_time(iter_type s, iter_type end, ios_base&,
-                                    ios_base::iostate& err, tm* t) const;
-S     virtual iter_type do_get_date(iter_type s, iter_type end, ios_base&,
-                                    ios_base::iostate& err, tm* t) const;
-T     virtual iter_type do_get_weekday(iter_type s, iter_type end, ios_base&,
-                                       ios_base::iostate& err, tm* t) const;
-T     virtual iter_type do_get_monthname(iter_type s, iter_type end, ios_base&,
-                                         ios_base::iostate& err, tm* t) const;
-S     virtual iter_type do_get_year(iter_type s, iter_type end, ios_base&,
-                                    ios_base::iostate& err, tm* t) const;
-    };
-   }
-
-   22.2.5.3  Template class time_put                [lib.locale.time.put]
-
-X   template  >
-    class time_put : public locale::facet {
-    public:
-T     typedef charT            char_type;
-T     typedef OutputIterator   iter_type;
-T     explicit time_put(size_t refs = 0);
-      // the following is implemented in terms of other member functions.
-S     iter_type put(iter_type s, ios_base& f, char_type fill, const tm* tmb,
-                    const charT* pattern, const charT* pat_end) const;
-T     iter_type put(iter_type s, ios_base& f, char_type fill,
-                    const tm* tmb, char format, char modifier = 0) const;
-T     static locale::id id;
-    protected:
-T    ~time_put();                 // virtual
-S     virtual iter_type do_put(iter_type s, ios_base&, char_type, const tm* t,
-                               char format, char modifier) const;
-    };
-
-
-
-   22.2.5.4  Template class                  [lib.locale.time.put.byname]
-       time_put_byname
-
-T   template  >
-    class time_put_byname : public time_put
-    {
-    public:
-T     typedef charT          char_type;
-T     typedef OutputIterator iter_type;
-
-T     explicit time_put_byname(const char*, size_t refs = 0);
-    protected:
-T    ~time_put_byname();          // virtual
-S     virtual iter_type do_put(iter_type s, ios_base&, char_type, const tm* t,
-                               char format, char modifier) const;
-    };
-
-
-   22.2.6.1  Template class money_get              [lib.locale.money.get]
-
-X   template  >
-    class money_get : public locale::facet {
-    public:
-T     typedef charT               char_type;
-T     typedef InputIterator       iter_type;
-T     typedef basic_string string_type;
-T     explicit money_get(size_t refs = 0);
-T     iter_type get(iter_type s, iter_type end, bool intl,
-                    ios_base& f, ios_base::iostate& err,
-                    long double& units) const;
-T     iter_type get(iter_type s, iter_type end, bool intl,
-                    ios_base& f, ios_base::iostate& err,
-                    string_type& digits) const;
-T     static locale::id id;
-    protected:
-T    ~money_get();                // virtual
-S     virtual iter_type do_get(iter_type, iter_type, bool, ios_base&,
-                       ios_base::iostate& err, long double& units) const;
-S     virtual iter_type do_get(iter_type, iter_type, bool, ios_base&,
-                       ios_base::iostate& err, string_type& digits) const;
-    };
-
-   22.2.6.2  Template class money_put              [lib.locale.money.put]
-
-X   template  >
-    class money_put : public locale::facet {
-    public:
-T     typedef charT               char_type;
-T     typedef OutputIterator      iter_type;
-T     typedef basic_string string_type;
-T     explicit money_put(size_t refs = 0);
-T     iter_type put(iter_type s, bool intl, ios_base& f,
-                    char_type fill, long double units) const;
-T     iter_type put(iter_type s, bool intl, ios_base& f,
-                    char_type fill, const string_type& digits) const;
-T     static locale::id id;
-
-    protected:
-T    ~money_put();                // virtual
-S     virtual iter_type
-        do_put(iter_type, bool, ios_base&, char_type fill,
-               long double units) const;
-S     virtual iter_type
-        do_put(iter_type, bool, ios_base&, char_type fill,
-               const string_type& digits) const;
-    };
-
-
-   22.2.6.3  Template class moneypunct            [lib.locale.moneypunct]
-
-T   class money_base {
-    public:
-T     enum part { none, space, symbol, sign, value };
-T     struct pattern { char field[4]; };
-    };
-
-X   template 
-    class moneypunct : public locale::facet, public money_base {
-    public:
-T     typedef charT char_type;
-T     typedef basic_string string_type;
-T     explicit moneypunct(size_t refs = 0);
-T     charT        decimal_point() const;
-T     charT        thousands_sep() const;
-T     string       grouping()      const;
-T     string_type  curr_symbol()   const;
-T     string_type  positive_sign() const;
-T     string_type  negative_sign() const;
-T     int          frac_digits()   const;
-T     pattern      pos_format()    const;
-T     pattern      neg_format()    const;
-T     static locale::id id;
-T     static const bool intl = International;
-    protected:
-T    ~moneypunct();               // virtual
-S     virtual charT        do_decimal_point() const;
-S     virtual charT        do_thousands_sep() const;
-S     virtual string       do_grouping()      const;
-S     virtual string_type  do_curr_symbol()   const;
-S     virtual string_type  do_positive_sign() const;
-S     virtual string_type  do_negative_sign() const;
-S     virtual int          do_frac_digits()   const;
-T     virtual pattern      do_pos_format()    const;
-T     virtual pattern      do_neg_format()    const;
-    };
-   }
-
-   22.2.6.4  Template class                [lib.locale.moneypunct.byname]
-       moneypunct_byname
-
-X   template 
-    class moneypunct_byname : public moneypunct {
-    public:
-T     typedef money_base::pattern pattern;
-T     typedef basic_string string_type;
-
-T     explicit moneypunct_byname(const char*, size_t refs = 0);
-    protected:
-T    ~moneypunct_byname();        // virtual
-S     virtual charT        do_decimal_point() const;
-S     virtual charT        do_thousands_sep() const;
-S     virtual string       do_grouping()      const;
-S     virtual string_type  do_curr_symbol()   const;
-S     virtual string_type  do_positive_sign() const;
-S     virtual string_type  do_negative_sign() const;
-S     virtual int          do_frac_digits()   const;
-S     virtual pattern      do_pos_format()    const;
-S     virtual pattern      do_neg_format()    const;
-    };
-
-   22.2.7.1  Template class messages                [lib.locale.messages]
-
-T   class messages_base {
-    public:
-T     typedef int catalog;
-    };
-
-X   template 
-    class messages : public locale::facet, public messages_base {
-    public:
-T     typedef charT char_type;
-T     typedef basic_string string_type;
-T     explicit messages(size_t refs = 0);
-T     catalog open(const basic_string& fn, const locale&) const;
-T     string_type  get(catalog c, int set, int msgid,
-                       const string_type& dfault) const;
-T     void    close(catalog c) const;
-T     static locale::id id;
-    protected:
-T    ~messages();                 // virtual
-S     virtual catalog do_open(const basic_string&, const locale&) const;
-S     virtual string_type  do_get(catalog, int set, int msgid,
-                             const string_type& dfault) const;
-S     virtual void    do_close(catalog) const;
-    };
-
-   22.2.7.2  Template class                  [lib.locale.messages.byname]
-       messages_byname
-
-
-X   template 
-    class messages_byname : public messages {
-    public:
-T     typedef messages_base::catalog catalog;
-T     typedef basic_string    string_type;
-
-T     explicit messages_byname(const char*, size_t refs = 0);
-    protected:
-T    ~messages_byname();          // virtual
-S     virtual catalog do_open(const basic_string&, const locale&) const;
-S     virtual string_type  do_get(catalog, int set, int msgid,
-                             const string_type& dfault) const;
-S     virtual void    do_close(catalog) const;
-    };
-
-
-   22.3  C Library Locales                                [lib.c.locales]
-
-
-                   Table 13--Header  synopsis
-            Macros:
-X                        LC_ALL        LC_COLLATE   LC_CTYPE
-X                        LC_MONETARY   LC_NUMERIC   LC_TIME
-X                        NULL
-X           Struct:      lconv
-X           Functions:   localeconv    setlocale
-
-
-   23.2  Sequences                                        [lib.sequences]
-
-   , , , , and .
-
-   Header  synopsis
-
-T   template  > class deque;
-T   template 
-      bool operator==(const deque& x, const deque& y);
-T   template 
-      bool operator< (const deque& x, const deque& y);
-T   template 
-      bool operator!=(const deque& x, const deque& y);
-T   template 
-      bool operator> (const deque& x, const deque& y);
-T   template 
-      bool operator>=(const deque& x, const deque& y);
-T   template 
-      bool operator<=(const deque& x, const deque& y);
-T   template 
-      void swap(deque& x, deque& y);
-   }
-
-   Header  synopsis
-
-T   template  > class list;
-T   template 
-      bool operator==(const list& x, const list& y);
-T   template 
-      bool operator< (const list& x, const list& y);
-T   template 
-      bool operator!=(const list& x, const list& y);
-T   template 
-      bool operator> (const list& x, const list& y);
-T   template 
-      bool operator>=(const list& x, const list& y);
-T   template 
-      bool operator<=(const list& x, const list& y);
-T   template 
-      void swap(list& x, list& y);
-   }
-
-   Header  synopsis
-
-   namespace std {
-T   template  > class queue;
-T   template 
-      bool operator==(const queue& x,
-                      const queue& y);
-T   template 
-      bool operator< (const queue& x,
-                      const queue& y);
-T   template 
-      bool operator!=(const queue& x,
-                      const queue& y);
-T   template 
-      bool operator> (const queue& x,
-                      const queue& y);
-T   template 
-      bool operator>=(const queue& x,
-                      const queue& y);
-T   template 
-      bool operator<=(const queue& x,
-                      const queue& y);
-T   template ,
-              class Compare = less >
-T   class priority_queue;
-   }
-
-   Header  synopsis
-
-   namespace std {
-T   template  > class stack;
-T   template 
-      bool operator==(const stack& x,
-                      const stack& y);
-T   template 
-      bool operator< (const stack& x,
-                      const stack& y);
-T   template 
-      bool operator!=(const stack& x,
-                      const stack& y);
-T   template 
-      bool operator> (const stack& x,
-                      const stack& y);
-T   template 
-      bool operator>=(const stack& x,
-                      const stack& y);
-T   template 
-      bool operator<=(const stack& x,
-                      const stack& y);
-   }
-
-   Header  synopsis
-
-T   template  > class vector;
-
-T   template 
-      bool operator==(const vector& x,
-                      const vector& y);
-T   template 
-      bool operator< (const vector& x,
-                      const vector& y);
-T   template 
-      bool operator!=(const vector& x,
-                      const vector& y);
-T   template 
-      bool operator> (const vector& x,
-                      const vector& y);
-T   template 
-      bool operator>=(const vector& x,
-                      const vector& y);
-T   template 
-      bool operator<=(const vector& x,
-                      const vector& y);
-T   template 
-      void swap(vector& x, vector& y);
-
-T   template  class vector;
-T   template 
-      bool operator==(const vector& x,
-                      const vector& y);
-T   template 
-      bool operator< (const vector& x,
-                      const vector& y);
-T   template 
-      bool operator!=(const vector& x,
-                      const vector& y);
-T   template 
-      bool operator> (const vector& x,
-                      const vector& y);
-T   template 
-      bool operator>=(const vector& x,
-                      const vector& y);
-T   template 
-      bool operator<=(const vector& x,
-                      const vector& y);
-T   template 
-      void swap(vector& x, vector& y);
-   }
-
-   23.2.1  Template class deque                               [lib.deque]
-
-    template  >
-T   class deque {
-    public:
-      // types:
-T     typedef typename Allocator::reference         reference;
-T     typedef typename Allocator::const_reference   const_reference;
-T     typedef implementation defined                iterator;
-T     typedef implementation defined                const_iterator;
-T     typedef implementation defined                size_type;
-T     typedef implementation defined                difference_type;
-T     typedef T                                     value_type;
-T     typedef Allocator                             allocator_type;
-T     typedef typename Allocator::pointer           pointer;
-T     typedef typename Allocator::const_pointer     const_pointer;
-T     typedef std::reverse_iterator       reverse_iterator;
-T     typedef std::reverse_iterator const_reverse_iterator;
-      // _lib.deque.cons_ construct/copy/destroy:
-T     explicit deque(const Allocator& = Allocator());
-T     explicit deque(size_type n, const T& value = T(),
-          const Allocator& = Allocator());
-T     template 
-        deque(InputIterator first, InputIterator last,
-              const Allocator& = Allocator());
-T     deque(const deque& x);
-T    ~deque();
-T     deque& operator=(const deque& x);
-T     template 
-        void assign(InputIterator first, InputIterator last);
-T     void assign(size_type n, const T& t);
-T     allocator_type get_allocator() const;
-      // iterators:
-T     iterator               begin();
-T     const_iterator         begin() const;
-T     iterator               end();
-T     const_iterator         end() const;
-T     reverse_iterator       rbegin();
-T     const_reverse_iterator rbegin() const;
-T     reverse_iterator       rend();
-T     const_reverse_iterator rend() const;
-      // _lib.deque.capacity_ capacity:
-T     size_type size() const;
-T     size_type max_size() const;
-T     void      resize(size_type sz, T c = T());
-T     bool      empty() const;
-
-      // element access:
-T     reference       operator[](size_type n);
-T     const_reference operator[](size_type n) const;
-T     reference       at(size_type n);
-T     const_reference at(size_type n) const;
-T     reference       front();
-T     const_reference front() const;
-T     reference       back();
-T     const_reference back() const;
-      // _lib.deque.modifiers_ modifiers:
-T     void push_front(const T& x);
-T     void push_back(const T& x);
-T     iterator insert(iterator position, const T& x);
-T     void     insert(iterator position, size_type n, const T& x);
-T     template 
-        void insert (iterator position,
-                     InputIterator first, InputIterator last);
-T     void pop_front();
-T     void pop_back();
-T     iterator erase(iterator position);
-T     iterator erase(iterator first, iterator last);
-T     void     swap(deque&);
-T     void     clear();
-    };
-T   template 
-      bool operator==(const deque& x,
-                      const deque& y);
-T   template 
-      bool operator< (const deque& x,
-                      const deque& y);
-T   template 
-      bool operator!=(const deque& x,
-                      const deque& y);
-T   template 
-      bool operator> (const deque& x,
-                      const deque& y);
-T   template 
-      bool operator>=(const deque& x,
-                      const deque& y);
-T   template 
-      bool operator<=(const deque& x,
-                      const deque& y);
-    // specialized algorithms:
-T   template 
-      void swap(deque& x, deque& y);
-
-
-   23.2.2  Template class list                                 [lib.list]
-
-T   template  >
-    class list {
-    public:
-      // types:
-T     typedef typename Allocator::reference         reference;
-T     typedef typename Allocator::const_reference   const_reference;
-T     typedef implementation defined                iterator;
-T     typedef implementation defined                const_iterator;
-T     typedef implementation defined                size_type;
-T     typedef implementation defined                difference_type;
-T     typedef T                                     value_type;
-T     typedef Allocator                             allocator_type;
-T     typedef typename Allocator::pointer           pointer;
-T     typedef typename Allocator::const_pointer     const_pointer;
-T     typedef std::reverse_iterator       reverse_iterator;
-T     typedef std::reverse_iterator const_reverse_iterator;
-
-      // _lib.list.cons_ construct/copy/destroy:
-T     explicit list(const Allocator& = Allocator());
-T     explicit list(size_type n, const T& value = T(),
-                    const Allocator& = Allocator());
-T     template 
-        list(InputIterator first, InputIterator last,
-             const Allocator& = Allocator());
-T     list(const list& x);
-T    ~list();
-T     list& operator=(const list& x);
-T     template 
-        void assign(InputIterator first, InputIterator last);
-T     void assign(size_type n, const T& t);
-T     allocator_type get_allocator() const;
-      // iterators:
-T     iterator               begin();
-T     const_iterator         begin() const;
-T     iterator               end();
-T     const_iterator         end() const;
-T     reverse_iterator       rbegin();
-T     const_reverse_iterator rbegin() const;
-T     reverse_iterator       rend();
-T     const_reverse_iterator rend() const;
-      // _lib.list.capacity_ capacity:
-T     bool      empty() const;
-T     size_type size() const;
-T     size_type max_size() const;
-T     void      resize(size_type sz, T c = T());
-      // element access:
-T     reference       front();
-T     const_reference front() const;
-T     reference       back();
-T     const_reference back() const;
-      // _lib.list.modifiers_ modifiers:
-T     void push_front(const T& x);
-T     void pop_front();
-T     void push_back(const T& x);
-T     void pop_back();
-T     iterator insert(iterator position, const T& x);
-T     void     insert(iterator position, size_type n, const T& x);
-T     template 
-        void insert(iterator position, InputIterator first,
-                    InputIterator last);
-T     iterator erase(iterator position);
-T     iterator erase(iterator position, iterator last);
-T     void     swap(list&);
-T     void     clear();
-      // _lib.list.ops_ list operations:
-T     void splice(iterator position, list& x);
-T     void splice(iterator position, list& x, iterator i);
-T     void splice(iterator position, list& x, iterator first,
-                  iterator last);
-T     void remove(const T& value);
-T     template  void remove_if(Predicate pred);
-
-T     void unique();
-T     template 
-        void unique(BinaryPredicate binary_pred);
-T     void merge(list& x);
-T     template  void merge(list& x, Compare comp);
-        void sort();
-T     template  void sort(Compare comp);
-        void reverse();
-    };
-T   template 
-      bool operator==(const list& x, const list& y);
-T   template 
-      bool operator< (const list& x, const list& y);
-T   template 
-      bool operator!=(const list& x, const list& y);
-T   template 
-      bool operator> (const list& x, const list& y);
-T   template 
-      bool operator>=(const list& x, const list& y);
-T   template 
-      bool operator<=(const list& x, const list& y);
-    // specialized algorithms:
-T   template 
-      void swap(list& x, list& y);
-
-
-   23.2.3.1  Template class queue                             [lib.queue]
-
-T   template  >
-    class queue {
-    public:
-T     typedef typename Container::value_type            value_type;
-T     typedef typename Container::size_type             size_type;
-T     typedef          Container                        container_type;
-    protected:
-T     Container c;
-    public:
-T     explicit queue(const Container& = Container());
-
-T     bool      empty() const             { return c.empty(); }
-T     size_type size()  const             { return c.size(); }
-T     value_type&       front()           { return c.front(); }
-T     const value_type& front() const     { return c.front(); }
-T     value_type&       back()            { return c.back(); }
-T     const value_type& back() const      { return c.back(); }
-T     void push(const value_type& x)      { c.push_back(x); }
-T     void pop()                          { c.pop_front(); }
-    };
-
-T   template 
-      bool operator==(const queue& x,
-                      const queue& y);
-T   template 
-      bool operator< (const queue& x,
-                      const queue& y);
-T   template 
-      bool operator!=(const queue& x,
-                      const queue& y);
-T   template 
-      bool operator> (const queue& x,
-                      const queue& y);
-T   template 
-      bool operator>=(const queue& x,
-                      const queue& y);
-T   template 
-      bool operator<=(const queue& x,
-                      const queue& y);
-
-   23.2.3.2  Template class priority_queue           [lib.priority.queue]
-
-T   template ,
-              class Compare = less >
-    class priority_queue {
-    public:
-T     typedef typename Container::value_type            value_type;
-T     typedef typename Container::size_type             size_type;
-T     typedef          Container                        container_type;
-    protected:
-T     Container c;
-T     Compare comp;
-    public:
-T     explicit priority_queue(const Compare& x = Compare(),
-                              const Container& = Container());
-T     template 
-        priority_queue(InputIterator first, InputIterator last,
-                       const Compare& x = Compare(),
-                       const Container& = Container());
-
-T     bool      empty() const       { return c.empty(); }
-T     size_type size()  const       { return c.size(); }
-T     const value_type& top() const { return c.front(); }
-T     void push(const value_type& x);
-T     void pop();
-    };
-
-   23.2.3.3  Template class stack                             [lib.stack]
-
-T   template  >
-    class stack {
-    public:
-T     typedef typename Container::value_type            value_type;
-T     typedef typename Container::size_type             size_type;
-T     typedef          Container                        container_type;
-    protected:
-T     Container c;
-    public:
-T     explicit stack(const Container& = Container());
-
-T     bool      empty() const             { return c.empty(); }
-T     size_type size()  const             { return c.size(); }
-T     value_type&       top()             { return c.back(); }
-T     const value_type& top() const       { return c.back(); }
-T     void push(const value_type& x)      { c.push_back(x); }
-T     void pop()                          { c.pop_back(); }
-    };
-T   template 
-      bool operator==(const stack& x,
-                      const stack& y);
-T   template 
-      bool operator< (const stack& x,
-                      const stack& y);
-T   template 
-      bool operator!=(const stack& x,
-                      const stack& y);
-T   template 
-      bool operator> (const stack& x,
-                      const stack& y);
-T   template 
-      bool operator>=(const stack& x,
-                      const stack& y);
-T   template 
-      bool operator<=(const stack& x,
-                      const stack& y);
-
-   23.2.4  Template class vector                             [lib.vector]
-
-    template  >
-T   class vector {
-    public:
-      // types:
-T     typedef typename Allocator::reference         reference;
-T     typedef typename Allocator::const_reference   const_reference;
-T     typedef implementation defined                iterator;
-T     typedef implementation defined                const_iterator;
-T     typedef implementation defined                size_type;
-T     typedef implementation defined                difference_type;
-T     typedef T                                     value_type;
-T     typedef Allocator                             allocator_type;
-T     typedef typename Allocator::pointer           pointer;
-T     typedef typename Allocator::const_pointer     const_pointer
-T     typedef std::reverse_iterator       reverse_iterator;
-T     typedef std::reverse_iterator const_reverse_iterator;
-      // _lib.vector.cons_ construct/copy/destroy:
-T     explicit vector(const Allocator& = Allocator());
-T     explicit vector(size_type n, const T& value = T(),
-          const Allocator& = Allocator());
-T     template 
-        vector(InputIterator first, InputIterator last,
-          const Allocator& = Allocator());
-T     vector(const vector& x);
-T    ~vector();
-T     vector& operator=(const vector& x);
-T     template 
-        void assign(InputIterator first, InputIterator last);
-T     void assign(size_type n, const T& u);
-T     allocator_type get_allocator() const;
-      // iterators:
-T     iterator               begin();
-T     const_iterator         begin() const;
-T     iterator               end();
-T     const_iterator         end() const;
-T     reverse_iterator       rbegin();
-T     const_reverse_iterator rbegin() const;
-T     reverse_iterator       rend();
-T     const_reverse_iterator rend() const;
-      // _lib.vector.capacity_ capacity:
-T     size_type size() const;
-T     size_type max_size() const;
-T     void      resize(size_type sz, T c = T());
-T     size_type capacity() const;
-T     bool      empty() const;
-T     void      reserve(size_type n);
-
-      // element access:
-T     reference       operator[](size_type n);
-T     const_reference operator[](size_type n) const;
-T     const_reference at(size_type n) const;
-T     reference       at(size_type n);
-T     reference       front();
-T     const_reference front() const;
-T     reference       back();
-T     const_reference back() const;
-      // _lib.vector.modifiers_ modifiers:
-T     void push_back(const T& x);
-T     void pop_back();
-T     iterator insert(iterator position, const T& x);
-T     void     insert(iterator position, size_type n, const T& x);
-T     template 
-          void insert(iterator position,
-                      InputIterator first, InputIterator last);
-T     iterator erase(iterator position);
-T     iterator erase(iterator first, iterator last);
-T     void     swap(vector&);
-T     void     clear();
-    };
-
-T   template 
-      bool operator==(const vector& x,
-                      const vector& y);
-T   template 
-      bool operator< (const vector& x,
-                      const vector& y);
-T   template 
-      bool operator!=(const vector& x,
-                      const vector& y);
-T   template 
-      bool operator> (const vector& x,
-                      const vector& y);
-T   template 
-      bool operator>=(const vector& x,
-                      const vector& y);
-T   template 
-      bool operator<=(const vector& x,
-                      const vector& y);
-    // specialized algorithms:
-T   template 
-      void swap(vector& x, vector& y);
-
-
-   23.2.5  Class vector                           [lib.vector.bool]
-
-T   template  class vector {
-    public:
-      // types:
-T     typedef bool                                  const_reference;
-T     typedef implementation defined                iterator;
-T     typedef implementation defined                const_iterator;
-T     typedef implementation defined                size_type;
-T     typedef implementation defined                difference_type;
-T     typedef bool                                  value_type;
-T     typedef Allocator                             allocator_type;
-T     typedef implementation defined                pointer;
-T     typedef implementation defined                const_pointer
-T     typedef std::reverse_iterator       reverse_iterator;
-T     typedef std::reverse_iterator const_reverse_iterator;
-      // bit reference:
-T     class reference {
-       friend class vector;
-T      reference();
-      public:
-T      ~reference();
-T       operator bool() const;
-T       reference& operator=(const bool x);
-T       reference& operator=(const reference& x);
-T       void flip();              // flips the bit
-      };
-
-      // construct/copy/destroy:
-T     explicit vector(const Allocator& = Allocator());
-T     explicit vector(size_type n, const bool& value = bool(),
-                      const Allocator& = Allocator());
-T     template 
-        vector(InputIterator first, InputIterator last,
-          const Allocator& = Allocator());
-T     vector(const vector& x);
-T    ~vector();
-T     vector& operator=(const vector& x);
-T     template 
-        void assign(InputIterator first, InputIterator last);
-T     void assign(size_type n, const T& t);
-T     allocator_type get_allocator() const;
-      // iterators:
-T     iterator               begin();
-T     const_iterator         begin() const;
-T     iterator               end();
-T     const_iterator         end() const;
-T     reverse_iterator       rbegin();
-T     const_reverse_iterator rbegin() const;
-T     reverse_iterator       rend();
-T     const_reverse_iterator rend() const;
-      // capacity:
-T     size_type size() const;
-T     size_type max_size() const;
-T     void      resize(size_type sz, bool c = false);
-T     size_type capacity() const;
-T     bool      empty() const;
-T     void      reserve(size_type n);
-      // element access:
-T     reference       operator[](size_type n);
-T     const_reference operator[](size_type n) const;
-T     const_reference at(size_type n) const;
-T     reference       at(size_type n);
-T     reference       front();
-T     const_reference front() const;
-T     reference       back();
-T     const_reference back() const;
-      // modifiers:
-T     void push_back(const bool& x);
-T     void pop_back();
-T     iterator insert(iterator position, const bool& x);
-T     void     insert (iterator position, size_type n, const bool& x);
-T     template 
-          void insert(iterator position,
-                      InputIterator first, InputIterator last);
-T     iterator erase(iterator position);
-T     iterator erase(iterator first, iterator last);
-T     void swap(vector&);
-T     static void swap(reference x, reference y);
-T     void flip();                // flips all bits
-T     void clear();
-    };
-
-T   template 
-      bool operator==(const vector& x,
-                      const vector& y);
-T   template 
-      bool operator< (const vector& x,
-                      const vector& y);
-T   template 
-      bool operator!=(const vector& x,
-                      const vector& y);
-T   template 
-      bool operator> (const vector& x,
-                      const vector& y);
-T   template 
-      bool operator>=(const vector& x,
-                      const vector& y);
-T   template 
-      bool operator<=(const vector& x,
-                      const vector& y);
-    // specialized algorithms:
-T   template 
-      void swap(vector& x, vector& y);
-
-   23.3  Associative containers                         [lib.associative]
-
-  and :
-
-   Header  synopsis
-
-    template ,
-              class Allocator = allocator > >
-T     class map;
-
-T   template 
-      bool operator==(const map& x,
-                      const map& y);
-T   template 
-      bool operator< (const map& x,
-                      const map& y);
-T   template 
-      bool operator!=(const map& x,
-                      const map& y);
-T   template 
-      bool operator> (const map& x,
-                      const map& y);
-T   template 
-      bool operator>=(const map& x,
-                      const map& y);
-T   template 
-      bool operator<=(const map& x,
-                      const map& y);
-T   template 
-      void swap(map& x,
-                map& y);
-T   template ,
-              class Allocator = allocator > >
-      class multimap;
-T   template 
-      bool operator==(const multimap& x,
-                      const multimap& y);
-T   template 
-      bool operator< (const multimap& x,
-                      const multimap& y);
-T   template 
-      bool operator!=(const multimap& x,
-                      const multimap& y);
-T   template 
-      bool operator> (const multimap& x,
-                      const multimap& y);
-T   template 
-      bool operator>=(const multimap& x,
-                      const multimap& y);
-T   template 
-      bool operator<=(const multimap& x,
-                      const multimap& y);
-T   template 
-      void swap(multimap& x,
-                multimap& y);
-   }
-
-   Header  synopsis
-
-    template ,
-              class Allocator = allocator >
-T     class set;
-
-T   template 
-      bool operator==(const set& x,
-                      const set& y);
-T   template 
-      bool operator< (const set& x,
-                      const set& y);
-T   template 
-      bool operator!=(const set& x,
-                      const set& y);
-T   template 
-      bool operator> (const set& x,
-                      const set& y);
-T   template 
-      bool operator>=(const set& x,
-                      const set& y);
-T   template 
-      bool operator<=(const set& x,
-                      const set& y);
-T   template 
-      void swap(set& x,
-                set& y);
-T   template ,
-              class Allocator = allocator >
-      class multiset;
-T   template 
-      bool operator==(const multiset& x,
-                      const multiset& y);
-T   template 
-      bool operator< (const multiset& x,
-                      const multiset& y);
-T   template 
-      bool operator!=(const multiset& x,
-                      const multiset& y);
-T   template 
-      bool operator> (const multiset& x,
-                      const multiset& y);
-T   template 
-      bool operator>=(const multiset& x,
-                      const multiset& y);
-T   template 
-      bool operator<=(const multiset& x,
-                      const multiset& y);
-T   template 
-      void swap(multiset& x,
-                multiset& y);
-   }
-
-   23.3.1  Template class map                                   [lib.map]
-
-    template ,
-              class Allocator = allocator > >
-T     class map {
-    public:
-      // types:
-T     typedef Key                                   key_type;
-T     typedef T                                     mapped_type;
-T     typedef pair                    value_type;
-T     typedef Compare                               key_compare;
-T     typedef Allocator                             allocator_type;
-T     typedef typename Allocator::reference         reference;
-T     typedef typename Allocator::const_reference   const_reference;
-T     typedef implementation defined                iterator;
-T     typedef implementation defined                const_iterator;
-T     typedef implementation defined                size_type;
-T     typedef implementation defined                difference_type;
-T     typedef typename Allocator::pointer           pointer;
-T     typedef typename Allocator::const_pointer     const_pointer;
-T     typedef std::reverse_iterator       reverse_iterator;
-T     typedef std::reverse_iterator const_reverse_iterator;
-T     class value_compare
-        : public binary_function {
-      friend class map;
-      protected:
-T       Compare comp;
-T       value_compare(Compare c) : comp(c) {}
-      public:
-T       bool operator()(const value_type& x, const value_type& y) const {
-          return comp(x.first, y.first);
-        }
-      };
-
-      // _lib.map.cons_ construct/copy/destroy:
-T     explicit map(const Compare& comp = Compare(),
-                   const Allocator& = Allocator());
-T     template 
-        map(InputIterator first, InputIterator last,
-            const Compare& comp = Compare(), const Allocator& = Allocator());
-T     map(const map& x);
-T    ~map();
-T     map&
-        operator=(const map& x);
-      // iterators:
-T     iterator               begin();
-T     const_iterator         begin() const;
-T     iterator               end();
-T     const_iterator         end() const;
-T     reverse_iterator       rbegin();
-T     const_reverse_iterator rbegin() const;
-T     reverse_iterator       rend();
-T     const_reverse_iterator rend() const;
-      // capacity:
-T     bool      empty() const;
-T     size_type size() const;
-T     size_type max_size() const;
-      // _lib.map.access_ element access:
-T     T& operator[](const key_type& x);
-      // modifiers:
-T     pair insert(const value_type& x);
-T     iterator             insert(iterator position, const value_type& x);
-T     template 
-        void insert(InputIterator first, InputIterator last);
-T     void      erase(iterator position);
-T     size_type erase(const key_type& x);
-T     void      erase(iterator first, iterator last);
-T     void swap(map&);
-T     void clear();
-      // observers:
-T     key_compare   key_comp() const;
-T     value_compare value_comp() const;
-      // _lib.map.ops_ map operations:
-T     iterator       find(const key_type& x);
-T     const_iterator find(const key_type& x) const;
-T     size_type      count(const key_type& x) const;
-T     iterator       lower_bound(const key_type& x);
-T     const_iterator lower_bound(const key_type& x) const;
-T     iterator       upper_bound(const key_type& x);
-T     const_iterator upper_bound(const key_type& x) const;
-T     pair
-          equal_range(const key_type& x);
-T     pair
-          equal_range(const key_type& x) const;
-    };
-
-T   template 
-      bool operator==(const map& x,
-                      const map& y);
-T   template 
-      bool operator< (const map& x,
-                      const map& y);
-T   template 
-      bool operator!=(const map& x,
-                      const map& y);
-T   template 
-      bool operator> (const map& x,
-                      const map& y);
-T   template 
-      bool operator>=(const map& x,
-                      const map& y);
-T   template 
-      bool operator<=(const map& x,
-                      const map& y);
-    // specialized algorithms:
-T   template 
-      void swap(map& x,
-                map& y);
-
-   23.3.2  Template class multimap                         [lib.multimap]
-
-    template ,
-              class Allocator = allocator > >
-T   class multimap {
-    public:
-      // types:
-T     typedef Key                                   key_type;
-T     typedef T                                     mapped_type;
-T     typedef pair                     value_type;
-T     typedef Compare                               key_compare;
-T     typedef Allocator                             allocator_type;
-T     typedef typename Allocator::reference         reference;
-T     typedef typename Allocator::const_reference   const_reference;
-T     typedef implementation defined                iterator;
-T     typedef implementation defined                const_iterator;
-T     typedef implementation defined                size_type;
-T     typedef implementation defined                difference_type
-T     typedef typename Allocator::pointer           pointer;
-T     typedef typename Allocator::const_pointer     const_pointer;
-T     typedef std::reverse_iterator       reverse_iterator;
-T     typedef std::reverse_iterator const_reverse_iterator;
-T     class value_compare
-        : public binary_function {
-      friend class multimap;
-      protected:
-T       Compare comp;
-T       value_compare(Compare c) : comp(c) {}
-      public:
-T       bool operator()(const value_type& x, const value_type& y) const {
-          return comp(x.first, y.first);
-        }
-      };
-      // construct/copy/destroy:
-T     explicit multimap(const Compare& comp = Compare(),
-                        const Allocator& = Allocator());
-T     template 
-        multimap(InputIterator first, InputIterator last,
-                 const Compare& comp = Compare(),
-                 const Allocator& = Allocator());
-T     multimap(const multimap& x);
-T    ~multimap();
-T     multimap&
-        operator=(const multimap& x);
-T     allocator_type get_allocator() const;
-
-      // iterators:
-T     iterator               begin();
-T     const_iterator         begin() const;
-T     iterator               end();
-T     const_iterator         end() const;
-T     reverse_iterator       rbegin();
-T     const_reverse_iterator rbegin() const;
-T     reverse_iterator       rend();
-T     const_reverse_iterator rend() const;
-      // capacity:
-T     bool           empty() const;
-T     size_type      size() const;
-T     size_type      max_size() const;
-      // modifiers:
-T     iterator insert(const value_type& x);
-T     iterator insert(iterator position, const value_type& x);
-T     template 
-        void insert(InputIterator first, InputIterator last);
-T     void      erase(iterator position);
-T     size_type erase(const key_type& x);
-T     void      erase(iterator first, iterator last);
-T     void swap(multimap&);
-T     void clear();
-      // observers:
-T     key_compare    key_comp() const;
-T     value_compare  value_comp() const;
-      // map operations:
-T     iterator       find(const key_type& x);
-T     const_iterator find(const key_type& x) const;
-T     size_type      count(const key_type& x) const;
-T     iterator       lower_bound(const key_type& x);
-T     const_iterator lower_bound(const key_type& x) const;
-T     iterator       upper_bound(const key_type& x);
-T     const_iterator upper_bound(const key_type& x) const;
-T     pair             equal_range(const key_type& x);
-T     pair equal_range(const key_type& x) const;
-    };
-
-T   template 
-      bool operator==(const multimap& x,
-                      const multimap& y);
-T   template 
-      bool operator< (const multimap& x,
-                      const multimap& y);
-T   template 
-      bool operator!=(const multimap& x,
-                      const multimap& y);
-T   template 
-      bool operator> (const multimap& x,
-                      const multimap& y);
-T   template 
-      bool operator>=(const multimap& x,
-                      const multimap& y);
-T   template 
-      bool operator<=(const multimap& x,
-                      const multimap& y);
-    // specialized algorithms:
-T   template 
-      void swap(multimap& x,
-                multimap& y);
-
-
-   23.3.3  Template class set                                   [lib.set]
-
-    template ,
-              class Allocator = allocator >
-T   class set {
-    public:
-      // types:
-T     typedef Key                                   key_type;
-T     typedef Key                                   value_type;
-T     typedef Compare                               key_compare;
-T     typedef Compare                               value_compare;
-T     typedef Allocator                             allocator_type;
-T     typedef typename Allocator::reference         reference;
-T     typedef typename Allocator::const_reference   const_reference;
-T     typedef implementation defined                iterator;
-T     typedef implementation defined                const_iterator;
-T     typedef implementation defined                size_type;
-T     typedef implementation defined                difference_type;
-T     typedef typename Allocator::pointer           pointer;
-T     typedef typename Allocator::const_pointer     const_pointer;
-T     typedef std::reverse_iterator       reverse_iterator;
-T     typedef std::reverse_iterator const_reverse_iterator;
-      // _lib.set.cons_ construct/copy/destroy:
-T     explicit set(const Compare& comp = Compare(),
-                   const Allocator& = Allocator());
-T     template 
-        set(InputIterator first, InputIterator last,
-            const Compare& comp = Compare(), const Allocator& = Allocator());
-T     set(const set& x);
-T    ~set();
-T     set&
-        operator=(const set& x);
-T     allocator_type get_allocator() const;
-      // iterators:
-T     iterator               begin();
-T     const_iterator         begin() const;
-T     iterator               end();
-T     const_iterator         end() const;
-T     reverse_iterator       rbegin();
-T     const_reverse_iterator rbegin() const;
-T     reverse_iterator       rend();
-T     const_reverse_iterator rend() const;
-      // capacity:
-T     bool          empty() const;
-T     size_type     size() const;
-T     size_type     max_size() const;
-      // modifiers:
-T     pair insert(const value_type& x);
-T     iterator            insert(iterator position, const value_type& x);
-T     template 
-T         void insert(InputIterator first, InputIterator last);
-T     void      erase(iterator position);
-T     size_type erase(const key_type& x);
-T     void      erase(iterator first, iterator last);
-T     void swap(set&);
-T     void clear();
-
-      // observers:
-T     key_compare   key_comp() const;
-T     value_compare value_comp() const;
-      // set operations:
-T     iterator  find(const key_type& x) const;
-T     size_type count(const key_type& x) const;
-T     iterator  lower_bound(const key_type& x) const;
-T     iterator  upper_bound(const key_type& x) const;
-T     pair equal_range(const key_type& x) const;
-    };
-T   template 
-      bool operator==(const set& x,
-                      const set& y);
-T   template 
-      bool operator< (const set& x,
-                      const set& y);
-T   template 
-      bool operator!=(const set& x,
-                      const set& y);
-T   template 
-      bool operator> (const set& x,
-                      const set& y);
-T   template 
-      bool operator>=(const set& x,
-                      const set& y);
-T   template 
-      bool operator<=(const set& x,
-                      const set& y);
-    // specialized algorithms:
-T   template 
-      void swap(set& x,
-                set& y);
-
-   23.3.4  Template class multiset                         [lib.multiset]
-
-    template ,
-              class Allocator = allocator >
-T   class multiset {
-    public:
-      // types:
-T     typedef Key                                   key_type;
-T     typedef Key                                   value_type;
-T     typedef Compare                               key_compare;
-T     typedef Compare                               value_compare;
-T     typedef Allocator                             allocator_type;
-T     typedef typename Allocator::reference         reference;
-T     typedef typename Allocator::const_reference   const_reference;
-T     typedef implementation defined                iterator;
-T     typedef implementation defined                const_iterator;
-T     typedef implementation defined                size_type;
-T     typedef implementation defined                difference_type
-T     typedef typename Allocator::pointer           pointer;
-T     typedef typename Allocator::const_pointer     const_pointer;
-T     typedef std::reverse_iterator       reverse_iterator;
-T     typedef std::reverse_iterator const_reverse_iterator;
-
-      // construct/copy/destroy:
-T     explicit multiset(const Compare& comp = Compare(),
-                        const Allocator& = Allocator());
-T     template 
-        multiset(InputIterator first, InputIterator last,
-                 const Compare& comp = Compare(),
-                 const Allocator& = Allocator());
-T     multiset(const multiset& x);
-T    ~multiset();
-T     multiset&
-          operator=(const multiset& x);
-T     allocator_type get_allocator() const;
-      // iterators:
-T     iterator               begin();
-T     const_iterator         begin() const;
-T     iterator               end();
-T     const_iterator         end() const;
-T     reverse_iterator       rbegin();
-T     const_reverse_iterator rbegin() const;
-T     reverse_iterator       rend();
-T     const_reverse_iterator rend() const;
-      // capacity:
-T     bool          empty() const;
-T     size_type     size() const;
-T     size_type     max_size() const;
-      // modifiers:
-T     iterator insert(const value_type& x);
-T     iterator insert(iterator position, const value_type& x);
-T     template 
-        void insert(InputIterator first, InputIterator last);
-T     void      erase(iterator position);
-T     size_type erase(const key_type& x);
-T     void      erase(iterator first, iterator last);
-T     void swap(multiset&);
-T     void clear();
-      // observers:
-T     key_compare   key_comp() const;
-T     value_compare value_comp() const;
-      // set operations:
-T     iterator  find(const key_type& x) const;
-T     size_type count(const key_type& x) const;
-T     iterator  lower_bound(const key_type& x) const;
-T     iterator  upper_bound(const key_type& x) const;
-T     pair equal_range(const key_type& x) const;
-    };
-
-T   template 
-      bool operator==(const multiset& x,
-                      const multiset& y);
-T   template 
-      bool operator< (const multiset& x,
-                      const multiset& y);
-T   template 
-      bool operator!=(const multiset& x,
-                      const multiset& y);
-T   template 
-      bool operator> (const multiset& x,
-                      const multiset& y);
-T   template 
-      bool operator>=(const multiset& x,
-                      const multiset& y);
-T   template 
-      bool operator<=(const multiset& x,
-                      const multiset& y);
-    // specialized algorithms:
-T   template 
-      void swap(multiset& x,
-                multiset& y);
-
-   23.3.5  Template class bitset                    [lib.template.bitset]
-
-   Header  synopsis
-
-T   template  class bitset;
-    // _lib.bitset.operators_ bitset operations:
-T   template 
-      bitset operator&(const bitset&, const bitset&);
-T   template 
-      bitset operator|(const bitset&, const bitset&);
-T   template 
-      bitset operator^(const bitset&, const bitset&);
-T   template 
-      basic_istream&
-      operator>>(basic_istream& is, bitset& x);
-T   template 
-      basic_ostream&
-      operator<<(basic_ostream& os, const bitset& x);
-
-T   template class bitset {
-    public:
-      // bit reference:
-T     class reference {
-        friend class bitset;
-T       reference();
-      public:
-T      ~reference();
-T       reference& operator=(bool x);             // for b[i] = x;
-T       reference& operator=(const reference&);   // for b[i] = b[j];
-T       bool operator~() const;                   // flips the bit
-T       operator bool() const;                    // for x = b[i];
-T       reference& flip();                        // for b[i].flip();
-      };
-
-      // _lib.bitset.cons_ constructors:
-T     bitset();
-T     bitset(unsigned long val);
-T     template
-        explicit bitset(
-          const basic_string& str,
-          typename basic_string::size_type pos = 0,
-          typename basic_string::size_type n =
-            basic_string::npos);
-      // _lib.bitset.members_ bitset operations:
-T     bitset& operator&=(const bitset& rhs);
-T     bitset& operator|=(const bitset& rhs);
-T     bitset& operator^=(const bitset& rhs);
-T     bitset& operator<<=(size_t pos);
-T     bitset& operator>>=(size_t pos);
-T     bitset& set();
-T     bitset& set(size_t pos, int val = true);
-T     bitset& reset();
-T     bitset& reset(size_t pos);
-T     bitset  operator~() const;
-T     bitset& flip();
-T     bitset& flip(size_t pos);
-      // element access:
-T     reference operator[](size_t pos);         // for b[i];
-T     unsigned long  to_ulong() const;
-T     template 
-        basic_string to_string() const;
-T     size_t count() const;
-T     size_t size()  const;
-T     bool operator==(const bitset& rhs) const;
-T     bool operator!=(const bitset& rhs) const;
-T     bool test(size_t pos) const;
-T     bool any() const;
-T     bool none() const;
-T     bitset operator<<(size_t pos) const;
-T     bitset operator>>(size_t pos) const;
-    };
-
-
-
-
-   24.2  Header  synopsis               [lib.iterator.synopsis]
-
-    // _lib.iterator.primitives_, primitives:
-T   template struct iterator_traits;
-T   template struct iterator_traits;
-
-X   template struct iterator;
-T   struct input_iterator_tag {};
-T   struct output_iterator_tag {};
-T   struct forward_iterator_tag: public input_iterator_tag {};
-T   struct bidirectional_iterator_tag: public forward_iterator_tag {};
-T   struct random_access_iterator_tag: public bidirectional_iterator_tag {};
-    // _lib.iterator.operations_, iterator operations:
-T   template 
-      void advance(InputIterator& i, Distance n);
-T   template 
-      typename iterator_traits::difference_type
-      distance(InputIterator first, InputIterator last);
-    // _lib.predef.iterators_, predefined iterators:
-X   template  class reverse_iterator;
-T   template 
-      bool operator==(
-        const reverse_iterator& x,
-        const reverse_iterator& y);
-T   template 
-      bool operator<(
-        const reverse_iterator& x,
-        const reverse_iterator& y);
-T   template 
-      bool operator!=(
-        const reverse_iterator& x,
-        const reverse_iterator& y);
-T   template 
-      bool operator>(
-        const reverse_iterator& x,
-        const reverse_iterator& y);
-T   template 
-      bool operator>=(
-        const reverse_iterator& x,
-        const reverse_iterator& y);
-T   template 
-      bool operator<=(
-        const reverse_iterator& x,
-        const reverse_iterator& y);
-T   template 
-      typename reverse_iterator::difference_type operator-(
-        const reverse_iterator& x,
-        const reverse_iterator& y);
-T   template 
-      reverse_iterator
-        operator+(
-          typename reverse_iterator::difference_type n,
-          const reverse_iterator& x);
-
-X   template  class back_insert_iterator;
-T   template 
-      back_insert_iterator back_inserter(Container& x);
-X   template  class front_insert_iterator;
-T   template 
-      front_insert_iterator front_inserter(Container& x);
-X   template  class insert_iterator;
-T   template 
-      insert_iterator inserter(Container& x, Iterator i);
-    // _lib.stream.iterators_, stream iterators:
-X   template ,
-              class Distance = ptrdiff_t>
-      class istream_iterator;
-    template 
-X     bool operator==(const istream_iterator& x,
-                      const istream_iterator& y);
-    template 
-X     bool operator!=(const istream_iterator& x,
-                      const istream_iterator& y);
-X   template  >
-        class ostream_iterator;
-X   template >
-      class istreambuf_iterator;
-X   template 
-      bool operator==(const istreambuf_iterator& a,
-                      const istreambuf_iterator& b);
-X   template 
-      bool operator!=(const istreambuf_iterator& a,
-                      const istreambuf_iterator& b);
-T   template  >
-      class ostreambuf_iterator;
-
-   24.3  Iterator primitives                    [lib.iterator.primitives]
-
-T   template struct iterator_traits {
-T     typedef typename Iterator::difference_type difference_type;
-T     typedef typename Iterator::value_type value_type;
-T     typedef typename Iterator::pointer pointer;
-T     typedef typename Iterator::reference reference;
-T     typedef typename Iterator::iterator_category iterator_category;
-    };
-
-T   template struct iterator_traits {
-T     typedef ptrdiff_t difference_type;
-T     typedef T value_type;
-T     typedef T* pointer;
-T     typedef T& reference;
-T     typedef random_access_iterator_tag iterator_category;
-    };
-
-T   template struct iterator_traits {
-T     typedef ptrdiff_t difference_type;
-T     typedef T value_type;
-T     typedef const T* pointer;
-T     typedef const T& reference;
-T     typedef random_access_iterator_tag iterator_category;
-    };
-
-   24.3.2  Basic iterator                            [lib.iterator.basic]
-
-    template
-X     struct iterator {
-T         typedef T         value_type;
-T         typedef Distance  difference_type;
-T         typedef Pointer   pointer;
-T         typedef Reference reference;
-T         typedef Category  iterator_category;
-    };
-
-   24.3.3  Standard iterator tags                 [lib.std.iterator.tags]
-
-T   struct input_iterator_tag {};
-T   struct output_iterator_tag {};
-T   struct forward_iterator_tag: public input_iterator_tag {};
-T   struct bidirectional_iterator_tag: public forward_iterator_tag {};
-T   struct random_access_iterator_tag: public bidirectional_iterator_tag {};
-
-
-   24.4.1  Reverse iterators                      [lib.reverse.iterators]
-
-    template 
-X   class reverse_iterator : public
-          iterator::iterator_category,
-                   typename iterator_traits::value_type,
-                   typename iterator_traits::difference_type,
-                   typename iterator_traits::pointer,
-                   typename iterator_traits::reference> {
-    protected:
-T     Iterator current;
-    public:
-T     typedef Iterator
-          iterator_type;
-T     typedef typename iterator_traits::difference_type
-          difference_type;
-T     typedef typename iterator_traits::reference
-          reference;
-T     typedef typename iterator_traits::pointer
-          pointer;
-
-T     reverse_iterator();
-T     explicit reverse_iterator(Iterator x);
-T     template  reverse_iterator(const reverse_iterator& u);
-T     Iterator base() const;      // explicit
-T     reference operator*() const;
-T     pointer   operator->() const;
-T     reverse_iterator& operator++();
-T     reverse_iterator  operator++(int);
-T     reverse_iterator& operator--();
-T     reverse_iterator  operator--(int);
-
-T     reverse_iterator  operator+ (difference_type n) const;
-T     reverse_iterator& operator+=(difference_type n);
-T     reverse_iterator  operator- (difference_type n) const;
-T     reverse_iterator& operator-=(difference_type n);
-T     reference operator[](difference_type n) const;
-    };
-T   template 
-      bool operator==(
-        const reverse_iterator& x,
-        const reverse_iterator& y);
-T   template 
-      bool operator<(
-        const reverse_iterator& x,
-        const reverse_iterator& y);
-T   template 
-      bool operator!=(
-        const reverse_iterator& x,
-        const reverse_iterator& y);
-T   template 
-      bool operator>(
-        const reverse_iterator& x,
-        const reverse_iterator& y);
-T   template 
-      bool operator>=(
-        const reverse_iterator& x,
-        const reverse_iterator& y);
-T   template 
-      bool operator<=(
-        const reverse_iterator& x,
-        const reverse_iterator& y);
-T   template 
-      typename reverse_iterator::difference_type operator-(
-        const reverse_iterator& x,
-        const reverse_iterator& y);
-T   template 
-      reverse_iterator operator+(
-        typename reverse_iterator::difference_type n,
-        const reverse_iterator& x);
-
-
-   24.4.2.1  Template class                    [lib.back.insert.iterator]
-       back_insert_iterator
-
-    template 
-X   class back_insert_iterator :
-          public iterator {
-    protected:
-T     Container* container;
-    public:
-T     typedef Container container_type;
-T     explicit back_insert_iterator(Container& x);
-T     back_insert_iterator&
-        operator=(typename Container::const_reference value);
-
-T     back_insert_iterator& operator*();
-T     back_insert_iterator& operator++();
-T     back_insert_iterator  operator++(int);
-    };
-T   template 
-      back_insert_iterator back_inserter(Container& x);
-
-
-
-   24.4.2.3  Template class                   [lib.front.insert.iterator]
-       front_insert_iterator
-
-    template 
-X   class front_insert_iterator :
-          public iterator {
-    protected:
-T     Container* container;
-    public:
-T     typedef Container container_type;
-T     explicit front_insert_iterator(Container& x);
-T     front_insert_iterator&
-        operator=(typename Container::const_reference value);
-T     front_insert_iterator& operator*();
-T     front_insert_iterator& operator++();
-T     front_insert_iterator  operator++(int);
-    };
-T   template 
-      front_insert_iterator front_inserter(Container& x);
-
-
-   24.4.2.5  Template class insert_iterator         [lib.insert.iterator]
-
-    template 
-X   class insert_iterator :
-          public iterator {
-    protected:
-T     Container* container;
-T     typename Container::iterator iter;
-    public:
-T     typedef Container container_type;
-T     insert_iterator(Container& x, typename Container::iterator i);
-T     insert_iterator&
-        operator=(typename Container::const_reference value);
-T     insert_iterator& operator*();
-T     insert_iterator& operator++();
-T     insert_iterator& operator++(int);
-    };
-T   template 
-      insert_iterator inserter(Container& x, Iterator i);
-
-   24.5.1  Template class istream_iterator         [lib.istream.iterator]
-
-    template ,
-        class Distance = ptrdiff_t>
-X   class istream_iterator:
-      public iterator {
-    public:
-T     typedef charT char_type
-T     typedef traits traits_type;
-T     typedef basic_istream istream_type;
-T     istream_iterator();
-T     istream_iterator(istream_type& s);
-T     istream_iterator(const istream_iterator& x);
-T    ~istream_iterator();
-
-T     const T& operator*() const;
-T     const T* operator->() const;
-T     istream_iterator& operator++();
-T     istream_iterator  operator++(int);
-    };
-
-T   template 
-      bool operator==(const istream_iterator& x,
-                      const istream_iterator& y);
-T   template 
-      bool operator!=(const istream_iterator& x,
-                      const istream_iterator& y);
-
-
-   24.5.2  Template class ostream_iterator         [lib.ostream.iterator]
-
-    template  >
-X   class ostream_iterator:
-      public iterator {
-    public:
-T     typedef charT char_type;
-T     typedef traits traits_type;
-T     typedef basic_ostream ostream_type;
-T     ostream_iterator(ostream_type& s);
-T     ostream_iterator(ostream_type& s, const charT* delimiter);
-T     ostream_iterator(const ostream_iterator& x);
-T    ~ostream_iterator();
-T     ostream_iterator& operator=(const T& value);
-
-T     ostream_iterator& operator*();
-T     ostream_iterator& operator++();
-T     ostream_iterator& operator++(int);
-    };
-
-
-   24.5.3  Template class                       [lib.istreambuf.iterator]
-       istreambuf_iterator
-
-    template >
-X   class istreambuf_iterator
-       : public iterator {
-    public:
-T     typedef charT                         char_type;
-T     typedef traits                        traits_type;
-T     typedef typename traits::int_type     int_type;
-T     typedef basic_streambuf streambuf_type;
-T     typedef basic_istream   istream_type;
-T     class proxy;                        // exposition only
-T     istreambuf_iterator() throw();
-T     istreambuf_iterator(istream_type& s) throw();
-T     istreambuf_iterator(streambuf_type* s) throw();
-T     istreambuf_iterator(const proxy& p) throw();
-T     charT operator*() const;
-T     istreambuf_iterator& operator++();
-T     proxy operator++(int);
-X     bool equal(istreambuf_iterator& b);
-    };
-
-T   template 
-      bool operator==(const istreambuf_iterator& a,
-                      const istreambuf_iterator& b);
-
-T   template 
-      bool operator!=(const istreambuf_iterator& a,
-                      const istreambuf_iterator& b);
-
-   24.5.3.1  Template class              [lib.istreambuf.iterator::proxy]
-       istreambuf_iterator::proxy
-
-    template  >
-T     class istreambuf_iterator::proxy
-    {
-T     charT keep_;
-T     basic_streambuf* sbuf_;
-T     proxy(charT c,
-            basic_streambuf* sbuf);
-        : keep_(c), sbuf_(sbuf) {}
-    public:
-T     charT operator*() { return keep_; }
-    };
-
-
-
-   24.5.4  Template class                       [lib.ostreambuf.iterator]
-       ostreambuf_iterator
-
-    template  >
-T   class ostreambuf_iterator:
-      public iterator {
-    public:
-T     typedef charT                         char_type;
-T     typedef traits                        traits_type;
-T     typedef basic_streambuf streambuf_type;
-T     typedef basic_ostream   ostream_type;
-    public:
-T     ostreambuf_iterator(ostream_type& s) throw();
-T     ostreambuf_iterator(streambuf_type* s) throw();
-T     ostreambuf_iterator& operator=(charT c);
-T     ostreambuf_iterator& operator*();
-T     ostreambuf_iterator& operator++();
-T     ostreambuf_iterator& operator++(int);
-T     bool failed() const throw();
-    };
-
-
-   Header  synopsis
-
-
-    // _lib.alg.nonmodifying_, non-modifying sequence operations:
-T   template
-      Function for_each(InputIterator first, InputIterator last, Function f);
-T   template
-      InputIterator find(InputIterator first, InputIterator last,
-                         const T& value);
-T   template
-      InputIterator find_if(InputIterator first, InputIterator last,
-                            Predicate pred);
-T   template
-      ForwardIterator1
-        find_end(ForwardIterator1 first1, ForwardIterator1 last1,
-                 ForwardIterator2 first2, ForwardIterator2 last2);
-T   template
-      ForwardIterator1
-        find_end(ForwardIterator1 first1, ForwardIterator1 last1,
-                 ForwardIterator2 first2, ForwardIterator2 last2,
-                 BinaryPredicate pred);
-T   template
-      ForwardIterator1
-        find_first_of(ForwardIterator1 first1, ForwardIterator1 last1,
-                      ForwardIterator2 first2, ForwardIterator2 last2);
-T   template
-      ForwardIterator1
-        find_first_of(ForwardIterator1 first1, ForwardIterator1 last1,
-                 ForwardIterator2 first2, ForwardIterator2 last2,
-                 BinaryPredicate pred);
-T   template
-      ForwardIterator adjacent_find(ForwardIterator first,
-                                    ForwardIterator last);
-T   template
-      ForwardIterator adjacent_find(ForwardIterator first,
-          ForwardIterator last, BinaryPredicate pred);
-T   template
-      typename iterator_traits::difference_type
-        count(InputIterator first, InputIterator last, const T& value);
-T   template
-      typename iterator_traits::difference_type
-        count_if(InputIterator first, InputIterator last, Predicate pred);
-T   template
-      pair
-        mismatch(InputIterator1 first1, InputIterator1 last1,
-                 InputIterator2 first2);
-T   template
-      pair
-        mismatch(InputIterator1 first1, InputIterator1 last1,
-                 InputIterator2 first2, BinaryPredicate pred);
-
-T   template
-      bool equal(InputIterator1 first1, InputIterator1 last1,
-                 InputIterator2 first2);
-T   template
-      bool equal(InputIterator1 first1, InputIterator1 last1,
-                 InputIterator2 first2, BinaryPredicate pred);
-T   template
-      ForwardIterator1 search(ForwardIterator1 first1, ForwardIterator1 last1,
-                              ForwardIterator2 first2, ForwardIterator2 last2);
-T   template
-      ForwardIterator1 search(ForwardIterator1 first1, ForwardIterator1 last1,
-                              ForwardIterator2 first2, ForwardIterator2 last2,
-                              BinaryPredicate pred);
-T   template
-      ForwardIterator  search_n(ForwardIterator first, ForwardIterator last,
-                              Size count, const T& value);
-T   template
-      ForwardIterator1 search_n(ForwardIterator first, ForwardIterator last,
-                              Size count, const T& value,
-                              BinaryPredicate pred);
-    // _lib.alg.modifying.operations_, modifying sequence operations:
-    // _lib.alg.copy_, copy:
-T   template
-      OutputIterator copy(InputIterator first, InputIterator last,
-                          OutputIterator result);
-T   template
-      BidirectionalIterator2
-        copy_backward(BidirectionalIterator1 first, BidirectionalIterator1 last,
-                      BidirectionalIterator2 result);
-    // _lib.alg.swap_, swap:
-T   template void swap(T& a, T& b);
-T   template
-      ForwardIterator2 swap_ranges(ForwardIterator1 first1,
-          ForwardIterator1 last1, ForwardIterator2 first2);
-T   template
-      void iter_swap(ForwardIterator1 a, ForwardIterator2 b);
-T   template
-      OutputIterator transform(InputIterator first, InputIterator last,
-                               OutputIterator result, UnaryOperation op);
-T   template
-      OutputIterator transform(InputIterator1 first1, InputIterator1 last1,
-                               InputIterator2 first2, OutputIterator result,
-                               BinaryOperation binary_op);
-
-T   template
-      void replace(ForwardIterator first, ForwardIterator last,
-                   const T& old_value, const T& new_value);
-T   template
-      void replace_if(ForwardIterator first, ForwardIterator last,
-                      Predicate pred, const T& new_value);
-T   template
-      OutputIterator replace_copy(InputIterator first, InputIterator last,
-                                  OutputIterator result,
-                                  const T& old_value, const T& new_value);
-T   template
-      OutputIterator replace_copy_if(Iterator first, Iterator last,
-                                     OutputIterator result,
-                                     Predicate pred, const T& new_value);
-T   template
-      void fill(ForwardIterator first, ForwardIterator last, const T& value);
-T   template
-      void fill_n(OutputIterator first, Size n, const T& value);
-T   template
-      void generate(ForwardIterator first, ForwardIterator last, Generator gen);
-T   template
-      void generate_n(OutputIterator first, Size n, Generator gen);
-T   template
-      ForwardIterator remove(ForwardIterator first, ForwardIterator last,
-                             const T& value);
-T   template
-      ForwardIterator remove_if(ForwardIterator first, ForwardIterator last,
-                                Predicate pred);
-T   template
-      OutputIterator remove_copy(InputIterator first, InputIterator last,
-                                 OutputIterator result, const T& value);
-T   template
-      OutputIterator remove_copy_if(InputIterator first, InputIterator last,
-                                    OutputIterator result, Predicate pred);
-T   template
-      ForwardIterator unique(ForwardIterator first, ForwardIterator last);
-T   template
-      ForwardIterator unique(ForwardIterator first, ForwardIterator last,
-                             BinaryPredicate pred);
-T   template
-      OutputIterator unique_copy(InputIterator first, InputIterator last,
-                                 OutputIterator result);
-T   template
-      OutputIterator unique_copy(InputIterator first, InputIterator last,
-                                 OutputIterator result, BinaryPredicate pred);
-T   template
-      void reverse(BidirectionalIterator first, BidirectionalIterator last);
-T   template
-      OutputIterator reverse_copy(BidirectionalIterator first,
-                                  BidirectionalIterator last,
-                                  OutputIterator result);
-
-T   template
-      void rotate(ForwardIterator first, ForwardIterator middle,
-                  ForwardIterator last);
-T   template
-      OutputIterator rotate_copy(ForwardIterator first, ForwardIterator middle,
-                                 ForwardIterator last, OutputIterator result);
-T   template
-      void random_shuffle(RandomAccessIterator first,
-                          RandomAccessIterator last);
-T   template
-      void random_shuffle(RandomAccessIterator first,
-                          RandomAccessIterator last,
-                          RandomNumberGenerator& rand);
-    // _lib.alg.partitions_, partitions:
-T   template
-      BidirectionalIterator partition(BidirectionalIterator first,
-                                      BidirectionalIterator last,
-                                      Predicate pred);
-T   template
-      BidirectionalIterator stable_partition(BidirectionalIterator first,
-                                             BidirectionalIterator last,
-                                             Predicate pred);
-    // _lib.alg.sorting_, sorting and related operations:
-    // _lib.alg.sort_, sorting:
-T   template
-      void sort(RandomAccessIterator first, RandomAccessIterator last);
-T   template
-      void sort(RandomAccessIterator first, RandomAccessIterator last,
-                Compare comp);
-T   template
-      void stable_sort(RandomAccessIterator first, RandomAccessIterator last);
-T   template
-      void stable_sort(RandomAccessIterator first, RandomAccessIterator last,
-                       Compare comp);
-T   template
-      void partial_sort(RandomAccessIterator first,
-                        RandomAccessIterator middle,
-                        RandomAccessIterator last);
-T   template
-      void partial_sort(RandomAccessIterator first,
-                        RandomAccessIterator middle,
-                        RandomAccessIterator last, Compare comp);
-T   template
-      RandomAccessIterator
-        partial_sort_copy(InputIterator first, InputIterator last,
-                          RandomAccessIterator result_first,
-                          RandomAccessIterator result_last);
-T   template
-      RandomAccessIterator
-        partial_sort_copy(InputIterator first, InputIterator last,
-                          RandomAccessIterator result_first,
-                          RandomAccessIterator result_last,
-                          Compare comp);
-
-T   template
-      void nth_element(RandomAccessIterator first, RandomAccessIterator nth,
-                       RandomAccessIterator last);
-T   template
-      void nth_element(RandomAccessIterator first, RandomAccessIterator nth,
-                       RandomAccessIterator last, Compare comp);
-    // _lib.alg.binary.search_, binary search:
-T   template
-      ForwardIterator lower_bound(ForwardIterator first, ForwardIterator last,
-                                  const T& value);
-T   template
-      ForwardIterator lower_bound(ForwardIterator first, ForwardIterator last,
-                                  const T& value, Compare comp);
-T   template
-      ForwardIterator upper_bound(ForwardIterator first, ForwardIterator last,
-                                  const T& value);
-T   template
-      ForwardIterator upper_bound(ForwardIterator first, ForwardIterator last,
-                                  const T& value, Compare comp);
-T   template
-      pair
-        equal_range(ForwardIterator first, ForwardIterator last,
-                    const T& value);
-T   template
-      pair
-        equal_range(ForwardIterator first, ForwardIterator last,
-                    const T& value, Compare comp);
-T   template
-      bool binary_search(ForwardIterator first, ForwardIterator last,
-                         const T& value);
-T   template
-      bool binary_search(ForwardIterator first, ForwardIterator last,
-                         const T& value, Compare comp);
-    // _lib.alg.merge_, merge:
-T   template
-      OutputIterator merge(InputIterator1 first1, InputIterator1 last1,
-                           InputIterator2 first2, InputIterator2 last2,
-                           OutputIterator result);
-T   template
-      OutputIterator merge(InputIterator1 first1, InputIterator1 last1,
-                           InputIterator2 first2, InputIterator2 last2,
-                           OutputIterator result, Compare comp);
-T   template
-      void inplace_merge(BidirectionalIterator first,
-                         BidirectionalIterator middle,
-                         BidirectionalIterator last);
-T   template
-      void inplace_merge(BidirectionalIterator first,
-                         BidirectionalIterator middle,
-                         BidirectionalIterator last, Compare comp);
-
-    // _lib.alg.set.operations_, set operations:
-T   template
-      bool includes(InputIterator1 first1, InputIterator1 last1,
-                    InputIterator2 first2, InputIterator2 last2);
-T   template
-      bool includes(InputIterator1 first1, InputIterator1 last1,
-                    InputIterator2 first2, InputIterator2 last2, Compare comp);
-T   template
-      OutputIterator set_union(InputIterator1 first1, InputIterator1 last1,
-                               InputIterator2 first2, InputIterator2 last2,
-                               OutputIterator result);
-T   template
-      OutputIterator set_union(InputIterator1 first1, InputIterator1 last1,
-                               InputIterator2 first2, InputIterator2 last2,
-                               OutputIterator result, Compare comp);
-T   template
-      OutputIterator set_intersection
-          (InputIterator1 first1, InputIterator1 last1,
-           InputIterator2 first2, InputIterator2 last2,
-           OutputIterator result);
-T   template
-      OutputIterator set_intersection
-          (InputIterator1 first1, InputIterator1 last1,
-           InputIterator2 first2, InputIterator2 last2,
-           OutputIterator result, Compare comp);
-T   template
-      OutputIterator set_difference
-          (InputIterator1 first1, InputIterator1 last1,
-           InputIterator2 first2, InputIterator2 last2,
-           OutputIterator result);
-T   template
-      OutputIterator set_difference(InputIterator1 first1, InputIterator1 last1,
-                                    InputIterator2 first2, InputIterator2 last2,
-                                    OutputIterator result, Compare comp);
-T   template
-      OutputIterator
-        set_symmetric_difference(InputIterator1 first1, InputIterator1 last1,
-                                 InputIterator2 first2, InputIterator2 last2,
-                                 OutputIterator result);
-T   template
-      OutputIterator
-        set_symmetric_difference(InputIterator1 first1, InputIterator1 last1,
-                                 InputIterator2 first2, InputIterator2 last2,
-                                 OutputIterator result, Compare comp);
-    // _lib.alg.heap.operations_, heap operations:
-T   template
-      void push_heap(RandomAccessIterator first, RandomAccessIterator last);
-T   template
-      void push_heap(RandomAccessIterator first, RandomAccessIterator last,
-                     Compare comp);
-
-T   template
-      void pop_heap(RandomAccessIterator first, RandomAccessIterator last);
-T   template
-      void pop_heap(RandomAccessIterator first, RandomAccessIterator last,
-                    Compare comp);
-T   template
-      void make_heap(RandomAccessIterator first, RandomAccessIterator last);
-T   template
-      void make_heap(RandomAccessIterator first, RandomAccessIterator last,
-                     Compare comp);
-T   template
-      void sort_heap(RandomAccessIterator first, RandomAccessIterator last);
-T   template
-      void sort_heap(RandomAccessIterator first, RandomAccessIterator last,
-                     Compare comp);
-    // _lib.alg.min.max_, minimum and maximum:
-T   template const T& min(const T& a, const T& b);
-T   template
-      const T& min(const T& a, const T& b, Compare comp);
-T   template const T& max(const T& a, const T& b);
-T   template
-      const T& max(const T& a, const T& b, Compare comp);
-T   template
-      ForwardIterator min_element(ForwardIterator first, ForwardIterator last);
-T   template
-      ForwardIterator min_element(ForwardIterator first, ForwardIterator last,
-                                Compare comp);
-T   template
-      ForwardIterator max_element(ForwardIterator first, ForwardIterator last);
-T   template
-      ForwardIterator max_element(ForwardIterator first, ForwardIterator last,
-                                Compare comp);
-T   template
-      bool lexicographical_compare
-          (InputIterator1 first1, InputIterator1 last1,
-           InputIterator2 first2, InputIterator2 last2);
-T   template
-      bool lexicographical_compare
-          (InputIterator1 first1, InputIterator1 last1,
-           InputIterator2 first2, InputIterator2 last2,
-           Compare comp);
-
-    // _lib.alg.permutation.generators_, permutations
-T   template
-      bool next_permutation(BidirectionalIterator first,
-                            BidirectionalIterator last);
-T   template
-      bool next_permutation(BidirectionalIterator first,
-                            BidirectionalIterator last, Compare comp);
-T   template
-      bool prev_permutation(BidirectionalIterator first,
-                            BidirectionalIterator last);
-T   template
-      bool prev_permutation(BidirectionalIterator first,
-                            BidirectionalIterator last, Compare comp);
-
-
-   25.4  C library algorithms                         [lib.alg.c.library]
-
-   1 Header  (partial, Table 2):
-
-                    Table 2--Header  synopsis
-
-                      Functions:   bsearch   qsort
-
-
-X  extern "C" void *bsearch(const void *key, const void *base,
-                          size_t nmemb, size_t size,
-                          int (*compar)(const void *, const void *));
-X  extern "C++" void *bsearch(const void *key, const void *base,
-                          size_t nmemb, size_t size,
-                          int (*compar)(const void *, const void *));
-
-X  extern "C" void qsort(void* base, size_t nmemb, size_t size,
-                  int (*compar)(const void*, const void*));
-X  extern "C++" void qsort(void* base, size_t nmemb, size_t size,
-                  int (*compar)(const void*, const void*));
-
-
-
-   26.2  Complex numbers                            [lib.complex.numbers]
-
-
-   26.2.1  Header  synopsis               [lib.complex.synopsis]
-
-T   template class complex;
-T   template<> class complex;
-T   template<> class complex;
-T   template<> class complex;
-    // _lib.complex.ops_ operators:
-T   template
-      complex operator+(const complex&, const complex&);
-T   template complex operator+(const complex&, const T&);
-T   template complex operator+(const T&, const complex&);
-T   template complex operator-
-      (const complex&, const complex&);
-T   template complex operator-(const complex&, const T&);
-T   template complex operator-(const T&, const complex&);
-T   template complex operator*
-      (const complex&, const complex&);
-T   template complex operator*(const complex&, const T&);
-T   template complex operator*(const T&, const complex&);
-T   template complex operator/
-      (const complex&, const complex&);
-T   template complex operator/(const complex&, const T&);
-T   template complex operator/(const T&, const complex&);
-T   template complex operator+(const complex&);
-T   template complex operator-(const complex&);
-T   template bool operator==
-      (const complex&, const complex&);
-T   template bool operator==(const complex&, const T&);
-T   template bool operator==(const T&, const complex&);
-T   template bool operator!=(const complex&, const complex&);
-T   template bool operator!=(const complex&, const T&);
-T   template bool operator!=(const T&, const complex&);
-T   template
-      basic_istream&
-      operator>>(basic_istream&, complex&);
-
-T   template
-      basic_ostream&
-      operator<<(basic_ostream&, const complex&);
-    // _lib.complex.value.ops_ values:
-T   template T real(const complex&);
-T   template T imag(const complex&);
-
-T   template T abs(const complex&);
-T   template T arg(const complex&);
-T   template T norm(const complex&);
-T   template complex conj(const complex&);
-T   template complex polar(const T&, const T&);
-    // _lib.complex.transcendentals_ transcendentals:
-T   template complex cos  (const complex&);
-T   template complex cosh (const complex&);
-T   template complex exp  (const complex&);
-T   template complex log  (const complex&);
-T   template complex log10(const complex&);
-T   template complex pow(const complex&, int);
-T   template complex pow(const complex&, const T&);
-T   template complex pow(const complex&, const complex&);
-T   template complex pow(const T&, const complex&);
-T   template complex sin  (const complex&);
-T   template complex sinh (const complex&);
-T   template complex sqrt (const complex&);
-T   template complex tan  (const complex&);
-T   template complex tanh (const complex&);
-   }
-
-   26.2.2  Template class complex                           [lib.complex]
-
-    template
-T   class complex {
-    public:
-T     typedef T value_type;
-
-T     complex(const T& re = T(), const T& im = T());
-T     complex(const complex&);
-T     template complex(const complex&);
-
-T     T real() const;
-T     T imag() const;
-
-T     complex& operator= (const T&);
-T     complex& operator+=(const T&);
-T     complex& operator-=(const T&);
-T     complex& operator*=(const T&);
-T     complex& operator/=(const T&);
-
-T     complex& operator=(const complex&);
-T     template complex& operator= (const complex&);
-T     template complex& operator+=(const complex&);
-T     template complex& operator-=(const complex&);
-T     template complex& operator*=(const complex&);
-T     template complex& operator/=(const complex&);
-    };
-
-T   template complex operator+
-      (const complex&, const complex&);
-T   template complex operator+(const complex&, const T&);
-T   template complex operator+(const T&, const complex&);
-
-T   template complex operator-
-      (const complex&, const complex&);
-T   template complex operator-(const complex&, const T&);
-T   template complex operator-(const T&, const complex&);
-
-T   template complex operator*
-      (const complex&, const complex&);
-T   template complex operator*(const complex&, const T&);
-T   template complex operator*(const T&, const complex&);
-
-T   template complex operator/
-      (const complex&, const complex&);
-T   template complex operator/(const complex&, const T&);
-T   template complex operator/(const T&, const complex&);
-
-T   template complex operator+(const complex&);
-T   template complex operator-(const complex&);
-
-T   template bool operator==(const complex&, const complex&);
-T   template bool operator==(const complex&, const T&);
-T   template bool operator==(const T&, const complex&);
-
-T   template bool operator!=(const complex&, const complex&);
-T   template bool operator!=(const complex&, const T&);
-T   template bool operator!=(const T&, const complex&);
-
-T   template
-      basic_istream&
-      operator>>(basic_istream&, complex&);
-
-T   template
-      basic_ostream&
-      operator<<(basic_ostream&, const complex&);
-
-
-   26.2.3  complex specializations                  [lib.complex.special]
-
-T   template<> class complex {
-    public:
-T     typedef float value_type;
-
-T     complex(float re = 0.0f, float im = 0.0f);
-T     explicit complex(const complex&);
-T     explicit complex(const complex&);
-T     float real() const;
-T     float imag() const;
-
-T     complex& operator= (float);
-T     complex& operator+=(float);
-T     complex& operator-=(float);
-T     complex& operator*=(float);
-T     complex& operator/=(float);
-
-T     complex& operator=(const complex&);
-T     template complex& operator= (const complex&);
-T     template complex& operator+=(const complex&);
-T     template complex& operator-=(const complex&);
-T     template complex& operator*=(const complex&);
-T     template complex& operator/=(const complex&);
-    };
-T   template<> class complex {
-    public:
-T     typedef double value_type;
-
-T     complex(double re = 0.0, double im = 0.0);
-T     complex(const complex&);
-T     explicit complex(const complex&);
-T     double real() const;
-T     double imag() const;
-
-T     complex& operator= (double);
-T     complex& operator+=(double);
-T     complex& operator-=(double);
-T     complex& operator*=(double);
-T     complex& operator/=(double);
-
-T     complex& operator=(const complex&);
-T     template complex& operator= (const complex&);
-T     template complex& operator+=(const complex&);
-T     template complex& operator-=(const complex&);
-T     template complex& operator*=(const complex&);
-T     template complex& operator/=(const complex&);
-    };
-
-T   template<> class complex {
-    public:
-T     typedef long double value_type;
-
-T     complex(long double re = 0.0L, long double im = 0.0L);
-T     complex(const complex&);
-T     complex(const complex&);
-T     long double real() const;
-T     long double imag() const;
-
-T     complex& operator=(const complex&);
-T     complex& operator= (long double);
-T     complex& operator+=(long double);
-T     complex& operator-=(long double);
-T     complex& operator*=(long double);
-T     complex& operator/=(long double);
-
-T     template complex& operator= (const complex&);
-T     template complex& operator+=(const complex&);
-T     template complex& operator-=(const complex&);
-T     template complex& operator*=(const complex&);
-T     template complex& operator/=(const complex&);
-    };
-
-   26.3  Numeric arrays                                    [lib.numarray]
-
-   26.3.1  Header  synopsis             [lib.valarray.synopsis]
-
-T   template class valarray;         // An array of type T
-T   class slice;
-T   template class slice_array;
-T   class gslice;
-T   template class gslice_array;
-T   template class mask_array;       // a masked array
-T   template class indirect_array;   // an indirected array
-
-T   template valarray operator*
-      (const valarray&, const valarray&);
-T   template valarray operator* (const valarray&, const T&);
-T   template valarray operator* (const T&, const valarray&);
-T   template valarray operator/
-      (const valarray&, const valarray&);
-T   template valarray operator/ (const valarray&, const T&);
-T   template valarray operator/ (const T&, const valarray&);
-T   template valarray operator%
-      (const valarray&, const valarray&);
-T   template valarray operator% (const valarray&, const T&);
-T   template valarray operator% (const T&, const valarray&);
-T   template valarray operator+
-      (const valarray&, const valarray&);
-T   template valarray operator+ (const valarray&, const T&);
-T   template valarray operator+ (const T&, const valarray&);
-T   template valarray operator-
-      (const valarray&, const valarray&);
-T   template valarray operator- (const valarray&, const T&);
-T   template valarray operator- (const T&, const valarray&);
-T   template valarray operator^
-      (const valarray&, const valarray&);
-T   template valarray operator^ (const valarray&, const T&);
-T   template valarray operator^ (const T&, const valarray&);
-T   template valarray operator&
-      (const valarray&, const valarray&);
-T   template valarray operator& (const valarray&, const T&);
-T   template valarray operator& (const T&, const valarray&);
-T   template valarray operator|
-      (const valarray&, const valarray&);
-T   template valarray operator| (const valarray&, const T&);
-T   template valarray operator| (const T&, const valarray&);
-T   template valarray operator<<
-      (const valarray&, const valarray&);
-T   template valarray operator<<(const valarray&, const T&);
-T   template valarray operator<<(const T&, const valarray&);
-T   template valarray operator>>
-      (const valarray&, const valarray&);
-T   template valarray operator>>(const valarray&, const T&);
-T   template valarray operator>>(const T&, const valarray&);
-T   template valarray operator&&
-      (const valarray&, const valarray&);
-T   template valarray operator&&(const valarray&, const T&);
-T   template valarray operator&&(const T&, const valarray&);
-T   template valarray operator||
-      (const valarray&, const valarray&);
-T   template valarray operator||(const valarray&, const T&);
-T   template valarray operator||(const T&, const valarray&);
-
-T   template
-      valarray operator==(const valarray&, const valarray&);
-T   template valarray operator==(const valarray&, const T&);
-T   template valarray operator==(const T&, const valarray&);
-T   template
-      valarray operator!=(const valarray&, const valarray&);
-T   template valarray operator!=(const valarray&, const T&);
-T   template valarray operator!=(const T&, const valarray&);
-T   template
-      valarray operator< (const valarray&, const valarray&);
-T   template valarray operator< (const valarray&, const T&);
-T   template valarray operator< (const T&, const valarray&);
-T   template
-      valarray operator> (const valarray&, const valarray&);
-T   template valarray operator> (const valarray&, const T&);
-T   template valarray operator> (const T&, const valarray&);
-T   template
-      valarray operator<=(const valarray&, const valarray&);
-T   template valarray operator<=(const valarray&, const T&);
-T   template valarray operator<=(const T&, const valarray&);
-T   template
-      valarray operator>=(const valarray&, const valarray&);
-T   template valarray operator>=(const valarray&, const T&);
-T   template valarray operator>=(const T&, const valarray&);
-T   template valarray abs  (const valarray&);
-T   template valarray acos (const valarray&);
-T   template valarray asin (const valarray&);
-T   template valarray atan (const valarray&);
-T   template valarray atan2
-      (const valarray&, const valarray&);
-T   template valarray atan2(const valarray&, const T&);
-T   template valarray atan2(const T&, const valarray&);
-T   template valarray cos  (const valarray&);
-T   template valarray cosh (const valarray&);
-T   template valarray exp  (const valarray&);
-T   template valarray log  (const valarray&);
-T   template valarray log10(const valarray&);
-T   template valarray pow(const valarray&, const valarray&);
-T   template valarray pow(const valarray&, const T&);
-T   template valarray pow(const T&, const valarray&);
-T   template valarray sin  (const valarray&);
-T   template valarray sinh (const valarray&);
-T   template valarray sqrt (const valarray&);
-T   template valarray tan  (const valarray&);
-T   template valarray tanh (const valarray&);
-   }
-
-
-   26.3.2  Template class valarray                [lib.template.valarray]
-
-T   template class valarray {
-    public:
-T     typedef T value_type;
-
-      // _lib.valarray.cons_ construct/destroy:
-T     valarray();
-T     explicit valarray(size_t);
-T     valarray(const T&, size_t);
-T     valarray(const T*, size_t);
-T     valarray(const valarray&);
-T     valarray(const slice_array&);
-T     valarray(const gslice_array&);
-T     valarray(const mask_array&);
-T     valarray(const indirect_array&);
-T    ~valarray();
-
-      // _lib.valarray.assign_ assignment:
-T     valarray& operator=(const valarray&);
-T     valarray& operator=(const T&);
-T     valarray& operator=(const slice_array&);
-T     valarray& operator=(const gslice_array&);
-T     valarray& operator=(const mask_array&);
-T     valarray& operator=(const indirect_array&);
-      // _lib.valarray.access_ element access:
-T     T                 operator[](size_t) const;
-T     T&                operator[](size_t);
-      // _lib.valarray.sub_ subset operations:
-T     valarray       operator[](slice) const;
-T     slice_array    operator[](slice);
-T     valarray       operator[](const gslice&) const;
-T     gslice_array   operator[](const gslice&);
-T     valarray       operator[](const valarray&) const;
-T     mask_array     operator[](const valarray&);
-T     valarray       operator[](const valarray&) const;
-T     indirect_array operator[](const valarray&);
-      // _lib.valarray.unary_ unary operators:
-T     valarray operator+() const;
-T     valarray operator-() const;
-T     valarray operator~() const;
-T     valarray operator!() const;
-      // _lib.valarray.cassign_ computed assignment:
-T     valarray& operator*= (const T&);
-T     valarray& operator/= (const T&);
-T     valarray& operator%= (const T&);
-T     valarray& operator+= (const T&);
-T     valarray& operator-= (const T&);
-T     valarray& operator^= (const T&);
-T     valarray& operator&= (const T&);
-T     valarray& operator|= (const T&);
-T     valarray& operator<<=(const T&);
-T     valarray& operator>>=(const T&);
-T     valarray& operator*= (const valarray&);
-T     valarray& operator/= (const valarray&);
-T     valarray& operator%= (const valarray&);
-T     valarray& operator+= (const valarray&);
-T     valarray& operator-= (const valarray&);
-T     valarray& operator^= (const valarray&);
-T     valarray& operator|= (const valarray&);
-T     valarray& operator&= (const valarray&);
-T     valarray& operator<<=(const valarray&);
-T     valarray& operator>>=(const valarray&);
-      // _lib.valarray.members_ member functions:
-T     size_t size() const;
-T     T    sum() const;
-T     T    min() const;
-T     T    max() const;
-
-T     valarray shift (int) const;
-T     valarray cshift(int) const;
-T     valarray apply(T func(T)) const;
-T     valarray apply(T func(const T&)) const;
-T     void resize(size_t sz, T c = T());
-    };
-   }
-
-
-
-   26.3.4  Class slice                                  [lib.class.slice]
-
-T   class slice {
-    public:
-T     slice();
-T     slice(size_t, size_t, size_t);
-
-T     size_t start() const;
-T     size_t size() const;
-T     size_t stride() const;
-    };
-   }
-
-
-
-   26.3.5  Template class slice_array          [lib.template.slice.array]
-
-T   template  class slice_array {
-    public:
-T     typedef T value_type;
-
-T     void operator=  (const valarray&) const;
-T     void operator*= (const valarray&) const;
-T     void operator/= (const valarray&) const;
-T     void operator%= (const valarray&) const;
-T     void operator+= (const valarray&) const;
-T     void operator-= (const valarray&) const;
-T     void operator^= (const valarray&) const;
-T     void operator&= (const valarray&) const;
-T     void operator|= (const valarray&) const;
-T     void operator<<=(const valarray&) const;
-T     void operator>>=(const valarray&) const;
-T     void operator=(const T&);
-T    ~slice_array();
-    private:
-T     slice_array();
-T     slice_array(const slice_array&);
-T     slice_array& operator=(const slice_array&);
-    };
-   }
-
-
-
-   26.3.6  The gslice class                            [lib.class.gslice]
-
-T   class gslice {
-    public:
-T     gslice();
-T     gslice(size_t s, const valarray& l, const valarray& d);
-
-T     size_t           start() const;
-T     valarray size() const;
-T     valarray stride() const;
-    };
-
-
-   26.3.7  Template class gslice_array        [lib.template.gslice.array]
-
-T   template  class gslice_array {
-    public:
-T     typedef T value_type;
-
-T     void operator=  (const valarray&) const;
-T     void operator*= (const valarray&) const;
-T     void operator/= (const valarray&) const;
-T     void operator%= (const valarray&) const;
-T     void operator+= (const valarray&) const;
-T     void operator-= (const valarray&) const;
-T     void operator^= (const valarray&) const;
-T     void operator&= (const valarray&) const;
-T     void operator|= (const valarray&) const;
-T     void operator<<=(const valarray&) const;
-T     void operator>>=(const valarray&) const;
-T     void operator=(const T&);
-T    ~gslice_array();
-    private:
-T     gslice_array();
-T     gslice_array(const gslice_array&);
-T     gslice_array& operator=(const gslice_array&);
-    };
-
-
-   26.3.8  Template class mask_array            [lib.template.mask.array]
-
-T   template  class mask_array {
-    public:
-T     typedef T value_type;
-
-T     void operator=  (const valarray&) const;
-T     void operator*= (const valarray&) const;
-T     void operator/= (const valarray&) const;
-T     void operator%= (const valarray&) const;
-T     void operator+= (const valarray&) const;
-T     void operator-= (const valarray&) const;
-T     void operator^= (const valarray&) const;
-T     void operator&= (const valarray&) const;
-T     void operator|= (const valarray&) const;
-T     void operator<<=(const valarray&) const;
-T     void operator>>=(const valarray&) const;
-T     void operator=(const T&);
-T    ~mask_array();
-    private:
-T     mask_array();
-T     mask_array(const mask_array&);
-T     mask_array& operator=(const mask_array&);
-      //  remainder implementation defined
-    };
-
-
-   26.3.9  Template class                   [lib.template.indirect.array]
-       indirect_array
-
-T   template  class indirect_array {
-    public:
-T     typedef T value_type;
-
-T     void operator=  (const valarray&) const;
-T     void operator*= (const valarray&) const;
-T     void operator/= (const valarray&) const;
-T     void operator%= (const valarray&) const;
-T     void operator+= (const valarray&) const;
-T     void operator-= (const valarray&) const;
-T     void operator^= (const valarray&) const;
-T     void operator&= (const valarray&) const;
-T     void operator|= (const valarray&) const;
-T     void operator<<=(const valarray&) const;
-T     void operator>>=(const valarray&) const;
-T     void operator=(const T&);
-T    ~indirect_array();
-    private:
-T     indirect_array();
-T     indirect_array(const indirect_array&);
-T     indirect_array& operator=(const indirect_array&);
-      //  remainder implementation defined
-    };
-
-   26.4  Generalized numeric operations                 [lib.numeric.ops]
-
-   Header  synopsis
-
-T   template 
-      T accumulate(InputIterator first, InputIterator last, T init);
-
-T   template 
-      T accumulate(InputIterator first, InputIterator last, T init,
-                   BinaryOperation binary_op);
-
-T   template 
-      T inner_product(InputIterator1 first1, InputIterator1 last1,
-                      InputIterator2 first2, T init);
-
-T   template 
-      T inner_product(InputIterator1 first1, InputIterator1 last1,
-                      InputIterator2 first2, T init,
-                      BinaryOperation1 binary_op1,
-                      BinaryOperation2 binary_op2);
-
-T   template 
-      OutputIterator partial_sum(InputIterator first,
-                                 InputIterator last,
-                                 OutputIterator result);
-
-T   template 
-      OutputIterator partial_sum(InputIterator first,
-                                 InputIterator last,
-                                 OutputIterator result,
-                                 BinaryOperation binary_op);
-
-T   template 
-      OutputIterator adjacent_difference(InputIterator first,
-                                         InputIterator last,
-                                         OutputIterator result);
-
-T   template 
-      OutputIterator adjacent_difference(InputIterator first,
-                                         InputIterator last,
-                                         OutputIterator result,
-                                         BinaryOperation binary_op);
-
-
-   26.5  C Library                                           [lib.c.math]
-
-                     Table 2--Header  synopsis
-X               Macro:   HUGE_VAL
-                Functions:
-X               acos     cos        fmod    modf   tan
-X               asin     cosh       frexp   pow    tanh
-X               atan     exp        ldexp   sin
-X               atan2    fabs       log     sinh
-X               ceil     floor      log10   sqrt
-
-                    Table 3--Header  synopsis
-X                     Macros:   RAND_MAX
-X                     Types:    div_t      ldiv_t
-                      Functions:
-X                     abs       labs       srand
-X                     div       ldiv       rand
-
-X  long   abs(long);               // labs()
-X  ldiv_t div(long, long);         // ldiv()
-
-X  float abs  (float);
-X  float acos (float);
-X  float asin (float);
-X  float atan (float);
-X  float atan2(float, float);
-X  float ceil (float);
-X  float cos  (float);
-X  float cosh (float);
-X  float exp  (float);
-X  float fabs (float);
-X  float floor(float);
-X  float fmod (float, float);
-X  float frexp(float, int*);
-X  float ldexp(float, int);
-X  float log  (float);
-X  float log10(float);
-X  float modf (float, float*);
-X  float pow  (float, float);
-X  float pow  (float, int);
-X  float sin  (float);
-X  float sinh (float);
-X  float sqrt (float);
-X  float tan  (float);
-X  float tanh (float);
-
-X  double abs(double);            // fabs()
-X  double pow(double, int);
-
-X  long double abs  (long double);
-X  long double acos (long double);
-X  long double asin (long double);
-X  long double atan (long double);
-X  long double atan2(long double, long double);
-X  long double ceil (long double);
-X  long double cos  (long double);
-X  long double cosh (long double);
-X  long double exp  (long double);
-X  long double fabs (long double);
-X  long double floor(long double);
-X  long double fmod (long double, long double);
-X  long double frexp(long double, int*);
-X  long double ldexp(long double, int);
-X  long double log  (long double);
-X  long double log10(long double);
-X  long double modf (long double, long double*);
-X  long double pow  (long double, long double);
-X  long double pow  (long double, int);
-X  long double sin  (long double);
-X  long double sinh (long double);
-X  long double sqrt (long double);
-X  long double tan  (long double);
-X  long double tanh (long double);
-
-   Header  synopsis
-
-X   template class char_traits;
-X   template<> class char_traits;
-X   template<> class char_traits;
-X   template class allocator;
-X   template  >
-      class basic_ios;
-
-X   template  >
-      class basic_streambuf;
-
-X   template  >
-      class basic_istream;
-
-X   template  >
-      class basic_ostream;
-
-X   template  >
-      class basic_iostream;
-
-X   template ,
-              class Allocator = allocator >
-      class basic_stringbuf;
-
-X   template ,
-              class Allocator = allocator >
-      class basic_istringstream;
-
-X   template ,
-              class Allocator = allocator >
-      class basic_ostringstream;
-
-X   template ,
-              class Allocator = allocator >
-      class basic_stringstream;
-
-X   template  >
-      class basic_filebuf;
-
-X   template  >
-      class basic_ifstream;
-
-X   template  >
-      class basic_ofstream;
-
-X   template  >
-      class basic_fstream;
-X   template  >
-      class istreambuf_iterator;
-
-X   template  >
-      class ostreambuf_iterator;
-X   typedef basic_ios       ios;
-X   typedef basic_ios    wios;
-X   typedef basic_streambuf streambuf;
-X   typedef basic_istream   istream;
-X   typedef basic_ostream   ostream;
-X   typedef basic_iostream  iostream;
-X   typedef basic_stringbuf     stringbuf;
-X   typedef basic_istringstream istringstream;
-X   typedef basic_ostringstream ostringstream;
-X   typedef basic_stringstream  stringstream;
-X   typedef basic_filebuf  filebuf;
-X   typedef basic_ifstream ifstream;
-X   typedef basic_ofstream ofstream;
-X   typedef basic_fstream  fstream;
-X   typedef basic_streambuf wstreambuf;
-X   typedef basic_istream   wistream;
-X   typedef basic_ostream   wostream;
-X   typedef basic_iostream  wiostream;
-X   typedef basic_stringbuf     wstringbuf;
-X   typedef basic_istringstream wistringstream;
-X   typedef basic_ostringstream wostringstream;
-X   typedef basic_stringstream  wstringstream;
-
-X   typedef basic_filebuf  wfilebuf;
-X   typedef basic_ifstream wifstream;
-X   typedef basic_ofstream wofstream;
-X   typedef basic_fstream  wfstream;
-X   template  class fpos;
-X   typedef fpos::state_type>    streampos;
-X   typedef fpos::state_type> wstreampos;
-
-   27.3  Standard iostream objects                 [lib.iostream.objects]
-
-   Header  synopsis
-
-T  [must also include  and ]
-T   extern istream cin;
-T   extern ostream cout;
-T   extern ostream cerr;
-T   extern ostream clog;
-
-T   extern wistream wcin;
-T   extern wostream wcout;
-T   extern wostream wcerr;
-T   extern wostream wclog;
-
-   27.4  Iostreams base classes                      [lib.iostreams.base]
-
-   Header  synopsis
-
-   #include 
-
-T   typedef OFF_T  streamoff;
-T   typedef SZ_T streamsize;
-T   template  class fpos;
-
-    class ios_base;
-    template  >
-      class basic_ios;
-   // _lib.std.ios.manip_, manipulators:
-T   ios_base& boolalpha  (ios_base& str);
-T   ios_base& noboolalpha(ios_base& str);
-T   ios_base& showbase   (ios_base& str);
-T   ios_base& noshowbase (ios_base& str);
-T   ios_base& showpoint  (ios_base& str);
-T   ios_base& noshowpoint(ios_base& str);
-T   ios_base& showpos    (ios_base& str);
-T   ios_base& noshowpos  (ios_base& str);
-T   ios_base& skipws     (ios_base& str);
-T   ios_base& noskipws   (ios_base& str);
-T   ios_base& nouppercase(ios_base& str);
-T   ios_base& uppercase  (ios_base& str);
-M   ios_base& unitbuf    (ios_base& str);
-M   ios_base& nounitbuf  (ios_base& str);
-   // _lib.adjustfield.manip_ adjustfield:
-T   ios_base& internal   (ios_base& str);
-T   ios_base& left       (ios_base& str);
-T   ios_base& right      (ios_base& str);
-   // _lib.basefield.manip_ basefield:
-T   ios_base& dec        (ios_base& str);
-T   ios_base& hex        (ios_base& str);
-T   ios_base& oct        (ios_base& str);
-
-   // _lib.floatfield.manip_ floatfield:
-T   ios_base& fixed      (ios_base& str);
-T   ios_base& scientific (ios_base& str);
-
-
-   27.4.2  Class ios_base                                  [lib.ios.base]
-
-T   class ios_base {
-    public:
-      class failure;
-T     typedef T1 fmtflags;
-T     static const fmtflags boolalpha;
-T     static const fmtflags dec;
-T     static const fmtflags fixed;
-T     static const fmtflags hex;
-T     static const fmtflags internal;
-T     static const fmtflags left;
-T     static const fmtflags oct;
-T     static const fmtflags right;
-T     static const fmtflags scientific;
-T     static const fmtflags showbase;
-T     static const fmtflags showpoint;
-T     static const fmtflags showpos;
-T     static const fmtflags skipws;
-X     static const fmtflags unitbuf;
-T     static const fmtflags uppercase;
-T     static const fmtflags adjustfield;
-T     static const fmtflags basefield;
-T     static const fmtflags floatfield;
-
-      typedef T2 iostate;
-T     static const iostate badbit;
-T     static const iostate eofbit;
-T     static const iostate failbit;
-T     static const iostate goodbit;
-T     typedef T3 openmode;
-T     static const openmode app;
-T     static const openmode ate;
-T     static const openmode binary;
-T     static const openmode in;
-T     static const openmode out;
-T     static const openmode trunc;
-T     typedef T4 seekdir;
-T     static const seekdir beg;
-T     static const seekdir cur;
-T     static const seekdir end;
-T     class Init;
-      // _lib.fmtflags.state_ fmtflags state:
-T     fmtflags flags() const;
-T     fmtflags flags(fmtflags fmtfl);
-T     fmtflags setf(fmtflags fmtfl);
-T     fmtflags setf(fmtflags fmtfl, fmtflags mask);
-T     void unsetf(fmtflags mask);
-T     streamsize precision() const;
-T     streamsize precision(streamsize prec);
-T     streamsize width() const;
-T     streamsize width(streamsize wide);
-      // _lib.ios.base.locales_ locales:
-T     locale imbue(const locale& loc);
-T     locale getloc() const;
-      // _lib.ios.base.storage_ storage:
-T     static int xalloc();
-T     long&  iword(int index);
-T     void*& pword(int index);
-      // destructor
-T     virtual ~ios_base();
-      // _lib.ios.base.callback_ callbacks;
-T     enum event { erase_event, imbue_event, copyfmt_event };
-T     typedef void (*event_callback)(event, ios_base&, int index);
-T     void register_callback(event_call_back fn, int index);
-T     static bool sync_with_stdio(bool sync = true);
-    protected:
-T     ios_base();
-    };
-
-   27.4.2.1.1  Class ios_base::failure                 [lib.ios::failure]
-
-T   class ios_base::failure : public exception {
-    public:
-T     explicit failure(const string& msg);
-T     virtual ~failure();
-T     virtual const char* what() const throw();
-    };
-
-
-   27.4.2.1.6  Class ios_base::Init                       [lib.ios::Init]
-
-T   class ios_base::Init {
-    public:
-T     Init();
-T    ~Init();
-    };
-
-
-   27.4.3  Template class fpos                                 [lib.fpos]
-
-X   template  class fpos {
-    public:
-      // _lib.fpos.members_ Members
-T     stateT state() const;
-T     void state(stateT);
-    private;
-T     stateT st; // exposition only
-    };
-
-
-   27.4.5  Template class basic_ios                             [lib.ios]
-
-    template  >
-X   class basic_ios : public ios_base {
-    public:
-
-      // Types:
-T     typedef charT                     char_type;
-T     typedef typename traits::int_type int_type;
-T     typedef typename traits::pos_type pos_type;
-T     typedef typename traits::off_type off_type;
-T     typedef traits                    traits_type;
-T     operator void*() const
-T     bool operator!() const
-T     iostate rdstate() const;
-T     void clear(iostate state = goodbit);
-T     void setstate(iostate state);
-T     bool good() const;
-T     bool eof()  const;
-T     bool fail() const;
-T     bool bad()  const;
-T     iostate exceptions() const;
-T     void exceptions(iostate except);
-      // _lib.basic.ios.cons_ Constructor/destructor:
-T     explicit basic_ios(basic_streambuf* sb);
-T     virtual ~basic_ios();
-      // _lib.basic.ios.members_ Members:
-T     basic_ostream* tie() const;
-T     basic_ostream* tie(basic_ostream* tiestr);
-T     basic_streambuf* rdbuf() const;
-T     basic_streambuf* rdbuf(basic_streambuf* sb);
-X     basic_ios& copyfmt(const basic_ios& rhs);
-T     char_type fill() const;
-T     char_type fill(char_type ch);
-      // _lib.ios.base.locales_ locales:
-T     locale imbue(const locale& loc);
-X     char     narrow(char_type c, char dfault) const;
-X     char_type widen(char c) const;
-    protected:
-      basic_ios();
-T     void init(basic_streambuf* sb);
-   private:
-T     basic_ios(const basic_ios& );       // not defined
-T     basic_ios& operator=(const basic_ios&);     // not defined
-    };
-
-
-   27.5  Stream buffers                              [lib.stream.buffers]
-
-   Header  synopsis
-
-X   template  >
-      class basic_streambuf;
-T   typedef basic_streambuf     streambuf;
-T   typedef basic_streambuf wstreambuf;
-
-   27.5.2  Template class                                 [lib.streambuf]
-       basic_streambuf
-
-    template  >
-X   class basic_streambuf {
-    public:
-
-      // Types:
-T     typedef charT                     char_type;
-T     typedef typename traits::int_type int_type;
-T     typedef typename traits::pos_type pos_type;
-T     typedef typename traits::off_type off_type;
-T     typedef traits                    traits_type;
-T     virtual ~basic_streambuf();
-      // _lib.streambuf.locales_ locales:
-T     locale   pubimbue(const locale &loc);
-T     locale   getloc() const;
-      // _lib.streambuf.buffer_ buffer and positioning:
-T     basic_streambuf*
-               pubsetbuf(char_type* s, streamsize n);
-T     pos_type pubseekoff(off_type off, ios_base::seekdir way,
-                          ios_base::openmode which =
-                              ios_base::in | ios_base::out);
-T     pos_type pubseekpos(pos_type sp,
-                          ios_base::openmode which =
-                              ios_base::in | ios_base::out);
-T     int      pubsync();
-
-      // Get and put areas:
-      // _lib.streambuf.pub.get_ Get area:
-T     streamsize in_avail();
-T     int_type snextc();
-T     int_type sbumpc();
-T     int_type sgetc();
-T     streamsize sgetn(char_type* s, streamsize n);
-      // _lib.streambuf.pub.pback_ Putback:
-X     int_type sputbackc(char_type c);
-X     int_type sungetc();
-      // _lib.streambuf.pub.put_ Put area:
-T     int_type   sputc(char_type c);
-X     streamsize sputn(const char_type* s, streamsize n);
-    protected:
-T     basic_streambuf();
-      // _lib.streambuf.get.area_ Get area:
-T     char_type* eback() const;
-T     char_type* gptr()  const;
-T     char_type* egptr() const;
-T     void       gbump(int n);
-T     void       setg(char_type* gbeg, char_type* gnext, char_type* gend);
-      // _lib.streambuf.put.area_ Put area:
-T     char_type* pbase() const;
-T     char_type* pptr() const;
-T     char_type* epptr() const;
-T     void       pbump(int n);
-T     void       setp(char_type* pbeg, char_type* pend);
-      // _lib.streambuf.virtuals_ virtual functions:
-      // _lib.streambuf.virt.locales_ Locales:
-T     virtual void imbue(const locale &loc);
-      // _lib.streambuf.virt.buffer_ Buffer management and positioning:
-T     virtual basic_streambuf*
-                       setbuf(char_type* s, streamsize n);
-T     virtual pos_type seekoff(off_type off, ios_base::seekdir way,
-                ios_base::openmode which = ios_base::in | ios_base::out);
-T     virtual pos_type seekpos(pos_type sp,
-                ios_base::openmode which = ios_base::in | ios_base::out);
-T     virtual int      sync();
-      // _lib.streambuf.virt.get_ Get area:
-T     virtual int        showmanyc();
-T     virtual streamsize xsgetn(char_type* s, streamsize n);
-T     virtual int_type   underflow();
-T     virtual int_type   uflow();
-      // _lib.streambuf.virt.pback_ Putback:
-T     virtual int_type   pbackfail(int_type c = traits::eof());
-      // _lib.streambuf.virt.put_ Put area:
-X     virtual streamsize xsputn(const char_type* s, streamsize n);
-T     virtual int_type   overflow (int_type c = traits::eof());
-    };
-
-   27.6  Formatting and manipulators                [lib.iostream.format]
-
-   Header  synopsis
-
-T   template  >
-      class basic_istream;
-T   typedef basic_istream     istream;
-T   typedef basic_istream wistream;
-
-T   template  >
-      class basic_iostream;
-T   typedef basic_iostream    iostream;
-T   typedef basic_iostream wiostream;
-
-X   template 
-      basic_istream& ws(basic_istream& is);
-
-   Header  synopsis
-
-X   template  >
-      class basic_ostream;
-T   typedef basic_ostream     ostream;
-T   typedef basic_ostream wostream;
-
-T   template 
-      basic_ostream& endl(basic_ostream& os);
-T   template 
-      basic_ostream& ends(basic_ostream& os);
-T   template 
-      basic_ostream& flush(basic_ostream& os);
-
-   Header  synopsis
-
-      // Types T1, T2, ... are unspecified implementation types
-T     T1 resetiosflags(ios_base::fmtflags mask);
-T     T2 setiosflags  (ios_base::fmtflags mask);
-T     T3 setbase(int base);
-T     template T4 setfill(charT c);
-T     T5 setprecision(int n);
-T     T6 setw(int n);
-
-
-   27.6.1.1  Template class basic_istream                   [lib.istream]
-
-    template  >
-T   class basic_istream : virtual public basic_ios {
-    public:
-    // Types (inherited from basic_ios (_lib.ios_)):
-T     typedef charT                     char_type;
-T     typedef typename traits::int_type int_type;
-T     typedef typename traits::pos_type pos_type;
-T     typedef typename traits::off_type off_type;
-T     typedef traits                    traits_type;
-      // _lib.istream.cons_ Constructor/destructor:
-T     explicit basic_istream(basic_streambuf* sb);
-T     virtual ~basic_istream();
-      // _lib.istream::sentry_ Prefix/suffix:
-T     class sentry;
-
-      // _lib.istream.formatted_ Formatted input:
-T     basic_istream& operator>>
-          (basic_istream& (*pf)(basic_istream&))
-T     basic_istream& operator>>
-          (basic_ios& (*pf)(basic_ios&))
-T     basic_istream& operator>>
-          (ios_base& (*pf)(ios_base&))
-S     basic_istream& operator>>(bool& n);
-S     basic_istream& operator>>(short& n);
-S     basic_istream& operator>>(unsigned short& n);
-S     basic_istream& operator>>(int& n);
-S     basic_istream& operator>>(unsigned int& n);
-S     basic_istream& operator>>(long& n);
-S     basic_istream& operator>>(unsigned long& n);
-S     basic_istream& operator>>(float& f);
-S     basic_istream& operator>>(double& f);
-S     basic_istream& operator>>(long double& f);
-S     basic_istream& operator>>(void*& p);
-S     basic_istream& operator>>
-          (basic_streambuf* sb);
-      // _lib.istream.unformatted_ Unformatted input:
-T     streamsize gcount() const;
-S     int_type get();
-S     basic_istream& get(char_type& c);
-S     basic_istream& get(char_type* s, streamsize n);
-S     basic_istream& get(char_type* s, streamsize n,
-                        char_type delim);
-S     basic_istream& get(basic_streambuf& sb);
-S     basic_istream& get(basic_streambuf& sb,
-                        char_type delim);
-S     basic_istream& getline(char_type* s, streamsize n);
-S     basic_istream& getline(char_type* s, streamsize n,
-                        char_type delim);
-S     basic_istream& ignore
-          (streamsize n = 1, int_type delim = traits::eof());
-S     int_type                     peek();
-S     basic_istream& read    (char_type* s, streamsize n);
-S     streamsize                   readsome(char_type* s, streamsize n);
-S     basic_istream& putback(char_type c);
-S     basic_istream& unget();
-S     int sync();
-
-S     pos_type tellg();
-S     basic_istream& seekg(pos_type);
-S     basic_istream& seekg(off_type, ios_base::seekdir);
-    };
-
-    // _lib.istream::extractors_ character extraction templates:
-S   template
-      basic_istream& operator>>(basic_istream&,
-                                              charT&);
-S   template
-      basic_istream& operator>>(basic_istream&,
-                                             unsigned char&);
-S   template
-      basic_istream& operator>>(basic_istream&,
-                                             signed char&);
-
-S   template
-      basic_istream& operator>>(basic_istream&,
-                                              charT*);
-S   template
-      basic_istream& operator>>(basic_istream&,
-                                             unsigned char*);
-S   template
-      basic_istream& operator>>(basic_istream&,
-                                             signed char*);
-
-   27.6.1.1.2  Class basic_istream::sentry          [lib.istream::sentry]
-
-
-    template  >
-S   class basic_istream::sentry {
-      typedef traits traits_type;
-S     bool ok_; // exposition only
-     public:
-S     explicit sentry(basic_istream& is, bool noskipws = false);
-S     ~sentry();
-S     operator bool() const { return ok_; }
-     private:
-T     sentry(const sentry&); //   not defined
-T     sentry& operator=(const sentry&); //   not defined
-    };
-
-
-   27.6.1.5  Template class basic_iostream            [lib.iostreamclass]
-
-    template  >
-T   class basic_iostream :
-      public basic_istream,
-      public basic_ostream {
-    public:
-      // constructor/destructor
-T     explicit basic_iostream(basic_streambuf* sb);
-T     virtual ~basic_iostream();
-    };
-
-
-   27.6.2.1  Template class basic_ostream                   [lib.ostream]
-
-    template  >
-X   class basic_ostream : virtual public basic_ios {
-    public:
-    // Types (inherited from basic_ios (_lib.ios_)):
-T     typedef charT                     char_type;
-T     typedef typename traits::int_type int_type;
-T     typedef typename traits::pos_type pos_type;
-T     typedef typename traits::off_type off_type;
-T     typedef traits                    traits_type;
-      // _lib.ostream.cons_ Constructor/destructor:
-T     explicit basic_ostream(basic_streambuf* sb);
-T     virtual ~basic_ostream();
-      // _lib.ostream::sentry_ Prefix/suffix:
-T     class sentry;
-      // _lib.ostream.formatted_ Formatted output:
-T     basic_ostream& operator<<
-          (basic_ostream& (*pf)(basic_ostream&));
-T     basic_ostream& operator<<
-          (basic_ios& (*pf)(basic_ios&));
-T     basic_ostream& operator<<
-          (ios_base& (*pf)(ios_base&));
-T     basic_ostream& operator<<(bool n);
-T     basic_ostream& operator<<(short n);
-T     basic_ostream& operator<<(unsigned short n);
-T     basic_ostream& operator<<(int n);
-T     basic_ostream& operator<<(unsigned int n);
-T     basic_ostream& operator<<(long n);
-T     basic_ostream& operator<<(unsigned long n);
-S     basic_ostream& operator<<(float f);
-S     basic_ostream& operator<<(double f);
-S     basic_ostream& operator<<(long double f);
-T     basic_ostream& operator<<(const void* p);
-X     basic_ostream& operator<<
-          (basic_streambuf* sb);
-      // _lib.ostream.unformatted_ Unformatted output:
-T     basic_ostream& put(char_type c);
-T     basic_ostream& write(const char_type* s, streamsize n);
-X     basic_ostream& flush();
-
-      // _lib.ostream.seeks_ seeks:
-S     pos_type tellp();
-S     basic_ostream& seekp(pos_type);
-S     basic_ostream& seekp(off_type, ios_base::seekdir);
-    };
-    // _lib.ostream.inserters.character_ character inserters
-X   template
-    basic_ostream& operator<<(basic_ostream&,
-                                            charT);
-X   template
-    basic_ostream& operator<<(basic_ostream&,
-                                            char);
-    // specialization
-X   template
-      basic_ostream& operator<<(basic_ostream&,
-                                             char);
-    // signed and unsigned
-X   template
-      basic_ostream& operator<<(basic_ostream&,
-                                             signed char);
-X   template
-      basic_ostream& operator<<(basic_ostream&,
-                                             unsigned char)
-X   template
-      basic_ostream& operator<<(basic_ostream&,
-                                              const charT*);
-X   template
-      basic_ostream& operator<<(basic_ostream&,
-                                              const char*);
-    // partial specializationss
-X   template
-      basic_ostream& operator<<(basic_ostream&,
-                                             const char*);
-    //  signed and unsigned
-X   template
-      basic_ostream& operator<<(basic_ostream&,
-                                             const signed char*);
-X   template
-      basic_ostream& operator<<(basic_ostream&,
-                                             const unsigned char*);
-
-
-   27.6.2.3  Class basic_ostream::sentry            [lib.ostream::sentry]
-
-    template  >
-X   class basic_ostream::sentry {
-      bool ok_; // exposition only
-     public:
-X     explicit sentry(basic_ostream& os);
-X     ~sentry();
-X     operator bool() const { return ok_; }
-     private
-X     sentry(const sentry&); //   not defined
-X     sentry& operator=(const sentry&); //   not defined
-    };
-
-   27.7  String-based streams                        [lib.string.streams]
-
-   Header  synopsis
-
-X   template ,
-                      class Allocator = allocator >
-      class basic_stringbuf;
-
-T   typedef basic_stringbuf     stringbuf;
-T   typedef basic_stringbuf wstringbuf;
-
-    template ,
-                      class Allocator = allocator >
-X     class basic_istringstream;
-
-T   typedef basic_istringstream     istringstream;
-T   typedef basic_istringstream wistringstream;
-
-    template ,
-                      class Allocator = allocator >
-X     class basic_ostringstream;
-T   typedef basic_ostringstream     ostringstream;
-T   typedef basic_ostringstream wostringstream;
-
-    template ,
-                      class Allocator = allocator >
-X     class basic_stringstream;
-T   typedef basic_stringstream     stringstream;
-T   typedef basic_stringstream wstringstream;
-
-   27.7.1  Template class basic_stringbuf                 [lib.stringbuf]
-
-    template ,
-              class Allocator = allocator >
-X   class basic_stringbuf : public basic_streambuf {
-    public:
-T     typedef charT                     char_type;
-T     typedef typename traits::int_type int_type;
-T     typedef typename traits::pos_type pos_type;
-T     typedef typename traits::off_type off_type;
-T     typedef traits                    traits_type;
-      // _lib.stringbuf.cons_ Constructors:
-S     explicit basic_stringbuf(ios_base::openmode which
-                                = ios_base::in | ios_base::out);
-S     explicit basic_stringbuf
-          (const basic_string& str,
-           ios_base::openmode which = ios_base::in | ios_base::out);
-      // _lib.stringbuf.members_ Get and set:
-S     basic_string str() const;
-S     void               str(const basic_string& s);
-
-    protected:
-      // _lib.stringbuf.virtuals_ Overridden virtual functions:
-S     virtual int_type   underflow();
-S     virtual int_type   pbackfail(int_type c = traits::eof());
-S     virtual int_type   overflow (int_type c = traits::eof());
-S     virtual  basic_streambuf* setbuf(charT*, streamsize);
-
-S     virtual pos_type   seekoff(off_type off, ios_base::seekdir way,
-                                 ios_base::openmode which
-                                  = ios_base::in | ios_base::out);
-S     virtual pos_type   seekpos(pos_type sp,
-                                 ios_base::openmode which
-                                  = ios_base::in | ios_base::out);
-    };
-
-
-   27.7.2  Template class basic_istringstream         [lib.istringstream]
-
-    template ,
-              class Allocator = allocator >
-X   class basic_istringstream : public basic_istream {
-    public:
-T     typedef charT                     char_type;
-T     typedef typename traits::int_type int_type;
-T     typedef typename traits::pos_type pos_type;
-T     typedef typename traits::off_type off_type;
-T     typedef traits                    traits_type;
-      // _lib.istringstream.cons_ Constructors:
-S     explicit basic_istringstream(ios_base::openmode which = ios_base::in);
-S     explicit basic_istringstream(
-                         const basic_string& str,
-                         ios_base::openmode which = ios_base::in);
-
-      // _lib.istringstream.members_ Members:
-S     basic_stringbuf* rdbuf() const;
-S     basic_string str() const;
-S     void str(const basic_string& s);
-   private:
-   //  basic_stringbuf sb;   exposition only
-    };
-
-   27.7.3  Class basic_ostringstream                  [lib.ostringstream]
-
-    template ,
-              class Allocator = allocator >
-X   class basic_ostringstream : public basic_ostream {
-    public:
-
-      // Types:
-T     typedef charT            char_type;
-T     typedef typename traits::int_type int_type;
-T     typedef typename traits::pos_type pos_type;
-T     typedef typename traits::off_type off_type;
-      // _lib.ostringstream.cons_ Constructors/destructor:
-S     explicit basic_ostringstream(ios_base::openmode which = ios_base::out);
-S     explicit basic_ostringstream(
-                           const basic_string& str,
-                           ios_base::openmode which = ios_base::out);
-      // _lib.ostringstream.members_ Members:
-S     basic_stringbuf* rdbuf() const;
-S     basic_string str() const;
-S     void    str(const basic_string& s);
-    };
-
-
-   27.7.4  Template class basic_stringstream           [lib.stringstream]
-
-    template ,
-              class Allocator = allocator >
-X   class basic_stringstream
-      : public basic_iostream {
-    public:
-      // Types
-T     typedef charT                     char_type;
-T     typedef typename traits::int_type int_type;
-T     typedef typename traits::pos_type pos_type;
-T     typedef typename traits::off_type off_type;
-      // constructors/destructors
-S     explicit basic_stringstream(
-          ios_base::openmode which = ios_base::out|ios_base::in);
-S     explicit basic_stringstream(
-          const basic_string& str,
-          ios_base::openmode which = ios_base::out|ios_base::in);
-      // Members:
-S     basic_stringbuf* rdbuf() const;
-S     basic_string str() const;
-S     void str(const basic_string& str);
-    };
-
-
-
-   27.8.1  File streams                                    [lib.fstreams]
-
-
-   Header  synopsis
-
-X   template  >
-      class basic_filebuf;
-T   typedef basic_filebuf    filebuf;
-T   typedef basic_filebuf wfilebuf;
-
-X   template  >
-      class basic_ifstream;
-T   typedef basic_ifstream    ifstream;
-T   typedef basic_ifstream wifstream;
-
-X   template  >
-      class basic_ofstream;
-T   typedef basic_ofstream    ofstream;
-T   typedef basic_ofstream wofstream;
-
-X   template  >
-      class basic_fstream;
-T   typedef basic_fstream     fstream;
-T   typedef basic_fstream wfstream;
-
-   27.8.1.1  Template class basic_filebuf                   [lib.filebuf]
-
-    template  >
-X   class basic_filebuf : public basic_streambuf {
-    public:
-T     typedef charT                     char_type;
-T     typedef typename traits::int_type int_type;
-T     typedef typename traits::pos_type pos_type;
-T     typedef typename traits::off_type off_type;
-T     typedef traits                    traits_type;
-      // _lib.filebuf.cons_ Constructors/destructor:
-X     basic_filebuf();
-X     virtual ~basic_filebuf();
-       // _lib.filebuf.members_ Members:
-T     bool is_open() const;
-X     basic_filebuf* open
-          (const char* s, ios_base::openmode mode);
-X     basic_filebuf* close();
-    protected:
-      // _lib.filebuf.virtuals_ Overridden virtual functions:
-X     virtual streamsize showmanyc();
-X     virtual int_type underflow();
-X     virtual int_type uflow();
-X     virtual int_type pbackfail(int_type c = traits::eof());
-X     virtual int_type overflow (int_type c = traits::eof());
-S     virtual basic_streambuf*
-                       setbuf(char_type* s, streamsize n);
-S     virtual pos_type seekoff(off_type off, ios_base::seekdir way,
-                               ios_base::openmode which
-                                 = ios_base::in | ios_base::out);
-S     virtual pos_type seekpos(pos_type sp, ios_base::openmode which
-                                 = ios_base::in | ios_base::out);
-S     virtual int      sync();
-S     virtual void     imbue(const locale& loc);
-    };
-
-
-
-   27.8.1.5  Template class basic_ifstream                 [lib.ifstream]
-
-    template  >
-X   class basic_ifstream : public basic_istream {
-    public:
-T     typedef charT                     char_type;
-T     typedef typename traits::int_type int_type;
-T     typedef typename traits::pos_type pos_type;
-T     typedef typename traits::off_type off_type;
-T     typedef traits                    traits_type;
-      // _lib.ifstream.cons_ Constructors:
-S     basic_ifstream();
-S     explicit basic_ifstream(const char* s,
-                              ios_base::openmode mode = ios_base::in);
-      // _lib.ifstream.members_ Members:
-S     basic_filebuf* rdbuf() const;
-S     bool is_open();
-S     void open(const char* s, ios_base::openmode mode = ios_base::in);
-S     void close();
-    };
-
-
-   27.8.1.8  Template class basic_ofstream                 [lib.ofstream]
-
-    template  >
-X   class basic_ofstream : public basic_ostream {
-    public:
-T     typedef charT                     char_type;
-T     typedef typename traits::int_type int_type;
-T     typedef typename traits::pos_type pos_type;
-T     typedef typename traits::off_type off_type;
-T     typedef traits                    traits_type;
-      // _lib.ofstream.cons_ Constructors:
-X     basic_ofstream();
-X     explicit basic_ofstream(const char* s,
-                              ios_base::openmode mode
-                                = ios_base::out);
-      // _lib.ofstream.members_ Members:
-X     basic_filebuf* rdbuf() const;
-T     bool is_open();
-X     void open(const char* s, ios_base::openmode mode = ios_base::out);
-X     void close();
-    };
-
-
-   27.8.1.11  Template class basic_fstream                  [lib.fstream]
-
-    template  >
-X   class basic_fstream
-      : public basic_iostream {
-    public:
-T     typedef charT                     char_type;
-T     typedef typename traits::int_type int_type;
-T     typedef typename traits::pos_type pos_type;
-T     typedef typename traits::off_type off_type;
-T     typedef traits                    traits_type;
-      // constructors/destructor
-S     basic_fstream();
-S     explicit basic_fstream(
-          const char* s,
-          ios_base::openmode mode = ios_base::in|ios_base::out);
-
-      // Members:
-S     basic_filebuf* rdbuf() const;
-S     bool is_open();
-S     void open(
-          const char* s,
-          ios_base::openmode mode = ios_base::in|ios_base::out);
-S     void close();
-    };
-
-
-
-   27.8.2  C Library files                                  [lib.c.files]
-
-
-                    Table 13--Header  synopsis
-    Macros:
-X   BUFSIZ         L_tmpnam        SEEK_SET   TMP_MAX
-X   EOF            NULL    stderr     _IOFBF
-X   FILENAME_MAX   SEEK_CUR        stdin      _IOLBF
-X   FOPEN_MAX      SEEK_END        stdout     _IONBF
-
-X   Types:         FILE            fpos_t     size_t 
-    Functions:
-X   clearerr       fgets           fscanf     gets     rewind
-X   fclose         fopen           fseek      perror   scanf     tmpnam
-X   feof           fprintf         fsetpos    printf   setbuf    ungetc
-X   ferror         fputc           ftell      putc     setvbuf   vprintf
-X   fflush         fputs           fwrite     puts     sprintf   vfprintf
-X   fgetc          fread           getc       remove   sscanf    vsprintf
-X   fgetpos        freopen         getchar    putchar  rename    tmpfile
-
-
-
-
-   1.5  Standard C library headers                       [depr.c.headers]
-
-X                  
-                   
-                
-                  
-
-   1.6  Old iostreams members                          [depr.ios.members]
-
-   [Note: these should be #ifdef'd to permit diagnostics if used.]
-   namespace std {
-    class ios_base {
-    public:
-T     typedef T1  io_state;
-T     typedef T2 open_mode;
-T     typedef T3  seek_dir;
-T     typedef OFF_T  streamoff;
-T     typedef OFF_T  streampos;
-      // remainder unchanged
-    };
-   }
-
-   [Note: these should be #ifdef'd to permit diagnostics if used.]
-   namespace std {
-    template >
-    class basic_streambuf {
-    public:
-T     void stossc();
-      // remainder unchanged
-    };
-   }
-
-   8 An implementation may provide  the  following  member  functions  that
-   overload signatures specified in clause _lib.iostreams_:
-
-   [Note: the following overloads should be #ifdef'd to permit
-    diagnostics to be emitted, by default, if used.]
-
-    template class basic_ios {
-    public:
-M     void clear(io_state state);
-M     void setstate(io_state state);
-      // remainder unchanged
-    };
-    class ios_base {
-    public:
-M     void exceptions(io_state);
-      // remainder unchanged
-    };
-    template >
-    class basic_streambuf {
-    public:
-M     pos_type pubseekoff(off_type off, ios_base::seek_dir way,
-                ios_base::open_mode which = ios_base::in | ios_base::out);
-M     pos_type pubseekpos(pos_type sp,
-                ios_base::open_mode which = ios_base::in | ios_base::out);
-      // remainder unchanged
-    };
-    template  >
-    class basic_filebuf : public basic_streambuf {
-    public:
-M     basic_filebuf* open
-          (const char* s, ios_base::open_mode mode);
-      // remainder unchanged
-    };
-    template  >
-    class basic_ifstream : public basic_istream {
-    public:
-M     void open(const char* s, ios_base::open_mode mode = in);
-      // remainder unchanged
-    };
-    template  >
-    class basic_ofstream : public basic_ostream {
-    public:
-M     void open(const char* s, ios_base::open_mode mode = out | trunc);
-      // remainder unchanged
-    };
-   }
-
-
-
-   1.7.1  Class strstreambuf                          [depr.strstreambuf]
-
-   [Note: It should be possible to adopt these components with only
-    minor changes from the 2.8 version of the library.]
-
-M   class strstreambuf : public basic_streambuf {
-    public:
-M     explicit strstreambuf(streamsize alsize_arg = 0);
-M     strstreambuf(void* (*palloc_arg)(size_t), void (*pfree_arg)(void*));
-M     strstreambuf(char* gnext_arg, streamsize n, char* pbeg_arg = 0);
-M     strstreambuf(const char* gnext_arg, streamsize n);
-M     strstreambuf(signed char* gnext_arg, streamsize n,
-                   signed char* pbeg_arg = 0);
-M     strstreambuf(const signed char* gnext_arg, streamsize n);
-M     strstreambuf(unsigned char* gnext_arg, streamsize n,
-                   unsigned char* pbeg_arg = 0);
-M     strstreambuf(const unsigned char* gnext_arg, streamsize n);
-M     virtual ~strstreambuf();
-M     void  freeze(bool freezefl = true);
-M     char* str();
-M     int   pcount();
-    protected:
-M     virtual int_type overflow (int_type c = EOF);
-M     virtual int_type pbackfail(int_type c = EOF);
-M     virtual int_type underflow();
-M     virtual pos_type seekoff(off_type off, ios_base::seekdir way,
-                               ios_base::openmode which
-                                = ios_base::in | ios_base::out);
-M     virtual pos_type seekpos(pos_type sp, ios_base::openmode which
-                                = ios_base::in | ios_base::out);
-M     virtual streambuf* setbuf(char* s, streamsize n);
-   }
-
-   1.7.4  Class strstream                                [depr.strstream]
-
-M   class strstream
-      : public basic_iostream {
-    public:
-      // Types
-M     typedef char                                char_type;
-M     typedef typename char_traits::int_type int_type
-M     typedef typename char_traits::pos_type pos_type;
-M     typedef typename char_traits::off_type off_type;
-      // consturctors/destructor
-M     strstream();
-M     strstream(char* s, int n,
-                ios_base::openmode mode = ios_base::in|ios_base::out);
-M     virtual ~strstream();
-      // Members:
-M     strstreambuf* rdbuf() const;
-M     void freeze(bool freezefl = true);
-M     int pcount() const;
-M     char* str();
-    };
-
-
\ No newline at end of file diff --git a/libstdc++-v3/docs/html/17_intro/confdeps.dot b/libstdc++-v3/docs/html/17_intro/confdeps.dot deleted file mode 100644 index a62d28ce9dd..00000000000 --- a/libstdc++-v3/docs/html/17_intro/confdeps.dot +++ /dev/null @@ -1,14 +0,0 @@ -# Blatantly ripped out of the graphviz examples and modified. -pme -digraph v3conf { - size="6,6"; - node [color=lightblue2, style=filled]; - "aclocal.m4" -> "acinclude.m4"; - "configure" -> "aclocal.m4"; - "configure" -> "configure.ac"; - "configure" -> "crossconfig.m4"; - "configure" -> "linkage.m4"; - "[*/]Makefile.in" -> "Makefile.am"; - "[*/]Makefile.in" -> "configure.ac"; - "config.h.in" -> "acconfig.h"; - "config.h.in" -> "configure.ac"; -} diff --git a/libstdc++-v3/docs/html/17_intro/confdeps.png b/libstdc++-v3/docs/html/17_intro/confdeps.png deleted file mode 100644 index 5075aa869b1..00000000000 Binary files a/libstdc++-v3/docs/html/17_intro/confdeps.png and /dev/null differ diff --git a/libstdc++-v3/docs/html/17_intro/configury.html b/libstdc++-v3/docs/html/17_intro/configury.html deleted file mode 100644 index a35ccf23996..00000000000 --- a/libstdc++-v3/docs/html/17_intro/configury.html +++ /dev/null @@ -1,305 +0,0 @@ - - - - - - - - - - libstdc++ configury - - - - - -

> open configury door

-

> look

- -

You are in a maze of twisty passages, all -different.

-

It is dark. You are likely to be eaten by a -Canadian cross build.

- - -
-

Notes on libstdc++ configury

-
-No problem is insoluble in all conceivable circumstances.
--- The Cosmic AC, -The -Last Question, by Isaac Asimov -
- - -
-

Prerequisites for configure and make hacking

- -

As -noted previously, -certain other tools are necessary for hacking on files that control -configure (configure.ac, acinclude.m4) and -make (Makefile.am). These additional tools -(automake, and autoconf) are further -described in detail in their respective manuals. All the libraries in GCC try to stay in sync with each other in terms of versions of the auto-tools used, so please try to play nicely with the neighbors. -

- - -
-

Overview: what comes from where

-

Dependency graph in PNG graphics format.  (Get a better browser!)

- -

Regenerate all generated files by using the command sequence - "autoreconf" at the top level of the libstdc++ source - directory. The following will also work, but is much more complex: - "aclocal-1.7 && autoconf-2.59 && - autoheader-2.59 && automake-1.7" The version numbers - may be absent entirely or otherwise vary depending on - the current - requirements and your vendor's choice of installation names. -

- - -
-

Storing information in non-AC files, like - configure.host

-

Until that glorious day when we can use AC_TRY_LINK with a cross-compiler, - we have to hardcode the results of what the tests would have shown if - they could be run. So we have an inflexible mess like crossconfig.m4. -

- -

Wouldn't it be nice if we could store that information in files like - configure.host, which can be modified without needing to regenerate - anything, and can even be tweaked without really knowing how the configury - all works? Perhaps break the pieces of crossconfig.m4 out and place them in - their appropriate config/{cpu,os} directory. -

- -

Alas, writing macros like "AC_DEFINE(HAVE_A_NICE_DAY)" can - only be done inside files which are passed through autoconf. Files which - are pure shell script can be source'd at configure time. Files which - contain autoconf macros must be processed with autoconf. We could still - try breaking the pieces out into "config/*/cross.m4" bits, for instance, - but then we would need arguments to aclocal/autoconf to properly find - them all when generating configure. I would discourage that. -

- - -
-

Coding and commenting conventions

-

Lots of stuff got thrown out because the new autotools kindly generate - the same (or better) shell code for us. -

- -

Most comments should use {octothorpes, shibboleths, hash marks, pound - signs, whatevers} rather than "dnl". Nearly all comments in configure.ac - should. Comments inside macros written in ancilliary .m4 files should. - About the only comments which should not use #, but use dnl - instead, are comments outside our own macros in the ancilliary - files. The difference is that # comments show up in configure - (which is most helpful for debugging), while dnl'd lines just vanish. - Since the macros in ancilliary files generate code which appears in odd - places, their "outside" comments tend to not be useful while reading - configure. -

- -

Do not use any $target* variables, such as - $target_alias. The single exception is in configure.ac, - for automake+dejagnu's sake. -

- -

-

- -
-

The acinclude.m4 layout

-

The nice thing about acinclude.m4/aclocal.m4 is that macros aren't actually - performed/called/expanded/whatever here, just loaded. So we can arrange - the contents however we like. As of this writing, acinclude.m4 is arranged - as follows: -

-
-    GLIBCXX_CHECK_HOST
-    GLIBCXX_TOPREL_CONFIGURE
-    GLIBCXX_CONFIGURE
-
-

All the major variable "discovery" is done here. CXX, multilibs, etc. -

-
-    fragments included from elsewhere
-
-

Right now, "fragments" == "the math/linkage bits". -

-
-    GLIBCXX_CHECK_COMPILER_FEATURES
-    GLIBCXX_CHECK_LINKER_FEATURES
-    GLIBCXX_CHECK_WCHAR_T_SUPPORT
-
-

Next come extra compiler/linker feature tests. Wide character support - was placed here because I couldn't think of another place for it. It will - probably get broken apart like the math tests, because we're still disabling - wchars on systems which could actually support them. -

-
-    GLIBCXX_CHECK_SETRLIMIT_ancilliary
-    GLIBCXX_CHECK_SETRLIMIT
-    GLIBCXX_CHECK_S_ISREG_OR_S_IFREG
-    GLIBCXX_CHECK_POLL
-    GLIBCXX_CHECK_WRITEV
-
-    GLIBCXX_CONFIGURE_TESTSUITE
-
-

Feature tests which only get used in one place. Here, things used only in - the testsuite, plus a couple bits used in the guts of I/O. -

-
-    GLIBCXX_EXPORT_INCLUDES
-    GLIBCXX_EXPORT_FLAGS
-    GLIBCXX_EXPORT_INSTALL_INFO
-
-

Installation variables, multilibs, working with the rest of the compiler. - Many of the critical variables used in the makefiles are set here. -

-
-    GLIBGCC_ENABLE
-    GLIBCXX_ENABLE_C99
-    GLIBCXX_ENABLE_CHEADERS
-    GLIBCXX_ENABLE_CLOCALE
-    GLIBCXX_ENABLE_CONCEPT_CHECKS
-    GLIBCXX_ENABLE_CSTDIO
-    GLIBCXX_ENABLE_CXX_FLAGS
-    GLIBCXX_ENABLE_C_MBCHAR
-    GLIBCXX_ENABLE_DEBUG
-    GLIBCXX_ENABLE_DEBUG_FLAGS
-    GLIBCXX_ENABLE_LONG_LONG
-    GLIBCXX_ENABLE_PCH
-    GLIBCXX_ENABLE_SJLJ_EXCEPTIONS
-    GLIBCXX_ENABLE_SYMVERS
-    GLIBCXX_ENABLE_THREADS
-
-

All the features which can be controlled with enable/disable configure - options. Note how they're alphabetized now? Keep them like that. :-) -

-
-    AC_LC_MESSAGES
-    libtool bits
-
-

Things which we don't seem to use directly, but just has to be present - otherwise stuff magically goes wonky. -

- - -
-

GLIBCXX_ENABLE, the --enable howto

-

All the GLIBCXX_ENABLE_FOO macros use a common helper, GLIBCXX_ENABLE. - (You don't have to use it, but it's easy.) The helper does two things - for us: -

- -
    -
  1. Builds the call to the AC_ARG_ENABLE macro, with --help text properly - quoted and aligned. (Death to changequote!)
  2. -
  3. Checks the result against a list of allowed possibilities, and signals - a fatal error if there's no match. This means that the rest of the - GLIBCXX_ENABLE_FOO macro doesn't need to test for strange arguments, - nor do we need to protect against empty/whitespace strings with the - "x$foo" = "xbar" idiom.
  4. -
- -

Doing these things correctly takes some extra autoconf/autom4te code, - which made our macros nearly illegible. So all the ugliness is factored - out into this one helper macro. -

- -

Many of the macros take an argument, passed from when they are expanded - in configure.ac. The argument controls the default value of the - enable/disable switch. Previously, the arguments themselves had defaults. - Now they don't, because that's extra complexity with zero gain for us. -

- -

There are three "overloaded signatures". When reading the descriptions - below, keep in mind that the brackets are autoconf's quotation characters, - and that they will be stripped. Examples of just about everything occur - in acinclude.m4, if you want to look. -

- -
-    GLIBCXX_ENABLE (FEATURE, DEFAULT, HELP-ARG, HELP-STRING)
-    GLIBCXX_ENABLE (FEATURE, DEFAULT, HELP-ARG, HELP-STRING, permit a|b|c)
-    GLIBCXX_ENABLE (FEATURE, DEFAULT, HELP-ARG, HELP-STRING, SHELL-CODE-HANDLER)
-
- -
    -
  • FEATURE is the string that follows --enable. The results of the test - (such as it is) will be in the variable $enable_FEATURE, where FEATURE - has been squashed. Example: [extra-foo], controlled by the - --enable-extra-foo option and stored in $enable_extra_foo.

  • -
  • DEFAULT is the value to store in $enable_FEATURE if the user does not - pass --enable/--disable. It should be one of the permitted values - passed later. Examples: [yes], or [bar], or - [$1] (which passes the argument given to the - GLIBCXX_ENABLE_FOO macro as the default).

    -

    For cases where we need to probe for particular models - of things, it is useful to have an undocumented "auto" value here (see - GLIBCXX_ENABLE_CLOCALE for an example).

  • -
  • HELP-ARG is any text to append to the option string itself in the - --help output. Examples: [] (i.e., an empty string, - which appends nothing), - [=BAR], which produces - --enable-extra-foo=BAR, and - [@<:@=BAR@:>@], which produces - --enable-extra-foo[=BAR]. See the difference? See what - it implies to the user?

    -

    If you're wondering what that line noise in the last example was, - that's how you embed autoconf special characters in output text. - They're called -quadrigraphs - and you should use them whenever necessary.

  • -
  • HELP-STRING is what you think it is. Do not include the "default" - text like we used to do; it will be done for you by GLIBCXX_ENABLE. - By convention, these are not full English sentences. - Example: [turn on extra foo]

  • -
- -

With no other arguments, only the standard autoconf patterns are - allowed: "--{enable,disable}-foo[={yes,no}]" The - $enable_FEATURE variable is guaranteed to equal either "yes" or "no" - after the macro. If the user tries to pass something else, an - explanatory error message will be given, and configure will halt. -

- -

The second signature takes a fifth argument, - "[permit a|b|c|...]" - This allows a or b or ... after the equals sign in the - option, and $enable_FEATURE is guaranteed to equal one of them after the - macro. Note that if you want to allow plain --enable/--disable with no - "=whatever", you must include "yes" and "no" in the list of permitted - values. Also note that whatever you passed as DEFAULT must be in the list. - If the user tries to pass something not on the list, a semi-explanatory - error message will be given, and configure will halt. - Example: [permit generic|gnu|ieee_1003.1-2001|yes|no|auto] -

- -

The third signature takes a fifth argument. It is arbitrary shell code - to execute if the user actually passes the enable/disable option. (If - the user does not, the default is used. Duh.) No argument checking at - all is done in this signature. See GLIBCXX_ENABLE_CXX_FLAGS for an - example of handling, and an error message. -

- -
- - diff --git a/libstdc++-v3/docs/html/17_intro/contribute.html b/libstdc++-v3/docs/html/17_intro/contribute.html deleted file mode 100644 index 00c749a4490..00000000000 --- a/libstdc++-v3/docs/html/17_intro/contribute.html +++ /dev/null @@ -1,135 +0,0 @@ - - - - - - How to contribute - - - - - - - -

How to contribute

-

The Standard C++ Library v3, follows an open development -model. Active contributors are assigned maintainer-ship -responsibility, and given write access to the SVN repository. First -time contributors should follow this procedure: -

- -
-

ONE : read the documentation

- -
    -
  • Get and read the relevant sections of the C++ language -specification. Copies of the full ISO 14882 standard are available on -line via the ISO mirror site for committee members. Non-members, or -those who have not paid for the privilege of sitting on the committee -and sustained their two meeting commitment for voting rights, may get -a copy of the standard from their respective national standards -organization. In the USA, this national standards organization is ANSI -and their web-site is right - - here. -(And if you've already registered with them, clicking this link will take you to directly to the place where you can -buy the standard on-line.) -
  • - -
  • The library working group bugs, and known defects, can be obtained here: - http://www.open-std.org/jtc1/sc22/wg21 -
  • - -
  • The newsgroup dedicated to standardization issues is comp.std.c++: this FAQ for this group is quite useful and can be found here . -
  • - -
  • Peruse the GNU Coding Standards, and chuckle when you hit the part about "Using Languages Other Than C." -
  • - -
  • Be familiar with the extensions that preceded these general GNU rules. These style issues for libstdc++ can be found in the file C++STYLE, located in the root level of the distribution, or here. -
  • - -
  • And last but certainly not least, read the library-specific information found here. -
  • - -
- - - -
-

TWO : copyright assignment

-

-Small changes can be accepted without a copyright assignment form on -file. New code and additions to the library need completed copyright -assignment form on file at the FSF. Note: your employer may be required -to fill out appropriate disclaimer forms as well. -

- -

Historically, the libstdc++ assignment form added the following question: -

- -[Which Belgian comic book character is better, Tintin or -Asterix, and why?] - -

-While not strictly necessary, humoring the maintainers and answering -this question would be appreciated. -

- -

-For more information about getting a copyright assignment, please see -Legal -Matters. -

- -

-Please contact Benjamin -Kosnik if you are confused about the assignment or have general -licensing questions. When requesting an assignment form from assign@gnu.org, please cc -the above libstdc++ maintainer so that progress can be monitored. -

- - -
-

THREE : submitting patches

- -

-Every patch must have several pieces of information before it can be -properly evaluated. Ideally (and to ensure the fastest possible -response from the maintainers) it would have all of these pieces: -

- -
    - -
  • A description of the bug and how your patch fixes this bug. For - new features a description of the feature and your implementation.
  • - -
  • A ChangeLog entry as plain text; see the various ChangeLog files - for format and content. If using you are using emacs as your editor, - simply position the insertion point at the beginning of your change - and hit CX-4a to bring up the appropriate ChangeLog - entry. See--magic! Similar functionality also exists for vi.
  • - -
  • A testsuite submission or sample program that will easily and - simply show the existing error or test new functionality.
  • - -
  • The patch itself. If you are accessing the SVN repository - use "svn update; svn diff NEW"; else, use "diff -cp OLD NEW" - ... If your version of diff does not support these options, then - get the latest version of GNU diff. The SVN Tricks wiki page - has information on customising the output of svn diff.
  • - -
  • When you have all these pieces, bundle them up in a mail message -and send it to libstdc++@gcc.gnu.org. All patches and related -discussion should be sent to the libstdc++ mailing list.
  • - -
- - - - diff --git a/libstdc++-v3/docs/html/17_intro/howto.html b/libstdc++-v3/docs/html/17_intro/howto.html deleted file mode 100644 index 09f1a3c370a..00000000000 --- a/libstdc++-v3/docs/html/17_intro/howto.html +++ /dev/null @@ -1,737 +0,0 @@ - - - - - - - - - - - libstdc++ HOWTO: Chapter 17: Library Introduction - - - - - - - - -

Chapter 17: Library Introduction

- -

Chapter 17 is actually a list of definitions and descriptions used - in the following chapters of the Standard when describing the actual - library. Here, we use "Introduction" as an introduction - to the GNU implementation of the ISO Standard C++ Library. -

- - - -
-

Contents

- - -
- - - -

Header Files

-

The C++ standard specifies the entire set of header files that must be - available to all hosted implementations. Actually, the word - "files" is a misnomer, since the contents of the headers - don't necessarily have to be in any kind of external file. The - only rule is that when one #include's a header, the - contents of that header become - available, no matter how. -

- -

That said, in practice files are used.

- -

There are two main types of include files: header files related to -a specific version of the ISO C++ standard (called Standard Headers), -and all others (TR1, C++ ABI, and Extensions).

- -

Two dialects of standard headers are supported, corresponding to -the 1998 standard as updated for 2003, and the draft of the upcoming -200x standard. -

- -

C++98/03 include files. These are available in the default compilation mode, ie -std=c++98 or -std=gnu++98. -

- -
- - - - - - - -
C++98 Library Headers
<algorithm><iomanip><list><ostream><streambuf>
<bitset><ios><locale><queue><string>
<complex><iosfwd><map><set><typeinfo>
<deque><iostream><memory><sstream><utility>
<exception><istream><new><stack><valarray>
<fstream><iterator><numeric><stdexcept><vector>
<functional><limits>
- -

- -
- - - - -
C++98 Headers for C Library Facilities
<cassert><ciso646><csetjmp><cstdio><ctime>
<cctype><climits><csignal><cstdlib><cwchar>
<cerrno><clocale><cstdarg><cstring><cwctype>
<cfloat><cmath><cstddef>
- -

C++0x include files. These are only available in C++0x compilation mode, ie -std=c++0x or -std=gnu++0x. -

- -
- - - - - - - - -
C++0x Library Headers
<algorithm><iomanip><locale><regex><tuple>
<array><ios><map><set><typeinfo>
<bitset><iosfwd><memory><sstream><type_traits>
<complex><iostream><new><stack><unordered_map>
<deque><istream><numeric><stdexcept><unordered_set>
<exception><iterator><ostream><streambuf><utility>
<fstream><limits><queue><string><valarray>
<functional><list><random><system_error><vector>
- -

- -
- - - - - -
C++0x Headers for C Library Facilities
<cassert><cfloat><cmath><cstddef><ctgmath>
<ccomplex><cinttypes><csetjmp><cstdint><ctime>
<cctype><ciso646><csignal><cstdio><cuchar>
<cerrno><climits><cstdarg><cstdlib><cwchar>
<cfenv><clocale><cstdbool><cstring><cwctype>
- - -

In addition, TR1 includes as: -

- -
- - - -
TR1 Library Headers
<tr1/array><tr1/memory><tr1/regex><tr1/type_traits><tr1/unordered_set>
<tr1/complex><tr1/random><tr1/tuple><tr1/unordered_map><tr1/utility>
<tr1/functional>
- -

- -
- - - -
TR1 Headers for C Library Facilities
<tr1/cmath><tr1/cfloat><tr1/cstdarg><tr1/cstdio><tr1/ctime>
<tr1/ccomplex><tr1/cinttypes><tr1/cstdbool><tr1/cstdlib><tr1/cwchar>
<tr1/cfenv><tr1/climits><tr1/cstdint><tr1/ctgmath><tr1/cwctype>
- -

Also included are files for the C++ ABI interface: -

-
- -
C++ ABI Headers
<cxxabi.h><cxxabi_forced.h>
- -

And a large variety of extensions. -

- -
- - - - - - -
Extension Headers
<ext/algorithm><ext/debug_allocator.h><ext/mt_allocator.h><ext/pod_char_traits.h><ext/stdio_sync_filebuf.h>
<ext/array_allocator.h><ext/enc_filebuf.h><ext/new_allocator.h><ext/pool_allocator.h><ext/throw_allocator.h>
<ext/atomicity.h><ext/functional><ext/numeric><ext/rb_tree><ext/typelist.h>
<ext/bitmap_allocator.h><ext/iterator><ext/numeric_traits.h><ext/rope><ext/type_traits.h>
<ext/codecvt_specializations.h><ext/malloc_allocator.h><ext/pb_ds/assoc_container.h><ext/slist><ext/vstring.h>
<ext/concurrence.h><ext/memory><ext/pb_ds/priority_queue.h><ext/stdio_filebuf.h>
- -

- -
- - -
Extension Debug Headers
<debug/bitset><debug/list><debug/set><debug/unordered_map><debug/vector>
<debug/deque><debug/map><debug/string><debug/unordered_set>
- -

- -
- -
Extension Parallel Headers
<parallel/algorithm><parallel/numeric>
- -
-

Recipes for mixing headers

- -

A few simple rules. -

- -

First, mixing different dialects of the standard headers is not -possible. It's an all-or-nothing affair. Thus, code like -

- -
-#include <array>
-#include <functional>
-
- -

Implies C++0x mode. To use the entities in <array>, the C++0x -compilation mode must be used, which implies the C++0x functionality -(and deprecations) in <functional> will be present. -

- -

Second, the other headers can be included with either dialect of -the standard headers, although features and types specific to C++0x -are still only enabled when in C++0x compilation mode. So, to use -rvalue references with __gnu_cxx::vstring, or to use the -debug-mode versions of std::unordered_map, one must use -the std=gnu++0x compiler flag. (Or std=c++0x, of course.) -

- -

A special case of the second rule is the mixing of TR1 and C++0x -facilities. It is possible (although not especially prudent) to -include both the TR1 version and the C++0x version of header in the -same translation unit: -

- -
-#include <tr1/type_traits>
-#include <type_traits>
-
- -

Several parts of C++0x diverge quite substantially from TR1 predecessors. -

- - -
-

The C Headers and namespace std

-

- The standard specifies that if one includes the C-style header - (<math.h> in this case), the symbols will be available - in the global namespace and perhaps in - namespace std:: (but this is no longer a firm - requirement.) One the other hand, including the C++-style - header (<cmath>) guarantees that the entities will be - found in namespace std and perhaps in the global namespace. -

- -

-Usage of C++-style headers is recommended, as then -C-linkage names can be disambiguated by explicit qualification, such -as by std::abort. In addition, the C++-style headers can -use function overloading to provide a simpler interface to certain -families of C-functions. For instance in <cmath>, the -function std::sin has overloads for all the builtin -floating-point types. This means that std::sin can be -used uniformly, instead of a combination -of std::sinf, std::sin, -and std::sinl. -

- -
-

Precompiled Headers

- -

There are three base header files that are provided. They can be -used to precompile the standard headers and extensions into binary -files that may the be used to speed compiles that use these headers. -

- - -
    -
  • stdc++.h -

    Includes all standard headers. Actual content varies depending on -language dialect. -

    -
  • - -
  • stdtr1c++.h -

    Includes all of <stdc++.h>, and adds all the TR1 headers. -

    -
  • - -
  • extc++.h -

    Includes all of <stdtr1c++.h>, and adds all the Extension headers. -

  • -
- -

How to construct a .gch file from one of these base header files.

- -

First, find the include directory for the compiler. One way to do -this is:

- -
-g++ -v hello.cc
-
-#include <...> search starts here:
- /mnt/share/bld/H-x86-gcc.20071201/include/c++/4.3.0
-...
-End of search list.
-
- - -

Then, create a precompiled header file with the same flags that -will be used to compile other projects.

- -
-g++ -Winvalid-pch -x c++-header -g -O2 -o ./stdc++.h.gch /mnt/share/bld/H-x86-gcc.20071201/include/c++/4.3.0/x86_64-unknown-linux-gnu/bits/stdc++.h
-
- -

The resulting file will be quite large: the current size is around -thirty megabytes.

- -

How to use the resulting file.

- -
-g++ -I. -include stdc++.h  -H -g -O2 hello.cc 
-
- -

Verification that the PCH file is being used is easy:

- -
-g++ -Winvalid-pch -I. -include stdc++.h -H -g -O2 hello.cc -o test.exe
-! ./stdc++.h.gch
-. /mnt/share/bld/H-x86-gcc.20071201/include/c++/4.3.0/iostream
-. /mnt/share/bld/H-x86-gcc.20071201include/c++/4.3.0/string
-
- -

The exclamation point to the left of the stdc++.h.gch listing means that the generated PCH file was used, and thus the

-

- -

Detailed information about creating precompiled header files can be found in the GCC documentation. -

- - -
-

Namespaces

- - -

There are three main namespaces. -

- -
    -
  • std -

    The ISO C++ standards specify that "all library entities are defined -within namespace std." This includes namepaces nested -within namespace std, such as namespace -std::tr1. -

    -
  • -
  • abi -

    Specified by the C++ ABI. This ABI specifies a number of type and -function APIs supplemental to those required by the ISO C++ Standard, -but necessary for interoperability. -

    -
  • - -
  • __gnu_ -

    Indicating one of several GNU extensions. Choices -include __gnu_cxx, __gnu_debug, __gnu_parallel, -and __gnu_pbds. -

  • -
- -

A complete list of implementation namespaces (including namespace contents) is available in the generated source documentation. -

- - -
-

Namespace std::

- -

- One standard requirement is that the library components are defined - in namespace std::. Thus, in order to use these types or - functions, one must do one of two things: -

- -
  • put a kind of -using-declaration in your source -(either using namespace std; or i.e. using -std::string;) This approach works well for individual source files, but -should not be used in a global context, like header files. -

  • use a fully -qualified name for each library symbol -(i.e. std::string, std::cout) Always can be -used, and usually enhanced, by strategic use of typedefs. (In the -cases where the qualified verbiage becomes unwieldy.) -

  • -
- -
-

Using namespace composition

- -

-Best practice in programming suggests sequestering new data or -functionality in a sanely-named, unique namespace whenever -possible. This is considered an advantage over dumping everything in -the global namespace, as then name look-up can be explicitly enabled or -disabled as above, symbols are consistently mangled without repetitive -naming prefixes or macros, etc. -

- -

For instance, consider a project that defines most of its classes in namespace gtk. It is possible to - adapt namespace gtk to namespace std by using a C++-feature called - namespace composition. This is what happens if - a using-declaration is put into a - namespace-definition: the imported symbol(s) gets imported into the - currently active namespace(s). For example: -

-
-namespace gtk 
-{
-  using std::string;
-  using std::tr1::array;
-
-  class Window { ... };
-}
-
-

- In this example, std::string gets imported into - namespace gtk. The result is that use of - std::string inside namespace gtk can just use string, without the explicit qualification. - As an added bonus, - std::string does not get imported into - the global namespace. Additionally, a more elaborate arrangement can be made for backwards compatibility and portability, whereby the - using-declarations can wrapped in macros that - are set based on autoconf-tests to either "" or i.e. using - std::string; (depending on whether the system has - libstdc++ in std:: or not). (ideas from - <llewelly@dbritsch.dsl.xmission.com>, Karl Nelson - <kenelson@ece.ucdavis.edu>) -

- -
-

Macros for libstdc++

- -

All pre-processor switches and configurations are all gathered - in the file c++config.h, which is generated during - the libstdc++ configuration and build process, and included by - files part of the public libstdc++ API. Most of these macros - should not be used by consumers of libstdc++, and are reserved - for internal implementation use. These macros cannot be - redefined. However, a select handful of these macro - control libstdc++ extensions and extra features, or provide - versioning information for the API, and are able to be used. -

- -

All library macros begin with _GLIBCXX_ (except for - versions 3.1.x to 3.3.x, which use _GLIBCPP_). -

- -

Below is the macro which users may check for library version - information.

- -
-
__GLIBCXX__
The current version of - libstdc++ in compressed ISO date format, form of an unsigned - long. For details on the value of this particular macro for a - particular release, please consult this - document.
- -

Below are the macros which users may change with #define/#undef or - with -D/-U compiler flags. The default state of the symbol is - listed.

- -

"Configurable" (or "Not configurable") means - that the symbol is initially chosen (or not) based on - --enable/--disable options at library build and configure time - (documented here), with the - various --enable/--disable choices being translated to - #define/#undef). -

- -

"ABI" means that changing from the default value may - mean changing the ABI of compiled code. In other words, these - choices control code which has already been compiled (i.e., in a - binary such as libstdc++.a/.so). If you explicitly #define or - #undef these macros, the headers may see different code - paths, but the libraries which you link against will not. - Experimenting with different values with the expectation of - consistent linkage requires changing the config headers before - building/installing the library. -

- -
-
_GLIBCXX_DEPRECATED
-
Defined by default. Not configurable. ABI-changing. Turning this off - removes older ARM-style iostreams code, and other anachronisms - from the API. This macro is dependent on the version of the - standard being tracked, and as a result may give different results for - -std=c++98 and -std=c++0x. This may - be useful in updating old C++ code which no longer meet the - requirements of the language, or for checking current code - against new language standards.
- -
_GLIBCXX_FORCE_NEW
Undefined by - default. When defined, memory allocation and allocators controlled - by libstdc++ call operator new/delete without caching and - pooling. Configurable via - --enable-libstdcxx-allocator. ABI-changing. -
- - -
_GLIBCXX_CONCEPT_CHECKS
Undefined by - default. Configurable via --enable-concept-checks. - When defined, performs compile-time checking on certain template - instantiations to detect violations of the requirements of the - standard. This is described in more detail here.
- -
_GLIBCXX_DEBUG
-
Undefined by default. When defined, compiles - user code using the libstdc++ debug - mode. -
-
_GLIBCXX_DEBUG_PEDANTIC
-
Undefined by default. When defined while - compiling with the libstdc++ debug - mode, makes the debug mode extremely picky by making the use - of libstdc++ extensions and libstdc++-specific behavior into - errors. -
-
_GLIBCXX_PARALLEL
-
Undefined by default. When defined, compiles - user code using the libstdc++ parallel - mode. -
-
- -
-

The Standard C++ library and multithreading

-

This section discusses issues surrounding the proper compilation - of multithreaded applications which use the Standard C++ - library. This information is GCC-specific since the C++ - standard does not address matters of multithreaded applications. - Unless explicitly prefaced, all information in this section is - relevant to the GCC 3.0 release and all later releases. -

-

Earlier GCC releases had a somewhat different approach to - threading configuration and proper compilation. Before GCC 3.0, - configuration of the threading model was dictated by compiler - command-line options and macros (both of which were somewhat - thread-implementation and port-specific). There were no - guarantees related to being able to link code compiled with one - set of options and macro setting with another set. For GCC 3.0, - configuration of the threading model used with libraries and - user-code is performed when GCC is configured and built using - the --enable-threads and --disable-threads options. The ABI is - stable for symbol name-mangling and limited functional - compatibility exists between code compiled under different - threading models. -

-

All normal disclaimers aside, multithreaded C++ application are - only supported when libstdc++ and all user code was built with - compilers which report (via gcc/g++ -v ) the same thread - model and that model is not single. As long as your - final application is actually single-threaded, then it should be - safe to mix user code built with a thread model of - single with a libstdc++ and other C++ libraries built - with another thread model useful on the platform. Other mixes - may or may not work but are not considered supported. (Thus, if - you distribute a shared C++ library in binary form only, it may - be best to compile it with a GCC configured with - --enable-threads for maximal interchangeability and usefulness - with a user population that may have built GCC with either - --enable-threads or --disable-threads.) -

-

When you link a multithreaded application, you will probably - need to add a library or flag to g++. This is a very - non-standardized area of GCC across ports. Some ports support a - special flag (the spelling isn't even standardized yet) to add - all required macros to a compilation (if any such flags are - required then you must provide the flag for all compilations not - just linking) and link-library additions and/or replacements at - link time. The documentation is weak. Here is a quick summary - to display how ad hoc this is: On Solaris, both -pthreads and - -threads (with subtly different meanings) are honored. On OSF, - -pthread and -threads (with subtly different meanings) are - honored. On Linux/i386, -pthread is honored. On FreeBSD, - -pthread is honored. Some other ports use other switches. - AFAIK, none of this is properly documented anywhere other than - in ``gcc -dumpspecs'' (look at lib and cpp entries). -

-

See FAQ (general overview), 23 (containers), and 27 (I/O) for more information. -

-

The libstdc++ library has been designed so that it can be used in - multithreaded applications (with libstdc++-v2 this was - only true of the STL parts.) The first problem is - finding a fast method of implementation portable to all - platforms. Due to historical reasons, some of the library is - written against per-CPU-architecture spinlocks and other parts - against the gthr.h abstraction layer which is provided by gcc. - A minor problem that pops up every so often is different - interpretations of what "thread-safe" means for a - library (not a general program). We currently use the same - definition that SGI uses for their STL subset. However, the - exception for read-only containers only applies to the STL - components. This definition is widely-used and something similar - will be used in the next version of the C++ standard library. -

-

Here is a small link farm to threads (no pun) in the mail archives - that discuss the threading problem. Each link is to the first - relevant message in the thread; from there you can use - "Thread Next" to move down the thread. This farm is in - latest-to-oldest order. -

-
    -
  • Our threading expert Loren gives a breakdown of - the - six situations involving threads for the 3.0 release series.
  • -
  • - This message inspired a recent updating of issues with threading - and the SGI STL library. It also contains some example - POSIX-multithreaded STL code.
  • -
-

(A large selection of links to older messages has been removed; many - of the messages from 1999 were lost in a disk crash, and the few - people with access to the backup tapes have been too swamped with work - to restore them. Many of the points have been superseded anyhow.) -

-

This section will be updated as new and interesting issues come - to light. -

-

Return to top of page or - to the FAQ. -

- -
-

Behavior specific to libstdc++

-

The ISO standard defines the following phrase: -

-
-
[1.3.5] implementation-defined behavior
-
behavior, for a well-formed program construct and correct data, that - depends on the implementation and that each implementation - shall document. -
-
-

We do so here, for the C++ library only. Behavior of the compiler, - linker, runtime loader, and other elements of "the - implementation" are documented elsewhere. Everything listed in - Annex B, Implementation Qualities, are also part of the compiler, not - the library. -

-

For each entry, we give the section number of the standard, when - applicable. This list is probably incomplet and inkorrekt. -

-

[1.9]/11 #3 If isatty(3) is true, then - interactive stream support is implied. -

-

[17.4.4.5] Non-reentrant functions are probably best - discussed in the various sections on multithreading (see above). -

- -

[18.1]/4 The type of NULL is described - here. -

-

[18.3]/8 Even though it's listed in the library - sections, libstdc++ has zero control over what the cleanup code hands - back to the runtime loader. Talk to the compiler people. :-) -

-

[18.4.2.1]/5 (bad_alloc),
- [18.5.2]/5 (bad_cast),
- [18.5.3]/5 (bad_typeid),
- [18.6.1]/8 (exception),
- [18.6.2.1]/5 (bad_exception): The what() - member function of class std::exception, and these other - classes publicly derived from it, simply returns the name of the - class. But they are the mangled names; you will need to call - c++filt and pass the names as command-line parameters to - demangle them, or call a - runtime demangler function. - (The classes in <stdexcept> have constructors which - require an argument to use later for what() calls, so the - problem of what()'s value does not arise in most - user-defined exceptions.) -

-

[18.5.1]/7 The return value of - std::type_info::name() is the mangled type name (see the - previous entry for more). -

-

[20.1.5]/5 "Implementors are encouraged to - supply libraries that can accept allocators that encapsulate more - general memory models and that support non-equal instances. In such - implementations, any requirements imposed on allocators by containers - beyond those requirements that appear in Table 32, and the semantics - of containers and algorithms when allocator instances compare - non-equal, are implementation-defined." As yet we don't - have any allocators which compare non-equal, so we can't describe how - they behave. -

-

[21.1.3.1]/3,4,
- [21.1.3.2]/2,
- [23.*]'s foo::iterator,
- [27.*]'s foo::*_type,
- others... - Nope, these types are called implementation-defined because you - shouldn't be taking advantage of their underlying types. Listing them - here would defeat the purpose. :-) -

-

[21.1.3.1]/5 I don't really know about the mbstate_t - stuff... see the chapter 22 notes - for what does exist. -

-

[22.*] Anything and everything we have on locale - implementation will be described - over here. -

-

[26.2.8]/9 I have no idea what - complex<T>'s pow(0,0) returns. -

-

[27.4.2.4]/2 Calling - std::ios_base::sync_with_stdio after I/O has already been - performed on the standard stream objects will - flush the buffers, and - destroy and recreate the underlying buffer instances. Whether or not - the previously-written I/O is destroyed in this process depends mostly - on the --enable-libio choice: for stdio, if the written data is - already in the stdio buffer, the data may be completely safe! -

-

[27.6.1.1.2],
- [27.6.2.3] The I/O sentry ctor and dtor can perform - additional work than the minimum required. We are not currently taking - advantage of this yet. -

-

[27.7.1.3]/16,
- [27.8.1.4]/10 - The effects of pubsetbuf/setbuf are described - in this chapter. -

-

[27.8.1.4]/16 Calling fstream::sync when - a get area exists will... whatever fflush() does, I think. -

-

Return to top of page or - to the FAQ. -

- - -

Return to top of page or - to the FAQ. -

- - - - - -
-

-See license.html for copying conditions. -Comments and suggestions are welcome, and may be sent to -the libstdc++ mailing list. -

- - - - - - diff --git a/libstdc++-v3/docs/html/17_intro/license.html b/libstdc++-v3/docs/html/17_intro/license.html deleted file mode 100644 index 294a00892d3..00000000000 --- a/libstdc++-v3/docs/html/17_intro/license.html +++ /dev/null @@ -1,119 +0,0 @@ - - - - - - - - - - - libstdc++ copying - - - - - -

Licenses for the Library

- -

There are two licenses affecting GNU libstdc++: one for the code, and - one for the documentation. Here we will describe both of them, and try - to answer some of the widespread questions. If you have more questions, - ask the FSF or the - gcc mailing list; the person - writing this page is a programmer, not a lawyer. -

- -
- -

The Code: Runtime GPL

- -

The source code of libstdc++ is distributed under version 2 of the - GNU General Public License, with the so-called - "runtime exception," as follows (or see any header or - implementation file): -

-
-   As a special exception, you may use this file as part of a free software
-   library without restriction.  Specifically, if other files instantiate
-   templates or use macros or inline functions from this file, or you compile
-   this file and link it with other files to produce an executable, this
-   file does not by itself cause the resulting executable to be covered by
-   the GNU General Public License.  This exception does not however
-   invalidate any other reasons why the executable file might be covered by
-   the GNU General Public License.
-
- -

Hopefully that text is self-explanatory. If it isn't, you need to speak - to your lawyer, or the Free Software Foundation. -

- - -

Q: So any program which uses libstdc++ falls under the GPL? -
A: No. The special exception permits use of the - library in proprietary applications. -

- -

Q: How is that different from the GNU {Lesser,Library} - GPL? - -
A: The LGPL requires that users be able to replace the LGPL code with a - modified version; this is trivial if the library in question is a C - shared library. But there's no way to make that work with C++, where - much of the library consists of inline functions and templates, which - are expanded inside the code that uses the library. So to allow people - to replace the library code, someone using the library would have to - distribute their own source, rendering the LGPL equivalent to the GPL. -

- -

Q: I see. So, what restrictions are there on - programs that use the library? -
A: None. We encourage such programs to be released as open source, - but we won't punish you or sue you if you choose otherwise. -

- -
- -

The Docs: GPL, FDL

- -

The documentation shipped with the library and made available over the - web, excluding the pages generated from source comments, are copyrighted - by the Free Software Foundation, and placed under - the GNU Free Documentation License version 1.1. - There are no Front-Cover Texts, no Back-Cover Texts, and - - no Invariant Sections. -

- -

For documentation generated by doxygen or other automated tools -via processing source code comments and markup, the original source -code license applies to the generated files. Thus, the doxygen -documents are licensed GPL. -

- -

If you plan on making copies of the documentation, please let us know. - We can probably offer suggestions. -

- - - - -
-

-Comments and suggestions about this page are welcome, and may be sent to -the libstdc++ mailing list. -Comments or questions about the licenses themselves are also welcome, and -should be directed to the GCC list as descibed above. -

- - - - - - diff --git a/libstdc++-v3/docs/html/17_intro/porting.html b/libstdc++-v3/docs/html/17_intro/porting.html deleted file mode 100644 index 2a561a9abc3..00000000000 --- a/libstdc++-v3/docs/html/17_intro/porting.html +++ /dev/null @@ -1,992 +0,0 @@ - - -Porting libstdc++ - - - - - - - - -

Porting libstdc++

-
-


-Node: Top, -Next: , -Up: (dir) -
-
- -

Porting libstdc++

- -

This document explains how to port libstdc++ (the GNU C++ library) to -a new target. - -

In order to make the GNU C++ library (libstdc++) work with a new -target, you must edit some configuration files and provide some new -header files. Unless this is done, libstdc++ will use generic -settings which may not be correct for your target; even if they are -correct, they will likely be inefficient. - -

Before you get started, make sure that you have a working C library on -your target. The C library need not precisely comply with any -particular standard, but should generally conform to the requirements -imposed by the ANSI/ISO standard. - -

In addition, you should try to verify that the C++ compiler generally -works. It is difficult to test the C++ compiler without a working -library, but you should at least try some minimal test cases. - -

(Note that what we think of as a "target," the library refers to as -a "host." The comment at the top of configure.ac explains why.) - -

Here are the primary steps required to port the library: - -

- -
-


-Node: Operating system, -Next: , -Previous: Top, -Up: Top -
-
- -

Operating system

- -

If you are porting to a new operating system (as opposed to a new chip -using an existing operating system), you will need to create a new -directory in the config/os hierarchy. For example, the IRIX -configuration files are all in config/os/irix. There is no set -way to organize the OS configuration directory. For example, -config/os/solaris/solaris-2.6 and -config/os/solaris/solaris-2.7 are used as configuration -directories for these two versions of Solaris. On the other hand, both -Solaris 2.7 and Solaris 2.8 use the config/os/solaris/solaris-2.7 -directory. The important information is that there needs to be a -directory under config/os to store the files for your operating -system. - -

You might have to change the configure.host file to ensure that -your new directory is activated. Look for the switch statement that sets -os_include_dir, and add a pattern to handle your operating system -if the default will not suffice. The switch statement switches on only -the OS portion of the standard target triplet; e.g., the solaris2.8 -in sparc-sun-solaris2.8. If the new directory is named after the -OS portion of the triplet (the default), then nothing needs to be changed. - -

The first file to create in this directory, should be called -os_defines.h. This file contains basic macro definitions -that are required to allow the C++ library to work with your C library. - -

Several libstdc++ source files unconditionally define the macro -_POSIX_SOURCE. On many systems, defining this macro causes -large portions of the C library header files to be eliminated -at preprocessing time. Therefore, you may have to #undef this -macro, or define other macros (like _LARGEFILE_SOURCE or -__EXTENSIONS__). You won't know what macros to define or -undefine at this point; you'll have to try compiling the library and -seeing what goes wrong. If you see errors about calling functions -that have not been declared, look in your C library headers to see if -the functions are declared there, and then figure out what macros you -need to define. You will need to add them to the -CPLUSPLUS_CPP_SPEC macro in the GCC configuration file for your -target. It will not work to simply define these macros in -os_defines.h. - -

At this time, there are a few libstdc++-specific macros which may be -defined: - -

_GLIBCXX_USE_C99_CHECK may be defined to 1 to check C99 -function declarations (which are not covered by specialization below) -found in system headers against versions found in the library headers -derived from the standard. - -

_GLIBCXX_USE_C99_DYNAMIC may be defined to an expression that -yields 0 if and only if the system headers are exposing proper support -for C99 functions (which are not covered by specialization below). If -defined, it must be 0 while bootstrapping the compiler/rebuilding the -library. - -

_GLIBCXX_USE_C99_LONG_LONG_CHECK may be defined to 1 to check -the set of C99 long long function declarations found in system headers -against versions found in the library headers derived from the -standard. - -

_GLIBCXX_USE_C99_LONG_LONG_DYNAMIC may be defined to an -expression that yields 0 if and only if the system headers are -exposing proper support for the set of C99 long long functions. If -defined, it must be 0 while bootstrapping the compiler/rebuilding the -library. - -

_GLIBCXX_USE_C99_FP_MACROS_DYNAMIC may be defined to an -expression that yields 0 if and only if the system headers -are exposing proper support for the related set of macros. If defined, -it must be 0 while bootstrapping the compiler/rebuilding the library. - -

_GLIBCXX_USE_C99_FLOAT_TRANSCENDENTALS_CHECK may be defined -to 1 to check the related set of function declarations found in system -headers against versions found in the library headers derived from -the standard. - -

_GLIBCXX_USE_C99_FLOAT_TRANSCENDENTALS_DYNAMIC may be defined -to an expression that yields 0 if and only if the system headers -are exposing proper support for the related set of functions. If defined, -it must be 0 while bootstrapping the compiler/rebuilding the library. - -

Finally, you should bracket the entire file in an include-guard, like -this: - -

     #ifndef _GLIBCXX_OS_DEFINES
-     #define _GLIBCXX_OS_DEFINES
-     ...
-     #endif
-     
- -

We recommend copying an existing os_defines.h to use as a -starting point. - -

-


-Node: CPU, -Next: , -Previous: Operating system, -Up: Top -
-
- -

CPU

- -

If you are porting to a new chip (as opposed to a new operating system -running on an existing chip), you will need to create a new directory in the -config/cpu hierarchy. Much like the Operating system setup, -there are no strict rules on how to organize the CPU configuration -directory, but careful naming choices will allow the configury to find your -setup files without explicit help. - -

We recommend that for a target triplet <CPU>-<vendor>-<OS>, you -name your configuration directory config/cpu/<CPU>. If you do this, -the configury will find the directory by itself. Otherwise you will need to -edit the configure.host file and, in the switch statement that sets -cpu_include_dir, add a pattern to handle your chip. - -

Note that some chip families share a single configuration directory, for -example, alpha, alphaev5, and alphaev6 all use the -config/cpu/alpha directory, and there is an entry in the -configure.host switch statement to handle this. - -

The cpu_include_dir sets default locations for the files controlling -Thread safety and Numeric limits, if the defaults are not -appropriate for your chip. - -

-


-Node: Character types, -Next: , -Previous: CPU, -Up: Top -
-
- -

Character types

- -

The library requires that you provide three header files to implement -character classification, analogous to that provided by the C libraries -<ctype.h> header. You can model these on the files provided in -config/os/generic. However, these files will almost -certainly need some modification. - -

The first file to write is ctype_base.h. This file provides -some very basic information about character classification. The libstdc++ -library assumes that your C library implements <ctype.h> by using -a table (indexed by character code) containing integers, where each of -these integers is a bit-mask indicating whether the character is -upper-case, lower-case, alphabetic, etc. The ctype_base.h -file gives the type of the integer, and the values of the various bit -masks. You will have to peer at your own <ctype.h> to figure out -how to define the values required by this file. - -

The ctype_base.h header file does not need include guards. -It should contain a single struct definition called -ctype_base. This struct should contain two type -declarations, and one enumeration declaration, like this example, taken -from the IRIX configuration: - -

     struct ctype_base
-     {
-       typedef unsigned int 	mask;
-       typedef int* 		__to_type;
-     
-       enum
-       {
-         space = _ISspace,
-         print = _ISprint,
-         cntrl = _IScntrl,
-         upper = _ISupper,
-         lower = _ISlower,
-         alpha = _ISalpha,
-         digit = _ISdigit,
-         punct = _ISpunct,
-         xdigit = _ISxdigit,
-         alnum = _ISalnum,
-         graph = _ISgraph
-       };
-     };
-     
- -

The mask type is the type of the elements in the table. If your -C library uses a table to map lower-case numbers to upper-case numbers, -and vice versa, you should define __to_type to be the type of the -elements in that table. If you don't mind taking a minor performance -penalty, or if your library doesn't implement toupper and -tolower in this way, you can pick any pointer-to-integer type, -but you must still define the type. - -

The enumeration should give definitions for all the values in the above -example, using the values from your native <ctype.h>. They can -be given symbolically (as above), or numerically, if you prefer. You do -not have to include <ctype.h> in this header; it will always be -included before ctype_base.h is included. - -

The next file to write is ctype_noninline.h, which also does -not require include guards. This file defines a few member functions -that will be included in include/bits/locale_facets.h. The first -function that must be written is the ctype<char>::ctype -constructor. Here is the IRIX example: - -

     ctype<char>::ctype(const mask* __table = 0, bool __del = false,
-           size_t __refs = 0)
-       : _Ctype_nois<char>(__refs), _M_del(__table != 0 && __del),
-         _M_toupper(NULL),
-         _M_tolower(NULL),
-         _M_ctable(NULL),
-         _M_table(!__table
-                  ? (const mask*) (__libc_attr._ctype_tbl->_class + 1)
-                  : __table)
-       { }
-     
- -

There are two parts of this that you might choose to alter. The first, -and most important, is the line involving __libc_attr. That is -IRIX system-dependent code that gets the base of the table mapping -character codes to attributes. You need to substitute code that obtains -the address of this table on your system. If you want to use your -operating system's tables to map upper-case letters to lower-case, and -vice versa, you should initialize _M_toupper and -_M_tolower with those tables, in similar fashion. - -

Now, you have to write two functions to convert from upper-case to -lower-case, and vice versa. Here are the IRIX versions: - -

     char
-     ctype<char>::do_toupper(char __c) const
-     { return _toupper(__c); }
-     
-     char
-     ctype<char>::do_tolower(char __c) const
-     { return _tolower(__c); }
-     
- -

Your C library provides equivalents to IRIX's _toupper and -_tolower. If you initialized _M_toupper and -_M_tolower above, then you could use those tables instead. - -

Finally, you have to provide two utility functions that convert strings -of characters. The versions provided here will always work - but you -could use specialized routines for greater performance if you have -machinery to do that on your system: - -

     const char*
-     ctype<char>::do_toupper(char* __low, const char* __high) const
-     {
-       while (__low < __high)
-         {
-           *__low = do_toupper(*__low);
-           ++__low;
-         }
-       return __high;
-     }
-     
-     const char*
-     ctype<char>::do_tolower(char* __low, const char* __high) const
-     {
-       while (__low < __high)
-         {
-           *__low = do_tolower(*__low);
-           ++__low;
-         }
-       return __high;
-     }
-     
- -

You must also provide the ctype_inline.h file, which -contains a few more functions. On most systems, you can just copy -config/os/generic/ctype_inline.h and use it on your system. - -

In detail, the functions provided test characters for particular -properties; they are analogous to the functions like isalpha and -islower provided by the C library. - -

The first function is implemented like this on IRIX: - -

     bool
-     ctype<char>::
-     is(mask __m, char __c) const throw()
-     { return (_M_table)[(unsigned char)(__c)] & __m; }
-     
- -

The _M_table is the table passed in above, in the constructor. -This is the table that contains the bitmasks for each character. The -implementation here should work on all systems. - -

The next function is: - -

     const char*
-     ctype<char>::
-     is(const char* __low, const char* __high, mask* __vec) const throw()
-     {
-       while (__low < __high)
-         *__vec++ = (_M_table)[(unsigned char)(*__low++)];
-       return __high;
-     }
-     
- -

This function is similar; it copies the masks for all the characters -from __low up until __high into the vector given by -__vec. - -

The last two functions again are entirely generic: - -

     const char*
-     ctype<char>::
-     scan_is(mask __m, const char* __low, const char* __high) const throw()
-     {
-       while (__low < __high && !this->is(__m, *__low))
-         ++__low;
-       return __low;
-     }
-     
-     const char*
-     ctype<char>::
-     scan_not(mask __m, const char* __low, const char* __high) const throw()
-     {
-       while (__low < __high && this->is(__m, *__low))
-         ++__low;
-       return __low;
-     }
-     
- -
-


-Node: Thread safety, -Next: , -Previous: Character types, -Up: Top -
-
- -

Thread safety

- -

The C++ library string functionality requires a couple of atomic -operations to provide thread-safety. If you don't take any special -action, the library will use stub versions of these functions that are -not thread-safe. They will work fine, unless your applications are -multi-threaded. - -

If you want to provide custom, safe, versions of these functions, there -are two distinct approaches. One is to provide a version for your CPU, -using assembly language constructs. The other is to use the -thread-safety primitives in your operating system. In either case, you -make a file called atomicity.h, and the variable -ATOMICITYH must point to this file. - -

If you are using the assembly-language approach, put this code in -config/cpu/<chip>/atomicity.h, where chip is the name of -your processor (see CPU). No additional changes are necessary to -locate the file in this case; ATOMICITYH will be set by default. - -

If you are using the operating system thread-safety primitives approach, -you can also put this code in the same CPU directory, in which case no more -work is needed to locate the file. For examples of this approach, -see the atomicity.h file for IRIX or IA64. - -

Alternatively, if the primitives are more closely related to the OS -than they are to the CPU, you can put the atomicity.h file in -the Operating system directory instead. In this case, you must -edit configure.host, and in the switch statement that handles -operating systems, override the ATOMICITYH variable to point to -the appropriate os_include_dir. For examples of this approach, -see the atomicity.h file for AIX. - -

With those bits out of the way, you have to actually write -atomicity.h itself. This file should be wrapped in an -include guard named _GLIBCXX_ATOMICITY_H. It should define one -type, and two functions. - -

The type is _Atomic_word. Here is the version used on IRIX: - -

     typedef long _Atomic_word;
-     
- -

This type must be a signed integral type supporting atomic operations. -If you're using the OS approach, use the same type used by your system's -primitives. Otherwise, use the type for which your CPU provides atomic -primitives. - -

Then, you must provide two functions. The bodies of these functions -must be equivalent to those provided here, but using atomic operations: - -

     static inline _Atomic_word
-     __attribute__ ((__unused__))
-     __exchange_and_add (_Atomic_word* __mem, int __val)
-     {
-       _Atomic_word __result = *__mem;
-       *__mem += __val;
-       return __result;
-     }
-     
-     static inline void
-     __attribute__ ((__unused__))
-     __atomic_add (_Atomic_word* __mem, int __val)
-     {
-       *__mem += __val;
-     }
-     
- -
-


-Node: Numeric limits, -Next: , -Previous: Thread safety, -Up: Top -
-
- -

Numeric limits

- -

The C++ library requires information about the fundamental data types, -such as the minimum and maximum representable values of each type. -You can define each of these values individually, but it is usually -easiest just to indicate how many bits are used in each of the data -types and let the library do the rest. For information about the -macros to define, see the top of include/bits/std_limits.h. - -

If you need to define any macros, you can do so in os_defines.h. -However, if all operating systems for your CPU are likely to use the -same values, you can provide a CPU-specific file instead so that you -do not have to provide the same definitions for each operating system. -To take that approach, create a new file called cpu_limits.h in -your CPU configuration directory (see CPU). - -

-


-Node: Libtool, -Next: , -Previous: Numeric limits, -Up: Top -
-
- -

Libtool

- -

The C++ library is compiled, archived and linked with libtool. -Explaining the full workings of libtool is beyond the scope of this -document, but there are a few, particular bits that are necessary for -porting. - -

Some parts of the libstdc++ library are compiled with the libtool ---tags CXX option (the C++ definitions for libtool). Therefore, -ltcf-cxx.sh in the top-level directory needs to have the correct -logic to compile and archive objects equivalent to the C version of libtool, -ltcf-c.sh. Some libtool targets have definitions for C but not -for C++, or C++ definitions which have not been kept up to date. - -

The C++ run-time library contains initialization code that needs to be -run as the library is loaded. Often, that requires linking in special -object files when the C++ library is built as a shared library, or -taking other system-specific actions. - -

The libstdc++ library is linked with the C version of libtool, even -though it is a C++ library. Therefore, the C version of libtool needs to -ensure that the run-time library initializers are run. The usual way to -do this is to build the library using gcc -shared. - -

If you need to change how the library is linked, look at -ltcf-c.sh in the top-level directory. Find the switch statement -that sets archive_cmds. Here, adjust the setting for your -operating system. - -

-


-Node: GNU Free Documentation License, -Previous: Libtool, -Up: Top -
-
- -

GNU Free Documentation License

- -
Version 1.2, November 2002
-
     Copyright © 2000,2001,2002 Free Software Foundation, Inc.
-     51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
-     
-     Everyone is permitted to copy and distribute verbatim copies
-     of this license document, but changing it is not allowed.
-     
- -
    -
  1. PREAMBLE - -

    The purpose of this License is to make a manual, textbook, or other -functional and useful document free in the sense of freedom: to -assure everyone the effective freedom to copy and redistribute it, -with or without modifying it, either commercially or noncommercially. -Secondarily, this License preserves for the author and publisher a way -to get credit for their work, while not being considered responsible -for modifications made by others. - -

    This License is a kind of "copyleft", which means that derivative -works of the document must themselves be free in the same sense. It -complements the GNU General Public License, which is a copyleft -license designed for free software. - -

    We have designed this License in order to use it for manuals for free -software, because free software needs free documentation: a free -program should come with manuals providing the same freedoms that the -software does. But this License is not limited to software manuals; -it can be used for any textual work, regardless of subject matter or -whether it is published as a printed book. We recommend this License -principally for works whose purpose is instruction or reference. - -

  2. APPLICABILITY AND DEFINITIONS - -

    This License applies to any manual or other work, in any medium, that -contains a notice placed by the copyright holder saying it can be -distributed under the terms of this License. Such a notice grants a -world-wide, royalty-free license, unlimited in duration, to use that -work under the conditions stated herein. The "Document", below, -refers to any such manual or work. Any member of the public is a -licensee, and is addressed as "you". You accept the license if you -copy, modify or distribute the work in a way requiring permission -under copyright law. - -

    A "Modified Version" of the Document means any work containing the -Document or a portion of it, either copied verbatim, or with -modifications and/or translated into another language. - -

    A "Secondary Section" is a named appendix or a front-matter section -of the Document that deals exclusively with the relationship of the -publishers or authors of the Document to the Document's overall -subject (or to related matters) and contains nothing that could fall -directly within that overall subject. (Thus, if the Document is in -part a textbook of mathematics, a Secondary Section may not explain -any mathematics.) The relationship could be a matter of historical -connection with the subject or with related matters, or of legal, -commercial, philosophical, ethical or political position regarding -them. - -

    The "Invariant Sections" are certain Secondary Sections whose titles -are designated, as being those of Invariant Sections, in the notice -that says that the Document is released under this License. If a -section does not fit the above definition of Secondary then it is not -allowed to be designated as Invariant. The Document may contain zero -Invariant Sections. If the Document does not identify any Invariant -Sections then there are none. - -

    The "Cover Texts" are certain short passages of text that are listed, -as Front-Cover Texts or Back-Cover Texts, in the notice that says that -the Document is released under this License. A Front-Cover Text may -be at most 5 words, and a Back-Cover Text may be at most 25 words. - -

    A "Transparent" copy of the Document means a machine-readable copy, -represented in a format whose specification is available to the -general public, that is suitable for revising the document -straightforwardly with generic text editors or (for images composed of -pixels) generic paint programs or (for drawings) some widely available -drawing editor, and that is suitable for input to text formatters or -for automatic translation to a variety of formats suitable for input -to text formatters. A copy made in an otherwise Transparent file -format whose markup, or absence of markup, has been arranged to thwart -or discourage subsequent modification by readers is not Transparent. -An image format is not Transparent if used for any substantial amount -of text. A copy that is not "Transparent" is called "Opaque". - -

    Examples of suitable formats for Transparent copies include plain -ASCII without markup, Texinfo input format, LaTeX input -format, SGML or XML using a publicly available -DTD, and standard-conforming simple HTML, -PostScript or PDF designed for human modification. Examples -of transparent image formats include PNG, XCF and -JPG. Opaque formats include proprietary formats that can be -read and edited only by proprietary word processors, SGML or -XML for which the DTD and/or processing tools are -not generally available, and the machine-generated HTML, -PostScript or PDF produced by some word processors for -output purposes only. - -

    The "Title Page" means, for a printed book, the title page itself, -plus such following pages as are needed to hold, legibly, the material -this License requires to appear in the title page. For works in -formats which do not have any title page as such, "Title Page" means -the text near the most prominent appearance of the work's title, -preceding the beginning of the body of the text. - -

    A section "Entitled XYZ" means a named subunit of the Document whose -title either is precisely XYZ or contains XYZ in parentheses following -text that translates XYZ in another language. (Here XYZ stands for a -specific section name mentioned below, such as "Acknowledgements", -"Dedications", "Endorsements", or "History".) To "Preserve the Title" -of such a section when you modify the Document means that it remains a -section "Entitled XYZ" according to this definition. - -

    The Document may include Warranty Disclaimers next to the notice which -states that this License applies to the Document. These Warranty -Disclaimers are considered to be included by reference in this -License, but only as regards disclaiming warranties: any other -implication that these Warranty Disclaimers may have is void and has -no effect on the meaning of this License. - -

  3. VERBATIM COPYING - -

    You may copy and distribute the Document in any medium, either -commercially or noncommercially, provided that this License, the -copyright notices, and the license notice saying this License applies -to the Document are reproduced in all copies, and that you add no other -conditions whatsoever to those of this License. You may not use -technical measures to obstruct or control the reading or further -copying of the copies you make or distribute. However, you may accept -compensation in exchange for copies. If you distribute a large enough -number of copies you must also follow the conditions in section 3. - -

    You may also lend copies, under the same conditions stated above, and -you may publicly display copies. - -

  4. COPYING IN QUANTITY - -

    If you publish printed copies (or copies in media that commonly have -printed covers) of the Document, numbering more than 100, and the -Document's license notice requires Cover Texts, you must enclose the -copies in covers that carry, clearly and legibly, all these Cover -Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on -the back cover. Both covers must also clearly and legibly identify -you as the publisher of these copies. The front cover must present -the full title with all words of the title equally prominent and -visible. You may add other material on the covers in addition. -Copying with changes limited to the covers, as long as they preserve -the title of the Document and satisfy these conditions, can be treated -as verbatim copying in other respects. - -

    If the required texts for either cover are too voluminous to fit -legibly, you should put the first ones listed (as many as fit -reasonably) on the actual cover, and continue the rest onto adjacent -pages. - -

    If you publish or distribute Opaque copies of the Document numbering -more than 100, you must either include a machine-readable Transparent -copy along with each Opaque copy, or state in or with each Opaque copy -a computer-network location from which the general network-using -public has access to download using public-standard network protocols -a complete Transparent copy of the Document, free of added material. -If you use the latter option, you must take reasonably prudent steps, -when you begin distribution of Opaque copies in quantity, to ensure -that this Transparent copy will remain thus accessible at the stated -location until at least one year after the last time you distribute an -Opaque copy (directly or through your agents or retailers) of that -edition to the public. - -

    It is requested, but not required, that you contact the authors of the -Document well before redistributing any large number of copies, to give -them a chance to provide you with an updated version of the Document. - -

  5. MODIFICATIONS - -

    You may copy and distribute a Modified Version of the Document under -the conditions of sections 2 and 3 above, provided that you release -the Modified Version under precisely this License, with the Modified -Version filling the role of the Document, thus licensing distribution -and modification of the Modified Version to whoever possesses a copy -of it. In addition, you must do these things in the Modified Version: - -

      -
    1. Use in the Title Page (and on the covers, if any) a title distinct -from that of the Document, and from those of previous versions -(which should, if there were any, be listed in the History section -of the Document). You may use the same title as a previous version -if the original publisher of that version gives permission. - -
    2. List on the Title Page, as authors, one or more persons or entities -responsible for authorship of the modifications in the Modified -Version, together with at least five of the principal authors of the -Document (all of its principal authors, if it has fewer than five), -unless they release you from this requirement. - -
    3. State on the Title page the name of the publisher of the -Modified Version, as the publisher. - -
    4. Preserve all the copyright notices of the Document. - -
    5. Add an appropriate copyright notice for your modifications -adjacent to the other copyright notices. - -
    6. Include, immediately after the copyright notices, a license notice -giving the public permission to use the Modified Version under the -terms of this License, in the form shown in the Addendum below. - -
    7. Preserve in that license notice the full lists of Invariant Sections -and required Cover Texts given in the Document's license notice. - -
    8. Include an unaltered copy of this License. - -
    9. Preserve the section Entitled "History", Preserve its Title, and add -to it an item stating at least the title, year, new authors, and -publisher of the Modified Version as given on the Title Page. If -there is no section Entitled "History" in the Document, create one -stating the title, year, authors, and publisher of the Document as -given on its Title Page, then add an item describing the Modified -Version as stated in the previous sentence. - -
    10. Preserve the network location, if any, given in the Document for -public access to a Transparent copy of the Document, and likewise -the network locations given in the Document for previous versions -it was based on. These may be placed in the "History" section. -You may omit a network location for a work that was published at -least four years before the Document itself, or if the original -publisher of the version it refers to gives permission. - -
    11. For any section Entitled "Acknowledgements" or "Dedications", Preserve -the Title of the section, and preserve in the section all the -substance and tone of each of the contributor acknowledgements and/or -dedications given therein. - -
    12. Preserve all the Invariant Sections of the Document, -unaltered in their text and in their titles. Section numbers -or the equivalent are not considered part of the section titles. - -
    13. Delete any section Entitled "Endorsements". Such a section -may not be included in the Modified Version. - -
    14. Do not retitle any existing section to be Entitled "Endorsements" or -to conflict in title with any Invariant Section. - -
    15. Preserve any Warranty Disclaimers. -
    - -

    If the Modified Version includes new front-matter sections or -appendices that qualify as Secondary Sections and contain no material -copied from the Document, you may at your option designate some or all -of these sections as invariant. To do this, add their titles to the -list of Invariant Sections in the Modified Version's license notice. -These titles must be distinct from any other section titles. - -

    You may add a section Entitled "Endorsements", provided it contains -nothing but endorsements of your Modified Version by various -parties--for example, statements of peer review or that the text has -been approved by an organization as the authoritative definition of a -standard. - -

    You may add a passage of up to five words as a Front-Cover Text, and a -passage of up to 25 words as a Back-Cover Text, to the end of the list -of Cover Texts in the Modified Version. Only one passage of -Front-Cover Text and one of Back-Cover Text may be added by (or -through arrangements made by) any one entity. If the Document already -includes a cover text for the same cover, previously added by you or -by arrangement made by the same entity you are acting on behalf of, -you may not add another; but you may replace the old one, on explicit -permission from the previous publisher that added the old one. - -

    The author(s) and publisher(s) of the Document do not by this License -give permission to use their names for publicity for or to assert or -imply endorsement of any Modified Version. - -

  6. COMBINING DOCUMENTS - -

    You may combine the Document with other documents released under this -License, under the terms defined in section 4 above for modified -versions, provided that you include in the combination all of the -Invariant Sections of all of the original documents, unmodified, and -list them all as Invariant Sections of your combined work in its -license notice, and that you preserve all their Warranty Disclaimers. - -

    The combined work need only contain one copy of this License, and -multiple identical Invariant Sections may be replaced with a single -copy. If there are multiple Invariant Sections with the same name but -different contents, make the title of each such section unique by -adding at the end of it, in parentheses, the name of the original -author or publisher of that section if known, or else a unique number. -Make the same adjustment to the section titles in the list of -Invariant Sections in the license notice of the combined work. - -

    In the combination, you must combine any sections Entitled "History" -in the various original documents, forming one section Entitled -"History"; likewise combine any sections Entitled "Acknowledgements", -and any sections Entitled "Dedications". You must delete all -sections Entitled "Endorsements." - -

  7. COLLECTIONS OF DOCUMENTS - -

    You may make a collection consisting of the Document and other documents -released under this License, and replace the individual copies of this -License in the various documents with a single copy that is included in -the collection, provided that you follow the rules of this License for -verbatim copying of each of the documents in all other respects. - -

    You may extract a single document from such a collection, and distribute -it individually under this License, provided you insert a copy of this -License into the extracted document, and follow this License in all -other respects regarding verbatim copying of that document. - -

  8. AGGREGATION WITH INDEPENDENT WORKS - -

    A compilation of the Document or its derivatives with other separate -and independent documents or works, in or on a volume of a storage or -distribution medium, is called an "aggregate" if the copyright -resulting from the compilation is not used to limit the legal rights -of the compilation's users beyond what the individual works permit. -When the Document is included an aggregate, this License does not -apply to the other works in the aggregate which are not themselves -derivative works of the Document. - -

    If the Cover Text requirement of section 3 is applicable to these -copies of the Document, then if the Document is less than one half of -the entire aggregate, the Document's Cover Texts may be placed on -covers that bracket the Document within the aggregate, or the -electronic equivalent of covers if the Document is in electronic form. -Otherwise they must appear on printed covers that bracket the whole -aggregate. - -

  9. TRANSLATION - -

    Translation is considered a kind of modification, so you may -distribute translations of the Document under the terms of section 4. -Replacing Invariant Sections with translations requires special -permission from their copyright holders, but you may include -translations of some or all Invariant Sections in addition to the -original versions of these Invariant Sections. You may include a -translation of this License, and all the license notices in the -Document, and any Warrany Disclaimers, provided that you also include -the original English version of this License and the original versions -of those notices and disclaimers. In case of a disagreement between -the translation and the original version of this License or a notice -or disclaimer, the original version will prevail. - -

    If a section in the Document is Entitled "Acknowledgements", -"Dedications", or "History", the requirement (section 4) to Preserve -its Title (section 1) will typically require changing the actual -title. - -

  10. TERMINATION - -

    You may not copy, modify, sublicense, or distribute the Document except -as expressly provided for under this License. Any other attempt to -copy, modify, sublicense or distribute the Document is void, and will -automatically terminate your rights under this License. However, -parties who have received copies, or rights, from you under this -License will not have their licenses terminated so long as such -parties remain in full compliance. - -

  11. FUTURE REVISIONS OF THIS LICENSE - -

    The Free Software Foundation may publish new, revised versions -of the GNU Free Documentation License from time to time. Such new -versions will be similar in spirit to the present version, but may -differ in detail to address new problems or concerns. See -http://www.gnu.org/copyleft/. - -

    Each version of the License is given a distinguishing version number. -If the Document specifies that a particular numbered version of this -License "or any later version" applies to it, you have the option of -following the terms and conditions either of that specified version or -of any later version that has been published (not as a draft) by the -Free Software Foundation. If the Document does not specify a version -number of this License, you may choose any version ever published (not -as a draft) by the Free Software Foundation. -

- -

ADDENDUM: How to use this License for your documents

- -

To use this License in a document you have written, include a copy of -the License in the document and put the following copyright and -license notices just after the title page: - -

       Copyright (C)  year  your name.
-       Permission is granted to copy, distribute and/or modify this document
-       under the terms of the GNU Free Documentation License, Version 1.2
-       or any later version published by the Free Software Foundation;
-       with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
-       A copy of the license is included in the section entitled ``GNU
-       Free Documentation License''.
-     
- -

If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts, -replace the "with...Texts." line with this: - -

         with the Invariant Sections being list their titles, with
-         the Front-Cover Texts being list, and with the Back-Cover Texts
-         being list.
-     
- -

If you have Invariant Sections without Cover Texts, or some other -combination of the three, merge those two alternatives to suit the -situation. - -

If your document contains nontrivial examples of program code, we -recommend releasing these examples in parallel under your choice of -free software license, such as the GNU General Public License, -to permit their use in free software. - - -

- - - diff --git a/libstdc++-v3/docs/html/17_intro/porting.texi b/libstdc++-v3/docs/html/17_intro/porting.texi deleted file mode 100644 index 090bdf77155..00000000000 --- a/libstdc++-v3/docs/html/17_intro/porting.texi +++ /dev/null @@ -1,570 +0,0 @@ -\input texinfo - -@c --------------------------------------------------------------------- -@c Prologue -@c --------------------------------------------------------------------- - -@setfilename porting.info -@settitle Porting libstdc++-v3 -@setchapternewpage odd - -@copying -Copyright @copyright{} 2000, 2001, 2002, 2003, 2005 -Free Software Foundation, Inc. - -Permission is granted to copy, distribute and/or modify this document -under the terms of the GNU Free Documentation License, Version 1.2 or -any later version published by the Free Software Foundation; with the -Invariant Sections being ``GNU General Public License'', the Front-Cover -texts being (a) (see below), and with the Back-Cover Texts being (b) -(see below). A copy of the license is included in the section entitled -``GNU Free Documentation License''. - -(a) The FSF's Front-Cover Text is: - - A GNU Manual - -(b) The FSF's Back-Cover Text is: - - You have freedom to copy and modify this GNU Manual, like GNU - software. Copies published by the Free Software Foundation raise - funds for GNU development. -@end copying - -@ifinfo -This file explains how to port libstdc++-v3 (the GNU C++ library) to -a new target. - -@insertcopying -@end ifinfo - -@c --------------------------------------------------------------------- -@c Titlepage -@c --------------------------------------------------------------------- - -@titlepage -@title Porting libstdc++-v3 -@author Mark Mitchell -@page -@vskip 0pt plus 1filll -@insertcopying -@end titlepage - -@c --------------------------------------------------------------------- -@c Top -@c --------------------------------------------------------------------- - -@node Top -@top Porting libstdc++-v3 - -This document explains how to port libstdc++-v3 (the GNU C++ library) to -a new target. - -In order to make the GNU C++ library (libstdc++-v3) work with a new -target, you must edit some configuration files and provide some new -header files. Unless this is done, libstdc++-v3 will use generic -settings which may not be correct for your target; even if they are -correct, they will likely be inefficient. - -Before you get started, make sure that you have a working C library on -your target. The C library need not precisely comply with any -particular standard, but should generally conform to the requirements -imposed by the ANSI/ISO standard. - -In addition, you should try to verify that the C++ compiler generally -works. It is difficult to test the C++ compiler without a working -library, but you should at least try some minimal test cases. - -(Note that what we think of as a ``target,'' the library refers to as -a ``host.'' The comment at the top of @file{configure.ac} explains why.) - -Here are the primary steps required to port the library: - -@menu -* Operating system:: Configuring for your operating system. -* CPU:: Configuring for your processor chip. -* Character types:: Implementing character classification. -* Thread safety:: Implementing atomic operations. -* Numeric limits:: Implementing numeric limits. -* Libtool:: Using libtool. -* GNU Free Documentation License:: How you can copy and share this manual. -@end menu - -@c --------------------------------------------------------------------- -@c Operating system -@c --------------------------------------------------------------------- - -@node Operating system -@chapter Operating system - -If you are porting to a new operating system (as opposed to a new chip -using an existing operating system), you will need to create a new -directory in the @file{config/os} hierarchy. For example, the IRIX -configuration files are all in @file{config/os/irix}. There is no set -way to organize the OS configuration directory. For example, -@file{config/os/solaris/solaris-2.6} and -@file{config/os/solaris/solaris-2.7} are used as configuration -directories for these two versions of Solaris. On the other hand, both -Solaris 2.7 and Solaris 2.8 use the @file{config/os/solaris/solaris-2.7} -directory. The important information is that there needs to be a -directory under @file{config/os} to store the files for your operating -system. - -You might have to change the @file{configure.host} file to ensure that -your new directory is activated. Look for the switch statement that sets -@code{os_include_dir}, and add a pattern to handle your operating system -if the default will not suffice. The switch statement switches on only -the OS portion of the standard target triplet; e.g., the @code{solaris2.8} -in @code{sparc-sun-solaris2.8}. If the new directory is named after the -OS portion of the triplet (the default), then nothing needs to be changed. - -The first file to create in this directory, should be called -@file{os_defines.h}. This file contains basic macro definitions -that are required to allow the C++ library to work with your C library. - -Several libstdc++-v3 source files unconditionally define the macro -@code{_POSIX_SOURCE}. On many systems, defining this macro causes -large portions of the C library header files to be eliminated -at preprocessing time. Therefore, you may have to @code{#undef} this -macro, or define other macros (like @code{_LARGEFILE_SOURCE} or -@code{__EXTENSIONS__}). You won't know what macros to define or -undefine at this point; you'll have to try compiling the library and -seeing what goes wrong. If you see errors about calling functions -that have not been declared, look in your C library headers to see if -the functions are declared there, and then figure out what macros you -need to define. You will need to add them to the -@code{CPLUSPLUS_CPP_SPEC} macro in the GCC configuration file for your -target. It will not work to simply define these macros in -@file{os_defines.h}. - -At this time, there are a few libstdc++-v3-specific macros which may be -defined: - -@code{_GLIBCXX_USE_C99_CHECK} may be defined to 1 to check C99 -function declarations (which are not covered by specialization below) -found in system headers against versions found in the library headers -derived from the standard. - -@code{_GLIBCXX_USE_C99_DYNAMIC} may be defined to an expression that -yields 0 if and only if the system headers are exposing proper support -for C99 functions (which are not covered by specialization below). If -defined, it must be 0 while bootstrapping the compiler/rebuilding the -library. - -@code{_GLIBCXX_USE_C99_LONG_LONG_CHECK} may be defined to 1 to check -the set of C99 long long function declarations found in system headers -against versions found in the library headers derived from the -standard. - -@code{_GLIBCXX_USE_C99_LONG_LONG_DYNAMIC} may be defined to an -expression that yields 0 if and only if the system headers are -exposing proper support for the set of C99 long long functions. If -defined, it must be 0 while bootstrapping the compiler/rebuilding the -library. - -@code{_GLIBCXX_USE_C99_FP_MACROS_DYNAMIC} may be defined to an -expression that yields 0 if and only if the system headers -are exposing proper support for the related set of macros. If defined, -it must be 0 while bootstrapping the compiler/rebuilding the library. - -@code{_GLIBCXX_USE_C99_FLOAT_TRANSCENDENTALS_CHECK} may be defined -to 1 to check the related set of function declarations found in system -headers against versions found in the library headers derived from -the standard. - -@code{_GLIBCXX_USE_C99_FLOAT_TRANSCENDENTALS_DYNAMIC} may be defined -to an expression that yields 0 if and only if the system headers -are exposing proper support for the related set of functions. If defined, -it must be 0 while bootstrapping the compiler/rebuilding the library. - -Finally, you should bracket the entire file in an include-guard, like -this: - -@example -#ifndef _GLIBCXX_OS_DEFINES -#define _GLIBCXX_OS_DEFINES -... -#endif -@end example - -We recommend copying an existing @file{os_defines.h} to use as a -starting point. - -@c --------------------------------------------------------------------- -@c CPU -@c --------------------------------------------------------------------- - -@node CPU -@chapter CPU - -If you are porting to a new chip (as opposed to a new operating system -running on an existing chip), you will need to create a new directory in the -@file{config/cpu} hierarchy. Much like the @ref{Operating system} setup, -there are no strict rules on how to organize the CPU configuration -directory, but careful naming choices will allow the configury to find your -setup files without explicit help. - -We recommend that for a target triplet @code{--}, you -name your configuration directory @file{config/cpu/}. If you do this, -the configury will find the directory by itself. Otherwise you will need to -edit the @file{configure.host} file and, in the switch statement that sets -@code{cpu_include_dir}, add a pattern to handle your chip. - -Note that some chip families share a single configuration directory, for -example, @code{alpha}, @code{alphaev5}, and @code{alphaev6} all use the -@file{config/cpu/alpha} directory, and there is an entry in the -@file{configure.host} switch statement to handle this. - -The @code{cpu_include_dir} sets default locations for the files controlling -@ref{Thread safety} and @ref{Numeric limits}, if the defaults are not -appropriate for your chip. - - -@c --------------------------------------------------------------------- -@c Character types -@c --------------------------------------------------------------------- - -@node Character types -@chapter Character types - -The library requires that you provide three header files to implement -character classification, analogous to that provided by the C libraries -@file{} header. You can model these on the files provided in -@file{config/os/generic}. However, these files will almost -certainly need some modification. - -The first file to write is @file{ctype_base.h}. This file provides -some very basic information about character classification. The libstdc++-v3 -library assumes that your C library implements @file{} by using -a table (indexed by character code) containing integers, where each of -these integers is a bit-mask indicating whether the character is -upper-case, lower-case, alphabetic, etc. The @file{ctype_base.h} -file gives the type of the integer, and the values of the various bit -masks. You will have to peer at your own @file{} to figure out -how to define the values required by this file. - -The @file{ctype_base.h} header file does not need include guards. -It should contain a single @code{struct} definition called -@code{ctype_base}. This @code{struct} should contain two type -declarations, and one enumeration declaration, like this example, taken -from the IRIX configuration: - -@example -struct ctype_base -@{ - typedef unsigned int mask; - typedef int* __to_type; - - enum - @{ - space = _ISspace, - print = _ISprint, - cntrl = _IScntrl, - upper = _ISupper, - lower = _ISlower, - alpha = _ISalpha, - digit = _ISdigit, - punct = _ISpunct, - xdigit = _ISxdigit, - alnum = _ISalnum, - graph = _ISgraph - @}; -@}; -@end example - -@noindent -The @code{mask} type is the type of the elements in the table. If your -C library uses a table to map lower-case numbers to upper-case numbers, -and vice versa, you should define @code{__to_type} to be the type of the -elements in that table. If you don't mind taking a minor performance -penalty, or if your library doesn't implement @code{toupper} and -@code{tolower} in this way, you can pick any pointer-to-integer type, -but you must still define the type. - -The enumeration should give definitions for all the values in the above -example, using the values from your native @file{}. They can -be given symbolically (as above), or numerically, if you prefer. You do -not have to include @file{} in this header; it will always be -included before @file{ctype_base.h} is included. - -The next file to write is @file{ctype_noninline.h}, which also does -not require include guards. This file defines a few member functions -that will be included in @file{include/bits/locale_facets.h}. The first -function that must be written is the @code{ctype::ctype} -constructor. Here is the IRIX example: - -@example -ctype::ctype(const mask* __table = 0, bool __del = false, - size_t __refs = 0) - : _Ctype_nois(__refs), _M_del(__table != 0 && __del), - _M_toupper(NULL), - _M_tolower(NULL), - _M_ctable(NULL), - _M_table(!__table - ? (const mask*) (__libc_attr._ctype_tbl->_class + 1) - : __table) - @{ @} -@end example - -@noindent -There are two parts of this that you might choose to alter. The first, -and most important, is the line involving @code{__libc_attr}. That is -IRIX system-dependent code that gets the base of the table mapping -character codes to attributes. You need to substitute code that obtains -the address of this table on your system. If you want to use your -operating system's tables to map upper-case letters to lower-case, and -vice versa, you should initialize @code{_M_toupper} and -@code{_M_tolower} with those tables, in similar fashion. - -Now, you have to write two functions to convert from upper-case to -lower-case, and vice versa. Here are the IRIX versions: - -@example -char -ctype::do_toupper(char __c) const -@{ return _toupper(__c); @} - -char -ctype::do_tolower(char __c) const -@{ return _tolower(__c); @} -@end example - -@noindent -Your C library provides equivalents to IRIX's @code{_toupper} and -@code{_tolower}. If you initialized @code{_M_toupper} and -@code{_M_tolower} above, then you could use those tables instead. - -Finally, you have to provide two utility functions that convert strings -of characters. The versions provided here will always work -- but you -could use specialized routines for greater performance if you have -machinery to do that on your system: - -@example -const char* -ctype::do_toupper(char* __low, const char* __high) const -@{ - while (__low < __high) - @{ - *__low = do_toupper(*__low); - ++__low; - @} - return __high; -@} - -const char* -ctype::do_tolower(char* __low, const char* __high) const -@{ - while (__low < __high) - @{ - *__low = do_tolower(*__low); - ++__low; - @} - return __high; -@} -@end example - -You must also provide the @file{ctype_inline.h} file, which -contains a few more functions. On most systems, you can just copy -@file{config/os/generic/ctype_inline.h} and use it on your system. - -In detail, the functions provided test characters for particular -properties; they are analogous to the functions like @code{isalpha} and -@code{islower} provided by the C library. - -The first function is implemented like this on IRIX: - -@example -bool -ctype:: -is(mask __m, char __c) const throw() -@{ return (_M_table)[(unsigned char)(__c)] & __m; @} -@end example - -@noindent -The @code{_M_table} is the table passed in above, in the constructor. -This is the table that contains the bitmasks for each character. The -implementation here should work on all systems. - -The next function is: - -@example -const char* -ctype:: -is(const char* __low, const char* __high, mask* __vec) const throw() -@{ - while (__low < __high) - *__vec++ = (_M_table)[(unsigned char)(*__low++)]; - return __high; -@} -@end example - -@noindent -This function is similar; it copies the masks for all the characters -from @code{__low} up until @code{__high} into the vector given by -@code{__vec}. - -The last two functions again are entirely generic: - -@example -const char* -ctype:: -scan_is(mask __m, const char* __low, const char* __high) const throw() -@{ - while (__low < __high && !this->is(__m, *__low)) - ++__low; - return __low; -@} - -const char* -ctype:: -scan_not(mask __m, const char* __low, const char* __high) const throw() -@{ - while (__low < __high && this->is(__m, *__low)) - ++__low; - return __low; -@} -@end example - -@c --------------------------------------------------------------------- -@c Thread safety -@c --------------------------------------------------------------------- - -@node Thread safety -@chapter Thread safety - -The C++ library string functionality requires a couple of atomic -operations to provide thread-safety. If you don't take any special -action, the library will use stub versions of these functions that are -not thread-safe. They will work fine, unless your applications are -multi-threaded. - -If you want to provide custom, safe, versions of these functions, there -are two distinct approaches. One is to provide a version for your CPU, -using assembly language constructs. The other is to use the -thread-safety primitives in your operating system. In either case, you -make a file called @file{atomicity.h}, and the variable -@code{ATOMICITYH} must point to this file. - -If you are using the assembly-language approach, put this code in -@file{config/cpu//atomicity.h}, where chip is the name of -your processor (@pxref{CPU}). No additional changes are necessary to -locate the file in this case; @code{ATOMICITYH} will be set by default. - -If you are using the operating system thread-safety primitives approach, -you can also put this code in the same CPU directory, in which case no more -work is needed to locate the file. For examples of this approach, -see the @file{atomicity.h} file for IRIX or IA64. - -Alternatively, if the primitives are more closely related to the OS -than they are to the CPU, you can put the @file{atomicity.h} file in -the @ref{Operating system} directory instead. In this case, you must -edit @file{configure.host}, and in the switch statement that handles -operating systems, override the @code{ATOMICITYH} variable to point to -the appropriate @code{os_include_dir}. For examples of this approach, -see the @file{atomicity.h} file for AIX. - -With those bits out of the way, you have to actually write -@file{atomicity.h} itself. This file should be wrapped in an -include guard named @code{_GLIBCXX_ATOMICITY_H}. It should define one -type, and two functions. - -The type is @code{_Atomic_word}. Here is the version used on IRIX: - -@example -typedef long _Atomic_word; -@end example - -@noindent -This type must be a signed integral type supporting atomic operations. -If you're using the OS approach, use the same type used by your system's -primitives. Otherwise, use the type for which your CPU provides atomic -primitives. - -Then, you must provide two functions. The bodies of these functions -must be equivalent to those provided here, but using atomic operations: - -@example -static inline _Atomic_word -__attribute__ ((__unused__)) -__exchange_and_add (_Atomic_word* __mem, int __val) -@{ - _Atomic_word __result = *__mem; - *__mem += __val; - return __result; -@} - -static inline void -__attribute__ ((__unused__)) -__atomic_add (_Atomic_word* __mem, int __val) -@{ - *__mem += __val; -@} -@end example - -@c --------------------------------------------------------------------- -@c Numeric limits -@c --------------------------------------------------------------------- - -@node Numeric limits -@chapter Numeric limits - -The C++ library requires information about the fundamental data types, -such as the minimum and maximum representable values of each type. -You can define each of these values individually, but it is usually -easiest just to indicate how many bits are used in each of the data -types and let the library do the rest. For information about the -macros to define, see the top of @file{include/bits/std_limits.h}. - -If you need to define any macros, you can do so in @file{os_defines.h}. -However, if all operating systems for your CPU are likely to use the -same values, you can provide a CPU-specific file instead so that you -do not have to provide the same definitions for each operating system. -To take that approach, create a new file called @file{cpu_limits.h} in -your CPU configuration directory (@pxref{CPU}). - -@c --------------------------------------------------------------------- -@c Libtool -@c --------------------------------------------------------------------- - -@node Libtool -@chapter Libtool - -The C++ library is compiled, archived and linked with libtool. -Explaining the full workings of libtool is beyond the scope of this -document, but there are a few, particular bits that are necessary for -porting. - -Some parts of the libstdc++-v3 library are compiled with the libtool -@code{--tags CXX} option (the C++ definitions for libtool). Therefore, -@file{ltcf-cxx.sh} in the top-level directory needs to have the correct -logic to compile and archive objects equivalent to the C version of libtool, -@file{ltcf-c.sh}. Some libtool targets have definitions for C but not -for C++, or C++ definitions which have not been kept up to date. - -The C++ run-time library contains initialization code that needs to be -run as the library is loaded. Often, that requires linking in special -object files when the C++ library is built as a shared library, or -taking other system-specific actions. - -The libstdc++-v3 library is linked with the C version of libtool, even -though it is a C++ library. Therefore, the C version of libtool needs to -ensure that the run-time library initializers are run. The usual way to -do this is to build the library using @code{gcc -shared}. - -If you need to change how the library is linked, look at -@file{ltcf-c.sh} in the top-level directory. Find the switch statement -that sets @code{archive_cmds}. Here, adjust the setting for your -operating system. - -@c --------------------------------------------------------------------- -@c GFDL -@c --------------------------------------------------------------------- - -@include fdl.texi - -@c --------------------------------------------------------------------- -@c Epilogue -@c --------------------------------------------------------------------- - -@contents -@bye diff --git a/libstdc++-v3/docs/html/17_intro/tr1_status.html b/libstdc++-v3/docs/html/17_intro/tr1_status.html deleted file mode 100644 index 3d3d673cf89..00000000000 --- a/libstdc++-v3/docs/html/17_intro/tr1_status.html +++ /dev/null @@ -1,2322 +0,0 @@ - - - - - - - - - - - - Status of TR1 features in GCC - - GNU Project - Free Software Foundation (FSF) - - - - - - -

- Status of TR1 features in GCC -

- -

-This table is based on the table of contents of ISO/IEC DTR 19768 -Doc No: N1836=05-0096 Date: 2005-06-24 -Draft Technical Report on C++ Library Extensions -

- -

-In this implementation the header names are prefixed by -tr1/, for instance <tr1/functional>, -<tr1/memory>, and so on. -

- -

-This page describes the TR1 support in mainline GCC SVN, not in any particular -release. -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
SectionDescriptionDoneBrokenMissingComments
2General Utilities
2.1Reference wrappersdone
2.1.1Additions to header <functional> synopsisdone
2.1.2Class template reference_wrapperdone
2.1.2.1reference_wrapper construct/copy/destroydone
2.1.2.2reference_wrapper assignmentdone
2.1.2.3reference_wrapper accessdone
2.1.2.4reference_wrapper invocationdone
2.1.2.5reference_wrapper helper functionsdone
2.2Smart pointersdone
2.2.1Additions to header <memory> synopsisdone
2.2.2Class bad_weak_ptrdone
2.2.3Class template shared_ptrdone1
2.2.3.1shared_ptr constructorsdone
2.2.3.2shared_ptr destructordone
2.2.3.3shared_ptr assignmentdone
2.2.3.4shared_ptr modifiersdone
2.2.3.5shared_ptr observersdone
2.2.3.6shared_ptr comparisondone
2.2.3.7shared_ptr I/Odone
2.2.3.8shared_ptr specialized algorithmsdone
2.2.3.9shared_ptr castsdone
2.2.3.10get_deleterdone
2.2.4Class template weak_ptrdone
2.2.4.1weak_ptr constructorsdone
2.2.4.2weak_ptr destructordone
2.2.4.3weak_ptr assignmentdone
2.2.4.4weak_ptr modifiersdone
2.2.4.5weak_ptr observersdone
2.2.4.6weak_ptr comparisondone
2.2.4.7weak_ptr specialized algorithmsdone
2.2.5Class template enable_shared_from_thisdone
3Function objects
3.1Definitionsdone
3.2Additions to <functional> synopsisdone
3.3Requirementsdone
3.4Function return typesdone
3.5Function template mem_fndone
3.6Function object bindersdone
3.6.1Class template is_bind_expressiondone
3.6.2Class template is_placeholderdone
3.6.3Function template binddone
3.6.4Placeholdersdone
3.7Polymorphic function wrappersdone
3.7.1Class bad_function_calldone
3.7.1.1bad_function_call constructordone
3.7.2Class template functiondone
3.7.2.1function construct/copy/destroydone
3.7.2.2function modifiersdone
3.7.2.3function capacitydone
3.7.2.4function invocationdone
3.7.2.5function target accessdone
3.7.2.6undefined operatorsdone
3.7.2.7null pointer comparison operatorsdone
3.7.2.8specialized algorithmsdone
4Metaprogramming and type traits
4.1Requirementsdone
4.2Header <type_traits> synopsisdone
4.3Helper classesdone
4.4General Requirementsdone
4.5Unary Type Traitsdone
4.5.1Primary Type Categoriesdone
4.5.2Composite type traitsdone
4.5.3Type propertiesdone
4.6Relationships between typesdone
4.7Transformations between typesdone
4.7.1Const-volatile modificationsdone
4.7.2Reference modificationsdone
4.7.3Array modificationsdone
4.7.4Pointer modificationsdone
4.8Other transformationsdone
4.9Implementation requirementsdone
5Numerical facilities
5.1Random number generationdone
5.1.1Requirementsdone
5.1.2Header <random> synopsisdone
5.1.3Class template variate_generatordone
5.1.4Random number engine class templatesdone
5.1.4.1Class template linear_congruentialdone
5.1.4.2Class template mersenne_twisterdone
5.1.4.3Class template subtract_with_carrydone
5.1.4.4Class template subtract_with_carry_01done
5.1.4.5Class template discard_blockdone
5.1.4.6Class template xor_combinedoneoperator()() per N2079
5.1.5Engines with predefined parametersdone
5.1.6Class random_devicedone
5.1.7Random distribution class templatesdone
5.1.7.1Class template uniform_intdone
5.1.7.2Class bernoulli_distributiondone
5.1.7.3Class template geometric_distributiondone
5.1.7.4Class template poisson_distributiondone
5.1.7.5Class template binomial_distributiondone
5.1.7.6Class template uniform_realdone
5.1.7.7Class template exponential_distributiondone
5.1.7.8Class template normal_distributiondone
5.1.7.9Class template gamma_distributiondone
5.2Mathematical special functionsdone
5.2.1Additions to header <cmath> synopsisdone
5.2.1.1associated Laguerre polynomialsdone
5.2.1.2associated Legendre functionsdone
5.2.1.3beta functiondone
5.2.1.4(complete) elliptic integral of the first kinddone
5.2.1.5(complete) elliptic integral of the second kinddone
5.2.1.6(complete) elliptic integral of the third kinddone
5.2.1.7confluent hypergeometric functionsdone
5.2.1.8regular modified cylindrical Bessel functionsdone
5.2.1.9cylindrical Bessel functions (of the first kind)done
5.2.1.10irregular modified cylindrical Bessel functionsdone
5.2.1.11cylindrical Neumann functionsdone
5.2.1.12(incomplete) elliptic integral of the first kinddone
5.2.1.13(incomplete) elliptic integral of the second kinddone
5.2.1.14(incomplete) elliptic integral of the third kinddone
5.2.1.15exponential integraldone
5.2.1.16Hermite polynomialsdone
5.2.1.17hypergeometric functionsdone
5.2.1.18Laguerre polynomialsdone
5.2.1.19Legendre polynomialsdone
5.2.1.20Riemann zeta functiondone
5.2.1.21spherical Bessel functions (of the first kind)done
5.2.1.22spherical associated Legendre functionsdone
5.2.1.23spherical Neumann functionsdone
5.2.2Additions to header <math.h> synopsisdone
6Containers
6.1Tuple typesdone
6.1.1Header <tuple> synopsisdone
6.1.2Additions to header <utility> synopsisdone
6.1.3Class template tupledone
6.1.3.1Constructiondone
6.1.3.2Tuple creation functionsdone
6.1.3.3Tuple helper classesdone
6.1.3.4Element accessdone
6.1.3.5Relational operatorsdone
6.1.4Pairsdone
6.2Fixed size arraydone
6.2.1Header <array> synopsisdone
6.2.2Class template arraydone
6.2.2.1array constructors, copy, and assignmentdone
6.2.2.2array specialized algorithmsdone
6.2.2.3array sizedone
6.2.2.4Zero sized arraysdone
6.2.2.5Tuple interface to class template arraydone
6.3Unordered associative containersdone
6.3.1Unordered associative container requirementsdone
6.3.1.1Exception safety guaranteesdone
6.3.2Additions to header <functional> synopsisdone
6.3.3Class template hashdone
6.3.4Unordered associative container classesdone
6.3.4.1Header <unordered_set> synopsisdone
6.3.4.2Header <unordered_map> synopsisdone
6.3.4.3Class template unordered_setdone
6.3.4.3.1unordered_set constructorsdone
6.3.4.3.2unordered_set swapdone
6.3.4.4Class template unordered_mapdone
6.3.4.4.1unordered_map constructorsdone
6.3.4.4.2unordered_map element accessdone
6.3.4.4.3unordered_map swapdone
6.3.4.5Class template unordered_multisetdone
6.3.4.5.1unordered_multiset constructorsdone
6.3.4.5.2unordered_multiset swapdone
6.3.4.6Class template unordered_multimapdone
6.3.4.6.1unordered_multimap constructorsdone
6.3.4.6.2unordered_multimap swapdone
7Regular expressions
7.1Definitionsmissing
7.2Requirementsmissing
7.3Regular expressions summarymissing
7.4Header <regex> synopsismissing
7.5Namespace tr1::regex_constantsmissing
7.5.1Bitmask Type syntax_option_typemissing
7.5.2Bitmask Type regex_constants::match_flag_typemissing
7.5.3Implementation defined error_typemissing
7.6Class regex_errormissing
7.7Class template regex_traitsmissing
7.8Class template basic_regexmissing
7.8.1basic_regex constantsmissing
7.8.2basic_regex constructorsmissing
7.8.3basic_regex assignmissing
7.8.4basic_regex constant operationsmissing
7.8.5basic_regex localemissing
7.8.6basic_regex swapmissing
7.8.7basic_regex non-member functionsmissing
7.8.7.1basic_regex non-member swapmissing
7.9Class template sub_matchmissing
7.9.1sub_match membersmissing
7.9.2sub_match non-member operatorsmissing
7.10Class template match_resultsmissing
7.10.1match_results constructorsmissing
7.10.2match_results sizemissing
7.10.3match_results element accessmissing
7.10.4match_results formattingmissing
7.10.5match_results allocatormissing
7.10.6match_results swapmissing
7.11Regular expression algorithmsmissing
7.11.1exceptionsmissing
7.11.2regex_matchmissing
7.11.3regex_searchmissing
7.11.4regex_replacemissing
7.12Regular expression Iteratorsmissing
7.12.1Class template regex_iteratormissing
7.12.1.1regex_iterator constructorsmissing
7.12.1.2regex_iterator comparisonsmissing
7.12.1.3regex_iterator dereferencemissing
7.12.1.4regex_iterator incrementmissing
7.12.2Class template regex_token_iteratormissing
7.12.2.1regex_token_iterator constructorsmissing
7.12.2.2regex_token_iterator comparisonsmissing
7.12.2.3regex_token_iterator dereferencemissing
7.12.2.4regex_token_iterator incrementmissing
7.13Modified ECMAScript regular expression grammarmissing
8C compatibility
8.1Additions to header <complex>done
8.1.1Synopsisdone
8.1.2Function acosdone
8.1.3Function asindone
8.1.4Function atandone
8.1.5Function acoshdone
8.1.6Function asinhdone
8.1.7Function atanhdone
8.1.8Function fabsdone
8.1.9Additional Overloadsdone
8.2Header <ccomplex>missingDR 551
8.3Header <complex.h>missingDR 551
8.4Additions to header <cctype>done
8.4.1Synopsisdone
8.4.2Function isblankdone
8.5Additions to header <ctype.h>done
8.6Header <cfenv>done
8.6.1Synopsisdone
8.6.2Definitionsdone
8.7Header <fenv.h>done
8.8Additions to header <cfloat>done
8.9Additions to header <float.h>done
8.10Additions to header <ios>missing
8.10.1Synopsismissing
8.10.2Function hexfloatmissing
8.11Header <cinttypes>done
8.11.1SynopsisdoneDR 557
8.11.2Definitionsdone
8.12Header <inttypes.h>done
8.13Additions to header <climits>done
8.14Additions to header <limits.h>done
8.15Additions to header <locale>missing
8.16Additions to header <cmath>done
8.16.1Synopsisdone
8.16.2Definitionsdone
8.16.3Function template definitionsdone
8.16.4Additional overloadsdoneDR 568; DR 550
8.17Additions to header <math.h>done
8.18Additions to header <cstdarg>done
8.19Additions to header <stdarg.h>done
8.20The header <cstdbool>done
8.21The header <stdbool.h>done
8.22The header <cstdint>done
8.22.1Synopsisdone
8.22.2Definitionsdone
8.23The header <stdint.h>done
8.24Additions to header <cstdio>done
8.24.1Synopsisdone
8.24.2Definitionsdone
8.24.3Additional format specifiersdoneC library responsibility
8.24.4Additions to header <stdio.h>done
8.25Additions to header <cstdlib>done
8.25.1Synopsisdone
8.25.2Definitionsdone
8.25.3Function absdone
8.25.4Function divdone
8.26Additions to header <stdlib.h>done
8.27Header <ctgmath>doneDR 551
8.28Header <tgmath.h>doneDR 551
8.29Additions to header <ctime>doneC library responsibility
8.30Additions to header <cwchar>done
8.30.1Synopsisdone
8.30.2Definitionsdone
8.30.3Additional wide format specifiersdoneC library responsibility
8.31Additions to header <wchar.h>done
8.32Additions to header <cwctype>done
8.32.1Synopsisdone
8.32.2Function iswblankdone
8.33Additions to header <wctype.h>done
- -

Footnotes

- -
    - -
  1. - - The shared_ptr implementation uses some code from the - Boost - shared_ptr library. -
  2. - -
- -

-Please send FSF & GNU inquiries & questions to -gnu@gnu.org. -There are also other ways -to contact the FSF. -

- -

-These pages are maintained by -the GCC team. -

- -
-For questions related to the use of GCC, please consult these web -pages and the GCC manuals. If -that fails, the gcc-help@gcc.gnu.org -mailing list might help.
-Please send comments on these web pages and the development of GCC to our -developer mailing list at gcc@gnu.org -or gcc@gcc.gnu.org. All of our lists -have public archives. -
- -

-Copyright (C) Free Software Foundation, Inc., -51 Franklin St, Fifth Floor, Boston, MA 02110, USA. -

-

-Verbatim copying and distribution of this entire article is -permitted in any medium, provided this notice is preserved. -

- - - - - - -
- Last modified 2006-10-01 - - - Valid XHTML 1.0 - -
- - - diff --git a/libstdc++-v3/docs/html/18_support/howto.html b/libstdc++-v3/docs/html/18_support/howto.html deleted file mode 100644 index d7ea434db2d..00000000000 --- a/libstdc++-v3/docs/html/18_support/howto.html +++ /dev/null @@ -1,435 +0,0 @@ - - - - - - - - - - - libstdc++ HOWTO: Chapter 18: Library Support - - - - - - - - - -

Chapter 18: Library Support

- -

Chapter 18 deals with the functions called and objects created - automatically during the course of a program's existence. -

-

While we can't reproduce the contents of the Standard here (you need to - get your own copy from your nation's member body; see our homepage for - help), we can mention a couple of changes in what kind of support a C++ - program gets from the Standard Library. -

- - - -
-

Contents

- - -
- - - -

Types

-

All the types that you're used to in C are here in one form or - another. The only change that might affect people is the type of - NULL: while it is required to be a macro, the definition of that - macro is not allowed to be (void*)0, which is - often used in C. -

-

In g++, NULL is #define'd to be __null, a magic keyword - extension of g++. -

-

The biggest problem of #defining NULL to be something like - "0L" is that the compiler will view that as a long integer - before it views it as a pointer, so overloading won't do what you - expect. (This is why g++ has a magic extension, so that NULL is - always a pointer.) -

-

In his book - Effective C++, - Scott Meyers points out that the best way to solve this problem is to - not overload on pointer-vs-integer types to begin with. He also - offers a way to make your own magic NULL that will match pointers - before it matches integers: -

-
-   const                             // this is a const object...
-   class {
-   public:
-     template<class T>               // convertible to any type
-       operator T*() const           // of null non-member
-       { return 0; }                 // pointer...
-
-     template<class C, class T>      // or any type of null
-       operator T C::*() const       // member pointer...
-       { return 0; }
-
-   private:
-     void operator&() const;         // whose address can't be
-                                     // taken (see Item 27)...
-
-   } NULL;                           // and whose name is NULL
-   
-

(Cribbed from the published version of - the - Effective C++ CD, reproduced here with permission.) -

-

If you aren't using g++ (why?), but you do have a compiler which - supports member function templates, then you can use this definition - of NULL (be sure to #undef any existing versions). It only helps if - you actually use NULL in function calls, though; if you make a call of - foo(0); instead of foo(NULL);, then you're back - where you started. -

-

Added Note: When we contacted Dr. Meyers to ask - permission to - print this stuff, it prompted him to run this code through current - compilers to see what the state of the art is with respect to member - template functions. He posted - - an article to Usenet after discovering that the code above is not - valid! Even though it has no data members, it still needs a - user-defined constructor (which means that the class needs a type name - after all). The ctor can have an empty body; it just needs to be - there. (Stupid requirement? We think so too, and this will probably - be changed in the language itself.) -

-

Return to top of page or - to the FAQ. -

- -
-

Implementation properties

-

<limits>

-

This header mainly defines traits classes to give access to various - implementation defined-aspects of the fundamental types. The - traits classes -- fourteen in total -- are all specializations of the - template class numeric_limits, documented - here - and defined as follows: -

-
-   template<typename T> struct class {
-      static const bool is_specialized;
-      static T max() throw();
-      static T min() throw();
-
-      static const int digits;
-      static const int digits10;
-      static const bool is_signed;
-      static const bool is_integer;
-      static const bool is_exact;
-      static const int radix;
-      static T epsilon() throw();
-      static T round_error() throw();
-
-      static const int min_exponent;
-      static const int min_exponent10;
-      static const int max_exponent;
-      static const int max_exponent10;
-
-      static const bool has_infinity;
-      static const bool has_quiet_NaN;
-      static const bool has_signaling_NaN;
-      static const float_denorm_style has_denorm;
-      static const bool has_denorm_loss;
-      static T infinity() throw();
-      static T quiet_NaN() throw();
-      static T denorm_min() throw();
-
-      static const bool is_iec559;
-      static const bool is_bounded;
-      static const bool is_modulo;
-
-      static const bool traps;
-      static const bool tinyness_before;
-      static const float_round_style round_style;
-   };
-

Return to top of page or - to the FAQ. -

- -
-

Start and Termination

-

Not many changes here to <cstdlib> (the old stdlib.h). - You should note that the abort() function does not call - the destructors of automatic nor static objects, so if you're depending - on those to do cleanup, it isn't going to happen. (The functions - registered with atexit() don't get called either, so you - can forget about that possibility, too.) -

-

The good old exit() function can be a bit funky, too, until - you look closer. Basically, three points to remember are: -

-
    -
  1. Static objects are destroyed in reverse order of their creation. -
  2. -
  3. Functions registered with atexit() are called in - reverse order of registration, once per registration call. - (This isn't actually new.) -
  4. -
  5. The previous two actions are "interleaved," that is, - given this pseudocode: -
    -              extern "C or C++" void  f1 (void);
    -              extern "C or C++" void  f2 (void);
    -
    -              static Thing obj1;
    -              atexit(f1);
    -              static Thing obj2;
    -              atexit(f2);
    -            
    - then at a call of exit(), f2 will be called, then - obj2 will be destroyed, then f1 will be called, and finally obj1 - will be destroyed. If f1 or f2 allow an exception to propagate - out of them, Bad Things happen. -
  6. -
-

Note also that atexit() is only required to store 32 - functions, and the compiler/library might already be using some of - those slots. If you think you may run out, we recommend using - the xatexit/xexit combination from libiberty, which has no such limit. -

-

Return to top of page or - to the FAQ. -

- -
-

Verbose terminate

-

If you are having difficulty with uncaught exceptions and want a - little bit of help debugging the causes of the core dumps, you can - make use of a GNU extension in GCC 3.1 and later: -

-
-   #include <exception>
-
-   int main()
-   {
-       std::set_terminate(__gnu_cxx::__verbose_terminate_handler);
-       ...
-
-       throw anything;
-   }
-

The __verbose_terminate_handler function obtains the name - of the current exception, attempts to demangle it, and prints it to - stderr. If the exception is derived from std::exception - then the output from what() will be included. -

-

Any replacement termination function is required to kill the program - without returning; this one calls abort. -

-

For example: -

-
-   #include <exception>
-   #include <stdexcept>
-
-   struct argument_error : public std::runtime_error
-   {  
-     argument_error(const std::string& s): std::runtime_error(s) { }
-   };
-
-   int main(int argc)
-   {
-     std::set_terminate(__gnu_cxx::__verbose_terminate_handler);
-     if (argc > 5)
-       throw argument_error("argc is greater than 5!");
-     else
-       throw argc;
-   }
-   
-

In GCC 3.1 and later, this gives -

-
-   % ./a.out
-   terminate called after throwing a `int'
-   Aborted
-   % ./a.out f f f f f f f f f f f
-   terminate called after throwing an instance of `argument_error'
-   what(): argc is greater than 5!
-   Aborted
-   %
-

The 'Aborted' line comes from the call to abort(), of course. -

-

UPDATE: Starting with GCC 3.4, this is the default - termination handler; nothing need be done to use it. To go back to - the previous "silent death" method, simply include - <exception> and <cstdlib>, - and call -

-
-       std::set_terminate(std::abort);
- -

- This function will attempt to write to stderr. If your application - closes stderr or redirects it to an inappropriate location, - __verbose_terminate_handler will behave in an - unspecified manner. -

- -

Return to top of page or - to the FAQ. -

- - -
-

Dynamic memory management

-

There are six flavors each of new and - delete, so make certain that you're using the right - ones! Here are quickie descriptions of new: -

-
    -
  • single object form, throwing a bad_alloc on errors; - this is what most people are used to using
  • -
  • single object "nothrow" form, returning NULL on errors
  • -
  • array new, throwing bad_alloc on errors
  • -
  • array nothrow new, returning NULL on errors
  • -
  • placement new, which does nothing (like it's supposed to)
  • -
  • placement array new, which also does nothing
  • -
-

They are distinguished by the parameters that you pass to them, like - any other overloaded function. The six flavors of delete - are distinguished the same way, but none of them are allowed to throw - an exception under any circumstances anyhow. (They match up for - completeness' sake.) -

-

Remember that it is perfectly okay to call delete on a - NULL pointer! Nothing happens, by definition. That is not the - same thing as deleting a pointer twice. -

-

By default, if one of the "throwing news" can't - allocate the memory requested, it tosses an instance of a - bad_alloc exception (or, technically, some class derived - from it). You can change this by writing your own function (called a - new-handler) and then registering it with set_new_handler(): -

-
-   typedef void (*PFV)(void);
-
-   static char*  safety;
-   static PFV    old_handler;
-
-   void my_new_handler ()
-   {
-       delete[] safety;
-       popup_window ("Dude, you are running low on heap memory.  You
-                      should, like, close some windows, or something.
-                      The next time you run out, we're gonna burn!");
-       set_new_handler (old_handler);
-       return;
-   }
-
-   int main ()
-   {
-       safety = new char[500000];
-       old_handler = set_new_handler (&my_new_handler);
-       ...
-   }
-   
-

bad_alloc is derived from the base exception - class defined in Chapter 19. -

-

Return to top of page or - to the FAQ. -

- -
-

RTTI, the ABI, and demangling

-

If you have read the source - documentation for namespace abi then you are aware - of the cross-vendor C++ ABI which we use. One of the exposed - functions is the one which we use for demangling in programs like - c++filt, and you can use it yourself as well. -

-

(The function itself might use different demanglers, but that's the - whole point of abstract interfaces. If we change the implementation, - you won't notice.) -

-

Probably the only times you'll be interested in demangling at runtime - are when you're seeing typeid strings in RTTI, or when - you're handling the runtime-support exception classes. For example: -

-
-#include <exception>
-#include <iostream>
-#include <cxxabi.h>
-
-struct empty { };
-
-template <typename T, int N>
-  struct bar { };
-
-
-int main()
-{
-  int     status;
-  char   *realname;
-
-  // exception classes not in <stdexcept>, thrown by the implementation
-  // instead of the user
-  std::bad_exception  e;
-  realname = abi::__cxa_demangle(e.what(), 0, 0, &status);
-  std::cout << e.what() << "\t=> " << realname << "\t: " << status << '\n';
-  free(realname);
-
-
-  // typeid
-  bar<empty,17>          u;
-  const std::type_info  &ti = typeid(u);
-
-  realname = abi::__cxa_demangle(ti.name(), 0, 0, &status);
-  std::cout << ti.name() << "\t=> " << realname << "\t: " << status << '\n';
-  free(realname);
-
-  return 0;
-}
-

With GCC 3.1 and later, this prints -

-
-      St13bad_exception       => std::bad_exception   : 0
-      3barI5emptyLi17EE       => bar<empty, 17>       : 0 
-

The demangler interface is described in the source documentation - linked to above. It is actually written in C, so you don't need to - be writing C++ in order to demangle C++. (That also means we have to - use crummy memory management facilities, so don't forget to free() - the returned char array.) -

-

Return to top of page or - to the FAQ. -

- - - - -
-

-See license.html for copying conditions. -Comments and suggestions are welcome, and may be sent to -the libstdc++ mailing list. -

- - - - diff --git a/libstdc++-v3/docs/html/19_diagnostics/howto.html b/libstdc++-v3/docs/html/19_diagnostics/howto.html deleted file mode 100644 index 90a60b3bca5..00000000000 --- a/libstdc++-v3/docs/html/19_diagnostics/howto.html +++ /dev/null @@ -1,127 +0,0 @@ - - - - - - - - - - - libstdc++ HOWTO: Chapter 19: Diagnostics - - - - - - - - - -

Chapter 19: Diagnostics

- -

Chapter 19 deals with program diagnostics, such as exceptions - and assertions. You know, all the things we wish weren't even - necessary at all. -

- - - -
-

Contents

- - -
- - - -

Adding data to exceptions

-

The standard exception classes carry with them a single string as - data (usually describing what went wrong or where the 'throw' took - place). It's good to remember that you can add your own data to - these exceptions when extending the hierarchy: -

-
-   struct My_Exception : public std::runtime_error
-   {
-     public:
-       My_Exception (const string& whatarg)
-           : std::runtime_error(whatarg), e(errno), id(GetDataBaseID()) { }
-       int  errno_at_time_of_throw() const { return e; }
-       DBID id_of_thing_that_threw() const { return id; }
-     protected:
-       int    e;
-       DBID   id;     // some user-defined type
-   };
-   
-

Return to top of page or - to the FAQ. -

- -
-

Concept checkers -- new and improved!

-

Better taste! Less fat! Literally!

-

In 1999, SGI added concept checkers to their implementation - of the STL: code which checked the template parameters of - instantiated pieces of the STL, in order to insure that the parameters - being used met the requirements of the standard. For example, - the Standard requires that types passed as template parameters to - vector be "Assignable" (which means what you think - it means). The checking was done during compilation, and none of - the code was executed at runtime. -

-

Unfortunately, the size of the compiler files grew significantly - as a result. The checking code itself was cumbersome. And bugs - were found in it on more than one occasion. -

-

The primary author of the checking code, Jeremy Siek, had already - started work on a replacement implementation. The new code has been - formally reviewed and accepted into - the - Boost libraries, and we are pleased to incorporate it into the - GNU C++ library. -

-

The new version imposes a much smaller space overhead on the generated - object file. The checks are also cleaner and easier to read and - understand. -

-

They are off by default for all versions of GCC from 3.0 to 3.4 (the - latest release at the time of writing). - They can be enabled at configure time with - --enable-concept-checks. - You can enable them on a per-translation-unit basis with - #define _GLIBCXX_CONCEPT_CHECKS for GCC 3.4 and higher - (or with #define _GLIBCPP_CONCEPT_CHECKS for versions - 3.1, 3.2 and 3.3). -

- -

Please note that the upcoming C++ standard has first-class - support for template parameter constraints based on concepts in the core - language. This will obviate the need for the library-simulated concept - checking described above. -

- -

Return to top of page or - to the FAQ. -

- - - -
-

-See license.html for copying conditions. -Comments and suggestions are welcome, and may be sent to -the libstdc++ mailing list. -

- - - - diff --git a/libstdc++-v3/docs/html/20_util/allocator.html b/libstdc++-v3/docs/html/20_util/allocator.html deleted file mode 100644 index 951c12df36d..00000000000 --- a/libstdc++-v3/docs/html/20_util/allocator.html +++ /dev/null @@ -1,554 +0,0 @@ - - - - - - - - - - Allocators and allocation - - - - - - - -

Allocators and allocation

- -

- The latest version of this document is always available at - - http://gcc.gnu.org/onlinedocs/libstdc++/20_util/allocator.html. -

- -

- To the libstdc++ homepage. -

- - -
-

The C++ Standard encapsulates memory management characteristics - for strings, container classes, and parts of iostreams in a - template class called std::allocator. This class, and - base classes of it, are the superset of available free store - ("heap") management classes. -

- -

- Standard requirements -

-

The C++ standard only gives a few directives in this area: -

-
    -
  • When you add elements to a container, and the container must allocate - more memory to hold them, the container makes the request via its - Allocator template parameter. This includes adding - chars to the string class, which acts as a regular STL container - in this respect. -
  • -
  • The default Allocator of every container-of-T is - std::allocator<T>. -
  • -
  • The interface of the allocator<T> class is - extremely simple. It has about 20 public declarations (nested - typedefs, member functions, etc), but the two which concern us most - are: -
    -      T*    allocate   (size_type n, const void* hint = 0);
    -      void  deallocate (T* p, size_type n);
    - (This is a simplification; the real signatures use nested typedefs.) - The "n" arguments in both those functions is a - count of the number of T's to allocate space for, - not their total size. -
  • -
  • "The storage is obtained by calling - ::operator new(size_t), but it is unspecified when or - how often this function is called. The use of hint - is unspecified, but intended as an aid to locality if an - implementation so desires." [20.4.1.1]/6 -
  • -
- -

Complete details cam be found in the C++ standard, look in - [20.4 Memory]. -

- -

- Problems and Possibilities -

-

The easiest way of fulfilling the requirements is to call operator new - each time a container needs memory, and to call operator delete each - time the container releases memory. This method may be - slower - than caching the allocations and re-using previously-allocated - memory, but has the advantage of working correctly across a wide - variety of hardware and operating systems, including large - clusters. The __gnu_cxx::new_allocator implements - the simple operator new and operator delete semantics, while __gnu_cxx::malloc_allocator implements much the same thing, only with the C language functions std::malloc and std::free. -

- -

Another approach is to use intelligence within the allocator class -to cache allocations. This extra machinery can take a variety of -forms: a bitmap index, an index into an exponentially increasing -power-of-two-sized buckets, or simpler fixed-size pooling cache. The -cache is shared among all the containers in the program: when your -program's std::vector<int> gets cut in half and frees a bunch of -its storage, that memory can be reused by the private -std::list<WonkyWidget> brought in from a KDE library that you -linked against. And operators new and delete are not always called to -pass the memory on, either, which is a speed bonus. Examples of -allocators that use these techniques -are __gnu_cxx::bitmap_allocator, __gnu_cxx::pool_allocator, -and __gnu_cxx::__mt_alloc. -

- -

Depending on the implementation techniques used, the underlying -operating system, and compilation environment, scaling caching -allocators can be tricky. In particular, order-of-destruction and -order-of-creation for memory pools may be difficult to pin down with -certainty, which may create problems when used with plugins or loading -and unloading shared objects in memory. As such, using caching -allocators on systems that do not -support abi::__cxa_atexit is not recommended. -

- -

Versions of libstdc++ prior to 3.4 cache allocations in a memory - pool, instead of passing through to call the global allocation - operators (ie, __gnu_cxx::pool_allocator). More - recent versions default to the - simpler __gnu_cxx::new_allocator. -

- -

- Implementation details of std::allocator -

-

The implementation of std::allocator has continued - to evolve through successive releases. Here's a brief history. -

- -
- 3.0, 3.1, 3.2, 3.3 -
-

During this period, all allocators were written to the SGI - style, and all STL containers expected this interface. This - interface had a traits class called _Alloc_traits that - attempted to provide more information for compile-time allocation - selection and optimization. This traits class had another allocator - wrapper, __simple_alloc<T,A>, which was a - wrapper around another allocator, A, which itself is an allocator - for instances of T. But wait, there's more: - __allocator<T,A> is another adapter. Many of - the provided allocator classes were SGI style: such classes can be - changed to a conforming interface with this wrapper: - __allocator<T, __alloc> is thus the same as - allocator<T>. -

- -

The class std::allocator use the typedef - __alloc to select an underlying allocator that - satisfied memory allocation requests. The selection of this - underlying allocator was not user-configurable. -

- -
- 3.4 -
-

For this and later releases, the only allocator interface that - is support is the standard C++ interface. As such, all STL - containers have been adjusted, and all external allocators have - been modified to support this change. Because of this, - __simple_alloc, __allocator, __alloc, and - _Alloc_traits have all been removed. -

- -

The class std::allocator just has typedef, - constructor, and rebind members. It inherits from one of the - high-speed extension allocators, covered below. Thus, all - allocation and deallocation depends on the base class. -

- -

The base class that std::allocator is derived from - is not user-configurable. -

- -
- How the default allocation strategy is selected. -
-

It's difficult to pick an allocation strategy that will provide - maximum utility, without excessively penalizing some behavior. In - fact, it's difficult just deciding which typical actions to measure - for speed. -

- -

Three synthetic benchmarks have been created that provide data - that is used to compare different C++ allocators. These tests are: -

- -
    -
  • Insertion. Over multiple iterations, various STL container - objects have elements inserted to some maximum amount. A variety - of allocators are tested. - Test source for sequence - and associative - containers. -
  • - -
  • Insertion and erasure in a multi-threaded environment. - This test shows the ability of the allocator to reclaim memory - on a pre-thread basis, as well as measuring thread contention - for memory resources. - Test source - here. -
  • - -
  • A threaded producer/consumer model. - Test source for - sequence - and - associative - containers. -
  • -
- -
- Disabling memory caching. -
-

In use, std::allocator may allocate and deallocate - using implementation-specified strategies and heuristics. Because of - this, every call to an allocator object's allocate - member function may not actually call the global operator new. This - situation is also duplicated for calls to the - deallocate member function. -

- -

This can be confusing. -

- -

In particular, this can make debugging memory errors more - difficult, especially when using third party tools like valgrind or - debug versions of new. -

- -

There are various ways to solve this problem. One would be to - use a custom allocator that just called operators new - and delete directly, for every - allocation. (See include/ext/new_allocator.h, for instance.) - However, that option would involve changing source code to use the a - non-default allocator. Another option is to force the default - allocator to remove caching and pools, and to directly allocate - with every call of allocate and directly deallocate - with every call of deallocate, regardless of - efficiency. As it turns out, this last option is available, - although the exact mechanism has evolved with time. -

- -

For GCC releases from 2.95 through the 3.1 series, defining - __USE_MALLOC on the gcc command line would change the - default allocation strategy to instead use malloc and - free. See - this note - for details as to why this was something needing improvement. -

- -

Starting with GCC 3.2, and continued in the 3.3 series, to - globally disable memory caching within the library for the - default allocator, merely set GLIBCPP_FORCE_NEW (at this time, - with any value) in the system's environment before running the - program. If your program crashes with GLIBCPP_FORCE_NEW in the - environment, it likely means that you linked against objects - built against the older library. Code to support this extension - is fully compatible with 3.2 code if GLIBCPP_FORCE_NEW is not in - the environment. -

- -

As it turns out, the 3.4 code base continues to use this - mechanism, only the environment variable has been changed to - GLIBCXX_FORCE_NEW. -

- -

- Other allocators -

-

Several other allocators are provided as part of this - implementation. The location of the extension allocators and their - names have changed, but in all cases, functionality is - equivalent. Starting with gcc-3.4, all extension allocators are - standard style. Before this point, SGI style was the norm. Because of - this, the number of template arguments also changed. Here's a simple - chart to track the changes. -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Allocator (3.4)Header (3.4)Allocator (3.[0-3])Header (3.[0-3])
__gnu_cxx::new_allocator<T><ext/new_allocator.h>std::__new_alloc<memory>
__gnu_cxx::malloc_allocator<T><ext/malloc_allocator.h>std::__malloc_alloc_template<int><memory>
__gnu_cxx::debug_allocator<T><ext/debug_allocator.h>std::debug_alloc<T><memory>
__gnu_cxx::__pool_alloc<T><ext/pool_allocator.h>std::__default_alloc_template<bool,int><memory>
__gnu_cxx::__mt_alloc<T><ext/mt_allocator.h>
__gnu_cxx::bitmap_allocator<T><ext/bitmap_allocator.h>
- -

Releases after gcc-3.4 have continued to add to the collection - of available allocators. All of these new allocators are - standard-style. The following table includes details, along with - the first released version of GCC that included the extension allocator. -

- - - - - - - - - - - - - - - - - -
AllocatorIncludeVersion
__gnu_cxx::array_allocator<T><ext/array_allocator.h>4.0.0
__gnu_cxx::throw_allocator<T><ext/throw_allocator.h>4.2.0
- -

More details on each of these extension allocators follows.

-
    -
  • new_allocator -

    Simply wraps ::operator new - and ::operator delete. -

    -
  • -
  • malloc_allocator -

    Simply wraps - malloc and free. There is also a hook - for an out-of-memory handler (for new/delete this is taken care of - elsewhere). -

    -
  • -
  • array_allocator -

    Allows allocations of known and fixed sizes using existing - global or external storage allocated via construction of - std::tr1::array objects. By using this allocator, fixed size - containers (including std::string) can be used without - instances calling ::operator new and - ::operator delete. This capability allows the - use of STL abstractions without runtime complications or - overhead, even in situations such as program startup. For - usage examples, please consult the libstdc++ testsuite. -

    -
  • -
  • debug_allocator -

    A wrapper around an - arbitrary allocator A. It passes on slightly increased size - requests to A, and uses the extra memory to store size information. - When a pointer is passed to deallocate(), the stored - size is checked, and assert() is used to guarantee they match. -

    -
  • -
  • throw_allocator -

    Includes memory tracking and marking abilities as well as hooks for - throwing exceptinos at configurable intervals (including random, - all, none). -

    -
  • -
  • __pool_alloc -

    A high-performance, single pool allocator. The reusable - memory is shared among identical instantiations of this type. - It calls through ::operator new to obtain new memory - when its lists run out. If a client container requests a block - larger than a certain threshold size, then the pool is bypassed, - and the allocate/deallocate request is passed to - ::operator new directly.

    - -

    For versions of __pool_alloc after 3.4.0, there is - only one template parameter, as per the standard. -

    - -

    Older versions of this class take a boolean template parameter, - called thr, and an integer template parameter, - called inst. -

    - -

    The inst number is used to track additional memory - pools. The point of the number is to allow multiple - instantiations of the classes without changing the semantics at - all. All three of -

    - -
    -    typedef  __pool_alloc<true,0>    normal;
    -    typedef  __pool_alloc<true,1>    private;
    -    typedef  __pool_alloc<true,42>   also_private;
    -

    behave exactly the same way. However, the memory pool for each type - (and remember that different instantiations result in different types) - remains separate. -

    -

    The library uses 0 in all its instantiations. If you - wish to keep separate free lists for a particular purpose, use a - different number. -

    -

    The thr boolean determines whether the pool should - be manipulated atomically or not. When thr=true, the allocator - is is threadsafe, while thr=false, and is slightly faster but - unsafe for multiple threads. -

    - -

    For thread-enabled configurations, the pool is locked with a - single big lock. In some situations, this implementation detail may - result in severe performance degredation. -

    - -

    (Note that the GCC thread abstraction layer allows us to provide safe - zero-overhead stubs for the threading routines, if threads were - disabled at configuration time.) -

    - -
  • - -
  • __mt_alloc -

    A high-performance - fixed-size allocator. It has its own documentation, found here. -

    -
  • - -
  • bitmap_allocator -

    A high-performance allocator that uses a bit-map to keep track - of the used and unused memory locations. It has its own - documentation, found here. -

    -
  • -
- - -

- Using a specific allocator -

-

You can specify different memory management schemes on a - per-container basis, by overriding the default - Allocator template parameter. For example, an easy - (but non-portable) method of specifying that only malloc/free - should be used instead of the default node allocator is: -

-
-    std::list <int, __gnu_cxx::malloc_allocator<int> >  malloc_list;
- Likewise, a debugging form of whichever allocator is currently in use: -
-    std::deque <int, __gnu_cxx::debug_allocator<std::allocator<int> > >  debug_deque;
- - -

- Writing custom allocators -

-

Writing a portable C++ allocator would dictate that the - interface would look much like the one specified for - std::allocator. Additional member functions, but not - subtractions, would be permissible. -

- -

Probably the best place to start would be to copy one of the - extension allocators already shipped with libstdc++: say, - new_allocator . -

- - -

- Bibliography / Further Reading -

-

- ISO/IEC 14882:1998 Programming languages - C++ [20.4 Memory] -

- -

- Austern, Matt, C/C++ Users Journal. - The Standard Librarian: What Are Allocators Good - For? -

- -

- Berger, Emery, - The Hoard memory allocator -

- -

- Berger, Emery with Ben Zorn & Kathryn McKinley, OOPSLA 2002 - Reconsidering Custom Memory Allocation -

- -

- Kreft, Klaus and Angelika Langer, C++ Report, June 1998 - Allocator Types -

- -

- Stroustrup, Bjarne, 19.4 Allocators, The C++ Programming - Language, Special Edition, Addison Wesley, Inc. 2000 -

- -

- Yen, Felix, Yalloc: A Recycling C++ Allocator -

- -
-

Return to the top of the page or - to the libstdc++ homepage. -

- - - - -
-

-See license.html for copying conditions. -Comments and suggestions are welcome, and may be sent to -the libstdc++ mailing list. -

- - - - diff --git a/libstdc++-v3/docs/html/20_util/howto.html b/libstdc++-v3/docs/html/20_util/howto.html deleted file mode 100644 index fb02aa169fb..00000000000 --- a/libstdc++-v3/docs/html/20_util/howto.html +++ /dev/null @@ -1,234 +0,0 @@ - - - - - - - - - - - libstdc++ HOWTO: Chapter 20: General Utilities - - - - - - - - - - -

Chapter 20: General Utilities

- -

Chapter 20 deals with utility classes and functions, such as - the oft-debated auto_ptr<>. -

- - - -
-

Contents

- - -
- - - -

auto_ptr is not omnipotent

-

I'm not going to try and explain all of the fun and delicious - things that can happen with misuse of the auto_ptr class template - (called AP here), nor am I going to try and teach you how to use - AP safely in the presence of copying. The AP class is a really - nifty idea for a smart pointer, but it is one of the dumbest of - all the smart pointers -- and that's fine. -

-

AP is not meant to be a supersmart solution to all resource - leaks everywhere. Neither is it meant to be an effective form - of garbage collection (although it can help, a little bit). - And it can not be used for arrays! -

-

AP is meant to prevent nasty leaks in the presence of - exceptions. That's all. This code is AP-friendly: -

-
-    // not a recommend naming scheme, but good for web-based FAQs
-    typedef std::auto_ptr<MyClass>  APMC;
-
-    extern function_taking_MyClass_pointer (MyClass*);
-    extern some_throwable_function ();
-
-    void func (int data)
-    {
-        APMC  ap (new MyClass(data));
-
-        some_throwable_function();   // this will throw an exception
-
-        function_taking_MyClass_pointer (ap.get());
-    }
-   
-

When an exception gets thrown, the instance of MyClass that's - been created on the heap will be delete'd as the stack is - unwound past func(). -

-

Changing that code as follows is not AP-friendly: -

-
-        APMC  ap (new MyClass[22]);
-   
-

You will get the same problems as you would without the use - of AP: -

-
-        char*  array = new char[10];       // array new...
-        ...
-        delete array;                      // ...but single-object delete
-   
-

AP cannot tell whether the pointer you've passed at creation points - to one or many things. If it points to many things, you are about - to die. AP is trivial to write, however, so you could write your - own auto_array_ptr for that situation (in fact, this has - been done many times; check the mailing lists, Usenet, Boost, etc). -

-

Return to top of page or - to the FAQ. -

- -
-

auto_ptr inside container classes

-

All of the containers - described in the standard library require their contained types - to have, among other things, a copy constructor like this: -

-
-    struct My_Type
-    {
-        My_Type (My_Type const&);
-    };
-   
-

Note the const keyword; the object being copied shouldn't change. - The template class auto_ptr (called AP here) does not - meet this requirement. Creating a new AP by copying an existing - one transfers ownership of the pointed-to object, which means that - the AP being copied must change, which in turn means that the - copy ctors of AP do not take const objects. -

-

The resulting rule is simple: Never ever use a container of - auto_ptr objects. The standard says that "undefined" - behavior is the result, but it is guaranteed to be messy. -

-

To prevent you from doing this to yourself, the - concept checks built - in to this implementation will issue an error if you try to - compile code like this: -

-
-    #include <vector>
-    #include <memory>
-    
-    void f()
-    {
-        std::vector< std::auto_ptr<int> >   vec_ap_int;
-    }
-   
-

Should you try this with the checks enabled, you will see an error. -

-

Return to top of page or - to the FAQ. -

- -
-

Functors

-

If you don't know what functors are, you're not alone. Many people - get slightly the wrong idea. In the interest of not reinventing - the wheel, we will refer you to the introduction to the functor - concept written by SGI as part of their STL, in - their - http://www.sgi.com/tech/stl/functors.html. -

-

Return to top of page or - to the FAQ. -

- -
-

Pairs

-

The pair<T1,T2> is a simple and handy way to - carry around a pair of objects. One is of type T1, and another of - type T2; they may be the same type, but you don't get anything - extra if they are. The two members can be accessed directly, as - .first and .second. -

-

Construction is simple. The default ctor initializes each member - with its respective default ctor. The other simple ctor, -

-
-    pair (const T1& x, const T2& y);
-   
-

does what you think it does, first getting x - and second getting y. -

-

There is a copy constructor, but it requires that your compiler - handle member function templates: -

-
-    template <class U, class V> pair (const pair<U,V>& p);
-   
-

The compiler will convert as necessary from U to T1 and from - V to T2 in order to perform the respective initializations. -

-

The comparison operators are done for you. Equality - of two pair<T1,T2>s is defined as both first - members comparing equal and both second members comparing - equal; this simply delegates responsibility to the respective - operator== functions (for types like MyClass) or builtin - comparisons (for types like int, char, etc). -

-

- The less-than operator is a bit odd the first time you see it. It - is defined as evaluating to: - -

-
-    x.first  <  y.first  ||
-        ( !(y.first  <  x.first)  &&  x.second  <  y.second )
-   
-

The other operators are not defined using the rel_ops - functions above, but their semantics are the same. -

-

Finally, there is a template function called make_pair - that takes two references-to-const objects and returns an - instance of a pair instantiated on their respective types: -

-
-    pair<int,MyClass> p = make_pair(4,myobject);
-   
- -

Return to top of page or - to the FAQ. -

- - - - -
-

-See license.html for copying conditions. -Comments and suggestions are welcome, and may be sent to -the libstdc++ mailing list. -

- - - - diff --git a/libstdc++-v3/docs/html/20_util/shared_ptr.html b/libstdc++-v3/docs/html/20_util/shared_ptr.html deleted file mode 100644 index 6df2e6de635..00000000000 --- a/libstdc++-v3/docs/html/20_util/shared_ptr.html +++ /dev/null @@ -1,419 +0,0 @@ - - - - - - - - - Notes on the shared_ptr implementation. - - - - - - - -

-Notes on the shared_ptr implementation. -

- -prepared by Jonathan Wakely on November 11, 2007 - - -

-1. Abstract -

-

-The shared_ptr class template stores a pointer, usually obtained via new, -and implements shared ownership semantics. -

- -

-2. What the standard says -

- -
-20.6.6.2 - Class template shared_ptr [util.smartptr.shared] -
- -

-The standard deliberately doesn't require a reference-counted implementation, -allowing other techniques such as a circular-linked-list. -

- -

-At the time of writing the C++0x working paper doesn't mention how threads -affect shared_ptr, but it is likely to follow the existing practice set by -boost::shared_ptr. The shared_ptr in libstdc++ is derived -from Boost's, so the same rules apply. -

- -

-3. Problems with shared_ptr: TR1 vs C++0x, thread safety. -

- -

-The interface of tr1::shared_ptr was extended for C++0x with -support for rvalue-references and the other features from N2351. As -with other libstdc++ headers shared by TR1 and C++0x, boost_shared_ptr.h -uses conditional compilation, based on the macros _GLIBCXX_INCLUDE_AS_CXX0X -and _GLIBCXX_INCLUDE_AS_TR1, to enable and disable features. -

- -

-C++0x-only features are: rvalue-ref/move support, allocator support, -aliasing constructor, make_shared & allocate_shared. Additionally, the -constructors taking auto_ptr parameters are deprecated in C++0x mode. -

- -

-The -Thread -Safety section of the Boost shared_ptr documentation says "shared_ptr -objects offer the same level of thread safety as built-in types." -The implementation must ensure that concurrent updates to separate shared_ptr -instances are correct even when those instances share a reference count e.g. -

-
-shared_ptr<A> a(new A);
-shared_ptr<A> b(a);
-
-// Thread 1     // Thread 2
-   a.reset();      b.reset();
-
-

-The dynamically-allocated object must be destroyed by exactly one of the -threads. Weak references make things even more interesting. -The shared state used to implement shared_ptr must be transparent to the -user and invariants must be preserved at all times. -The key pieces of shared state are the strong and weak reference counts. -Updates to these need to be atomic and visible to all threads to ensure -correct cleanup of the managed resource (which is, after all, shared_ptr's -job!) -On multi-processor systems memory synchronisation may be needed so that -reference-count updates and the destruction of the managed resource are -race-free. -

- -

-The function _Sp_counted_base::_M_add_ref_lock(), called when -obtaining a shared_ptr from a weak_ptr, has to test if the managed -resource still exists and either increment the reference count or throw -std::bad_weak_ptr. -In a multi-threaded program there is a potential race condition if the last -reference is dropped (and the managed resource destroyed) between testing -the reference count and incrementing it, which could result in a shared_ptr -pointing to invalid memory. -

-

-The Boost shared_ptr (as used in GCC) features a clever lock-free algorithm -to avoid the race condition, but this relies on the processor supporting -an atomic Compare-And-Swap instruction. For other platforms there -are fall-backs using mutex locks. Boost (as of version 1.35) includes -several different implementations and the preprocessor selects one based -on the compiler, standard library, platform etc. For the version of -shared_ptr in libstdc++ the compiler and library are fixed, which makes -things much simpler: we have an atomic CAS or we don't, see Lock Policy -below for details. -

- -

-4. Design and Implementation Details -

- -

-The shared_ptr code in libstdc++ was kindly donated to GCC by the Boost -project and the original authors of the code. The basic design and -algorithms are from Boost, the notes below describe details specific to -the GCC implementation. Names have been uglified in this implementation, -but the design should be recognisable to anyone familiar with the Boost -1.32 shared_ptr. -

- -

-The basic design is an abstract base class, _Sp_counted_base that -does the reference-counting and calls virtual functions when the count -drops to zero. -Derived classes override those functions to destroy resources in a context -where the correct dynamic type is known. This is an application of the -technique known as type erasure. -

- -

-C++0x and TR1 Implementations -

- -

-The classes derived from _Sp_counted_base (see Class Hierarchy -below) and __shared_count are implemented separately for C++0x -and TR1, in bits/boost_sp_shared_count.h and -tr1/boost_sp_shared_count.h respectively. All other classes -including _Sp_counted_base are shared by both implementations. -

- -

-The TR1 implementation is considered relatively stable, so is unlikely to -change unless bug fixes require it to. If the code that is common to both -C++0x and TR1 modes needs to diverge further then it might be necessary to -duplicate additional classes and only make changes to the C++0x versions. -

- -

-Lock Policy -

- -

-Libstdc++ has a single _Sp_counted_base class, which is a -template parameterized on the enum __gnu_cxx::_Lock_policy. -The entire family of classes is parameterized on the lock policy, right up -to __shared_ptr, __weak_ptr and -__enable_shared_from_this. The actual -std::shared_ptr class inherits from __shared_ptr -with the lock policy parameter selected automatically based on the thread -model and platform that libstdc++ is configured for, so that the best -available template specialization will be used. This design is necessary -because it would not be conforming for std::shared_ptr to have -an extra template parameter, even if it had a default value. -The available policies are: -

- -
-
_S_Atomic
-
-Selected when GCC supports a builtin atomic compare-and-swap -operation on the target processor (see -Atomic -Builtins.) -The reference counts are maintained using a lock-free algorithm and GCC's -atomic builtins, which provide the required memory synchronisation. -
-
_S_Mutex
-
-The _Sp_counted_base specialization for this policy contains a mutex, -which is locked in add_ref_lock(). This policy is used when GCC's atomic -builtins aren't available so explicit memory barriers are needed in places. -
-
_S_Single
-
-This policy uses a non-reentrant add_ref_lock() with no locking. It is -used when libstdc++ is built without --enable-threads. -
-
- -

-For all three policies, reference count increments and decrements are done -via the functions in <ext/atomicity.h>, which detect if the -program is multi-threaded. -If only one thread of execution exists in the program then less expensive -non-atomic operations are used. -

- -

-Class Hierarchy -

- -

-A shared_ptr<T> contains a pointer of type T* -and an object of type __shared_count. The shared_count contains -a pointer of type _Sp_counted_base* which points to the object -that maintains the reference-counts and destroys the managed resource. -

- -
-
_Sp_counted_base<Lp>
-
-The base of the hierarchy is parameterized on the lock policy alone. -_Sp_counted_base doesn't depend on the type of pointer being managed, -it only maintains the reference counts and calls virtual functions when -the counts drop to zero. The managed object is destroyed when the last -strong reference is dropped, but the _Sp_counted_base itself must exist -until the last weak reference is dropped. -
-
_Sp_counted_base_impl<Ptr, Deleter, Lp>
-
-Inherits from _Sp_counted_base and stores a pointer of type Ptr -and a deleter of type Deleter. _Sp_deleter is -used when the user doesn't supply a custom deleter. Unlike Boost's, this -default deleter is not "checked" because GCC already issues a warning if -delete is used with an incomplete type. -This is the only derived type used by tr1::shared_ptr<Ptr> -and it is never used by std::shared_ptr, which uses one of -the following types, depending on how the shared_ptr is constructed. -
-
_Sp_counted_ptr<Ptr, Lp>
-
-Inherits from _Sp_counted_base and stores a pointer of type Ptr, -which is passed to delete when the last reference is dropped. -This is the simplest form and is used when there is no custom deleter or -allocator. -
-
_Sp_counted_deleter<Ptr, Deleter, Alloc>
-
-Inherits from _Sp_counted_ptr and adds support for custom deleter and -allocator. Empty Base Optimization is used for the allocator. This class -is used even when the user only provides a custom deleter, in which case -std::allocator is used as the allocator. -
-
_Sp_counted_ptr_inplace<Tp, Alloc, Lp>
-
-Used by allocate_shared and make_shared. -Contains aligned storage to hold an object of type Tp, -which is constructed in-place with placement new. -Has a variadic template constructor allowing any number of arguments to -be forwarded to Tp's constructor. -Unlike the other _Sp_counted_* classes, this one is parameterized on the -type of object, not the type of pointer; this is purely a convenience -that simplifies the implementation slightly. -
-
- -

-Related functions and classes -

- -
-
dynamic_pointer_cast, static_pointer_cast, -const_pointer_cast
-
-As noted in N2351, these functions can be implemented non-intrusively using -the alias constructor. However the aliasing constructor is only available -in C++0x mode, so in TR1 mode these casts rely on three non-standard -constructors in shared_ptr and __shared_ptr. -In C++0x mode these constructors and the related tag types are not needed. -
-
enable_shared_from_this
-
-The clever overload to detect a base class of type -enable_shared_from_this comes straight from Boost. -There is an extra overload for __enable_shared_from_this to -work smoothly with __shared_ptr<Tp, Lp> using any lock -policy. -
-
make_shared, allocate_shared
-
-make_shared simply forwards to allocate_shared -with std::allocator as the allocator. -Although these functions can be implemented non-intrusively using the -alias constructor, if they have access to the implementation then it is -possible to save storage and reduce the number of heap allocations. The -newly constructed object and the _Sp_counted_* can be allocated in a single -block and the standard says implementations are "encouraged, but not required," -to do so. This implementation provides additional non-standard constructors -(selected with the type _Sp_make_shared_tag) which create an -object of type _Sp_counted_ptr_inplace to hold the new object. -The returned shared_ptr<A> needs to know the address of the -new A object embedded in the _Sp_counted_ptr_inplace, -but it has no way to access it. -This implementation uses a "covert channel" to return the address of the -embedded object when get_deleter<_Sp_make_shared_tag>() -is called. Users should not try to use this. -As well as the extra constructors, this implementation also needs some -members of _Sp_counted_deleter to be protected where they could otherwise -be private. -
-
- -

-5. Examples -

- -

-Examples of use can be found in the testsuite, under -testsuite/tr1/2_general_utilities/shared_ptr. -

- -

-6. Unresolved Issues -

- -

-The resolution to C++ Standard Library issue 674, -"shared_ptr interface changes for consistency with N1856" will need to be -implemented after it is accepted into the working paper. Issue 743 -might also require changes. -

- -

-The _S_single policy uses atomics when used in MT code, because it uses -the same dispatcher functions that check __gthread_active_p(). This could be -addressed by providing template specialisations for some members of -_Sp_counted_base<_S_single>. -

- -

-Unlike Boost, this implementation does not use separate classes for the -pointer+deleter and pointer+deleter+allocator cases in C++0x mode, combining -both into _Sp_counted_deleter and using std::allocator when the user doesn't -specify an allocator. -If it was found to be beneficial an additional class could easily be added. -With the current implementation, the _Sp_counted_deleter and __shared_count -constructors taking a custom deleter but no allocator are technically -redundant and could be removed, changing callers to always specify an -allocator. If a separate pointer+deleter class was added the __shared_count -constructor would be needed, so it has been kept for now. -

- -

-The hack used to get the address of the managed object from -_Sp_counted_ptr_inplace::_M_get_deleter() is accessible to users. This -could be prevented if get_deleter<_Sp_make_shared_tag>() always -returned NULL, since the hack only needs to work at a lower level, not -in the public API. This wouldn't be difficult, but hasn't been done since -there is no danger of accidental misuse: users already know they are -relying on unsupported features if they refer to implementation details -such as _Sp_make_shared_tag. -

- -

-tr1::_Sp_deleter could be a private member of tr1::__shared_count but it -would alter the ABI. -

- -

-Exposing the alias constructor in TR1 mode could simplify the *_pointer_cast -functions. -Constructor could be private in TR1 mode, with the cast functions as friends. -

- -

-7. Acknowledgments -

-

-The original authors of the Boost shared_ptr, which is really nice code -to work with, Peter Dimov in particular for his help and invaluable advice -on thread safety. -Phillip Jordan and Paolo Carlini for the lock policy implementation. -

- - -

-8. Bibliography / Referenced Documents -

- -

-N2351 Improving shared_ptr for C++0x, Revision 2 -http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2351.htm -

- -

-N2456 C++ Standard Library Active Issues List (Revision R52) -http://open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2456.html

-

-N2461 Working Draft, Standard for Programming Language C++ -http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2461.pdf -

- -

-Boost C++ Libraries documentation - shared_ptr class template -http://boost.org/libs/smart_ptr/shared_ptr.htm -

- - - - diff --git a/libstdc++-v3/docs/html/21_strings/gotw29a.txt b/libstdc++-v3/docs/html/21_strings/gotw29a.txt deleted file mode 100644 index 9326604855e..00000000000 --- a/libstdc++-v3/docs/html/21_strings/gotw29a.txt +++ /dev/null @@ -1,159 +0,0 @@ -From: herbs@cntc.com (Herb Sutter) -Subject: Guru of the Week #29: Solution -Date: 22 Jan 1998 00:00:00 GMT -Message-ID: <6a8q26$9qa@netlab.cs.rpi.edu> -Newsgroups: comp.lang.c++.moderated - - - .--------------------------------------------------------------------. - | Guru of the Week problems and solutions are posted regularly on | - | news:comp.lang.c++.moderated. For past problems and solutions | - | see the GotW archive at http://www.cntc.com. | - | Is there a topic you'd like to see covered? mailto:herbs@cntc.com | - `--------------------------------------------------------------------' -_______________________________________________________ - -GotW #29: Strings - -Difficulty: 7 / 10 -_______________________________________________________ - - ->Write a ci_string class which is identical to the ->standard 'string' class, but is case-insensitive in the ->same way as the C function stricmp(): - -The "how can I make a case-insensitive string?" -question is so common that it probably deserves its own -FAQ -- hence this issue of GotW. - -Note 1: The stricmp() case-insensitive string -comparison function is not part of the C standard, but -it is a common extension on many C compilers. - -Note 2: What "case insensitive" actually means depends -entirely on your application and language. For -example, many languages do not have "cases" at all, and -for languages that do you have to decide whether you -want accented characters to compare equal to unaccented -characters, and so on. This GotW provides guidance on -how to implement case-insensitivity for standard -strings in whatever sense applies to your particular -situation. - - -Here's what we want to achieve: - -> ci_string s( "AbCdE" ); -> -> // case insensitive -> assert( s == "abcde" ); -> assert( s == "ABCDE" ); -> -> // still case-preserving, of course -> assert( strcmp( s.c_str(), "AbCdE" ) == 0 ); -> assert( strcmp( s.c_str(), "abcde" ) != 0 ); - -The key here is to understand what a "string" actually -is in standard C++. If you look in your trusty string -header, you'll see something like this: - - typedef basic_string string; - -So string isn't really a class... it's a typedef of a -template. In turn, the basic_string<> template is -declared as follows, in all its glory: - - template, - class Allocator = allocator > - class basic_string; - -So "string" really means "basic_string, allocator >". We don't need -to worry about the allocator part, but the key here is -the char_traits part because char_traits defines how -characters interact and compare(!). - -basic_string supplies useful comparison functions that -let you compare whether a string is equal to another, -less than another, and so on. These string comparisons -functions are built on top of character comparison -functions supplied in the char_traits template. In -particular, the char_traits template supplies character -comparison functions named eq(), ne(), and lt() for -equality, inequality, and less-than comparisons, and -compare() and find() functions to compare and search -sequences of characters. - -If we want these to behave differently, all we have to -do is provide a different char_traits template! Here's -the easiest way: - - struct ci_char_traits : public char_traits - // just inherit all the other functions - // that we don't need to override - { - static bool eq( char c1, char c2 ) { - return tolower(c1) == tolower(c2); - } - - static bool ne( char c1, char c2 ) { - return tolower(c1) != tolower(c2); - } - - static bool lt( char c1, char c2 ) { - return tolower(c1) < tolower(c2); - } - - static int compare( const char* s1, - const char* s2, - size_t n ) { - return strnicmp( s1, s2, n ); - // if available on your compiler, - // otherwise you can roll your own - } - - static const char* - find( const char* s, int n, char a ) { - while( n-- > 0 && tolower(*s) != tolower(a) ) { - ++s; - } - return n >= 0 ? s : 0; - } - }; - -[N.B. A bug in the original code has been fixed for the -GCC documentation, the corrected code was taken from -Herb Sutter's book, Exceptional C++] - -And finally, the key that brings it all together: - - typedef basic_string ci_string; - -All we've done is created a typedef named "ci_string" -which operates exactly like the standard "string", -except that it uses ci_char_traits instead of -char_traits to get its character comparison -rules. Since we've handily made the ci_char_traits -rules case-insensitive, we've made ci_string itself -case-insensitive without any further surgery -- that -is, we have a case-insensitive string without having -touched basic_string at all! - -This GotW should give you a flavour for how the -basic_string template works and how flexible it is in -practice. If you want different comparisons than the -ones stricmp() and tolower() give you, just replace the -five functions shown above with your own code that -performs character comparisons the way that's -appropriate in your particular application. - - - -Exercise for the reader: - -Is it safe to inherit ci_char_traits from -char_traits this way? Why or why not? - - diff --git a/libstdc++-v3/docs/html/21_strings/howto.html b/libstdc++-v3/docs/html/21_strings/howto.html deleted file mode 100644 index bdc868a02dc..00000000000 --- a/libstdc++-v3/docs/html/21_strings/howto.html +++ /dev/null @@ -1,472 +0,0 @@ - - - - - - - - - - - libstdc++ HOWTO: Chapter 21: Strings - - - - - - - - - -

Chapter 21: Strings

- -

Chapter 21 deals with the C++ strings library (a welcome relief). -

- - - -
-

Contents

- - -
- - - -

MFC's CString

-

A common lament seen in various newsgroups deals with the Standard - string class as opposed to the Microsoft Foundation Class called - CString. Often programmers realize that a standard portable - answer is better than a proprietary nonportable one, but in porting - their application from a Win32 platform, they discover that they - are relying on special functions offered by the CString class. -

-

Things are not as bad as they seem. In - this - message, Joe Buck points out a few very important things: -

-
    -
  • The Standard string supports all the operations - that CString does, with three exceptions. -
  • -
  • Two of those exceptions (whitespace trimming and case - conversion) are trivial to implement. In fact, we do so - on this page. -
  • -
  • The third is CString::Format, which allows formatting - in the style of sprintf. This deserves some mention: -
  • -
-

- The old libg++ library had a function called form(), which did much - the same thing. But for a Standard solution, you should use the - stringstream classes. These are the bridge between the iostream - hierarchy and the string class, and they operate with regular - streams seamlessly because they inherit from the iostream - hierarchy. An quick example: - -

-
-   #include <iostream>
-   #include <string>
-   #include <sstream>
-
-   string f (string& incoming)     // incoming is "foo  N"
-   {
-       istringstream   incoming_stream(incoming);
-       string          the_word;
-       int             the_number;
-
-       incoming_stream >> the_word        // extract "foo"
-                       >> the_number;     // extract N
-
-       ostringstream   output_stream;
-       output_stream << "The word was " << the_word
-                     << " and 3*N was " << (3*the_number);
-
-       return output_stream.str();
-   } 
-

A serious problem with CString is a design bug in its memory - allocation. Specifically, quoting from that same message: -

-
-   CString suffers from a common programming error that results in
-   poor performance.  Consider the following code:
-   
-   CString n_copies_of (const CString& foo, unsigned n)
-   {
-           CString tmp;
-           for (unsigned i = 0; i < n; i++)
-                   tmp += foo;
-           return tmp;
-   }
-   
-   This function is O(n^2), not O(n).  The reason is that each +=
-   causes a reallocation and copy of the existing string.  Microsoft
-   applications are full of this kind of thing (quadratic performance
-   on tasks that can be done in linear time) -- on the other hand,
-   we should be thankful, as it's created such a big market for high-end
-   ix86 hardware. :-)
-   
-   If you replace CString with string in the above function, the
-   performance is O(n).
-   
-

Joe Buck also pointed out some other things to keep in mind when - comparing CString and the Standard string class: -

-
    -
  • CString permits access to its internal representation; coders - who exploited that may have problems moving to string. -
  • -
  • Microsoft ships the source to CString (in the files - MFC\SRC\Str{core,ex}.cpp), so you could fix the allocation - bug and rebuild your MFC libraries. - Note: It looks like the CString shipped - with VC++6.0 has fixed this, although it may in fact have been - one of the VC++ SPs that did it. -
  • -
  • string operations like this have O(n) complexity - if the implementors do it correctly. The libstdc++ - implementors did it correctly. Other vendors might not. -
  • -
  • While parts of the SGI STL are used in libstdc++, their - string class is not. The SGI string is essentially - vector<char> and does not do any reference - counting like libstdc++'s does. (It is O(n), though.) - So if you're thinking about SGI's string or rope classes, - you're now looking at four possibilities: CString, the - libstdc++ string, the SGI string, and the SGI rope, and this - is all before any allocator or traits customizations! (More - choices than you can shake a stick at -- want fries with that?) -
  • -
-

Return to top of page or - to the FAQ. -

- -
-

A case-insensitive string class

-

The well-known-and-if-it-isn't-well-known-it-ought-to-be - Guru of the Week - discussions held on Usenet covered this topic in January of 1998. - Briefly, the challenge was, "write a 'ci_string' class which - is identical to the standard 'string' class, but is - case-insensitive in the same way as the (common but nonstandard) - C function stricmp():" -

-
-   ci_string s( "AbCdE" );
-
-   // case insensitive
-   assert( s == "abcde" );
-   assert( s == "ABCDE" );
-
-   // still case-preserving, of course
-   assert( strcmp( s.c_str(), "AbCdE" ) == 0 );
-   assert( strcmp( s.c_str(), "abcde" ) != 0 ); 
- -

The solution is surprisingly easy. The original - answer was posted on Usenet, and a revised version appears in - Herb Sutter's book Exceptional C++ and on his website as - GotW 29. -

-

See? Told you it was easy!

-

Added June 2000: The May 2000 issue of C++ Report - contains a fascinating - article by Matt Austern (yes, the Matt Austern) - on why case-insensitive comparisons are not as easy as they seem, - and why creating a class is the wrong way to go about it in - production code. (The GotW answer mentions one of the principle - difficulties; his article mentions more.) -

-

Basically, this is "easy" only if you ignore some things, - things which may be too important to your program to ignore. (I chose - to ignore them when originally writing this entry, and am surprised - that nobody ever called me on it...) The GotW question and answer - remain useful instructional tools, however. -

-

Added September 2000: James Kanze provided a link to a - Unicode - Technical Report discussing case handling, which provides some - very good information. -

-

Return to top of page or - to the FAQ. -

- -
-

Breaking a C++ string into tokens

-

The Standard C (and C++) function strtok() leaves a lot to - be desired in terms of user-friendliness. It's unintuitive, it - destroys the character string on which it operates, and it requires - you to handle all the memory problems. But it does let the client - code decide what to use to break the string into pieces; it allows - you to choose the "whitespace," so to speak. -

-

A C++ implementation lets us keep the good things and fix those - annoyances. The implementation here is more intuitive (you only - call it once, not in a loop with varying argument), it does not - affect the original string at all, and all the memory allocation - is handled for you. -

-

It's called stringtok, and it's a template function. It's given - in this file in a less-portable form than - it could be, to keep this example simple (for example, see the - comments on what kind of string it will accept). The author uses - a more general (but less readable) form of it for parsing command - strings and the like. If you compiled and ran this code using it: -

-
-   std::list<string>  ls;
-   stringtok (ls, " this  \t is\t\n  a test  ");
-   for (std::list<string>const_iterator i = ls.begin();
-        i != ls.end(); ++i)
-   {
-       std::cerr << ':' << (*i) << ":\n";
-   } 
-

You would see this as output: -

-
-   :this:
-   :is:
-   :a:
-   :test: 
-

with all the whitespace removed. The original s is still - available for use, ls will clean up after itself, and - ls.size() will return how many tokens there were. -

-

As always, there is a price paid here, in that stringtok is not - as fast as strtok. The other benefits usually outweigh that, however. - Another version of stringtok is given - here, suggested by Chris King and tweaked by Petr Prikryl, - and this one uses the - transformation functions mentioned below. If you are comfortable - with reading the new function names, this version is recommended - as an example. -

-

Added February 2001: Mark Wilden pointed out that the - standard std::getline() function can be used with standard - istringstreams to perform - tokenizing as well. Build an istringstream from the input text, - and then use std::getline with varying delimiters (the three-argument - signature) to extract tokens into a string. -

-

Return to top of page or - to the FAQ. -

- -
-

Simple transformations

-

Here are Standard, simple, and portable ways to perform common - transformations on a string instance, such as "convert - to all upper case." The word transformations is especially - apt, because the standard template function - transform<> is used. -

-

This code will go through some iterations (no pun). Here's the - simplistic version usually seen on Usenet: -

-
-   #include <string>
-   #include <algorithm>
-   #include <cctype>      // old <ctype.h>
-
-   struct ToLower
-   {
-     char operator() (char c) const  { return std::tolower(c); }
-   };
-
-   struct ToUpper
-   {
-     char operator() (char c) const  { return std::toupper(c); }
-   };
-
-   int main()
-   {
-     std::string  s ("Some Kind Of Initial Input Goes Here");
-
-     // Change everything into upper case
-     std::transform (s.begin(), s.end(), s.begin(), ToUpper());
-
-     // Change everything into lower case
-     std::transform (s.begin(), s.end(), s.begin(), ToLower());
-
-     // Change everything back into upper case, but store the
-     // result in a different string
-     std::string  capital_s;
-     capital_s.resize(s.size());
-     std::transform (s.begin(), s.end(), capital_s.begin(), ToUpper());
-   } 
-

Note that these calls all - involve the global C locale through the use of the C functions - toupper/tolower. This is absolutely guaranteed to work -- - but only if the string contains only characters - from the basic source character set, and there are only - 96 of those. Which means that not even all English text can be - represented (certain British spellings, proper names, and so forth). - So, if all your input forevermore consists of only those 96 - characters (hahahahahaha), then you're done. -

-

Note that the - ToUpper and ToLower function objects - are needed because toupper and tolower - are overloaded names (declared in <cctype> and - <locale>) so the template-arguments for - transform<> cannot be deduced, as explained in - this - message. - At minimum, you can write short wrappers like -

-
-   char toLower (char c)
-   {
-      return std::tolower(c);
-   } 
-

The correct method is to use a facet for a particular locale - and call its conversion functions. These are discussed more in - Chapter 22; the specific part is - Correct Transformations, - which shows the final version of this code. (Thanks to James Kanze - for assistance and suggestions on all of this.) -

-

Another common operation is trimming off excess whitespace. Much - like transformations, this task is trivial with the use of string's - find family. These examples are broken into multiple - statements for readability: -

-
-   std::string  str (" \t blah blah blah    \n ");
-
-   // trim leading whitespace
-   string::size_type  notwhite = str.find_first_not_of(" \t\n");
-   str.erase(0,notwhite);
-
-   // trim trailing whitespace
-   notwhite = str.find_last_not_of(" \t\n"); 
-   str.erase(notwhite+1); 
-

Obviously, the calls to find could be inserted directly - into the calls to erase, in case your compiler does not - optimize named temporaries out of existence. -

-

Return to top of page or - to the FAQ. -

- -
-

Making strings of arbitrary character types

-

The std::basic_string is tantalizingly general, in that - it is parameterized on the type of the characters which it holds. - In theory, you could whip up a Unicode character class and instantiate - std::basic_string<my_unicode_char>, or assuming - that integers are wider than characters on your platform, maybe just - declare variables of type std::basic_string<int>. -

-

That's the theory. Remember however that basic_string has additional - type parameters, which take default arguments based on the character - type (called CharT here): -

-
-      template <typename CharT,
-                typename Traits = char_traits<CharT>,
-                typename Alloc = allocator<CharT> >
-      class basic_string { .... };
-

Now, allocator<CharT> will probably Do The Right - Thing by default, unless you need to implement your own allocator - for your characters. -

-

But char_traits takes more work. The char_traits - template is declared but not defined. - That means there is only -

-
-      template <typename CharT>
-        struct char_traits
-        {
-            static void foo (type1 x, type2 y);
-            ...
-        };
-

and functions such as char_traits<CharT>::foo() are not - actually defined anywhere for the general case. The C++ standard - permits this, because writing such a definition to fit all possible - CharT's cannot be done. -

-

The C++ standard also requires that char_traits be specialized for - instantiations of char and wchar_t, and it - is these template specializations that permit entities like - basic_string<char,char_traits<char>> to work. -

-

If you want to use character types other than char and wchar_t, - such as unsigned char and int, you will - need suitable specializations for them. For a time, in earlier - versions of GCC, there was a mostly-correct implementation that - let programmers be lazy but it broke under many situations, so it - was removed. GCC 3.4 introduced a new implementation that mostly - works and can be specialized even for int and other - built-in types. -

-

If you want to use your own special character class, then you have - a lot - of work to do, especially if you with to use i18n features - (facets require traits information but don't have a traits argument). -

-

Another example of how to specialize char_traits was given on the - mailing list and at a later date was put into the file - include/ext/pod_char_traits.h. We agree - that the way it's used with basic_string (scroll down to main()) - doesn't look nice, but that's because the - nice-looking first attempt turned out to not - be conforming C++, due to the rule that CharT must be a POD. - (See how tricky this is?) -

-

Return to top of page or - to the FAQ. -

- -
-

Shrink-to-fit strings

- -

From GCC 3.4 calling s.reserve(res) on a - string s with res < s.capacity() will - reduce the string's capacity to std::max(s.size(), res). -

-

This behaviour is suggested, but not required by the standard. Prior - to GCC 3.4 the following alternative can be used instead -

-
-      std::string(str.data(), str.size()).swap(str);
-   
-

This is similar to the idiom for reducing a vector's - memory usage (see FAQ 5.9) but - the regular copy constructor cannot be used because libstdc++'s - string is Copy-On-Write. -

- - - - -
-

-See license.html for copying conditions. -Comments and suggestions are welcome, and may be sent to -the libstdc++ mailing list. -

- - - - diff --git a/libstdc++-v3/docs/html/21_strings/stringtok_h.txt b/libstdc++-v3/docs/html/21_strings/stringtok_h.txt deleted file mode 100644 index 81d87a6efaf..00000000000 --- a/libstdc++-v3/docs/html/21_strings/stringtok_h.txt +++ /dev/null @@ -1,102 +0,0 @@ -/* - * stringtok.h -- Breaks a string into tokens. This is an example for lib3. - * - * Template function looks like this: - * - * template - * void stringtok (Container &l, - * string const &s, - * char const * const ws = " \t\n"); - * - * A nondestructive version of strtok() that handles its own memory and can - * be broken up by any character(s). Does all the work at once rather than - * in an invocation loop like strtok() requires. - * - * Container is any type that supports push_back(a_string), although using - * list and deque are indicated due to their O(1) push_back. - * (I prefer deque<> because op[]/at() is available as well.) The first - * parameter references an existing Container. - * - * s is the string to be tokenized. From the parameter declaration, it can - * be seen that s is not affected. Since references-to-const may refer to - * temporaries, you could use stringtok(some_container, readline("")) when - * using the GNU readline library. - * - * The final parameter is an array of characters that serve as whitespace. - * Whitespace characters default to one or more of tab, space, and newline, - * in any combination. - * - * 'l' need not be empty on entry. On return, 'l' will have the token - * strings appended. - * - * - * [Example: - * list ls; - * stringtok (ls, " this \t is\t\n a test "); - * for (list::const_iterator i = ls.begin(); - * i != ls.end(); ++i) - * { - * cerr << ':' << (*i) << ":\n"; - * } - * - * would print - * :this: - * :is: - * :a: - * :test: - * -end example] - * - * pedwards@jaj.com May 1999 -*/ - - -#include -#include // for strchr - - -/***************************************************************** - * This is the only part of the implementation that I don't like. - * It can probably be improved upon by the reader... -*/ -namespace { - inline bool - isws (char c, char const * const wstr) - { - return (strchr(wstr,c) != NULL); - } -} - - -/***************************************************************** - * Simplistic and quite Standard, but a bit slow. This should be - * templatized on basic_string instead, or on a more generic StringT - * that just happens to support ::size_type, .substr(), and so on. - * I had hoped that "whitespace" would be a trait, but it isn't, so - * the user must supply it. Enh, this lets them break up strings on - * different things easier than traits would anyhow. -*/ -template -void -stringtok (Container &l, string const &s, char const * const ws = " \t\n") -{ - const string::size_type S = s.size(); - string::size_type i = 0; - - while (i < S) { - // eat leading whitespace - while ((i < S) && (isws(s[i],ws))) ++i; - if (i == S) return; // nothing left but WS - - // find end of word - string::size_type j = i+1; - while ((j < S) && (!isws(s[j],ws))) ++j; - - // add word - l.push_back(s.substr(i,j-i)); - - // set up for next loop - i = j+1; - } -} - - diff --git a/libstdc++-v3/docs/html/21_strings/stringtok_std_h.txt b/libstdc++-v3/docs/html/21_strings/stringtok_std_h.txt deleted file mode 100644 index 2f3d7e07368..00000000000 --- a/libstdc++-v3/docs/html/21_strings/stringtok_std_h.txt +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Same as stringtok_h.txt, but doesn't (visiably) use C functions. -*/ - -#include - -// The std:: prefix is not used here, for readability, and a line like -// "using namespace std;" is dangerous to have in a header file. - -template -void -stringtok (Container &container, string const &in, - const char * const delimiters = " \t\n") -{ - const string::size_type len = in.length(); - string::size_type i = 0; - - while ( i < len ) - { - // eat leading whitespace - i = in.find_first_not_of (delimiters, i); - if (i == string::npos) - return; // nothing left but white space - - // find the end of the token - string::size_type j = in.find_first_of (delimiters, i); - - // push token - if (j == string::npos) { - container.push_back (in.substr(i)); - return; - } else - container.push_back (in.substr(i, j-i)); - - // set up for next loop - i = j + 1; - } -} - diff --git a/libstdc++-v3/docs/html/22_locale/codecvt.html b/libstdc++-v3/docs/html/22_locale/codecvt.html deleted file mode 100644 index c760c098b5c..00000000000 --- a/libstdc++-v3/docs/html/22_locale/codecvt.html +++ /dev/null @@ -1,595 +0,0 @@ - - - - - - - - - - Notes on the codecvt implementation. - - - - - - - -

- Notes on the codecvt implementation. -

-

- -prepared by Benjamin Kosnik (bkoz@redhat.com) on August 28, 2000 - -

- -

-1. Abstract -

-

-The standard class codecvt attempts to address conversions between -different character encoding schemes. In particular, the standard -attempts to detail conversions between the implementation-defined wide -characters (hereafter referred to as wchar_t) and the standard type -char that is so beloved in classic "C" (which can now be referred to -as narrow characters.) This document attempts to describe how the GNU -libstdc++ implementation deals with the conversion between wide and -narrow characters, and also presents a framework for dealing with the -huge number of other encodings that iconv can convert, including -Unicode and UTF8. Design issues and requirements are addressed, and -examples of correct usage for both the required specializations for -wide and narrow characters and the implementation-provided extended -functionality are given. -

- -

-2. What the standard says -

-Around page 425 of the C++ Standard, this charming heading comes into view: - -
-22.2.1.5 - Template class codecvt [lib.locale.codecvt] -
- -The text around the codecvt definition gives some clues: - -
- --1- The class codecvt<internT,externT,stateT> is for use when -converting from one codeset to another, such as from wide characters -to multibyte characters, between wide character encodings such as -Unicode and EUC. - -
- -

-Hmm. So, in some unspecified way, Unicode encodings and -translations between other character sets should be handled by this -class. -

- -
- --2- The stateT argument selects the pair of codesets being mapped between. - -
- -

-Ah ha! Another clue... -

- -
- --3- The instantiations required in the Table ?? -(lib.locale.category), namely codecvt<wchar_t,char,mbstate_t> and -codecvt<char,char,mbstate_t>, convert the implementation-defined -native character set. codecvt<char,char,mbstate_t> implements a -degenerate conversion; it does not convert at -all. codecvt<wchar_t,char,mbstate_t> converts between the native -character sets for tiny and wide characters. Instantiations on -mbstate_t perform conversion between encodings known to the library -implementor. Other encodings can be converted by specializing on a -user-defined stateT type. The stateT object can contain any state that -is useful to communicate to or from the specialized do_convert member. - -
- -

-At this point, a couple points become clear: -

- -

-One: The standard clearly implies that attempts to add non-required -(yet useful and widely used) conversions need to do so through the -third template parameter, stateT.

- -

-Two: The required conversions, by specifying mbstate_t as the third -template parameter, imply an implementation strategy that is mostly -(or wholly) based on the underlying C library, and the functions -mcsrtombs and wcsrtombs in particular.

- -

-3. Some thoughts on what would be useful -

-Probably the most frequently asked question about code conversion is: -"So dudes, what's the deal with Unicode strings?" The dude part is -optional, but apparently the usefulness of Unicode strings is pretty -widely appreciated. Sadly, this specific encoding (And other useful -encodings like UTF8, UCS4, ISO 8859-10, etc etc etc) are not mentioned -in the C++ standard. - -

-In particular, the simple implementation detail of wchar_t's size -seems to repeatedly confound people. Many systems use a two byte, -unsigned integral type to represent wide characters, and use an -internal encoding of Unicode or UCS2. (See AIX, Microsoft NT, Java, -others.) Other systems, use a four byte, unsigned integral type to -represent wide characters, and use an internal encoding of -UCS4. (GNU/Linux systems using glibc, in particular.) The C -programming language (and thus C++) does not specify a specific size -for the type wchar_t. -

- -

-Thus, portable C++ code cannot assume a byte size (or endianness) either. -

- -

-Getting back to the frequently asked question: What about Unicode strings? -

- -

-What magic spell will do this conversion? -

- -

-A couple of comments: -

- -

-The thought that all one needs to convert between two arbitrary -codesets is two types and some kind of state argument is -unfortunate. In particular, encodings may be stateless. The naming of -the third parameter as stateT is unfortunate, as what is really needed -is some kind of generalized type that accounts for the issues that -abstract encodings will need. The minimum information that is required -includes: -

- -
    -
  • -

    - Identifiers for each of the codesets involved in the conversion. For -example, using the iconv family of functions from the Single Unix -Specification (what used to be called X/Open) hosted on the GNU/Linux -operating system allows bi-directional mapping between far more than -the following tantalizing possibilities: -

    - -

    -(An edited list taken from `iconv --list` on a Red Hat 6.2/Intel system: -

    - -
    -
    -8859_1, 8859_9, 10646-1:1993, 10646-1:1993/UCS4, ARABIC, ARABIC7,
    -ASCII, EUC-CN, EUC-JP, EUC-KR, EUC-TW, GREEK-CCIcode, GREEK, GREEK7-OLD,
    -GREEK7, GREEK8, HEBREW, ISO-8859-1, ISO-8859-2, ISO-8859-3,
    -ISO-8859-4, ISO-8859-5, ISO-8859-6, ISO-8859-7, ISO-8859-8,
    -ISO-8859-9, ISO-8859-10, ISO-8859-11, ISO-8859-13, ISO-8859-14,
    -ISO-8859-15, ISO-10646, ISO-10646/UCS2, ISO-10646/UCS4,
    -ISO-10646/UTF-8, ISO-10646/UTF8, SHIFT-JIS, SHIFT_JIS, UCS-2, UCS-4,
    -UCS2, UCS4, UNICODE, UNICODEBIG, UNICODELIcodeLE, US-ASCII, US, UTF-8,
    -UTF-16, UTF8, UTF16).
    -
    -
    - -

    -For iconv-based implementations, string literals for each of the -encodings (ie. "UCS-2" and "UTF-8") are necessary, -although for other, -non-iconv implementations a table of enumerated values or some other -mechanism may be required. -

    -
  • - -
  • - Maximum length of the identifying string literal. -
  • - -
  • - Some encodings require explicit endian-ness. As such, some kind - of endian marker or other byte-order marker will be necessary. See - "Footnotes for C/C++ developers" in Haible for more information on - UCS-2/Unicode endian issues. (Summary: big endian seems most likely, - however implementations, most notably Microsoft, vary.) -
  • - -
  • - Types representing the conversion state, for conversions involving - the machinery in the "C" library, or the conversion descriptor, for - conversions using iconv (such as the type iconv_t.) Note that the - conversion descriptor encodes more information than a simple encoding - state type. -
  • - -
  • - Conversion descriptors for both directions of encoding. (ie, both - UCS-2 to UTF-8 and UTF-8 to UCS-2.) -
  • - -
  • - Something to indicate if the conversion requested if valid. -
  • - -
  • - Something to represent if the conversion descriptors are valid. -
  • - -
  • - Some way to enforce strict type checking on the internal and - external types. As part of this, the size of the internal and - external types will need to be known. -
  • -
- -

-4. Problems with "C" code conversions : thread safety, global -locales, termination. -

- -In addition, multi-threaded and multi-locale environments also impact -the design and requirements for code conversions. In particular, they -affect the required specialization codecvt<wchar_t, char, mbstate_t> -when implemented using standard "C" functions. - -

-Three problems arise, one big, one of medium importance, and one small. -

- -

-First, the small: mcsrtombs and wcsrtombs may not be multithread-safe -on all systems required by the GNU tools. For GNU/Linux and glibc, -this is not an issue. -

- -

-Of medium concern, in the grand scope of things, is that the functions -used to implement this specialization work on null-terminated -strings. Buffers, especially file buffers, may not be null-terminated, -thus giving conversions that end prematurely or are otherwise -incorrect. Yikes! -

- -

-The last, and fundamental problem, is the assumption of a global -locale for all the "C" functions referenced above. For something like -C++ iostreams (where codecvt is explicitly used) the notion of -multiple locales is fundamental. In practice, most users may not run -into this limitation. However, as a quality of implementation issue, -the GNU C++ library would like to offer a solution that allows -multiple locales and or simultaneous usage with computationally -correct results. In short, libstdc++ is trying to offer, as an -option, a high-quality implementation, damn the additional complexity! -

- -

-For the required specialization codecvt<wchar_t, char, mbstate_t> , -conversions are made between the internal character set (always UCS4 -on GNU/Linux) and whatever the currently selected locale for the -LC_CTYPE category implements. -

- -

-5. Design -

-The two required specializations are implemented as follows: - -

- -codecvt<char, char, mbstate_t> - -

-

-This is a degenerate (ie, does nothing) specialization. Implementing -this was a piece of cake. -

- -

- -codecvt<char, wchar_t, mbstate_t> - -

-

-This specialization, by specifying all the template parameters, pretty -much ties the hands of implementors. As such, the implementation is -straightforward, involving mcsrtombs for the conversions between char -to wchar_t and wcsrtombs for conversions between wchar_t and char. -

- -

-Neither of these two required specializations deals with Unicode -characters. As such, libstdc++ implements a partial specialization -of the codecvt class with and iconv wrapper class, encoding_state as the -third template parameter. -

- -

-This implementation should be standards conformant. First of all, the -standard explicitly points out that instantiations on the third -template parameter, stateT, are the proper way to implement -non-required conversions. Second of all, the standard says (in Chapter -17) that partial specializations of required classes are a-ok. Third -of all, the requirements for the stateT type elsewhere in the standard -(see 21.1.2 traits typedefs) only indicate that this type be copy -constructible. -

- -

-As such, the type encoding_state is defined as a non-templatized, POD -type to be used as the third type of a codecvt instantiation. This -type is just a wrapper class for iconv, and provides an easy interface -to iconv functionality. -

- -

-There are two constructors for encoding_state: -

- -

- -encoding_state() : __in_desc(0), __out_desc(0) - -

-

-This default constructor sets the internal encoding to some default -(currently UCS4) and the external encoding to whatever is returned by -nl_langinfo(CODESET). -

- -

- -encoding_state(const char* __int, const char* __ext) - -

-

-This constructor takes as parameters string literals that indicate the -desired internal and external encoding. There are no defaults for -either argument. -

- -

-One of the issues with iconv is that the string literals identifying -conversions are not standardized. Because of this, the thought of -mandating and or enforcing some set of pre-determined valid -identifiers seems iffy: thus, a more practical (and non-migraine -inducing) strategy was implemented: end-users can specify any string -(subject to a pre-determined length qualifier, currently 32 bytes) for -encodings. It is up to the user to make sure that these strings are -valid on the target system. -

- -

- -void -_M_init() - -

-

-Strangely enough, this member function attempts to open conversion -descriptors for a given encoding_state object. If the conversion -descriptors are not valid, the conversion descriptors returned will -not be valid and the resulting calls to the codecvt conversion -functions will return error. -

- -

- -bool -_M_good() - -

-

-Provides a way to see if the given encoding_state object has been -properly initialized. If the string literals describing the desired -internal and external encoding are not valid, initialization will -fail, and this will return false. If the internal and external -encodings are valid, but iconv_open could not allocate conversion -descriptors, this will also return false. Otherwise, the object is -ready to convert and will return true. -

- -

- -encoding_state(const encoding_state&) - -

-

-As iconv allocates memory and sets up conversion descriptors, the copy -constructor can only copy the member data pertaining to the internal -and external code conversions, and not the conversion descriptors -themselves. -

- -

-Definitions for all the required codecvt member functions are provided -for this specialization, and usage of codecvt<internal character type, -external character type, encoding_state> is consistent with other -codecvt usage. -

- -

-6. Examples -

- -
    -
  • - a. conversions involving string literals - -
    -  typedef codecvt_base::result                  result;
    -  typedef unsigned short                        unicode_t;
    -  typedef unicode_t                             int_type;
    -  typedef char                                  ext_type;
    -  typedef encoding_state                          state_type;
    -  typedef codecvt<int_type, ext_type, state_type> unicode_codecvt;
    -
    -  const ext_type*       e_lit = "black pearl jasmine tea";
    -  int                   size = strlen(e_lit);
    -  int_type              i_lit_base[24] = 
    -  { 25088, 27648, 24832, 25344, 27392, 8192, 28672, 25856, 24832, 29184, 
    -    27648, 8192, 27136, 24832, 29440, 27904, 26880, 28160, 25856, 8192, 29696,
    -    25856, 24832, 2560
    -  };
    -  const int_type*       i_lit = i_lit_base;
    -  const ext_type*       efrom_next;
    -  const int_type*       ifrom_next;
    -  ext_type*             e_arr = new ext_type[size + 1];
    -  ext_type*             eto_next;
    -  int_type*             i_arr = new int_type[size + 1];
    -  int_type*             ito_next;
    -
    -  // construct a locale object with the specialized facet.
    -  locale                loc(locale::classic(), new unicode_codecvt);
    -  // sanity check the constructed locale has the specialized facet.
    -  VERIFY( has_facet<unicode_codecvt>(loc) );
    -  const unicode_codecvt& cvt = use_facet<unicode_codecvt>(loc); 
    -  // convert between const char* and unicode strings
    -  unicode_codecvt::state_type state01("UNICODE", "ISO_8859-1");
    -  initialize_state(state01);
    -  result r1 = cvt.in(state01, e_lit, e_lit + size, efrom_next, 
    -                     i_arr, i_arr + size, ito_next);
    -  VERIFY( r1 == codecvt_base::ok );
    -  VERIFY( !int_traits::compare(i_arr, i_lit, size) ); 
    -  VERIFY( efrom_next == e_lit + size );
    -  VERIFY( ito_next == i_arr + size );
    -
    -
  • -
  • - b. conversions involving std::string -
  • -
  • - c. conversions involving std::filebuf and std::ostream -
  • -
- -More information can be found in the following testcases: -
    -
  • testsuite/22_locale/codecvt_char_char.cc
  • -
  • testsuite/22_locale/codecvt_unicode_wchar_t.cc
  • -
  • testsuite/22_locale/codecvt_unicode_char.cc
  • -
  • testsuite/22_locale/codecvt_wchar_t_char.cc
  • -
- -

-7. Unresolved Issues -

-
    -
  • - a. things that are sketchy, or remain unimplemented: - do_encoding, max_length and length member functions - are only weakly implemented. I have no idea how to do - this correctly, and in a generic manner. Nathan? -
  • - -
  • - b. conversions involving std::string - -
      -
    • - how should operators != and == work for string of - different/same encoding? -
    • - -
    • - what is equal? A byte by byte comparison or an - encoding then byte comparison? -
    • - -
    • - conversions between narrow, wide, and unicode strings -
    • -
    -
  • -
  • - c. conversions involving std::filebuf and std::ostream -
      -
    • - how to initialize the state object in a - standards-conformant manner? -
    • - -
    • - how to synchronize the "C" and "C++" - conversion information? -
    • - -
    • - wchar_t/char internal buffers and conversions between - internal/external buffers? -
    • -
    -
  • -
- -

-8. Acknowledgments -

-Ulrich Drepper for the iconv suggestions and patient answering of -late-night questions, Jason Merrill for the template partial -specialization hints, language clarification, and wchar_t fixes. - -

-9. Bibliography / Referenced Documents -

- -Drepper, Ulrich, GNU libc (glibc) 2.2 manual. In particular, Chapters "6. Character Set Handling" and "7 Locales and Internationalization" - -

-Drepper, Ulrich, Numerous, late-night email correspondence -

- -

-Feather, Clive, "A brief description of Normative Addendum 1," in particular the parts on Extended Character Sets -http://www.lysator.liu.se/c/na1.html -

- -

-Haible, Bruno, "The Unicode HOWTO" v0.18, 4 August 2000 -ftp://ftp.ilog.fr/pub/Users/haible/utf8/Unicode-HOWTO.html -

- -

-ISO/IEC 14882:1998 Programming languages - C++ -

- -

-ISO/IEC 9899:1999 Programming languages - C -

- -

-Khun, Markus, "UTF-8 and Unicode FAQ for Unix/Linux" -http://www.cl.cam.ac.uk/~mgk25/unicode.html -

- -

-Langer, Angelika and Klaus Kreft, Standard C++ IOStreams and Locales, Advanced Programmer's Guide and Reference, Addison Wesley Longman, Inc. 2000 -

- -

-Stroustrup, Bjarne, Appendix D, The C++ Programming Language, Special Edition, Addison Wesley, Inc. 2000 -

- -

-System Interface Definitions, Issue 6 (IEEE Std. 1003.1-200x) -The Open Group/The Institute of Electrical and Electronics Engineers, Inc. -http://www.opennc.org/austin/docreg.html -

- - - diff --git a/libstdc++-v3/docs/html/22_locale/ctype.html b/libstdc++-v3/docs/html/22_locale/ctype.html deleted file mode 100644 index e52f8353bd9..00000000000 --- a/libstdc++-v3/docs/html/22_locale/ctype.html +++ /dev/null @@ -1,166 +0,0 @@ - - - - - - - - - - Notes on the ctype implementation. - - - - - - - -

- Notes on the ctype implementation. -

- -prepared by Benjamin Kosnik (bkoz@redhat.com) on August 30, 2000 - - -

-1. Abstract -

-

-Woe is me. -

- -

-2. What the standard says -

- - -

-3. Problems with "C" ctype : global locales, termination. -

- -

-For the required specialization codecvt<wchar_t, char, mbstate_t> , -conversions are made between the internal character set (always UCS4 -on GNU/Linux) and whatever the currently selected locale for the -LC_CTYPE category implements. -

- -

-4. Design -

-The two required specializations are implemented as follows: - -

- -ctype<char> - -

-

-This is simple specialization. Implementing this was a piece of cake. -

- -

- -ctype<wchar_t> - -

-

-This specialization, by specifying all the template parameters, pretty -much ties the hands of implementors. As such, the implementation is -straightforward, involving mcsrtombs for the conversions between char -to wchar_t and wcsrtombs for conversions between wchar_t and char. -

- -

-Neither of these two required specializations deals with Unicode -characters. As such, libstdc++ implements -

- -

-5. Examples -

- -
-  typedef ctype<char> cctype;
-
- -More information can be found in the following testcases: -
    -
  • testsuite/22_locale/ctype_char_members.cc
  • -
  • testsuite/22_locale/ctype_wchar_t_members.cc
  • -
- -

-6. Unresolved Issues -

- -
    -
  • how to deal with the global locale issue?
  • - -
  • how to deal with different types than char, wchar_t?
  • - -
  • codecvt/ctype overlap: narrow/widen
  • - -
  • mask typedef in codecvt_base, argument types in codecvt. - what is know about this type?
  • - -
  • why mask* argument in codecvt?
  • - -
  • can this be made (more) generic? is there a simple way to - straighten out the configure-time mess that is a by-product of - this class?
  • - -
  • get the ctype<wchar_t>::mask stuff under control. Need to - make some kind of static table, and not do lookup evertime - somebody hits the do_is... functions. Too bad we can't just - redefine mask for ctype<wchar_t>
  • - -
  • rename abstract base class. See if just smash-overriding - is a better approach. Clarify, add sanity to naming.
  • - -
- - -

-7. Acknowledgments -

-Ulrich Drepper for patient answering of late-night questions, skeletal -examples, and C language expertise. - -

-8. Bibliography / Referenced Documents -

- -Drepper, Ulrich, GNU libc (glibc) 2.2 manual. In particular, Chapters "6. Character Set Handling" and "7 Locales and Internationalization" - -

-Drepper, Ulrich, Numerous, late-night email correspondence -

- -

-ISO/IEC 14882:1998 Programming languages - C++ -

- -

-ISO/IEC 9899:1999 Programming languages - C -

- -

-Langer, Angelika and Klaus Kreft, Standard C++ IOStreams and Locales, Advanced Programmer's Guide and Reference, Addison Wesley Longman, Inc. 2000 -

- -

-Stroustrup, Bjarne, Appendix D, The C++ Programming Language, Special Edition, Addison Wesley, Inc. 2000 -

- -

-System Interface Definitions, Issue 6 (IEEE Std. 1003.1-200x) -The Open Group/The Institute of Electrical and Electronics Engineers, Inc. -http://www.opennc.org/austin/docreg.html -

- - - diff --git a/libstdc++-v3/docs/html/22_locale/howto.html b/libstdc++-v3/docs/html/22_locale/howto.html deleted file mode 100644 index 3709a6fac97..00000000000 --- a/libstdc++-v3/docs/html/22_locale/howto.html +++ /dev/null @@ -1,240 +0,0 @@ - - - - - - - - - - - libstdc++ HOWTO: Chapter 22: Localization - - - - - - - - - - - - - - - -

Chapter 22: Localization

- -

Chapter 22 deals with the C++ localization facilities. -

- - - - -
-

Contents

- - - - -
-

class locale

-

Notes made during the implementation of locales can be found - here. -

- -
-

class codecvt

-

Notes made during the implementation of codecvt can be found - here. -

- -

The following is the abstract from the implementation notes: -

-
- The standard class codecvt attempts to address conversions between - different character encoding schemes. In particular, the standard - attempts to detail conversions between the implementation-defined - wide characters (hereafter referred to as wchar_t) and the standard - type char that is so beloved in classic "C" (which can - now be referred to as narrow characters.) This document attempts - to describe how the GNU libstdc++ implementation deals with the - conversion between wide and narrow characters, and also presents a - framework for dealing with the huge number of other encodings that - iconv can convert, including Unicode and UTF8. Design issues and - requirements are addressed, and examples of correct usage for both - the required specializations for wide and narrow characters and the - implementation-provided extended functionality are given. -
- -
-

class ctype

-

Notes made during the implementation of ctype can be found - here. -

- -
-

class messages

-

Notes made during the implementation of messages can be found - here. -

- -
-

Bjarne Stroustrup on Locales

-

Dr. Bjarne Stroustrup has released a - pointer - to Appendix D of his book, - The C++ - Programming Language (3rd Edition). It is a detailed - description of locales and how to use them. -

-

He also writes: -

-
- Please note that I still consider this detailed description of - locales beyond the needs of most C++ programmers. It is written - with experienced programmers in mind and novices will do best to - avoid it. -
- -
-

Nathan Myers on Locales

-

An article entitled "The Standard C++ Locale" was - published in Dr. Dobb's Journal and can be found - here. -

- -
-

Correct Transformations

- -

A very common question on newsgroups and mailing lists is, "How - do I do <foo> to a character string?" where <foo> is - a task such as changing all the letters to uppercase, to lowercase, - testing for digits, etc. A skilled and conscientious programmer - will follow the question with another, "And how do I make the - code portable?" -

-

(Poor innocent programmer, you have no idea the depths of trouble - you are getting yourself into. 'Twould be best for your sanity if - you dropped the whole idea and took up basket weaving instead. No? - Fine, you asked for it...) -

-

The task of changing the case of a letter or classifying a character - as numeric, graphical, etc., all depends on the cultural context of the - program at runtime. So, first you must take the portability question - into account. Once you have localized the program to a particular - natural language, only then can you perform the specific task. - Unfortunately, specializing a function for a human language is not - as simple as declaring - extern "Danish" int tolower (int); . -

-

The C++ code to do all this proceeds in the same way. First, a locale - is created. Then member functions of that locale are called to - perform minor tasks. Continuing the example from Chapter 21, we wish - to use the following convenience functions: -

-
-   namespace std {
-     template <class charT>
-       charT
-       toupper (charT c, const locale& loc) const;
-     template <class charT>
-       charT
-       tolower (charT c, const locale& loc) const;
-   }
-

- This function extracts the appropriate "facet" from the - locale loc and calls the appropriate member function of that - facet, passing c as its argument. The resulting character - is returned. -

-

For the C/POSIX locale, the results are the same as calling the - classic C toupper/tolower function that was used in previous - examples. For other locales, the code should Do The Right Thing. -

-

Of course, these functions take a second argument, and the - transformation algorithm's operator argument can only take a single - parameter. So we write simple wrapper structs to handle that. -

-

The next-to-final version of the code started in Chapter 21 looks like: -

-
-   #include <iterator>    // for back_inserter
-   #include <locale>
-   #include <string>
-   #include <algorithm>
-   #include <cctype>      // old <ctype.h>
-
-   struct ToUpper
-   {
-       ToUpper(std::locale const& l) : loc(l) {;}
-       char operator() (char c) const  { return std::toupper(c,loc); }
-   private:
-       std::locale const& loc;
-   };
-   
-   struct ToLower
-   {
-       ToLower(std::locale const& l) : loc(l) {;}
-       char operator() (char c) const  { return std::tolower(c,loc); }
-   private:
-       std::locale const& loc;
-   };
-   
-   int main ()
-   {
-      std::string  s("Some Kind Of Initial Input Goes Here");
-      ToUpper      up(std::locale::classic());
-      ToLower      down(std::locale::classic());
-   
-      // Change everything into upper case.
-      std::transform(s.begin(), s.end(), s.begin(), up);
-   
-      // Change everything into lower case.
-      std::transform(s.begin(), s.end(), s.begin(), down);
-   
-      // Change everything back into upper case, but store the
-      // result in a different string.
-      std::string  capital_s;
-      std::transform(s.begin(), s.end(), std::back_inserter(capital_s), up);
-   }
-

The ToUpper and ToLower structs can be - generalized for other character types by making operator() - a member function template. -

-

The final version of the code uses bind2nd to eliminate - the wrapper structs, but the resulting code is tricky. I have not - shown it here because no compilers currently available to me will - handle it. -

- - - - -
-

-See license.html for copying conditions. -Comments and suggestions are welcome, and may be sent to -the libstdc++ mailing list. -

- - - - diff --git a/libstdc++-v3/docs/html/22_locale/locale.html b/libstdc++-v3/docs/html/22_locale/locale.html deleted file mode 100644 index 57ef5b4e981..00000000000 --- a/libstdc++-v3/docs/html/22_locale/locale.html +++ /dev/null @@ -1,543 +0,0 @@ - - - - - - - - - - Notes on the locale implementation. - - - - - - - -

- Notes on the locale implementation. -

- -prepared by Benjamin Kosnik (bkoz@redhat.com) on October 14, 2002 - - -

-1. Abstract -

-

-Describes the basic locale object, including nested -classes id, facet, and the reference-counted implementation object, -class _Impl. -

- -

-2. What the standard says -

-Class locale is non-templatized and has two distinct types nested -inside of it: - -
- -class facet -22.1.1.1.2 Class locale::facet - -
- -

-Facets actually implement locale functionality. For instance, a facet -called numpunct is the data objects that can be used to query for the -thousands separator is in the German locale. -

- -Literally, a facet is strictly defined: -
    -
  • containing the following public data member: -

    - static locale::id id; -

    -
  • - -
  • derived from another facet: -

    - class gnu_codecvt: public std::ctype<user-defined-type> -

    -
  • -
- -

-Of interest in this class are the memory management options explicitly -specified as an argument to facet's constructor. Each constructor of a -facet class takes a std::size_t __refs argument: if __refs == 0, the -facet is deleted when the locale containing it is destroyed. If __refs -== 1, the facet is not destroyed, even when it is no longer -referenced. -

- -
- -class id -22.1.1.1.3 - Class locale::id - -
- -

-Provides an index for looking up specific facets. -

- - -

-3. Interacting with "C" locales. -

- -

-Some help on determining the underlying support for locales on a system. -Note, this is specific to linux (and glibc-2.3.x) -

- -
    -
  • `locale -a` displays available locales. -
    -
    -af_ZA
    -ar_AE
    -ar_AE.utf8
    -ar_BH
    -ar_BH.utf8
    -ar_DZ
    -ar_DZ.utf8
    -ar_EG
    -ar_EG.utf8
    -ar_IN
    -ar_IQ
    -ar_IQ.utf8
    -ar_JO
    -ar_JO.utf8
    -ar_KW
    -ar_KW.utf8
    -ar_LB
    -ar_LB.utf8
    -ar_LY
    -ar_LY.utf8
    -ar_MA
    -ar_MA.utf8
    -ar_OM
    -ar_OM.utf8
    -ar_QA
    -ar_QA.utf8
    -ar_SA
    -ar_SA.utf8
    -ar_SD
    -ar_SD.utf8
    -ar_SY
    -ar_SY.utf8
    -ar_TN
    -ar_TN.utf8
    -ar_YE
    -ar_YE.utf8
    -be_BY
    -be_BY.utf8
    -bg_BG
    -bg_BG.utf8
    -br_FR
    -bs_BA
    -C
    -ca_ES
    -ca_ES@euro
    -ca_ES.utf8
    -ca_ES.utf8@euro
    -cs_CZ
    -cs_CZ.utf8
    -cy_GB
    -da_DK
    -da_DK.iso885915
    -da_DK.utf8
    -de_AT
    -de_AT@euro
    -de_AT.utf8
    -de_AT.utf8@euro
    -de_BE
    -de_BE@euro
    -de_BE.utf8
    -de_BE.utf8@euro
    -de_CH
    -de_CH.utf8
    -de_DE
    -de_DE@euro
    -de_DE.utf8
    -de_DE.utf8@euro
    -de_LU
    -de_LU@euro
    -de_LU.utf8
    -de_LU.utf8@euro
    -el_GR
    -el_GR.utf8
    -en_AU
    -en_AU.utf8
    -en_BW
    -en_BW.utf8
    -en_CA
    -en_CA.utf8
    -en_DK
    -en_DK.utf8
    -en_GB
    -en_GB.iso885915
    -en_GB.utf8
    -en_HK
    -en_HK.utf8
    -en_IE
    -en_IE@euro
    -en_IE.utf8
    -en_IE.utf8@euro
    -en_IN
    -en_NZ
    -en_NZ.utf8
    -en_PH
    -en_PH.utf8
    -en_SG
    -en_SG.utf8
    -en_US
    -en_US.iso885915
    -en_US.utf8
    -en_ZA
    -en_ZA.utf8
    -en_ZW
    -en_ZW.utf8
    -es_AR
    -es_AR.utf8
    -es_BO
    -es_BO.utf8
    -es_CL
    -es_CL.utf8
    -es_CO
    -es_CO.utf8
    -es_CR
    -es_CR.utf8
    -es_DO
    -es_DO.utf8
    -es_EC
    -es_EC.utf8
    -es_ES
    -es_ES@euro
    -es_ES.utf8
    -es_ES.utf8@euro
    -es_GT
    -es_GT.utf8
    -es_HN
    -es_HN.utf8
    -es_MX
    -es_MX.utf8
    -es_NI
    -es_NI.utf8
    -es_PA
    -es_PA.utf8
    -es_PE
    -es_PE.utf8
    -es_PR
    -es_PR.utf8
    -es_PY
    -es_PY.utf8
    -es_SV
    -es_SV.utf8
    -es_US
    -es_US.utf8
    -es_UY
    -es_UY.utf8
    -es_VE
    -es_VE.utf8
    -et_EE
    -et_EE.utf8
    -eu_ES
    -eu_ES@euro
    -eu_ES.utf8
    -eu_ES.utf8@euro
    -fa_IR
    -fi_FI
    -fi_FI@euro
    -fi_FI.utf8
    -fi_FI.utf8@euro
    -fo_FO
    -fo_FO.utf8
    -fr_BE
    -fr_BE@euro
    -fr_BE.utf8
    -fr_BE.utf8@euro
    -fr_CA
    -fr_CA.utf8
    -fr_CH
    -fr_CH.utf8
    -fr_FR
    -fr_FR@euro
    -fr_FR.utf8
    -fr_FR.utf8@euro
    -fr_LU
    -fr_LU@euro
    -fr_LU.utf8
    -fr_LU.utf8@euro
    -ga_IE
    -ga_IE@euro
    -ga_IE.utf8
    -ga_IE.utf8@euro
    -gl_ES
    -gl_ES@euro
    -gl_ES.utf8
    -gl_ES.utf8@euro
    -gv_GB
    -gv_GB.utf8
    -he_IL
    -he_IL.utf8
    -hi_IN
    -hr_HR
    -hr_HR.utf8
    -hu_HU
    -hu_HU.utf8
    -id_ID
    -id_ID.utf8
    -is_IS
    -is_IS.utf8
    -it_CH
    -it_CH.utf8
    -it_IT
    -it_IT@euro
    -it_IT.utf8
    -it_IT.utf8@euro
    -iw_IL
    -iw_IL.utf8
    -ja_JP.eucjp
    -ja_JP.utf8
    -ka_GE
    -kl_GL
    -kl_GL.utf8
    -ko_KR.euckr
    -ko_KR.utf8
    -kw_GB
    -kw_GB.utf8
    -lt_LT
    -lt_LT.utf8
    -lv_LV
    -lv_LV.utf8
    -mi_NZ
    -mk_MK
    -mk_MK.utf8
    -mr_IN
    -ms_MY
    -ms_MY.utf8
    -mt_MT
    -mt_MT.utf8
    -nl_BE
    -nl_BE@euro
    -nl_BE.utf8
    -nl_BE.utf8@euro
    -nl_NL
    -nl_NL@euro
    -nl_NL.utf8
    -nl_NL.utf8@euro
    -nn_NO
    -nn_NO.utf8
    -no_NO
    -no_NO.utf8
    -oc_FR
    -pl_PL
    -pl_PL.utf8
    -POSIX
    -pt_BR
    -pt_BR.utf8
    -pt_PT
    -pt_PT@euro
    -pt_PT.utf8
    -pt_PT.utf8@euro
    -ro_RO
    -ro_RO.utf8
    -ru_RU
    -ru_RU.koi8r
    -ru_RU.utf8
    -ru_UA
    -ru_UA.utf8
    -se_NO
    -sk_SK
    -sk_SK.utf8
    -sl_SI
    -sl_SI.utf8
    -sq_AL
    -sq_AL.utf8
    -sr_YU
    -sr_YU@cyrillic
    -sr_YU.utf8
    -sr_YU.utf8@cyrillic
    -sv_FI
    -sv_FI@euro
    -sv_FI.utf8
    -sv_FI.utf8@euro
    -sv_SE
    -sv_SE.iso885915
    -sv_SE.utf8
    -ta_IN
    -te_IN
    -tg_TJ
    -th_TH
    -th_TH.utf8
    -tl_PH
    -tr_TR
    -tr_TR.utf8
    -uk_UA
    -uk_UA.utf8
    -ur_PK
    -uz_UZ
    -vi_VN
    -vi_VN.tcvn
    -wa_BE
    -wa_BE@euro
    -yi_US
    -zh_CN
    -zh_CN.gb18030
    -zh_CN.gbk
    -zh_CN.utf8
    -zh_HK
    -zh_HK.utf8
    -zh_TW
    -zh_TW.euctw
    -zh_TW.utf8
    -
    -
    -
  • - -
  • `locale` displays environmental variables - that impact how locale("") will be deduced. - -
    -
    -LANG=en_US
    -LC_CTYPE="en_US"
    -LC_NUMERIC="en_US"
    -LC_TIME="en_US"
    -LC_COLLATE="en_US"
    -LC_MONETARY="en_US"
    -LC_MESSAGES="en_US"
    -LC_PAPER="en_US"
    -LC_NAME="en_US"
    -LC_ADDRESS="en_US"
    -LC_TELEPHONE="en_US"
    -LC_MEASUREMENT="en_US"
    -LC_IDENTIFICATION="en_US"
    -LC_ALL=
    -
    -
    -
  • -
- -

-From Josuttis, p. 697-698, which says, that "there is only *one* -relation (of the C++ locale mechanism) to the C locale mechanism: the -global C locale is modified if a named C++ locale object is set as the -global locale" (emphasis Paolo), that is: -

- std::locale::global(std::locale("")); - -

affects the C functions as if the following call was made:

- - std::setlocale(LC_ALL, ""); - -

-On the other hand, there is *no* viceversa, that is, calling setlocale -has *no* whatsoever on the C++ locale mechanism, in particular on the -working of locale(""), which constructs the locale object from the -environment of the running program, that is, in practice, the set of -LC_ALL, LANG, etc. variable of the shell. -

- - -

-4. Design -

- - -

-The major design challenge is fitting an object-orientated and -non-global locale design ontop of POSIX and other relevant stanards, -which include the Single Unix (nee X/Open.) -

- -

-Because POSIX falls down so completely, portibility is an issue. -

- -class _Impl -The internal representation of the std::locale object. - - -

-5. Examples -

- -More information can be found in the following testcases: -
    -
  • testsuite/22_locale/all
  • -
- -

-6. Unresolved Issues -

- -
    -
  • locale initialization: at what point does _S_classic, - _S_global get initialized? Can named locales assume this - initialization has already taken place?
  • - -
  • document how named locales error check when filling data - members. Ie, a fr_FR locale that doesn't have - numpunct::truename(): does it use "true"? Or is it a blank - string? What's the convention?
  • - -
  • explain how locale aliasing happens. When does "de_DE" - use "de" information? What is the rule for locales composed of - just an ISO language code (say, "de") and locales with both an - ISO language code and ISO country code (say, "de_DE").
  • - -
  • what should non-required facet instantiations do? If the - generic implemenation is provided, then how to end-users - provide specializations?
  • -
- -

-7. Acknowledgments -

- -

-8. Bibliography / Referenced Documents -

- -Drepper, Ulrich, GNU libc (glibc) 2.2 manual. In particular, Chapters "6. Character Set Handling" and "7 Locales and Internationalization" - -

-Drepper, Ulrich, Numerous, late-night email correspondence -

- -

-ISO/IEC 14882:1998 Programming languages - C++ -

- -

-ISO/IEC 9899:1999 Programming languages - C -

- -

-Langer, Angelika and Klaus Kreft, Standard C++ IOStreams and Locales, Advanced Programmer's Guide and Reference, Addison Wesley Longman, Inc. 2000 -

- -

-Stroustrup, Bjarne, Appendix D, The C++ Programming Language, Special Edition, Addison Wesley, Inc. 2000 -

- -

-System Interface Definitions, Issue 6 (IEEE Std. 1003.1-200x) -The Open Group/The Institute of Electrical and Electronics Engineers, Inc. -http://www.opennc.org/austin/docreg.html -

- - - - - diff --git a/libstdc++-v3/docs/html/22_locale/messages.html b/libstdc++-v3/docs/html/22_locale/messages.html deleted file mode 100644 index bb096c09e7f..00000000000 --- a/libstdc++-v3/docs/html/22_locale/messages.html +++ /dev/null @@ -1,461 +0,0 @@ - - - - - - - - - - Notes on the messages implementation. - - - - - - - -

-Notes on the messages implementation. -

- -prepared by Benjamin Kosnik (bkoz@redhat.com) on August 8, 2001 - - -

-1. Abstract -

-

-The std::messages facet implements message retrieval functionality -equivalent to Java's java.text.MessageFormat .using either GNU gettext -or IEEE 1003.1-200 functions. -

- -

-2. What the standard says -

-The std::messages facet is probably the most vaguely defined facet in -the standard library. It's assumed that this facility was built into -the standard library in order to convert string literals from one -locale to the other. For instance, converting the "C" locale's -const char* c = "please" to a German-localized "bitte" -during program execution. - -
-22.2.7.1 - Template class messages [lib.locale.messages] -
- -This class has three public member functions, which directly -correspond to three protected virtual member functions. - -The public member functions are: - -

-catalog open(const string&, const locale&) const -

- -

-string_type get(catalog, int, int, const string_type&) const -

- -

-void close(catalog) const -

- -

-While the virtual functions are: -

- -

-catalog do_open(const string&, const locale&) const -

-
- --1- Returns: A value that may be passed to get() to retrieve a -message, from the message catalog identified by the string name -according to an implementation-defined mapping. The result can be used -until it is passed to close(). Returns a value less than 0 if no such -catalog can be opened. - -
- -

-string_type do_get(catalog, int, int, const string_type&) const -

-
- --3- Requires: A catalog cat obtained from open() and not yet closed. --4- Returns: A message identified by arguments set, msgid, and dfault, -according to an implementation-defined mapping. If no such message can -be found, returns dfault. - -
- -

-void do_close(catalog) const -

-
- --5- Requires: A catalog cat obtained from open() and not yet closed. --6- Effects: Releases unspecified resources associated with cat. --7- Notes: The limit on such resources, if any, is implementation-defined. - -
- - -

-3. Problems with "C" messages: thread safety, -over-specification, and assumptions. -

-A couple of notes on the standard. - -

-First, why is messages_base::catalog specified as a typedef -to int? This makes sense for implementations that use -catopen, but not for others. Fortunately, it's not heavily -used and so only a minor irritant. -

- -

-Second, by making the member functions const, it is -impossible to save state in them. Thus, storing away information used -in the 'open' member function for use in 'get' is impossible. This is -unfortunate. -

- -

-The 'open' member function in particular seems to be oddly -designed. The signature seems quite peculiar. Why specify a const -string& argument, for instance, instead of just const -char*? Or, why specify a const locale& argument that is -to be used in the 'get' member function? How, exactly, is this locale -argument useful? What was the intent? It might make sense if a locale -argument was associated with a given default message string in the -'open' member function, for instance. Quite murky and unclear, on -reflection. -

- -

-Lastly, it seems odd that messages, which explicitly require code -conversion, don't use the codecvt facet. Because the messages facet -has only one template parameter, it is assumed that ctype, and not -codecvt, is to be used to convert between character sets. -

- -

-It is implicitly assumed that the locale for the default message -string in 'get' is in the "C" locale. Thus, all source code is assumed -to be written in English, so translations are always from "en_US" to -other, explicitly named locales. -

- -

-4. Design and Implementation Details -

-This is a relatively simple class, on the face of it. The standard -specifies very little in concrete terms, so generic implementations -that are conforming yet do very little are the norm. Adding -functionality that would be useful to programmers and comparable to -Java's java.text.MessageFormat takes a bit of work, and is highly -dependent on the capabilities of the underlying operating system. - -

-Three different mechanisms have been provided, selectable via -configure flags: -

- -
    -
  • generic -

    - This model does very little, and is what is used by default. -

    -
  • - -
  • gnu -

    - The gnu model is complete and fully tested. It's based on the - GNU gettext package, which is part of glibc. It uses the functions - textdomain, bindtextdomain, gettext - to implement full functionality. Creating message - catalogs is a relatively straight-forward process and is - lightly documented below, and fully documented in gettext's - distributed documentation. -

    -
  • - -
  • ieee_1003.1-200x -

    - This is a complete, though untested, implementation based on - the IEEE standard. The functions - catopen, catgets, catclose - are used to retrieve locale-specific messages given the - appropriate message catalogs that have been constructed for - their use. Note, the script po2msg.sed that is part - of the gettext distribution can convert gettext catalogs into - catalogs that catopen can use. -

    -
  • -
- -

-A new, standards-conformant non-virtual member function signature was -added for 'open' so that a directory could be specified with a given -message catalog. This simplifies calling conventions for the gnu -model. -

- -

-The rest of this document discusses details of the GNU model. -

- -

-The messages facet, because it is retrieving and converting between -characters sets, depends on the ctype and perhaps the codecvt facet in -a given locale. In addition, underlying "C" library locale support is -necessary for more than just the LC_MESSAGES mask: -LC_CTYPE is also necessary. To avoid any unpleasantness, all -bits of the "C" mask (ie LC_ALL) are set before retrieving -messages. -

- -

-Making the message catalogs can be initially tricky, but become quite -simple with practice. For complete info, see the gettext -documentation. Here's an idea of what is required: -

- -
    -
  • Make a source file with the required string literals - that need to be translated. See - intl/string_literals.cc for an example. -
  • - -
  • Make initial catalog (see "4 Making the PO Template File" - from the gettext docs). -

    - xgettext --c++ --debug string_literals.cc -o libstdc++.pot -

    -
  • - -
  • Make language and country-specific locale catalogs. -

    - cp libstdc++.pot fr_FR.po -

    -

    - cp libstdc++.pot de_DE.po -

    -
  • - -
  • Edit localized catalogs in emacs so that strings are - translated. -

    - emacs fr_FR.po -

    -
  • - -
  • Make the binary mo files. -

    - msgfmt fr_FR.po -o fr_FR.mo -

    -

    - msgfmt de_DE.po -o de_DE.mo -

    -
  • - -
  • Copy the binary files into the correct directory structure. -

    - cp fr_FR.mo (dir)/fr_FR/LC_MESSAGES/libstdc++.mo -

    -

    - cp de_DE.mo (dir)/de_DE/LC_MESSAGES/libstdc++.mo -

    -
  • - -
  • Use the new message catalogs. -

    - locale loc_de("de_DE"); -

    -

    - - use_facet<messages<char> >(loc_de).open("libstdc++", locale(), dir); - -

    -
  • -
- -

-5. Examples -

- -
    -
  • message converting, simple example using the GNU model. - -
    -#include <iostream>
    -#include <locale>
    -using namespace std;
    -
    -void test01()
    -{
    -  typedef messages<char>::catalog catalog;
    -  const char* dir =
    -  "/mnt/egcs/build/i686-pc-linux-gnu/libstdc++/po/share/locale";  
    -  const locale loc_de("de_DE");
    -  const messages<char>& mssg_de = use_facet<messages<char> >(loc_de); 
    -
    -  catalog cat_de = mssg_de.open("libstdc++", loc_de, dir);
    -  string s01 = mssg_de.get(cat_de, 0, 0, "please");
    -  string s02 = mssg_de.get(cat_de, 0, 0, "thank you");
    -  cout << "please in german:" << s01 << '\n';
    -  cout << "thank you in german:" << s02 << '\n';
    -  mssg_de.close(cat_de);
    -}
    -
    -
  • -
- -More information can be found in the following testcases: -
    -
  • testsuite/22_locale/messages.cc
  • -
  • testsuite/22_locale/messages_byname.cc
  • -
  • testsuite/22_locale/messages_char_members.cc
  • -
- -

-6. Unresolved Issues -

-
    -
  • Things that are sketchy, or remain unimplemented: -
      -
    • _M_convert_from_char, _M_convert_to_char are in - flux, depending on how the library ends up doing - character set conversions. It might not be possible to - do a real character set based conversion, due to the - fact that the template parameter for messages is not - enough to instantiate the codecvt facet (1 supplied, - need at least 2 but would prefer 3). -
    • - -
    • There are issues with gettext needing the global - locale set to extract a message. This dependence on - the global locale makes the current "gnu" model non - MT-safe. Future versions of glibc, ie glibc 2.3.x will - fix this, and the C++ library bits are already in - place. -
    • -
    -
  • - -
  • Development versions of the GNU "C" library, glibc 2.3 will allow - a more efficient, MT implementation of std::messages, and will - allow the removal of the _M_name_messages data member. If this - is done, it will change the library ABI. The C++ parts to - support glibc 2.3 have already been coded, but are not in use: - once this version of the "C" library is released, the marked - parts of the messages implementation can be switched over to - the new "C" library functionality. -
  • -
  • At some point in the near future, std::numpunct will probably use - std::messages facilities to implement truename/falename - correctly. This is currently not done, but entries in - libstdc++.pot have already been made for "true" and "false" - string literals, so all that remains is the std::numpunct - coding and the configure/make hassles to make the installed - library search its own catalog. Currently the libstdc++.mo - catalog is only searched for the testsuite cases involving - messages members. -
  • - -
  • The following member functions: - -

    - - catalog - open(const basic_string<char>& __s, const locale& __loc) const - -

    - -

    - - catalog - open(const basic_string<char>&, const locale&, const char*) const; - -

    - -

    - Don't actually return a "value less than 0 if no such catalog - can be opened" as required by the standard in the "gnu" - model. As of this writing, it is unknown how to query to see - if a specified message catalog exists using the gettext - package. -

    -
  • -
- -

-7. Acknowledgments -

-Ulrich Drepper for the character set explanations, gettext details, -and patient answering of late-night questions, Tom Tromey for the java details. - - -

-8. Bibliography / Referenced Documents -

- -Drepper, Ulrich, GNU libc (glibc) 2.2 manual. In particular, Chapters -"7 Locales and Internationalization" - -

-Drepper, Ulrich, Thread-Aware Locale Model, A proposal. This is a -draft document describing the design of glibc 2.3 MT locale -functionality. -

- -

-Drepper, Ulrich, Numerous, late-night email correspondence -

- -

-ISO/IEC 9899:1999 Programming languages - C -

- -

-ISO/IEC 14882:1998 Programming languages - C++ -

- -

-Java 2 Platform, Standard Edition, v 1.3.1 API Specification. In -particular, java.util.Properties, java.text.MessageFormat, -java.util.Locale, java.util.ResourceBundle. -http://java.sun.com/j2se/1.3/docs/api -

- -

-System Interface Definitions, Issue 7 (IEEE Std. 1003.1-200x) -The Open Group/The Institute of Electrical and Electronics Engineers, Inc. -In particular see lines 5268-5427. -http://www.opennc.org/austin/docreg.html -

- -

GNU gettext tools, version 0.10.38, Native Language Support -Library and Tools. -http://sources.redhat.com/gettext -

- -

-Langer, Angelika and Klaus Kreft, Standard C++ IOStreams and Locales, -Advanced Programmer's Guide and Reference, Addison Wesley Longman, -Inc. 2000. See page 725, Internationalized Messages. -

- -

-Stroustrup, Bjarne, Appendix D, The C++ Programming Language, Special Edition, Addison Wesley, Inc. 2000 -

- - - - diff --git a/libstdc++-v3/docs/html/23_containers/howto.html b/libstdc++-v3/docs/html/23_containers/howto.html deleted file mode 100644 index c4b6eb856f5..00000000000 --- a/libstdc++-v3/docs/html/23_containers/howto.html +++ /dev/null @@ -1,457 +0,0 @@ - - - - - - - - - - - libstdc++ HOWTO: Chapter 23: Containers - - - - - - - - - -

Chapter 23: Containers

- -

Chapter 23 deals with container classes and what they offer. -

- - - -
-

Contents

- - -
- - - -

Making code unaware of the container/array difference

-

You're writing some code and can't decide whether to use builtin - arrays or some kind of container. There are compelling reasons - to use one of the container classes, but you're afraid that you'll - eventually run into difficulties, change everything back to arrays, - and then have to change all the code that uses those data types to - keep up with the change. -

-

If your code makes use of the standard algorithms, this isn't as - scary as it sounds. The algorithms don't know, nor care, about - the kind of "container" on which they work, since the - algorithms are only given endpoints to work with. For the container - classes, these are iterators (usually begin() and - end(), but not always). For builtin arrays, these are - the address of the first element and the - past-the-end element. -

-

Some very simple wrapper functions can hide all of that from the - rest of the code. For example, a pair of functions called - beginof can be written, one that takes an array, another - that takes a vector. The first returns a pointer to the first - element, and the second returns the vector's begin() - iterator. -

-

The functions should be made template functions, and should also - be declared inline. As pointed out in the comments in the code - below, this can lead to beginof being optimized out of - existence, so you pay absolutely nothing in terms of increased - code size or execution time. -

-

The result is that if all your algorithm calls look like -

-
-   std::transform(beginof(foo), endof(foo), beginof(foo), SomeFunction);
-

then the type of foo can change from an array of ints to a vector - of ints to a deque of ints and back again, without ever changing any - client code. -

-

This author has a collection of such functions, called "*of" - because they all extend the builtin "sizeof". It started - with some Usenet discussions on a transparent way to find the length - of an array. A simplified and much-reduced version for easier - reading is given here. -

-

Astute readers will notice two things at once: first, that the - container class is still a vector<T> instead of a - more general Container<T>. This would mean that - three functions for deque would have to be added, another - three for list, and so on. This is due to problems with - getting template resolution correct; I find it easier just to - give the extra three lines and avoid confusion. -

-

Second, the line -

-
-    inline unsigned int lengthof (T (&)[sz]) { return sz; } 
-

looks just weird! Hint: unused parameters can be left nameless. -

-

Return to top of page or - to the FAQ. -

- -
-

Variable-sized bitmasks

-

No, you cannot write code of the form -

- -
-      #include <bitset>
-
-      void foo (size_t n)
-      {
-          std::bitset<n>   bits;
-          ....
-      } 
-

because n must be known at compile time. Your compiler is - correct; it is not a bug. That's the way templates work. (Yes, it - is a feature.) -

-

There are a couple of ways to handle this kind of thing. Please - consider all of them before passing judgement. They include, in - no particular order: -

-
    -
  • A very large N in bitset<N>.
  • -
  • A container<bool>.
  • -
  • Extremely weird solutions.
  • -
-

A very large N in - bitset<N>.   It has - been pointed out a few times in newsgroups that N bits only takes up - (N/8) bytes on most systems, and division by a factor of eight is pretty - impressive when speaking of memory. Half a megabyte given over to a - bitset (recall that there is zero space overhead for housekeeping info; - it is known at compile time exactly how large the set is) will hold over - four million bits. If you're using those bits as status flags (e.g., - "changed"/"unchanged" flags), that's a lot - of state. -

-

You can then keep track of the "maximum bit used" during some - testing runs on representative data, make note of how many of those bits - really need to be there, and then reduce N to a smaller number. Leave - some extra space, of course. (If you plan to write code like the - incorrect example above, where the bitset is a local variable, then you - may have to talk your compiler into allowing that much stack space; - there may be zero space overhead, but it's all allocated inside the - object.) -

-

A container<bool>.   The Committee - made provision - for the space savings possible with that (N/8) usage previously mentioned, - so that you don't have to do wasteful things like - Container<char> or - Container<short int>. - Specifically, vector<bool> is required to be - specialized for that space savings. -

-

The problem is that vector<bool> doesn't behave like a - normal vector anymore. There have been recent journal articles which - discuss the problems (the ones by Herb Sutter in the May and - July/August 1999 issues of - C++ Report cover it well). Future revisions of the ISO C++ - Standard will change the requirement for vector<bool> - specialization. In the meantime, deque<bool> is - recommended (although its behavior is sane, you probably will not get - the space savings, but the allocation scheme is different than that - of vector). -

-

Extremely weird solutions.   If you have - access to - the compiler and linker at runtime, you can do something insane, like - figuring out just how many bits you need, then writing a temporary - source code file. That file contains an instantiation of - bitset - for the required number of bits, inside some wrapper functions with - unchanging signatures. Have your program then call the - compiler on that file using Position Independent Code, then open the - newly-created object file and load those wrapper functions. You'll have - an instantiation of bitset<N> for the exact - N - that you need at the time. Don't forget to delete the temporary files. - (Yes, this can be, and has been, done.) -

- -

This would be the approach of either a visionary genius or a raving - lunatic, depending on your programming and management style. Probably - the latter. -

-

Which of the above techniques you use, if any, are up to you and your - intended application. Some time/space profiling is indicated if it - really matters (don't just guess). And, if you manage to do anything - along the lines of the third category, the author would love to hear - from you... -

-

Also note that the implementation of bitset used in libstdc++ has - some extensions. -

-

Return to top of page or - to the FAQ. -

- -
-

Containers and multithreading

-

This section discusses issues surrounding the design of - multithreaded applications which use Standard C++ containers. - All information in this section is current as of the gcc 3.0 - release and all later point releases. Although earlier gcc - releases had a different approach to threading configuration and - proper compilation, the basic code design rules presented here - were similar. For information on all other aspects of - multithreading as it relates to libstdc++, including details on - the proper compilation of threaded code (and compatibility between - threaded and non-threaded code), see Chapter 17. -

-

Two excellent pages to read when working with the Standard C++ - containers and threads are - SGI's - http://www.sgi.com/tech/stl/thread_safety.html and - SGI's - http://www.sgi.com/tech/stl/Allocators.html. -

-

However, please ignore all discussions about the user-level - configuration of the lock implementation inside the STL - container-memory allocator on those pages. For the sake of this - discussion, libstdc++ configures the SGI STL implementation, - not you. This is quite different from how gcc pre-3.0 worked. - In particular, past advice was for people using g++ to - explicitly define _PTHREADS or other macros or port-specific - compilation options on the command line to get a thread-safe - STL. This is no longer required for any port and should no - longer be done unless you really know what you are doing and - assume all responsibility. -

-

Since the container implementation of libstdc++ uses the SGI - code, we use the same definition of thread safety as SGI when - discussing design. A key point that beginners may miss is the - fourth major paragraph of the first page mentioned above - ("For most clients,"...), which points out that - locking must nearly always be done outside the container, by - client code (that'd be you, not us). There is a notable - exceptions to this rule. Allocators called while a container or - element is constructed uses an internal lock obtained and - released solely within libstdc++ code (in fact, this is the - reason STL requires any knowledge of the thread configuration). -

-

For implementing a container which does its own locking, it is - trivial to provide a wrapper class which obtains the lock (as - SGI suggests), performs the container operation, and then - releases the lock. This could be templatized to a certain - extent, on the underlying container and/or a locking - mechanism. Trying to provide a catch-all general template - solution would probably be more trouble than it's worth. -

-

The STL implementation is currently configured to use the - high-speed caching memory allocator. Some people like to - test and/or normally run threaded programs with a different - default. For all details about how to globally override this - at application run-time see here. -

-

There is a better way (not standardized yet): It is possible to - force the malloc-based allocator on a per-case-basis for some - application code. The library team generally believes that this - is a better way to tune an application for high-speed using this - implementation of the STL. There is - more information on allocators here. -

-

Return to top of page or - to the FAQ. -

- -
-

"Hinting" during insertion

-

Section [23.1.2], Table 69, of the C++ standard lists this function - for all of the associative containers (map, set, etc): -

-
-      a.insert(p,t);
-

where 'p' is an iterator into the container 'a', and 't' is the item - to insert. The standard says that "t is inserted - as close as possible to the position just prior to - p." (Library DR #233 addresses this topic, referring to - N1780. - Since version 4.2 GCC implements the resolution to DR 233, so that - insertions happen as close as possible to the hint. For earlier releases - the hint was only used as described below. -

-

Here we'll describe how the hinting works in the libstdc++ - implementation, and what you need to do in order to take advantage of - it. (Insertions can change from logarithmic complexity to amortized - constant time, if the hint is properly used.) Also, since the current - implementation is based on the SGI STL one, these points may hold true - for other library implementations also, since the HP/SGI code is used - in a lot of places. -

-

In the following text, the phrases greater than and less - than refer to the results of the strict weak ordering imposed on - the container by its comparison object, which defaults to (basically) - "<". Using those phrases is semantically sloppy, but I - didn't want to get bogged down in syntax. I assume that if you are - intelligent enough to use your own comparison objects, you are also - intelligent enough to assign "greater" and "lesser" - their new meanings in the next paragraph. *grin* -

-

If the hint parameter ('p' above) is equivalent to: -

-
    -
  • begin(), then the item being inserted should have a key - less than all the other keys in the container. The item will - be inserted at the beginning of the container, becoming the new - entry at begin(). -
  • -
  • end(), then the item being inserted should have a key - greater than all the other keys in the container. The item will - be inserted at the end of the container, becoming the new entry - at end(). -
  • -
  • neither begin() nor end(), then: Let h - be the entry in the container pointed to by hint, that - is, h = *hint. Then the item being inserted should have - a key less than that of h, and greater than that of the - item preceding h. The new item will be inserted - between h and h's predecessor. -
  • -
-

For multimap and multiset, the restrictions are - slightly looser: "greater than" should be replaced by - "not less than" and "less than" should be replaced - by "not greater than." (Why not replace greater with - greater-than-or-equal-to? You probably could in your head, but the - mathematicians will tell you that it isn't the same thing.) -

-

If the conditions are not met, then the hint is not used, and the - insertion proceeds as if you had called a.insert(t) - instead. (Note that GCC releases prior to 3.0.2 - had a bug in the case with hint == begin() for the - map and set classes. You should not use a hint - argument in those releases.) -

-

This behavior goes well with other containers' insert() - functions which take an iterator: if used, the new item will be - inserted before the iterator passed as an argument, same as the other - containers. -

-

Note also that the hint in this implementation is a - one-shot. The older insertion-with-hint routines check the immediately - surrounding entries to ensure that the new item would in fact belong - there. If the hint does not point to the correct place, then no - further local searching is done; the search begins from scratch in - logarithmic time. -

-

Return to top of page or - to the FAQ. -

- -
-

Bitmasks and string arguments

-

Bitmasks do not take char* nor const char* arguments in their - constructors. This is something of an accident, but you can read - about the problem: follow the library's "Links" from the - homepage, and from the C++ information "defect reflector" - link, select the library issues list. Issue number 116 describes the - problem. -

-

For now you can simply make a temporary string object using the - constructor expression: -

-
-      std::bitset<5> b ( std::string("10110") );
-      
- instead of -
-      std::bitset<5> b ( "10110" );    // invalid
-      
-

Return to top of page or - to the FAQ. -

- -
-

std::list::size() is O(n)!

-

Yes it is, and that's okay. This is a decision that we preserved when - we imported SGI's STL implementation. The following is quoted from - their FAQ: -

-
-

The size() member function, for list and slist, takes time - proportional to the number of elements in the list. This was a - deliberate tradeoff. The only way to get a constant-time size() for - linked lists would be to maintain an extra member variable containing - the list's size. This would require taking extra time to update that - variable (it would make splice() a linear time operation, for example), - and it would also make the list larger. Many list algorithms don't - require that extra word (algorithms that do require it might do better - with vectors than with lists), and, when it is necessary to maintain - an explicit size count, it's something that users can do themselves. -

-

This choice is permitted by the C++ standard. The standard says that - size() "should" be constant time, and "should" - does not mean the same thing as "shall". This is the - officially recommended ISO wording for saying that an implementation - is supposed to do something unless there is a good reason not to. -

-

One implication of linear time size(): you should never write -

-
-         if (L.size() == 0)
-             ...
- Instead, you should write -
-         if (L.empty())
-             ...
-
-

Return to top of page or - to the FAQ. -

- -
-

Space overhead management for vectors

-

In - this - message to the list, Daniel Kostecky announced work on an - alternate form of std::vector that would support hints - on the number of elements to be over-allocated. The design was also - described, along with possible implementation choices. -

-

The first two alpha releases were announced - here - and - here. - The releases themselves are available at - - http://www.kotelna.sk/dk/sw/caphint/. -

-

Return to top of page or - to the FAQ. -

- - - - -
-

-See license.html for copying conditions. -Comments and suggestions are welcome, and may be sent to -the libstdc++ mailing list. -

- - - - diff --git a/libstdc++-v3/docs/html/23_containers/wrappers_h.txt b/libstdc++-v3/docs/html/23_containers/wrappers_h.txt deleted file mode 100644 index 53b59204220..00000000000 --- a/libstdc++-v3/docs/html/23_containers/wrappers_h.txt +++ /dev/null @@ -1,48 +0,0 @@ - -/***************************************************************** - * Functions to help treat arrays in a uniform manner. These were - * inspired by a thread on comp.lang.c++.moderated, started by Dietmar - * Kuehl and contributed to by the rest of the entire planet. - * - * beginof (x), endof (x), lengthof (x) now accompany sizeof, where x - * can be either a container (currently only sequences) or a builtin - * array (/not/ a pointer). The beginof/endof are intended for use in - * the algorithms library, and lengthof is a "sizing" function. - * - * Note example: - * char an_array [17]; - * cerr << lengthof(an_array) << endl; - * produces assembly code of - * mov 17,register0 - * call ofstream_put - * i.e., the template function inlining really does work; g++ - * requires -O3 (or -finline-functions) before it does this, though. - * - * pedwards 13Nov98 -*/ -// beginof -template - inline typename vector::iterator beginof (vector &v) - { return v.begin(); } - -template - inline T* beginof (T (&array)[sz]) { return array; } - - -// endof -template - inline typename vector::iterator endof (vector &v) - { return v.end(); } - -template - inline T* endof (T (&array)[sz]) { return array + sz; } - - -// lengthof -template - inline typename vector::size_type lengthof (vector &v) - { return v.size(); } - -template - inline unsigned int lengthof (T (&)[sz]) { return sz; } - diff --git a/libstdc++-v3/docs/html/24_iterators/howto.html b/libstdc++-v3/docs/html/24_iterators/howto.html deleted file mode 100644 index 7c2f106ac31..00000000000 --- a/libstdc++-v3/docs/html/24_iterators/howto.html +++ /dev/null @@ -1,200 +0,0 @@ - - - - - - - - - - - libstdc++ HOWTO: Chapter 24: Iterators - - - - - - - - - -

Chapter 24: Iterators

- -

Chapter 24 deals with the FORTRAN subroutines for automatically - transforming lemmings into gold. -

- - - -
-

Contents

- - -
- - - -

They ain't pointers!

-

FAQ 5.1 points out that iterators - are not implemented as pointers. They are a generalization of - pointers, but they are implemented in libstdc++ as separate classes. -

-

Keeping that simple fact in mind as you design your code will - prevent a whole lot of difficult-to-understand bugs. -

-

You can think of it the other way 'round, even. Since iterators - are a generalization, that means that pointers are - iterators, and that pointers can be used whenever an - iterator would be. All those functions in the Algorithms chapter - of the Standard will work just as well on plain arrays and their - pointers. -

-

That doesn't mean that when you pass in a pointer, it gets wrapped - into some special delegating iterator-to-pointer class with a layer - of overhead. (If you think that's the case anywhere, you don't - understand templates to begin with...) Oh, no; if you pass - in a pointer, then the compiler will instantiate that template - using T* as a type, and good old high-speed pointer arithmetic as - its operations, so the resulting code will be doing exactly the same - things as it would be doing if you had hand-coded it yourself (for - the 273rd time). -

-

How much overhead is there when using an iterator class? - Very little. Most of the layering classes contain nothing but - typedefs, and typedefs are "meta-information" that simply - tell the compiler some nicknames; they don't create code. That - information gets passed down through inheritance, so while the - compiler has to do work looking up all the names, your runtime code - does not. (This has been a prime concern from the beginning.) -

-

Return to top of page or - to the FAQ. -

- -
-

It ends where?

-

This starts off sounding complicated, but is actually very easy, - especially towards the end. Trust me. -

-

Beginners usually have a little trouble understand the whole - 'past-the-end' thing, until they remember their early algebra classes - (see, they told you that stuff would come in handy!) and - the concept of half-open ranges. -

-

First, some history, and a reminder of some of the funkier rules in - C and C++ for builtin arrays. The following rules have always been - true for both languages: -

-
    -
  1. You can point anywhere in the array, or to the first element - past the end of the array. A pointer that points to one - past the end of the array is guaranteed to be as unique as a - pointer to somewhere inside the array, so that you can compare - such pointers safely. -
  2. -
  3. You can only dereference a pointer that points into an array. - If your array pointer points outside the array -- even to just - one past the end -- and you dereference it, Bad Things happen. -
  4. -
  5. Strictly speaking, simply pointing anywhere else invokes - undefined behavior. Most programs won't puke until such a - pointer is actually dereferenced, but the standards leave that - up to the platform. -
  6. -
-

The reason this past-the-end addressing was allowed is to make it - easy to write a loop to go over an entire array, e.g., - while (*d++ = *s++);. -

-

So, when you think of two pointers delimiting an array, don't think - of them as indexing 0 through n-1. Think of them as boundary - markers: -

-
-
-   beginning            end
-     |                   |
-     |                   |               This is bad.  Always having to
-     |                   |               remember to add or subtract one.
-     |                   |               Off-by-one bugs very common here.
-     V                   V
-        array of N elements
-     |---|---|--...--|---|---|
-     | 0 | 1 |  ...  |N-2|N-1|
-     |---|---|--...--|---|---|
-
-     ^                       ^
-     |                       |
-     |                       |           This is good.  This is safe.  This
-     |                       |           is guaranteed to work.  Just don't
-     |                       |           dereference 'end'.
-   beginning                end
-
-   
-

See? Everything between the boundary markers is part of the array. - Simple. -

-

Now think back to your junior-high school algebra course, when you - were learning how to draw graphs. Remember that a graph terminating - with a solid dot meant, "Everything up through this point," - and a graph terminating with an open dot meant, "Everything up - to, but not including, this point," respectively called closed - and open ranges? Remember how closed ranges were written with - brackets, [a,b], and open ranges were written with parentheses, - (a,b)? -

-

The boundary markers for arrays describe a half-open range, - starting with (and including) the first element, and ending with (but - not including) the last element: [beginning,end). See, I - told you it would be simple in the end. -

-

Iterators, and everything working with iterators, follows this same - time-honored tradition. A container's begin() method returns - an iterator referring to the first element, and its end() - method returns a past-the-end iterator, which is guaranteed to be - unique and comparable against any other iterator pointing into the - middle of the container. -

-

Container constructors, container methods, and algorithms, all take - pairs of iterators describing a range of values on which to operate. - All of these ranges are half-open ranges, so you pass the beginning - iterator as the starting parameter, and the one-past-the-end iterator - as the finishing parameter. -

-

This generalizes very well. You can operate on sub-ranges quite - easily this way; functions accepting a [first,last) range - don't know or care whether they are the boundaries of an entire {array, - sequence, container, whatever}, or whether they only enclose a few - elements from the center. This approach also makes zero-length - sequences very simple to recognize: if the two endpoints compare - equal, then the {array, sequence, container, whatever} is empty. -

-

Just don't dereference end(). -

-

Return to top of page or - to the FAQ. -

- - - - - - -
-

-See license.html for copying conditions. -Comments and suggestions are welcome, and may be sent to -the libstdc++ mailing list. -

- - - - diff --git a/libstdc++-v3/docs/html/25_algorithms/howto.html b/libstdc++-v3/docs/html/25_algorithms/howto.html deleted file mode 100644 index bb5caee354a..00000000000 --- a/libstdc++-v3/docs/html/25_algorithms/howto.html +++ /dev/null @@ -1,116 +0,0 @@ - - - - - - - - - - - libstdc++ HOWTO: Chapter 25: Algorithms - - - - - - - - - -

Chapter 25: Algorithms

- -

Chapter 25 deals with the generalized subroutines for automatically - transforming lemmings into gold. -

- - - -
-

Contents

- - -
- - - -

Prerequisites

-

The neatest accomplishment of the algorithms chapter is that all the - work is done via iterators, not containers directly. This means two - important things: -

-
    -
  1. Anything that behaves like an iterator can be used in one of - these algorithms. Raw pointers make great candidates, thus - built-in arrays are fine containers, as well as your own iterators. -
  2. -
  3. The algorithms do not (and cannot) affect the container as a - whole; only the things between the two iterator endpoints. If - you pass a range of iterators only enclosing the middle third of - a container, then anything outside that range is inviolate. -
  4. -
-

Even strings can be fed through the algorithms here, although the - string class has specialized versions of many of these functions (for - example, string::find()). Most of the examples on this - page will use simple arrays of integers as a playground for - algorithms, just to keep things simple. - The use of N as a size in the - examples is to keep things easy to read but probably won't be valid - code. You can use wrappers such as those described in the - containers chapter to keep - real code readable. -

-

The single thing that trips people up the most is the definition of - range used with iterators; the famous - "past-the-end" rule that everybody loves to hate. The - iterators chapter of this - document has a complete explanation of this simple rule that seems to - cause so much confusion. Once you get range into your head - (it's not that hard, honest!), then the algorithms are a cakewalk. -

-

Return to top of page or - to the FAQ. -

- -
-

Special swaps

-

If you call std::swap(x,y); where x and y are standard - containers, then the call will automatically be replaced by a call to - x.swap(y); instead. -

-

This allows member functions of each container class to take over, and - containers' swap functions should have O(1) complexity according to - the standard. (And while "should" allows implementations to - behave otherwise and remain compliant, this implementation does in - fact use constant-time swaps.) This should not be surprising, since - for two containers of the same type to swap contents, only some - internal pointers to storage need to be exchanged. -

-

Return to top of page or - to the FAQ. -

- - - - - - -
-

-See license.html for copying conditions. -Comments and suggestions are welcome, and may be sent to -the libstdc++ mailing list. -

- - - - diff --git a/libstdc++-v3/docs/html/26_numerics/howto.html b/libstdc++-v3/docs/html/26_numerics/howto.html deleted file mode 100644 index e56659b3804..00000000000 --- a/libstdc++-v3/docs/html/26_numerics/howto.html +++ /dev/null @@ -1,179 +0,0 @@ - - - - - - - - - - - libstdc++ HOWTO: Chapter 26: Numerics - - - - - - - - - -

Chapter 26: Numerics

- -

Chapter 26 deals with building block abstractions to aid in - numerical computing: -

-
    -
  • Template data structures such as valarray<> - and complex<>. -
  • -
  • Template numerical functions such as accumulate, - inner_product, partial_sum, and - adjacent_difference. -
  • -
-

All of the Standard C math functions are of course included in C++, - and overloaded versions for long, float, and - long double have been added for all of them. -

- - -
-

Contents

- - -
- - - -

Complex Number Processing

-

Using complex<> becomes even more comple- er, sorry, - complicated, with the not-quite-gratuitously-incompatible - addition of complex types to the C language. David Tribble has - compiled a list of C++98 and C99 conflict points; his description of - C's new type versus those of C++ and how to get them playing together - nicely is -here. -

-

complex<> is intended to be instantiated with a - floating-point type. As long as you meet that and some other basic - requirements, then the resulting instantiation has all of the usual - math operators defined, as well as definitions of op<< - and op>> that work with iostreams: op<< - prints (u,v) and op>> can read u, - (u), and (u,v). -

-

Return to top of page or - to the FAQ. -

- -
-

Array Processing

-

One of the major reasons why FORTRAN can chew through numbers so well - is that it is defined to be free of pointer aliasing, an assumption - that C89 is not allowed to make, and neither is C++98. C99 adds a new - keyword, restrict, to apply to individual pointers. The - C++ solution is contained in the library rather than the language - (although many vendors can be expected to add this to their compilers - as an extension). -

-

That library solution is a set of two classes, five template classes, - and "a whole bunch" of functions. The classes are required - to be free of pointer aliasing, so compilers can optimize the - daylights out of them the same way that they have been for FORTRAN. - They are collectively called valarray, although strictly - speaking this is only one of the five template classes, and they are - designed to be familiar to people who have worked with the BLAS - libraries before. -

-

Some more stuff should go here once somebody has time to write it. -

-

Return to top of page or - to the FAQ. -

- -
-

Numerical Functions

-

There are four generalized functions in the <numeric> header - that follow the same conventions as those in <algorithm>. Each - of them is overloaded: one signature for common default operations, - and a second for fully general operations. Their names are - self-explanatory to anyone who works with numerics on a regular basis: -

-
    -
  • accumulate
  • -
  • inner_product
  • -
  • partial_sum
  • -
  • adjacent_difference
  • -
-

Here is a simple example of the two forms of accumulate. -

-
-   int   ar[50];
-   int   someval = somefunction();
-
-   // ...initialize members of ar to something...
-
-   int  sum       = std::accumulate(ar,ar+50,0);
-   int  sum_stuff = std::accumulate(ar,ar+50,someval);
-   int  product   = std::accumulate(ar,ar+50,1,std::multiplies<int>());
-   
-

The first call adds all the members of the array, using zero as an - initial value for sum. The second does the same, but uses - someval as the starting value (thus, sum_stuff == sum + - someval). The final call uses the second of the two signatures, - and multiplies all the members of the array; here we must obviously - use 1 as a starting value instead of 0. -

-

The other three functions have similar dual-signature forms. -

-

Return to top of page or - to the FAQ. -

- -
-

C99

-

In addition to the other topics on this page, we'll note here some - of the C99 features that appear in libstdc++. -

-

The C99 features depend on the --enable-c99 configure flag. - This flag is already on by default, but it can be disabled by the - user. Also, the configuration machinery will disable it if the - necessary support for C99 (e.g., header files) cannot be found. -

-

As of GCC 3.0, C99 support includes classification functions - such as isnormal, isgreater, - isnan, etc. - The functions used for 'long long' support such as strtoll - are supported, as is the lldiv_t typedef. Also supported - are the wide character functions using 'long long', like - wcstoll. -

-

Return to top of page or - to the FAQ. -

- - - - - -
-

-See license.html for copying conditions. -Comments and suggestions are welcome, and may be sent to -the libstdc++ mailing list. -

- - - - diff --git a/libstdc++-v3/docs/html/27_io/binary_iostreams_kanze.txt b/libstdc++-v3/docs/html/27_io/binary_iostreams_kanze.txt deleted file mode 100644 index 65d79c996c5..00000000000 --- a/libstdc++-v3/docs/html/27_io/binary_iostreams_kanze.txt +++ /dev/null @@ -1,51 +0,0 @@ - -From: James Kanze -Newsgroups: comp.lang.c++.moderated -Subject: Re: binary iostreams ? -Date: 3 Feb 2001 14:28:19 -0500 -Message-ID: <86lmro86qp.fsf@alex.gabi-soft.de> - -"Plinio Conti" writes: - -|> Why std c++ library stream classes are only text-oriented? - -Because that is the only universally recognized format. - -|> I mean, if I want to write an int, a float, etc. AS IT IS I can't -|> use streams, because they write and read a human readable text -|> format of numbers. - -Correct. - -|> Does anyone know how to solve the problem? - -It depends on what you really want to do. If you are just dumping a -block of memory to disk, in order to free up memory, and will reread it -later in the same run of the same program, ostream::write and -istream::read are what you need. Note, however, that this ony works 1) -in the same run of the same program, and 2) for PODs without pointers. - -If you are writing something that will be read by another program, or a -later run of the same program, you'll have to define a specific format -to use, and implement streams to input and output that. If you are -writing something that will be read by an existing program, or be -transmitted over a network to another machine, you will have to find out -what protocol is expected, and adher to it. - -|> Any public library? - -Not that I know of. I think that there is a library somewhere that -outputs in format RPC, or maybe some Internet format. - -|> What do you think about this choice? - -What other choice is possible? It's not reasonable to ask the standard -to support all binary formats, and it's not reasonable for it to favor -any one of them. Given that, what else can you do. - --- -James Kanze mailto:kanze@gabi-soft.de -Conseils en informatique orientée objet/ - Beratung in objektorientierter Datenverarbeitung -Ziegelhüttenweg 17a, 60598 Frankfurt, Germany Tel. +49(069)63198627 - diff --git a/libstdc++-v3/docs/html/27_io/binary_iostreams_kuehl.txt b/libstdc++-v3/docs/html/27_io/binary_iostreams_kuehl.txt deleted file mode 100644 index 901701ff480..00000000000 --- a/libstdc++-v3/docs/html/27_io/binary_iostreams_kuehl.txt +++ /dev/null @@ -1,89 +0,0 @@ - -From: kuehl@ramsen.informatik.uni-konstanz.de (Dietmar Kuehl) -Newsgroups: comp.std.c++ -Subject: Re: binary iostreams ? -Date: Sat, 3 Feb 2001 17:17:49 GMT -Message-ID: <95hctq$suu$2@news.BelWue.DE> - -Hi, -Plinio Conti (plinio.contiNO@SPAMMINGmclink.it) wrote: -: Why std c++ library stream classes are only text-oriented? - -There is only a text oriented front end to stream buffers because text -input and output does not vary between platforms. This is very -different for binary output. For example, binary output has to consider - -- word sizes: Is an 'int' two, four, or eight bytes long? The same - questions arise for all other built-in types. - -- what is the bit pattern of a value? I think that at least implicitly - in the standard a binary representation for integer types is required. - I don't think that it is required to use two's complement. In any - case, the floating point representations do differ, eg. in their - number of bytes used. - -- what "endianess" is to be used? - -Basically it is possible to decide a format for each of those. This, -however, implies inefficient implementations on platforms where the -format does not match the internal representation. - -What many people asking for binary I/O forget is that binary I/O also -requires some form of formatting! Assuming that just writing data and -then reading it in will work is asking for problems, eg. when the -compiler version changes and they decided to use a 32 bit integer -rather than a 16 bit integer: It is not even necessary to switch -platforms to run into problems! - -: I mean, if I want to write an int, a float, etc. AS IT IS I can't use -: streams, because they write and read a human readable text format of -: numbers. - -Which is for most I/O a reasonable approach. If it is not for you, you -might want to consider a data base: File I/O is not really useful as a -persistance mechanism. It is fine eg. for user interaction (text I/O), -logging (text I/O), cross platfrom program interaction (formatted I/O), -and data exchange (formatted I/O). In all these cases, the I/O is -formatted, although possible using a binary format. For persistance, -data bases are used. Depending on your needs, a relational or an object -oriented one may be better suited. - -That said, it is worth to mention that it is easy to create a hierarchy -similar to IOStreams built on top of stream buffers but doing binary -formatting. A somewhat aged example is found at -. -This uses XDR formatting of the binary data (well, if I remmeber -correctly, it is easy to plug in a different binary formatting). - -: Does anyone know how to solve the problem? - -Use a data base, text formatting, or binary formatting. With the -details you have given it is impossible to tell which of those is the -right approach because you haven't told *why* you want a binary format -and *what* you want to do. That basically means that you came up with -solution and you want us to confirm that it is the right one without -telling us what problem is solved! Until I have seen the problem I -doubt that binary I/O is the right approach... - -... and, BTW, using 'std::istream::read()' and 'std::ostream::write()' -is almost certainly the *wrong* approach! These functions are an -historical mistake which should have been corrected in the standard: -It is my understanding that these methods were present in the IOStream -version predating the rework from Jerry Schwartz and were left in to -be compatible with the earlier stuff although they were not necessary: -You could get binary I/O from the stream buffer level. The original -IOStream library (maybe you remember using ) did not have -stream buffers and thus basic support for binary I/O was also present -on the streams level. - -: What do you think about this choice? - -When I wrote the above paragraph about confirming your choice, I haven't -read this question! As I said above: You told us what solution you have -choosen without stating what problem is solved. We cannot determine -whether your choice is the right one. Actually, I'm pretty sure it is -the wrong one but without seen the details I can't be certain. --- - -Phaidros eaSE - Easy Software Engineering: - diff --git a/libstdc++-v3/docs/html/27_io/howto.html b/libstdc++-v3/docs/html/27_io/howto.html deleted file mode 100644 index 46d03b34630..00000000000 --- a/libstdc++-v3/docs/html/27_io/howto.html +++ /dev/null @@ -1,779 +0,0 @@ - - - - - - - - - - - libstdc++ HOWTO: Chapter 27: Input/Output - - - - - - - - - -

Chapter 27: Input/Output

- -

Chapter 27 deals with iostreams and all their subcomponents - and extensions. All kinds of fun stuff. -

- - - -
-

Contents

- - -
- - - -

Copying a file

-

So you want to copy a file quickly and easily, and most important, - completely portably. And since this is C++, you have an open - ifstream (call it IN) and an open ofstream (call it OUT): -

-
-   #include <fstream>
-
-   std::ifstream  IN ("input_file");
-   std::ofstream  OUT ("output_file"); 
-

Here's the easiest way to get it completely wrong: -

-
-   OUT << IN;
-

For those of you who don't already know why this doesn't work - (probably from having done it before), I invite you to quickly - create a simple text file called "input_file" containing - the sentence -

-
-      The quick brown fox jumped over the lazy dog.
-

surrounded by blank lines. Code it up and try it. The contents - of "output_file" may surprise you. -

-

Seriously, go do it. Get surprised, then come back. It's worth it. -

-
-

The thing to remember is that the basic_[io]stream classes - handle formatting, nothing else. In particular, they break up on - whitespace. The actual reading, writing, and storing of data is - handled by the basic_streambuf family. Fortunately, the - operator<< is overloaded to take an ostream and - a pointer-to-streambuf, in order to help with just this kind of - "dump the data verbatim" situation. -

-

Why a pointer to streambuf and not just a streambuf? Well, - the [io]streams hold pointers (or references, depending on the - implementation) to their buffers, not the actual - buffers. This allows polymorphic behavior on the part of the buffers - as well as the streams themselves. The pointer is easily retrieved - using the rdbuf() member function. Therefore, the easiest - way to copy the file is: -

-
-   OUT << IN.rdbuf();
-

So what was happening with OUT<<IN? Undefined - behavior, since that particular << isn't defined by the Standard. - I have seen instances where it is implemented, but the character - extraction process removes all the whitespace, leaving you with no - blank lines and only "Thequickbrownfox...". With - libraries that do not define that operator, IN (or one of IN's - member pointers) sometimes gets converted to a void*, and the output - file then contains a perfect text representation of a hexadecimal - address (quite a big surprise). Others don't compile at all. -

-

Also note that none of this is specific to o*f*streams. - The operators shown above are all defined in the parent - basic_ostream class and are therefore available with all possible - descendants. -

-

Return to top of page or - to the FAQ. -

- -
-

The buffering is screwing up my program!

- -

First, are you sure that you understand buffering? Particularly - the fact that C++ may not, in fact, have anything to do with it? -

-

The rules for buffering can be a little odd, but they aren't any - different from those of C. (Maybe that's why they can be a bit - odd.) Many people think that writing a newline to an output - stream automatically flushes the output buffer. This is true only - when the output stream is, in fact, a terminal and not a file - or some other device -- and that may not even be true - since C++ says nothing about files nor terminals. All of that is - system-dependent. (The "newline-buffer-flushing only occurring - on terminals" thing is mostly true on Unix systems, though.) -

-

Some people also believe that sending endl down an - output stream only writes a newline. This is incorrect; after a - newline is written, the buffer is also flushed. Perhaps this - is the effect you want when writing to a screen -- get the text - out as soon as possible, etc -- but the buffering is largely - wasted when doing this to a file: -

-
-   output << "a line of text" << endl;
-   output << some_data_variable << endl;
-   output << "another line of text" << endl; 
-

The proper thing to do in this case to just write the data out - and let the libraries and the system worry about the buffering. - If you need a newline, just write a newline: -

-
-   output << "a line of text\n"
-          << some_data_variable << '\n'
-          << "another line of text\n"; 
-

I have also joined the output statements into a single statement. - You could make the code prettier by moving the single newline to - the start of the quoted text on the last line, for example. -

-

If you do need to flush the buffer above, you can send an - endl if you also need a newline, or just flush the buffer - yourself: -

-
-   output << ...... << flush;    // can use std::flush manipulator
-   output.flush();               // or call a member fn 
-

On the other hand, there are times when writing to a file should - be like writing to standard error; no buffering should be done - because the data needs to appear quickly (a prime example is a - log file for security-related information). The way to do this is - just to turn off the buffering before any I/O operations at - all have been done (note that opening counts as an I/O operation): -

-
-   std::ofstream    os;
-   std::ifstream    is;
-   int   i;
-
-   os.rdbuf()->pubsetbuf(0,0);
-   is.rdbuf()->pubsetbuf(0,0);
-
-   os.open("/foo/bar/baz");
-   is.open("/qux/quux/quuux");
-   ...
-   os << "this data is written immediately\n";
-   is >> i;   // and this will probably cause a disk read 
-

Since all aspects of buffering are handled by a streambuf-derived - member, it is necessary to get at that member with rdbuf(). - Then the public version of setbuf can be called. The - arguments are the same as those for the Standard C I/O Library - function (a buffer area followed by its size). -

-

A great deal of this is implementation-dependent. For example, - streambuf does not specify any actions for its own - setbuf()-ish functions; the classes derived from - streambuf each define behavior that "makes - sense" for that class: an argument of (0,0) turns off buffering - for filebuf but does nothing at all for its siblings - stringbuf and strstreambuf, and specifying - anything other than (0,0) has varying effects. - User-defined classes derived from streambuf can - do whatever they want. (For filebuf and arguments for - (p,s) other than zeros, libstdc++ does what you'd expect: - the first s bytes of p are used as a buffer, - which you must allocate and deallocate.) -

-

A last reminder: there are usually more buffers involved than - just those at the language/library level. Kernel buffers, disk - buffers, and the like will also have an effect. Inspecting and - changing those are system-dependent. -

-

Return to top of page or - to the FAQ. -

- -
-

Binary I/O

-

The first and most important thing to remember about binary I/O is - that opening a file with ios::binary is not, repeat - not, the only thing you have to do. It is not a silver - bullet, and will not allow you to use the <</>> - operators of the normal fstreams to do binary I/O. -

-

Sorry. Them's the breaks. -

-

This isn't going to try and be a complete tutorial on reading and - writing binary files (because "binary" - covers a lot of ground), but we will try and clear - up a couple of misconceptions and common errors. -

-

First, ios::binary has exactly one defined effect, no more - and no less. Normal text mode has to be concerned with the newline - characters, and the runtime system will translate between (for - example) '\n' and the appropriate end-of-line sequence (LF on Unix, - CRLF on DOS, CR on Macintosh, etc). (There are other things that - normal mode does, but that's the most obvious.) Opening a file in - binary mode disables this conversion, so reading a CRLF sequence - under Windows won't accidentally get mapped to a '\n' character, etc. - Binary mode is not supposed to suddenly give you a bitstream, and - if it is doing so in your program then you've discovered a bug in - your vendor's compiler (or some other part of the C++ implementation, - possibly the runtime system). -

-

Second, using << to write and >> to - read isn't going to work with the standard file stream classes, even - if you use skipws during reading. Why not? Because - ifstream and ofstream exist for the purpose of formatting, - not reading and writing. Their job is to interpret the data into - text characters, and that's exactly what you don't want to happen - during binary I/O. -

-

Third, using the get() and put()/write() member - functions still aren't guaranteed to help you. These are - "unformatted" I/O functions, but still character-based. - (This may or may not be what you want, see below.) -

-

Notice how all the problems here are due to the inappropriate use - of formatting functions and classes to perform something - which requires that formatting not be done? There are a - seemingly infinite number of solutions, and a few are listed here: -

-
    -
  • "Derive your own fstream-type classes and write your own - <</>> operators to do binary I/O on whatever data - types you're using." This is a Bad Thing, because while - the compiler would probably be just fine with it, other humans - are going to be confused. The overloaded bitshift operators - have a well-defined meaning (formatting), and this breaks it. -
  • -
  • "Build the file structure in memory, then mmap() - the file and copy the structure." Well, this is easy to - make work, and easy to break, and is pretty equivalent to - using ::read() and ::write() directly, and - makes no use of the iostream library at all... -
  • -
  • "Use streambufs, that's what they're there for." - While not trivial for the beginner, this is the best of all - solutions. The streambuf/filebuf layer is the layer that is - responsible for actual I/O. If you want to use the C++ - library for binary I/O, this is where you start. -
  • -
-

How to go about using streambufs is a bit beyond the scope of this - document (at least for now), but while streambufs go a long way, - they still leave a couple of things up to you, the programmer. - As an example, byte ordering is completely between you and the - operating system, and you have to handle it yourself. -

-

Deriving a streambuf or filebuf - class from the standard ones, one that is specific to your data - types (or an abstraction thereof) is probably a good idea, and - lots of examples exist in journals and on Usenet. Using the - standard filebufs directly (either by declaring your own or by - using the pointer returned from an fstream's rdbuf()) - is certainly feasible as well. -

-

One area that causes problems is trying to do bit-by-bit operations - with filebufs. C++ is no different from C in this respect: I/O - must be done at the byte level. If you're trying to read or write - a few bits at a time, you're going about it the wrong way. You - must read/write an integral number of bytes and then process the - bytes. (For example, the streambuf functions take and return - variables of type int_type.) -

-

Another area of problems is opening text files in binary mode. - Generally, binary mode is intended for binary files, and opening - text files in binary mode means that you now have to deal with all of - those end-of-line and end-of-file problems that we mentioned before. - An instructive thread from comp.lang.c++.moderated delved off into - this topic starting more or less at - this - article and continuing to the end of the thread. (You'll have to - sort through some flames every couple of paragraphs, but the points - made are good ones.) -

- -
-

What is this <sstream>/stringstreams thing?

-

Stringstreams (defined in the header <sstream>) - are in this author's opinion one of the coolest things since - sliced time. An example of their use is in the Received Wisdom - section for Chapter 21 (Strings), - describing how to - format strings. -

-

The quick definition is: they are siblings of ifstream and ofstream, - and they do for std::string what their siblings do for - files. All that work you put into writing << and - >> functions for your classes now pays off - again! Need to format a string before passing the string - to a function? Send your stuff via << to an - ostringstream. You've read a string as input and need to parse it? - Initialize an istringstream with that string, and then pull pieces - out of it with >>. Have a stringstream and need to - get a copy of the string inside? Just call the str() - member function. -

-

This only works if you've written your - <</>> functions correctly, though, - and correctly means that they take istreams and ostreams as - parameters, not ifstreams and ofstreams. If they - take the latter, then your I/O operators will work fine with - file streams, but with nothing else -- including stringstreams. -

-

If you are a user of the strstream classes, you need to update - your code. You don't have to explicitly append ends to - terminate the C-style character array, you don't have to mess with - "freezing" functions, and you don't have to manage the - memory yourself. The strstreams have been officially deprecated, - which means that 1) future revisions of the C++ Standard won't - support them, and 2) if you use them, people will laugh at you. -

- -
-

Deriving a stream buffer

-

Creating your own stream buffers for I/O can be remarkably easy. - If you are interested in doing so, we highly recommend two very - excellent books: - Standard C++ - IOStreams and Locales by Langer and Kreft, ISBN 0-201-18395-1, and - The C++ Standard Library - by Nicolai Josuttis, ISBN 0-201-37926-0. Both are published by - Addison-Wesley, who isn't paying us a cent for saying that, honest. -

-

Here is a simple example, io/outbuf1, from the Josuttis text. It - transforms everything sent through it to uppercase. This version - assumes many things about the nature of the character type being - used (for more information, read the books or the newsgroups): -

-
-    #include <iostream>
-    #include <streambuf>
-    #include <locale>
-    #include <cstdio>
-
-    class outbuf : public std::streambuf
-    {
-      protected:
-	/* central output function
-	 * - print characters in uppercase mode
-	 */
-	virtual int_type overflow (int_type c) {
-	    if (c != EOF) {
-		// convert lowercase to uppercase
-		c = std::toupper(static_cast<char>(c),getloc());
-
-		// and write the character to the standard output
-		if (putchar(c) == EOF) {
-		    return EOF;
-		}
-	    }
-	    return c;
-	}
-    };
-
-    int main()
-    {
-	// create special output buffer
-	outbuf ob;
-	// initialize output stream with that output buffer
-	std::ostream out(&ob);
-
-	out << "31 hexadecimal: "
-	    << std::hex << 31 << std::endl;
-	return 0;
-    }
-   
-

Try it yourself! More examples can be found in 3.1.x code, in - include/ext/*_filebuf.h, and on - Dietmar - Kühl's IOStreams page. -

- -
-

More on binary I/O

-

Towards the beginning of February 2001, the subject of - "binary" I/O was brought up in a couple of places at the - same time. One notable place was Usenet, where James Kanze and - Dietmar Kühl separately posted articles on why attempting - generic binary I/O was not a good idea. (Here are copies of - Kanze's article and - Kühl's article.) -

-

Briefly, the problems of byte ordering and type sizes mean that - the unformatted functions like ostream::put() and - istream::get() cannot safely be used to communicate - between arbitrary programs, or across a network, or from one - invocation of a program to another invocation of the same program - on a different platform, etc. -

-

The entire Usenet thread is instructive, and took place under the - subject heading "binary iostreams" on both comp.std.c++ - and comp.lang.c++.moderated in parallel. Also in that thread, - Dietmar Kühl mentioned that he had written a pair of stream - classes that would read and write XDR, which is a good step towards - a portable binary format. -

- -
-

Pathetic performance? Ditch C.

-

It sounds like a flame on C, but it isn't. Really. Calm down. - I'm just saying it to get your attention. -

-

Because the C++ library includes the C library, both C-style and - C++-style I/O have to work at the same time. For example: -

-
-     #include <iostream>
-     #include <cstdio>
-
-     std::cout << "Hel";
-     std::printf ("lo, worl");
-     std::cout << "d!\n";
-   
-

This must do what you think it does. -

-

Alert members of the audience will immediately notice that buffering - is going to make a hash of the output unless special steps are taken. -

-

The special steps taken by libstdc++, at least for version 3.0, - involve doing very little buffering for the standard streams, leaving - most of the buffering to the underlying C library. (This kind of - thing is tricky to get right.) - The upside is that correctness is ensured. The downside is that - writing through cout can quite easily lead to awful - performance when the C++ I/O library is layered on top of the C I/O - library (as it is for 3.0 by default). Some patches have been applied - which improve the situation for 3.1. -

-

However, the C and C++ standard streams only need to be kept in sync - when both libraries' facilities are in use. If your program only uses - C++ I/O, then there's no need to sync with the C streams. The right - thing to do in this case is to call -

-
-     #include any of the I/O headers such as ios, iostream, etc
-
-     std::ios::sync_with_stdio(false);
-   
-

You must do this before performing any I/O via the C++ stream objects. - Once you call this, the C++ streams will operate independently of the - (unused) C streams. For GCC 3.x, this means that cout and - company will become fully buffered on their own. -

-

Note, by the way, that the synchronization requirement only applies to - the standard streams (cin, cout, - cerr, - clog, and their wide-character counterparts). File stream - objects that you declare yourself have no such requirement and are fully - buffered. -

- -
-

Threads and I/O

-

I'll assume that you have already read the - general notes on library threads, - and the - notes on threaded container - access (you might not think of an I/O stream as a container, but - the points made there also hold here). If you have not read them, - please do so first. -

-

This gets a bit tricky. Please read carefully, and bear with me. -

-

Structure

-

A wrapper - type called __basic_file provides our abstraction layer - for the std::filebuf classes. Nearly all decisions dealing - with actual input and output must be made in __basic_file. -

-

A generic locking mechanism is somewhat in place at the filebuf layer, - but is not used in the current code. Providing locking at any higher - level is akin to providing locking within containers, and is not done - for the same reasons (see the links above). -

-

The defaults for 3.0.x

-

The __basic_file type is simply a collection of small wrappers around - the C stdio layer (again, see the link under Structure). We do no - locking ourselves, but simply pass through to calls to fopen, - fwrite, and so forth. -

-

So, for 3.0, the question of "is multithreading safe for I/O" - must be answered with, "is your platform's C library threadsafe - for I/O?" Some are by default, some are not; many offer multiple - implementations of the C library with varying tradeoffs of threadsafety - and efficiency. You, the programmer, are always required to take care - with multiple threads. -

-

(As an example, the POSIX standard requires that C stdio FILE* - operations are atomic. POSIX-conforming C libraries (e.g, on Solaris - and GNU/Linux) have an internal mutex to serialize operations on - FILE*s. However, you still need to not do stupid things like calling - fclose(fs) in one thread followed by an access of - fs in another.) -

-

So, if your platform's C library is threadsafe, then your - fstream I/O operations will be threadsafe at the lowest - level. For higher-level operations, such as manipulating the data - contained in the stream formatting classes (e.g., setting up callbacks - inside an std::ofstream), you need to guard such accesses - like any other critical shared resource. -

-

The future

-

A - second choice may be available for I/O implementations: libio. This is - disabled by default, and in fact will not currently work due to other - issues. It will be revisited, however. -

-

The libio code is a subset of the guts of the GNU libc (glibc) I/O - implementation. When libio is in use, the __basic_file - type is basically derived from FILE. (The real situation is more - complex than that... it's derived from an internal type used to - implement FILE. See libio/libioP.h to see scary things done with - vtbls.) The result is that there is no "layer" of C stdio - to go through; the filebuf makes calls directly into the same - functions used to implement fread, fwrite, - and so forth, using internal data structures. (And when I say - "makes calls directly," I mean the function is literally - replaced by a jump into an internal function. Fast but frightening. - *grin*) -

-

Also, the libio internal locks are used. This requires pulling in - large chunks of glibc, such as a pthreads implementation, and is one - of the issues preventing widespread use of libio as the libstdc++ - cstdio implementation. -

-

But we plan to make this work, at least as an option if not a future - default. Platforms running a copy of glibc with a recent-enough - version will see calls from libstdc++ directly into the glibc already - installed. For other platforms, a copy of the libio subsection will - be built and included in libstdc++. -

-

Alternatives

-

Don't forget that other cstdio implementations are possible. You could - easily write one to perform your own forms of locking, to solve your - "interesting" problems. -

- -
-

Which header?

-

To minimize the time you have to wait on the compiler, it's good to - only include the headers you really need. Many people simply include - <iostream> when they don't need to -- and that can penalize - your runtime as well. Here are some tips on which header to use - for which situations, starting with the simplest. -

-

<iosfwd> should be included whenever you simply - need the name of an I/O-related class, such as - "ofstream" or "basic_streambuf". Like the name - implies, these are forward declarations. (A word to all you fellow - old school programmers: trying to forward declare classes like - "class istream;" won't work. Look in the iosfwd header if - you'd like to know why.) For example, -

-
-    #include <iosfwd>
-
-    class MyClass
-    {
-        ....
-        std::ifstream&   input_file;
-    };
-
-    extern std::ostream& operator<< (std::ostream&, MyClass&);
-   
-

<ios> declares the base classes for the entire - I/O stream hierarchy, std::ios_base and std::basic_ios<charT>, the - counting types std::streamoff and std::streamsize, the file - positioning type std::fpos, and the various manipulators like - std::hex, std::fixed, std::noshowbase, and so forth. -

-

The ios_base class is what holds the format flags, the state flags, - and the functions which change them (setf(), width(), precision(), - etc). You can also store extra data and register callback functions - through ios_base, but that has been historically underused. Anything - which doesn't depend on the type of characters stored is consolidated - here. -

-

The template class basic_ios is the highest template class in the - hierarchy; it is the first one depending on the character type, and - holds all general state associated with that type: the pointer to the - polymorphic stream buffer, the facet information, etc. -

-

<streambuf> declares the template class - basic_streambuf, and two standard instantiations, streambuf and - wstreambuf. If you need to work with the vastly useful and capable - stream buffer classes, e.g., to create a new form of storage - transport, this header is the one to include. -

-

<istream>/<ostream> are - the headers to include when you are using the >>/<< - interface, or any of the other abstract stream formatting functions. - For example, -

-
-    #include <istream>
-
-    std::ostream& operator<< (std::ostream& os, MyClass& c)
-    {
-       return os << c.data1() << c.data2();
-    }
-   
-

The std::istream and std::ostream classes are the abstract parents of - the various concrete implementations. If you are only using the - interfaces, then you only need to use the appropriate interface header. -

-

<iomanip> provides "extractors and inserters - that alter information maintained by class ios_base and its derived - classes," such as std::setprecision and std::setw. If you need - to write expressions like os << setw(3); or - is >> setbase(8);, you must include <iomanip>. -

-

<sstream>/<fstream> - declare the six stringstream and fstream classes. As they are the - standard concrete descendants of istream and ostream, you will already - know about them. -

-

Finally, <iostream> provides the eight standard - global objects (cin, cout, etc). To do this correctly, this header - also provides the contents of the <istream> and <ostream> - headers, but nothing else. The contents of this header look like -

-
-    #include <ostream>
-    #include <istream>
-
-    namespace std
-    {
-        extern istream cin;
-        extern ostream cout;
-        ....
-
-        // this is explained below
-        static ios_base::Init __foo;    // not its real name
-    }
-   
-

Now, the runtime penalty mentioned previously: the global objects - must be initialized before any of your own code uses them; this is - guaranteed by the standard. Like any other global object, they must - be initialized once and only once. This is typically done with a - construct like the one above, and the nested class ios_base::Init is - specified in the standard for just this reason. -

-

How does it work? Because the header is included before any of your - code, the __foo object is constructed before any of - your objects. (Global objects are built in the order in which they - are declared, and destroyed in reverse order.) The first time the - constructor runs, the eight stream objects are set up. -

-

The static keyword means that each object file compiled - from a source file containing <iostream> will have its own - private copy of __foo. There is no specified order - of construction across object files (it's one of those pesky NP - problems that make life so interesting), so one copy in each object - file means that the stream objects are guaranteed to be set up before - any of your code which uses them could run, thereby meeting the - requirements of the standard. -

-

The penalty, of course, is that after the first copy of - __foo is constructed, all the others are just wasted - processor time. The time spent is merely for an increment-and-test - inside a function call, but over several dozen or hundreds of object - files, that time can add up. (It's not in a tight loop, either.) -

-

The lesson? Only include <iostream> when you need to use one of - the standard objects in that source file; you'll pay less startup - time. Only include the header files you need to in general; your - compile times will go down when there's less parsing work to do. -

- - -
-

Using FILE*s and file descriptors with IOStreams

- -

The v2 library included non-standard extensions to construct - std::filebufs from C stdio types such as - FILE*s and POSIX file descriptors. - Today the recommended way to use stdio types with libstdc++ - IOStreams is via the stdio_filebuf class (see below), - but earlier releases provided slightly different mechanisms. -

-
    -
  • 3.0.x filebufs have another ctor with this signature: -
    - basic_filebuf(__c_file_type*, ios_base::openmode, int_type); -
    This comes in very handy in a number of places, such as - attaching Unix sockets, pipes, and anything else which uses file - descriptors, into the IOStream buffering classes. The three - arguments are as follows: -
      -
    • __c_file_type* F - // the __c_file_type typedef usually boils down to stdio's FILE -
    • -
    • ios_base::openmode M - // same as all the other uses of openmode -
    • -
    • int_type B - // buffer size, defaults to BUFSIZ if not specified -
    • -
    - For those wanting to use file descriptors instead of FILE*'s, I - invite you to contemplate the mysteries of C's fdopen(). -
  • -
  • In library snapshot 3.0.95 and later, filebufs bring - back an old extension: the fd() member function. The - integer returned from this function can be used for whatever file - descriptors can be used for on your platform. Naturally, the - library cannot track what you do on your own with a file descriptor, - so if you perform any I/O directly, don't expect the library to be - aware of it. -
  • -
  • Beginning with 3.1, the extra filebuf constructor and - the fd() function were removed from the standard - filebuf. Instead, <ext/stdio_filebuf.h> contains - a derived class called - __gnu_cxx::stdio_filebuf. - This class can be constructed from a C FILE* or a file - descriptor, and provides the fd() function. -
  • -
-

If you want to access a filebuf's file descriptor to - implement file locking (e.g. using the fcntl() system - call) then you might be interested in Henry Suter's - RWLock - class. -

- - - -
-

-See license.html for copying conditions. -Comments and suggestions are welcome, and may be sent to -the libstdc++ mailing list. -

- - - - - - diff --git a/libstdc++-v3/docs/html/configopts.html b/libstdc++-v3/docs/html/configopts.html deleted file mode 100644 index c830a9967ba..00000000000 --- a/libstdc++-v3/docs/html/configopts.html +++ /dev/null @@ -1,342 +0,0 @@ - - - - - - - - - - libstdc++ configure options - - - - - -

Interesting configure -options

- -

- The latest version of this document is always available at - - http://gcc.gnu.org/onlinedocs/libstdc++/configopts.html. -

- -

- To the libstdc++ homepage. -

- - -
-

Here are some of the non-obvious options to libstdc++'s configure. - Keep in mind that - - they - all have opposite forms as well - (enable/disable and with/without). The defaults are for current - development sources, which may be different than those for - released versions. -

-

The canonical way to find out the configure options that are - available for a given set of libstdc++ sources is to go to the - source directory and then type: ./configure --help -

- -
-
--enable-multilib [default]
-

This is part of the generic multilib support for building cross - compilers. As such, targets like "powerpc-elf" will have - libstdc++ built many different ways: "-msoft-float" - and not, etc. A different libstdc++ will be built for each of - the different multilib versions. This option is on by default. -

-
- -
--enable-sjlj-exceptions
-

Forces old, set-jump/long-jump exception handling model. If - at all possible, the new, frame unwinding exception handling routines - should be used instead, as they significantly reduce both - runtime memory usage and executable size. This option can - change the library ABI. -

-
- -
--enable-version-specific-runtime-libs
-

Specify that run-time libraries should be installed in the - compiler-specific subdirectory (i.e., - ${libdir}/gcc-lib/${target_alias}/${gcc_version}) - instead of ${libdir}. This option is useful if you - intend to use several versions of gcc in parallel. In addition, - libstdc++'s include files will be installed in - ${libdir}/gcc-lib/${target_alias}/${gcc_version}/include/g++, - unless you also specify - --with-gxx-include-dir=dirname during configuration. -

-
- -
--with-gxx-include-dir=<include-files dir>
-

Adds support for named libstdc++ include directory. For instance, - the following puts all the libstdc++ headers into a directory - called "2.97-20001008" instead of the usual - "c++/(version)". -

-
-   --with-gxx-include-dir=/foo/H-x86-gcc-3-c-gxx-inc/include/2.97-20001008
- -
--enable-cstdio
-

This is an abbreviated form of '--enable-cstdio=stdio' - (described next). This option can change the library ABI. -

-
- -
--enable-cstdio=OPTION
-

Select a target-specific I/O package. At the moment, the only - choice is to use 'stdio', a generic "C" abstraction. - The default is 'stdio'. -

-
- -
--enable-clocale
-

This is an abbreviated form of '--enable-clocale=generic' - (described next). This option can change the library ABI. -

-
- -
--enable-clocale=OPTION
-

Select a target-specific underlying locale package. The - choices are 'ieee_1003.1-2001' to specify an X/Open, Standard Unix - (IEEE Std. 1003.1-2001) model based on langinfo/iconv/catgets, - 'gnu' to specify a model based on functionality from the GNU C - library (langinfo/iconv/gettext) (from glibc, the GNU C - library), or 'generic' to use a generic "C" - abstraction which consists of "C" locale info. -

- -

As part of the configuration process, the "C" library is - probed both for sufficient vintage, and installed locale - data. If either of these elements are not present, the C++ - locale model default to 'generic.' On glibc-based systems of - version 2.2.5 and above with installed locale files, 'gnu' is - automatically selected. -

-
- -
--enable-libstdcxx-allocator
-

This is an abbreviated form of - '--enable-libstdcxx-allocator=auto' (described - next). This option can change the library ABI. -

-
- -
--enable-libstdcxx-allocator=OPTION
-

Select a target-specific underlying std::allocator. The - choices are 'new' to specify a wrapper for new, 'malloc' to - specify a wrapper for malloc, 'mt' for a fixed power of two allocator - (documented under extensions), - 'pool' for the SGI pooled allocator or 'bitmap' for a bitmap allocator. - This option can change the library ABI. -

-
- -
--enable-cheaders=OPTION
-

This allows the user to define the approach taken for C header - compatibility with C++. Options are c, c_std, and c_global. - These correspond to the source directory's include/c, - include/c_std, and include/c_global, and may also include - include/c_compatibility. The default is c_global. -

-
- -
--enable-threads
-

This is an abbreviated form of '--enable-threads=yes' - (described next). This option can change the library ABI. -

-
- -
--enable-threads=OPTION
-

Select a threading library. A full description is given in the - general compiler - configuration instructions. -

-
- -
--enable-libstdcxx-debug
-

Build separate debug libraries in addition to what is normally built. - By default, the debug libraries are compiled with - CXXFLAGS='-g3 -O0' - , are installed in ${libdir}/debug, and have the - same names and versioning information as the non-debug - libraries. This option is off by default. -

-

Note this make command, executed in - the build directory, will do much the same thing, without the - configuration difference and without building everything twice: - make CXXFLAGS='-g3 -O0' all -

-
- -
--enable-libstdcxx-debug-flags=FLAGS
- -

This option is only valid when --enable-debug - is also specified, and applies to the debug builds only. With - this option, you can pass a specific string of flags to the - compiler to use when building the debug versions of libstdc++. - FLAGS is a quoted string of options, like -

-
-  --enable-libstdcxx-debug-flags='-g3 -O1 -gdwarf-2'
-
- -
--enable-cxx-flags=FLAGS
-

With this option, you can pass a string of -f (functionality) - flags to the compiler to use when building libstdc++. This - option can change the library ABI. FLAGS is a quoted string of - options, like -

-
-  --enable-cxx-flags='-fvtable-gc -fomit-frame-pointer -ansi'
-

- Note that the flags don't necessarily have to all be -f flags, - as shown, but usually those are the ones that will make sense - for experimentation and configure-time overriding. -

-

The advantage of --enable-cxx-flags over setting CXXFLAGS in - the 'make' environment is that, if files are automatically - rebuilt, the same flags will be used when compiling those files - as well, so that everything matches. -

-

Fun flags to try might include combinations of -

-
-  -fstrict-aliasing
-  -fno-exceptions
-  -ffunction-sections
-  -fvtable-gc
-

and opposite forms (-fno-) of the same. Tell us (the libstdc++ - mailing list) if you discover more! -

-
- -
--enable-c99
-

The "long long" type was introduced in C99, along - with many other functions for wide characters, and math - classification macros, etc. If enabled, all C99 functions not - specified by the C++ standard will be put into namespace - __gnu_cxx, and then all these names will - be injected into namespace std, so that C99 functions can be - used "as if" they were in the C++ standard (as they - will eventually be in some future revision of the standard, - without a doubt). By default, C99 support is on, assuming the - configure probes find all the necessary functions and bits - necessary. This option can change the library ABI. -

-
- -
--enable-wchar_t [default]
-

Template specializations for the "wchar_t" type are - required for wide character conversion support. Disabling - wide character specializations may be expedient for initial - porting efforts, but builds only a subset of what is required by - ISO, and is not recommended. By default, this option is on. - This option can change the library ABI. -

-
- -
--enable-long-long
-

The "long long" type was introduced in C99. It is - provided as a GNU extension to C++98 in g++. This flag builds - support for "long long" into the library (specialized - templates and the like for iostreams). This option is on by default: - if enabled, users will have to either use the new-style "C" - headers by default (i.e., <cmath> not <math.h>) - or add appropriate compile-time flags to all compile lines to - allow "C" visibility of this feature (on GNU/Linux, - the flag is -D_ISOC99_SOURCE, which is added automatically via - CPLUSPLUS_CPP_SPEC's addition of _GNU_SOURCE). - This option can change the library ABI. -

-
- -
--enable-fully-dynamic-string
-

This option enables a special version of basic_string avoiding - the optimization that allocates empty objects in static memory. - Mostly useful together with shared memory allocators, see PR - libstdc++/16612 for details. -

-
- -
--enable-concept-checks
-

This turns on additional compile-time checks for instantiated - library templates, in the form of specialized templates, - described here. They - can help users discover when they break the rules of the STL, before - their programs run. -

-
- -
--enable-symvers[=style]
- -

In 3.1 and later, tries to turn on symbol versioning in the - shared library (if a shared library has been - requested). Values for 'style' that are currently supported - are 'gnu', 'gnu-versioned-namespace', 'darwin', and - 'darwin-export'. Both gnu- options require that a recent - version of the GNU linker be in use. Both darwin options are - equivalent. With no style given, the configure script will try - to guess correct defaults for the host system, probe to see if - additional requirements are necessary and present for - activation, and if so, will turn symbol versioning on. This - option can change the library ABI. -

- -
- -
--enable-visibility
-

In 4.2 and later, enables or disables visibility attributes. - If enabled (as by default), and the compiler seems capable of - passing the simple sanity checks thrown at it, adjusts items - in namespace std, namespace std::tr1, and namespace __gnu_cxx - so that -fvisibility options work. -

-
- -
--enable-libstdcxx-pch
-

In 3.4 and later, tries to turn on the generation of - stdc++.h.gch, a pre-compiled file including all the standard - C++ includes. If enabled (as by default), and the compiler - seems capable of passing the simple sanity checks thrown at - it, try to build stdc++.h.gch as part of the make process. - In addition, this generated file is used later on (by appending - --include bits/stdc++.h to CXXFLAGS) when running the - testsuite. -

-
- -
--disable-hosted-libstdcxx
-

By default, a complete hosted C++ library is built. The - C++ Standard also describes a freestanding environment, - in which only a minimal set of headers are provided. This option - builds such an environment. -

-
-
-

Return to the top of the page or - to the libstdc++ homepage. -

- - - - -
-

-See license.html for copying conditions. -Comments and suggestions are welcome, and may be sent to -the libstdc++ mailing list. -

- - - - diff --git a/libstdc++-v3/docs/html/debug.html b/libstdc++-v3/docs/html/debug.html deleted file mode 100644 index 61c6a8ba17b..00000000000 --- a/libstdc++-v3/docs/html/debug.html +++ /dev/null @@ -1,474 +0,0 @@ - - - - - - - - - - Debugging schemes and strategies - - - - - -

Debugging schemes and strategies

- -

- The latest version of this document is always available at - - http://gcc.gnu.org/onlinedocs/libstdc++/debug.html. -

- -

- To the libstdc++ homepage. -

- - -
-

There are numerous things that can be done to improve the ease with - which C++ binaries are debugged when using the GNU - tool chain. Here are some of them. -

- -

Compiler flags determine debug info

-

The default optimizations and debug flags for a libstdc++ build are - -g -O2. However, both debug and optimization flags can - be varied to change debugging characteristics. For instance, - turning off all optimization via the -g -O0 flag will - disable inlining, so that stepping through all functions, including - inlined constructors and destructors, is possible. In addition, - -fno-eliminate-unused-debug-types can be used when - additional debug information, such as nested class info, is desired. -

- -

Or, the debug format that the compiler and debugger use to communicate - information about source constructs can be changed via - -gdwarf-2 or -gstabs flags: some debugging - formats permit more expressive type and scope information to be - shown in gdb. The default debug information for a particular - platform can be identified via the value set by the - PREFERRED_DEBUGGING_TYPE macro in the gcc sources. -

- -

Many other options are available: please see -"Options for Debugging Your Program" - in Using the GNU Compiler Collection (GCC) for a complete list. -

- -

Using special flags to make a debug binary

-

If you would like debug symbols in libstdc++, there are two ways to - build libstdc++ with debug flags. The first is to run make from the - toplevel in a freshly-configured tree with -

-
-     --enable-libstdcxx-debug
-
-

and perhaps

-
-     --enable-libstdcxx-debug-flags='...'
-
-

to create a separate debug build. Both the normal build and the - debug build will persist, without having to specify - CXXFLAGS, and the debug library will be installed in a - separate directory tree, in (prefix)/lib/debug. For - more information, look at the configuration - options document. -

- -

A second approach is to use the configuration flags -

-
-     make CXXFLAGS='-g3 -O0' all
-
- -

This quick and dirty approach is often sufficient for quick - debugging tasks, when you cannot or don't want to recompile your - application to use the debug mode.

- -

The libstdc++ debug mode

-

By default, libstdc++ is built with efficiency in mind, and - therefore performs little or no error checking that is not required - by the C++ standard. This means that programs that incorrectly use - the C++ standard library will exhibit behavior that is not portable - and may not even be predictable, because they tread into - implementation-specific or undefined behavior. To detect some of - these errors before they can become problematic, libstdc++ offers a - debug mode that provides additional checking of library facilities, - and will report errors in the use of libstdc++ as soon as they can - be detected by emitting a description of the problem to standard - error and aborting the program. This debug mode is available with - GCC 3.4.0 and later versions.

- -

The libstdc++ debug mode performs checking for many areas of the C++ - standard, but the focus is on checking interactions among standard - iterators, containers, and algorithms, including:

- -
    -
  • Safe iterators: Iterators keep track of the - container whose elements they reference, so errors such as - incrementing a past-the-end iterator or dereferencing an iterator - that points to a container that has been destructed are diagnosed - immediately.
  • - -
  • Algorithm preconditions: Algorithms attempt to - validate their input parameters to detect errors as early as - possible. For instance, the set_intersection - algorithm requires that its iterator - parameters first1 and last1 form a valid - iterator range, and that the sequence - [first1, last1) is sorted according to - the same predicate that was passed - to set_intersection; the libstdc++ debug mode will - detect an error if the sequence is not sorted or was sorted by a - different predicate.
  • -
- -

Using the libstdc++ debug mode

-

To use the libstdc++ debug mode, compile your application with the - compiler flag -D_GLIBCXX_DEBUG. Note that this flag - changes the sizes and behavior of standard class templates such - as std::vector, and therefore you can only link code - compiled with debug mode and code compiled without debug mode if no - instantiation of a container is passed between the two translation - units.

- -

By default, error messages are formatted to fit on lines of about - 78 characters. The environment variable - GLIBCXX_DEBUG_MESSAGE_LENGTH can be used to request a - different length.

- -

For information about the design of the libstdc++ debug mode, - please see the libstdc++ debug mode design - document.

- -

Using the debugging containers without debug - mode

-

When it is not feasible to recompile your entire application, or - only specific containers need checking, debugging containers are - available as GNU extensions. These debugging containers are - functionally equivalent to the standard drop-in containers used in - debug mode, but they are available in a separate namespace as GNU - extensions and may be used in programs compiled with either release - mode or with debug mode. The - following table provides the names and headers of the debugging - containers: -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ContainerHeaderDebug containerDebug header
std::bitset<bitset>__gnu_debug::bitset<debug/bitset>
std::deque<deque>__gnu_debug::deque<debug/deque>
std::list<list>__gnu_debug::list<debug/list>
std::map<map>__gnu_debug::map<debug/map>
std::multimap<map>__gnu_debug::multimap<debug/map>
std::multiset<set>__gnu_debug::multiset<debug/set>
std::set<set>__gnu_debug::set<debug/set>
std::string<string>__gnu_debug::string<debug/string>
std::wstring<string>__gnu_debug::wstring<debug/string>
std::basic_string<string>__gnu_debug::basic_string<debug/string>
std::vector<vector>__gnu_debug::vector<debug/vector>
- -

In addition, when compiling in C++0x mode, these additional -containers have additional debug capability. -

- - - - - - - - - - - - - - - - - - - - - - - - - - -
std::unordered_map<unordered_map>__gnu_debug::unordered_map<debug/unordered_map>
std::unordered_multimap<unordered_map>__gnu_debug::unordered_multimap<debug/unordered_map>
std::unordered_set<unordered_set>__gnu_debug::unordered_set<debug/unordered_set>
std::unordered_multiset<unordered_set>__gnu_debug::unordered_multiset<debug/unordered_set>
- -

Debug mode semantics

-

A program that uses the C++ standard library correctly - will maintain the same semantics under debug mode as it had with - the normal (release) library. All functional and exception-handling - guarantees made by the normal library also hold for the debug mode - library, with one exception: performance guarantees made by the - normal library may not hold in the debug mode library. For - instance, erasing an element in a std::list is a - constant-time operation in normal library, but in debug mode it is - linear in the number of iterators that reference that particular - list. So while your (correct) program won't change its results, it - is likely to execute more slowly.

- -

libstdc++ includes many extensions to the C++ standard library. In - some cases the extensions are obvious, such as the hashed - associative containers, whereas other extensions give predictable - results to behavior that would otherwise be undefined, such as - throwing an exception when a std::basic_string is - constructed from a NULL character pointer. This latter category also - includes implementation-defined and unspecified semantics, such as - the growth rate of a vector. Use of these extensions is not - considered incorrect, so code that relies on them will not be - rejected by debug mode. However, use of these extensions may affect - the portability of code to other implementations of the C++ standard - library, and is therefore somewhat hazardous. For this reason, the - libstdc++ debug mode offers a "pedantic" mode (similar to - GCC's -pedantic compiler flag) that attempts to emulate - the semantics guaranteed by the C++ standard. For - instance, constructing a std::basic_string with a NULL - character pointer would result in an exception under normal mode or - non-pedantic debug mode (this is a libstdc++ extension), whereas - under pedantic debug mode libstdc++ would signal an error. To enable - the pedantic debug mode, compile your program with - both -D_GLIBCXX_DEBUG - and -D_GLIBCXX_DEBUG_PEDANTIC . - (N.B. In GCC 3.4.x and 4.0.0, due to a bug, - -D_GLIBXX_DEBUG_PEDANTIC was also needed. The problem has - been fixed in GCC 4.0.1 and later versions.)

- -

The following library components provide extra debugging - capabilities in debug mode:

-
    -
  • std::basic_string (no safe iterators and see note below)
  • -
  • std::bitset
  • -
  • std::deque
  • -
  • std::list
  • -
  • std::map
  • -
  • std::multimap
  • -
  • std::multiset
  • -
  • std::set
  • -
  • std::vector
  • -
  • std::unordered_map
  • -
  • std::unordered_multimap
  • -
  • std::unordered_set
  • -
  • std::unordered_multiset
  • -
- -

N.B. although there are precondition checks for some string operations, -e.g. operator[], -they will not always be run when using the char and -wchar_t specialisations (std::string and -std::wstring). This is because libstdc++ uses GCC's -extern template extension to provide explicit instantiations -of std::string and std::wstring, and those -explicit instantiations don't include the debug-mode checks. If the -containing functions are inlined then the checks will run, so compiling -with -O1 might be enough to enable them. Alternatively --D_GLIBCXX_EXTERN_TEMPLATE=0 will suppress the declarations -of the explicit instantiations and cause the functions to be instantiated -with the debug-mode checks included, but this is unsupported and not -guaranteed to work. For full debug-mode support you can use the -__gnu_debug::basic_string debugging container directly, -which always works correctly. -

- -

Tips for memory leak hunting

- -

There are various third party memory tracing and debug utilities - that can be used to provide detailed memory allocation information - about C++ code. An exhaustive list of tools is not going to be - attempted, but includes mtrace, valgrind, - mudflap, and the non-free commercial product - purify. In addition, libcwd has a - replacement for the global new and delete operators that can track - memory allocation and deallocation and provide useful memory - statistics. -

- -

Regardless of the memory debugging tool being used, there is one - thing of great importance to keep in mind when debugging C++ code - that uses new and delete: - there are different kinds of allocation schemes that can be used by - std::allocator . For implementation details, see the - mt allocator documentation and - look specifically for GLIBCXX_FORCE_NEW. -

- -

In a nutshell, the default allocator used by - std::allocator is a high-performance pool allocator, and can - give the mistaken impression that in a suspect executable, memory - is being leaked, when in reality the memory "leak" is a pool being - used by the library's allocator and is reclaimed after program - termination. -

- -

For valgrind, there are some specific items to keep in mind. First - of all, use a version of valgrind that will work with current GNU - C++ tools: the first that can do this is valgrind 1.0.4, but later - versions should work at least as well. Second of all, use a - completely unoptimized build to avoid confusing valgrind. Third, - use GLIBCXX_FORCE_NEW to keep extraneous pool allocation noise from - cluttering debug information. -

- -

Fourth, it may be necessary to force deallocation in other - libraries as well, namely the "C" library. On linux, this can be - accomplished with the appropriate use of the - __cxa_atexit or atexit functions. -

- -
-   #include <cstdlib>
-
-   extern "C" void __libc_freeres(void);
-
-   void do_something() { }
-
-   int main()
-   {
-     atexit(__libc_freeres);
-     do_something();
-     return 0;
-   }
-
- - -

or, using __cxa_atexit:

- -
-   extern "C" void __libc_freeres(void);
-   extern "C" int __cxa_atexit(void (*func) (void *), void *arg, void *d);
-
-   void do_something() { }
-
-   int main()
-   {
-      extern void* __dso_handle __attribute__ ((__weak__));
-      __cxa_atexit((void (*) (void *)) __libc_freeres, NULL, 
-                   &__dso_handle ? __dso_handle : NULL);
-      do_test();
-      return 0;
-   }
-
- -

Suggested valgrind flags, given the suggestions above about setting - up the runtime environment, library, and test file, might be: -

-
 
-   valgrind -v --num-callers=20 --leak-check=yes --leak-resolution=high --show-reachable=yes a.out
-
- - -

Some gdb strategies

-

Many options are available for gdb itself: please see - "GDB features for C++" in the gdb documentation. Also - recommended: the other parts of this manual. -

- -

These settings can either be switched on in at the gdb command - line, or put into a .gdbint file to establish default debugging - characteristics, like so: -

- -
-   set print pretty on
-   set print object on
-   set print static-members on
-   set print vtbl on
-   set print demangle on
-   set demangle-style gnu-v3
-
- - -

Tracking uncaught exceptions

-

The verbose termination handler - gives information about uncaught exceptions which are killing the - program. It is described in the linked-to page. -

- - -

Return to the top of the page or - to the libstdc++ homepage. -

- - - - -
-

-See license.html for copying conditions. -Comments and suggestions are welcome, and may be sent to -the libstdc++ mailing list. -

- - - - diff --git a/libstdc++-v3/docs/html/documentation.html b/libstdc++-v3/docs/html/documentation.html deleted file mode 100644 index c5413decd27..00000000000 --- a/libstdc++-v3/docs/html/documentation.html +++ /dev/null @@ -1,361 +0,0 @@ - - - - - - - The GNU C++ Library - - - - - - -

The GNU C++ Library

- - -

Table of Contents

- -

-The GNU Standard C++ Library is an ongoing project to implement the ISO -14882 Standard C++ library as described in chapters 17 through 27 and -annex D, extensions as described by TR1, and future C++ library -standards still in progress. For those who want to see exactly how far -the project has come, or just want the latest bleeding-edge code, the -up-to-date source is always publicly available over anonymous SVN, -and can be browsed over the web. -

- -

Stable versions of libstdc++ are included with releases of - the GCC compilers. -

- - - - -
-
-

Source-Level Documentation

-

The library sources have been specially formatted so that with the - proper invocation of another tool (Doxygen), a set of HTML pages - are generated from the sources files themselves. The resultant - documentation is referred to as Source-Level Documentation, and is - useful for examining the signatures of public member functions for - the library classes, finding out what is in a particular include - file, looking at inheritance diagrams, etc. -

-

The source-level documentation for the most recent releases can - be viewed online: -

- -

This generated HTML collection, as above, is also available for download in - the libstdc++ snapshots directory at - <URL:ftp://gcc.gnu.org/pub/gcc/libstdc++/doxygen/>. - You will almost certainly need to use one of the - mirror sites to download - the tarball. After unpacking, simply load libstdc++-html-*/index.html - into a browser. -

-

Documentation for older releases is available for download only, not - online viewing. -

-

In addition, an initial set of man pages are also available in the - same place as the HTML collections. Start with C++Intro(3). -

- -
-
-

Frequently Asked Questions

- -
-
-

All of these documents (in fact, this entire homepage set) - are bundled with the library source, under the docs - subdirectory, for releases and snapshots. The sole exception is the - automatically-generated source documentation, available separately. -

- - -

Return to the libstdc++ homepage.

- - -
-

-See license.html for copying conditions. -Comments and suggestions are welcome, and may be sent to -the libstdc++ mailing list. -

- - - diff --git a/libstdc++-v3/docs/html/ext/ballocator_doc.html b/libstdc++-v3/docs/html/ext/ballocator_doc.html deleted file mode 100644 index 064f5935e72..00000000000 --- a/libstdc++-v3/docs/html/ext/ballocator_doc.html +++ /dev/null @@ -1,426 +0,0 @@ - - - - - Bitmap Allocator - - - - -

Bitmap Allocator

-
-The latest version of this document is always available -at -http://gcc.gnu.org/onlinedocs/libstdc++/ext/ballocator_doc.html.

-
- To the libstdc++ -homepage.
-
-

-As this name suggests, this allocator uses a bit-map to keep track of -the used and unused memory locations for it's book-keeping purposes.
-
-This allocator will make use of 1 single bit to keep track of whether -it has been allocated or not. A bit 1 indicates free, while 0 indicates -allocated. This has been done so that you can easily check a collection -of bits for a free block. This kind of Bitmapped strategy works best -for single object allocations, and with the STL type parameterized -allocators, we do not need to choose any size for the block which will -be represented by a single bit. This will be the size of the parameter -around which the allocator has been parameterized. Thus, close to -optimal performance will result. Hence, this should be used for node -based containers which call the allocate function with an argument of 1.
-
-The bitmapped allocator's internal pool is exponentially growing. -Meaning that internally, the blocks acquired from the Free List Store -will double every time the bitmapped allocator runs out of memory.
-
-

-The macro __GTHREADS decides whether to use Mutex Protection around -every allocation/deallocation. The state of the macro is picked up -automatically from the gthr abstraction layer.
-
-
-

What is the Free List Store?

-
-The Free List Store (referred to as FLS for the remaining part of this -document) is the Global memory pool that is shared by all instances of -the bitmapped allocator instantiated for any type. This maintains a -sorted order of all free memory blocks given back to it by the -bitmapped allocator, and is also responsible for giving memory to the -bitmapped allocator when it asks for more.
-
-Internally, there is a Free List threshold which indicates the Maximum -number of free lists that the FLS can hold internally (cache). -Currently, this value is set at 64. So, if there are more than 64 free -lists coming in, then some of them will be given back to the OS using -operator delete so that at any given time the Free List's size does not -exceed 64 entries. This is done because a Binary Search is used to -locate an entry in a free list when a request for memory comes along. -Thus, the run-time complexity of the search would go up given an -increasing size, for 64 entries however, lg(64) == 6 comparisons are -enough to locate the correct free list if it exists.
-
-Suppose the free list size has reached it's threshold, then the largest -block from among those in the list and the new block will be selected -and given back to the OS. This is done because it reduces external -fragmentation, and allows the OS to use the larger blocks later in an -orderly fashion, possibly merging them later. Also, on some systems, -large blocks are obtained via calls to mmap, so giving them back to -free system resources becomes most important.
-
-The function _S_should_i_give decides the policy that determines -whether the current block of memory should be given to the allocator -for the request that it has made. That's because we may not always have -exact fits for the memory size that the allocator requests. We do this -mainly to prevent external fragmentation at the cost of a little -internal fragmentation. Now, the value of this internal fragmentation -has to be decided by this function. I can see 3 possibilities right -now. Please add more as and when you find better strategies.
-
-
    -
  1. Equal size check. Return true only when the 2 blocks are of equal -size.
  2. -
  3. Difference Threshold: Return true only when the _block_size is -greater than or equal to the _required_size, and if the _BS is > _RS -by a difference of less than some THRESHOLD value, then return true, -else return false.
  4. -
  5. Percentage Threshold. Return true only when the _block_size is -greater than or equal to the _required_size, and if the _BS is > _RS -by a percentage of less than some THRESHOLD value, then return true, -else return false.
  6. -
-
-Currently, (3) is being used with a value of 36% Maximum wastage per -Super Block.
-
-
1) -What is a super block? Why is it needed?
-
-A super block is the block of memory acquired from the FLS from which -the bitmap allocator carves out memory for single objects and satisfies -the user's requests. These super blocks come in sizes that are powers -of 2 and multiples of 32 (_Bits_Per_Block). Yes both at the same time! -That's because the next super block acquired will be 2 times the -previous one, and also all super blocks have to be multiples of the -_Bits_Per_Block value.
-
-2) How does it interact with the free -list store?
-
-The super block is contained in the FLS, and the FLS is responsible for -getting / returning Super Bocks to and from the OS using operator new -as defined by the C++ standard.
-
-
-

How does the allocate function Work?

-
-The allocate function is specialized for single object allocation ONLY. -Thus, ONLY if n == 1, will the bitmap_allocator's specialized algorithm -be used. Otherwise, the request is satisfied directly by calling -operator new.
-
-Suppose n == 1, then the allocator does the following:
-
-
    -
  1. Checks to see whether a free block exists somewhere in a -region of memory close to the last satisfied request. If so, then that -block is marked as allocated in the bit map and given to the user. If -not, then (2) is executed.
  2. -
  3. Is there a free block anywhere after the current block right up to -the end of the memory that we have? If so, that block is found, and the -same procedure is applied as above, and returned to the user. If not, -then (3) is executed.
  4. -
  5. Is there any block in whatever region of memory that we own free? -This is done by checking
    -
    -
      -
    • The use count for each super block, and if that fails then
    • -
    • The individual bit-maps for each super block.
    • -
    -
    -Note: Here we are never touching any of the memory that the user will -be given, and we are confining all memory accesses to a small region of -memory! This helps reduce cache misses. If this succeeds then we apply -the same procedure on that bit-map as (1), and return that block of -memory to the user. However, if this process fails, then we resort to -(4).
  6. -
  7. This process involves Refilling the internal exponentially -growing memory pool. The said effect is achieved by calling -_S_refill_pool which does the following:
    -
    -
      -
    • Gets more memory from the Global Free List of the Required -size.
    • -
    • Adjusts the size for the next call to itself.
    • -
    • Writes the appropriate headers in the bit-maps.
    • -
    • Sets the use count for that super-block just allocated to 0 -(zero).
    • -
    • All of the above accounts to maintaining the basic invariant -for the allocator. If the invariant is maintained, we are sure that all -is well. Now, the same process is applied on the newly acquired free -blocks, which are dispatched accordingly.
    • -
    -
    -
  8. -
-
-Thus, you can clearly see that the allocate function is nothing but a -combination of the next-fit and first-fit algorithm optimized ONLY for -single object allocations.
-
-
-
-

How does the deallocate function work?

-
-The deallocate function again is specialized for single objects ONLY. -For all n belonging to > 1, the operator delete is called without -further ado, and the deallocate function returns.
-
-However for n == 1, a series of steps are performed:
-
-
    -
  1. We first need to locate that super-block which holds the memory -location given to us by the user. For that purpose, we maintain a -static variable _S_last_dealloc_index, which holds the index into the -vector of block pairs which indicates the index of the last super-block -from which memory was freed. We use this strategy in the hope that the -user will deallocate memory in a region close to what he/she -deallocated the last time around. If the check for belongs_to succeeds, -then we determine the bit-map for the given pointer, and locate the -index into that bit-map, and mark that bit as free by setting it.
  2. -
  3. If the _S_last_dealloc_index does not point to the memory block -that we're looking for, then we do a linear search on the block stored -in the vector of Block Pairs. This vector in code is called -_S_mem_blocks. When the corresponding super-block is found, we apply -the same procedure as we did for (1) to mark the block as free in the -bit-map.
  4. -
-
-Now, whenever a block is freed, the use count of that particular super -block goes down by 1. When this use count hits 0, we remove that super -block from the list of all valid super blocks stored in the vector. -While doing this, we also make sure that the basic invariant is -maintained by making sure that _S_last_request and -_S_last_dealloc_index point to valid locations within the vector.
-
-

-

Data Layout for a Super Block:

-
-Each Super Block will be of some size that is a multiple of the number -of Bits Per Block. Typically, this value is chosen as Bits_Per_Byte x -sizeof(size_t). On an x86 system, this gives the figure  8 x -4 = 32. Thus, each Super Block will be of size 32 x Some_Value. This -Some_Value is sizeof(value_type). For now, let it be called 'K'. Thus, -finally, Super Block size is 32 x K bytes.
-
-This value of 32 has been chosen because each size_t has 32-bits -and Maximum use of these can be made with such a figure.
-
-Consider a block of size 64 ints. In memory, it would look like this: -(assume a 32-bit system where, size_t is a 32-bit entity).
-
- - - - - - - - - - -
268
-
0
-
4294967295
-
4294967295
-
Data -> -Space for 64 ints
-
-
-
-The first Column(268) represents the size of the Block in bytes as seen -by -the Bitmap Allocator. Internally, a global free list is used to keep -track of the free blocks used and given back by the bitmap allocator. -It is this Free List Store that is responsible for writing and managing -this information. Actually the number of bytes allocated in this case -would be: 4 + 4 + (4x2) + (64x4) = 272 bytes, but the first 4 bytes are -an -addition by the Free List Store, so the Bitmap Allocator sees only 268 -bytes. These first 4 bytes about which the bitmapped allocator is not -aware hold the value 268.
-
-What do the remaining values represent?
-
-The 2nd 4 in the expression is the sizeof(size_t) because the -Bitmapped Allocator maintains a used count for each Super Block, which -is initially set to 0 (as indicated in the diagram). This is -incremented every time a block is removed from this super block -(allocated), and decremented whenever it is given back. So, when the -used count falls to 0, the whole super block will be given back to the -Free List Store.
-
-The value 4294967295 represents the integer corresponding to the bit -representation of all bits set: 11111111111111111111111111111111.
-
-The 3rd 4x2 is size of the bitmap itself, which is the size of 32-bits -x 2, -which is 8-bytes, or 2 x sizeof(size_t).
-
-

-Another issue would be whether to keep the all bitmaps in a separate -area in memory, or to keep them near the actual blocks that will be -given out or allocated for the client. After some testing, I've decided -to keep these bitmaps close to the actual blocks. This will help in 2 -ways.
-
-
    -
  1. Constant time access for the bitmap themselves, since no kind of -look up will be needed to find the correct bitmap list or it's -equivalent.
  2. -
  3. And also this would preserve the cache as far as possible.
  4. -
-
-So in effect, this kind of an allocator might prove beneficial from a -purely cache point of view. But this allocator has been made to try and -roll out the defects of the node_allocator, wherein the nodes get -skewed about in memory, if they are not returned in the exact reverse -order or in the same order in which they were allocated. Also, the -new_allocator's book keeping overhead is too much for small objects and -single object allocations, though it preserves the locality of blocks -very well when they are returned back to the allocator.
-
-

-Expected overhead per block would be 1 bit in memory. Also, once the -address of the free list has been found, the cost for -allocation/deallocation would be negligible, and is supposed to be -constant time. For these very reasons, it is very important to minimize -the linear time costs, which include finding a free list with a free -block while allocating, and finding the corresponding free list for a -block while deallocating. Therefore, I have decided that the growth of -the internal pool for this allocator will be exponential as compared to -linear for node_allocator. There, linear time works well, because we -are mainly concerned with speed of allocation/deallocation and memory -consumption, whereas here, the allocation/deallocation part does have -some linear/logarithmic complexity components in it. Thus, to try and -minimize them would be a good thing to do at the cost of a little bit -of memory.
-
-Another thing to be noted is the pool size will double every time -the internal pool gets exhausted, and all the free blocks have been -given away. The initial size of the pool would be sizeof(size_t) x 8 -which is the number of bits in an integer, which can fit exactly -in a CPU register. Hence, the term given is exponential growth of the -internal pool.
-
-
After reading all this, you may -still have a few questions about the internal working of this -allocator, like my friend had!
-
-Well here are the exact questions that he posed:
-
-Q1) The "Data Layout" section is -cryptic. I have no idea of what you are trying to say. Layout of what? -The free-list? Each bitmap? The Super Block?
-
-
The layout of a Super Block of a given -size. In the example, a super block of size 32 x 1 is taken. The -general formula for calculating the size of a super block is -32 x sizeof(value_type) x 2^n, where n ranges from 0 to 32 for 32-bit -systems.
-
-
-Q2) And since I just mentioned the -term `each bitmap', what in the world is meant by it? What does each -bitmap manage? How does it relate to the super block? Is the Super -Block a bitmap as well?
-
-
Good question! Each bitmap is part of -a -Super Block which is made up of 3 parts as I have mentioned earlier. -Re-iterating, 1. The use count, 2. The bit-map for that Super Block. 3. -The actual memory that will be eventually given to the user. Each -bitmap is a multiple of 32 in size. If there are 32 x (2^3) blocks of -single objects to be given, there will be '32 x (2^3)' bits present. -Each -32 bits managing the allocated / free status for 32 blocks. Since each -size_t contains 32-bits, one size_t can manage up to 32 -blocks' status. Each bit-map is made up of a number of size_t, -whose exact number for a super-block of a given size I have just -mentioned.
-
-
-Q3) How do the allocate and deallocate -functions work in regard to bitmaps?
-
-
The allocate and deallocate functions -manipulate the bitmaps and have nothing to do with the memory that is -given to the user. As I have earlier mentioned, a 1 in the bitmap's bit -field indicates free, while a 0 indicates allocated. This lets us check -32 bits at a time to check whether there is at lease one free block in -those 32 blocks by testing for equality with (0). Now, the allocate -function will given a memory block find the corresponding bit in the -bitmap, and will reset it (i.e., make it re-set (0)). And when the -deallocate function is called, it will again set that bit after -locating it to indicate that that particular block corresponding to -this bit in the bit-map is not being used by anyone, and may be used to -satisfy future requests.
-
-e.g.: Consider a bit-map of 64-bits as represented below:
-1111111111111111111111111111111111111111111111111111111111111111
-
-Now, when the first request for allocation of a single object comes -along, the first block in address order is returned. And since the -bit-maps in the reverse order to that of the address order, the last -bit (LSB if the bit-map is considered as a binary word of 64-bits) is -re-set to 0.
-
-The bit-map now looks like this:
-1111111111111111111111111111111111111111111111111111111111111110
-
-
-
-

-(Tech-Stuff, Please stay out if you are not interested in the selection -of certain constants. This has nothing to do with the algorithm per-se, -only with some vales that must be chosen correctly to ensure that the -allocator performs well in a real word scenario, and maintains a good -balance between the memory consumption and the allocation/deallocation -speed).
-
-The formula for calculating the maximum wastage as a percentage:
-
-(32 x k + 1) / (2 x (32 x k + 1 + 32 x c)) x 100.
-
-Where,
-k => The constant overhead per node. eg. for list, it is 8 bytes, -and for map it is 12 bytes.
-c => The size of the base type on which the map/list is -instantiated. Thus, suppose the type1 is int and type2 is double, -they are related by the relation sizeof(double) == 2*sizeof(int). Thus, -all types must have this double size relation for this formula to work -properly.
-
-Plugging-in: For List: k = 8 and c = 4 (int and double), we get:
-33.376%
-
-For map/multimap: k = 12, and c = 4 (int and double), we get:
-37.524%
-
-Thus, knowing these values, and based on the sizeof(value_type), we may -create a function that returns the Max_Wastage_Percentage for us to use.
-
-
See license.html -for copying conditions. Comments and suggestions are welcome, and may -be -sent to the libstdc++ mailing -list.
-

-
- - diff --git a/libstdc++-v3/docs/html/ext/concurrence.html b/libstdc++-v3/docs/html/ext/concurrence.html deleted file mode 100644 index e6bf4438f63..00000000000 --- a/libstdc++-v3/docs/html/ext/concurrence.html +++ /dev/null @@ -1,342 +0,0 @@ - - - - - - - - - - Concurrency Support - - - - - - -

Concurrency Support

- -

- The latest version of this document is always available at - - http://gcc.gnu.org/onlinedocs/libstdc++/17_intro/concurrence.html. -

- -

- To the libstdc++ homepage. -

- - - - -
- - -

The interface for concurrency support is divided into two files: -<ext/atomicity.h> which provides support for atomic operations, -and <ext/concurrence.h>, which provides mutex and lock objects -as well as compile-time data structures for querying thread -support.

- -

It is expected that support for concurrence will evolve into what -is specified in the draft C++0x standard.

- -

- Atomics Interface -

- -

-Two functions and one type form the base of atomic support. -

- - -

The type _Atomic_word is a signed integral type -supporting atomic operations. -

- -

-The two functions functions are: -

- -
-_Atomic_word
-__exchange_and_add_dispatch(volatile _Atomic_word*, int);
-
-void
-__atomic_add_dispatch(volatile _Atomic_word*, int);
-
- -

Both of these functions are declared in the header file -<ext/atomicity.h>, and are in namespace __gnu_cxx. -

- -
    -
  • - -__exchange_and_add_dispatch - -

    Adds the second argument's value to the first argument. Returns the old value. -

    -
  • -
  • - -__atomic_add_dispatch - -

    Adds the second argument's value to the first argument. Has no return value. -

    -
  • -
- -

-These functions forward to one of several specialized helper -functions, depending on the circumstances. For instance, -

- -

- -__exchange_and_add_dispatch - -

- -

-Calls through to either of: -

- -
    -
  • __exchange_and_add -

    Multi-thread version. Inlined if compiler-generated builtin atomics -can be used, otherwise resolved at link time to a non-builtin code -sequence. -

    -
  • - -
  • __exchange_and_add_single -

    Single threaded version. Inlined.

    -
  • -
- -

However, only __exchange_and_add_dispatch -and __atomic_add_dispatch should be used. These functions -can be used in a portable manner, regardless of the specific -environment. They are carefully designed to provide optimum efficiency -and speed, abstracting out atomic accesses when they are not required -(even on hosts that support compiler intrinsics for atomic -operations.) -

- -

-In addition, there are two macros -

- -

- -_GLIBCXX_READ_MEM_BARRIER - -

-

- -_GLIBCXX_WRITE_MEM_BARRIER - -

- -

-Which expand to the appropriate write and read barrier required by the -host hardware and operating system. -

- -

- Pthread Interface -

- -

A thin layer above IEEE 1003.1 (ie pthreads) is used to abstract -the thread interface for GCC. This layer is called "gthread," and is -comprised of one header file that wraps the host's default thread layer with -a POSIX-like interface. -

- -

The file <gthr-default.h> points to the deduced wrapper for -the current host. In libstdc++ implementation files, -<bits/gthr.h> is used to select the proper gthreads file. -

- -

Within libstdc++ sources, all calls to underlying thread functionality -use this layer. More detail as to the specific interface can be found in the source documentation. -

- -

By design, the gthread layer is interoperable with the types, -functions, and usage found in the usual <pthread.h> file, -including pthread_t, pthread_once_t, pthread_create, -etc. -

- -

- Concurrence Interface -

- -

The file <ext/concurrence.h> contains all the higher-level -constructs for playing with threads. In contrast to the atomics layer, -the concurrence layer consists largely of types. All types are defined within namespace __gnu_cxx. -

- -

-These types can be used in a portable manner, regardless of the -specific environment. They are carefully designed to provide optimum -efficiency and speed, abstracting out underlying thread calls and -accesses when compiling for single-threaded situations (even on hosts -that support multiple threads.) -

- -

The enumerated type _Lock_policy details the set of -available locking -policies: _S_single, _S_mutex, -and _S_atomic. -

- -
    -
  • _S_single -

    Indicates single-threaded code that does not need locking. -

    - -
  • -
  • _S_mutex -

    Indicates multi-threaded code using thread-layer abstractions. -

    -
  • -
  • _S_atomic -

    Indicates multi-threaded code using atomic operations. -

    -
  • -
- -

The compile-time constant __default_lock_policy is set -to one of the three values above, depending on characteristics of the -host environment and the current compilation flags. -

- -

Two more datatypes make up the rest of the -interface: __mutex, and __scoped_lock. -

- -

-

- -

The scoped lock idiom is well-discussed within the C++ -community. This version takes a __mutex reference, and -locks it during construction of __scoped_locke and -unlocks it during destruction. This is an efficient way of locking -critical sections, while retaining exception-safety. -

- -

Typical usage of the last two constructs is demonstrated as follows: -

- -
-#include <ext/concurrence.h>
-
-namespace
-{
-  __gnu_cxx::__mutex safe_base_mutex;
-} // anonymous namespace
-
-namespace other
-{
-  void
-  foo()
-  {
-    __gnu_cxx::__scoped_lock sentry(safe_base_mutex);
-    for (int i = 0; i < max;  ++i)
-      {
-	_Safe_iterator_base* __old = __iter;
-	__iter = __iter-<_M_next;
-	__old-<_M_detach_single();
-      }
-}
-
- -

In this sample code, an anonymous namespace is used to keep -the __mutex private to the compilation unit, -and __scoped_lock is used to guard access to the critical -section within the for loop, locking the mutex on creation and freeing -the mutex as control moves out of this block. -

- -

Several exception classes are used to keep track of -concurrence-related errors. These classes -are: __concurrence_lock_error, __concurrence_unlock_error, __concurrence_wait_error, -and __concurrence_broadcast_error. -

- - - -

- Details on builtin atomic support and library fallbacks -

- -

The functions for atomic operations described above are either -implemented via compiler intrinsics (if the underlying host is -capable) or by library fallbacks.

- -

Compiler intrinsics (builtins) are always preferred. However, as -the compiler builtins for atomics are not universally implemented, -using them directly is problematic, and can result in undefined -function calls. (An example of an undefined symbol from the use -of __sync_fetch_and_add on an unsupported host is a -missing reference to __sync_fetch_and_add_4.) -

- -

In addition, on some hosts the compiler intrinsics are enabled -conditionally, via the -march command line flag. This makes -usage vary depending on the target hardware and the flags used during -compile. -

- -

If builtins are possible, _GLIBCXX_ATOMIC_BUILTINS -will be defined. -

- - -

For the following hosts, intrinsics are enabled by default. -

- -
    -
  • alpha
  • -
  • ia64
  • -
  • powerpc
  • -
  • s390
  • -
- -

For others, some form of -march may work. On -non-ancient x86 hardware, -march=native usually does the -trick.

- -

For hosts without compiler intrinsics, but with capable -hardware, hand-crafted assembly is selected. This is the case for the following hosts: -

- -
    -
  • cris
  • -
  • hppa
  • -
  • i386
  • -
  • i486
  • -
  • m48k
  • -
  • mips
  • -
  • sparc
  • -
- -

And for the rest, a simulated atomic lock via pthreads. -

- -

Detailed information about compiler intrinsics for atomic operations can be found in the GCC documentation. -

- -

More details on the library fallbacks from the porting section. -

- - - - - - diff --git a/libstdc++-v3/docs/html/ext/debug_mode.html b/libstdc++-v3/docs/html/ext/debug_mode.html deleted file mode 100644 index 7e9d9bafae9..00000000000 --- a/libstdc++-v3/docs/html/ext/debug_mode.html +++ /dev/null @@ -1,578 +0,0 @@ - - - - - - - - - - Design of the libstdc++ debug mode - - - - -

Design of the libstdc++ debug mode

- -

- The latest version of this document is always available at - - http://gcc.gnu.org/onlinedocs/libstdc++/debug_mode.html. -

- -

- To the libstdc++ homepage. -

- - - - -
-

Debug mode design

-

The libstdc++ debug mode replaces unsafe (but efficient) standard - containers and iterators with semantically equivalent safe standard - containers and iterators to aid in debugging user programs. The - following goals directed the design of the libstdc++ debug mode:

- -
    - -
  • Correctness: the libstdc++ debug mode must not change - the semantics of the standard library for all cases specified in - the ANSI/ISO C++ standard. The essence of this constraint is that - any valid C++ program should behave in the same manner regardless - of whether it is compiled with debug mode or release mode. In - particular, entities that are defined in namespace std in release - mode should remain defined in namespace std in debug mode, so that - legal specializations of namespace std entities will remain - valid. A program that is not valid C++ (e.g., invokes undefined - behavior) is not required to behave similarly, although the debug - mode will abort with a diagnostic when it detects undefined - behavior.
  • - -
  • Performance: the additional of the libstdc++ debug mode - must not affect the performance of the library when it is compiled - in release mode. Performance of the libstdc++ debug mode is - secondary (and, in fact, will be worse than the release - mode).
  • - -
  • Usability: the libstdc++ debug mode should be easy to - use. It should be easily incorporated into the user's development - environment (e.g., by requiring only a single new compiler switch) - and should produce reasonable diagnostics when it detects a - problem with the user program. Usability also involves detection - of errors when using the debug mode incorrectly, e.g., by linking - a release-compiled object against a debug-compiled object if in - fact the resulting program will not run correctly.
  • - -
  • Minimize recompilation: While it is expected that - users recompile at least part of their program to use debug - mode, the amount of recompilation affects the - detect-compile-debug turnaround time. This indirectly affects the - usefulness of the debug mode, because debugging some applications - may require rebuilding a large amount of code, which may not be - feasible when the suspect code may be very localized. There are - several levels of conformance to this requirement, each with its - own usability and implementation characteristics. In general, the - higher-numbered conformance levels are more usable (i.e., require - less recompilation) but are more complicated to implement than - the lower-numbered conformance levels. -
      -
    1. Full recompilation: The user must recompile his or - her entire application and all C++ libraries it depends on, - including the C++ standard library that ships with the - compiler. This must be done even if only a small part of the - program can use debugging features.
    2. - -
    3. Full user recompilation: The user must recompile - his or her entire application and all C++ libraries it depends - on, but not the C++ standard library itself. This must be done - even if only a small part of the program can use debugging - features. This can be achieved given a full recompilation - system by compiling two versions of the standard library when - the compiler is installed and linking against the appropriate - one, e.g., a multilibs approach.
    4. - -
    5. Partial recompilation: The user must recompile the - parts of his or her application and the C++ libraries it - depends on that will use the debugging facilities - directly. This means that any code that uses the debuggable - standard containers would need to be recompiled, but code - that does not use them (but may, for instance, use IOStreams) - would not have to be recompiled.
    6. - -
    7. Per-use recompilation: The user must recompile the - parts of his or her application and the C++ libraries it - depends on where debugging should occur, and any other code - that interacts with those containers. This means that a set of - translation units that accesses a particular standard - container instance may either be compiled in release mode (no - checking) or debug mode (full checking), but must all be - compiled in the same way; a translation unit that does not see - that standard container instance need not be recompiled. This - also means that a translation unit A that contains a - particular instantiation - (say, std::vector<int>) compiled in release - mode can be linked against a translation unit B that - contains the same instantiation compiled in debug mode (a - feature not present with partial recompilation). While this - behavior is technically a violation of the One Definition - Rule, this ability tends to be very important in - practice. The libstdc++ debug mode supports this level of - recompilation.
    8. - -
    9. Per-unit recompilation: The user must only - recompile the translation units where checking should occur, - regardless of where debuggable standard containers are - used. This has also been dubbed "-g mode", - because the -g compiler switch works in this way, - emitting debugging information at a per--translation-unit - granularity. We believe that this level of recompilation is in - fact not possible if we intend to supply safe iterators, leave - the program semantics unchanged, and not regress in - performance under release mode because we cannot associate - extra information with an iterator (to form a safe iterator) - without either reserving that space in release mode - (performance regression) or allocating extra memory associated - with each iterator with new (changes the program - semantics).
    10. -
    -
  • -
- -

Other implementations

-

There are several existing implementations of debug modes for C++ - standard library implementations, although none of them directly - supports debugging for programs using libstdc++. The existing - implementations include:

-
    -
  • SafeSTL: - SafeSTL was the original debugging version of the Standard Template - Library (STL), implemented by Cay S. Horstmann on top of the - Hewlett-Packard STL. Though it inspired much work in this area, it - has not been kept up-to-date for use with modern compilers or C++ - standard library implementations.
  • - -
  • STLport: STLport is a free - implementation of the C++ standard library derived from the SGI implementation, and - ported to many other platforms. It includes a debug mode that uses a - wrapper model (that in some way inspired the libstdc++ debug mode - design), although at the time of this writing the debug mode is - somewhat incomplete and meets only the "Full user recompilation" (2) - recompilation guarantee by requiring the user to link against a - different library in debug mode vs. release mode.
  • - -
  • Metrowerks - CodeWarrior: The C++ standard library that ships with Metrowerks - CodeWarrior includes a debug mode. It is a full debug-mode - implementation (including debugging for CodeWarrior extensions) and - is easy to use, although it meets only the "Full recompilation" (1) - recompilation guarantee.
  • -
- -

Debug mode design methodology

-

This section provides an overall view of the design of the - libstdc++ debug mode and details the relationship between design - decisions and the stated design goals.

- -

The wrapper model

-

The libstdc++ debug mode uses a wrapper model where the debugging - versions of library components (e.g., iterators and containers) form - a layer on top of the release versions of the library - components. The debugging components first verify that the operation - is correct (aborting with a diagnostic if an error is found) and - will then forward to the underlying release-mode container that will - perform the actual work. This design decision ensures that we cannot - regress release-mode performance (because the release-mode - containers are left untouched) and partially enables mixing debug and release code at link time, - although that will not be discussed at this time.

- -

Two types of wrappers are used in the implementation of the debug - mode: container wrappers and iterator wrappers. The two types of - wrappers interact to maintain relationships between iterators and - their associated containers, which are necessary to detect certain - types of standard library usage errors such as dereferencing - past-the-end iterators or inserting into a container using an - iterator from a different container.

- -

Safe iterators

-

Iterator wrappers provide a debugging layer over any iterator that - is attached to a particular container, and will manage the - information detailing the iterator's state (singular, - dereferenceable, etc.) and tracking the container to which the - iterator is attached. Because iterators have a well-defined, common - interface the iterator wrapper is implemented with the iterator - adaptor class template __gnu_debug::_Safe_iterator, - which takes two template parameters:

- -
    -
  • Iterator: The underlying iterator type, which must - be either the iterator or const_iterator - typedef from the sequence type this iterator can reference.
  • - -
  • Sequence: The type of sequence that this iterator - references. This sequence must be a safe sequence (discussed below) - whose iterator or const_iterator typedef - is the type of the safe iterator.
  • -
- -

Safe sequences (containers)

-

Container wrappers provide a debugging layer over a particular - container type. Because containers vary greatly in the member - functions they support and the semantics of those member functions - (especially in the area of iterator invalidation), container - wrappers are tailored to the container they reference, e.g., the - debugging version of std::list duplicates the entire - interface of std::list, adding additional semantic - checks and then forwarding operations to the - real std::list (a public base class of the debugging - version) as appropriate. However, all safe containers inherit from - the class template __gnu_debug::_Safe_sequence, - instantiated with the type of the safe container itself (an instance - of the curiously recurring template pattern).

- -

The iterators of a container wrapper will be - safe iterators that reference sequences - of this type and wrap the iterators provided by the release-mode - base class. The debugging container will use only the safe - iterators within its own interface (therefore requiring the user to - use safe iterators, although this does not change correct user - code) and will communicate with the release-mode base class with - only the underlying, unsafe, release-mode iterators that the base - class exports.

- -

The debugging version of std::list will have the - following basic structure:

- -
-template<typename _Tp, typename _Allocator = allocator<_Tp>
-  class debug-list :
-    public release-list<_Tp, _Allocator>,
-    public __gnu_debug::_Safe_sequence<debug-list<_Tp, _Allocator> >
-  {
-    typedef release-list<_Tp, _Allocator> _Base;
-    typedef debug-list<_Tp, _Allocator>   _Self;
-
-  public:
-    typedef __gnu_debug::_Safe_iterator<typename _Base::iterator, _Self>       iterator;
-    typedef __gnu_debug::_Safe_iterator<typename _Base::const_iterator, _Self> const_iterator;
-
-    // duplicate std::list interface with debugging semantics
-  };
-
- -

Precondition checking

-

The debug mode operates primarily by checking the preconditions of - all standard library operations that it supports. Preconditions that - are always checked (regardless of whether or not we are in debug - mode) are checked via the __check_xxx macros defined - and documented in the source - file include/debug/debug.h. Preconditions that may or - may not be checked, depending on the debug-mode - macro _GLIBCXX_DEBUG, are checked via - the __requires_xxx macros defined and documented in the - same source file. Preconditions are validated using any additional - information available at run-time, e.g., the containers that are - associated with a particular iterator, the position of the iterator - within those containers, the distance between two iterators that may - form a valid range, etc. In the absence of suitable information, - e.g., an input iterator that is not a safe iterator, these - precondition checks will silently succeed.

- -

The majority of precondition checks use the aforementioned macros, - which have the secondary benefit of having prewritten debug - messages that use information about the current status of the - objects involved (e.g., whether an iterator is singular or what - sequence it is attached to) along with some static information - (e.g., the names of the function parameters corresponding to the - objects involved). When not using these macros, the debug mode uses - either the debug-mode assertion - macro _GLIBCXX_DEBUG_ASSERT , its pedantic - cousin _GLIBCXX_DEBUG_PEDASSERT, or the assertion - check macro that supports more advance formulation of error - messages, _GLIBCXX_DEBUG_VERIFY. These macros are - documented more thoroughly in the debug mode source code.

- -

Release- and debug-mode coexistence

-

The libstdc++ debug mode is the first debug mode we know of that - is able to provide the "Per-use recompilation" (4) guarantee, that - allows release-compiled and debug-compiled code to be linked and - executed together without causing unpredictable behavior. This - guarantee minimizes the recompilation that users are required to - perform, shortening the detect-compile-debug bughunting cycle - and making the debug mode easier to incorporate into development - environments by minimizing dependencies.

- -

Achieving link- and run-time coexistence is not a trivial - implementation task. To achieve this goal we required a small - extension to the GNU C++ compiler (described in the GCC Manual for - C++ Extensions, see strong - using), and a complex organization of debug- and - release-modes. The end result is that we have achieved per-use - recompilation but have had to give up some checking of the - std::basic_string class template (namely, safe - iterators). -

- -

Compile-time coexistence of release- and - debug-mode components

-

Both the release-mode components and the debug-mode - components need to exist within a single translation unit so that - the debug versions can wrap the release versions. However, only one - of these components should be user-visible at any particular - time with the standard name, e.g., std::list.

- -

In release mode, we define only the release-mode version of the - component with its standard name and do not include the debugging - component at all. The release mode version is defined within the - namespace std. Minus the namespace associations, this - method leaves the behavior of release mode completely unchanged from - its behavior prior to the introduction of the libstdc++ debug - mode. Here's an example of what this ends up looking like, in - C++.

- -
-namespace std
-{
-  template<typename _Tp, typename _Alloc = allocator<_Tp> >
-    class list
-    {
-      // ...
-     };
-} // namespace std
-
- -

In debug mode we include the release-mode container (which is now -defined in in the namespace __norm) and also the -debug-mode container. The debug-mode container is defined within the -namespace __debug, which is associated with namespace -std via the GNU namespace association extension. This -method allows the debug and release versions of the same component to -coexist at compile-time and link-time without causing an unreasonable -maintenance burden, while minimizing confusion. Again, this boils down -to C++ code as follows:

- -
-namespace std
-{
-  namespace __norm
-  {
-    template<typename _Tp, typename _Alloc = allocator<_Tp> >
-      class list
-      {
-        // ...
-      };
-  } // namespace __gnu_norm
-
-  namespace __debug
-  {
-    template<typename _Tp, typename _Alloc = allocator<_Tp> >
-      class list
-      : public __norm::list<_Tp, _Alloc>,
-        public __gnu_debug::_Safe_sequence<list<_Tp, _Alloc> >
-      {
-        // ...
-      };
-  } // namespace __norm
-
-  using namespace __debug __attribute__ ((strong));
-}
-
- -

Link- and run-time coexistence of release- and - debug-mode components

- -

Because each component has a distinct and separate release and -debug implementation, there are are no issues with link-time -coexistence: the separate namespaces result in different mangled -names, and thus unique linkage.

- -

However, components that are defined and used within the C++ -standard library itself face additional constraints. For instance, -some of the member functions of std::moneypunct return -std::basic_string. Normally, this is not a problem, but -with a mixed mode standard library that could be using either -debug-mode or release-mode basic_string objects, things -get more complicated. As the return value of a function is not -encoded into the mangled name, there is no way to specify a -release-mode or a debug-mode string. In practice, this results in -runtime errors. A simplified example of this problem is as follows. -

- -

Take this translation unit, compiled in debug-mode:

-
-// -D_GLIBCXX_DEBUG
-#include <string>
-
-std::string test02();
- 
-std::string test01()
-{
-  return test02();
-}
- 
-int main()
-{
-  test01();
-  return 0;
-}
-
- -

... and linked to this translation unit, compiled in release mode:

- -
-#include <string>
- 
-std::string
-test02()
-{
-  return std::string("toast");
-}
-
- -

For this reason we cannot easily provide safe iterators for - the std::basic_string class template, as it is present - throughout the C++ standard library. For instance, locale facets - define typedefs that include basic_string: in a mixed - debug/release program, should that typedef be based on the - debug-mode basic_string or the - release-mode basic_string? While the answer could be - "both", and the difference hidden via renaming a la the - debug/release containers, we must note two things about locale - facets:

- -
    -
  1. They exist as shared state: one can create a facet in one - translation unit and access the facet via the same type name in a - different translation unit. This means that we cannot have two - different versions of locale facets, because the types would not be - the same across debug/release-mode translation unit barriers.
  2. - -
  3. They have virtual functions returning strings: these functions - mangle in the same way regardless of the mangling of their return - types (see above), and their precise signatures can be relied upon - by users because they may be overridden in derived classes.
  4. -
- -

With the design of libstdc++ debug mode, we cannot effectively hide - the differences between debug and release-mode strings from the - user. Failure to hide the differences may result in unpredictable - behavior, and for this reason we have opted to only - perform basic_string changes that do not require ABI - changes. The effect on users is expected to be minimal, as there are - simple alternatives (e.g., __gnu_debug::basic_string), - and the usability benefit we gain from the ability to mix debug- and - release-compiled translation units is enormous.

- -

Alternatives for Coexistence

-

The coexistence scheme above was chosen over many alternatives, - including language-only solutions and solutions that also required - extensions to the C++ front end. The following is a partial list of - solutions, with justifications for our rejection of each.

- -
    -
  • Completely separate debug/release libraries: This is by - far the simplest implementation option, where we do not allow any - coexistence of debug- and release-compiled translation units in a - program. This solution has an extreme negative affect on usability, - because it is quite likely that some libraries an application - depends on cannot be recompiled easily. This would not meet - our usability or minimize recompilation criteria - well.
  • - -
  • Add a Debug boolean template parameter: - Partial specialization could be used to select the debug - implementation when Debug == true, and the state - of _GLIBCXX_DEBUG could decide whether the - default Debug argument is true - or false. This option would break conformance with the - C++ standard in both debug and release modes. This would - not meet our correctness criteria.
  • - -
  • Packaging a debug flag in the allocators: We could - reuse the Allocator template parameter of containers - by adding a sentinel wrapper debug<> that - signals the user's intention to use debugging, and pick up - the debug<> allocator wrapper in a partial - specialization. However, this has two drawbacks: first, there is a - conformance issue because the default allocator would not be the - standard-specified std::allocator<T>. Secondly - (and more importantly), users that specify allocators instead of - implicitly using the default allocator would not get debugging - containers. Thus this solution fails the correctness - criteria.
  • - -
  • Define debug containers in another namespace, and employ - a using declaration (or directive): This is an - enticing option, because it would eliminate the need for - the link_name extension by aliasing the - templates. However, there is no true template aliasing mechanism - is C++, because both using directives and using - declarations disallow specialization. This method fails - the correctness criteria.
  • - -
  • Use implementation-specific properties of anonymous - namespaces. - See this post - - This method fails the correctness criteria.
  • - -
  • Extension: allow reopening on namespaces: This would - allow the debug mode to effectively alias the - namespace std to an internal namespace, such - as __gnu_std_debug, so that it is completely - separate from the release-mode std namespace. While - this will solve some renaming problems and ensure that - debug- and release-compiled code cannot be mixed unsafely, it ensures that - debug- and release-compiled code cannot be mixed at all. For - instance, the program would have two std::cout - objects! This solution would fails the minimize - recompilation requirement, because we would only be able to - support option (1) or (2).
  • - -
  • Extension: use link name: This option involves - complicated re-naming between debug-mode and release-mode - components at compile time, and then a g++ extension called - link name to recover the original names at link time. There - are two drawbacks to this approach. One, it's very verbose, - relying on macro renaming at compile time and several levels of - include ordering. Two, ODR issues remained with container member - functions taking no arguments in mixed-mode settings resulting in - equivalent link names, vector::push_back() being - one example. - See link - name
  • -
- -

Other options may exist for implementing the debug mode, many of - which have probably been considered and others that may still be - lurking. This list may be expanded over time to include other - options that we could have implemented, but in all cases the full - ramifications of the approach (as measured against the design goals - for a libstdc++ debug mode) should be considered first. The DejaGNU - testsuite includes some testcases that check for known problems with - some solutions (e.g., the using declaration solution - that breaks user specialization), and additional testcases will be - added as we are able to identify other typical problem cases. These - test cases will serve as a benchmark by which we can compare debug - mode implementations.

- - - -
-

-See license.html for copying conditions. -Comments and suggestions are welcome, and may be sent to -the libstdc++ mailing list. -

- - - - diff --git a/libstdc++-v3/docs/html/ext/howto.html b/libstdc++-v3/docs/html/ext/howto.html deleted file mode 100644 index 2e88c660a61..00000000000 --- a/libstdc++-v3/docs/html/ext/howto.html +++ /dev/null @@ -1,675 +0,0 @@ - - - - - - - - - - - libstdc++ HOWTO: Extensions - - - - - - - - - -

Extensions

- -

Here we will make an attempt at describing the non-Standard extensions to - the library. Some of these are from SGI's STL, some of these are GNU's, - and some just seemed to appear on the doorstep. -

-

Before you leap in and use these, be aware of two things: -

-
    -
  1. Non-Standard means exactly that. The behavior, and the very - existence, of these extensions may change with little or no - warning. (Ideally, the really good ones will appear in the next - revision of C++.) Also, other platforms, other compilers, other - versions of g++ or libstdc++ may not recognize these names, or - treat them differently, or...
  2. -
  3. You should know how to access - these headers properly.
  4. -
- - - -
-

Contents

- - -
- - - -

Ropes and trees and hashes, oh my!

-

The SGI headers

-
-     <hash_map>
-     <hash_set>
-     <rope>
-     <slist>
-     <rb_tree>
-   
-

are all here; - <hash_map> and <hash_set> - are deprecated but available as backwards-compatible extensions, - as discussed further below. <rope> is the - SGI specialization for large strings ("rope," - "large strings," get it? Love that geeky humor.) - <slist> is a singly-linked list, for when the - doubly-linked list<> is too much space - overhead, and <rb_tree> exposes the red-black - tree classes used in the implementation of the standard maps and - sets. -

-

Each of the associative containers map, multimap, set, and multiset - have a counterpart which uses a - hashing - function to do the arranging, instead of a strict weak ordering - function. The classes take as one of their template parameters a - function object that will return the hash value; by default, an - instantiation of - hash. - You should specialize this functor for your class, or define your own, - before trying to use one of the hashing classes. -

-

The hashing classes support all the usual associative container - functions, as well as some extra constructors specifying the number - of buckets, etc. -

-

Why would you want to use a hashing class instead of the - "normal" implementations? Matt Austern writes: -

-
[W]ith a well chosen hash function, hash tables - generally provide much better average-case performance than binary - search trees, and much worse worst-case performance. So if your - implementation has hash_map, if you don't mind using nonstandard - components, and if you aren't scared about the possibility of - pathological cases, you'll probably get better performance from - hash_map.
- -

Okay, about the SGI hashing classes... these classes have been - deprecated by the unordered_set, unordered_multiset, unordered_map, - unordered_multimap containers in TR1 and the upcoming C++0x, and - may be removed in future releases. -

- -

Return to top of page or - to the FAQ. -

- -
-

Added members and types

-

Some of the classes in the Standard Library have additional - publicly-available members, and some classes are themselves not in - the standard. Of those, some are intended purely for the implementors, - for example, additional typedefs. Those won't be described here - (or anywhere else). -

-
    -
  • The extensions added by SGI are so numerous that they have - their own page. Since the SGI STL is no - longer actively maintained, we will try and keep this code working - ourselves.
  • -
  • Extensions allowing filebufs to be constructed from - stdio types are described in the - chapter 27 notes.
  • -
  • The C++ Standard Library Technical Report adds many new features - to the library, see FAQ 5.5.
  • -
-

Return to top of page or - to the FAQ. -

- -
-

Compile-time checks

-

Currently libstdc++ uses the concept checkers from the Boost - library to perform optional - compile-time checking of template instantiations of the standard - containers. They are described in the linked-to page. -

-

Return to top of page or - to the FAQ. -

- -
-

LWG Issues

-

Everybody's got issues. Even the C++ Standard Library. -

-

The Library Working Group, or LWG, is the ISO subcommittee responsible - for making changes to the library. They periodically publish an - Issues List containing problems and possible solutions. As they reach - a consensus on proposed solutions, we often incorporate the solution - into libstdc++. -

-

Here are the issues which have resulted in code changes to the library. - The links are to the specific defect reports from a partial - copy of the Issues List. You can read the full version online - at the ISO C++ - Committee homepage, linked to on the - GCC "Readings" - page. If - you spend a lot of time reading the issues, we recommend downloading - the ZIP file and reading them locally. -

-

(NB: partial copy means that not all links within - the lwg-*.html pages will work. - Specifically, links to defect reports that have not been accorded full - DR status will probably break. Rather than trying to mirror the - entire issues list on our overworked web server, we recommend you go - to the LWG homepage instead.) -

-

- If a DR is not listed here, we may simply not have gotten to it yet; - feel free to submit a patch. Search the include/bits and src - directories for appearances of _GLIBCXX_RESOLVE_LIB_DEFECTS for - examples of style. Note that we usually do not make changes to the code - until an issue has reached DR status. -

-
-
5: - string::compare specification questionable -
-
This should be two overloaded functions rather than a single function. -
- -
17: - Bad bool parsing -
-
Apparently extracting Boolean values was messed up... -
- -
19: - "Noconv" definition too vague -
-
If codecvt::do_in returns noconv there are - no changes to the values in [to, to_limit). -
- -
22: - Member open vs flags -
-
Re-opening a file stream does not clear the state flags. -
- -
25: - String operator<< uses width() value wrong -
-
Padding issues. -
- -
48: - Use of non-existent exception constructor -
-
An instance of ios_base::failure is constructed instead. -
- -
49: - Underspecification of ios_base::sync_with_stdio -
-
The return type is the previous state of synchronization. -
- -
50: - Copy constructor and assignment operator of ios_base -
-
These members functions are declared private and are - thus inaccessible. Specifying the correct semantics of - "copying stream state" was deemed too complicated. -
- -
60: - What is a formatted input function? -
-
This DR made many widespread changes to basic_istream - and basic_ostream all of which have been implemented. -
- -
63: - Exception-handling policy for unformatted output -
-
Make the policy consistent with that of formatted input, unformatted - input, and formatted output. -
- -
68: - Extractors for char* should store null at end -
-
And they do now. An editing glitch in the last item in the list of - [27.6.1.2.3]/7. -
- -
74: - Garbled text for codecvt::do_max_length -
-
The text of the standard was gibberish. Typos gone rampant. -
- -
75: - Contradiction in codecvt::length's argument types -
-
Change the first parameter to stateT& and implement - the new effects paragraph. -
- -
83: - string::npos vs. string::max_size() -
-
Safety checks on the size of the string should test against - max_size() rather than npos. -
- -
90: - Incorrect description of operator>> for strings -
-
The effect contain isspace(c,getloc()) which must be - replaced by isspace(c,is.getloc()). -
- -
91: - Description of operator>> and getline() for string<> - might cause endless loop -
-
They behave as a formatted input function and as an unformatted - input function, respectively (except that getline is - not required to set gcount). -
- -
103: - set::iterator is required to be modifiable, but this allows - modification of keys. -
-
For associative containers where the value type is the same as - the key type, both iterator and const_iterator - are constant iterators. -
- -
109: - Missing binders for non-const sequence elements -
-
The binder1st and binder2nd didn't have an - operator() taking a non-const parameter. -
- -
110: - istreambuf_iterator::equal not const -
-
This was not a const member function. Note that the DR says to - replace the function with a const one; we have instead provided an - overloaded version with identical contents. -
- -
117: - basic_ostream uses nonexistent num_put member functions -
-
num_put::put() was overloaded on the wrong types. -
- -
118: - basic_istream uses nonexistent num_get member functions -
-
Same as 117, but for num_get::get(). -
- -
129: - Need error indication from seekp() and seekg() -
-
These functions set failbit on error now. -
- -
136: - seekp, seekg setting wrong streams? -
-
seekp should only set the output stream, and - seekg should only set the input stream. -
- - - -
167: - Improper use of traits_type::length() -
-
op<< with a const char* was - calculating an incorrect number of characters to write. -
- -
169: - Bad efficiency of overflow() mandated -
-
Grow efficiently the internal array object. -
- -
171: - Strange seekpos() semantics due to joint position -
-
Quite complex to summarize... -
- -
181: - make_pair() unintended behavior -
-
This function used to take its arguments as reference-to-const, now - it copies them (pass by value). -
- -
195: - Should basic_istream::sentry's constructor ever set eofbit? -
-
Yes, it can, specifically if EOF is reached while skipping whitespace. -
- -
211: - operator>>(istream&, string&) doesn't set failbit -
-
If nothing is extracted into the string, op>> now - sets failbit (which can cause an exception, etc., etc.). -
- -
214: - set::find() missing const overload -
-
Both set and multiset were missing - overloaded find, lower_bound, upper_bound, and equal_range functions - for const instances. -
- -
231: - Precision in iostream? -
-
For conversion from a floating-point type, str.precision() - is specified in the conversion specification. -
- -
233: - Insertion hints in associative containers -
-
Implement N1780, first check before then check after, insert as close - to hint as possible. -
- -
235: - No specification of default ctor for reverse_iterator -
-
The declaration of reverse_iterator lists a default constructor. - However, no specification is given what this constructor should do. -
- -
241: - Does unique_copy() require CopyConstructible and Assignable? -
-
Add a helper for forward_iterator/output_iterator, fix the existing - one for input_iterator/output_iterator to not rely on Assignability. -
- -
243: - get and getline when sentry reports failure -
-
Store a null character only if the character array has a non-zero size. -
- -
251: - basic_stringbuf missing allocator_type -
-
This nested typedef was originally not specified. -
- -
253: - valarray helper functions are almost entirely useless -
-
Make the copy constructor and copy-assignment operator declarations - public in gslice_array, indirect_array, mask_array, slice_array; provide - definitions. -
- -
265: - std::pair::pair() effects overly restrictive -
-
The default ctor would build its members from copies of temporaries; - now it simply uses their respective default ctors. -
- -
266: - bad_exception::~bad_exception() missing Effects clause -
-
The bad_* classes no longer have destructors (they - are trivial), since no description of them was ever given. -
- -
271: - basic_iostream missing typedefs -
-
The typedefs it inherits from its base classes can't be used, since - (for example) basic_iostream<T>::traits_type is ambiguous. -
- -
275: - Wrong type in num_get::get() overloads -
-
Similar to 118. -
- -
280: - Comparison of reverse_iterator to const reverse_iterator -
-
Add global functions with two template parameters. - (NB: not added for now a templated assignment operator) -
- -
292: - Effects of a.copyfmt (a) -
-
If (this == &rhs) do nothing. -
- -
300: - List::merge() specification incomplete -
-
If (this == &x) do nothing. -
- -
303: - Bitset input operator underspecified -
-
Basically, compare the input character to is.widen(0) - and is.widen(1). -
- -
305: - Default behavior of codecvt<wchar_t, char, mbstate_t>::length() -
-
Do not specify what codecvt<wchar_t, char, mbstate_t>::do_length - must return. -
- -
328: - Bad sprintf format modifier in money_put<>::do_put() -
-
Change the format string to "%.0Lf". -
- -
365: - Lack of const-qualification in clause 27 -
-
Add const overloads of is_open. -
- -
389: - Const overload of valarray::operator[] returns by value -
-
Change it to return a const T&. -
- -
402: - Wrong new expression in [some_]allocator::construct -
-
Replace "new" with "::new". -
- -
409: - Closing an fstream should clear the error state -
-
Have open clear the error flags. -
- -
431: - Swapping containers with unequal allocators -
-
Implement Option 3, as per N1599. -
- -
432: - stringbuf::overflow() makes only one write position - available -
-
Implement the resolution, beyond DR 169. -
- -
434: - bitset::to_string() hard to use -
-
Add three overloads, taking fewer template arguments. -
- -
438: - Ambiguity in the "do the right thing" clause -
-
Implement the resolution, basically cast less. -
- -
453: - basic_stringbuf::seekoff need not always fail for an empty stream -
-
Don't fail if the next pointer is null and newoff is zero. -
- -
455: - cerr::tie() and wcerr::tie() are overspecified -
-
Initialize cerr tied to cout and wcerr tied to wcout. -
- -
464: - Suggestion for new member functions in standard containers -
-
Add data() to std::vector and - at(const key_type&) to std::map. -
- -
508: - Bad parameters for ranlux64_base_01 -
-
Fix the parameters. -
- -
512: - Seeding subtract_with_carry_01 from a single unsigned long -
-
Construct a linear_congruential engine and seed with it. -
- -
526: - Is it undefined if a function in the standard changes in - parameters? -
-
Use &value. -
- -
538: - 241 again: Does unique_copy() require CopyConstructible - and Assignable? -
-
In case of input_iterator/output_iterator rely on Assignability of - input_iterator' value_type. -
- -
541: - shared_ptr template assignment and void -
-
Add an auto_ptr<void> specialization. -
- -
543: - valarray slice default constructor -
-
Follow the straightforward proposed resolution. -
- -
586: - string inserter not a formatted function -
-
Change it to be a formatted output function (i.e. catch exceptions). -
- -
596: - 27.8.1.3 Table 112 omits "a+" and "a+b" modes -
-
Add the missing modes to fopen_mode. -
- -
660: - Missing bitwise operations -
-
Add the missing operations. -
- -
693: - std::bitset::all() missing -
-
Add it, consistently with the discussion. -
- -
695: - ctype<char>::classic_table() not accessible -
-
Make the member functions table and classic_table public. -
- -
-

Return to top of page or - to the FAQ. -

- - - - -
-

-See license.html for copying conditions. -Comments and suggestions are welcome, and may be sent to -the libstdc++ mailing list. -

- - - - diff --git a/libstdc++-v3/docs/html/ext/lwg-active.html b/libstdc++-v3/docs/html/ext/lwg-active.html deleted file mode 100644 index 29e0d775bf3..00000000000 --- a/libstdc++-v3/docs/html/ext/lwg-active.html +++ /dev/null @@ -1,14696 +0,0 @@ - -C++ Standard Library Active Issues List - - - - - - - - - - - - - - - - - - - - - -
Doc. no.N2456=07-0326
Date:2007-10-20
Project:Programming Language C++
Reply to:Howard Hinnant <howard.hinnant@gmail.com>
-

C++ Standard Library Active Issues List (Revision R52)

- -

Reference ISO/IEC IS 14882:1998(E)

-

Also see:

- -

The purpose of this document is to record the status of issues - which have come before the Library Working Group (LWG) of the ANSI - (J16) and ISO (WG21) C++ Standards Committee. Issues represent - potential defects in the ISO/IEC IS 14882:1998(E) document. Issues - are not to be used to request new features.

- -

This document contains only library issues which are actively being - considered by the Library Working Group. That is, issues which have a - status of New, Open, - Ready, and Review. See - Library Defect Reports List for issues considered defects and - Library Closed Issues List for issues considered closed.

- -

The issues in these lists are not necessarily formal ISO Defect - Reports (DR's). While some issues will eventually be elevated to - official Defect Report status, other issues will be disposed of in - other ways. See Issue Status.

- -

This document is in an experimental format designed for both - viewing via a world-wide web browser and hard-copy printing. It - is available as an HTML file for browsing or PDF file for - printing.

- -

Prior to Revision 14, library issues lists existed in two slightly - different versions; a Committee Version and a Public - Version. Beginning with Revision 14 the two versions were combined - into a single version.

- -

This document includes [bracketed italicized notes] as a - reminder to the LWG of current progress on issues. Such notes are - strictly unofficial and should be read with caution as they may be - incomplete or incorrect. Be aware that LWG support for a particular - resolution can quickly change if new viewpoints or killer examples are - presented in subsequent discussions.

- -

For the most current official version of this document see - http://www.open-std.org/jtc1/sc22/wg21/. - Requests for further information about this document should include - the document number above, reference ISO/IEC 14882:1998(E), and be - submitted to Information Technology Industry Council (ITI), 1250 Eye - Street NW, Washington, DC 20005.

- -

Public information as to how to obtain a copy of the C++ Standard, - join the standards committee, submit an issue, or comment on an issue - can be found in the comp.std.c++ FAQ. - Public discussion of C++ Standard related issues occurs on news:comp.std.c++. -

- -

For committee members, files available on the committee's private - web site include the HTML version of the Standard itself. HTML - hyperlinks from this issues list to those files will only work for - committee members who have downloaded them into the same disk - directory as the issues list files.

- -

Revision History

-
    -
  • R52: -2007-10-19 post-Kona mailing. - -
  • -
  • R51: -2007-09-09 pre-Kona mailing. - -
  • -
  • R50: -2007-08-05 post-Toronto mailing. -
      -
    • Summary:
        -
      • 153 open issues, down by 5.
      • -
      • 555 closed issues, up by 17.
      • -
      • 708 issues total, up by 12.
      • -
    • -
    • Details:
        -
      • Added the following New issues: 697, 698, 699, 700, 701, 702, 703, 704, 705, 706, 707, 708.
      • -
      • Changed the following issues from New to NAD: 583, 584, 662.
      • -
      • Changed the following issues from Open to NAD: 528.
      • -
      • Changed the following issues from New to NAD Editorial: 637, 647, 658, 690.
      • -
      • Changed the following issues from Open to NAD Editorial: 525.
      • -
      • Changed the following issues from Pending NAD Editorial to NAD Editorial: 553, 571, 591, 633, 636, 641, 642, 648, 649, 656.
      • -
      • Changed the following issues from New to Open: 579, 631, 680.
      • -
      • Changed the following issues from Pending WP to Open: 258.
      • -
      • Changed the following issues from Ready to Pending WP: 644.
      • -
      • Changed the following issues from New to Ready: 577, 660.
      • -
      • Changed the following issues from Open to Ready: 488.
      • -
      • Changed the following issues from Open to Review: 518.
      • -
      • Changed the following issues from Ready to TRDec: 604.
      • -
      • Changed the following issues from DR to WP: 453.
      • -
      • Changed the following issues from Ready to WP: 531, 551, 566, 628, 640, 643, 646.
      • -
    • -
    -
  • -
  • R49: -2007-06-23 pre-Toronto mailing. -
      -
    • Summary:
        -
      • 158 open issues, up by 13.
      • -
      • 538 closed issues, up by 7.
      • -
      • 696 issues total, up by 20.
      • -
    • -
    • Details:
        -
      • Added the following New issues: 677, 678, 679, 680, 681, 682, 684, 685, 686, 687, 688, 689, 690, 691, 692, 693, 694, 695, 696.
      • -
      • Added the following Pending NAD Editorial issues: 683.
      • -
      • Changed the following issues from New to NAD Editorial: 587.
      • -
      • Changed the following issues from Open to NAD Editorial: 590.
      • -
      • Changed the following issues from New to Pending NAD Editorial: 636, 642, 648, 649.
      • -
    • -
    -
  • -
  • R48: -2007-05-06 post-Oxford mailing. - -
  • -
  • R47: -2007-03-09 pre-Oxford mailing. - -
  • -
  • R46: -2007-01-12 mid-term mailing. -
      -
    • Summary:
        -
      • 141 open issues, up by 11.
      • -
      • 478 closed issues, down by 1.
      • -
      • 619 issues total, up by 10.
      • -
    • -
    • Details:
    • -
    -
  • -
  • R45: -2006-11-03 post-Portland mailing. - -
  • -
  • R44: -2006-09-08 pre-Portland mailing. -
      -
    • Summary:
        -
      • 130 open issues, up by 6.
      • -
      • 462 closed issues, down by 1.
      • -
      • 592 issues total, up by 5.
      • -
    • -
    • Details:
    • -
    -
  • -
  • R43: -2006-06-23 mid-term mailing. -
      -
    • Summary:
        -
      • 124 open issues, up by 14.
      • -
      • 463 closed issues, down by 1.
      • -
      • 587 issues total, up by 13.
      • -
    • -
    • Details:
    • -
    -
  • -
  • R42: -2006-04-21 post-Berlin mailing. - -
  • -
  • R41: -2006-02-24 pre-Berlin mailing. -
      -
    • Summary:
        -
      • 126 open issues, up by 31.
      • -
      • 440 closed issues, up by 0.
      • -
      • 566 issues total, up by 31.
      • -
    • -
    • Details:
        -
      • Added new issues 536-566.
      • -
      • Moved 342 from Ready to Open.
      • -
      • Reopened 309.
      • -
    • -
    -
  • -
  • R40: -2005-12-16 mid-term mailing. -
      -
    • Summary:
        -
      • 95 open issues.
      • -
      • 440 closed issues.
      • -
      • 535 issues total.
      • -
    • -
    • Details:
    • -
    -
  • -
  • R39: -2005-10-14 post-Mont Tremblant mailing. -Added new issues 526-528. -Moved issues 280, 461, 464, 465, 467, 468, 474, 496 from Ready to WP as per the vote from Mont Tremblant. -Moved issues 247, 294, 342, 362, 369, 371, 376, 384, 475, 478, 495, 497 from Review to Ready. -Moved issues 498, 504, 506, 509, 510, 511, 512, 513, 514 from New to Open. -Moved issues 505, 507, 508, 519 from New to Ready. -Moved issue 500 from New to NAD. -Moved issue 518 from New to Review. -
  • -
  • R38: -2005-07-03 pre-Mont Tremblant mailing. -Merged open TR1 issues in 504-522. -Added new issues 523-523 -
  • -
  • R37: -2005-06 mid-term mailing. -Added new issues 498-503. -
  • -
  • R36: -2005-04 post-Lillehammer mailing. All issues in "ready" status except -for 454 were moved to "DR" status, and all issues -previously in "DR" status were moved to "WP". -
  • -
  • R35: -2005-03 pre-Lillehammer mailing. -
  • -
  • R34: -2005-01 mid-term mailing. Added new issues 488-494. -
  • -
  • R33: -2004-11 post-Redmond mailing. Reflects actions taken in Redmond. -
  • -
  • R32: -2004-09 pre-Redmond mailing: reflects new proposed resolutions and -new issues received after the 2004-07 mailing. Added -new issues 479-481. -
  • -
  • R31: -2004-07 mid-term mailing: reflects new proposed resolutions and -new issues received after the post-Sydney mailing. Added -new issues 463-478. -
  • -
  • R30: -Post-Sydney mailing: reflects decisions made at the Sydney meeting. -Voted all "Ready" issues from R29 into the working paper. -Added new issues 460-462. -
  • -
  • R29: -Pre-Sydney mailing. Added new issues 441-457. -
  • -
  • R28: -Post-Kona mailing: reflects decisions made at the Kona meeting. -Added new issues 432-440. -
  • -
  • R27: -Pre-Kona mailing. Added new issues 404-431. -
  • -
  • R26: -Post-Oxford mailing: reflects decisions made at the Oxford meeting. -All issues in Ready status were voted into DR status. All issues in -DR status were voted into WP status. -
  • -
  • R25: -Pre-Oxford mailing. Added new issues 390-402. -
  • -
  • R24: -Post-Santa Cruz mailing: reflects decisions made at the Santa Cruz -meeting. All Ready issues from R23 with the exception of 253, which has been given a new proposed resolution, were -moved to DR status. Added new issues 383-389. (Issues 387-389 were discussed -at the meeting.) Made progress on issues 225, 226, 229: 225 and 229 have been moved to Ready status, and the only remaining -concerns with 226 involve wording. -
  • -
  • R23: -Pre-Santa Cruz mailing. Added new issues 367-382. -Moved issues in the TC to TC status. -
  • -
  • R22: -Post-Curaçao mailing. Added new issues 362-366. -
  • -
  • R21: -Pre-Curaçao mailing. Added new issues 351-361. -
  • -
  • R20: -Post-Redmond mailing; reflects actions taken in Redmond. Added -new issues 336-350, of which issues -347-350 were added since Redmond, hence -not discussed at the meeting. - -All Ready issues were moved to DR status, with the exception of issues -284, 241, and 267. - -Noteworthy issues discussed at Redmond include -120 202, 226, 233, -270, 253, 254, 323. -
  • -
  • R19: -Pre-Redmond mailing. Added new issues -323-335. -
  • -
  • R18: -Post-Copenhagen mailing; reflects actions taken in Copenhagen. -Added new issues 312-317, and discussed -new issues 271-314. - -Changed status of issues -103 118 136 153 -165 171 183 184 -185 186 214 221 -234 237 243 248 -251 252 256 260 -261 262 263 265 -268 -to DR. - -Changed status of issues -49 109 117 182 -228 230 232 235 -238 241 242 250 -259 264 266 267 -271 272 273 275 -281 284 285 286 -288 292 295 297 -298 301 303 306 -307 308 312 -to Ready. - -Closed issues -111 277 279 287 -289 293 302 313 -314 -as NAD. - -
  • -
  • R17: -Pre-Copenhagen mailing. Converted issues list to XML. Added proposed -resolutions for issues 49, 76, 91, 235, 250, 267. -Added new issues 278-311. -
  • -
  • R16: -post-Toronto mailing; reflects actions taken in Toronto. Added new -issues 265-277. Changed status of issues -3, 8, 9, 19, -26, 31, 61, -63, 86, 108, -112, 114, 115, -122, 127, 129, -134, 137, 142, -144, 146, 147, -159, 164, 170, -181, 199, 208, -209, 210, 211, -212, 217, 220, -222, 223, 224, -227 to "DR". Reopened issue 23. Reopened -issue 187. Changed issues 2 and -4 to NAD. Fixed a typo in issue 17. Fixed -issue 70: signature should be changed both places it -appears. Fixed issue 160: previous version didn't fix -the bug in enough places. -
  • -
  • R15: -pre-Toronto mailing. Added issues -233-264. Some small HTML formatting -changes so that we pass Weblint tests. -
  • -
  • R14: -post-Tokyo II mailing; reflects committee actions taken in -Tokyo. Added issues 228 to 232. (00-0019R1/N1242) -
  • -
  • R13: -pre-Tokyo II updated: Added issues 212 to 227. -
  • -
  • R12: -pre-Tokyo II mailing: Added issues 199 to -211. Added "and paragraph 5" to the proposed resolution -of issue 29. Add further rationale to issue -178. -
  • -
  • R11: -post-Kona mailing: Updated to reflect LWG and full committee actions -in Kona (99-0048/N1224). Note changed resolution of issues -4 and 38. Added issues 196 -to 198. Closed issues list split into "defects" and -"closed" documents. Changed the proposed resolution of issue -4 to NAD, and changed the wording of proposed resolution -of issue 38. -
  • -
  • R10: -pre-Kona updated. Added proposed resolutions 83, -86, 91, 92, -109. Added issues 190 to -195. (99-0033/D1209, 14 Oct 99) -
  • -
  • R9: -pre-Kona mailing. Added issues 140 to -189. Issues list split into separate "active" and -"closed" documents. (99-0030/N1206, 25 Aug 99) -
  • -
  • R8: -post-Dublin mailing. Updated to reflect LWG and full committee actions -in Dublin. (99-0016/N1193, 21 Apr 99) -
  • -
  • R7: -pre-Dublin updated: Added issues 130, 131, -132, 133, 134, -135, 136, 137, -138, 139 (31 Mar 99) -
  • -
  • R6: -pre-Dublin mailing. Added issues 127, 128, -and 129. (99-0007/N1194, 22 Feb 99) -
  • -
  • R5: -update issues 103, 112; added issues -114 to 126. Format revisions to prepare -for making list public. (30 Dec 98) -
  • -
  • R4: -post-Santa Cruz II updated: Issues 110, -111, 112, 113 added, several -issues corrected. (22 Oct 98) -
  • -
  • R3: -post-Santa Cruz II: Issues 94 to 109 -added, many issues updated to reflect LWG consensus (12 Oct 98) -
  • -
  • R2: -pre-Santa Cruz II: Issues 73 to 93 added, -issue 17 updated. (29 Sep 98) -
  • -
  • R1: -Correction to issue 55 resolution, 60 code -format, 64 title. (17 Sep 98) -
  • -
- -

Issue Status

- -

New - The issue has not yet been - reviewed by the LWG. Any Proposed Resolution is purely a - suggestion from the issue submitter, and should not be construed as - the view of LWG.

- -

Open - The LWG has discussed the issue - but is not yet ready to move the issue forward. There are several - possible reasons for open status:

-
    -
  • Consensus may have not yet have been reached as to how to deal - with the issue.
  • -
  • Informal consensus may have been reached, but the LWG awaits - exact Proposed Resolution wording for review.
  • -
  • The LWG wishes to consult additional technical experts before - proceeding.
  • -
  • The issue may require further study.
  • -
- -

A Proposed Resolution for an open issue is still not be - construed as the view of LWG. Comments on the current state of - discussions are often given at the end of open issues in an italic - font. Such comments are for information only and should not be given - undue importance.

- -

Dup - The LWG has reached consensus that - the issue is a duplicate of another issue, and will not be further - dealt with. A Rationale identifies the duplicated issue's - issue number.

- -

NAD - The LWG has reached consensus that - the issue is not a defect in the Standard.

- -

NAD Editorial - The LWG has reached consensus that - the issue can either be handled editorially, or is handled by a paper (usually - linked to in the rationale).

- -

NAD Future - In addition to the regular - status, the LWG believes that this issue should be revisited at the - next revision of the standard.

- -

Review - Exact wording of a - Proposed Resolution is now available for review on an issue - for which the LWG previously reached informal consensus.

- -

Tentatively Ready - The issue has - been reviewed online, but not in a meeting, and some support has been formed - for the proposed resolution. Tentatively Ready issues may be moved to Ready - and forwarded to full committee within the same meeting. Unlike Ready issues - they will be reviewed in subcommittee prior to forwarding to full committee.

- -

Ready - The LWG has reached consensus - that the issue is a defect in the Standard, the Proposed - Resolution is correct, and the issue is ready to forward to the - full committee for further action as a Defect Report (DR).

- -

DR - (Defect Report) - The full J16 - committee has voted to forward the issue to the Project Editor to be - processed as a Potential Defect Report. The Project Editor reviews - the issue, and then forwards it to the WG21 Convenor, who returns it - to the full committee for final disposition. This issues list - accords the status of DR to all these Defect Reports regardless of - where they are in that process.

- -

TC - (Technical Corrigenda) - The full - WG21 committee has voted to accept the Defect Report's Proposed - Resolution as a Technical Corrigenda. Action on this issue is thus - complete and no further action is possible under ISO rules.

- -

TRDec - (Decimal TR defect) - The - LWG has voted to accept the Defect Report's Proposed - Resolution into the Decimal TR. Action on this issue is thus - complete and no further action is expected.

- -

WP - (Working Paper) - The proposed - resolution has not been accepted as a Technical Corrigendum, but - the full WG21 committee has voted to apply the Defect Report's Proposed - Resolution to the working paper.

- -

Pending - This is a status qualifier. When prepended to - a status this indicates the issue has been - processed by the committee, and a decision has been made to move the issue to - the associated unqualified status. However for logistical reasons the indicated - outcome of the issue has not yet appeared in the latest working paper. - -

Issues are always given the status of New when - they first appear on the issues list. They may progress to - Open or Review while the LWG - is actively working on them. When the LWG has reached consensus on - the disposition of an issue, the status will then change to - Dup, NAD, or - Ready as appropriate. Once the full J16 committee votes to - forward Ready issues to the Project Editor, they are given the - status of Defect Report ( DR). These in turn may - become the basis for Technical Corrigenda (TC), - or are closed without action other than a Record of Response - (RR ). The intent of this LWG process is that - only issues which are truly defects in the Standard move to the - formal ISO DR status. -

- - -

Active Issues

-
-

23. Num_get overflow result

-

Section: 22.2.2.1.2 [facet.num.get.virtuals] Status: Open - Submitter: Nathan Myers Date: 1998-08-06

-

View other active issues in [facet.num.get.virtuals].

-

View all other issues in [facet.num.get.virtuals].

-

View all issues with Open status.

-

Discussion:

-

The current description of numeric input does not account for the -possibility of overflow. This is an implicit result of changing the -description to rely on the definition of scanf() (which fails to -report overflow), and conflicts with the documented behavior of -traditional and current implementations.

- -

Users expect, when reading a character sequence that results in a -value unrepresentable in the specified type, to have an error -reported. The standard as written does not permit this.

- -

Further comments from Dietmar:

- -

-I don't feel comfortable with the proposed resolution to issue 23: It -kind of simplifies the issue to much. Here is what is going on: -

- -

-Currently, the behavior of numeric overflow is rather counter intuitive -and hard to trace, so I will describe it briefly: -

- -
    -
  • - According to 22.2.2.1.2 [facet.num.get.virtuals] - paragraph 11 failbit is set if scanf() would - return an input error; otherwise a value is converted to the rules - of scanf. -
  • -
  • - scanf() is defined in terms of fscanf(). -
  • -
  • - fscanf() returns an input failure if during conversion no - character matching the conversion specification could be extracted - before reaching EOF. This is the only reason for fscanf() - to fail due to an input error and clearly does not apply to the case - of overflow. -
  • -
  • - Thus, the conversion is performed according to the rules of - fscanf() which basically says that strtod, - strtol(), etc. are to be used for the conversion. -
  • -
  • - The strtod(), strtol(), etc. functions consume as - many matching characters as there are and on overflow continue to - consume matching characters but also return a value identical to - the maximum (or minimum for signed types if there was a leading minus) - value of the corresponding type and set errno to ERANGE. -
  • -
  • - Thus, according to the current wording in the standard, overflows - can be detected! All what is to be done is to check errno - after reading an element and, of course, clearing errno - before trying a conversion. With the current wording, it can be - detected whether the overflow was due to a positive or negative - number for signed types. -
  • -
- -

Further discussion from Redmond:

- -

The basic problem is that we've defined our behavior, -including our error-reporting behavior, in terms of C90. However, -C90's method of reporting overflow in scanf is not technically an -"input error". The strto_* functions are more precise.

- -

There was general consensus that failbit should be set -upon overflow. We considered three options based on this:

-
    -
  1. Set failbit upon conversion error (including overflow), and - don't store any value.
  2. -
  3. Set failbit upon conversion error, and also set errno to - indicated the precise nature of the error.
  4. -
  5. Set failbit upon conversion error. If the error was due to - overflow, store +-numeric_limits<T>::max() as an - overflow indication.
  6. -
- -

Straw poll: (1) 5; (2) 0; (3) 8.

- - -

Discussed at Lillehammer. General outline of what we want the - solution to look like: we want to say that overflow is an error, and - provide a way to distinguish overflow from other kinds of errors. - Choose candidate field the same way scanf does, but don't describe - the rest of the process in terms of format. If a finite input field - is too large (positive or negative) to be represented as a finite - value, then set failbit and assign the nearest representable value. - Bill will provide wording.

- -

-Discussed at Toronto: -N2327 -is in alignment with the direction we wanted to go with in Lillehammer. Bill -to work on. -

- - - -

Proposed resolution:

- -

-Change 22.2.2.1.2 [facet.num.get.virtuals], end of p3: -

- -
-

-Stage 3: The result of stage 2 processing can be one of -The sequence of chars accumulated in stage 2 (the field) is -converted to a numeric value by the rules of one of the functions declared -in the header <cstdlib>: -

-
    -
  • -A sequence of chars has been accumulated in stage 2 that is -converted (according to the rules of scanf) to a value of the -type of val. This value is stored in val and ios_base::goodbit is -stored in err. -For a signed integer value, the function strtoll. -
  • -
  • -The sequence of chars accumulated in stage 2 would have caused -scanf to report an input failure. ios_base::failbit is -assigned to err. -For an unsigned integer value, the function strtoull. -
  • -
  • -For a floating-point value, the function strtold. -
  • -
-

-The numeric value to be stored can be one of: -

-
    -
  • zero, if the conversion function fails to convert the entire field. -ios_base::failbit is assigned to err.
  • -
  • the most positive representable value, if the field represents a value -too large positive to be represented in val. ios_base::failbit is assigned -to err.
  • -
  • the most negative representable value (zero for unsigned integer), if -the field represents a value too large negative to be represented in val. -ios_base::failbit is assigned to err.
  • -
  • the converted value, otherwise.
  • -
- -

-The resultant numeric value is stored in val. -

-
- -

-Change 22.2.2.1.2 [facet.num.get.virtuals], p6-p7: -

- -
-
iter_type do_get(iter_type in, iter_type end, ios_base& str, 
-                 ios_base::iostate& err, bool& val) const;
-
-
-

--6- Effects: If -(str.flags()&ios_base::boolalpha)==0 then input -proceeds as it would for a long except that if a value is being -stored into val, the value is determined according to the -following: If the value to be stored is 0 then false is stored. -If the value is 1 then true is stored. Otherwise -err|=ios_base::failbit is performed and no value true is -stored. and ios_base::failbit is assigned to err. -

-

--7- Otherwise target sequences are determined "as if" by calling the -members falsename() and truename() of the facet -obtained by use_facet<numpunct<charT> ->(str.getloc()). Successive characters in the range -[in,end) (see 23.1.1) are obtained and matched -against corresponding positions in the target sequences only as -necessary to identify a unique match. The input iterator in is -compared to end only when necessary to obtain a character. If and -only if a target sequence is uniquely matched, val is set to the -corresponding value. Otherwise false is stored and ios_base::failbit -is assigned to err. -

-
-
- - - - - -
-

96. Vector<bool> is not a container

-

Section: 23.2.5 [vector] Status: Open - Submitter: AFNOR Date: 1998-10-07

-

View all other issues in [vector].

-

View all issues with Open status.

-

Discussion:

-

vector<bool> is not a container as its reference and -pointer types are not references and pointers.

- -

Also it forces everyone to have a space optimization instead of a -speed one.

- -

See also: 99-0008 == N1185 Vector<bool> is -Nonconforming, Forces Optimization Choice.

- -

[In Santa Cruz the LWG felt that this was Not A Defect.]

- - -

[In Dublin many present felt that failure to meet Container -requirements was a defect. There was disagreement as to whether -or not the optimization requirements constituted a defect.]

- - -

[The LWG looked at the following resolutions in some detail: -
-     * Not A Defect.
-     * Add a note explaining that vector<bool> does not meet -Container requirements.
-     * Remove vector<bool>.
-     * Add a new category of container requirements which -vector<bool> would meet.
-     * Rename vector<bool>.
-
-No alternative had strong, wide-spread, support and every alternative -had at least one "over my dead body" response.
-
-There was also mention of a transition scheme something like (1) add -vector_bool and deprecate vector<bool> in the next standard. (2) -Remove vector<bool> in the following standard.]

- - -

[Modifying container requirements to permit returning proxies -(thus allowing container requirements conforming vector<bool>) -was also discussed.]

- - -

[It was also noted that there is a partial but ugly workaround in -that vector<bool> may be further specialized with a customer -allocator.]

- - -

[Kona: Herb Sutter presented his paper J16/99-0035==WG21/N1211, -vector<bool>: More Problems, Better Solutions. Much discussion -of a two step approach: a) deprecate, b) provide replacement under a -new name. LWG straw vote on that: 1-favor, 11-could live with, 2-over -my dead body. This resolution was mentioned in the LWG report to the -full committee, where several additional committee members indicated -over-my-dead-body positions.]

- - -

Discussed at Lillehammer. General agreement that we should - deprecate vector<bool> and introduce this functionality under - a different name, e.g. bit_vector. This might make it possible to - remove the vector<bool> specialization in the standard that comes - after C++0x. There was also a suggestion that - in C++0x we could additional say that it's implementation defined - whether vector<bool> refers to the specialization or to the - primary template, but there wasn't general agreement that this was a - good idea.

- -

We need a paper for the new bit_vector class.

- - - - -

Proposed resolution:

-

-We now have: -N2050 -and -N2160. -

- -

[ -Batavia: The LWG feels we need something closer to SGI's bitvector to ease migration -from vector<bool>. Although some of the funcitonality from -N2050 -could well be used in such a template. The concern is easing the API migration for those -users who want to continue using a bit-packed container. Alan and Beman to work. -]

- - - - - - -
-

255. Why do basic_streambuf<>::pbump() and gbump() take an int?

-

Section: 27.5.2 [streambuf] Status: Open - Submitter: Martin Sebor Date: 2000-08-12

-

View all other issues in [streambuf].

-

View all issues with Open status.

-

Discussion:

-

-The basic_streambuf members gbump() and pbump() are specified to take an -int argument. This requirement prevents the functions from effectively -manipulating buffers larger than std::numeric_limits<int>::max() -characters. It also makes the common use case for these functions -somewhat difficult as many compilers will issue a warning when an -argument of type larger than int (such as ptrdiff_t on LLP64 -architectures) is passed to either of the function. Since it's often the -result of the subtraction of two pointers that is passed to the -functions, a cast is necessary to silence such warnings. Finally, the -usage of a native type in the functions signatures is inconsistent with -other member functions (such as sgetn() and sputn()) that manipulate the -underlying character buffer. Those functions take a streamsize argument. -

- - -

Proposed resolution:

-

-Change the signatures of these functions in the synopsis of template -class basic_streambuf (27.5.2) and in their descriptions (27.5.2.3.1, p4 -and 27.5.2.3.2, p4) to take a streamsize argument. -

- -

-Although this change has the potential of changing the ABI of the -library, the change will affect only platforms where int is different -than the definition of streamsize. However, since both functions are -typically inline (they are on all known implementations), even on such -platforms the change will not affect any user code unless it explicitly -relies on the existing type of the functions (e.g., by taking their -address). Such a possibility is IMO quite remote. -

- -

-Alternate Suggestion from Howard Hinnant, c++std-lib-7780: -

- -

-This is something of a nit, but I'm wondering if streamoff wouldn't be a -better choice than streamsize. The argument to pbump and gbump MUST be -signed. But the standard has this to say about streamsize -(27.4.1/2/Footnote): -

- -

- [Footnote: streamsize is used in most places where ISO C would use - size_t. Most of the uses of streamsize could use size_t, except for - the strstreambuf constructors, which require negative values. It - should probably be the signed type corresponding to size_t (which is - what Posix.2 calls ssize_t). --- end footnote] -

- -

-This seems a little weak for the argument to pbump and gbump. Should we -ever really get rid of strstream, this footnote might go with it, along -with the reason to make streamsize signed. -

- - -

Rationale:

-

The LWG believes this change is too big for now. We may wish to -reconsider this for a future revision of the standard. One -possibility is overloading pbump, rather than changing the -signature.

-

[ -[2006-05-04: Reopened at the request of Chris (Krzysztof ?elechowski)] -]

- - - - - -
-

290. Requirements to for_each and its function object

-

Section: 25.1.1 [alg.foreach] Status: Open - Submitter: Angelika Langer Date: 2001-01-03

-

View all other issues in [alg.foreach].

-

View all issues with Open status.

-

Discussion:

-

The specification of the for_each algorithm does not have a -"Requires" section, which means that there are no -restrictions imposed on the function object whatsoever. In essence it -means that I can provide any function object with arbitrary side -effects and I can still expect a predictable result. In particular I -can expect that the function object is applied exactly last - first -times, which is promised in the "Complexity" section. -

- -

I don't see how any implementation can give such a guarantee -without imposing requirements on the function object. -

- -

Just as an example: consider a function object that removes -elements from the input sequence. In that case, what does the -complexity guarantee (applies f exactly last - first times) mean? -

- -

One can argue that this is obviously a nonsensical application and -a theoretical case, which unfortunately it isn't. I have seen -programmers shooting themselves in the foot this way, and they did not -understand that there are restrictions even if the description of the -algorithm does not say so. -

-

[Lillehammer: This is more general than for_each. We don't want - the function object in transform invalidiating iterators - either. There should be a note somewhere in clause 17 (17, not 25) - saying that user code operating on a range may not invalidate - iterators unless otherwise specified. Bill will provide wording.]

- - - -

Proposed resolution:

- - - - - - -
-

299. Incorrect return types for iterator dereference

-

Section: 24.1.4 [bidirectional.iterators], 24.1.5 [random.access.iterators] Status: Open - Submitter: John Potter Date: 2001-01-22

-

View all other issues in [bidirectional.iterators].

-

View all issues with Open status.

-

Discussion:

-

-In section 24.1.4 [bidirectional.iterators], -Table 75 gives the return type of *r-- as convertible to T. This is -not consistent with Table 74 which gives the return type of *r++ as -T&. *r++ = t is valid while *r-- = t is invalid. -

- -

-In section 24.1.5 [random.access.iterators], -Table 76 gives the return type of a[n] as convertible to T. This is -not consistent with the semantics of *(a + n) which returns T& by -Table 74. *(a + n) = t is valid while a[n] = t is invalid. -

- -

-Discussion from the Copenhagen meeting: the first part is -uncontroversial. The second part, operator[] for Random Access -Iterators, requires more thought. There are reasonable arguments on -both sides. Return by value from operator[] enables some potentially -useful iterators, e.g. a random access "iota iterator" (a.k.a -"counting iterator" or "int iterator"). There isn't any obvious way -to do this with return-by-reference, since the reference would be to a -temporary. On the other hand, reverse_iterator takes an -arbitrary Random Access Iterator as template argument, and its -operator[] returns by reference. If we decided that the return type -in Table 76 was correct, we would have to change -reverse_iterator. This change would probably affect user -code. -

- -

-History: the contradiction between reverse_iterator and the -Random Access Iterator requirements has been present from an early -stage. In both the STL proposal adopted by the committee -(N0527==94-0140) and the STL technical report (HPL-95-11 (R.1), by -Stepanov and Lee), the Random Access Iterator requirements say that -operator[]'s return value is "convertible to T". In N0527 -reverse_iterator's operator[] returns by value, but in HPL-95-11 -(R.1), and in the STL implementation that HP released to the public, -reverse_iterator's operator[] returns by reference. In 1995, the -standard was amended to reflect the contents of HPL-95-11 (R.1). The -original intent for operator[] is unclear. -

- -

-In the long term it may be desirable to add more fine-grained -iterator requirements, so that access method and traversal strategy -can be decoupled. (See "Improved Iterator Categories and -Requirements", N1297 = 01-0011, by Jeremy Siek.) Any decisions -about issue 299 should keep this possibility in mind. -

- -

Further discussion: I propose a compromise between John Potter's -resolution, which requires T& as the return type of -a[n], and the current wording, which requires convertible to -T. The compromise is to keep the convertible to T -for the return type of the expression a[n], but to also add -a[n] = t as a valid expression. This compromise "saves" the -common case uses of random access iterators, while at the same time -allowing iterators such as counting iterator and caching file -iterators to remain random access iterators (iterators where the -lifetime of the object returned by operator*() is tied to the -lifetime of the iterator). -

- -

-Note that the compromise resolution necessitates a change to -reverse_iterator. It would need to use a proxy to support -a[n] = t. -

- -

-Note also there is one kind of mutable random access iterator that -will no longer meet the new requirements. Currently, iterators that -return an r-value from operator[] meet the requirements for a -mutable random access iterartor, even though the expression a[n] = -t will only modify a temporary that goes away. With this proposed -resolution, a[n] = t will be required to have the same -operational semantics as *(a + n) = t. -

- - - -

Proposed resolution:

- -

-In section 24.1.4 [lib.bidirectdional.iterators], change the return -type in table 75 from "convertible to T" to -T&. -

- -

-In section 24.1.5 [lib.random.access.iterators], change the -operational semantics for a[n] to " the r-value of -a[n] is equivalent to the r-value of *(a + -n)". Add a new row in the table for the expression a[n] = t -with a return type of convertible to T and operational semantics of -*(a + n) = t. -

- -

[Lillehammer: Real problem, but should be addressed as part of - iterator redesign]

- - - - - - - - -
-

309. Does sentry catch exceptions?

-

Section: 27.6 [iostream.format] Status: Open - Submitter: Martin Sebor Date: 2001-03-19

-

View other active issues in [iostream.format].

-

View all other issues in [iostream.format].

-

View all issues with Open status.

-

Discussion:

-

-The descriptions of the constructors of basic_istream<>::sentry -(27.6.1.1.3 [istream::sentry]) and basic_ostream<>::sentry -(27.6.2.4 [ostream::sentry]) do not explain what the functions do in -case an exception is thrown while they execute. Some current -implementations allow all exceptions to propagate, others catch them -and set ios_base::badbit instead, still others catch some but let -others propagate. -

- -

-The text also mentions that the functions may call setstate(failbit) -(without actually saying on what object, but presumably the stream -argument is meant). That may have been fine for -basic_istream<>::sentry prior to issue 195, since -the function performs an input operation which may fail. However, -issue 195 amends 27.6.1.1.3 [istream::sentry], p2 to -clarify that the function should actually call setstate(failbit | -eofbit), so the sentence in p3 is redundant or even somewhat -contradictory. -

- -

-The same sentence that appears in 27.6.2.4 [ostream::sentry], p3 -doesn't seem to be very meaningful for basic_istream<>::sentry -which performs no input. It is actually rather misleading since it -would appear to guide library implementers to calling -setstate(failbit) when os.tie()->flush(), the only called function, -throws an exception (typically, it's badbit that's set in response to -such an event). -

- -

Additional comments from Martin, who isn't comfortable with the - current proposed resolution (see c++std-lib-11530)

- -

-The istream::sentry ctor says nothing about how the function -deals with exemptions (27.6.1.1.2, p1 says that the class is -responsible for doing "exception safe"(*) prefix and suffix -operations but it doesn't explain what level of exception -safety the class promises to provide). The mockup example -of a "typical implementation of the sentry ctor" given in -27.6.1.1.2, p6, removed in ISO/IEC 14882:2003, doesn't show -exception handling, either. Since the ctor is not classified -as a formatted or unformatted input function, the text in -27.6.1.1, p1 through p4 does not apply. All this would seem -to suggest that the sentry ctor should not catch or in any -way handle exceptions thrown from any functions it may call. -Thus, the typical implementation of an istream extractor may -look something like [1]. -

- -

-The problem with [1] is that while it correctly sets ios::badbit -if an exception is thrown from one of the functions called from -the sentry ctor, if the sentry ctor reaches EOF while extracting -whitespace from a stream that has eofbit or failbit set in -exceptions(), it will cause an ios::failure to be thrown, which -will in turn cause the extractor to set ios::badbit. -

- -

-The only straightforward way to prevent this behavior is to -move the definition of the sentry object in the extractor -above the try block (as suggested by the example in 22.2.8, -p9 and also indirectly supported by 27.6.1.3, p1). See [2]. -But such an implementation will allow exceptions thrown from -functions called from the ctor to freely propagate to the -caller regardless of the setting of ios::badbit in the stream -object's exceptions(). -

- -

-So since neither [1] nor [2] behaves as expected, the only -possible solution is to have the sentry ctor catch exceptions -thrown from called functions, set badbit, and propagate those -exceptions if badbit is also set in exceptions(). (Another -solution exists that deals with both kinds of sentries, but -the code is non-obvious and cumbersome -- see [3].) -

- -

-Please note that, as the issue points out, current libraries -do not behave consistently, suggesting that implementors are -not quite clear on the exception handling in istream::sentry, -despite the fact that some LWG members might feel otherwise. -(As documented by the parenthetical comment here: -http://anubis.dkuug.dk/jtc1/sc22/wg21/docs/papers/2003/n1480.html#309) -

- -

-Also please note that those LWG members who in Copenhagen -felt that "a sentry's constructor should not catch exceptions, -because sentries should only be used within (un)formatted input -functions and that exception handling is the responsibility of -those functions, not of the sentries," as noted here -http://anubis.dkuug.dk/jtc1/sc22/wg21/docs/papers/2001/n1310.html#309 -would in effect be either arguing for the behavior described -in [1] or for extractors implemented along the lines of [3]. -

- -

-The original proposed resolution (Revision 25 of the issues -list) clarifies the role of the sentry ctor WRT exception -handling by making it clear that extractors (both library -or user-defined) should be implemented along the lines of -[2] (as opposed to [1]) and that no exception thrown from -the callees should propagate out of either function unless -badbit is also set in exceptions(). -

- - -

[1] Extractor that catches exceptions thrown from sentry:

- -
-
struct S { long i; };
-
-istream& operator>> (istream &strm, S &s)
-{
-    ios::iostate err = ios::goodbit;
-    try {
-        const istream::sentry guard (strm, false);
-        if (guard) {
-            use_facet<num_get<char> >(strm.getloc ())
-                .get (istreambuf_iterator<char>(strm),
-                      istreambuf_iterator<char>(),
-                      strm, err, s.i);
-        }
-    }
-    catch (...) {
-        bool rethrow;
-        try {
-            strm.setstate (ios::badbit);
-            rethrow = false;
-        }
-        catch (...) {
-            rethrow = true;
-        }
-        if (rethrow)
-            throw;
-    }
-    if (err)
-        strm.setstate (err);
-    return strm;
-}
-
-
- -

[2] Extractor that propagates exceptions thrown from sentry:

- -
-
istream& operator>> (istream &strm, S &s)
-{
-    istream::sentry guard (strm, false);
-    if (guard) {
-        ios::iostate err = ios::goodbit;
-        try {
-            use_facet<num_get<char> >(strm.getloc ())
-                .get (istreambuf_iterator<char>(strm),
-                      istreambuf_iterator<char>(),
-                      strm, err, s.i);
-        }
-        catch (...) {
-            bool rethrow;
-            try {
-                strm.setstate (ios::badbit);
-                rethrow = false;
-            }
-            catch (...) {
-                rethrow = true;
-            }
-            if (rethrow)
-                throw;
-        }
-        if (err)
-            strm.setstate (err);
-    }
-    return strm;
-}
-
-
- -

-[3] Extractor that catches exceptions thrown from sentry -but doesn't set badbit if the exception was thrown as a -result of a call to strm.clear(). -

- -
-
istream& operator>> (istream &strm, S &s)
-{
-    const ios::iostate state = strm.rdstate ();
-    const ios::iostate except = strm.exceptions ();
-    ios::iostate err = std::ios::goodbit;
-    bool thrown = true;
-    try {
-        const istream::sentry guard (strm, false);
-        thrown = false;
-        if (guard) {
-            use_facet<num_get<char> >(strm.getloc ())
-                .get (istreambuf_iterator<char>(strm),
-                      istreambuf_iterator<char>(),
-                      strm, err, s.i);
-        }
-    }
-    catch (...) {
-        if (thrown && state & except)
-            throw;
-        try {
-            strm.setstate (ios::badbit);
-            thrown = false;
-        }
-        catch (...) {
-            thrown = true;
-        }
-        if (thrown)
-            throw;
-    }
-    if (err)
-        strm.setstate (err);
-
-    return strm;
-}
-
-
- -

-[Pre-Berlin] Reopened at the request of Paolo Carlini and Steve Clamage. -

- -

-[Pre-Portland] A relevant newsgroup post: -

- -

-The current proposed resolution of issue #309 -(http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#309) is -unacceptable. I write commerical software and coding around this -makes my code ugly, non-intuitive, and requires comments referring -people to this very issue. Following is the full explanation of my -experience. -

-

-In the course of writing software for commercial use, I constructed -std::ifstream's based on user-supplied pathnames on typical POSIX -systems. -

-

-It was expected that some files that opened successfully might not read -successfully -- such as a pathname which actually refered to a -directory. Intuitively, I expected the streambuffer underflow() code -to throw an exception in this situation, and recent implementations of -libstdc++'s basic_filebuf do just that (as well as many of my own -custom streambufs). -

-

-I also intuitively expected that the istream code would convert these -exceptions to the "badbit' set on the stream object, because I had not -requested exceptions. I refer to 27.6.1.1. P4. -

-

-However, this was not the case on at least two implementations -- if -the first thing I did with an istream was call operator>>( T& ) for T -among the basic arithmetic types and std::string. Looking further I -found that the sentry's constructor was invoking the exception when it -pre-scanned for whitespace, and the extractor function (operator>>()) -was not catching exceptions in this situation. -

-

-So, I was in a situation where setting 'noskipws' would change the -istream's behavior even though no characters (whitespace or not) could -ever be successfully read. -

-

-Also, calling .peek() on the istream before calling the extractor() -changed the behavior (.peek() had the effect of setting the badbit -ahead of time). -

-

-I found this all to be so inconsistent and inconvenient for me and my -code design, that I filed a bugzilla entry for libstdc++. I was then -told that the bug cannot be fixed until issue #309 is resolved by the -committee. -

- - - -

Proposed resolution:

- - -

Rationale:

-

The LWG agrees there is minor variation between implementations, - but believes that it doesn't matter. This is a rarely used corner - case. There is no evidence that this has any commercial importance - or that it causes actual portability problems for customers trying - to write code that runs on multiple implementations.

- - - - - -
-

342. seek and eofbit

-

Section: 27.6.1.3 [istream.unformatted] Status: Open - Submitter: Howard Hinnant Date: 2001-10-09

-

View all other issues in [istream.unformatted].

-

View all issues with Open status.

-

Discussion:

-

I think we have a defect.

- -

According to lwg issue 60 which is now a dr, the -description of seekg in 27.6.1.3 [istream.unformatted] paragraph 38 now looks -like:

- -

-Behaves as an unformatted input function (as described in 27.6.1.3, -paragraph 1), except that it does not count the number of characters -extracted and does not affect the value returned by subsequent calls to -gcount(). After constructing a sentry object, if fail() != true, -executes rdbuf()->pubseekpos( pos). -

- -

And according to lwg issue 243 which is also now a dr, -27.6.1.3, paragraph 1 looks like:

- -

-Each unformatted input function begins execution by constructing an -object of class sentry with the default argument noskipws (second) -argument true. If the sentry object returns true, when converted to a -value of type bool, the function endeavors to obtain the requested -input. Otherwise, if the sentry constructor exits by throwing an -exception or if the sentry object returns false, when converted to a -value of type bool, the function returns without attempting to obtain -any input. In either case the number of extracted characters is set to -0; unformatted input functions taking a character array of non-zero -size as an argument shall also store a null character (using charT()) -in the first location of the array. If an exception is thrown during -input then ios::badbit is turned on in *this'ss error state. If -(exception()&badbit)!= 0 then the exception is rethrown. It also counts -the number of characters extracted. If no exception has been thrown it -ends by storing the count in a member object and returning the value -specified. In any event the sentry object is destroyed before leaving -the unformatted input function. -

- -

And finally 27.6.1.1.2/5 says this about sentry:

- -

-If, after any preparation is completed, is.good() is true, ok_ != false -otherwise, ok_ == false. -

- -

-So although the seekg paragraph says that the operation proceeds if -!fail(), the behavior of unformatted functions says the operation -proceeds only if good(). The two statements are contradictory when only -eofbit is set. I don't think the current text is clear which condition -should be respected. -

- -

Further discussion from Redmond:

- -

PJP: It doesn't seem quite right to say that seekg is -"unformatted". That makes specific claims about sentry that -aren't quite appropriate for seeking, which has less fragile failure -modes than actual input. If we do really mean that it's unformatted -input, it should behave the same way as other unformatted input. On -the other hand, "principle of least surprise" is that seeking from EOF -ought to be OK.

- -

-Pre-Berlin: Paolo points out several problems with the proposed resolution in -Ready state: -

- -
    -
  • It should apply to both overloads of seekg.
  • -
  • tellg has similar issues, except that it should not call clear().
  • -
  • The point about clear() seems to apply to seekp().
  • -
  • Depending on the outcome of 419 -if the sentry -sets failbit when it finds eofbit already set, then -you can never seek away from the end of stream.
  • -
- - - -

Proposed resolution:

- -

Change 27.6.1.3 [istream.unformatted] to:

-

-Behaves as an unformatted input function (as described in 27.6.1.3, -paragraph 1), except that it does not count the number of characters -extracted, does not affect the value returned by subsequent calls to -gcount(), and does not examine the value returned by the sentry -object. After constructing a sentry object, if fail() != -true, executes rdbuf()->pubseekpos(pos). In -case of success, the function calls clear(). -In case of failure, the function calls setstate(failbit) -(which may throw ios_base::failure). -

- -

[Lillehammer: Matt provided wording.]

- - - - -

Rationale:

-

In C, fseek does clear EOF. This is probably what most users would - expect. We agree that having eofbit set should not deter a seek, - and that a successful seek should clear eofbit. Note - that fail() is true only if failbit - or badbit is set, so using !fail(), rather - than good(), satisfies this goal.

- - - - - -
-

343. Unspecified library header dependencies

-

Section: 21 [strings], 23 [containers], 27 [input.output] Status: Open - Submitter: Martin Sebor Date: 2001-10-09

-

View all other issues in [strings].

-

View all issues with Open status.

-

Discussion:

-

-The synopses of the C++ library headers clearly show which names are -required to be defined in each header. Since in order to implement the -classes and templates defined in these headers declarations of other -templates (but not necessarily their definitions) are typically -necessary the standard in 17.4.4, p1 permits library implementers to -include any headers needed to implement the definitions in each header. -

- -

-For instance, although it is not explicitly specified in the synopsis of -<string>, at the point of definition of the std::basic_string template -the declaration of the std::allocator template must be in scope. All -current implementations simply include <memory> from within <string>, -either directly or indirectly, to bring the declaration of -std::allocator into scope. -

- -

-Additionally, however, some implementation also include <istream> and -<ostream> at the top of <string> to bring the declarations of -std::basic_istream and std::basic_ostream into scope (which are needed -in order to implement the string inserter and extractor operators -(21.3.7.9 [lib.string.io])). Other implementations only include -<iosfwd>, since strictly speaking, only the declarations and not the -full definitions are necessary. -

- -

-Obviously, it is possible to implement <string> without actually -providing the full definitions of all the templates std::basic_string -uses (std::allocator, std::basic_istream, and std::basic_ostream). -Furthermore, not only is it possible, doing so is likely to have a -positive effect on compile-time efficiency. -

- -

-But while it may seem perfectly reasonable to expect a program that uses -the std::basic_string insertion and extraction operators to also -explicitly include <istream> or <ostream>, respectively, it doesn't seem -reasonable to also expect it to explicitly include <memory>. Since -what's reasonable and what isn't is highly subjective one would expect -the standard to specify what can and what cannot be assumed. -Unfortunately, that isn't the case. -

- -

The examples below demonstrate the issue.

- -

Example 1:

- -

It is not clear whether the following program is complete:

- -
#include <string>
-
-extern std::basic_ostream<char> &strm;
-
-int main () {
-    strm << std::string ("Hello, World!\n");
-}
-
- -

or whether one must explicitly include <memory> or -<ostream> (or both) in addition to <string> in order for -the program to compile.

- - -

Example 2:

- -

Similarly, it is unclear whether the following program is complete:

- -
#include <istream>
-
-extern std::basic_iostream<char> &strm;
-
-int main () {
-    strm << "Hello, World!\n";
-}
-
- -

-or whether one needs to explicitly include <ostream>, and -perhaps even other headers containing the definitions of other -required templates:

- -
#include <ios>
-#include <istream>
-#include <ostream>
-#include <streambuf>
-
-extern std::basic_iostream<char> &strm;
-
-int main () {
-    strm << "Hello, World!\n";
-}
-
- -

Example 3:

- -

Likewise, it seems unclear whether the program below is complete:

-
#include <iterator>
-
-bool foo (std::istream_iterator<int> a, std::istream_iterator<int> b)
-{
-    return a == b;
-}
-
-int main () { }
-
- -

or whether one should be required to include <istream>.

- -

There are many more examples that demonstrate this lack of a -requirement. I believe that in a good number of cases it would be -unreasonable to require that a program explicitly include all the -headers necessary for a particular template to be specialized, but I -think that there are cases such as some of those above where it would -be desirable to allow implementations to include only as much as -necessary and not more.

- - -

Proposed resolution:

-

-For every C++ library header, supply a minimum set of other C++ library -headers that are required to be included by that header. The proposed -list is below (C++ headers for C Library Facilities, table 12 in -17.4.1.2, p3, are omitted): -

- -
+------------+--------------------+
-| C++ header |required to include |
-+============+====================+
-|<algorithm> |                    |
-+------------+--------------------+
-|<bitset>    |                    |
-+------------+--------------------+
-|<complex>   |                    |
-+------------+--------------------+
-|<deque>     |<memory>            |
-+------------+--------------------+
-|<exception> |                    |
-+------------+--------------------+
-|<fstream>   |<ios>               |
-+------------+--------------------+
-|<functional>|                    |
-+------------+--------------------+
-|<iomanip>   |<ios>               |
-+------------+--------------------+
-|<ios>       |<streambuf>         |
-+------------+--------------------+
-|<iosfwd>    |                    |
-+------------+--------------------+
-|<iostream>  |<istream>, <ostream>|
-+------------+--------------------+
-|<istream>   |<ios>               |
-+------------+--------------------+
-|<iterator>  |                    |
-+------------+--------------------+
-|<limits>    |                    |
-+------------+--------------------+
-|<list>      |<memory>            |
-+------------+--------------------+
-|<locale>    |                    |
-+------------+--------------------+
-|<map>       |<memory>            |
-+------------+--------------------+
-|<memory>    |                    |
-+------------+--------------------+
-|<new>       |<exception>         |
-+------------+--------------------+
-|<numeric>   |                    |
-+------------+--------------------+
-|<ostream>   |<ios>               |
-+------------+--------------------+
-|<queue>     |<deque>             |
-+------------+--------------------+
-|<set>       |<memory>            |
-+------------+--------------------+
-|<sstream>   |<ios>, <string>     |
-+------------+--------------------+
-|<stack>     |<deque>             |
-+------------+--------------------+
-|<stdexcept> |                    |
-+------------+--------------------+
-|<streambuf> |<ios>               |
-+------------+--------------------+
-|<string>    |<memory>            |
-+------------+--------------------+
-|<strstream> |                    |
-+------------+--------------------+
-|<typeinfo>  |<exception>         |
-+------------+--------------------+
-|<utility>   |                    |
-+------------+--------------------+
-|<valarray>  |                    |
-+------------+--------------------+
-|<vector>    |<memory>            |
-+------------+--------------------+
-
- - -

Rationale:

-

The portability problem is real. A program that works correctly on -one implementation might fail on another, because of different header -dependencies. This problem was understood before the standard was -completed, and it was a conscious design choice.

-

One possible way to deal with this, as a library extension, would -be an <all> header.

- -

-Hinnant: It's time we dealt with this issue for C++0X. Reopened. -

- - - - - - - -
-

382. codecvt do_in/out result

-

Section: 22.2.1.4 [locale.codecvt] Status: Open - Submitter: Martin Sebor Date: 2002-08-30

-

View all other issues in [locale.codecvt].

-

View all issues with Open status.

-

Discussion:

-

-It seems that the descriptions of codecvt do_in() and do_out() leave -sufficient room for interpretation so that two implementations of -codecvt may not work correctly with the same filebuf. Specifically, -the following seems less than adequately specified: -

- -
    -
  1. - the conditions under which the functions terminate -
  2. -
  3. - precisely when the functions return ok -
  4. -
  5. - precisely when the functions return partial -
  6. -
  7. - the full set of conditions when the functions return error -
  8. -
- -
    -
  1. - 22.2.1.4.2 [locale.codecvt.virtuals], p2 says this about the effects of the - function: ...Stops if it encounters a character it cannot - convert... This assumes that there *is* a character to - convert. What happens when there is a sequence that doesn't form a - valid source character, such as an unassigned or invalid UNICODE - character, or a sequence that cannot possibly form a character - (e.g., the sequence "\xc0\xff" in UTF-8)? -
  2. -
  3. - Table 53 says that the function returns codecvt_base::ok - to indicate that the function(s) "completed the conversion." - Suppose that the source sequence is "\xc0\x80" in UTF-8, - with from pointing to '\xc0' and (from_end==from + 1). - It is not clear whether the return value should be ok - or partial (see below). -
  4. -
  5. - Table 53 says that the function returns codecvt_base::partial - if "not all source characters converted." With the from pointers - set up the same way as above, it is not clear whether the return - value should be partial or ok (see above). -
  6. -
  7. - Table 53, in the row describing the meaning of error mistakenly - refers to a "from_type" character, without the symbol from_type - having been defined. Most likely, the word "source" character - is intended, although that is not sufficient. The functions - may also fail when they encounter an invalid source sequence - that cannot possibly form a valid source character (e.g., as - explained in bullet 1 above). -
  8. -
-

-Finally, the conditions described at the end of 22.2.1.4.2 [locale.codecvt.virtuals], p4 don't seem to be possible: -

-

- "A return value of partial, if (from_next == from_end), - indicates that either the destination sequence has not - absorbed all the available destination elements, or that - additional source elements are needed before another - destination element can be produced." -

-

-If the value is partial, it's not clear to me that (from_next -==from_end) could ever hold if there isn't enough room -in the destination buffer. In order for (from_next==from_end) to -hold, all characters in that range must have been successfully -converted (according to 22.2.1.4.2 [locale.codecvt.virtuals], p2) and since there are no -further source characters to convert, no more room in the -destination buffer can be needed. -

-

-It's also not clear to me that (from_next==from_end) could ever -hold if additional source elements are needed to produce another -destination character (not element as incorrectly stated in the -text). partial is returned if "not all source characters have -been converted" according to Table 53, which also implies that -(from_next==from) does NOT hold. -

-

-Could it be that the intended qualifying condition was actually -(from_next != from_end), i.e., that the sentence was supposed -to read -

-

- "A return value of partial, if (from_next != from_end),..." -

-

-which would make perfect sense, since, as far as I understand it, -partial can only occur if (from_next != from_end)? -

-

[Lillehammer: Defer for the moment, but this really needs to be - fixed. Right now, the description of codecvt is too vague for it to - be a useful contract between providers and clients of codecvt - facets. (Note that both vendors and users can be both providers and - clients of codecvt facets.) The major philosophical issue is whether - the standard should only describe mappings that take a single wide - character to multiple narrow characters (and vice versa), or whether - it should describe fully general N-to-M conversions. When the - original standard was written only the former was contemplated, but - today, in light of the popularity of utf8 and utf16, that doesn't - seem sufficient for C++0x. Bill supports general N-to-M conversions; - we need to make sure Martin and Howard agree.]

- - - -

Proposed resolution:

- - - - -
-

387. std::complex over-encapsulated

-

Section: 26.3 [complex.numbers] Status: Open - Submitter: Gabriel Dos Reis Date: 2002-11-08

-

View all other issues in [complex.numbers].

-

View all issues with Open status.

-

Discussion:

-

-The absence of explicit description of std::complex<T> layout -makes it imposible to reuse existing software developed in traditional -languages like Fortran or C with unambigous and commonly accepted -layout assumptions. There ought to be a way for practitioners to -predict with confidence the layout of std::complex<T> whenever T -is a numerical datatype. The absence of ways to access individual -parts of a std::complex<T> object as lvalues unduly promotes -severe pessimizations. For example, the only way to change, -independently, the real and imaginary parts is to write something like -

- -
complex<T> z;
-// ...
-// set the real part to r
-z = complex<T>(r, z.imag());
-// ...
-// set the imaginary part to i
-z = complex<T>(z.real(), i);
-
- -

-At this point, it seems appropriate to recall that a complex number -is, in effect, just a pair of numbers with no particular invariant to -maintain. Existing practice in numerical computations has it that a -complex number datatype is usually represented by Cartesian -coordinates. Therefore the over-encapsulation put in the specification -of std::complex<> is not justified. -

- - - -

Proposed resolution:

-

Add the following requirements to 26.3 [complex.numbers] as 26.3/4:

-
-

If z is an lvalue expression of type cv std::complex<T> then

- -
    -
  • the expression reinterpret_cast<cv T(&)[2]>(z) -is well-formed; and
  • -
  • reinterpret_cast<cvT(&)[2]>(z)[0]designates the -real part of z; and
  • -
  • reinterpret_cast<cvT(&)[2]>(z)[1]designates the -imaginary part of z.
  • -
- -

-Moreover, if a is an expression of pointer type cv complex<T>* -and the expression a[i] is well-defined for an integer expression -i then: -

- -
    -
  • reinterpret_cast<cvT*>(a)[2+i] designates the real -part of a[i]; and
  • -
  • reinterpret_cast<cv T*>(a)[2+i+1] designates the -imaginary part of a[i].
  • -
-
- -

In the header synopsis in 26.3.1 [complex.synopsis], replace

-
  template<class T> T real(const complex<T>&);
-  template<class T> T imag(const complex<T>&);
-
- -

with

- -
  template<class T> const T& real(const complex<T>&);
-  template<class T>       T& real(      complex<T>&);
-  template<class T> const T& imag(const complex<T>&);
-  template<class T>       T& imag(      complex<T>&);
-
- -

In 26.3.7 [complex.value.ops] paragraph 1, change

-
  template<class T> T real(const complex<T>&);
-
-

to

-
  template<class T> const T& real(const complex<T>&);
-  template<class T>       T& real(      complex<T>&);
-
-

and change the Returns clause to "Returns: The real -part of x.

- -

In 26.3.7 [complex.value.ops] paragraph 2, change

-
  template<class T> T imag(const complex<T>&);
-
-

to

-
  template<class T> const T& imag(const complex<T>&);
-  template<class T>       T& imag(      complex<T>&);
-
-

and change the Returns clause to "Returns: The imaginary -part of x.

- -

[Kona: The layout guarantee is absolutely necessary for C - compatibility. However, there was disagreement about the other part - of this proposal: retrieving elements of the complex number as - lvalues. An alternative: continue to have real() and imag() return - rvalues, but add set_real() and set_imag(). Straw poll: return - lvalues - 2, add setter functions - 5. Related issue: do we want - reinterpret_cast as the interface for converting a complex to an - array of two reals, or do we want to provide a more explicit way of - doing it? Howard will try to resolve this issue for the next - meeting.]

- - -

[pre-Sydney: Howard summarized the options in n1589.]

- - - - -

Rationale:

-

The LWG believes that C99 compatibility would be enough -justification for this change even without other considerations. All -existing implementations already have the layout proposed here.

- - - - - -
-

394. behavior of formatted output on failure

-

Section: 27.6.2.6.1 [ostream.formatted.reqmts] Status: Open - Submitter: Martin Sebor Date: 2002-12-27

-

View all issues with Open status.

-

Discussion:

-

-There is a contradiction in Formatted output about what bit is -supposed to be set if the formatting fails. On sentence says it's -badbit and another that it's failbit. -

-

-27.6.2.5.1, p1 says in the Common Requirements on Formatted output -functions: -

-
     ... If the generation fails, then the formatted output function
-     does setstate(ios::failbit), which might throw an exception.
-
-

-27.6.2.5.2, p1 goes on to say this about Arithmetic Inserters: -

-

- ... The formatting conversion occurs as if it performed the - following code fragment: -

-
     bool failed =
-         use_facet<num_put<charT,ostreambuf_iterator<charT,traits>
-         > >
-         (getloc()).put(*this, *this, fill(), val). failed();
-
-     ... If failed is true then does setstate(badbit) ...
-
-

-The original intent of the text, according to Jerry Schwarz (see -c++std-lib-10500), is captured in the following paragraph: -

-

-In general "badbit" should mean that the stream is unusable because -of some underlying failure, such as disk full or socket closure; -"failbit" should mean that the requested formatting wasn't possible -because of some inconsistency such as negative widths. So typically -if you clear badbit and try to output something else you'll fail -again, but if you clear failbit and try to output something else -you'll succeed. -

-

-In the case of the arithmetic inserters, since num_put cannot -report failure by any means other than exceptions (in response -to which the stream must set badbit, which prevents the kind of -recoverable error reporting mentioned above), the only other -detectable failure is if the iterator returned from num_put -returns true from failed(). -

-

-Since that can only happen (at least with the required iostream -specializations) under such conditions as the underlying failure -referred to above (e.g., disk full), setting badbit would seem -to be the appropriate response (indeed, it is required in -27.6.2.5.2, p1). It follows that failbit can never be directly -set by the arithmetic (it can only be set by the sentry object -under some unspecified conditions). -

-

-The situation is different for other formatted output functions -which can fail as a result of the streambuf functions failing -(they may do so by means other than exceptions), and which are -then required to set failbit. -

-

-The contradiction, then, is that ostream::operator<<(int) will -set badbit if the disk is full, while operator<<(ostream&, -char) will set failbit under the same conditions. To make the behavior -consistent, the Common requirements sections for the Formatted output -functions should be changed as proposed below. -

-

[Kona: There's agreement that this is a real issue. What we - decided at Kona: 1. An error from the buffer (which can be detected - either directly from streambuf's member functions or by examining a - streambuf_iterator) should always result in badbit getting set. - 2. There should never be a circumstance where failbit gets set. - That represents a formatting error, and there are no circumstances - under which the output facets are specified as signaling a - formatting error. (Even more so for string output that for numeric - because there's nothing to format.) If we ever decide to make it - possible for formatting errors to exist then the facets can signal - the error directly, and that should go in clause 22, not clause 27. - 3. The phrase "if generation fails" is unclear and should be - eliminated. It's not clear whether it's intended to mean a buffer - error (e.g. a full disk), a formatting error, or something else. - Most people thought it was supposed to refer to buffer errors; if - so, we should say so. Martin will provide wording.]

- - - - -

Proposed resolution:

- - -

Rationale:

- - - - - - -
-

396. what are characters zero and one

-

Section: 23.3.5.1 [bitset.cons] Status: Open - Submitter: Martin Sebor Date: 2003-01-05

-

View all other issues in [bitset.cons].

-

View all issues with Open status.

-

Discussion:

-

-23.3.5.1, p6 [lib.bitset.cons] talks about a generic character -having the value of 0 or 1 but there is no definition of what -that means for charT other than char and wchar_t. And even for -those two types, the values 0 and 1 are not actually what is -intended -- the values '0' and '1' are. This, along with the -converse problem in the description of to_string() in 23.3.5.2, -p33, looks like a defect remotely related to DR 303. -

-

-http://anubis.dkuug.dk/jtc1/sc22/wg21/docs/lwg-defects.html#303 -

-
23.3.5.1:
-  -6-  An element of the constructed string has value zero if the
-       corresponding character in str, beginning at position pos,
-       is 0. Otherwise, the element has the value one.
-    
-
23.3.5.2:
-  -33-  Effects: Constructs a string object of the appropriate
-        type and initializes it to a string of length N characters.
-        Each character is determined by the value of its
-        corresponding bit position in *this. Character position N
-        ?- 1 corresponds to bit position zero. Subsequent decreasing
-        character positions correspond to increasing bit positions.
-        Bit value zero becomes the character 0, bit value one becomes
-        the character 1.
-    
-

-Also note the typo in 23.3.5.1, p6: the object under construction -is a bitset, not a string. -

- - -

Proposed resolution:

-

Change the constructor's function declaration immediately before -23.3.5.1 [bitset.cons] p3 to:

-
    template <class charT, class traits, class Allocator>
-    explicit
-    bitset(const basic_string<charT, traits, Allocator>& str,
-           typename basic_string<charT, traits, Allocator>::size_type pos = 0,
-           typename basic_string<charT, traits, Allocator>::size_type n =
-             basic_string<charT, traits, Allocator>::npos,
-           charT zero = charT('0'), charT one = charT('1'))
-
-

Change the first two sentences of 23.3.5.1 [bitset.cons] p6 to: "An -element of the constructed string has value 0 if the corresponding -character in str, beginning at position pos, -is zero. Otherwise, the element has the value 1.

- -

Change the text of the second sentence in 23.3.5.1, p5 to read: - "The function then throws invalid_argument if any of the rlen - characters in str beginning at position pos is other than zero - or one. The function uses traits::eq() to compare the character - values." -

- -

Change the declaration of the to_string member function - immediately before 23.3.5.2 [bitset.members] p33 to:

-
    template <class charT, class traits, class Allocator>
-    basic_string<charT, traits, Allocator> 
-    to_string(charT zero = charT('0'), charT one = charT('1')) const;
-
-

Change the last sentence of 23.3.5.2 [bitset.members] p33 to: "Bit - value 0 becomes the character zero, bit value 1 becomes the - character one.

-

Change 23.3.5.3 [bitset.operators] p8 to:

-

Returns:

-
  os << x.template to_string<charT,traits,allocator<charT> >(
-      use_facet<ctype<charT> >(os.getloc()).widen('0'),
-      use_facet<ctype<charT> >(os.getloc()).widen('1'));
-
- - -

Rationale:

-

There is a real problem here: we need the character values of '0' - and '1', and we have no way to get them since strings don't have - imbued locales. In principle the "right" solution would be to - provide an extra object, either a ctype facet or a full locale, - which would be used to widen '0' and '1'. However, there was some - discomfort about using such a heavyweight mechanism. The proposed - resolution allows those users who care about this issue to get it - right.

-

We fix the inserter to use the new arguments. Note that we already - fixed the analogous problem with the extractor in issue 303.

- - - - - - -
-

397. ostream::sentry dtor throws exceptions

-

Section: 27.6.2.4 [ostream::sentry] Status: Open - Submitter: Martin Sebor Date: 2003-01-05

-

View other active issues in [ostream::sentry].

-

View all other issues in [ostream::sentry].

-

View all issues with Open status.

-

Discussion:

-

-17.4.4.8, p3 prohibits library dtors from throwing exceptions. -

-

-27.6.2.3, p4 says this about the ostream::sentry dtor: -

-
    -4- If ((os.flags() & ios_base::unitbuf) && !uncaught_exception())
-        is true, calls os.flush().
-    
-

-27.6.2.6, p7 that describes ostream::flush() says: -

-
    -7- If rdbuf() is not a null pointer, calls rdbuf()->pubsync().
-        If that function returns ?-1 calls setstate(badbit) (which
-        may throw ios_base::failure (27.4.4.3)).
-    
-

-That seems like a defect, since both pubsync() and setstate() can -throw an exception. -

-

[ -The contradiction is real. Clause 17 says destructors may never -throw exceptions, and clause 27 specifies a destructor that does -throw. In principle we might change either one. We're leaning -toward changing clause 17: putting in an "unless otherwise specified" -clause, and then putting in a footnote saying the sentry destructor -is the only one that can throw. PJP suggests specifying that -sentry::~sentry() should internally catch any exceptions it might cause. -]

- - -

[ -See 418 and 622 for related issues. -]

- - - - -

Proposed resolution:

- - - - - -
-

398. effects of end-of-file on unformatted input functions

-

Section: 27.6.2.4 [ostream::sentry] Status: Open - Submitter: Martin Sebor Date: 2003-01-05

-

View other active issues in [ostream::sentry].

-

View all other issues in [ostream::sentry].

-

View all issues with Open status.

-

Discussion:

-

-While reviewing unformatted input member functions of istream -for their behavior when they encounter end-of-file during input -I found that the requirements vary, sometimes unexpectedly, and -in more than one case even contradict established practice (GNU -libstdc++ 3.2, IBM VAC++ 6.0, STLPort 4.5, SunPro 5.3, HP aCC -5.38, Rogue Wave libstd 3.1, and Classic Iostreams). -

-

-The following unformatted input member functions set eofbit if they -encounter an end-of-file (this is the expected behavior, and also -the behavior of all major implementations): -

-
    basic_istream<charT, traits>&
-    get (char_type*, streamsize, char_type);
-    
-

- Also sets failbit if it fails to extract any characters. -

-
    basic_istream<charT, traits>&
-    get (char_type*, streamsize);
-    
-

- Also sets failbit if it fails to extract any characters. -

-
    basic_istream<charT, traits>&
-    getline (char_type*, streamsize, char_type);
-    
-

- Also sets failbit if it fails to extract any characters. -

-
    basic_istream<charT, traits>&
-    getline (char_type*, streamsize);
-    
-

- Also sets failbit if it fails to extract any characters. -

-
    basic_istream<charT, traits>&
-    ignore (int, int_type);
-    
-
    basic_istream<charT, traits>&
-    read (char_type*, streamsize);
-    
-

- Also sets failbit if it encounters end-of-file. -

-
    streamsize readsome (char_type*, streamsize);
-    
- -

-The following unformated input member functions set failbit but -not eofbit if they encounter an end-of-file (I find this odd -since the functions make it impossible to distinguish a general -failure from a failure due to end-of-file; the requirement is -also in conflict with all major implementation which set both -eofbit and failbit): -

-
    int_type get();
-    
-
    basic_istream<charT, traits>&
-    get (char_type&);
-    
-

-These functions only set failbit of they extract no characters, -otherwise they don't set any bits, even on failure (I find this -inconsistency quite unexpected; the requirement is also in -conflict with all major implementations which set eofbit -whenever they encounter end-of-file): -

-
    basic_istream<charT, traits>&
-    get (basic_streambuf<charT, traits>&, char_type);
-    
-
    basic_istream<charT, traits>&
-    get (basic_streambuf<charT, traits>&);
-    
-

-This function sets no bits (all implementations except for -STLport and Classic Iostreams set eofbit when they encounter -end-of-file): -

-
    int_type peek ();
-    
-

Informally, what we want is a global statement of intent saying - that eofbit gets set if we trip across EOF, and then we can take - away the specific wording for individual functions. A full review - is necessary. The wording currently in the standard is a mishmash, - and changing it on an individual basis wouldn't make things better. - Dietmar will do this work.

- - -

Proposed resolution:

- - - - -
-

408. Is vector<reverse_iterator<char*> > forbidden?

-

Section: 24.1 [iterator.requirements] Status: Open - Submitter: Nathan Myers Date: 2003-06-03

-

View other active issues in [iterator.requirements].

-

View all other issues in [iterator.requirements].

-

View all issues with Open status.

-

Discussion:

-

-I've been discussing iterator semantics with Dave Abrahams, and a -surprise has popped up. I don't think this has been discussed before. -

- -

-24.1 [iterator.requirements] says that the only operation that can be performed on "singular" -iterator values is to assign a non-singular value to them. (It -doesn't say they can be destroyed, and that's probably a defect.) -Some implementations have taken this to imply that there is no need -to initialize the data member of a reverse_iterator<> in the default -constructor. As a result, code like -

-
  std::vector<std::reverse_iterator<char*> > v(7);
-  v.reserve(1000);
-
-

-invokes undefined behavior, because it must default-initialize the -vector elements, and then copy them to other storage. Of course many -other vector operations on these adapters are also left undefined, -and which those are is not reliably deducible from the standard. -

- -

-I don't think that 24.1 was meant to make standard-library iterator -types unsafe. Rather, it was meant to restrict what operations may -be performed by functions which take general user- and standard -iterators as arguments, so that raw pointers would qualify as -iterators. However, this is not clear in the text, others have come -to the opposite conclusion. -

- -

-One question is whether the standard iterator adaptors have defined -copy semantics. Another is whether they have defined destructor -semantics: is -

-
  { std::vector<std::reverse_iterator<char*> >  v(7); }
-
-

-undefined too? -

- -

-Note this is not a question of whether algorithms are allowed to -rely on copy semantics for arbitrary iterators, just whether the -types we actually supply support those operations. I believe the -resolution must be expressed in terms of the semantics of the -adapter's argument type. It should make clear that, e.g., the -reverse_iterator<T> constructor is actually required to execute -T(), and so copying is defined if the result of T() is copyable. -

- -

-Issue 235, which defines reverse_iterator's default -constructor more precisely, has some relevance to this issue. -However, it is not the whole story. -

- -

-The issue was whether -

-
  reverse_iterator() { }
-
-

-is allowed, vs. -

-
  reverse_iterator() : current() { }
-
- -

-The difference is when T is char*, where the first leaves the member -uninitialized, and possibly equal to an existing pointer value, or -(on some targets) may result in a hardware trap when copied. -

- -

-8.5 paragraph 5 seems to make clear that the second is required to -satisfy DR 235, at least for non-class Iterator argument -types. -

- -

-But that only takes care of reverse_iterator, and doesn't establish -a policy for all iterators. (The reverse iterator adapter was just -an example.) In particular, does my function -

-
  template <typename Iterator>
-    void f() { std::vector<Iterator>  v(7); } 
-
-

-evoke undefined behavior for some conforming iterator definitions? -I think it does, now, because vector<> will destroy those singular -iterator values, and that's explicitly disallowed. -

- -

-24.1 shouldn't give blanket permission to copy all singular iterators, -because then pointers wouldn't qualify as iterators. However, it -should allow copying of that subset of singular iterator values that -are default-initialized, and it should explicitly allow destroying any -iterator value, singular or not, default-initialized or not. -

- -

Related issue: 407

-

[ -We don't want to require all singular iterators to be copyable, -because that is not the case for pointers. However, default -construction may be a special case. Issue: is it really default -construction we want to talk about, or is it something like value -initialization? We need to check with core to see whether default -constructed pointers are required to be copyable; if not, it would be -wrong to impose so strict a requirement for iterators. -]

- - - - -

Proposed resolution:

- - - - - -
-

417. what does ctype::do_widen() return on failure

-

Section: 22.2.1.1.2 [locale.ctype.virtuals] Status: Open - Submitter: Martin Sebor Date: 2003-09-18

-

View all other issues in [locale.ctype.virtuals].

-

View all issues with Open status.

-

Discussion:

-

-The Effects and Returns clauses of the do_widen() member function of -the ctype facet fail to specify the behavior of the function on failure. -That the function may not be able to simply cast the narrow character -argument to the type of the result since doing so may yield the wrong value -for some wchar_t encodings. Popular implementations of ctype<wchar_t> that -use mbtowc() and UTF-8 as the native encoding (e.g., GNU glibc) will fail -when the argument's MSB is set. There is no way for the the rest of locale -and iostream to reliably detect this failure. -

-

[Kona: This is a real problem. Widening can fail. It's unclear - what the solution should be. Returning WEOF works for the wchar_t - specialization, but not in general. One option might be to add a - default, like narrow. But that's an incompatible change. - Using traits::eof might seem like a good idea, but facets - don't have access to traits (a recurring problem). We could - have widen throw an exception, but that's a scary option; - existing library components aren't written with the assumption - that widen can throw.]

- - - -

Proposed resolution:

- - - - -
-

418. exceptions thrown during iostream cleanup

-

Section: 27.4.2.1.6 [ios::Init] Status: Open - Submitter: Martin Sebor Date: 2003-09-18

-

View all issues with Open status.

-

Discussion:

-

-The dtor of the ios_base::Init object is supposed to call flush() on the -6 standard iostream objects cout, cerr, clog, wcout, wcerr, and wclog. -This call may cause an exception to be thrown. -

- -

-17.4.4.8, p3 prohibits all library destructors from throwing exceptions. -

- -

-The question is: What should this dtor do if one or more of these calls -to flush() ends up throwing an exception? This can happen quite easily -if one of the facets installed in the locale imbued in the iostream -object throws. -

-

[Kona: We probably can't do much better than what we've got, so - the LWG is leaning toward NAD. At the point where the standard - stream objects are being cleaned up, the usual error reporting - mechanism are all unavailable. And exception from flush at this - point will definitely cause problems. A quality implementation - might reasonably swallow the exception, or call abort, or do - something even more drastic.]

- - -

[ -See 397 and 622 for related issues. -]

- - - - -

Proposed resolution:

- - - - -
-

419. istream extractors not setting failbit if eofbit is already set

-

Section: 27.6.1.1.3 [istream::sentry] Status: Open - Submitter: Martin Sebor Date: 2003-09-18

-

View all other issues in [istream::sentry].

-

View all issues with Open status.

-

Discussion:

-

- -27.6.1.1.3 [istream::sentry], p2 says that istream::sentry ctor prepares for input if is.good() -is true. p4 then goes on to say that the ctor sets the sentry::ok_ member to -true if the stream state is good after any preparation. 27.6.1.2.1 [istream.formatted.reqmts], p1 then -says that a formatted input function endeavors to obtain the requested input -if the sentry's operator bool() returns true. - -Given these requirements, no formatted extractor should ever set failbit if -the initial stream rdstate() == eofbit. That is contrary to the behavior of -all implementations I tested. The program below prints out - -eof = 1, fail = 0 -eof = 1, fail = 1 - -on all of them. -

-
-#include <sstream>
-#include <cstdio>
-
-int main()
-{
-    std::istringstream strm ("1");
-
-    int i = 0;
-
-    strm >> i;
-
-    std::printf ("eof = %d, fail = %d\n",
-                 !!strm.eof (), !!strm.fail ());
-
-    strm >> i;
-
-    std::printf ("eof = %d, fail = %d\n",
-                 !!strm.eof (), !!strm.fail ());
-}
-
-
-

-
- -Comments from Jerry Schwarz (c++std-lib-11373): -
- -Jerry Schwarz wrote: -
- -I don't know where (if anywhere) it says it in the standard, but the -formatted extractors are supposed to set failbit if they don't extract -any characters. If they didn't then simple loops like -
- -while (cin >> x); -
- -would loop forever. -
- -Further comments from Martin Sebor: -
- -The question is which part of the extraction should prevent this from happening -by setting failbit when eofbit is already set. It could either be the sentry -object or the extractor. It seems that most implementations have chosen to -set failbit in the sentry [...] so that's the text that will need to be -corrected. - -

-

-Pre Berlin: This issue is related to 342. If the sentry -sets failbit when it finds eofbit already set, then -you can never seek away from the end of stream. -

-

Kona: Possibly NAD. If eofbit is set then good() will return false. We - then set ok to false. We believe that the sentry's - constructor should always set failbit when ok is false, and - we also think the standard already says that. Possibly it could be - clearer.

- - - -

Proposed resolution:

-

-Change 27.6.1.1.3 [istream::sentry], p2 to: -

- -
-
explicit sentry(basic_istream<charT,traits>& is , bool noskipws = false);
-

--2- Effects: If is.good() is true -false, calls is.setstate(failbit). -Otherwise prepares for formatted or unformatted input. ... -

-
- - - - - - -
-

421. is basic_streambuf copy-constructible?

-

Section: 27.5.2.1 [streambuf.cons] Status: Open - Submitter: Martin Sebor Date: 2003-09-18

-

View all other issues in [streambuf.cons].

-

View all issues with Open status.

-

Discussion:

-

-The reflector thread starting with c++std-lib-11346 notes that the class -template basic_streambuf, along with basic_stringbuf and basic_filebuf, -is copy-constructible but that the semantics of the copy constructors -are not defined anywhere. Further, different implementations behave -differently in this respect: some prevent copy construction of objects -of these types by declaring their copy ctors and assignment operators -private, others exhibit undefined behavior, while others still give -these operations well-defined semantics. -

- -

-Note that this problem doesn't seem to be isolated to just the three -types mentioned above. A number of other types in the library section -of the standard provide a compiler-generated copy ctor and assignment -operator yet fail to specify their semantics. It's believed that the -only types for which this is actually a problem (i.e. types where the -compiler-generated default may be inappropriate and may not have been -intended) are locale facets. See issue 439. -

- - -

Proposed resolution:

-

-27.5.2 [lib.streambuf]: Add into the synopsis, public section, just above the destructor declaration: -

- -
-
basic_streambuf(const basic_streambuf& sb);
-basic_streambuf& operator=(const basic_streambuf& sb);
-
-
- -

Insert after 27.5.2.1, paragraph 2:

-
-
basic_streambuf(const basic_streambuf& sb);
-
- -

Constructs a copy of sb.

-

Postcondtions:

-
                eback() == sb.eback()
-                gptr()  == sb.gptr()
-                egptr() == sb.egptr()
-                pbase() == sb.pbase()
-                pptr()  == sb.pptr()
-                epptr() == sb.epptr()
-                getloc() == sb.getloc()
-
- -
basic_streambuf& operator=(const basic_streambuf& sb);
-
- -

Assigns the data members of sb to this.

- -

Postcondtions:

-
                eback() == sb.eback()
-                gptr()  == sb.gptr()
-                egptr() == sb.egptr()
-                pbase() == sb.pbase()
-                pptr()  == sb.pptr()
-                epptr() == sb.epptr()
-                getloc() == sb.getloc()
-
- -

Returns: *this.

-
- -

27.7.1 [lib.stringbuf]:

- -

Option A:

- -
-

Insert into the basic_stringbuf synopsis in the private section:

- -
basic_stringbuf(const basic_stringbuf&);             // not defined
-basic_stringbuf& operator=(const basic_stringbuf&);  // not defined
-
-
- -

Option B:

- -
-

Insert into the basic_stringbuf synopsis in the public section:

- -
basic_stringbuf(const basic_stringbuf& sb);
-basic_stringbuf& operator=(const basic_stringbuf& sb);
-
- -

27.7.1.1, insert after paragraph 4:

- -
basic_stringbuf(const basic_stringbuf& sb);
- -

-Constructs an independent copy of sb as if with sb.str(), and with the openmode that sb was constructed with. -

- -

Postcondtions:

-
               str() == sb.str()
-               gptr()  - eback() == sb.gptr()  - sb.eback()
-               egptr() - eback() == sb.egptr() - sb.eback()
-               pptr()  - pbase() == sb.pptr()  - sb.pbase()
-               getloc() == sb.getloc()
-
- -

-Note: The only requirement on epptr() is that it point beyond the -initialized range if an output sequence exists. There is no requirement -that epptr() - pbase() == sb.epptr() - sb.pbase(). -

- -
basic_stringbuf& operator=(const basic_stringbuf& sb);
-

After assignment the basic_stringbuf has the same state as if it -were initially copy constructed from sb, except that the -basic_stringbuf is allowed to retain any excess capacity it might have, -which may in turn effect the value of epptr(). -

-
- -

27.8.1.1 [lib.filebuf]

- -

Insert at the bottom of the basic_filebuf synopsis:

- -
-
private:
-  basic_filebuf(const basic_filebuf&);             // not defined
-  basic_filebuf& operator=(const basic_filebuf&);  // not defined
-
-
-

[Kona: this is an issue for basic_streambuf itself and for its - derived classes. We are leaning toward allowing basic_streambuf to - be copyable, and specifying its precise semantics. (Probably the - obvious: copying the buffer pointers.) We are less sure whether - the streambuf derived classes should be copyable. Howard will - write up a proposal.]

- - -

[Sydney: Dietmar presented a new argument against basic_streambuf - being copyable: it can lead to an encapsulation violation. Filebuf - inherits from streambuf. Now suppose you inhert a my_hijacking_buf - from streambuf. You can copy the streambuf portion of a filebuf to a - my_hijacking_buf, giving you access to the pointers into the - filebuf's internal buffer. Perhaps not a very strong argument, but - it was strong enough to make people nervous. There was weak - preference for having streambuf not be copyable. There was weak - preference for having stringbuf not be copyable even if streambuf - is. Move this issue to open for now. -]

- - -

[ -2007-01-12, Howard: -Rvalue Reference Recommendations for Chapter 27 -recommends protected copy constructor and assignment for basic_streambuf with the same semantics -as would be generated by the compiler. These members aid in derived classes implementing move semantics. -A protected copy constructor and copy assignment operator do not expose encapsulation more so than it is -today as each data member of a basic_streambuf is already both readable and writable by derived -classes via various get/set protected member functions (eback(), setp(), etc.). Rather -a protected copy constructor and copy assignment operator simply make the job of derived classes implementing -move semantics less tedious and error prone. -]

- - - - -

Rationale:

-

-27.5.2 [lib.streambuf]: The proposed basic_streambuf copy constructor -and assignment operator are the same as currently implied by the lack -of declarations: public and simply copies the data members. This -resolution is not a change but a clarification of the current -standard. -

- -

-27.7.1 [lib.stringbuf]: There are two reasonable options: A) Make -basic_stringbuf not copyable. This is likely the status-quo of -current implementations. B) Reasonable copy semantics of -basic_stringbuf can be defined and implemented. A copyable -basic_streambuf is arguably more useful than a non-copyable one. This -should be considered as new functionality and not the fixing of a -defect. If option B is chosen, ramifications from issue 432 are taken -into account. -

- -

-27.8.1.1 [lib.filebuf]: There are no reasonable copy semantics for -basic_filebuf. -

- - - - - - -
-

423. effects of negative streamsize in iostreams

-

Section: 27 [input.output] Status: Open - Submitter: Martin Sebor Date: 2003-09-18

-

View all other issues in [input.output].

-

View all issues with Open status.

-

Discussion:

- -

-A third party test suite tries to exercise istream::ignore(N) with -a negative value of N and expects that the implementation will treat -N as if it were 0. Our implementation asserts that (N >= 0) holds and -aborts the test. -

- -

-I can't find anything in section 27 that prohibits such values but I don't -see what the effects of such calls should be, either (this applies to -a number of unformatted input functions as well as some member functions -of the basic_streambuf template). -

- - -

Proposed resolution:

-

-I propose that we add to each function in clause 27 that takes an argument, -say N, of type streamsize a Requires clause saying that "N >= 0." The intent -is to allow negative streamsize values in calls to precision() and width() -but disallow it in calls to streambuf::sgetn(), istream::ignore(), or -ostream::write(). -

- -

[Kona: The LWG agreed that this is probably what we want. However, we - need a review to find all places where functions in clause 27 take - arguments of type streamsize that shouldn't be allowed to go - negative. Martin will do that review.]

- - - - - - -
-

424. normative notes

-

Section: 17.3.1.1 [structure.summary] Status: Open - Submitter: Martin Sebor Date: 2003-09-18

-

View all issues with Open status.

-

Discussion:

- -

-The text in 17.3.1.1, p1 says: -
- -"Paragraphs labelled "Note(s):" or "Example(s):" are informative, other -paragraphs are normative." -
- -The library section makes heavy use of paragraphs labeled "Notes(s)," -some of which are clearly intended to be normative (see list 1), while -some others are not (see list 2). There are also those where the intent -is not so clear (see list 3). -

- -List 1 -- Examples of (presumably) normative Notes: -
- -20.6.1.1 [allocator.members], p3,
-20.6.1.1 [allocator.members], p10,
-21.3.2 [string.cons], p11,
-22.1.1.2 [locale.cons], p11,
-23.2.2.3 [deque.modifiers], p2,
-25.3.7 [alg.min.max], p3,
-26.3.6 [complex.ops], p15,
-27.5.2.4.3 [streambuf.virt.get], p7.
-
- -List 2 -- Examples of (presumably) informative Notes: -
- -18.5.1.3 [new.delete.placement], p3,
-21.3.6.6 [string::replace], p14,
-22.2.1.4.2 [locale.codecvt.virtuals], p3,
-25.1.1 [alg.foreach], p4,
-26.3.5 [complex.member.ops], p1,
-27.4.2.5 [ios.base.storage], p6.
-
- -List 3 -- Examples of Notes that are not clearly either normative -or informative: -
- -22.1.1.2 [locale.cons], p8,
-22.1.1.5 [locale.statics], p6,
-27.5.2.4.5 [streambuf.virt.put], p4.
-
- -None of these lists is meant to be exhaustive. -

- -

[Definitely a real problem. The big problem is there's material - that doesn't quite fit any of the named paragraph categories - (e.g. Effects). Either we need a new kind of named - paragraph, or we need to put more material in unnamed paragraphs - jsut after the signature. We need to talk to the Project Editor - about how to do this. -]

- - - -

Proposed resolution:

-

[Pete: I changed the paragraphs marked "Note" and "Notes" to use "Remark" and "Remarks". -Fixed as editorial. This change has been in the WD since the post-Redmond mailing, in 2004. -Recommend NAD.]

- -

[ -Batavia: We feel that the references in List 2 above should be changed from Remarks -to Notes. We also feel that those items in List 3 need to be double checked for -the same change. Alan and Pete to review. -]

- - - - - -
-

427. stage 2 and rationale of DR 221

-

Section: 22.2.2.1.2 [facet.num.get.virtuals] Status: Open - Submitter: Martin Sebor Date: 2003-09-18

-

View other active issues in [facet.num.get.virtuals].

-

View all other issues in [facet.num.get.virtuals].

-

View all issues with Open status.

-

Discussion:

-

-The requirements specified in Stage 2 and reiterated in the rationale -of DR 221 (and echoed again in DR 303) specify that num_get<charT>:: -do_get() compares characters on the stream against the widened elements -of "012...abc...ABCX+-" -

- -

-An implementation is required to allow programs to instantiate the num_get -template on any charT that satisfies the requirements on a user-defined -character type. These requirements do not include the ability of the -character type to be equality comparable (the char_traits template must -be used to perform tests for equality). Hence, the num_get template cannot -be implemented to support any arbitrary character type. The num_get template -must either make the assumption that the character type is equality-comparable -(as some popular implementations do), or it may use char_traits<charT> to do -the comparisons (some other popular implementations do that). This diversity -of approaches makes it difficult to write portable programs that attempt to -instantiate the num_get template on user-defined types. -

- -

[Kona: the heart of the problem is that we're theoretically - supposed to use traits classes for all fundamental character - operations like assignment and comparison, but facets don't have - traits parameters. This is a fundamental design flaw and it - appears all over the place, not just in this one place. It's not - clear what the correct solution is, but a thorough review of facets - and traits is in order. The LWG considered and rejected the - possibility of changing numeric facets to use narrowing instead of - widening. This may be a good idea for other reasons (see issue - 459), but it doesn't solve the problem raised by this - issue. Whether we use widen or narrow the num_get facet - still has no idea which traits class the user wants to use for - the comparison, because only streams, not facets, are passed traits - classes. The standard does not require that two different - traits classes with the same char_type must necessarily - have the same behavior.]

- - -

Informally, one possibility: require that some of the basic -character operations, such as eq, lt, -and assign, must behave the same way for all traits classes -with the same char_type. If we accept that limitation on -traits classes, then the facet could reasonably be required to -use char_traits<charT>.

- - -

Proposed resolution:

- - - - -
-

430. valarray subset operations

-

Section: 26.5.2.4 [valarray.sub] Status: Open - Submitter: Martin Sebor Date: 2003-09-18

-

View all issues with Open status.

-

Discussion:

-

-The standard fails to specify the behavior of valarray::operator[](slice) -and other valarray subset operations when they are passed an "invalid" -slice object, i.e., either a slice that doesn't make sense at all (e.g., -slice (0, 1, 0) or one that doesn't specify a valid subset of the valarray -object (e.g., slice (2, 1, 1) for a valarray of size 1). -

-

[Kona: the LWG believes that invalid slices should invoke - undefined behavior. Valarrays are supposed to be designed for high - performance, so we don't want to require specific checking. We - need wording to express this decision.]

- - - -

Proposed resolution:

- - - - -
-

431. Swapping containers with unequal allocators

-

Section: 20.1.2 [allocator.requirements], 25 [algorithms] Status: Open - Submitter: Matt Austern Date: 2003-09-20

-

View other active issues in [allocator.requirements].

-

View all other issues in [allocator.requirements].

-

View all issues with Open status.

-

Discussion:

-

Clause 20.1.2 [allocator.requirements] paragraph 4 says that implementations - are permitted to supply containers that are unable to cope with - allocator instances and that container implementations may assume - that all instances of an allocator type compare equal. We gave - implementers this latitude as a temporary hack, and eventually we - want to get rid of it. What happens when we're dealing with - allocators that don't compare equal? -

- -

In particular: suppose that v1 and v2 are both - objects of type vector<int, my_alloc> and that - v1.get_allocator() != v2.get_allocator(). What happens if - we write v1.swap(v2)? Informally, three possibilities:

- -

1. This operation is illegal. Perhaps we could say that an - implementation is required to check and to throw an exception, or - perhaps we could say it's undefined behavior.

-

2. The operation performs a slow swap (i.e. using three - invocations of operator=, leaving each allocator with its - original container. This would be an O(N) operation.

-

3. The operation swaps both the vectors' contents and their - allocators. This would be an O(1) operation. That is:

-
-
    my_alloc a1(...);
-    my_alloc a2(...);
-    assert(a1 != a2);
-
-    vector<int, my_alloc> v1(a1);
-    vector<int, my_alloc> v2(a2);
-    assert(a1 == v1.get_allocator());
-    assert(a2 == v2.get_allocator());
-
-    v1.swap(v2);
-    assert(a1 == v2.get_allocator());
-    assert(a2 == v1.get_allocator());
-  
-
- -

[Kona: This is part of a general problem. We need a paper - saying how to deal with unequal allocators in general.]

- - -

[pre-Sydney: Howard argues for option 3 in -N1599. -]

- - -

[ -2007-01-12, Howard: This issue will now tend to come up more often with move constructors -and move assignment operators. For containers, these members transfer resources (i.e. -the allocated memory) just like swap. -]

- - -

[ -Batavia: There is agreement to overload the container swap on the allocator's Swappable -requirement using concepts. If the allocator supports Swappable, then container's swap will -swap allocators, else it will perform a "slow swap" using copy construction and copy assignment. -]

- - - - -

Proposed resolution:

- - - - - -
-

446. Iterator equality between different containers

-

Section: 24.1 [iterator.requirements], 23.1 [container.requirements] Status: Open - Submitter: Andy Koenig Date: 2003-12-16

-

View other active issues in [iterator.requirements].

-

View all other issues in [iterator.requirements].

-

View all issues with Open status.

-

Discussion:

-

-What requirements does the standard place on equality comparisons between -iterators that refer to elements of different containers. For example, if -v1 and v2 are empty vectors, is v1.end() == v2.end() allowed to yield true? -Is it allowed to throw an exception? -

- -

-The standard appears to be silent on both questions. -

-

[Sydney: The intention is that comparing two iterators from -different containers is undefined, but it's not clear if we say that, -or even whether it's something we should be saying in clause 23 or in -clause 24. Intuitively we might want to say that equality is defined -only if one iterator is reachable from another, but figuring out how -to say it in any sensible way is a bit tricky: reachability is defined -in terms of equality, so we can't also define equality in terms of -reachability. -]

- - - - -

Proposed resolution:

- - - - - - -
-

454. basic_filebuf::open should accept wchar_t names

-

Section: 27.8.1.4 [filebuf.members] Status: Open - Submitter: Bill Plauger Date: 2004-01-30

-

View other active issues in [filebuf.members].

-

View all other issues in [filebuf.members].

-

View all issues with Open status.

-

Discussion:

-
    basic_filebuf *basic_filebuf::open(const char *, ios_base::open_mode);
-
- -

should be supplemented with the overload:

- -
    basic_filebuf *basic_filebuf::open(const wchar_t *, ios_base::open_mode);
-
- -

-Depending on the operating system, one of these forms is fundamental and -the other requires an implementation-defined mapping to determine the -actual filename. -

- -

[Sydney: Yes, we want to allow wchar_t filenames. Bill will - provide wording.]

- - -

[ -In Toronto we noted that this is issue 5 from -N1569. -]

- -

-How does this interact with the newly-defined character types, and how -do we avoid interface explosion considering std::string overloads that -were added? Propose another solution that is different than the -suggestion proposed by PJP. -

-

-Suggestion is to make a member template function for basic_string (for -char, wchar_t, u16char, u32char instantiations), and then just keep a -const char* member. -

-

-Goal is to do implicit conversion between character string literals to -appropriate basic_string type. Not quite sure if this is possible. -

-

-Implementors are free to add specific overloads for non-char character -types. -

- - - -

Proposed resolution:

- -

Change from:

-
-
basic_filebuf<charT,traits>* open(
-	const char* s,
-	ios_base::openmode mode );
-
- -

-Effects: If is_open() != false, returns a null pointer. -Otherwise, initializes the filebuf as required. It then -opens a file, if possible, whose name is the NTBS s ("as if" -by calling std::fopen(s,modstr)).

-
- -

to:

- -
-
basic_filebuf<charT,traits>* open(
-	const char* s,
-	ios_base::openmode mode );
-
-basic_filebuf<charT,traits>* open(
-	const wchar_t* ws,
-	ios_base::openmode mode );
-
- -

-Effects: If is_open() != false, returns a null pointer. -Otherwise, initializes the filebuf as required. It then -opens a file, if possible, whose name is the NTBS s ("as if" -by calling std::fopen(s,modstr)). -For the second signature, the NTBS s is determined from the -WCBS ws in an implementation-defined manner. -

- -

-(NOTE: For a system that "naturally" represents a filename -as a WCBS, the NTBS s in the first signature may instead -be mapped to a WCBS; if so, it follows the same mapping -rules as the first argument to open.) -

-
- - - -

Rationale:

-

-Slightly controversial, but by a 7-1 straw poll the LWG agreed to move -this to Ready. The controversy was because the mapping between wide -names and files in a filesystem is implementation defined. The -counterargument, which most but not all LWG members accepted, is that -the mapping between narrow files names and files is also -implemenation defined.

- -

[Lillehammer: Moved back to "open" status, at Beman's urging. -(1) Why just basic_filebuf, instead of also basic_fstream (and -possibly other things too). (2) Why not also constructors that take -std::basic_string? (3) We might want to wait until we see Beman's -filesystem library; we might decide that it obviates this.]

- - - - - - - - - -
-

458. 24.1.5 contains unintented limitation for operator-

-

Section: 24.1.5 [random.access.iterators] Status: Open - Submitter: Daniel Frey Date: 2004-02-27

-

View all other issues in [random.access.iterators].

-

View all issues with Open status.

-

Discussion:

-

-In 24.1.5 [lib.random.access.iterators], table 76 the operational -semantics for the expression "r -= n" are defined as "return r += -n". -This means, that the expression -n must be valid, which is not the case -for unsigned types. -

- -

[ -Sydney: Possibly not a real problem, since difference type is required -to be a signed integer type. However, the wording in the standard may -be less clear than we would like. -]

- - - - -

Proposed resolution:

-

-To remove this limitation, I suggest to change the -operational semantics for this column to: -

-
    { Distance m = n; 
-      if (m >= 0) 
-        while (m--) --r; 
-      else 
-        while (m++) ++r;
-      return r; }
-
- - - - - - -
-

459. Requirement for widening in stage 2 is overspecification

-

Section: 22.2.2.1.2 [facet.num.get.virtuals] Status: Open - Submitter: Martin Sebor Date: 2004-03-16

-

View other active issues in [facet.num.get.virtuals].

-

View all other issues in [facet.num.get.virtuals].

-

View all issues with Open status.

-

Discussion:

-

When parsing strings of wide-character digits, the standard - requires the library to widen narrow-character "atoms" and compare - the widened atoms against the characters that are being parsed. - Simply narrowing the wide characters would be far simpler, and - probably more efficient. The two choices are equivalent except in - convoluted test cases, and many implementations already ignore the - standard and use narrow instead of widen.

- -

-First, I disagree that using narrow() instead of widen() would -necessarily have unfortunate performance implications. A possible -implementation of narrow() that allows num_get to be implemented -in a much simpler and arguably comparably efficient way as calling -widen() allows, i.e. without making a virtual call to do_narrow every -time, is as follows: -

- -
  inline char ctype<wchar_t>::narrow (wchar_t wc, char dflt) const
-  {
-      const unsigned wi = unsigned (wc);
-
-      if (wi > UCHAR_MAX)
-          return typeid (*this) == typeid (ctype<wchar_t>) ?
-                 dflt : do_narrow (wc, dflt);
-
-      if (narrow_ [wi] < 0) {
-         const char nc = do_narrow (wc, dflt);
-         if (nc == dflt)
-             return dflt;
-         narrow_ [wi] = nc;
-      }
-
-      return char (narrow_ [wi]);
-  }
-
- -

-Second, I don't think the change proposed in the issue (i.e., to use -narrow() instead of widen() during Stage 2) would be at all -drastic. Existing implementations with the exception of libstdc++ -currently already use narrow() so the impact of the change on programs -would presumably be isolated to just a single implementation. Further, -since narrow() is not required to translate alternate wide digit -representations such as those mentioned in issue 303 -to -their narrow equivalents (i.e., the portable source characters '0' -through '9'), the change does not necessarily imply that these -alternate digits would be treated as ordinary digits and accepted as -part of numbers during parsing. In fact, the requirement in 22.2.1.1.2 -[locale.ctype.virtuals], p13 forbids narrow() to translate an alternate -digit character, wc, to an ordinary digit in the basic source -character set unless the expression -(ctype<charT>::is(ctype_base::digit, wc) == true) holds. This in -turn is prohibited by the C standard (7.25.2.1.5, 7.25.2.1.5, and -5.2.1, respectively) for charT of either char or wchar_t. -

- -

[Sydney: To a large extent this is a nonproblem. As long as -you're only trafficking in char and wchar_t we're only dealing with a -stable character set, so you don't really need either 'widen' or -'narrow': can just use literals. Finally, it's not even clear whether -widen-vs-narrow is the right question; arguably we should be using -codecvt instead.]

- - - - -

Proposed resolution:

-

Change stage 2 so that implementations are permitted to use either -technique to perform the comparison:

-
    -
  1. call widen on the atoms and compare (either by using - operator== or char_traits<charT>::eq) the input with - the widened atoms, or
  2. -
  3. call narrow on the input and compare the narrow input - with the atoms
  4. -
  5. do (1) or (2) only if charT is not char or wchar_t, - respectively; i.e., avoid calling widen or narrow - if it the source and destination types are the same
  6. -
- - - - - -
-

462. Destroying objects with static storage duration

-

Section: 3.6.3 [basic.start.term], 18.3 [cstdint] Status: Open - Submitter: Bill Plauger Date: 2004-03-23

-

View all issues with Open status.

-

Discussion:

-

-3.6.3 Termination spells out in detail the interleaving of static -destructor calls and calls to functions registered with atexit. To -match this behavior requires intimate cooperation between the code -that calls destructors and the exit/atexit machinery. The former -is tied tightly to the compiler; the latter is a primitive mechanism -inherited from C that traditionally has nothing to do with static -construction and destruction. The benefits of intermixing destructor -calls with atexit handler calls is questionable at best, and very -difficult to get right, particularly when mixing third-party C++ -libraries with different third-party C++ compilers and C libraries -supplied by still other parties. -

- -

-I believe the right thing to do is defer all static destruction -until after all atexit handlers are called. This is a change in -behavior, but one that is likely visible only to perverse test -suites. At the very least, we should permit deferred destruction -even if we don't require it. -

- -

[If this is to be changed, it should probably be changed by CWG. - At this point, however, the LWG is leaning toward NAD. Implementing - what the standard says is hard work, but it's not impossible and - most vendors went through that pain years ago. Changing this - behavior would be a user-visible change, and would break at least - one real application.]

- - -

[ -Batavia: Send to core with our recommendation that we should permit deferred -destruction but not require it. -]

- - -

[ -Howard: The course of action recommended in Batavia would undo LWG -issue 3 and break current code implementing the "phoenix -singleton". Search the net for "phoenix singleton atexit" to get a feel -for the size of the adverse impact this change would have. Below is -sample code which implements the phoenix singleton and would break if -atexit is changed in this way: -]

- - -
#include <cstdlib>
-#include <iostream>
-#include <type_traits>
-#include <new>
-
-class A
-{
-    bool alive_;
-    A(const A&);
-    A& operator=(const A&);
-public:
-    A() : alive_(true) {std::cout << "A()\n";}
-    ~A() {alive_ = false; std::cout << "~A()\n";}
-    void use()
-    {
-        if (alive_)
-            std::cout << "A is alive\n";
-        else
-            std::cout << "A is dead\n";
-    }
-};
-
-void deallocate_resource();
-
-// This is the phoenix singleton pattern
-A& get_resource(bool create = true)
-{
-    static std::aligned_storage<sizeof(A), std::alignment_of<A>::value>::type buf;
-    static A* a;
-    if (create)
-    {
-        if (a != (A*)&buf)
-        {
-            a = ::new (&buf) A;
-            std::atexit(deallocate_resource);
-        }
-    }
-    else
-    {
-        a->~A();
-        a = (A*)&buf + 1;
-    }
-    return *a;
-}
-
-void deallocate_resource()
-{
-    get_resource(false);
-}
-
-void use_A(const char* message)
-{
-    A& a = get_resource();
-    std::cout << "Using A " << message << "\n";
-    a.use();
-}
-
-struct B
-{
-    ~B() {use_A("from ~B()");}
-};
-
-B b;
-
-int main()
-{
-    use_A("from main()");
-}
-
- -

-The correct output is: -

- -
A()
-Using A from main()
-A is alive
-~A()
-A()
-Using A from ~B()
-A is alive
-~A()
-
- - - -

Proposed resolution:

-

-

- - - - - -
-

471. result of what() implementation-defined

-

Section: 18.6.1 [type.info] Status: Open - Submitter: Martin Sebor Date: 2004-06-28

-

View all other issues in [type.info].

-

View all issues with Open status.

-

Discussion:

- -

[lib.exception] specifies the following:

-
    exception (const exception&) throw();
-    exception& operator= (const exception&) throw();
-
-    -4- Effects: Copies an exception object.
-    -5- Notes: The effects of calling what() after assignment
-        are implementation-defined.
-
- -

-First, does the Note only apply to the assignment operator? If so, -what are the effects of calling what() on a copy of an object? Is -the returned pointer supposed to point to an identical copy of -the NTBS returned by what() called on the original object or not? -

- -

-Second, is this Note intended to extend to all the derived classes -in section 19? I.e., does the standard provide any guarantee for -the effects of what() called on a copy of any of the derived class -described in section 19? -

- -

-Finally, if the answer to the first question is no, I believe it -constitutes a defect since throwing an exception object typically -implies invoking the copy ctor on the object. If the answer is yes, -then I believe the standard ought to be clarified to spell out -exactly what the effects are on the copy (i.e., after the copy -ctor was called). -

- -

[Redmond: Yes, this is fuzzy. The issue of derived classes is - fuzzy too.]

- - -

[ -Batavia: Howard provided wording. -]

- - - - -

Proposed resolution:

- -

-Change 18.7.1 [exception] to: -

- -
-
exception(const exception& e) throw();
-exception& operator=(const exception& e) throw();
-
-

--4- Effects: Copies an exception object. -

-

- -5- Remarks: The effects of calling what() after assignment are implementation-defined. -

-

--5- Throws: Nothing. This also applies -to all standard library-defined classes that derive from exception. -

-

--7- Postcondition: strcmp(what(), e.what()) == 0. This also applies -to all standard library-defined classes that derive from exception. -

- -
-
- - - - -
-

473. underspecified ctype calls

-

Section: 22.2.1.1 [locale.ctype] Status: Open - Submitter: Martin Sebor Date: 2004-07-01

-

View all issues with Open status.

-

Discussion:

-

-Most ctype member functions come in two forms: one that operates -on a single character at a time and another form that operates -on a range of characters. Both forms are typically described by -a single Effects and/or Returns clause. -

-

-The Returns clause of each of the single-character non-virtual forms -suggests that the function calls the corresponding single character -virtual function, and that the array form calls the corresponding -virtual array form. Neither of the two forms of each virtual member -function is required to be implemented in terms of the other. -

-

-There are three problems: -

-

-1. One is that while the standard does suggest that each non-virtual -member function calls the corresponding form of the virtual function, -it doesn't actually explicitly require it. -

-

-Implementations that cache results from some of the virtual member -functions for some or all values of their arguments might want to -call the array form from the non-array form the first time to fill -the cache and avoid any or most subsequent virtual calls. Programs -that rely on each form of the virtual function being called from -the corresponding non-virtual function will see unexpected behavior -when using such implementations. -

-

-2. The second problem is that either form of each of the virtual -functions can be overridden by a user-defined function in a derived -class to return a value that is different from the one produced by -the virtual function of the alternate form that has not been -overriden. -

-

-Thus, it might be possible for, say, ctype::widen(c) to return one -value, while for ctype::widen(&c, &c + 1, &wc) to set -wc to another value. This is almost certainly not intended. Both -forms of every function should be required to return the same result -for the same character, otherwise the same program using an -implementation that calls one form of the functions will behave -differently than when using another implementation that calls the -other form of the function "under the hood." -

-

-3. The last problem is that the standard text fails to specify whether -one form of any of the virtual functions is permitted to be implemented -in terms of the other form or not, and if so, whether it is required -or permitted to call the overridden virtual function or not. -

-

-Thus, a program that overrides one of the virtual functions so that -it calls the other form which then calls the base member might end -up in an infinite loop if the called form of the base implementation -of the function in turn calls the other form. -

-

-Lillehammer: Part of this isn't a real problem. We already talk about -caching. 22.1.1/6 But part is a real problem. ctype virtuals may call -each other, so users don't know which ones to override to avoid avoid -infinite loops.

- -

This is a problem for all facet virtuals, not just ctype virtuals, -so we probably want a blanket statement in clause 22 for all -facets. The LWG is leaning toward a blanket prohibition, that a -facet's virtuals may never call each other. We might want to do that -in clause 27 too, for that matter. A review is necessary. Bill will -provide wording.

- - -

Proposed resolution:

- - - - -
-

484. Convertible to T

-

Section: 24.1.1 [input.iterators] Status: Open - Submitter: Chris Jefferson Date: 2004-09-16

-

View all other issues in [input.iterators].

-

View all issues with Open status.

-

Discussion:

-

From comp.std.c++:

- -

-I note that given an input iterator a for type T, -then *a only has to be "convertable to T", not actually of type T. -

- -

Firstly, I can't seem to find an exact definition of "convertable to T". -While I assume it is the obvious definition (an implicit conversion), I -can't find an exact definition. Is there one?

- -

Slightly more worryingly, there doesn't seem to be any restriction on -the this type, other than it is "convertable to T". Consider two input -iterators a and b. I would personally assume that most people would -expect *a==*b would perform T(*a)==T(*b), however it doesn't seem that -the standard requires that, and that whatever type *a is (call it U) -could have == defined on it with totally different symantics and still -be a valid inputer iterator.

- -

Is this a correct reading? When using input iterators should I write -T(*a) all over the place to be sure that the object i'm using is the -class I expect?

- -

This is especially a nuisance for operations that are defined to be - "convertible to bool". (This is probably allowed so that - implementations could return say an int and avoid an unnessary - conversion. However all implementations I have seen simply return a - bool anyway. Typical implemtations of STL algorithms just write - things like while(a!=b && *a!=0). But strictly - speaking, there are lots of types that are convertible to T but - that also overload the appropriate operators so this doesn't behave - as expected.

- -

If we want to make code like this legal (which most people seem to - expect), then we'll need to tighten up what we mean by "convertible - to T".

- -

[Lillehammer: The first part is NAD, since "convertible" is - well-defined in core. The second part is basically about pathological - overloads. It's a minor problem but a real one. So leave open for - now, hope we solve it as part of iterator redesign.]

- - - -

Proposed resolution:

- - - - - -
-

485. output iterator insufficently constrained

-

Section: 24.1.2 [output.iterators] Status: Open - Submitter: Chris Jefferson Date: 2004-10-13

-

View all other issues in [output.iterators].

-

View all issues with Open status.

-

Discussion:

-

-The note on 24.1.2 Output iterators insufficently limits what can be -performed on output iterators. While it requires that each iterator is -progressed through only once and that each iterator is written to only -once, it does not require the following things:

- -

Note: Here it is assumed that x is an output iterator of type X which -has not yet been assigned to.

- -

a) That each value of the output iterator is written to: -The standard allows: -++x; ++x; ++x; -

- -

-b) That assignments to the output iterator are made in order -X a(x); ++a; *a=1; *x=2; is allowed -

- -

-c) Chains of output iterators cannot be constructed: -X a(x); ++a; X b(a); ++b; X c(b); ++c; is allowed, and under the current -wording (I believe) x,a,b,c could be written to in any order. -

- -

I do not believe this was the intension of the standard?

-

[Lillehammer: Real issue. There are lots of constraints we - intended but didn't specify. Should be solved as part of iterator - redesign.]

- - - -

Proposed resolution:

- - - - - -
-

492. Invalid iterator arithmetic expressions

-

Section: 23 [containers], 24 [iterators], 25 [algorithms] Status: Open - Submitter: Thomas Mang Date: 2004-12-12

-

View all other issues in [containers].

-

View all issues with Open status.

-

Discussion:

-

Various clauses other than clause 25 make use of iterator arithmetic not -supported by the iterator category in question. -Algorithms in clause 25 are exceptional because of 25 [lib.algorithms], -paragraph 9, but this paragraph does not provide semantics to the -expression "iterator - n", where n denotes a value of a distance type -between iterators.

- -

1) Examples of current wording:

- -

Current wording outside clause 25:

- -

-23.2.2.4 [lib.list.ops], paragraphs 19-21: "first + 1", "(i - 1)", -"(last - first)" -23.3.1.1 [lib.map.cons], paragraph 4: "last - first" -23.3.2.1 [lib.multimap.cons], paragraph 4: "last - first" -23.3.3.1 [lib.set.cons], paragraph 4: "last - first" -23.3.4.1 [lib.multiset.cons], paragraph 4: "last - first" -24.4.1 [lib.reverse.iterators], paragraph 1: "(i - 1)" -

- -

-[Important note: The list is not complete, just an illustration. The -same issue might well apply to other paragraphs not listed here.]

- -

None of these expressions is valid for the corresponding iterator -category.

- -

Current wording in clause 25:

- -

-25.1.1 [lib.alg.foreach], paragraph 1: "last - 1" -25.1.3 [lib.alg.find.end], paragraph 2: "[first1, last1 - -(last2-first2))" -25.2.8 [lib.alg.unique], paragraph 1: "(i - 1)" -25.2.8 [lib.alg.unique], paragraph 5: "(i - 1)" -

- -

-However, current wording of 25 [lib.algorithms], paragraph 9 covers -neither of these four cases:

- -

Current wording of 25 [lib.algorithms], paragraph 9:

- -

-"In the description of the algorithms operator + and - are used for some -of the iterator categories for which they do not have to be defined. In -these cases the semantics of a+n is the same as that of

-
{X tmp = a;
-advance(tmp, n);
-return tmp;
-}
-
-

and that of b-a is the same as of return distance(a, b)"

- -

-This paragrpah does not take the expression "iterator - n" into account, -where n denotes a value of a distance type between two iterators [Note: -According to current wording, the expression "iterator - n" would be -resolved as equivalent to "return distance(n, iterator)"]. Even if the -expression "iterator - n" were to be reinterpreted as equivalent to -"iterator + -n" [Note: This would imply that "a" and "b" were -interpreted implicitly as values of iterator types, and "n" as value of -a distance type], then 24.3.4/2 interfers because it says: "Requires: n -may be negative only for random access and bidirectional iterators.", -and none of the paragraphs quoted above requires the iterators on which -the algorithms operate to be of random access or bidirectional category. -

- -

2) Description of intended behavior:

- -

-For the rest of this Defect Report, it is assumed that the expression -"iterator1 + n" and "iterator1 - iterator2" has the semantics as -described in current 25 [lib.algorithms], paragraph 9, but applying to -all clauses. The expression "iterator1 - n" is equivalent to an -result-iterator for which the expression "result-iterator + n" yields an -iterator denoting the same position as iterator1 does. The terms -"iterator1", "iterator2" and "result-iterator" shall denote the value of -an iterator type, and the term "n" shall denote a value of a distance -type between two iterators.

- -

-All implementations known to the author of this Defect Report comply -with these assumptions. -No impact on current code is expected.

- -

3) Proposed fixes:

- - -

Change 25 [lib.algorithms], paragraph 9 to:

- -

-"In the description of the algorithms operator + and - are used for some -of the iterator categories for which they do not have to be defined. In -this paragraph, a and b denote values of an iterator type, and n denotes -a value of a distance type between two iterators. In these cases the -semantics of a+n is the same as that of

-
{X tmp = a;
-advance(tmp, n);
-return tmp;
-}
-
-

,the semantics of a-n denotes the value of an iterator i for which the -following condition holds: -advance(i, n) == a, -and that of b-a is the same as of -return distance(a, b)". -

- -

Comments to the new wording:

- -

-a) The wording " In this paragraph, a and b denote values of an iterator -type, and n denotes a value of a distance type between two iterators." -was added so the expressions "b-a" and "a-n" are distinguished regarding -the types of the values on which they operate. -b) The wording ",the semantics of a-n denotes the value of an iterator i -for which the following condition holds: advance(i, n) == a" was added -to cover the expression 'iterator - n'. The wording "advance(i, n) == a" -was used to avoid a dependency on the semantics of a+n, as the wording -"i + n == a" would have implied. However, such a dependency might well -be deserved. -c) DR 225 is not considered in the new wording. -

- -

-Proposed fixes regarding invalid iterator arithmetic expressions outside -clause 25:

- -

-Either -a) Move modified 25 [lib.algorithms], paragraph 9 (as proposed above) -before any current invalid iterator arithmetic expression. In that case, -the first sentence of 25 [lib.algorithms], paragraph 9, need also to be -modified and could read: "For the rest of this International Standard, -...." / "In the description of the following clauses including this -...." / "In the description of the text below ..." etc. - anyways -substituting the wording "algorithms", which is a straight reference to -clause 25. -In that case, 25 [lib.algorithms] paragraph 9 will certainly become -obsolete. -Alternatively, -b) Add an appropiate paragraph similar to resolved 25 [lib.algorithms], -paragraph 9, to the beginning of each clause containing invalid iterator -arithmetic expressions. -Alternatively, -c) Fix each paragraph (both current wording and possible resolutions of -DRs) containing invalid iterator arithmetic expressions separately. -

- -

5) References to other DRs:

- -

-See DR 225. -See DR 237. The resolution could then also read "Linear in last - -first". -

- -

Proposed resolution:

- -

[Lillehammer: Minor issue, but real. We have a blanket statement -about this in 25/11. But (a) it should be in 17, not 25; and (b) it's -not quite broad enough, because there are some arithmetic expressions -it doesn't cover. Bill will provide wording.]

- - - - - - - -
-

498. Requirements for partition() and stable_partition() too strong

-

Section: 25.2.13 [alg.partitions] Status: Open - Submitter: Sean Parent, Joe Gottman Date: 2005-05-04

-

View all issues with Open status.

-

Discussion:

-

-Problem: -The iterator requirements for partition() and stable_partition() [25.2.12] -are listed as BidirectionalIterator, however, there are efficient algorithms -for these functions that only require ForwardIterator that have been known -since before the standard existed. The SGI implementation includes these (see -http://www.sgi.com/tech/stl/partition.html -and -http://www.sgi.com/tech/stl/stable_partition.html). -

- - -

Proposed resolution:

-

-Change 25.2.12 from

-
template<class BidirectionalIterator, class Predicate> 
-BidirectionalIterator partition(BidirectionalIterato r first, 
-                                BidirectionalIterator last, 
-                                Predicate pred); 
-
-

to

-
template<class ForwardIterator, class Predicate> 
-ForwardIterator partition(ForwardIterator first, 
-                          ForwardIterator last, 
-                          Predicate pred); 
-
-

Change the complexity from

- -

-At most (last - first)/2 swaps are done. Exactly (last - first) -applications of the predicate are done. -

- -

to

- -

-If ForwardIterator is a bidirectional_iterator, at most (last - first)/2 -swaps are done; otherwise at most (last - first) swaps are done. Exactly -(last - first) applications of the predicate are done. -

- - - -

Rationale:

-

-Partition is a "foundation" algorithm useful in many contexts (like sorting -as just one example) - my motivation for extending it to include forward -iterators is slist - without this extension you can't partition an slist -(without writing your own partition). Holes like this in the standard -library weaken the argument for generic programming (ideally I'd be able -to provide a library that would refine std::partition() to other concepts -without fear of conflicting with other libraries doing the same - but -that is a digression). I consider the fact that partition isn't defined -to work for ForwardIterator a minor embarrassment. -

- -

[Mont Tremblant: Moved to Open, request motivation and use cases -by next meeting. Sean provided further rationale by post-meeting -mailing.]

- - - - - - - -
-

502. Proposition: Clarification of the interaction between a facet and an iterator

-

Section: 22.1.1.1.1 [locale.category] Status: Open - Submitter: Christopher Conrade Zseleghovski Date: 2005-06-07

-

View all other issues in [locale.category].

-

View all issues with Open status.

-

Discussion:

-

-Motivation: -

- -

-This requirement seems obvious to me, it is the essence of code modularity. -I have complained to Mr. Plauger that the Dinkumware library does not -observe this principle but he objected that this behaviour is not covered in -the standard. -

- - -

Proposed resolution:

-

-Append the following point to 22.1.1.1.1: -

- -

-6. The implementation of a facet of Table 52 parametrized with an -InputIterator/OutputIterator should use that iterator only as character -source/sink respectively. -For a *_get facet, it means that the value received depends only on the -sequence of input characters and not on how they are accessed. -For a *_put facet, it means that the sequence of characters output depends -only on the value to be formatted and not of how the characters are stored. -

- -

[ -Berlin: Moved to Open, Need to clean up this area to make it clear -locales don't have to contain open ended sets of facets. Jack, Howard, -Bill. -]

- - - - - - - -
-

503. more on locales

-

Section: 22.2 [locale.categories] Status: Open - Submitter: P.J. Plauger Date: 2005-06-20

-

View other active issues in [locale.categories].

-

View all other issues in [locale.categories].

-

View all issues with Open status.

-

Discussion:

-

-a) In 22.2.1.1 para. 2 we refer to "the instantiations required in Table -51" to refer to the facet *objects* associated with a locale. And we -almost certainly mean just those associated with the default or "C" -locale. Otherwise, you can't switch to a locale that enforces a different -mapping between narrow and wide characters, or that defines additional -uppercase characters. -

- -

-b) 22.2.1.5 para. 3 (codecvt) has the same issues. -

- -

-c) 22.2.1.5.2 (do_unshift) is even worse. It *forbids* the generation of -a homing sequence for the basic character set, which might very well need -one. -

- -

-d) 22.2.1.5.2 (do_length) likewise dictates that the default mapping -between wide and narrow characters be taken as one-for-one. -

- -

-e) 22.2.2 para. 2 (num_get/put) is both muddled and vacuous, as far as -I can tell. The muddle is, as before, calling Table 51 a list of -instantiations. But the constraint it applies seems to me to cover -*all* defined uses of num_get/put, so why bother to say so? -

- -

-f) 22.2.3.1.2 para. 1(do_decimal_point) says "The required instantiations -return '.' or L'.'.) Presumably this means "as appropriate for the -character type. But given the vague definition of "required" earlier, -this overrules *any* change of decimal point for non "C" locales. -Surely we don't want to do that. -

- -

-g) 22.2.3.1.2 para. 2 (do_thousands_sep) says "The required instantiations -return ',' or L','.) As above, this probably means "as appropriate for the -character type. But this overrules the "C" locale, which requires *no* -character ('\0') for the thousands separator. Even if we agree that we -don't mean to block changes in decimal point or thousands separator, -we should also eliminate this clear incompatibility with C. -

- -

-h) 22.2.3.1.2 para. 2 (do_grouping) says "The required instantiations -return the empty string, indicating no grouping." Same considerations -as for do_decimal_point. -

- -

-i) 22.2.4.1 para. 1 (collate) refers to "instantiations required in Table -51". Same bad jargon. -

- -

-j) 22.2.4.1.2 para. 1 (do_compare) refers to "instantiations required -in Table 51". Same bad jargon. -

- -

-k) 22.2.5 para. 1 (time_get/put) uses the same muddled and vacuous -as num_get/put. -

- -

-l) 22.2.6 para. 2 (money_get/put) uses the same muddled and vacuous -as num_get/put. -

- -

-m) 22.2.6.3.2 (do_pos/neg_format) says "The instantiations required -in Table 51 ... return an object of type pattern initialized to -{symbol, sign, none, value}." This once again *overrides* the "C" -locale, as well as any other locale." -

- -

-3) We constrain the use_facet calls that can be made by num_get/put, -so why don't we do the same for money_get/put? Or for any of the -other facets, for that matter? -

- -

-4) As an almost aside, we spell out when a facet needs to use the ctype -facet, but several also need to use a codecvt facet and we don't say so. -

-

[ -Berlin: Bill to provide wording. -]

- - - -

Proposed resolution:

-

-

- - - - - -
-

518. Are insert and erase stable for unordered_multiset and unordered_multimap?

-

Section: 23.1.3 [unord.req], TR1 6.3.1 [tr.unord.req] Status: Review - Submitter: Matt Austern Date: 2005-07-03

-

View other active issues in [unord.req].

-

View all other issues in [unord.req].

-

View all issues with Review status.

-

Discussion:

-

-Issue 371 deals with stability of multiset/multimap under insert and erase -(i.e. do they preserve the relative order in ranges of equal elements). -The same issue applies to unordered_multiset and unordered_multimap. -

-

[ -Moved to open (from review): There is no resolution. -]

- - -

[ -Toronto: We have a resolution now. Moved to Review. Some concern was noted -as to whether this conflicted with existing practice or not. An additional -concern was in specifying (partial) ordering for an unordered container. -]

- - - - -

Proposed resolution:

-

-Wording for the proposed resolution is taken from the equivalent text for associative containers. -

- -

-Change 23.1.3 [unord.req], Unordered associative containers, paragraph 6 to: -

- -

-An unordered associative container supports unique keys if it may -contain at most one element for each key. Otherwise, it supports equivalent -keys. unordered_set and unordered_map support -unique keys. unordered_multiset and unordered_multimap -support equivalent keys. In containers that support equivalent keys, elements -with equivalent keys are adjacent to each other. For -unordered_multiset -and unordered_multimap, insert and erase -preserve the relative ordering of equivalent elements. -

- -

-Change 23.1.3 [unord.req], Unordered associative containers, paragraph 8 to: -

- -
-

The elements of an unordered associative container are organized into -buckets. Keys with the same hash code appear in the same bucket. The number -of buckets is automatically increased as elements are added to an unordered -associative container, so that the average number of elements per bucket is kept -below a bound. Rehashing invalidates iterators, changes ordering between -elements, and changes which buckets elements appear in, but does not invalidate -pointers or references to elements. For unordered_multiset -and unordered_multimap, rehashing -preserves the relative ordering of equivalent elements.

-
- - - - - - -
-

522. Tuple doesn't define swap

-

Section: 20.3 [tuple], TR1 6.1 [tr.tuple] Status: Open - Submitter: Andy Koenig Date: 2005-07-03

-

View all issues with Open status.

-

Discussion:

-

-Tuple doesn't define swap(). It should. -

-

[ -Berlin: Doug to provide wording. -]

- -

[ -Batavia: Howard to provide wording. -]

- -

[ -Toronto: Howard to provide wording (really this time). -]

- - - - -

Proposed resolution:

- - - - - -
-

523. regex case-insensitive character ranges are unimplementable as specified

-

Section: 28 [re] Status: Open - Submitter: Eric Niebler Date: 2005-07-01

-

View all other issues in [re].

-

View all issues with Open status.

-

Discussion:

-

-A problem with TR1 regex is currently being discussed on the Boost -developers list. It involves the handling of case-insensitive matching -of character ranges such as [Z-a]. The proper behavior (according to the -ECMAScript standard) is unimplementable given the current specification -of the TR1 regex_traits<> class template. John Maddock, the author of -the TR1 regex proposal, agrees there is a problem. The full discussion -can be found at http://lists.boost.org/boost/2005/06/28850.php (first -message copied below). We don't have any recommendations as yet. -

-

--- Begin original message -- -

-

-The situation of interest is described in the ECMAScript specification -(ECMA-262), section 15.10.2.15: -

-

-"Even if the pattern ignores case, the case of the two ends of a range -is significant in determining which characters belong to the range. -Thus, for example, the pattern /[E-F]/i matches only the letters E, F, -e, and f, while the pattern /[E-f]/i matches all upper and lower-case -ASCII letters as well as the symbols [, \, ], ^, _, and `." -

-

-A more interesting case is what should happen when doing a -case-insentitive match on a range such as [Z-a]. It should match z, Z, -a, A and the symbols [, \, ], ^, _, and `. This is not what happens with -Boost.Regex (it throws an exception from the regex constructor). -

-

-The tough pill to swallow is that, given the specification in TR1, I -don't think there is any effective way to handle this situation. -According to the spec, case-insensitivity is handled with -regex_traits<>::translate_nocase(CharT) -- two characters are equivalent -if they compare equal after both are sent through the translate_nocase -function. But I don't see any way of using this translation function to -make character ranges case-insensitive. Consider the difficulty of -detecting whether "z" is in the range [Z-a]. Applying the transformation -to "z" has no effect (it is essentially std::tolower). And we're not -allowed to apply the transformation to the ends of the range, because as -ECMA-262 says, "the case of the two ends of a range is significant." -

-

-So AFAICT, TR1 regex is just broken, as is Boost.Regex. One possible fix -is to redefine translate_nocase to return a string_type containing all -the characters that should compare equal to the specified character. But -this function is hard to implement for Unicode, and it doesn't play nice -with the existing ctype facet. What a mess! -

-

--- End original message -- -

- -

[ -John Maddock adds: -]

- - -

-One small correction, I have since found that ICU's regex package does -implement this correctly, using a similar mechanism to the current -TR1.Regex. -

-

-Given an expression [c1-c2] that is compiled as case insensitive it: -

-

-Enumerates every character in the range c1 to c2 and converts it to it's -case folded equivalent. That case folded character is then used a key to a -table of equivalence classes, and each member of the class is added to the -list of possible matches supported by the character-class. This second step -isn't possible with our current traits class design, but isn't necessary if -the input text is also converted to a case-folded equivalent on the fly. -

-

-ICU applies similar brute force mechanisms to character classes such as -[[:lower:]] and [[:word:]], however these are at least cached, so the impact -is less noticeable in this case. -

-

-Quick and dirty performance comparisons show that expressions such as -"[X-\\x{fff0}]+" are indeed very slow to compile with ICU (about 200 times -slower than a "normal" expression). For an application that uses a lot of -regexes this could have a noticeable performance impact. ICU also has an -advantage in that it knows the range of valid characters codes: code points -outside that range are assumed not to require enumeration, as they can not -be part of any equivalence class. I presume that if we want the TR1.Regex -to work with arbitrarily large character sets enumeration really does become -impractical. -

-

-Finally note that Unicode has: -

-

-Three cases (upper, lower and title). -One to many, and many to one case transformations. -Character that have context sensitive case translations - for example an -uppercase sigma has two different lowercase forms - the form chosen depends -on context(is it end of a word or not), a caseless match for an upper case -sigma should match either of the lower case forms, which is why case folding -is often approximated by tolower(toupper(c)). -

-

-Probably we need some way to enumerate character equivalence classes, -including digraphs (either as a result or an input), and some way to tell -whether the next character pair is a valid digraph in the current locale. -

-

-Hoping this doesn't make this even more complex that it was already, -

- -

[ -Portland: Alisdair: Detect as invalid, throw an exception. -Pete: Possible general problem with case insensitive ranges. -]

- - - - -

Proposed resolution:

- - - - - -
-

527. tr1::bind has lost its Throws clause

-

Section: 20.5.11.1.3 [func.bind.bind], TR1 3.6.3 [tr.func.bind.bind] Status: Open - Submitter: Peter Dimov Date: 2005-10-01

-

View all issues with Open status.

-

Discussion:

-

-The original bind proposal gives the guarantee that tr1::bind(f, t1, -..., tN) does not throw when the copy constructors of f, t1, ..., tN -don't. -

- -

-This guarantee is not present in the final version of TR1. -

- -

-I'm pretty certain that we never removed it on purpose. Editorial omission? :-) -

- -

[ -Berlin: not quite editorial, needs proposed wording. -]

- -

[ -Batavia: Doug to translate wording to variadic templates. -]

- - -

[ -Toronto: We agree but aren't quite happy with the wording. The "t"'s no -longer refer to anything. Alan to provide improved wording. -]

- - - - -

Proposed resolution:

-

-In 20.5.10.1.3 [lib.func.bind.bind] ([tr.func.bind.bind]), add a new paragraph after p2: -

-

-Throws: Nothing unless one of the copy constructors of f, t1, t2, ..., tN -throws an exception. -

- -

-Add a new paragraph after p4: -

-

-Throws: nothing unless one of the copy constructors of f, t1, t2, ..., tN -throws an exception. -

- - - - - -
-

529. The standard encourages redundant and confusing preconditions

-

Section: 17.4.3.8 [res.on.required] Status: Open - Submitter: David Abrahams Date: 2005-10-25

-

View all issues with Open status.

-

Discussion:

-

-17.4.3.8/1 says: -

- -

-Violation of the preconditions specified in a function's -Required behavior: paragraph results in undefined behavior unless the -function's Throws: paragraph specifies throwing an exception when the -precondition is violated. -

- -

-This implies that a precondition violation can lead to defined -behavior. That conflicts with the only reasonable definition of -precondition: that a violation leads to undefined behavior. Any other -definition muddies the waters when it comes to analyzing program -correctness, because precondition violations may be routinely done in -correct code (e.g. you can use std::vector::at with the full -expectation that you'll get an exception when your index is out of -range, catch the exception, and continue). Not only is it a bad -example to set, but it encourages needless complication and redundancy -in the standard. For example: -

- -
  21 Strings library 
-  21.3.3 basic_string capacity
-
-  void resize(size_type n, charT c);
-
-  5 Requires: n <= max_size()
-  6 Throws: length_error if n > max_size().
-  7 Effects: Alters the length of the string designated by *this as follows:
-
- -

-The Requires clause is entirely redundant and can be dropped. We -could make that simplifying change (and many others like it) even -without changing 17.4.3.8/1; the wording there just seems to encourage -the redundant and error-prone Requires: clause. -

- -

[ -Batavia: Alan and Pete to work. -]

- - - -

Proposed resolution:

-

-1. Change 17.4.3.8/1 to read: -

- -

-Violation of the preconditions specified in a function's -Required behavior: paragraph results in undefined behavior -unless the function's Throws: paragraph specifies throwing -an exception when the precondition is violated. -

- -

-2. Go through and remove redundant Requires: clauses. Specifics to be - provided by Dave A. -

- -

[ -Berlin: The LWG requests a detailed survey of part 2 of the proposed resolution. -]

- - -

[ -Alan provided the survey -N2121. -]

- - - - - - - -
-

539. partial_sum and adjacent_difference should mention requirements

-

Section: 26.6.3 [partial.sum] Status: Open - Submitter: Marc Schoolderman Date: 2006-02-06

-

View all issues with Open status.

-

Discussion:

-

-There are some problems in the definition of partial_sum and -adjacent_difference in 26.4 [lib.numeric.ops] -

- -

-Unlike accumulate and inner_product, these functions are not -parametrized on a "type T", instead, 26.4.3 [lib.partial.sum] simply -specifies the effects clause as; -

- -

-Assigns to every element referred to by iterator i in the range -[result,result + (last - first)) a value correspondingly equal to -

-
((...(* first + *( first + 1)) + ...) + *( first + ( i - result )))
-
-
- -

-And similarly for BinaryOperation. Using just this definition, it seems -logical to expect that: -

- - -
char i_array[4] = { 100, 100, 100, 100 };
-int  o_array[4];
-
-std::partial_sum(i_array, i_array+4, o_array);
-
- -

-Is equivalent to -

- -
int o_array[4] = { 100, 100+100, 100+100+100, 100+100+100+100 };
-
- -

-i.e. 100, 200, 300, 400, with addition happening in the result type, -int. -

- -

-Yet all implementations I have tested produce 100, -56, 44, -112, -because they are using an accumulator of the InputIterator's -value_type, which in this case is char, not int. -

- -

-The issue becomes more noticeable when the result of the expression *i + -*(i+1) or binary_op(*i, *i-1) can't be converted to the -value_type. In a contrived example: -

- -
enum not_int { x = 1, y = 2 };
-...
-not_int e_array[4] = { x, x, y, y };
-std::partial_sum(e_array, e_array+4, o_array);
-
- -

-Is it the intent that the operations happen in the input type, or in -the result type? -

- -

-If the intent is that operations happen in the result type, something -like this should be added to the "Requires" clause of 26.4.3/4 -[lib.partial.sum]: -

- -

-The type of *i + *(i+1) or binary_op(*i, *(i+1)) shall meet the -requirements of CopyConstructible (20.1.3) and Assignable -(23.1) types. -

- -

-(As also required for T in 26.4.1 [lib.accumulate] and 26.4.2 -[lib.inner.product].) -

- -

-The "auto initializer" feature proposed in -N1894 -is not required to -implement partial_sum this way. The 'narrowing' behaviour can still be -obtained by using the std::plus<> function object. -

- -

-If the intent is that operations happen in the input type, then -something like this should be added instead; -

- -

-The type of *first shall meet the requirements of -CopyConstructible (20.1.3) and Assignable (23.1) types. -The result of *i + *(i+1) or binary_op(*i, *(i+1)) shall be -convertible to this type. -

- -

-The 'widening' behaviour can then be obtained by writing a custom proxy -iterator, which is somewhat involved. -

- -

-In both cases, the semantics should probably be clarified. -

- -

-26.4.4 [lib.adjacent.difference] is similarly underspecified, although -all implementations seem to perform operations in the 'result' type: -

- -
unsigned char i_array[4] = { 4, 3, 2, 1 };
-int o_array[4];
-
-std::adjacent_difference(i_array, i_array+4, o_array);
-
- -

-o_array is 4, -1, -1, -1 as expected, not 4, 255, 255, 255. -

- -

-In any case, adjacent_difference doesn't mention the requirements on the -value_type; it can be brought in line with the rest of 26.4 -[lib.numeric.ops] by adding the following to 26.4.4/2 -[lib.adjacent.difference]: -

- -

-The type of *first shall meet the requirements of -CopyConstructible (20.1.3) and Assignable (23.1) types." -

-

[ -Berlin: Giving output iterator's value_types very controversial. Suggestion of -adding signatures to allow user to specify "accumulator". -]

- - - - -

Proposed resolution:

-

-

- - - - - -
-

546. _Longlong and _ULonglong are integer types

-

Section: TR1 5.1.1 [tr.rand.req] Status: Open - Submitter: Matt Austern Date: 2006-01-10

-

View all issues with Open status.

-

Discussion:

-

-The TR sneaks in two new integer types, _Longlong and _Ulonglong, in [tr.c99]. -The rest of the TR should use that type. I believe this affects two places. -First, the random number requirements, 5.1.1/10-11, lists all of the types with -which template parameters named IntType and UIntType may be instantiated. -_Longlong (or "long long", assuming it is added to C++0x) should be added to the -IntType list, and UIntType (again, or "unsigned long long") should be added to -the UIntType list. Second, 6.3.2 lists the types for which hash<> is -required to be instantiable. _Longlong and _Ulonglong should be added to that -list, so that people may use long long as a hash key. -

- - -

Proposed resolution:

-

-

- - - - - -
-

550. What should the return type of pow(float,int) be?

-

Section: 26.7 [c.math] Status: Open - Submitter: Howard Hinnant Date: 2006-01-12

-

View other active issues in [c.math].

-

View all other issues in [c.math].

-

View all issues with Open status.

-

Discussion:

-

-Assuming we adopt the -C -compatibility package from C99 what should be the return type of the -following signature be: -

-
?  pow(float, int);
-
-

-C++03 says that the return type should be float. - -TR1 and C90/99 say the return type should be double. This can put -clients into a situation where C++03 provides answers that are not as high -quality as C90/C99/TR1. For example: -

-
#include <math.h>
-
-int main()
-{
-    float x = 2080703.375F;
-    double y = pow(x, 2);
-}
-
-

-Assuming an IEEE 32 bit float and IEEE 64 bit double, C90/C99/TR1 all suggest: -

- -
y = 4329326534736.390625
-
- -

-which is exactly right. While C++98/C++03 demands: -

- -
y = 4329326510080.
-
- -

-which is only approximately right. -

- -

-I recommend that C++0X adopt the mixed mode arithmetic already adopted by -Fortran, C and TR1 and make the return type of pow(float,int) be -double. -

- -

[ -Kona (2007): Other functions that are affected by this issue include -ldexp, scalbln, and scalbn. We also believe that there is a typo in -26.7/10: float nexttoward(float, long double); [sic] should be float -nexttoward(float, float); Proposed Disposition: Review (the proposed -resolution appears above, rather than below, the heading "Proposed -resolution") -]

- - -

[ -

-Howard, post Kona: -

-
-

-Unfortunately I strongly disagree with a part of the resolution -from Kona. I am moving from New to Open instead of to Review because I do not believe -we have consensus on the intent of the resolution. -

-

-This issue does not include ldexp, scalbln, and scalbn because -the second integral parameter in each of these signatures (from C99) is not a -generic parameter according to C99 7.22p2. The corresponding C++ overloads are -intended (as far as I know) to correspond directly to C99's definition of generic parameter. -

-

-For similar reasons, I do not believe that the second long double parameter of -nexttoward, nor the return type of this function, is in error. I believe the -correct signature is: -

-
-
float nexttoward(float, long double);
-
-
-

-which is what both the C++0X working paper and C99 state (as far as I currently understand). -

-

-This is really only about pow(float, int). And this is because C++98 took one -route (with pow only) and C99 took another (with many math functions in <tgmath.h>. -The proposed resolution basically says: C++98 got it wrong and C99 got it right; let's go with C99. -

-
-] - - - - -

Proposed resolution:

-

-Change 26.7 [c.math] -

- -
float pow(float, float); 
-float double pow(float, int);
-
- - - - - - -
-

556. is Compare a BinaryPredicate?

-

Section: 25.3 [alg.sorting] Status: Open - Submitter: Martin Sebor Date: 2006-02-05

-

View all other issues in [alg.sorting].

-

View all issues with Open status.

-

Discussion:

-

-In 25, p8 we allow BinaryPredicates to return a type that's convertible -to bool but need not actually be bool. That allows predicates to return -things like proxies and requires that implementations be careful about -what kinds of expressions they use the result of the predicate in (e.g., -the expression in if (!pred(a, b)) need not be well-formed since the -negation operator may be inaccessible or return a type that's not -convertible to bool). -

-

-Here's the text for reference: -

-

- ...if an algorithm takes BinaryPredicate binary_pred as its argument - and first1 and first2 as its iterator arguments, it should work - correctly in the construct if (binary_pred(*first1, first2)){...}. -

- -

-In 25.3, p2 we require that the Compare function object return true -of false, which would seem to preclude such proxies. The relevant text -is here: -

-

- Compare is used as a function object which returns true if the first - argument is less than the second, and false otherwise... -

- - -

Proposed resolution:

-

-I think we could fix this by rewording 25.3, p2 to read somthing like: -

-

--2- Compare is used as a function object which returns -true if the first argument a BinaryPredicate. The -return value of the function call operator applied to an object of type -Compare, when converted to type bool, yields true -if the first argument of the call is less than the second, and -false otherwise. Compare comp is used throughout for -algorithms assuming an ordering relation. It is assumed that comp -will not apply any non-constant function through the dereferenced iterator. -

- - -

[ -Portland: Jack to define "convertible to bool" such that short circuiting isn't -destroyed. -]

- - - - - -
-

557. TR1: div(_Longlong, _Longlong) vs div(intmax_t, intmax_t)

-

Section: 18.3 [cstdint], TR1 8.22 [tr.c99.cstdint] Status: Open - Submitter: Paolo Carlini Date: 2006-02-06

-

View all other issues in [cstdint].

-

View all issues with Open status.

-

Discussion:

-

-I'm seeing a problem with such overloads: when, _Longlong == intmax_t == -long long we end up, essentially, with the same arguments and different -return types (lldiv_t and imaxdiv_t, respectively). Similar issue with -abs(_Longlong) and abs(intmax_t), of course. -

-

-Comparing sections 8.25 and 8.11, I see an important difference, -however: 8.25.3 and 8.25.4 carefully describe div and abs for _Longlong -types (rightfully, because not moved over directly from C99), whereas -there is no equivalent in 8.11: the abs and div overloads for intmax_t -types appear only in the synopsis and are not described anywhere, in -particular no mention in 8.11.2 (at variance with 8.25.2). -

-

-I'm wondering whether we really, really, want div and abs for intmax_t... -

- - - -

Proposed resolution:

- - - -

[ -Portland: no consensus. -]

- - -

Rationale:

-

[ -Batavia, Bill: The <cstdint> synopsis in TR1 8.11.1 [tr.c99.cinttypes.syn] contains: -]

- -
intmax_t imaxabs(intmax_t i);
-intmax_t abs(intmax_t i);
-
-imaxdiv_t imaxdiv(intmax_t numer, intmax_t denom);
-imaxdiv_t div(intmax_t numer, intmax_t denom);
-
- -

[ -and in TR1 8.11.2 [tr.c99.cinttypes.def]: -]

- - -

-The header defines all functions, types, and macros the same as C99 -subclause 7.8. -

- -

[ -This is as much definition as we give for most other C99 functions, -so nothing need change. We might, however, choose to add the footnote: -]

- - -

-[Note: These overloads for abs and div may well be equivalent to -those that take long long arguments. If so, the implementation is -responsible for avoiding conflicting declarations. -- end note] -

- - - - - - -
-

561. inserter overly generic

-

Section: 24.4.2.6.5 [inserter] Status: Ready - Submitter: Howard Hinnant Date: 2006-02-21

-

View all issues with Ready status.

-

Discussion:

-

-The declaration of std::inserter is: -

- -
template <class Container, class Iterator>
-insert_iterator<Container>
-inserter(Container& x, Iterator i);
-
- -

-The template parameter Iterator in this function is completely unrelated -to the template parameter Container when it doesn't need to be. This -causes the code to be overly generic. That is, any type at all can be deduced -as Iterator, whether or not it makes sense. Now the same is true of -Container. However, for every free (unconstrained) template parameter -one has in a signature, the opportunity for a mistaken binding grows geometrically. -

- -

-It would be much better if inserter had the following signature instead: -

- -
template <class Container>
-insert_iterator<Container>
-inserter(Container& x, typename Container::iterator i);
-
- -

-Now there is only one free template parameter. And the second argument to -inserter must be implicitly convertible to the container's iterator, -else the call will not be a viable overload (allowing other functions in the -overload set to take precedence). Furthermore, the first parameter must have a -nested type named iterator, or again the binding to std::inserter -is not viable. Contrast this with the current situation -where any type can bind to Container or Iterator and those -types need not be anything closely related to containers or iterators. -

- -

-This can adversely impact well written code. Consider: -

- -
#include <iterator>
-#include <string>
-
-namespace my
-{
-
-template <class String>
-struct my_type {};
-
-struct my_container
-{
-template <class String>
-void push_back(const my_type<String>&);
-};
-
-template <class String>
-void inserter(const my_type<String>& m, my_container& c) {c.push_back(m);}
-
-}  // my
-
-int main()
-{
-    my::my_container c;
-    my::my_type<std::string> m;
-    inserter(m, c);
-}
-
- -

-Today this code fails because the call to inserter binds to -std::inserter instead of to my::inserter. However with the -proposed change std::inserter will no longer be a viable function which -leaves only my::inserter in the overload resolution set. Everything -works as the client intends. -

- -

-To make matters a little more insidious, the above example works today if you -simply change the first argument to an rvalue: -

- -
    inserter(my::my_type(), c);
-
- -

-It will also work if instantiated with some string type other than -std::string (or any other std type). It will also work if -<iterator> happens to not get included. -

- -

-And it will fail again for such inocuous reaons as my_type or -my_container privately deriving from any std type. -

- -

-It seems unfortunate that such simple changes in the client's code can result -in such radically differing behavior. -

- - - -

Proposed resolution:

-

-Change 24.2: -

- -

-24.2 Header <iterator> synopsis -

-
...
-template <class Container, class Iterator>
-   insert_iterator<Container> inserter(Container& x, Iterator typename Container::iterator i);
-...
-
-
- -

-Change 24.4.2.5: -

- -

-24.4.2.5 Class template insert_iterator

-
...
-template <class Container, class Iterator>
-   insert_iterator<Container> inserter(Container& x, Iterator typename Container::iterator i);
-...
-
-
- -

-Change 24.4.2.6.5: -

- -
-

-24.4.2.6.5 inserter -

-
template <class Container, class Inserter>
-   insert_iterator<Container> inserter(Container& x, Inserter typename Container::iterator i);
-
-

--1- Returns: insert_iterator<Container>(x,typename Container::iterator(i)). -

-
- - - -

[ -Kona (2007): This issue will probably be addressed as a part of the -concepts overhaul of the library anyway, but the proposed resolution is -correct in the absence of concepts. Proposed Disposition: Ready -]

- - - - - -
-

562. stringbuf ctor inefficient

-

Section: 27.7 [string.streams] Status: Ready - Submitter: Martin Sebor Date: 2006-02-23

-

View all other issues in [string.streams].

-

View all issues with Ready status.

-

Discussion:

-

- -For better efficiency, the requirement on the stringbuf ctor that -takes a string argument should be loosened up to let it set -epptr() beyond just one past the last initialized -character just like overflow() has been changed to be -allowed to do (see issue 432). That way the first call to -sputc() on an object won't necessarily cause a call to -overflow. The corresponding change should be made to the -string overload of the str() member function. - -

- - -

Proposed resolution:

-

- -Change 27.7.1.1, p3 of the Working Draft, N1804, as follows: - -

- -
explicit basic_stringbuf(const basic_string<charT,traits,Allocator>& str,
-               ios_base::openmode which = ios_base::in | ios_base::out);
-
- -

--3- Effects: Constructs an object of class basic_stringbuf, -initializing the base class with basic_streambuf() -(27.5.2.1), and initializing mode with which. -Then calls str(s). copies the content of -str into the basic_stringbuf underlying character -sequence. If which & ios_base::out is true, initializes the -output sequence such that pbase() points to the first underlying -character, epptr() points one past the last underlying character, and -pptr() is equal to epptr() if which & ios_base::ate -is true, otherwise pptr() is equal to pbase(). If -which & ios_base::in is true, initializes the input sequence such -that eback() and gptr() point to the first underlying -character and egptr() points one past the last underlying character. -

-
- -

- -Change the Effects clause of the str() in 27.7.1.2, p2 to -read: - -

-
-

--2- Effects: Copies the contents of s into the -basic_stringbuf underlying character sequence and -initializes the input and output sequences according to mode. -If -mode & ios_base::out is true, initializes the output -sequence such that pbase() points to the first underlying character, -epptr() points one past the last underlying character, and pptr() -is equal to epptr() if mode & ios_base::in -is true, otherwise pptr() is equal to pbase(). If -mode & ios_base::in is true, initializes the input sequence -such that eback() and gptr() point to the first underlying -character and egptr() points one past the last underlying character. -

- -

- --3- Postconditions: If mode & ios_base::out is true, -pbase() points to the first underlying character and -(epptr() >= pbase() + s.size()) holds; in addition, if -mode & ios_base::in is true, (pptr() == pbase() -+ s.data()) holds, otherwise (pptr() == pbase()) -is true. If mode & ios_base::in is true, -eback() points to the first underlying character, and -(gptr() == eback()) and (egptr() == eback() + -s.size()) hold. - -

-
- - -

[ -Kona (2007) Moved to Ready. -]

- - - - - -
-

563. stringbuf seeking from end

-

Section: 27.7.1.4 [stringbuf.virtuals] Status: Ready - Submitter: Martin Sebor Date: 2006-02-23

-

View other active issues in [stringbuf.virtuals].

-

View all other issues in [stringbuf.virtuals].

-

View all issues with Ready status.

-

Discussion:

-

-According to Table 92 (unchanged by issue 432), when (way == -end) the newoff value in out mode is computed as -the difference between epptr() and pbase(). -

-

- -This value isn't meaningful unless the value of epptr() -can be precisely controlled by a program. That used to be possible -until we accepted the resolution of issue 432, but since then the -requirements on overflow() have been relaxed to allow it -to make more than 1 write position available (i.e., by setting -epptr() to some unspecified value past -pptr()). So after the first call to -overflow() positioning the output sequence relative to -end will have unspecified results. - -

-

- -In addition, in in|out mode, since (egptr() == -epptr()) need not hold, there are two different possible values -for newoff: epptr() - pbase() and -egptr() - eback(). - -

- - -

Proposed resolution:

-

- -Change the newoff column in the last row of Table 94 to -read: - -

-

- -the end high mark pointer minus the beginning -pointer (xend high_mark - xbeg). - -

- - -

[ -Kona (2007) Moved to Ready. -]

- - - - - -
-

564. stringbuf seekpos underspecified

-

Section: 27.7.1.4 [stringbuf.virtuals] Status: Open - Submitter: Martin Sebor Date: 2006-02-23

-

View other active issues in [stringbuf.virtuals].

-

View all other issues in [stringbuf.virtuals].

-

View all issues with Open status.

-

Discussion:

-

-The effects of the seekpos() member function of -basic_stringbuf simply say that the function positions -the input and/or output sequences but fail to spell out exactly -how. This is in contrast to the detail in which seekoff() -is described. -

- - -

Proposed resolution:

-

- -Change 27.7.1.3, p13 to read: - -

-
-

--13- Effects: Same as seekoff(off_type(sp), ios_base::beg, -which). Alters the stream position within the controlled sequences, -if possible, to correspond to the stream position stored in sp -(as described below). -

-
    -
  • If (which & ios_base::in) != 0, positions the input sequence.
  • -
  • If (which & ios_base::out) != 0, positions the output sequence.
  • -
  • If sp is an invalid stream position, or if the function -positions neither sequence, the positioning operation fails. If sp -has not been obtained by a previous successful call to one of the positioning -functions (seekoff, seekpos, tellg, tellp) -the effect is undefined.
  • -
-
- - -

[ -Kona (2007): A pos_type is a position in a stream by -definition, so there is no ambiguity as to what it means. Proposed -Disposition: NAD -]

- - -

[ -Post-Kona Martin adds: -I'm afraid I disagree -with the Kona '07 rationale for marking it NAD. The only text -that describes precisely what it means to position the input -or output sequence is in seekoff(). The seekpos() Effects -clause is inadequate in comparison and the proposed resolution -plugs the hole by specifying seekpos() in terms of seekoff(). -]

- - - - - -
-

565. xsputn inefficient

-

Section: 27.5.2.4.5 [streambuf.virt.put] Status: Open - Submitter: Martin Sebor Date: 2006-02-23

-

View all issues with Open status.

-

Discussion:

-

- -streambuf::xsputn() is specified to have the effect of -"writing up to n characters to the output sequence as if by -repeated calls to sputc(c)." - -

-

- -Since sputc() is required to call overflow() when -(pptr() == epptr()) is true, strictly speaking -xsputn() should do the same. However, doing so would be -suboptimal in some interesting cases, such as in unbuffered mode or -when the buffer is basic_stringbuf. - -

-

- -Assuming calling overflow() is not really intended to be -required and the wording is simply meant to describe the general -effect of appending to the end of the sequence it would be worthwhile -to mention in xsputn() that the function is not actually -required to cause a call to overflow(). - -

- - -

Proposed resolution:

-

- -Add the following sentence to the xsputn() Effects clause in -27.5.2.4.5, p1 (N1804): - -

-
-

--1- Effects: Writes up to n characters to the output -sequence as if by repeated calls to sputc(c). The characters -written are obtained from successive elements of the array whose first element -is designated by s. Writing stops when either n -characters have been written or a call to sputc(c) would return -traits::eof(). It is uspecified whether the function calls -overflow() when (pptr() == epptr()) becomes true or whether -it achieves the same effects by other means. -

-
-

- -In addition, I suggest to add a footnote to this function with the -same text as Footnote 292 to make it extra clear that derived classes -are permitted to override xsputn() for efficiency. - -

- - -

[ -Kona (2007): We want to permit a streambuf that streams output directly -to a device without making calls to sputc or overflow. We believe that -has always been the intention of the committee. We believe that the -proposed wording doesn't accomplish that. Proposed Disposition: Open -]

- - - - - -
-

567. streambuf inserter and extractor should be unformatted

-

Section: 27.6 [iostream.format] Status: Ready - Submitter: Martin Sebor Date: 2006-02-25

-

View other active issues in [iostream.format].

-

View all other issues in [iostream.format].

-

View all issues with Ready status.

-

Discussion:

-

- -Issue 60 explicitly made the extractor and inserter operators that -take a basic_streambuf* argument formatted input and output -functions, respectively. I believe that's wrong, certainly in the -case of the extractor, since formatted functions begin by extracting -and discarding whitespace. The extractor should not discard any -characters. - -

- - -

Proposed resolution:

-

- -I propose to change each operator to behave as unformatted input and -output function, respectively. The changes below are relative to the -working draft document number N1804. - -

-

- -Specifically, change 27.6.1.2.3, p14 as follows: - -

- -
-

- -Effects: Behaves as an unformatted input function -(as described in 27.6.1.2.127.6.1.3, paragraph -1). - -

-
-

- -And change 27.6.2.5.3, p7 as follows: - -

- -
-

- -Effects: Behaves as an unformatted output function -(as described in 27.6.2.5.127.6.2.6, paragraph -1). - -

-
- - -

[ -Kona (2007): Proposed Disposition: Ready -]

- - - - - -
-

568. log2 overloads missing

-

Section: TR1 8.16.4 [tr.c99.cmath.over] Status: New - Submitter: Paolo Carlini Date: 2006-03-07

-

View all issues with New status.

-

Discussion:

-

-log2 is missing from the list of "additional overloads" in TR1 8.16.4 [tr.c99.cmath.over] p1. -

- -

-Hinnant: This is a TR1 issue only. It is fixed in the current (N2135) WD. -

- - -

Proposed resolution:

-

-Add log2 to the list of functions in TR1 8.16.4 [tr.c99.cmath.over] p1. -

- - - - - -
-

570. Request adding additional explicit specializations of char_traits

-

Section: 21.1 [char.traits] Status: Open - Submitter: Jack Reeves Date: 2006-04-06

-

View all issues with Open status.

-

Discussion:

-

-Currently, the Standard Library specifies only a declaration for template class -char_traits<> and requires the implementation provide two explicit -specializations: char_traits<char> and char_traits<wchar_t>. I feel the Standard -should require explicit specializations for all built-in character types, i.e. -char, wchar_t, unsigned char, and signed char. -

-

-I have put together a paper -(N1985) -that describes this in more detail and -includes all the necessary wording. -

-

[ -Portland: Jack will rewrite -N1985 -to propose a primary template that will work with other integral types. -]

- -

[ -Toronto: issue has grown with addition of char16_t and char32_t. -]

- - - -

Proposed resolution:

- - - - - -
-

573. C++0x file positioning should handle modern file sizes

-

Section: 27.4.3 [fpos] Status: Open - Submitter: Beman Dawes Date: 2006-04-12

-

View all other issues in [fpos].

-

View all issues with Open status.

-

Discussion:

-

-There are two deficiencies related to file sizes: -

-
    -
  1. It doesn't appear that the Standard Library is specified in - a way that handles modern file sizes, which are often too - large to be represented by an unsigned long.
  2. - -
  3. The std::fpos class does not currently have the ability to - set/get file positions.
  4. -
-

-The Dinkumware implementation of the Standard Library as shipped with the Microsoft compiler copes with these issues by: -

-
    -
  1. Defining fpos_t be long long, which is large enough to - represent any file position likely in the foreseeable future.
  2. - -
  3. Adding member functions to class fpos. For example, -
    fpos_t seekpos() const;
    -
    -
  4. -
-

-Because there are so many types relating to file positions and offsets (fpos_t, -fpos, pos_type, off_type, streamoff, streamsize, streampos, wstreampos, and -perhaps more), it is difficult to know if the Dinkumware extensions are -sufficient. But they seem a useful starting place for discussions, and they do -represent existing practice. -

- -

[ -Kona (2007): We need a paper. It would be nice if someone proposed -clarifications to the definitions of pos_type and off_type. Currently -these definitions are horrible. Proposed Disposition: Open -]

- - - -

Proposed resolution:

-

-

- - - - - -
-

574. DR 369 Contradicts Text

-

Section: 27.3 [iostream.objects] Status: Review - Submitter: Pete Becker Date: 2006-04-18

-

View all other issues in [iostream.objects].

-

View all issues with Review status.

-

Discussion:

-

-lib.iostream.objects requires that the standard stream objects are never -destroyed, and it requires that they be destroyed. -

-

-DR 369 adds words to say that we really mean for ios_base::Init objects to force -construction of standard stream objects. It ends, though, with the phrase "these -stream objects shall be destroyed after the destruction of dynamically ...". -However, the rule for destruction is stated in the standard: "The objects are -not destroyed during program execution." -

- - -

Proposed resolution:

-

-Change 27.3 [iostream.objects]/1: -

- -
-

--2- The objects are constructed and the associations are established at -some time prior to or during the first time an object of class -ios_base::Init is constructed, and in any case before the body of main -begins execution.290) The objects are not destroyed during program -execution.291) If a translation unit includes <iostream&t; or explicitly -constructs an ios_base::Init object, these stream objects shall be -constructed before dynamic initialization of non-local objects defined -later in that translation unit, and these stream objects shall be -destroyed after the destruction of dynamically initialized non-local -objects defined later in that translation unit. -

-
- - -

[ -Kona (2007): From 27.3 [iostream.objects]/2, strike the words "...and these stream objects -shall be destroyed after the destruction of dynamically initialized -non-local objects defined later in that translation unit." Proposed -Disposition: Review -]

- - - - - -
-

579. erase(iterator) for unordered containers should not return an iterator

-

Section: 23.1.3 [unord.req] Status: Open - Submitter: Joaquín M López Muñoz Date: 2006-06-13

-

View other active issues in [unord.req].

-

View all other issues in [unord.req].

-

View all issues with Open status.

-

Discussion:

-

-See -N2023 -for full discussion. -

- - -

Proposed resolution:

-

-Option 1: -

- -

-The problem can be eliminated by omitting the requirement that a.erase(q) return an -iterator. This is, however, in contrast with the equivalent requirements for other -standard containers. -

- -

-Option 2: -

- -

-a.erase(q) can be made to compute the next iterator only when explicitly requested: -the technique consists in returning a proxy object implicitly convertible to iterator, so -that -

- -
iterator q1=a.erase(q);
-
- -

-works as expected, while -

- -
a.erase(q);
-
- -

-does not ever invoke the conversion-to-iterator operator, thus avoiding the associated -computation. To allow this technique, some sections of TR1 along the line "return value -is an iterator..." should be changed to "return value is an unspecified object implicitly -convertible to an iterator..." Although this trick is expected to work transparently, it can -have some collateral effects when the expression a.erase(q) is used inside generic -code. -

- - - -

Rationale:

-

-N2023 -was discussed in Portland and the consensus was that there appears to be -no need for either change proposed in the paper. The consensus opinion -was that since the iterator could serve as its own proxy, there appears -to be no need for the change. In general, "converts to" is undesirable -because it interferes with template matching. -

- -

-Post Toronto: There does not at this time appear to be consensus with the Portland consensus. -

- - - - - -
-

580. unused allocator members

-

Section: 20.1.2 [allocator.requirements] Status: Open - Submitter: Martin Sebor Date: 2006-06-14

-

View other active issues in [allocator.requirements].

-

View all other issues in [allocator.requirements].

-

View all issues with Open status.

-

Duplicate of: 479

-

Discussion:

-

- -C++ Standard Library templates that take an allocator as an argument -are required to call the allocate() and -deallocate() members of the allocator object to obtain -storage. However, they do not appear to be required to call any other -allocator members such as construct(), -destroy(), address(), and -max_size(). This makes these allocator members less than -useful in portable programs. - -

-

- -It's unclear to me whether the absence of the requirement to use these -allocator members is an unintentional omission or a deliberate -choice. However, since the functions exist in the standard allocator -and since they are required to be provided by any user-defined -allocator I believe the standard ought to be clarified to explictly -specify whether programs should or should not be able to rely on -standard containers calling the functions. - -

-

- -I propose that all containers be required to make use of these -functions. - -

-

[ -Batavia: We support this resolution. Martin to provide wording. -]

- -

[ -pre-Oxford: Martin provided wording. -]

- - - -

Proposed resolution:

-       

- -Specifically, I propose to change 23.1 [container.requirements], -p9 as follows: - -       

-           
-

--9- Copy constructors  for all container types defined  in this clause -that   are  parametrized  on   Allocator  copy -anthe  allocator argument from  their respective -first parameters. - -All other  constructors for  these container types  take an -const  Allocator&  argument  (20.1.6),  an -allocator whose value_type is the same as the container's -value_type. - -A copy of this  argument isshall be used for any -memory  allocation and  deallocation performed, -by these  constructors and by all  member functions, during -the  lifetime  of each  container  object.   Allocation shall  be -performed  "as  if"  by  calling  the  allocate()  member -function on  a copy  of the allocator  object of the  appropriate type -New  Footnote),   and  deallocation  "as   if"  by  calling -deallocate() on  a copy of  the same allocator  object of -the corresponding type. - -A  copy of  this argument  shall also  be used  to  construct and -destroy objects whose lifetime  is managed by the container, including -but not  limited to those of  the container's value_type, -and  to  obtain  their  address.   All  objects  residing  in  storage -allocated by a  container's allocator shall be constructed  "as if" by -calling the construct() member  function on a copy of the -allocator object of  the appropriate type.  The same  objects shall be -destroyed "as if"  by calling destroy() on a  copy of the -same allocator object  of the same type.  The  address of such objects -shall be obtained "as if" by calling the address() member -function  on  a  copy  of  the allocator  object  of  the  appropriate -type. - -Finally, a copy  of this argument shall be  used by its container -object to determine  the maximum number of objects  of the container's -value_type the container may  store at the same time. The -container  member function max_size() -obtains  this number -from      the -     value -     returned      by -    a      call -     to -get_allocator().max_size(). - -In   all  container   types  defined   in  this   clause that  are -parametrized     on    Allocator,     the    member -get_allocator()     returns -    a     copy -    of     the -Allocator     object -    used     to -   construct     the -container.258) -

-

-New Footnote: This type  may be different from Allocator: -it     may    be -    derived    from -    Allocator    via -Allocator::rebind<U>::other   for  the  appropriate -type U. -

-           
-       

-The proposed wording seems cumbersome but I couldn't think of a better -way   to  describe   the -  requirement  that   containers  use -  their -Allocator  to manage  only objects  (regardless  of their -type)  that  persist  over  their  lifetimes  and  not,  for  example, -temporaries  created on the  stack. That  is, containers  shouldn't be -required  to  call  Allocator::construct(Allocator::allocate(1), -elem)  just to  construct a  temporary copy  of an  element, or -Allocator::destroy(Allocator::address(temp),     1)    to -destroy temporaries. - -       

- - -

[ -Howard: This same paragraph will need some work to accommodate 431. -]

- - -

[ -post Oxford: This would be rendered NAD Editorial by acceptance of -N2257. -]

- - - - - -
-

581. flush() not unformatted function

-

Section: 27.6.2.7 [ostream.unformatted] Status: Ready - Submitter: Martin Sebor Date: 2006-06-14

-

View all other issues in [ostream.unformatted].

-

View all issues with Ready status.

-

Discussion:

-

- -The resolution of issue 60 changed basic_ostream::flush() -so as not to require it to behave as an unformatted output function. -That has at least two in my opinion problematic consequences: - -

-

- -First, flush() now calls rdbuf()->pubsync() -unconditionally, without regard to the state of the stream. I can't -think of any reason why flush() should behave differently -from the vast majority of stream functions in this respect. - -

-

- -Second, flush() is not required to catch exceptions from -pubsync() or set badbit in response to such -events. That doesn't seem right either, as most other stream functions -do so. - -

- - -

Proposed resolution:

-

- -I propose to revert the resolution of issue 60 with respect to -flush(). Specifically, I propose to change 27.6.2.6, p7 -as follows: - -

- -

-Effects: Behaves as an unformatted output function (as described -in 27.6.2.6, paragraph 1). If rdbuf() is not a null -pointer, constructs a sentry object. If this object returns -true when converted to a value of type bool the function -calls rdbuf()->pubsync(). If that function returns --1 calls setstate(badbit) (which may throw -ios_base::failure (27.4.4.3)). Otherwise, if the -sentry object returns false, does nothing.Does -not behave as an unformatted output function (as described in -27.6.2.6, paragraph 1). -

- - - -

[ -Kona (2007): Proposed Disposition: Ready -]

- - - - - -
-

582. specialized algorithms and volatile storage

-

Section: 20.6.4.1 [uninitialized.copy] Status: Open - Submitter: Martin Sebor Date: 2006-06-14

-

View other active issues in [uninitialized.copy].

-

View all other issues in [uninitialized.copy].

-

View all issues with Open status.

-

Discussion:

-

- -The specialized algorithms [lib.specialized.algorithms] are specified -as having the general effect of invoking the following expression: - -

-
-new (static_cast<void*>(&*i))
-    typename iterator_traits<ForwardIterator>::value_type (x)
-
-            
-

- -This expression is ill-formed when the type of the subexpression -&*i is some volatile-qualified T. - -

- -

[ -Batavia: Lack of support for proposed resolution but agree there is a -defect. Howard to look at wording. Concern that move semantics -properly expressed if iterator returns rvalue. -]

- - - - -

Proposed resolution:

-

- -In order to allow these algorithms to operate on volatile storage I -propose to change the expression so as to make it well-formed even for -pointers to volatile types. Specifically, I propose the following -changes to clauses 20 and 24. Change 20.6.4.1, p1 to read: - -

-
-Effects:
-
-typedef typename iterator_traits<ForwardIterator>::pointer    pointer;
-typedef typename iterator_traits<ForwardIterator>::value_type value_type;
-
-for (; first != last; ++result, ++first)
-    new (static_cast<void*>(const_cast<pointer>(&*result))
-        value_type (*first);
-
-            
-

- -change 20.6.4.2, p1 to read - -

-
-Effects:
-
-typedef typename iterator_traits<ForwardIterator>::pointer    pointer;
-typedef typename iterator_traits<ForwardIterator>::value_type value_type;
-
-for (; first != last; ++result, ++first)
-    new (static_cast<void*>(const_cast<pointer>(&*first))
-        value_type (*x);
-
-            
-

- -and change 20.6.4.3, p1 to read - -

-
-Effects:
-
-typedef typename iterator_traits<ForwardIterator>::pointer    pointer;
-typedef typename iterator_traits<ForwardIterator>::value_type value_type;
-
-for (; n--; ++first)
-    new (static_cast<void*>(const_cast<pointer>(&*first))
-        value_type (*x);
-
-            
-

- -In addition, since there is no partial specialization for -iterator_traits<volatile T*> I propose to add one -to parallel such specialization for <const T*>. Specifically, I -propose to add the following text to the end of 24.3.1, p3: - -

-

- -and for pointers to volatile as - -

-
-namespace std {
-template<class T> struct iterator_traits<volatile T*> {
-typedef ptrdiff_t difference_type;
-typedef T value_type;
-typedef volatile T* pointer;
-typedef volatile T& reference;
-typedef random_access_iterator_tag iterator_category;
-};
-}
-
-            
-

- -Note that the change to iterator_traits isn't necessary -in order to implement the specialized algorithms in a way that allows -them to operate on volatile strorage. It is only necesassary in order -to specify their effects in terms of iterator_traits as -is done here. Implementations can (and some do) achieve the same -effect by means of function template overloading. - -

- - - - -
-

585. facet error reporting

-

Section: 22.2 [locale.categories] Status: Open - Submitter: Martin Sebor, Paolo Carlini Date: 2006-06-22

-

View other active issues in [locale.categories].

-

View all other issues in [locale.categories].

-

View all issues with Open status.

-

Discussion:

-

- -Section 22.2, paragraph 2 requires facet get() members -that take an ios_base::iostate& argument, -err, to ignore the (initial) value of the -argument, but to set it to ios_base::failbit in case of a -parse error. - -

-

- -We believe there are a few minor problems with this blanket -requirement in conjunction with the wording specific to each -get() member function. - -

-

- -First, besides get() there are other member functions -with a slightly different name (for example, -get_date()). It's not completely clear that the intent of -the paragraph is to include those as well, and at least one -implementation has interpreted the requirement literally. - -

-

- -Second, the requirement to "set the argument to -ios_base::failbit suggests that the functions are not -permitted to set it to any other value (such as -ios_base::eofbit, or even ios_base::eofbit | -ios_base::failbit). - -

-

- -However, 22.2.2.1.2, p5 (Stage 3 of num_get parsing) and -p6 (bool parsing) specifies that the do_get -functions perform err |= ios_base::eofbit, which -contradicts the earlier requirement to ignore err's initial -value. - -

-

- -22.2.6.1.2, p1 (the Effects clause of the money_get -facet's do_get member functions) also specifies that -err's initial value be used to compute the final -value by ORing it with either ios_base::failbit or -withios_base::eofbit | ios_base::failbit. - -

- - -

Proposed resolution:

-

- -We believe the intent is for all facet member functions that take an -ios_base::iostate& argument to: - -

-
    -
  • - -ignore the initial value of the err argument, - -
  • -
  • - -reset err to ios_base::goodbit prior -to any further processing, - -
  • -
  • - -and set either ios_base::eofbit, or -ios_base::failbit, or both in err, as -appropriate, in response to reaching the end-of-file or on parse -error, or both. - -
  • -
-

- -To that effect we propose to change 22.2, p2 as follows: - -

-

- -The put() members make no provision for error -reporting. (Any failures of the OutputIterator argument must be -extracted from the returned iterator.) Unless otherwise -specified, the get() members that -take an ios_base::iostate& argument whose value -they ignore, but set to ios_base::failbit in case of a parse -error., err, start by evaluating -err = ios_base::goodbit, and may subsequently set -err to either ios_base::eofbit, or -ios_base::failbit, or ios_base::eofbit | -ios_base::failbit in response to reaching the end-of-file or in -case of a parse error, or both, respectively. - -

- - -

[ -Kona (2007): We need to change the proposed wording to clarify that the -phrase "the get members" actually denotes get(), get_date(), etc. -Proposed Disposition: Open -]

- - - - -
-

588. requirements on zero sized tr1::arrays and other details

-

Section: 23.2.1 [array] Status: Open - Submitter: Gennaro Prota Date: 2006-07-18

-

View other active issues in [array].

-

View all other issues in [array].

-

View all issues with Open status.

-

Discussion:

-

-The wording used for section 23.2.1 [lib.array] seems to be subtly -ambiguous about zero sized arrays (N==0). Specifically: -

-

-* "An instance of array<T, N> stores N elements of type T, so that -[...]" -

-

-Does this imply that a zero sized array object stores 0 elements, i.e. -that it cannot store any element of type T? The next point clarifies -the rationale behind this question, basically how to implement begin() -and end(): -

-

-* 23.2.1.5 [lib.array.zero], p2: "In the case that N == 0, begin() == -end() == unique value." -

-

-What does "unique" mean in this context? Let's consider the following -possible implementations, all relying on a partial specialization: -

-
a)
-    template< typename T >
-    class array< T, 0 > {
-    
-        ....
-
-        iterator begin()
-        { return iterator( reinterpret_cast< T * >( this ) ); }
-        ....
-
-    };
-
-

-This has been used in boost, probably intending that the return value -had to be unique to the specific array object and that array couldn't -store any T. Note that, besides relying on a reinterpret_cast, has -(more than potential) alignment problems. -

-
b)
-    template< typename T >
-    class array< T, 0 > {
-    
-        T t;
-
-        iterator begin()
-        { return iterator( &t ); }
-        ....
-
-    };
-
-

-This provides a value which is unique to the object and to the type of -the array, but requires storing a T. Also, it would allow the user to -mistakenly provide an initializer list with one element. -

-

-A slight variant could be returning *the* null pointer of type T -

-
    return static_cast<T*>(0);
-
-

-In this case the value would be unique to the type array<T, 0> but not -to the objects (all objects of type array<T, 0> with the same value -for T would yield the same pointer value). -

-

-Furthermore this is inconsistent with what the standard requires from -allocation functions (see library issue 9). -

-

-c) same as above but with t being a static data member; again, the -value would be unique to the type, not to the object. -

-

-d) to avoid storing a T *directly* while disallowing the possibility -to use a one-element initializer list a non-aggregate nested class -could be defined -

-
    struct holder { holder() {} T t; } h;
-
-

-and then begin be defined as -

-
 iterator begin() { return &h.t; }
-
-

-But then, it's arguable whether the array stores a T or not. -Indirectly it does. -

-

------------------------------------------------------ -

-

-Now, on different issues: -

-

-* what's the effect of calling assign(T&) on a zero-sized array? There -seems to be only mention of front() and back(), in 23.2.1 [lib.array] -p4 (I would also suggest to move that bullet to section 23.2.1.5 -[lib.array.zero], for locality of reference) -

-

-* (minor) the opening paragraph of 23.2.1 [lib.array] wording is a bit -inconsistent with that of other sequences: that's not a problem in -itself, but compare it for instance with "A vector is a kind of -sequence that supports random access iterators"; though the intent is -obvious one might argue that the wording used for arrays doesn't tell -what an array is, and relies on the reader to infer that it is what -the <array> header defines. -

-

-* it would be desiderable to have a static const data member of type -std::size_t, with value N, for usage as integral constant expression -

-

-* section 23.1 [lib.container.requirements] seem not to consider -fixed-size containers at all, as it says: "[containers] control -allocation and deallocation of these objects [the contained objects] -through constructors, destructors, *insert and erase* operations" -

-

-* max_size() isn't specified: the result is obvious but, technically, -it relies on table 80: "size() of the largest possible container" -which, again, doesn't seem to consider fixed size containers -

- - -

Proposed resolution:

-

-

- - -

[ -Kona (2007): requirements on zero sized tr1::arrays and other details -Issue 617: std::array is a sequence that doesn't satisfy the sequence -requirements? Alisdair will prepare a paper. Proposed Disposition: Open -]

- - - - - -
-

595. TR1/C++0x: fabs(complex<T>) redundant / wrongly specified

-

Section: 26.3.7 [complex.value.ops] Status: Ready - Submitter: Stefan Große Pawig Date: 2006-09-24

-

View all issues with Ready status.

-

Discussion:

-

-TR1 introduced, in the C compatibility chapter, the function -fabs(complex<T>): -

-
----- SNIP -----
-8.1.1 Synopsis                                [tr.c99.cmplx.syn]
-
-  namespace std {
-  namespace tr1 {
-[...]
-  template<class T> complex<T> fabs(const complex<T>& x);
-  } // namespace tr1
-  } // namespace std
-
-[...]
-
-8.1.8 Function fabs                          [tr.c99.cmplx.fabs]
-
-1 Effects: Behaves the same as C99 function cabs, defined in
-  subclause 7.3.8.1.
------ SNIP -----
-
- -

-The current C++0X draft document (n2009.pdf) adopted this -definition in chapter 26.3.1 (under the comment // 26.3.7 values) -and 26.3.7/7. -

-

-But in C99 (ISO/IEC 9899:1999 as well as the 9899:TC2 draft document -n1124), the referenced subclause reads -

- -
----- SNIP -----
-7.3.8.1 The cabs functions
-
-  Synopsis
-
-1 #include <complex.h>
-  double cabs(double complex z);
-  float cabsf(float complex z);
-  long double cabsl(long double z);
-
-  Description
-
-2 The cabs functions compute the complex absolute value (also called
-  norm, modulus, or magnitude) of z.
-
-  Returns
-
-3 The cabs functions return the complex absolute value.
------ SNIP -----
-
- -

-Note that the return type of the cabs*() functions is not a complex -type. Thus, they are equivalent to the already well established - template<class T> T abs(const complex<T>& x); -(26.2.7/2 in ISO/IEC 14882:1998, 26.3.7/2 in the current draft -document n2009.pdf). -

-

-So either the return value of fabs() is specified wrongly, or fabs() -does not behave the same as C99's cabs*(). -

- -Possible Resolutions - -

-This depends on the intention behind the introduction of fabs(). -

-

-If the intention was to provide a /complex/ valued function that -calculates the magnitude of its argument, this should be -explicitly specified. In TR1, the categorization under "C -compatibility" is definitely wrong, since C99 does not provide -such a complex valued function. -

-

-Also, it remains questionable if such a complex valued function -is really needed, since complex<T> supports construction and -assignment from real valued arguments. There is no difference -in observable behaviour between -

-
  complex<double> x, y;
-  y = fabs(x);
-  complex<double> z(fabs(x));
-
-

-and -

-
  complex<double> x, y;
-  y = abs(x);
-  complex<double> z(abs(x));
-
-

-If on the other hand the intention was to provide the intended -functionality of C99, fabs() should be either declared deprecated -or (for C++0X) removed from the standard, since the functionality -is already provided by the corresponding overloads of abs(). -

- - - -

Proposed resolution:

- -

-Change the synopsis in 26.3.1 [complex.synopsis]: -

- -
template<class T> complex<T> fabs(const complex<T>&);
-
- -

-Change 26.3.7 [complex.value.ops], p7: -

- -
-
template<class T> complex<T> fabs(const complex<T>& x);
-
-
-

--7- Effects: Behaves the same as C99 function cabs, defined in subclause 7.3.8.1. -

-
-
- - - -

[ -Kona (2007): Change the return type of fabs(complex) to T. -Proposed Disposition: Ready -]

- - - - - -
-

596. 27.8.1.3 Table 112 omits "a+" and "a+b" modes

-

Section: 27.8.1.4 [filebuf.members] Status: Review - Submitter: Thomas Plum Date: 2006-09-26

-

View other active issues in [filebuf.members].

-

View all other issues in [filebuf.members].

-

View all issues with Review status.

-

Discussion:

-

-In testing 27.8.1.4 [filebuf.members], Table 112 (in the latest N2009 draft), we invoke -

-
   ostr.open("somename", ios_base::out | ios_base::in | ios_base::app)
-
-

-and we expect the open to fail, because out|in|app is not listed in -Table 92, and just before the table we see very specific words: -

-

- If mode is not some combination of flags shown in the table - then the open fails. -

-

-But the corresponding table in the C standard, 7.19.5.3, provides two -modes "a+" and "a+b", to which the C++ modes out|in|app and -out|in|app|binary would presumably apply. -

-

-We would like to argue that the intent of Table 112 was to match the -semantics of 7.19.5.3 and that the omission of "a+" and "a+b" was -unintentional. (Otherwise there would be valid and useful behaviors -available in C file I/O which are unavailable using C++, for no -valid functional reason.) -

-

-We further request that the missing modes be explicitly restored to -the WP, for inclusion in C++0x. -

- -

[ -Martin adds: -]

- - -

-...besides "a+" and "a+b" the C++ table is also missing a row -for a lone app bit which in at least two current implementation -as well as in Classic Iostreams corresponds to the C stdio "a" -mode and has been traditionally documented as implying ios::out. -Which means the table should also have a row for in|app meaning -the same thing as "a+" already proposed in the issue. -

- - -

Proposed resolution:

-

-Add to the table "File open modes" in 27.8.1.4 [filebuf.members]: -

- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
File open modes
ios_base Flag combinationstdio equivalent
binaryinouttruncapp 
    +     "w"
    +   + "a"
        + "a"
    + +   "w"
  +       "r"
  + +     "r+"
  + + +   "w+"
  + +   + "a+"
  +     + "a+"
+   +     "wb"
+   +   + "ab"
+       + "ab"
+   + +   "wb"
+ +       "rb"
+ + +     "r+b"
+ + + +   "w+b"
+ + +   + "a+b"
+ +     + "a+b"
-
- - - -

[ -Kona (2007) Added proposed wording and moved to Review. -]

- - - - - -
-

597. Decimal: The notion of 'promotion' cannot be emulated by user-defined types.

-

Section: TRDecimal 3.2 [trdec.types.types] Status: Open - Submitter: Daveed Vandevoorde Date: 2006-04-05

-

View other active issues in [trdec.types.types].

-

View all other issues in [trdec.types.types].

-

View all issues with Open status.

-

Discussion:

-

-In a private email, Daveed writes: -

-
-

-I am not familiar with the C TR, but my guess is that the -class type approach still won't match a built-in type -approach because the notion of "promotion" cannot be -emulated by user-defined types. -

-

-Here is an example: -

-
-
-		 struct S {
-		   S(_Decimal32 const&);  // Converting constructor
-		 };
-		 void f(S);
-
-		 void f(_Decimal64);
-
-		 void g(_Decimal32 d) {
-		   f(d);
-		 }
-
- -
-

-If _Decimal32 is a built-in type, the call f(d) will likely -resolve to f(_Decimal64) because that requires only a -promotion, whereas f(S) requires a user-defined conversion. -

-

-If _Decimal32 is a class type, I think the call f(d) will be -ambiguous because both the conversion to _Decimal64 and the -conversion to S will be user-defined conversions with neither -better than the other. -

-
-

-Robert comments: -

-

In general, a library of arithmetic types cannot exactly emulate the -behavior of the intrinsic numeric types. There are several ways to tell -whether an implementation of the decimal types uses compiler -intrinisics or a library. For example: -

-
                 _Decimal32 d1;
-                 d1.operator+=(5);  // If d1 is a builtin type, this won't compile.
-
-

-In preparing the decimal TR, we have three options: -

-
    -
  1. require that the decimal types be class types
  2. -
  3. require that the decimal types be builtin types, like float and double
  4. -
  5. specify a library of class types, but allow enough implementor -latitude that a conforming implementation could instead provide builtin -types
  6. -
-

-We decided as a group to pursue option #3, but that approach implies -that implementations may not agree on the semantics of certain use -cases (first example, above), or on whether certain other cases are -well-formed (second example). Another potentially important problem is -that, under the present definition of POD, the decimal classes are not -POD types, but builtins will be. -

-

Note that neither example above implies any problems with respect to -C-to-C++ compatibility, since neither example can be expressed in C. -

- - -

Proposed resolution:

- - - - - -
-

606. Decimal: allow narrowing conversions

-

Section: TRDecimal 3.2 [trdec.types.types] Status: Open - Submitter: Martin Sebor Date: 2006-06-15

-

View other active issues in [trdec.types.types].

-

View all other issues in [trdec.types.types].

-

View all issues with Open status.

-

Discussion:

-

-In c++std-lib-17205, Martin writes: -

-

...was it a deliberate design choice to make narrowing -assignments ill-formed while permitting narrowing compound assignments? -For instance: -

-
      decimal32 d32;
-      decimal64 d64;
-
-      d32 = 64;     // error
-      d32 += 64;    // okay
-
-

-In c++std-lib-17229, Robert responds: -

-

It is a vestige of an old idea that I forgot to remove -from the paper. Narrowing assignments should be permitted. The bug is -that the converting constructors that cause narrowing should not be -explicit. Thanks for pointing this out. -

- -

Proposed resolution:

-

-1. In "3.2.2 Class decimal32" synopsis, remove the explicit specifier from the narrowing conversions: -

-
                // 3.2.2.2 conversion from floating-point type:
-                explicit decimal32(decimal64 d64);
-                explicit decimal32(decimal128 d128);
-
-

-2. Do the same thing in "3.2.2.2. Conversion from floating-point type." -

-

-3. In "3.2.3 Class decimal64" synopsis, remove the explicit specifier from the narrowing conversion: -

-
                // 3.2.3.2 conversion from floating-point type:
-                explicit decimal64(decimal128 d128);
-
-

-4. Do the same thing in "3.2.3.2. Conversion from floating-point type." -

- -

[ -Redmond: We prefer explicit conversions for narrowing and implicit for widening. -]

- - - - - - -
-

612. numeric_limits::is_modulo insufficently defined

-

Section: 18.2.1.2 [numeric.limits.members] Status: Open - Submitter: Chris Jefferson Date: 2006-11-10

-

View all other issues in [numeric.limits.members].

-

View all issues with Open status.

-

Discussion:

-

-18.2.1.2 55 states that "A type is modulo if it is possible to add two -positive numbers together and have a result that wraps around to a -third number that is less". -This seems insufficent for the following reasons: -

- -
    -
  1. Doesn't define what that value recieved is.
  2. -
  3. Doesn't state the result is repeatable
  4. -
  5. Doesn't require that doing addition, subtraction and other -operations on all values is defined behaviour.
  6. -
- -

[ -Batavia: Related to -N2144. -Pete: is there an ISO definition of modulo? Underflow on signed behavior is undefined. -]

- - - -

Proposed resolution:

-

-Suggest 18.2.1.2 [numeric.limits.members[numeric.limits.members], paragraph 57 is ammeded to: -

- -

-A type is modulo if, it is possible to add two positive numbers -and have a result that wraps around to a third number that is less. -given any operation involving +,- or * on values of that type whose value -would fall outside the range [min(), max()], then the value returned -differs from the true value by an integer multiple of (max() - min() + -1). -

- - - - - - -
-

614. std::string allocator requirements still inconsistent

-

Section: 21.3 [basic.string] Status: Open - Submitter: Bo Persson Date: 2006-12-05

-

View other active issues in [basic.string].

-

View all other issues in [basic.string].

-

View all issues with Open status.

-

Discussion:

-

-This is based on N2134, where 21.3.1/2 states: -"... The Allocator object used shall be a copy of the Allocator object -passed to the basic_string object's constructor or, if the constructor does -not take an Allocator argument, a copy of a default-constructed Allocator -object." -

-

-Section 21.3.2/1 lists two constructors: -

-
basic_string(const basic_string<charT,traits,Allocator>& str );
-
-basic_string(const basic_string<charT,traits,Allocator>& str ,
-             size_type pos , size_type n = npos,
-             const Allocator& a = Allocator());
-
-

-and then says "In the first form, the Allocator value used is copied from -str.get_allocator().", which isn't an option according to 21.3.1. -

-

[ -Batavia: We need blanket statement to the effect of: -]

- - -
    -
  1. If an allocator is passed in, use it, or,
  2. -
  3. If a string is passed in, use its allocator.
  4. -
-

[ -Review constructors and functions that return a string; make sure we follow these -rules (substr, operator+, etc.). Howard to supply wording. -]

- - -

[ -Bo adds: The new container constructor which takes only a size_type is not -consistent with 23.1 [container.requirements], p9 which says in part: - -

-All other constructors for these container types take an -Allocator& argument (20.1.2), an allocator whose value type -is the same as the container's value type. A copy of this argument is -used for any memory allocation performed, by these constructors and by -all member functions, during the lifetime of each container object. -
-]

- - - -

Proposed resolution:

-

-

- - - - - -
-

617. std::array is a sequence that doesn't satisfy the sequence requirements?

-

Section: 23.2.1 [array] Status: New - Submitter: Bo Persson Date: 2006-12-30

-

View other active issues in [array].

-

View all other issues in [array].

-

View all issues with New status.

-

Discussion:

-

-The <array> header is given under 23.2 [sequences]. -23.2.1 [array]/paragraph 3 says: -

-

-"Unless otherwise specified, all array operations are as described in -23.1 [container.requirements]". -

-

-However, array isn't mentioned at all in section 23.1 [container.requirements]. -In particular, Table 82 "Sequence requirements" lists several operations (insert, erase, clear) -that std::array does not have in 23.2.1 [array]. -

-

-Also, Table 83 "Optional sequence operations" lists several operations that -std::array does have, but array isn't mentioned. -

- - -

Proposed resolution:

-

-

- - - - - -
-

618. valarray::cshift() effects on empty array

-

Section: 26.5.2.7 [valarray.members] Status: Review - Submitter: Gabriel Dos Reis Date: 2007-01-10

-

View all issues with Review status.

-

Discussion:

-

-I would respectfully request an issue be opened with the intention to -clarify the wording for size() == 0 for cshift. -

- - -

Proposed resolution:

-

-Change 26.5.2.7 [valarray.members], paragraph 10: -

- -
- -
valarray<T> cshift(int n) const;
-
- -
-

-This function returns an object of class valarray<T>, of -length size(), each of whose elements I is -(*this)[(I + n ) % size()]. Thus, if element zero is taken as -the leftmost element, a positive value of n shifts the elements -circularly left n places. that is a circular shift of *this. If -element zero is taken as the leftmost element, a non-negative value of -n shifts the elements circularly left n places and a -negative value of n shifts the elements circularly right --n places. -

-
-
- - - -

Rationale:

-

-We do not believe that there is any real ambiguity about what happens -when size() == 0, but we do believe that spelling this out as a C++ -expression causes more trouble that it solves. The expression is -certainly wrong when n < 0, since the sign of % with negative arguments -is implementation defined. -

- - -

[ -Kona (2007) Changed proposed wording, added rationale and set to Review. -]

- - - - - -
-

620. valid uses of empty valarrays

-

Section: 26.5.2.1 [valarray.cons] Status: Ready - Submitter: Martin Sebor Date: 2007-01-20

-

View other active issues in [valarray.cons].

-

View all other issues in [valarray.cons].

-

View all issues with Ready status.

-

Discussion:

-

- -The Effects clause for the default valarray ctor -suggests that it is possible to increase the size of an empty -valarray object by calling other non-const member -functions of the class besides resize(). However, such an -interpretation would be contradicted by the requirement on the copy -assignment operator (and apparently also that on the computed -assignments) that the assigned arrays be the same size. See the -reflector discussion starting with c++std-lib-17871. - -

-

- -In addition, Footnote 280 uses some questionable normative -language. - -

- - -

Proposed resolution:

-

- -Reword the Effects clause and Footnote 280 as follows (26.5.2.1 [valarray.cons]): - -

-
-

- -valarray(); - -

-

- -Effects: Constructs an object of class -valarray<T>,279) which has zero -length until it is passed into a library function as a modifiable -lvalue or through a non-constant this pointer.280) - -

-

- -Postcondition: size() == 0. - -

-

- -Footnote 280: This default constructor is essential, since -arrays of valarray are likely to prove useful. -There shall also be a way to change the size of an array after -initialization; this is supplied by the semantics may be -useful. The length of an empty array can be increased after -initialization by means of the resize() member -function. - -

-
- - - - - -
-

621. non-const copy assignment operators of helper arrays

-

Section: 26.5 [numarray] Status: Ready - Submitter: Martin Sebor Date: 2007-01-20

-

View all other issues in [numarray].

-

View all issues with Ready status.

-

Discussion:

-

- -The computed and "fill" assignment operators of valarray -helper array class templates (slice_array, -gslice_array, mask_array, and -indirect_array) are const member functions of each class -template (the latter by the resolution of 123 -since they have reference semantics and thus do not affect -the state of the object on which they are called. However, the copy -assignment operators of these class templates, which also have -reference semantics, are non-const. The absence of constness opens -the door to speculation about whether they really are intended to have -reference semantics (existing implementations vary widely). - -

- -

-Pre-Kona, Martin adds: -

- -

-I realized that adding the const qualifier to the -functions as I suggested would break the const correctness of the -classes. A few possible solutions come to mind: -

- -
    -
  1. Add the const qualifier to the return types of these functions.
  2. -
  3. Change the return type of all the functions to void to match -the signatures of all the other assignment operators these classes -define.
  4. -
  5. Prohibit the copy assignment of these classes by declaring the -copy assignment operators private (as is done and documented by -some implementations).
  6. -
- - - -

Proposed resolution:

-

- -Declare the copy assignment operators of all four helper array -class templates const. - -

-

- -Specifically, make the following edits: - -

-

- -Change the signature in 26.5.5 [template.slice.array] and -26.5.5.1 [slice.arr.assign] as follows: - -

-
-const slice_array& operator= (const slice_array&) const;
-
-        
-

- -Change the signature in 26.5.7 [template.gslice.array] and -26.5.7.1 [gslice.array.assign] as follows: - -

-
-const gslice_array& operator= (const gslice_array&) const;
-
-        
-

- -Change the signature in 26.5.8 [template.mask.array] and 26.5.8.1 [mask.array.assign] as -follows: - -

-
-const mask_array& operator= (const mask_array&) const;
-
-        
-

- -Change the signature in 26.5.9 [template.indirect.array] and -26.5.9.1 [indirect.array.assign] as follows: - -

-
-const indirect_array& operator= (const indirect_array&) const;
-
-        
- - -

[ -Kona (2007) Added const qualification to the return types and set to Ready. -]

- - - - - -
-

622. behavior of filebuf dtor and close on error

-

Section: 27.8.1.17 [fstream.members] Status: Ready - Submitter: Martin Sebor Date: 2007-01-20

-

View all issues with Ready status.

-

Discussion:

-

- -basic_filebuf dtor is specified to have the following -straightforward effects: - -

-

- -Effects: Destroys an object of class -basic_filebuf. Calls close(). - -

-

- -close() does a lot of potentially complicated processing, -including calling overflow() to write out the termination -sequence (to bring the output sequence to its initial shift -state). Since any of the functions called during the processing can -throw an exception, what should the effects of an exception be on the -dtor? Should the dtor catch and swallow it or should it propagate it -to the caller? The text doesn't seem to provide any guidance in this -regard other than the general restriction on throwing (but not -propagating) exceptions from destructors of library classes in -17.4.4.8 [res.on.exception.handling]. - -

-

- -Further, the last thing close() is specified to do is -call fclose() to close the FILE pointer. The -last sentence of the Effects clause reads: - -

-

- -... If any of the calls to overflow or -std::fclose fails then close fails. - -

-

- -This suggests that close() might be required to call -fclose() if and only if none of the calls to -overflow() fails, and avoid closing the FILE -otherwise. This way, if overflow() failed to flush out -the data, the caller would have the opportunity to try to flush it -again (perhaps after trying to deal with whatever problem may have -caused the failure), rather than losing it outright. - -

-

- -On the other hand, the function's Postcondition specifies that -is_open() == false, which suggests that it should call -fclose() unconditionally. However, since -Postcondition clauses are specified for many functions in the -standard, including constructors where they obviously cannot apply -after an exception, it's not clear whether this Postcondition -clause is intended to apply even after an exception. - -

-

- -It might be worth noting that the traditional behavior (Classic -Iostreams fstream::close() and C fclose()) -is to close the FILE unconditionally, regardless of -errors. - -

- -

[ -See 397 and 418 for related issues. -]

- - - - -

Proposed resolution:

-

- -After discussing this on the reflector (see the thread starting with -c++std-lib-17650) we propose that close() be clarified to -match the traditional behavior, that is to close the FILE -unconditionally, even after errors or exceptions. In addition, we -propose the dtor description be amended so as to explicitly require it -to catch and swallow any exceptions thrown by close(). - -

-

- -Specifically, we propose to make the following edits in -27.8.1.4 [filebuf.members]: - -

-
-
-basic_filebuf<charT,traits>* close();
-
-            
-

- -Effects: If is_open() == false, returns a null -pointer. If a put area exists, calls -overflow(traits::eof()) to flush characters. If the last -virtual member function called on *this (between -underflow, overflow, seekoff, -and seekpos) was overflow then calls -a_codecvt.unshift (possibly several times) to determine a -termination sequence, inserts those characters and calls -overflow(traits::eof()) again. Finally, regardless -of whether any of the preceding calls fails or throws an exception, -the function it closes the file ("as if" by calling -std::fclose(file)).334) If any of the calls -made by the functionto overflow -or, including std::fclose, -fails then close fails by returning a null pointer. -If one of these calls throws an exception, the exception is caught and -rethrown after closing the file. - -

-
-

- -And to make the following edits in 27.8.1.2 [filebuf.cons]. - -

-
-
-virtual ~basic_filebuf();
-
-            
-

- -Effects: Destroys an object of class -basic_filebuf<charT,traits>. Calls -close(). If an exception occurs during the -destruction of the object, including the call to close(), -the exception is caught but not rethrown (see -17.4.4.8 [res.on.exception.handling]). - -

-
- - - - - -
-

623. pubimbue forbidden to call imbue

-

Section: 27.1.1 [iostream.limits.imbue] Status: Ready - Submitter: Martin Sebor Date: 2007-01-20

-

View all issues with Ready status.

-

Discussion:

-

- -27.1.1 [iostream.limits.imbue] specifies that "no function described in -clause 27 except for ios_base::imbue causes any instance -of basic_ios::imbue or -basic_streambuf::imbue to be called." - -

-

- -That contradicts the Effects clause for -basic_streambuf::pubimbue() which requires the function -to do just that: call basic_streambuf::imbue(). - -

- - -

Proposed resolution:

-

- -To fix this, rephrase the sentence above to allow -pubimbue to do what it was designed to do. Specifically. -change 27.1.1 [iostream.limits.imbue], p1 to read: - -

-

- -No function described in clause 27 except for -ios_base::imbue and basic_filebuf::pubimbue -causes any instance of basic_ios::imbue or -basic_streambuf::imbue to be called. ... - -

- - - - - -
-

624. valarray assignment and arrays of unequal length

-

Section: 26.5.2.2 [valarray.assign] Status: Ready - Submitter: Martin Sebor Date: 2007-01-20

-

View all issues with Ready status.

-

Discussion:

-

- -The behavior of the valarray copy assignment operator is -defined only when both sides have the same number of elements and the -spec is explicit about assignments of arrays of unequal lengths having -undefined behavior. - -

-

- -However, the generalized subscripting assignment operators overloaded -on slice_array et al (26.5.2.2 [valarray.assign]) don't have any -such restriction, leading the reader to believe that the behavior of -these overloads is well defined regardless of the lengths of the -arguments. - -

-

- -For example, based on the reading of the spec the behavior of the -snippet below can be expected to be well-defined: - -

-
    const std::slice from_0_to_3 (0, 3, 1);   // refers to elements 0, 1, 2
-    const std::valarray<int> a (1, 3);        // a = { 1, 1, 1 }
-    std::valarray<int>       b (2, 4);        // b = { 2, 2, 2, 2 }
-
-    b = a [from_0_to_3];
-        
-

- -In practice, b may end up being { 1, 1, 1 }, -{ 1, 1, 1, 2 }, or anything else, indicating that -existing implementations vary. - -

- -

-Quoting from Section 3.4, Assignment operators, of Al Vermeulen's -Proposal for Standard C++ Array Classes (see c++std-lib-704; -N0308): -

-

- ...if the size of the array on the right hand side of the equal - sign differs from the size of the array on the left, a run time - error occurs. How this error is handled is implementation - dependent; for compilers which support it, throwing an exception - would be reasonable. -

- -

-And see more history in -N0280. -

- -

- -It has been argued in discussions on the committee's reflector that -the semantics of all valarray assignment operators should -be permitted to be undefined unless the length of the arrays being -assigned is the same as the length of the one being assigned from. See -the thread starting at c++std-lib-17786. - -

-

- -In order to reflect such views, the standard must specify that the -size of the array referred to by the argument of the assignment must -match the size of the array under assignment, for example by adding a -Requires clause to 26.5.2.2 [valarray.assign] as follows: - -

-

- -Requires: The length of the array to which the argument refers -equals size(). - -

- -

- -Note that it's far from clear that such leeway is necessary in order -to implement valarray efficiently. - -

- - -

Proposed resolution:

-

-Insert new paragraph into 26.5.2.2 [valarray.assign]: -

- -
-
valarray<T>& operator=(const slice_array<T>&); 
-valarray<T>& operator=(const gslice_array<T>&); 
-valarray<T>& operator=(const mask_array<T>&); 
-valarray<T>& operator=(const indirect_array<T>&);
-
-
-

-Requires: The length of the array to which the argument refers -equals size(). -

-

-These operators allow the results of a generalized subscripting operation to be assigned directly to a valarray. -

-
-
- - - - - -
-

625. mixed up Effects and Returns clauses

-

Section: 17 [library] Status: Open - Submitter: Martin Sebor Date: 2007-01-20

-

View all other issues in [library].

-

View all issues with Open status.

-

Discussion:

-

- -Many member functions of basic_string are overloaded, -with some of the overloads taking a string argument, -others value_type*, others size_type, and -others still iterators. Often, the requirements on one of -the overloads are expressed in the form of Effects, -Throws, and in the Working Paper -(N2134) -also Remark clauses, while those on the rest of the overloads -via a reference to this overload and using a Returns clause. - -

-

- -The difference between the two forms of specification is that per -17.3.1.3 [structure.specifications], p3, an Effects clause specifies -"actions performed by the functions," i.e., its observable -effects, while a Returns clause is "a description of the -return value(s) of a function" that does not impose any -requirements on the function's observable effects. - -

-

- -Since only Notes are explicitly defined to be informative and -all other paragraphs are explicitly defined to be normative, like -Effects and Returns, the new Remark clauses also -impose normative requirements. - -

-

- -So by this strict reading of the standard there are some member -functions of basic_string that are required to throw an -exception under some conditions or use specific traits members while -many other otherwise equivalent overloads, while obliged to return the -same values, aren't required to follow the exact same requirements -with regards to the observable effects. - -

-

- -Here's an example of this problem that was precipitated by the change -from informative Notes to normative Remarks (presumably made to -address 424): - -

-

- -In the Working Paper, find(string, size_type) contains a -Remark clause (which is just a Note in the current -standard) requiring it to use traits::eq(). - -

-

- -find(const charT *s, size_type pos) is specified to -return find(string(s), pos) by a Returns clause -and so it is not required to use traits::eq(). However, -the Working Paper has replaced the original informative Note -about the function using traits::length() with a -normative requirement in the form of a Remark. Calling -traits::length() may be suboptimal, for example when the -argument is a very long array whose initial substring doesn't appear -anywhere in *this. - -

-

- -Here's another similar example, one that existed even prior to the -introduction of Remarks: - -

-

- - insert(size_type pos, string, size_type, size_type) is -required to throw out_of_range if pos > -size(). - -

-

- -insert(size_type pos, string str) is specified to return -insert(pos, str, 0, npos) by a Returns clause and -so its effects when pos > size() are strictly speaking -unspecified. - - -

- -I believe a careful review of the current Effects and -Returns clauses is needed in order to identify all such -problematic cases. In addition, a review of the Working Paper should -be done to make sure that the newly introduced normative Remark -clauses do not impose any undesirable normative requirements in place -of the original informative Notes. - -

-

[ -Batavia: Alan and Pete to work. -]

- - - -

Proposed resolution:

-

-

- - - - - -
-

626. new Remark clauses not documented

-

Section: 17.3.1.3 [structure.specifications] Status: Open - Submitter: Martin Sebor Date: 2007-01-20

-

View all other issues in [structure.specifications].

-

View all issues with Open status.

-

Discussion:

-

- -The Remark clauses newly introduced into the Working Paper -(N2134) -are not mentioned in 17.3.1.3 [structure.specifications] where we list the -meaning of Effects, Requires, and other clauses (with -the exception of Notes which are documented as informative in -17.3.1.1 [structure.summary], p2, and which they replace in many cases). - -

-

- -Propose add a bullet for Remarks along with a brief description. - -

-

[ -Batavia: Alan and Pete to work. -]

- - - -

Proposed resolution:

-

-

- - - - - -
-

627. Low memory and exceptions

-

Section: 18.5.1.1 [new.delete.single] Status: Open - Submitter: P.J. Plauger Date: 2007-01-23

-

View all other issues in [new.delete.single].

-

View all issues with Open status.

-

Discussion:

-

-I recognize the need for nothrow guarantees in the exception reporting -mechanism, but I strongly believe that implementors also need an escape hatch -when memory gets really low. (Like, there's not enough heap to construct and -copy exception objects, or not enough stack to process the throw.) I'd like to -think we can put this escape hatch in 18.5.1.1 [new.delete.single], -operator new, but I'm not sure how to do it. We need more than a -footnote, but the wording has to be a bit vague. The idea is that if -new can't allocate something sufficiently small, it has the right to -abort/call terminate/call unexpected. -

- - -

Proposed resolution:

-

-

- - - - - -
-

629. complex insertion and locale dependence

-

Section: 26.3.6 [complex.ops] Status: Open - Submitter: Gabriel Dos Reis Date: 2007-01-28

-

View all other issues in [complex.ops].

-

View all issues with Open status.

-

Discussion:

-

-is there an issue opened for (0,3) as complex number with -the French local? With the English local, the above parses as an -imaginery complex number. With the French locale it parses as a -real complex number. -

- -

-Further notes/ideas from the lib-reflector, messages 17982-17984: -

- -
-

-Add additional entries in num_punct to cover the complex separator (French would be ';'). -

-

-Insert a space before the comma, which should eliminate the ambiguity. -

-

-Solve the problem for ordered sequences in general, perhaps with a -dedicated facet. Then complex should use that solution. -

-
- - - -

Proposed resolution:

-

-

- - - - - -
-

630. arrays of valarray

-

Section: 26.5.2.1 [valarray.cons] Status: Open - Submitter: Martin Sebor Date: 2007-01-28

-

View other active issues in [valarray.cons].

-

View all other issues in [valarray.cons].

-

View all issues with Open status.

-

Discussion:

-

- -Section 26.1 [numeric.requirements], p1 suggests that a -valarray specialization on a type T that -satisfies the requirements enumerated in the paragraph is itself a -valid type on which valarray may be instantiated -(Footnote 269 makes this clear). I.e., -valarray<valarray<T> > is valid as long as -T is valid. However, since implementations of -valarray are permitted to initialize storage allocated by -the class by invoking the default ctor of T followed by -the copy assignment operator, such implementations of -valarray wouldn't work with (perhaps user-defined) -specializations of valarray whose assignment operator had -undefined behavior when the size of its argument didn't match the size -of *this. By "wouldn't work" I mean that it would -be impossible to resize such an array of arrays by calling the -resize() member function on it if the function used the -copy assignment operator after constructing all elements using the -default ctor (e.g., by invoking new value_type[N]) to -obtain default-initialized storage) as it's permitted to do. - -

-

- -Stated more generally, the problem is that -valarray<valarray<T> >::resize(size_t) isn't -required or guaranteed to have well-defined semantics for every type -T that satisfies all requirements in -26.1 [numeric.requirements]. - -

-

- -I believe this problem was introduced by the adoption of the -resolution outlined in N0857, -Assignment of valarrays, from 1996. The copy assignment -operator of the original numerical array classes proposed in N0280, -as well as the one proposed in N0308 -(both from 1993), had well-defined semantics for arrays of unequal -size (the latter explicitly only when *this was empty; -assignment of non empty arrays of unequal size was a runtime error). - -

-

- -The justification for the change given in N0857 was the "loss of -performance [deemed] only significant for very simple operations on -small arrays or for architectures with very few registers." - -

-

- -Since tiny arrays on a limited subset of hardware architectures are -likely to be an exceedingly rare case (despite the continued -popularity of x86) I propose to revert the resolution and make the -behavior of all valarray assignment operators -well-defined even for non-conformal arrays (i.e., arrays of unequal -size). I have implemented this change and measured no significant -degradation in performance in the common case (non-empty arrays of -equal size). I have measured a 50% (and in some cases even greater) -speedup in the case of assignments to empty arrays versus calling -resize() first followed by an invocation of the copy -assignment operator. - -

- - -

Proposed resolution:

-

- -Change 26.5.2.2 [valarray.assign], p1 as follows: - -

-
-

- - -valarray<T>& operator=(const valarray<T>& x); - - -

-

- --1- Each element of the *this array is assigned the value -of the corresponding element of the argument array. The -resulting behavior is undefined if When the length of -the argument array is not equal to the length of the *this -array. resizes *this to make the two -arrays the same length, as if by calling -resize(x.size()), before performing the assignment. - -

-
-

- -And add a new paragraph just below paragraph 1 with the following -text: - -

-
-

- --2- Postcondition: size() == x.size(). - -

-
-

- -Also add the following paragraph to 26.5.2.2 [valarray.assign], immediately after p4: - -

-
-

- --?- When the length, N of the array referred -to by the argument is not equal to the length of *this, -the operator resizes *this to make the two arrays the -same length, as if by calling resize(N), before -performing the assignment. - -

-
- - -

[ -Kona (2007): Gaby to propose wording for an alternative resolution in -which you can assign to a valarray of size 0, but not to any other -valarray whose size is unequal to the right hand side of the assignment. -]

- - - - - -
-

631. conflicting requirements for BinaryPredicate

-

Section: 25 [algorithms] Status: Open - Submitter: James Kanze Date: 2007-01-31

-

View all other issues in [algorithms].

-

View all issues with Open status.

-

Discussion:

-

-The general requirements for BinaryPredicate (in 25 [algorithms]/8) contradict the implied specific requirements for -some functions. In particular, it says that: -

- -

-[...] if an algorithm takes BinaryPredicate binary_pred -as its argument and first1 and first2 as its -iterator arguments, it should work correctly in the construct if -(binary_pred (*first1 , *first2 )){...}. -BinaryPredicate always takes the first iterator type as its -first argument, that is, in those cases when T value is -part of the signature, it should work correctly in the context of if -(binary_pred (*first1 , value)){...}. -

- -

-In the description of upper_bound (25.3.3.2 [upper.bound]/2), however, the use is described as -"!comp(value, e)", where e is an -element of the sequence (a result of dereferencing -*first). -

- -

-In the description of lexicographical_compare, we have both -"*first1 < *first2" and "*first2 -< *first1" (which presumably implies "comp( -*first1, *first2 )" and "comp( *first2, -*first1 )". -

- -

[ -Toronto: Moved to Open. ConceptGCC seems to get lower_bound -and upper_bound to work withoutt these changes. -]

- - - - -

Proposed resolution:

-

-Logically, the BinaryPredicate is used as an ordering -relationship, with the semantics of "less than". Depending on the -function, it may be used to determine equality, or any of the inequality -relationships; doing this requires being able to use it with either -parameter first. I would thus suggest that the requirement be: -

- -

-[...] BinaryPredicate always takes the first iterator -value_type as one of its arguments, it is unspecified which. If -an algorithm takes BinaryPredicate binary_pred as its -argument and first1 and first2 as its -iterator arguments, it should work correctly both in the construct -if (binary_pred (*first1 , *first2 )){...} and -if (binary_pred (*first2, *first1)){...}. In -those cases when T value is part of the signature, it -should work correctly in the context of if (binary_pred -(*first1 , value)){...} and of if (binary_pred -(value, *first1)){...}. [Note: if the two -types are not identical, and neither is convertable to the other, this -may require that the BinaryPredicate be a functional object -with two overloaded operator()() functions. --end note] -

- -

-Alternatively, one could specify an order for each function. IMHO, this -would be more work for the committee, more work for the implementors, -and of no real advantage for the user: some functions, such as -lexicographical_compare or equal_range, will still require both -functions, and it seems like a much easier rule to teach that both -functions are always required, rather than to have a complicated list of -when you only need one, and which one. -

- - - - - -
-

632. Time complexity of size() for std::set

-

Section: 23.1 [container.requirements] Status: Open - Submitter: Lionel B Date: 2007-02-01

-

View other active issues in [container.requirements].

-

View all other issues in [container.requirements].

-

View all issues with Open status.

-

Discussion:

-

-A recent news group discussion: -

-
-

-Anyone know if the Standard has anything to say about the time complexity -of size() for std::set? I need to access a set's size (/not/ to know if it is empty!) heavily -during an algorithm and was thus wondering whether I'd be better off -tracking the size "manually" or whether that'd be pointless. -

-

-That would be pointless. size() is O(1). -

-

-Nit: the standard says "should" have constant time. Implementations may take -license to do worse. I know that some do this for std::list<> as a part of -some trade-off with other operation. -

- -

-I was aware of that, hence my reluctance to use size() for std::set. -

-

-However, this reason would not apply to std::set<> as far as I can see. -

-

-Ok, I guess the only option is to try it and see... -

-
- -

-If I have any recommendation to the C++ Standards Committee it is that -implementations must (not "should"!) document clearly[1], where known, the -time complexity of *all* container access operations. -

-

-[1] In my case (gcc 4.1.1) I can't swear that the time complexity of size() -for std::set is not documented... but if it is it's certainly well hidden -away. -

- - -

Proposed resolution:

-

-

- - -

[ -Kona (2007): This issue affects all the containers. We'd love to see a -paper dealing with the broad issue. We think that the complexity of the -size() member of every container -- except possibly list -- should be -O(1). Alan has volunteered to provide wording. -]

- - - - - -
-

635. domain of allocator::address

-

Section: 20.1.2 [allocator.requirements] Status: Open - Submitter: Howard Hinnant Date: 2007-02-08

-

View other active issues in [allocator.requirements].

-

View all other issues in [allocator.requirements].

-

View all issues with Open status.

-

Discussion:

-

-The table of allocator requirements in 20.1.2 [allocator.requirements] describes -allocator::address as: -

-
a.address(r)
-a.address(s)
-
-

-where r and s are described as: -

-

-a value of type X::reference obtained by the expression *p. -

- -

-and p is -

- -

-a value of type X::pointer, obtained by calling a1.allocate, -where a1 == a -

- -

-This all implies that to get the address of some value of type T that -value must have been allocated by this allocator or a copy of it. -

- -

-However sometimes container code needs to compare the address of an external value of -type T with an internal value. For example list::remove(const T& t) -may want to compare the address of the external value t with that of a value -stored within the list. Similarly vector or deque insert may -want to make similar comparisons (to check for self-referencing calls). -

- -

-Mandating that allocator::address can only be called for values which the -allocator allocated seems overly restrictive. -

- - - -

Proposed resolution:

-

-Change 20.1.2 [allocator.requirements]: -

- -
-

-r : a value of type X::reference obtained by the expression *p. -

-

-s : a value of type X::const_reference obtained by the -expression *q or by conversion from a value r. -

-
- -

[ -post Oxford: This would be rendered NAD Editorial by acceptance of -N2257. -]

- - -

[ -Kona (2007): This issue is section 8 of N2387. There was some discussion of it but -no resolution to this issue was recorded. Moved to Open. -]

- - - - - - - -
-

638. deque end invalidation during erase

-

Section: 23.2.2.3 [deque.modifiers] Status: Review - Submitter: Steve LoBasso Date: 2007-02-17

-

View all issues with Review status.

-

Discussion:

-

-The standard states at 23.2.2.3 [deque.modifiers]/4: -

-
deque erase(...)
-
-

-Effects: ... An erase at either end of the deque invalidates only -the iterators and the references to the erased elements. -

-
-

-This does not state that iterators to end will be invalidated. -It needs to be amended in such a way as to account for end invalidation. -

-

-Something like: -

-

-Any time the last element is erased, iterators to end are invalidated. -

- -

-This would handle situations like: -

-
erase(begin(), end())
-erase(end() - 1)
-pop_back()
-resize(n, ...) where n < size()
-pop_front() with size() == 1
-
-
- - - -

Proposed resolution:

-

-Change 23.2.2.3 [deque.modifiers], p4: -

- -
-
iterator erase(const_iterator position); 
-iterator erase(const_iterator first, const_iterator last);
-
- -
-

--4- Effects: An erase in the middle of the deque -invalidates all the iterators and references to elements of the -deque and the past-the-end iterator. An erase at -either end of the deque invalidates only the iterators and the -references to the erased elements, except that erasing at the end -also invalidates the past-the-end iterator. -

-
-
- - - -

[ -Kona (2007): Proposed wording added and moved to Review. -]

- - - - - -
-

645. Missing members in match_results

-

Section: 28.10 [re.results] Status: Review - Submitter: Daniel Krügler Date: 2007-02-26

-

View other active issues in [re.results].

-

View all other issues in [re.results].

-

View all issues with Review status.

-

Discussion:

-

-According to the description given in 28.10 [re.results]/2 the class template -match_results "shall satisfy the requirements of a Sequence, [..], -except that only operations defined for const-qualified Sequences -are supported". -Comparing the provided operations from 28.10 [re.results]/3 with the -sequence/container tables 80 and 81 one recognizes the following -missing operations: -

- -

-1) The members -

- -
const_iterator rbegin() const;
-const_iterator rend() const;
-
- -

-should exists because 23.1/10 demands these for containers -(all sequences are containers) which support bidirectional -iterators. Aren't these supported by match_result? This is not -explicitely expressed, but it's somewhat implied by two arguments: -

-

-(a) Several typedefs delegate to -iterator_traits<BidirectionalIterator>. -

-

-(b) The existence of const_reference operator[](size_type n) const -implies even random-access iteration. -I also suggest, that match_result should explicitly mention, -which minimum iterator category is supported and if this does -not include random-access the existence of operator[] is -somewhat questionable. -

-

-2) The new "convenience" members -

-
const_iterator cbegin() const;
-const_iterator cend() const;
-const_iterator crbegin() const;
-const_iterator crend() const;
-
-

-should be added according to tables 80/81. -

- - -

Proposed resolution:

-

-Add the following members to the match_results synopsis after end() in 28.10 [re.results] -para 3: -

- -
const_iterator cbegin() const; 
-const_iterator cend() const;
-
- -

-In section 28.10.3 [re.results.acc] change: -

- -
-
const_iterator begin() const;
-const_iterator cbegin() const;
-
-
-

--7- Returns: A starting iterator that enumerates over all the sub-expressions stored in *this. -

-
- -
const_iterator end() const;
-const_iterator cend() const;
-
-
-

--8- Returns: A terminating iterator that enumerates over all the sub-expressions stored in *this. -

-
-
- - - -

[ -Kona (2007): Voted to adopt proposed wording in -N2409 -except removing the entry in the table container requirements. Moved to Review. -]

- - - - - -
-

653. Library reserved names

-

Section: 1.2 [intro.refs] Status: Open - Submitter: Alisdair Meredith Date: 2007-03-08

-

View all other issues in [intro.refs].

-

View all issues with Open status.

-

Discussion:

-

-

-
-

-1.2 [intro.refs] Normative references -

- -

-The following standards contain provisions which, through reference in -this text, constitute provisions of this Interna- tional Standard. At -the time of publication, the editions indicated were valid. All -standards are subject to revision, and parties to agreements based on -this International Standard are encouraged to investigate the -possibility of applying the most recent editions of the standards -indicated below. Members of IEC and ISO maintain registers of currently -valid International Standards. -

- -
    -
  • Ecma International, ECMAScript Language Specification, Standard -Ecma-262, third edition, 1999.
  • -
  • ISO/IEC 2382 (all parts), Information technology - Vocabulary
  • -
  • ISO/IEC 9899:1990, Programming languages - C
  • -
  • ISO/IEC 9899/Amd.1:1995, Programming languages - C, AMENDMENT 1: C -Integrity
  • -
  • ISO/IEC 9899:1999, Programming languages - C
  • -
  • ISO/IEC 9899:1999/Cor.1:2001 Programming languages - C
  • -
  • ISO/IEC 9899:1999/Cor.2:2004 Programming languages - C
  • -
  • ISO/IEC 9945:2003, Information Technology-Portable Operating System -Interface (POSIX)
  • -
  • ISO/IEC 10646-1:1993 Information technology - Universal Multiple-Octet -Coded Character Set (UCS) - Part 1: Architecture and Basic Multilingual -Plane
  • -
-
- -

-I'm not sure how many of those reserve naming patterns that might affect -us, but I am equally sure I don't own a copy of any of these to check! -

-

-The point is to list the reserved naming patterns, rather than the -individual names themselves - although we may want to list C keywords -that are valid identifiers in C++ but likely to cause trouble in shared -headers (e.g. restrict) -

- -

[ -Kona (2007): Recommend NAD. No one has identified a specific defect, just the possibility of one. -]

- - -

[ -Post-Kona: Alisdair request Open. A good example of the problem was a -discussion of the system error proposal, where it was pointed out an all-caps -identifier starting with a capital E conflicted with reserved macro names for -both Posix and C. I had absolutely no idea of this rule, and suspect I was -not the only one in the room.
-
-Resolution will require someone with access to all the listed documents to -research their respective name reservation rules, or people with access to -specific documents add their rules to this issue until the list is complete. -]

- - - - -

Proposed resolution:

- - - - - -
-

659. istreambuf_iterator should have an operator->()

-

Section: 24.5.3 [istreambuf.iterator] Status: Open - Submitter: Niels Dekker Date: 2007-03-25

-

View all other issues in [istreambuf.iterator].

-

View all issues with Open status.

-

Discussion:

-

-Greg Herlihy has clearly demonstrated that a user defined input -iterator should have an operator->(), even if its -value type is a built-in type (comp.std.c++, "Re: Should any iterator -have an operator->() in C++0x?", March 2007).  And as Howard -Hinnant remarked in the same thread that the input iterator -istreambuf_iterator doesn't have one, this must be a -defect! -

-

-Based on Greg's example, the following code demonstrates the issue: -

 #include <iostream> 
- #include <fstream>
- #include <streambuf> 
-
- typedef char C;
- int main ()
- {
-   std::ifstream s("filename", std::ios::in);
-   std::istreambuf_iterator<char> i(s);
-
-   (*i).~C();  // This is well-formed...
-   i->~C();  // ... so this should be supported!
- }
-
- -

-Of course, operator-> is also needed when the value_type of -istreambuf_iterator is a class. -

-

-The operator-> could be implemented in various ways.  For instance, -by storing the current value inside the iterator, and returning its -address.  Or by returning a proxy, like operator_arrow_proxy, from -http://www.boost.org/boost/iterator/iterator_facade.hpp -

-

-I hope that the resolution of this issue will contribute to getting a -clear and consistent definition of iterator concepts. -

- - -

Proposed resolution:

-

-Add to the synopsis in 24.5.3 [istreambuf.iterator]: -

- -
charT operator*() const;
-pointer operator->() const;
-istreambuf_iterator<charT,traits>& operator++();
-
- -

-Change 24.5.3 [istreambuf.iterator], p1: -

- -

-The class template istreambuf_iterator reads successive -characters from the streambuf for which it was constructed. -operator* provides access to the current input character, if -any. operator-> may return a proxy. Each time -operator++ is evaluated, the iterator advances to the next -input character. If the end of stream is reached -(streambuf_type::sgetc() returns traits::eof()), the -iterator becomes equal to the end of stream iterator value. The default -constructor istreambuf_iterator() and the constructor -istreambuf_iterator(0) both construct an end of stream iterator -object suitable for use as an end-of-range. -

- - - -

[ -Kona (2007): The proposed resolution is inconsistent because the return -type of istreambuf_iterator::operator->() is specified to be pointer, -but the proposed text also states that "operator-> may return a proxy." -]

- - -

[ -Niels Dekker (mailed to Howard Hinnant): -]

- -
-

-The proposed resolution does -not seem inconsistent to me. istreambuf_iterator::operator->() should -have istreambuf_iterator::pointer as return type, and this return type -may in fact be a proxy. -

-

-AFAIK, the resolution of 445 ("iterator_traits::reference -unspecified for some iterator categories") implies that for any iterator -class Iter, the return type of operator->() is Iter::pointer, by -definition.  I don't think Iter::pointer needs to be a raw pointer. -

-

-Still I wouldn't mind if the text "operator-> may return a proxy" would -be removed from the resolution. I think it's up to the library -implementation, how to implement istreambuf_iterator::operator->().  As -longs as it behaves as expected: i->m should have the same effect as -(*i).m. Even for an explicit destructor call, i->~C().  The main issue -is just: istreambuf_iterator should have an operator->()! -

-
- - - - -
-

661. New 27.6.1.2.2 changes make special extractions useless

-

Section: 27.6.1.2.2 [istream.formatted.arithmetic] Status: Ready - Submitter: Daniel Krügler Date: 2007-04-01

-

View other active issues in [istream.formatted.arithmetic].

-

View all other issues in [istream.formatted.arithmetic].

-

View all issues with Ready status.

-

Discussion:

-

-To the more drastic changes of 27.6.1.2.2 [istream.formatted.arithmetic] in the current draft N2134 belong -the explicit description of the extraction of the types short and int in -terms of as-if code fragments. -

- -
    -
  1. -The corresponding as-if extractions in paragraph 2 and 3 will never -result in a change of the operator>> argument val, because the -contents of the local variable lval is in no case written into val. -Furtheron both fragments need a currently missing parentheses in the -beginning of the if-statement to be valid C++. -
  2. -
  3. I would like to ask whether the omission of a similar explicit -extraction of unsigned short and unsigned int in terms of long - -compared to their corresponding new insertions, as described in -27.6.2.6.2 [ostream.inserters.arithmetic], is a deliberate decision or -an -oversight. -
  4. -
- - -

Proposed resolution:

-
    -
  1. -

    -In 27.6.1.2.2 [istream.formatted.arithmetic]/2 change the current as-if code fragment -

    -
    typedef num_get<charT,istreambuf_iterator<charT,traits> > numget;
    -iostate err = 0;
    -long lval;
    -use_facet<numget>(loc).get(*this, 0, *this, err, lval );
    -if (err == 0) {
    -  && if (lval < numeric_limits<short>::min() || numeric_limits<short>::max() < lval))
    -      err = ios_base::failbit;
    -  else
    -    val = static_cast<short>(lval);
    -}
    -setstate(err);
    -
    - -

    -Similarily in 27.6.1.2.2 [istream.formatted.arithmetic]/3 change the current as-if fragment -

    - -
    typedef num_get<charT,istreambuf_iterator<charT,traits> > numget;
    -iostate err = 0;
    -long lval;
    -use_facet<numget>(loc).get(*this, 0, *this, err, lval );
    -if (err == 0) {
    -  && if (lval < numeric_limits<int>::min() || numeric_limits<int>::max() < lval))
    -      err = ios_base::failbit;
    -  else
    -    val = static_cast<int>(lval);
    -}
    -setstate(err);
    -
    -
  2. -
  3. ---- -
  4. -
- - -

[ -Kona (2007): Note to the editor: the name lval in the call to use_facet -is incorrectly italicized in the code fragments corresponding to -operator>>(short &) and operator >>(int &). Also, val -- which appears -twice on the line with the static_cast in the proposed resolution -- -should be italicized. Also, in response to part two of the issue: this -is deliberate. -]

- - - - - -
-

664. do_unshift for codecvt<char, char, mbstate_t>

-

Section: 22.2.1.4.2 [locale.codecvt.virtuals] Status: Ready - Submitter: Thomas Plum Date: 2007-04-16

-

View other active issues in [locale.codecvt.virtuals].

-

View all other issues in [locale.codecvt.virtuals].

-

View all issues with Ready status.

-

Discussion:

-

-22.2.1.4.2 [locale.codecvt.virtuals], para 7 says (regarding do_unshift): -

- -

-Effects: Places characters starting at to that should be appended to -terminate a sequence when the current stateT is given by -state.237) Stores no more than (to_limit - -to) destination elements, and leaves the to_next -pointer pointing one beyond the last element successfully stored. -codecvt<char, char, mbstate_t> stores no characters. -

- -

-The following objection has been raised: -

- -

-Since the C++ Standard permits a nontrivial conversion for the required -instantiations of codecvt, it is overly restrictive to say that -do_unshift must store no characters and return noconv. -

- -

-[Plum ref _222152Y50] -

- - -

Proposed resolution:

-

-Change 22.2.1.4.2 [locale.codecvt.virtuals], p7: -

- -
-

-Effects: Places characters starting at to that should be -appended to terminate a sequence when the current stateT is -given by state.237) Stores no more than (to_limit -to) -destination elements, and leaves the to_next pointer pointing one -beyond the last element successfully stored. codecvt<char, char, -mbstate_t> stores no characters. -

-
- - - - - -
-

665. do_unshift return value

-

Section: 22.2.1.4.2 [locale.codecvt.virtuals] Status: Ready - Submitter: Thomas Plum Date: 2007-04-16

-

View other active issues in [locale.codecvt.virtuals].

-

View all other issues in [locale.codecvt.virtuals].

-

View all issues with Ready status.

-

Discussion:

-

-22.2.1.4.2 [locale.codecvt.virtuals], para 8 says: -

- -

-codecvt<char,char,mbstate_t>, returns noconv. -

- -

-The following objection has been raised: -

- -

-Despite what the C++ Standard  -says, unshift can't always return noconv for the default facets, since  -they can be nontrivial. At least one implementation does whatever the  -C functions do. -

- -

-[Plum ref _222152Y62] -

- - -

Proposed resolution:

-

-Change 22.2.1.4.2 [locale.codecvt.virtuals], p8: -

- -
-

Returns: An enumeration value, as summarized in Table 76:

-

...

-

-codecvt<char,char,mbstate_t>, returns noconv. -

-
- - - - - - -
-

666. moneypunct::do_curr_symbol()

-

Section: 22.2.6.3.2 [locale.moneypunct.virtuals] Status: Ready - Submitter: Thomas Plum Date: 2007-04-16

-

View all other issues in [locale.moneypunct.virtuals].

-

View all issues with Ready status.

-

Discussion:

-

-22.2.6.3.2 [locale.moneypunct.virtuals], para 4 footnote 257 says -

- -

-257) For international  -specializations (second template parameter true) this is always four  -characters long, usually three letters and a space. -

- -

-The following objection has been raised: -

- -

-The international currency  -symbol is whatever the underlying locale says it is, not necessarily  -four characters long. -

- -

-[Plum ref _222632Y41] -

- - -

Proposed resolution:

-

-Change footnote 253 in 22.2.6.3.2 [locale.moneypunct.virtuals]: -

- -
-

-253) For international specializations (second template -parameter true) this is always typically -four characters long, usually three letters and a space. -

-
- - - - - -
-

667. money_get's widened minus sign

-

Section: 22.2.6.1.2 [locale.money.get.virtuals] Status: Open - Submitter: Thomas Plum Date: 2007-04-16

-

View other active issues in [locale.money.get.virtuals].

-

View all other issues in [locale.money.get.virtuals].

-

View all issues with Open status.

-

Discussion:

-

-22.2.6.1.2 [locale.money.get.virtuals], para 1 says: -

- -

-The result is returned as an integral value  -stored in units or as a sequence of digits possibly preceded by a  -minus sign (as produced by ct.widen(c) where c is '-' or in the range  -from '0' through '9', inclusive) stored in digits. -

- -

-The following -objection has been raised: -

- -

-Some implementations interpret this to mean that a facet derived from -ctype<wchar_t> can provide its own member do_widen(char) -which produces e.g. L'@' for the "widened" minus sign, and that the -'@' symbol will appear in the resulting sequence of digits.  Other -implementations have assumed that one or more places in the standard permit the -implementation to "hard-wire" L'-' as the "widened" minus sign.  Are -both interpretations permissible, or only  one? -

- -

-[Plum ref _222612Y14] -

- -

-Furthermore: if ct.widen('9') produces L'X' (a non-digit), does a -parse fail if a '9' appears in the subject string? [Plum ref _22263Y33] -

- -

[ -Kona (2007): Bill and Dietmar to provide proposed wording. -]

- - - -

Proposed resolution:

-

-

- - - - - -
-

668. money_get's empty minus sign

-

Section: 22.2.6.1.2 [locale.money.get.virtuals] Status: Open - Submitter: Thomas Plum Date: 2007-04-16

-

View other active issues in [locale.money.get.virtuals].

-

View all other issues in [locale.money.get.virtuals].

-

View all issues with Open status.

-

Discussion:

-

-22.2.6.1.2 [locale.money.get.virtuals], para 3 says: -

- -

-If pos or neg is empty, the sign component is -optional, and if no sign is detected, the result is given the sign  -that corresponds to the source of the empty string. -

- -

-The following -objection has been raised: -

- -

-A negative_sign of "" means "there is no  -way to write a negative sign" not "any null sequence is a negative  -sign, so it's always there when you look for it". -

- -

-[Plum ref _222612Y32] -

- -

[ -Kona (2007): Bill to provide proposed wording and interpretation of existing wording. -]

- - - - -

Proposed resolution:

-

-

- - - - - -
-

669. Equivalent postive and negative signs in money_get

-

Section: 22.2.6.1.2 [locale.money.get.virtuals] Status: Open - Submitter: Thomas Plum Date: 2007-04-16

-

View other active issues in [locale.money.get.virtuals].

-

View all other issues in [locale.money.get.virtuals].

-

View all issues with Open status.

-

Discussion:

-

-22.2.6.1.2 [locale.money.get.virtuals], para 3 sentence 4 says: -

- -

-If the first character of pos is equal to the first character of neg,  -or if both strings are empty, the result is given a positive sign. -

- -

-One interpretation is that an input sequence must match either the -positive pattern or the negative pattern, and then in either event it -is interpreted as positive.  The following objections has been raised: -

- -

-The input can successfully match only a positive sign, so the negative -pattern is an unsuccessful match. -

- -

-[Plum ref _222612Y34, 222612Y51b] -

- -

[ -Bill to provide proposed wording and interpretation of existing wording. -]

- - - - -

Proposed resolution:

-

-

- - - - - -
-

670. money_base::pattern and space

-

Section: 22.2.6.3 [locale.moneypunct] Status: Open - Submitter: Thomas Plum Date: 2007-04-16

-

View all issues with Open status.

-

Discussion:

-

-22.2.6.3 [locale.moneypunct], para 2 says: -

- -

-The value space indicates that at least one space is required at  -that position. -

- -

-The following objection has been raised: -

- -

-Whitespace is optional when matching space. (See 22.2.6.1.2 [locale.money.get.virtuals], para 2.) -

- -

-[Plum ref _22263Y22] -

- -

[ -Kona (2007): Bill to provide proposed wording. We agree that C++03 is -ambiguous, and that we want C++0X to say "space" means 0 or more -whitespace characters on input. -]

- - - - -

Proposed resolution:

-

-

- - - - - -
-

671. precision of hexfloat

-

Section: 22.2.2.2.2 [facet.num.put.virtuals] Status: Open - Submitter: John Salmon Date: 2007-04-20

-

View all other issues in [facet.num.put.virtuals].

-

View all issues with Open status.

-

Discussion:

-

-I am trying to understand how TR1 supports hex float (%a) output. -

-

-As far as I can tell, it does so via the following: -

-

-8.15 Additions to header <locale> [tr.c99.locale] -

-

-In subclause 22.2.2.2.2 [facet.num.put.virtuals], Table 58 Floating-point conversions, after -the line: -floatfield == ios_base::scientific %E -

-

-add the two lines: -

-
floatfield == ios_base::fixed | ios_base::scientific && !uppercase %a
-floatfield == ios_base::fixed | ios_base::scientific %A 2
-
-

-[Note: The additional requirements on print and scan functions, later -in this clause, ensure that the print functions generate hexadecimal -floating-point fields with a %a or %A conversion specifier, and that -the scan functions match hexadecimal floating-point fields with a %g -conversion specifier.  end note] -

-

-Following the thread, in 22.2.2.2.2 [facet.num.put.virtuals], we find: -

-

-For conversion from a floating-point type, if (flags & fixed) != 0 or -if str.precision() > 0, then str.precision() is specified in the -conversion specification. -

-

-This would seem to imply that when floatfield == fixed|scientific, the -precision of the conversion specifier is to be taken from -str.precision().  Is this really what's intended?  I sincerely hope -that I'm either missing something or this is an oversight.  Please -tell me that the committee did not intend to mandate that hex floats -(and doubles) should by default be printed as if by %.6a. -

- -

[ -Howard: I think the fundamental issue we overlooked was that with %f, -%e, %g, the default precision was always 6.  With %a the default -precision is not 6, it is infinity.  So for the first time, we need to -distinguish between the default value of precision, and the precision -value 6. -]

- - - - -

Proposed resolution:

-

-

- - -

[ -Kona (2007): Robert volunteers to propose wording. -]

- - - - - -
-

672. Swappable requirements need updating

-

Section: 20.1.1 [utility.arg.requirements] Status: Review - Submitter: Howard Hinnant Date: 2007-05-04

-

View other active issues in [utility.arg.requirements].

-

View all other issues in [utility.arg.requirements].

-

View all issues with Review status.

-

Discussion:

-

-The current Swappable is: -

- -
- - - - - -
Table 37: Swappable requirements [swappable]
expressionreturn typepost-condition
swap(s,t)voidt has the value originally held by u, and u has the value originally -held by t
-

-The Swappable requirement is met by satisfying one or more of the following conditions: -

-
    -
  • -T is Swappable if T satisfies the CopyConstructible requirements (Table 34) -and the CopyAssignable requirements (Table 36); -
  • -
  • -T is Swappable if a namespace scope function named swap exists in the same -namespace as the definition of T, such that the expression swap(t,u) is valid -and has the semantics described in this table. -
  • -
-
-
- -

-With the passage of rvalue reference into the language, Swappable needs to be updated to -require only MoveConstructible and MoveAssignable. This is a minimum. -

- -

-Additionally we may want to support proxy references such that the following code is acceptable: -

- -
namespace Mine {
-
-template <class T>
-struct proxy {...};
-
-template <class T>
-struct proxied_iterator
-{
-   typedef T value_type;
-   typedef proxy<T> reference;
-   reference operator*() const;
-   ...
-};
-
-struct A
-{
-   // heavy type, has an optimized swap, maybe isn't even copyable or movable, just swappable
-   void swap(A&);
-   ...
-};
-
-void swap(A&, A&);
-void swap(proxy<A>, A&);
-void swap(A&, proxy<A>);
-void swap(proxy<A>, proxy<A>);
-
-}  // Mine
-
-...
-
-Mine::proxied_iterator<Mine::A> i(...)
-Mine::A a;
-swap(*i1, a);
-
- -

-I.e. here is a call to swap which the user enables swapping between a proxy to a class and the class -itself. We do not need to anything in terms of implementation except not block their way with overly -constrained concepts. That is, the Swappable concept should be expanded to allow swapping -between two different types for the case that one is binding to a user-defined swap. -

- - - -

Proposed resolution:

- -

-Change 20.1.1 [utility.arg.requirements]: -

- -
- -

--1- The template definitions in the C++ Standard Library refer to various -named requirements whose details are set out in tables 31-38. In these -tables, T is a type to be supplied by a C++ program -instantiating a template; a, b, and c are -values of type const T; s and t are modifiable -lvalues of type T; u is a value of type (possibly -const) T; and rv is a non-const -rvalue of type T. -

- - - - - - - -
Table 37: Swappable requirements [swappable]
expressionreturn typepost-condition
swap(s,t)voidt has the value originally -held by u, and -u has the value originally held -by t
-

-The Swappable requirement is met by satisfying one or more of the following conditions: -

-
    -
  • -T is Swappable if T satisfies the -CopyConstructible MoveConstructible -requirements (Table 34 33) and the CopyAssignable MoveAssignable -requirements (Table 36 35); -
  • -
  • -T is Swappable if a namespace scope function named -swap exists in the same namespace as the definition of -T, such that the expression -swap(t,u) is valid and has the -semantics described in this table. -
  • -
-
-
- - - -

[ -Kona (2007): We like the change to the Swappable requirements to use -move semantics. The issue relating to the support of proxies is -separable from the one relating to move semantics, and it's bigger than -just swap. We'd like to address only the move semantics changes under -this issue, and open a separated issue (742) to handle proxies. Also, there -may be a third issue, in that the current definition of Swappable does -not permit rvalues to be operands to a swap operation, and Howard's -proposed resolution would allow the right-most operand to be an rvalue, -but it would not allow the left-most operand to be an rvalue (some swap -functions in the library have been overloaded to permit left operands to -swap to be rvalues). -]

- - - - - -
-

673. unique_ptr update

-

Section: 20.6.5 [unique.ptr] Status: Open - Submitter: Howard Hinnant Date: 2007-05-04

-

View all issues with Open status.

-

Discussion:

-

-Since the publication of -N1856 -there have been a few small but significant advances which should be included into -unique_ptr. There exists a -reference implmenation -for all of these changes. -

- -
    - -
  • -

    -Even though unique_ptr<void> is not a valid use case (unlike for shared_ptr<void>), -unexpected cases to crop up which require the instantiation of the interface of unique_ptr<void> -even if it is never used. For example see -LWG 541 for how this accidently -happened to auto_ptr. I believe the most robust way to protect unique_ptr against this -type of failure is to augment the return type of unique_ptr<T>:operator*() with -add_lvalue_reference<T>::type. This means that given an instantiated unique_ptr<void> -the act of dereferencing it will simply return void instead of causing a compile time failure. -This is simpler than creating a unique_ptr<void> specialization which isn't robust in the -face of cv-qualified void types. -

    - -

    -This resolution also supports instantiations such as unique_ptr<void, free_deleter> -which could be very useful to the client. -

    - -
  • - -
  • -

    -Efforts have been made to better support containers and smart pointers in shared -memory contexts. One of the key hurdles in such support is not assuming that a -pointer type is actually a T*. This can easily be accomplished -for unique_ptr by having the deleter define the pointer type: -D::pointer. Furthermore this type can easily be defaulted to -T* should the deleter D choose not to define a pointer -type (reference implementation -here). -This change has no run time overhead. It has no interface overhead on -authors of custom delter types. It simply allows (but not requires) -authors of custom deleter types to define a smart pointer for the -storage type of unique_ptr if they find such functionality -useful. std::default_delete is an example of a deleter which -defaults pointer to T* by simply ignoring this issue -and not including a pointer typedef. -

    -
  • - -
  • -

    -When the deleter type is a function pointer then it is unsafe to construct -a unique_ptr without specifying the function pointer in the constructor. -This case is easy to check for with a static_assert assuring that the -deleter is not a pointer type in those constructors which do not accept deleters. -

    - -
    unique_ptr<A, void(*)(void*)> p(new A);  // error, no function given to delete the pointer!
    -
    - -
  • - -
- -

[ -Kona (2007): We don't like the solution given to the first bullet in -light of concepts. The second bullet solves the problem of supporting -fancy pointers for one library component only. The full LWG needs to -decide whether to solve the problem of supporting fancy pointers -piecemeal, or whether a paper addressing the whole library is needed. We -think that the third bullet is correct. -]

- - -

[ -Post Kona: Howard adds example user code related to the first bullet: -]

- - -
-
void legacy_code(void*, std::size_t);
-
-void foo(std::size_t N)
-{
-    std::unique_ptr<void, void(*)(void*)> ptr(std::malloc(N), std::free);
-    legacy_code(ptr.get(), N);
-}   // unique_ptr used for exception safety purposes
-
-
- -

-I.e. unique_ptr<void> is a useful tool that we don't want -to disable with concepts. The only part of unique_ptr<void> we -want to disable (with concepts or by other means) are the two member functions: -

- -
T& operator*() const;
-T* operator->() const;
-
- - - -

Proposed resolution:

- -

[ -I am grateful for the generous aid of Peter Dimov and Ion Gaztañaga in helping formulate and review -the proposed resolutions below. -]

- - -
    -
  • - -

    -Change 20.6.5.2 [unique.ptr.single]: -

    - -
    template <class T, class D = default_delete<T>> class unique_ptr {
    -   ...
    -   T& typename add_lvalue_reference<T>::type operator*() const;
    -   ...
    -};
    -
    - -

    -Change 20.6.5.2.4 [unique.ptr.single.observers]: -

    - -
    T& typename add_lvalue_reference<T>::type operator*() const;
    -
    - -
  • - -
  • -

    -Change 20.6.5.2 [unique.ptr.single]: -

    - -
    template <class T, class D = default_delete<T>> class unique_ptr {
    -public:
    -  typedef implementation (see description below) pointer;
    -   ...
    -   explicit unique_ptr(T* pointer p);
    -   ...
    -   unique_ptr(T* pointer p, implementation defined (see description below) d);
    -   unique_ptr(T* pointer p, implementation defined (see description below) d);
    -   ...
    -   T* pointer operator->() const;
    -   T* pointer get() const;
    -   ...
    -   T* pointer release();
    -   void reset(T* pointer p = 0 pointer());
    -};
    -
    - -

    - --3- If the type remove_reference<D>::type::pointer -exists, then unique_ptr<T, D>::pointer is a typedef to -remove_reference<D>::type::pointer. Otherwise -unique_ptr<T, D>::pointer is a typedef to T*. -The type unique_ptr<T, D>::pointer must be CopyConstructible -and CopyAssignable. - -

    - -

    -Change 20.6.5.2.1 [unique.ptr.single.ctor]: -

    - -
    unique_ptr(T* pointer p);
    -...
    -unique_ptr(T* pointer p, implementation defined d); 
    -unique_ptr(T* pointer p, implementation defined d); 
    -...
    -unique_ptr(T* pointer p, const A& d);
    -unique_ptr(T* pointer p, A&& d);
    -...
    -unique_ptr(T* pointer p, A& d); 
    -unique_ptr(T* pointer p, A&& d);
    -...
    -unique_ptr(T* pointer p, const A& d); 
    -unique_ptr(T* pointer p, const A&& d);
    -...
    -
    - -

    --23- Requires: If D is not a reference type, -construction of the deleter D from an rvalue of type E -must be well formed and not throw an exception. If D is a -reference type, then E must be the same type as D -(diagnostic required). U* unique_ptr<U,E>::pointer -must be implicitly convertible to T* -pointer. -

    - -

    --25- Postconditions: get() == value u.get() had before -the construction, modulo any required offset adjustments resulting from -the cast from U* -unique_ptr<U,E>::pointer to T* -pointer. get_deleter() returns a reference to the -internally stored deleter which was constructed from -u.get_deleter(). -

    - -

    -Change 20.6.5.2.3 [unique.ptr.single.asgn]: -

    - -
    -

    --8- Requires: Assignment of the deleter D from an rvalue -D must not throw an exception. U* -unique_ptr<U,E>::pointer must be implicitly -convertible to T* pointer. -

    -
    - -

    -Change 20.6.5.2.4 [unique.ptr.single.observers]: -

    - -
    -
    T* pointer operator->() const;
    -... -
    T* pointer get() const;
    -
    - -

    -Change 20.6.5.2.5 [unique.ptr.single.modifiers]: -

    - -
    -
    T* pointer release();
    -... -
    void reset(T* pointer p = 0 pointer());
    -
    - -

    -Change 20.6.5.3 [unique.ptr.runtime]: -

    - -
    template <class T, class D> class unique_ptr<T[], D> {
    -public:
    -  typedef implementation pointer;
    -   ...
    -   explicit unique_ptr(T* pointer p);
    -   ...
    -   unique_ptr(T* pointer p, implementation defined d);
    -   unique_ptr(T* pointer p, implementation defined d);
    -   ...
    -   T* pointer get() const;
    -   ...
    -   T* pointer release();
    -   void reset(T* pointer p = 0 pointer());
    -};
    -
    - -

    -Change 20.6.5.3.1 [unique.ptr.runtime.ctor]: -

    - -
    -
    unique_ptr(T* pointer p);
    -unique_ptr(T* pointer p, implementation defined d);
    -unique_ptr(T* pointer p, implementation defined d);
    -
    - -

    -These constructors behave the same as in the primary template except -that they do not accept pointer types which are convertible to -T* pointer. [Note: One -implementation technique is to create private templated overloads of -these members. -- end note] -

    -
    - -

    -Change 20.6.5.3.3 [unique.ptr.runtime.modifiers]: -

    - -
    -
    void reset(T* pointer p = 0 pointer());
    -
    - -

    --1- Requires: Does not accept pointer types which are convertible -to T* pointer (diagnostic -required). [Note: One implementation technique is to create a private -templated overload. -- end note] -

    -
    - -

    -Change 20.6.5.4 [unique.ptr.compiletime]: -

    - -
    template <class T, class D,  size_t N> class unique_ptr<T[N], D> {
    -public:
    -  typedef implementation pointer;
    -   ...
    -   explicit unique_ptr(T* pointer p);
    -   ...
    -   unique_ptr(T* pointer p, implementation defined d);
    -   unique_ptr(T* pointer p, implementation defined d);
    -   ...
    -   T* pointer get() const;
    -   ...
    -   T* pointer release();
    -   void reset(T* pointer p = 0 pointer());
    -};
    -
    - -

    -Change 20.6.5.4.3 [unique.ptr.compiletime.modifiers]: -

    - -
    -
    void reset(T* pointer p = 0 pointer());
    -
    - -

    --1- Requires: Does not accept pointer types which are convertible -to T* pointer (dignostic required). [Note: One implementation -technique is to create a private templated overload. --end note] -

    - -
    - -
  • - -
  • - -

    -Change 20.6.5.2.1 [unique.ptr.single.ctor]: -

    - -
    -
    unique_ptr();
    -
    -

    -Requires: D must be default constructible, and that -construction must not throw an exception. D must not be a -reference type or pointer type (diagnostic required). -

    -
    -
    unique_ptr(T* pointer p);
    -
    -

    -Requires: The expression D()(p) must be well formed. -The default constructor of D must not throw an exception. -D must not be a reference type or pointer type (diagnostic -required). -

    -
    -
    - -

    -Change 20.6.5.2.1 [unique.ptr.single.ctor]: -

    - -
    -
    unique_ptr();
    -
    -

    -Requires: D must be default constructible, and that -construction must not throw an exception. D must not be a -reference type or pointer type (diagnostic required). -

    -
    -
    unique_ptr(T* pointer p);
    -
    -

    -Requires: The expression D()(p) must be well formed. -The default constructor of D must not throw an exception. -D must not be a reference type or pointer type (diagnostic -required). -

    -
    -
    - -
  • - -
- - - - - - -
-

674. shared_ptr interface changes for consistency with N1856

-

Section: 20.6.6.2 [util.smartptr.shared] Status: Ready - Submitter: Peter Dimov Date: 2007-05-05

-

View other active issues in [util.smartptr.shared].

-

View all other issues in [util.smartptr.shared].

-

View all issues with Ready status.

-

Discussion:

-

-N1856 does not propose -any changes to shared_ptr. It needs to be updated to use a rvalue reference where appropriate -and to interoperate with unique_ptr as it does with auto_ptr. -

- - -

Proposed resolution:

- -

-Change 20.6.6.2 [util.smartptr.shared] as follows: -

- -
-
template<class Y> explicit shared_ptr(auto_ptr<Y>&&& r);
-template<class Y, class D> explicit shared_ptr(const unique_ptr<Y,D>& r) = delete;
-template<class Y, class D> explicit shared_ptr(unique_ptr<Y,D>&& r);
-...
-template<class Y> shared_ptr& operator=(auto_ptr<Y>&&& r);
-template<class Y, class D> shared_ptr& operator=(const unique_ptr<Y,D>& r) = delete;
-template<class Y, class D> shared_ptr& operator=(unique_ptr<Y,D>&& r);
-
- -

-Change 20.6.6.2.1 [util.smartptr.shared.const] as follows: -

- -
-
template<class Y> shared_ptr(auto_ptr<Y>&&& r);
-
- -

-Add to 20.6.6.2.1 [util.smartptr.shared.const]: -

- -
-
template<class Y, class D> shared_ptr(unique_ptr<Y, D>&& r);
-
- -

-Effects: Equivalent to shared_ptr( r.release(), r.get_deleter() ) when D is - not a reference type, shared_ptr( r.release(), ref( r.get_deleter() ) ) - otherwise. -

- -

-Exception safety: If an exception is thrown, the constructor has no effect. -

-
- -
- -

-Change 20.6.6.2.3 [util.smartptr.shared.assign] as follows: -

- -
-
template<class Y> shared_ptr& operator=(auto_ptr<Y>&&& r);
-
- -

-Add to 20.6.6.2.3 [util.smartptr.shared.assign]: -

- -
-
template<class Y, class D> shared_ptr& operator=(unique_ptr<Y,D>&& r);
- -
-

--4- Effects: Equivalent to shared_ptr(std::move(r)).swap(*this). -

-

--5- Returns: *this. -

-
- -
- - - -

[ -Kona (2007): We may need to open an issue (743) to deal with the question of -whether shared_ptr needs an rvalue swap. -]

- - - - - -
-

675. Move assignment of containers

-

Section: 23.1 [container.requirements] Status: Ready - Submitter: Howard Hinnant Date: 2007-05-05

-

View other active issues in [container.requirements].

-

View all other issues in [container.requirements].

-

View all issues with Ready status.

-

Discussion:

-

-James Hopkin pointed out to me that if vector<T> move assignment is O(1) -(just a swap) then containers such as vector<shared_ptr<ostream>> might have -the wrong semantics under move assignment when the source is not truly an rvalue, but a -moved-from lvalue (destructors could run late). -

- -
vector<shared_ptr<ostream>> v1;
-vector<shared_ptr<ostream>> v2;
-...
-v1 = v2;               // #1
-v1 = std::move(v2);    // #2
-
- -

-Move semantics means not caring what happens to the source (v2 in this example). -It doesn't mean not caring what happens to the target (v1). In the above example -both assignments should have the same effect on v1. Any non-shared ostream's -v1 owns before the assignment should be closed, whether v1 is undergoing -copy assignment or move assignment. -

- -

-This implies that the semantics of move assignment of a generic container should be -clear, swap instead of just swap. An alternative which could achieve the same -effect would be to move assign each element. In either case, the complexity of move -assignment needs to be relaxed to O(v1.size()). -

- -

-The performance hit of this change is not nearly as drastic as it sounds. -In practice, the target of a move assignment has always just been move constructed -or move assigned from. Therefore under clear, swap semantics (in -this common use case) we are still achieving O(1) complexity. -

- - - -

Proposed resolution:

-

-Change 23.1 [container.requirements]: -

- -
- - - - - - - - - - - - -
Table 86: Container requirements
expressionreturn typeoperational semanticsassertion/note pre/post-conditioncomplexity
a = rv;X&All existing elements of a are either move assigned or destructeda shall be equal to the -value that rv had -before this construction -constant linear in a.size()
-
- - - - - - -
-

676. Moving the unordered containers

-

Section: 23.4 [unord] Status: Ready - Submitter: Howard Hinnant Date: 2007-05-05

-

View other active issues in [unord].

-

View all other issues in [unord].

-

View all issues with Ready status.

-

Discussion:

-

-Move semantics are missing from the unordered containers. The proposed -resolution below adds move-support consistent with -N1858 -and the current working draft. -

- -

-The current proposed resolution simply lists the requirements for each function. -These might better be hoisted into the requirements table for unordered associative containers. -Futhermore a mild reorganization of the container requirements could well be in order. -This defect report is purposefully ignoring these larger issues and just focusing -on getting the unordered containers "moved". -

- - - -

Proposed resolution:

- -

-Add to 23.4 [unord]: -

- -
template <class Key, class T, class Hash, class Pred, class Alloc> 
-  void swap(unordered_map<Key, T, Hash, Pred, Alloc>& x, 
-            unordered_map<Key, T, Hash, Pred, Alloc>& y); 
-
-template <class Key, class T, class Hash, class Pred, class Alloc> 
-  void swap(unordered_map<Key, T, Hash, Pred, Alloc>& x, 
-            unordered_map<Key, T, Hash, Pred, Alloc>&& y);
-
-template <class Key, class T, class Hash, class Pred, class Alloc> 
-  void swap(unordered_map<Key, T, Hash, Pred, Alloc>&& x, 
-            unordered_map<Key, T, Hash, Pred, Alloc>& y);
-
-template <class Key, class T, class Hash, class Pred, class Alloc> 
-  void swap(unordered_multimap<Key, T, Hash, Pred, Alloc>& x, 
-            unordered_multimap<Key, T, Hash, Pred, Alloc>& y);
-
-template <class Key, class T, class Hash, class Pred, class Alloc> 
-  void swap(unordered_multimap<Key, T, Hash, Pred, Alloc>& x, 
-            unordered_multimap<Key, T, Hash, Pred, Alloc>&& y);
-
-template <class Key, class T, class Hash, class Pred, class Alloc> 
-  void swap(unordered_multimap<Key, T, Hash, Pred, Alloc>&& x, 
-            unordered_multimap<Key, T, Hash, Pred, Alloc>& y);
-
-...
-
-template <class Value, class Hash, class Pred, class Alloc> 
-  void swap(unordered_set<Value, Hash, Pred, Alloc>& x, 
-            unordered_set<Value, Hash, Pred, Alloc>& y); 
-
-template <class Value, class Hash, class Pred, class Alloc> 
-  void swap(unordered_set<Value, Hash, Pred, Alloc>& x, 
-            unordered_set<Value, Hash, Pred, Alloc>&& y);
-
-template <class Value, class Hash, class Pred, class Alloc> 
-  void swap(unordered_set<Value, Hash, Pred, Alloc>&& x, 
-            unordered_set<Value, Hash, Pred, Alloc>& y);
-
-template <class Value, class Hash, class Pred, class Alloc> 
-  void swap(unordered_multiset<Value, Hash, Pred, Alloc>& x, 
-            unordered_multiset<Value, Hash, Pred, Alloc>& y);
-
-template <class Value, class Hash, class Pred, class Alloc> 
-  void swap(unordered_multiset<Value, Hash, Pred, Alloc>& x, 
-            unordered_multiset<Value, Hash, Pred, Alloc>&& y);
-
-template <class Value, class Hash, class Pred, class Alloc> 
-  void swap(unordered_multiset<Value, Hash, Pred, Alloc>&& x, 
-            unordered_multiset<Value, Hash, Pred, Alloc>& y);
-
- -

unordered_map

- -

-Change 23.4.1 [unord.map]: -

- -
class unordered_map
-{
-    ...
-    unordered_map(const unordered_map&);
-    unordered_map(unordered_map&&);
-    ~unordered_map();
-    unordered_map& operator=(const unordered_map&);
-    unordered_map& operator=(unordered_map&&);
-    ...
-    // modifiers 
-    std::pair<iterator, bool> insert(const value_type& obj); 
-    template <class P> pair<iterator, bool> insert(P&& obj);
-    iterator       insert(iterator hint, const value_type& obj);
-    template <class P> iterator       insert(iterator hint, P&& obj);
-    const_iterator insert(const_iterator hint, const value_type& obj);
-    template <class P> const_iterator insert(const_iterator hint, P&& obj);
-    ...
-    void swap(unordered_map&&);
-    ...
-    mapped_type& operator[](const key_type& k);
-    mapped_type& operator[](key_type&& k);
-    ...
-};
-
-template <class Key, class T, class Hash, class Pred, class Alloc> 
-  void swap(unordered_map<Key, T, Hash, Pred, Alloc>& x, 
-            unordered_map<Key, T, Hash, Pred, Alloc>& y);
-
-template <class Key, class T, class Hash, class Pred, class Alloc> 
-  void swap(unordered_map<Key, T, Hash, Pred, Alloc>& x, 
-            unordered_map<Key, T, Hash, Pred, Alloc>&& y);
-
-template <class Key, class T, class Hash, class Pred, class Alloc> 
-  void swap(unordered_map<Key, T, Hash, Pred, Alloc>&& x, 
-            unordered_map<Key, T, Hash, Pred, Alloc>& y);
-
- -

-Add to 23.4.1.1 [unord.map.cnstr]: -

- -
-
template <class InputIterator>
-  unordered_map(InputIterator f, InputIterator l, 
-                size_type n = implementation-defined, 
-                const hasher& hf = hasher(), 
-                const key_equal& eql = key_equal(), 
-                const allocator_type& a = allocator_type());
-
- -

- -Requires: If the iterator's dereference operator returns an -lvalue or a const rvalue pair<key_type, mapped_type>, -then both key_type and mapped_type shall be -CopyConstructible. - -

-
- -

-Add to 23.4.1.2 [unord.map.elem]: -

- -
- -
mapped_type& operator[](const key_type& k);
- -
-

...

-

-Requires: key_type shall be CopyConstructible -and mapped_type shall be DefaultConstructible. -

-
- -
mapped_type& operator[](key_type&& k);
- -
-

-Effects: If the unordered_map does not already contain an -element whose key is equivalent to k , inserts the value -std::pair<const key_type, mapped_type>(std::move(k), mapped_type()). -

- -

-Requires: mapped_type shall be DefaultConstructible. -

- -

-Returns: A reference to x.second, where x is the -(unique) element whose key is equivalent to k. -

- -
- -
- -

-Add new section [unord.map.modifiers]: -

- -
-
pair<iterator, bool> insert(const value_type& x);
-template <class P> pair<iterator, bool> insert(P&& x);
-iterator       insert(iterator hint, const value_type& x);
-template <class P> iterator       insert(iterator hint, P&& x);
-const_iterator insert(const_iterator hint, const value_type& x);
-template <class P> const_iterator insert(const_iterator hint, P&& x);
-template <class InputIterator>
-  void insert(InputIterator first, InputIterator last);
-
- -
-

-Requires: Those signatures taking a const value_type& parameter -requires both the key_type and the mapped_type to be -CopyConstructible. -

- -

-P shall be convertible to value_type. - If P is instantiated as a reference -type, then the argument x is copied from. Otherwise x -is considered to be an rvalue as it is converted to value_type -and inserted into the unordered_map. Specifically, in such -cases CopyConstructible is not required of key_type or -mapped_type unless the conversion from P specifically -requires it (e.g. if P is a tuple<const key_type, -mapped_type>, then key_type must be -CopyConstructible). -

- -

-The signature taking InputIterator -parameters requires CopyConstructible of both -key_type and mapped_type if the dereferenced -InputIterator returns an lvalue or const rvalue -value_type. -

- -
- -
- -

-Add to 23.4.1.3 [unord.map.swap]: -

- -
-
template <class Key, class T, class Hash, class Pred, class Alloc> 
-  void swap(unordered_map<Key, T, Hash, Pred, Alloc>& x, 
-            unordered_map<Key, T, Hash, Pred, Alloc>& y);
-template <class Key, class T, class Hash, class Pred, class Alloc> 
-  void swap(unordered_map<Key, T, Hash, Pred, Alloc>& x, 
-            unordered_map<Key, T, Hash, Pred, Alloc>&& y);
-template <class Key, class T, class Hash, class Pred, class Alloc> 
-  void swap(unordered_map<Key, T, Hash, Pred, Alloc>&& x, 
-            unordered_map<Key, T, Hash, Pred, Alloc>& y);
-
-
- -

unordered_multimap

- -

-Change 23.4.2 [unord.multimap]: -

- -
class unordered_multimap
-{
-    ...
-    unordered_multimap(const unordered_multimap&);
-    unordered_multimap(unordered_multimap&&);
-    ~unordered_multimap();
-    unordered_multimap& operator=(const unordered_multimap&);
-    unordered_multimap& operator=(unordered_multimap&&);
-    ...
-    // modifiers 
-    iterator insert(const value_type& obj); 
-    template <class P> iterator insert(P&& obj);
-    iterator       insert(iterator hint, const value_type& obj);
-    template <class P> iterator       insert(iterator hint, P&& obj);
-    const_iterator insert(const_iterator hint, const value_type& obj);
-    template <class P> const_iterator insert(const_iterator hint, P&& obj);
-    ...
-    void swap(unordered_multimap&&);
-    ...
-};
-
-template <class Key, class T, class Hash, class Pred, class Alloc> 
-  void swap(unordered_multimap<Key, T, Hash, Pred, Alloc>& x, 
-            unordered_multimap<Key, T, Hash, Pred, Alloc>& y);
-
-template <class Key, class T, class Hash, class Pred, class Alloc> 
-  void swap(unordered_multimap<Key, T, Hash, Pred, Alloc>& x, 
-            unordered_multimap<Key, T, Hash, Pred, Alloc>&& y);
-
-template <class Key, class T, class Hash, class Pred, class Alloc> 
-  void swap(unordered_multimap<Key, T, Hash, Pred, Alloc>&& x, 
-            unordered_multimap<Key, T, Hash, Pred, Alloc>& y);
-
- -

-Add to 23.4.2.1 [unord.multimap.cnstr]: -

- -
-
template <class InputIterator>
-  unordered_multimap(InputIterator f, InputIterator l, 
-                size_type n = implementation-defined, 
-                const hasher& hf = hasher(), 
-                const key_equal& eql = key_equal(), 
-                const allocator_type& a = allocator_type());
-
- -

- -Requires: If the iterator's dereference operator returns an -lvalue or a const rvalue pair<key_type, mapped_type>, -then both key_type and mapped_type shall be -CopyConstructible. - -

-
- -

-Add new section [unord.multimap.modifiers]: -

- -
-
iterator insert(const value_type& x);
-template <class P> iterator       insert(P&& x);
-iterator       insert(iterator hint, const value_type& x);
-template <class P> iterator       insert(iterator hint, P&& x);
-const_iterator insert(const_iterator hint, const value_type& x);
-template <class P> const_iterator insert(const_iterator hint, P&& x);
-template <class InputIterator>
-  void insert(InputIterator first, InputIterator last);
-
- -
-

-Requires: Those signatures taking a const value_type& parameter -requires both the key_type and the mapped_type to be -CopyConstructible. -

- -

-P shall be convertible to value_type. - If P is instantiated as a reference -type, then the argument x is copied from. Otherwise x -is considered to be an rvalue as it is converted to value_type -and inserted into the unordered_multimap. Specifically, in such -cases CopyConstructible is not required of key_type or -mapped_type unless the conversion from P specifically -requires it (e.g. if P is a tuple<const key_type, -mapped_type>, then key_type must be -CopyConstructible). -

- -

-The signature taking InputIterator -parameters requires CopyConstructible of both -key_type and mapped_type if the dereferenced -InputIterator returns an lvalue or const rvalue -value_type. -

-
- -
- -

-Add to 23.4.2.2 [unord.multimap.swap]: -

- -
-
template <class Key, class T, class Hash, class Pred, class Alloc> 
-  void swap(unordered_multimap<Key, T, Hash, Pred, Alloc>& x, 
-            unordered_multimap<Key, T, Hash, Pred, Alloc>& y);
-template <class Key, class T, class Hash, class Pred, class Alloc> 
-  void swap(unordered_multimap<Key, T, Hash, Pred, Alloc>& x, 
-            unordered_multimap<Key, T, Hash, Pred, Alloc>&& y);
-template <class Key, class T, class Hash, class Pred, class Alloc> 
-  void swap(unordered_multimap<Key, T, Hash, Pred, Alloc>&& x, 
-            unordered_multimap<Key, T, Hash, Pred, Alloc>& y);
-
-
- -

unordered_set

- -

-Change 23.4.3 [unord.set]: -

- -
class unordered_set
-{
-    ...
-    unordered_set(const unordered_set&);
-    unordered_set(unordered_set&&);
-    ~unordered_set();
-    unordered_set& operator=(const unordered_set&);
-    unordered_set& operator=(unordered_set&&);
-    ...
-    // modifiers 
-    std::pair<iterator, bool> insert(const value_type& obj); 
-    pair<iterator, bool> insert(value_type&& obj);
-    iterator       insert(iterator hint, const value_type& obj);
-    iterator       insert(iterator hint, value_type&& obj);
-    const_iterator insert(const_iterator hint, const value_type& obj);
-    const_iterator insert(const_iterator hint, value_type&& obj);
-    ...
-    void swap(unordered_set&&);
-    ...
-};
-
-template <class Key, class T, class Hash, class Pred, class Alloc> 
-  void swap(unordered_set<Key, T, Hash, Pred, Alloc>& x, 
-            unordered_set<Key, T, Hash, Pred, Alloc>& y);
-
-template <class Key, class T, class Hash, class Pred, class Alloc> 
-  void swap(unordered_set<Key, T, Hash, Pred, Alloc>& x, 
-            unordered_set<Key, T, Hash, Pred, Alloc>&& y);
-
-template <class Key, class T, class Hash, class Pred, class Alloc> 
-  void swap(unordered_set<Key, T, Hash, Pred, Alloc>&& x, 
-            unordered_set<Key, T, Hash, Pred, Alloc>& y);
-
- -

-Add to 23.4.3.1 [unord.set.cnstr]: -

- -
-
template <class InputIterator>
-  unordered_set(InputIterator f, InputIterator l, 
-                size_type n = implementation-defined, 
-                const hasher& hf = hasher(), 
-                const key_equal& eql = key_equal(), 
-                const allocator_type& a = allocator_type());
-
- -

- -Requires: If the iterator's dereference operator returns an -lvalue or a const rvalue value_type, then the -value_type shall be CopyConstructible. - -

-
- -

-Add new section [unord.set.modifiers]: -

- -
-
pair<iterator, bool> insert(const value_type& x);
-pair<iterator, bool> insert(value_type&& x);
-iterator       insert(iterator hint, const value_type& x);
-iterator       insert(iterator hint, value_type&& x);
-const_iterator insert(const_iterator hint, const value_type& x);
-const_iterator insert(const_iterator hint, value_type&& x);
-template <class InputIterator>
-  void insert(InputIterator first, InputIterator last);
-
- -
- -

-Requires: Those signatures taking a const -value_type& parameter requires the value_type to -be CopyConstructible. -

- -

-The signature taking InputIterator parameters requires -CopyConstructible of value_type if the dereferenced -InputIterator returns an lvalue or const rvalue -value_type. -

- -
- -
- -

-Add to 23.4.3.2 [unord.set.swap]: -

- -
-
template <class Key, class T, class Hash, class Pred, class Alloc> 
-  void swap(unordered_set<Key, T, Hash, Pred, Alloc>& x, 
-            unordered_set<Key, T, Hash, Pred, Alloc>& y);
-template <class Key, class T, class Hash, class Pred, class Alloc> 
-  void swap(unordered_set<Key, T, Hash, Pred, Alloc>& x, 
-            unordered_set<Key, T, Hash, Pred, Alloc>&& y);
-template <class Key, class T, class Hash, class Pred, class Alloc> 
-  void swap(unordered_set<Key, T, Hash, Pred, Alloc>&& x, 
-            unordered_set<Key, T, Hash, Pred, Alloc>& y);
-
-
- -

unordered_multiset

- -

-Change 23.4.4 [unord.multiset]: -

- -
class unordered_multiset
-{
-    ...
-    unordered_multiset(const unordered_multiset&);
-    unordered_multiset(unordered_multiset&&);
-    ~unordered_multiset();
-    unordered_multiset& operator=(const unordered_multiset&);
-    unordered_multiset& operator=(unordered_multiset&&);
-    ...
-    // modifiers 
-    iterator insert(const value_type& obj); 
-    iterator insert(value_type&& obj);
-    iterator       insert(iterator hint, const value_type& obj);
-    iterator       insert(iterator hint, value_type&& obj);
-    const_iterator insert(const_iterator hint, const value_type& obj);
-    const_iterator insert(const_iterator hint, value_type&& obj);
-    ...
-    void swap(unordered_multiset&&);
-    ...
-};
-
-template <class Key, class T, class Hash, class Pred, class Alloc> 
-  void swap(unordered_multiset<Key, T, Hash, Pred, Alloc>& x, 
-            unordered_multiset<Key, T, Hash, Pred, Alloc>& y);
-
-template <class Key, class T, class Hash, class Pred, class Alloc> 
-  void swap(unordered_multiset<Key, T, Hash, Pred, Alloc>& x, 
-            unordered_multiset<Key, T, Hash, Pred, Alloc>&& y);
-
-template <class Key, class T, class Hash, class Pred, class Alloc> 
-  void swap(unordered_multiset<Key, T, Hash, Pred, Alloc>&& x, 
-            unordered_multiset<Key, T, Hash, Pred, Alloc>& y);
-
- -

-Add to 23.4.4.1 [unord.multiset.cnstr]: -

- -
-
template <class InputIterator>
-  unordered_multiset(InputIterator f, InputIterator l, 
-                size_type n = implementation-defined, 
-                const hasher& hf = hasher(), 
-                const key_equal& eql = key_equal(), 
-                const allocator_type& a = allocator_type());
-
- -

- -Requires: If the iterator's dereference operator returns an -lvalue or a const rvalue value_type, then the -value_type shall be CopyConstructible. - -

-
- -

-Add new section [unord.multiset.modifiers]: -

- -
-
iterator insert(const value_type& x);
-iterator insert(value_type&& x);
-iterator       insert(iterator hint, const value_type& x);
-iterator       insert(iterator hint, value_type&& x);
-const_iterator insert(const_iterator hint, const value_type& x);
-const_iterator insert(const_iterator hint, value_type&& x);
-template <class InputIterator>
-  void insert(InputIterator first, InputIterator last);
-
- -
- -

-Requires: Those signatures taking a const -value_type& parameter requires the value_type to -be CopyConstructible. -

- -

-The signature taking InputIterator parameters requires -CopyConstructible of value_type if the dereferenced -InputIterator returns an lvalue or const rvalue -value_type. -

- -
- -
- -

-Add to 23.4.4.2 [unord.multiset.swap]: -

- -
-
template <class Key, class T, class Hash, class Pred, class Alloc> 
-  void swap(unordered_multiset<Key, T, Hash, Pred, Alloc>& x, 
-            unordered_multiset<Key, T, Hash, Pred, Alloc>& y);
-template <class Key, class T, class Hash, class Pred, class Alloc> 
-  void swap(unordered_multiset<Key, T, Hash, Pred, Alloc>& x, 
-            unordered_multiset<Key, T, Hash, Pred, Alloc>&& y);
-template <class Key, class T, class Hash, class Pred, class Alloc> 
-  void swap(unordered_multiset<Key, T, Hash, Pred, Alloc>&& x, 
-            unordered_multiset<Key, T, Hash, Pred, Alloc>& y);
-
-
- - - - - - -
-

679. resize parameter by value

-

Section: 23.2 [sequences] Status: Ready - Submitter: Howard Hinnant Date: 2007-06-11

-

View all issues with Ready status.

-

Discussion:

-

-The C++98 standard specifies that one member function alone of the containers -passes its parameter (T) by value instead of by const reference: -

- -
void resize(size_type sz, T c = T());
-
- -

-This fact has been discussed / debated repeatedly over the years, the first time -being even before C++98 was ratified. The rationale for passing this parameter by -value has been: -

- -
-

-So that self referencing statements are guaranteed to work, for example: -

-
v.resize(v.size() + 1, v[0]);
-
-
- -

-However this rationale is not convincing as the signature for push_back is: -

- -
void push_back(const T& x);
-
- -

-And push_back has similar semantics to resize (append). -And push_back must also work in the self referencing case: -

- -
v.push_back(v[0]);  // must work
-
- -

-The problem with passing T by value is that it can be significantly more -expensive than passing by reference. The converse is also true, however when it is -true it is usually far less dramatic (e.g. for scalar types). -

- -

-Even with move semantics available, passing this parameter by value can be expensive. -Consider for example vector<vector<int>>: -

- -
std::vector<int> x(1000);
-std::vector<std::vector<int>> v;
-...
-v.resize(v.size()+1, x);
-
- -

-In the pass-by-value case, x is copied once to the parameter of -resize. And then internally, since the code can not know at compile -time by how much resize is growing the vector, x is -usually copied (not moved) a second time from resize's parameter into its proper place -within the vector. -

- -

-With pass-by-const-reference, the x in the above example need be copied -only once. In this case, x has an expensive copy constructor and so any -copies that can be saved represents a significant savings. -

- -

-If we can be efficient for push_back, we should be efficient for resize -as well. The resize taking a reference parameter has been coded and shipped in the -CodeWarrior library with no reports of problems which I am aware of. -

- - - -

Proposed resolution:

-

-Change 23.2.2 [deque], p2: -

- -
class deque {
-   ...
-   void resize(size_type sz, const T& c);
-
- -

-Change 23.2.2.2 [deque.capacity], p3: -

- -
void resize(size_type sz, const T& c);
-
- -

-Change 23.2.3 [list], p2: -

- -
class list {
-   ...
-   void resize(size_type sz, const T& c);
-
- -

-Change 23.2.3.2 [list.capacity], p3: -

- -
void resize(size_type sz, const T& c);
-
- -

-Change 23.2.5 [vector], p2: -

- -
class vector {
-   ...
-   void resize(size_type sz, const T& c);
-
- -

-Change 23.2.5.2 [vector.capacity], p11: -

- -
void resize(size_type sz, const T& c);
-
- - - - - - -
-

680. move_iterator operator-> return

-

Section: 24.4.3.1 [move.iterator] Status: Ready - Submitter: Howard Hinnant Date: 2007-06-11

-

View all issues with Ready status.

-

Discussion:

-

-move_iterator's operator-> return type pointer -does not consistently match the type which is returned in the description -in 24.4.3.3.5 [move.iter.op.ref]. -

- -
template <class Iterator>
-class move_iterator {
-public:
-    ...
-    typedef typename iterator_traits<Iterator>::pointer pointer;
-    ...
-    pointer operator->() const {return current;}
-    ...
-private: 
-    Iterator current; // exposition only
-};
-
- - -

-There are two possible fixes. -

- -
    -
  1. pointer operator->() const {return &*current;}
  2. -
  3. typedef Iterator pointer;
  4. -
- -

-The first solution is the one chosen by reverse_iterator. A potential -disadvantage of this is it may not work well with iterators which return a -proxy on dereference and that proxy has overloaded operator&(). Proxy -references often need to overloaad operator&() to return a proxy -pointer. That proxy pointer may or may not be the same type as the iterator's -pointer type. -

- -

-By simply returning the Iterator and taking advantage of the fact that -the language forwards calls to operator-> automatically until it -finds a non-class type, the second solution avoids the issue of an overloaded -operator&() entirely. -

- -

Proposed resolution:

-

-Change the synopsis in 24.4.3.1 [move.iterator]: -

- -
typedef typename iterator_traits<Iterator>::pointer pointer;
-
- - - - - - -
-

684. Unclear which members of match_results should be used in comparison

-

Section: 28.10 [re.results] Status: Review - Submitter: Nozomu Katoo Date: 2007-05-27

-

View other active issues in [re.results].

-

View all other issues in [re.results].

-

View all issues with Review status.

-

Discussion:

-

-In 28.4 [re.syn] of N2284, two template functions -are declared here: -

-
// 28.10, class template match_results: 
-  <snip>
-// match_results comparisons 
-  template <class BidirectionalIterator, class Allocator> 
-    bool operator== (const match_results<BidirectionalIterator, Allocator>& m1, 
-                     const match_results<BidirectionalIterator, Allocator>& m2); 
-  template <class BidirectionalIterator, class Allocator> 
-    bool operator!= (const match_results<BidirectionalIterator, Allocator>& m1, 
-                     const match_results<BidirectionalIterator, Allocator>& m2); 
-
-// 28.10.6, match_results swap:
-
- -

-But the details of these two bool operator functions (i.e., which members of -match_results should be used in comparison) are not described in any -following sections. -

- -

[ -John adds: -]

- - -

-That looks like a bug: operator== should return true only if -the two objects refer to the same match - ie if one object was constructed as a -copy of the other. -

- -

[ -Kona (2007): Bill and Pete to add minor wording to that proposed in -N2409. -]

- - - -

Proposed resolution:

-

-Add a new section after 28.10.6 [re.results.swap], which reads: -

-

-28.10.7 match_results non-member functions. -

- -
-
template<class BidirectionalIterator, class Allocator> 
-  bool operator==(const match_results<BidirectionalIterator, Allocator>& m1, 
-                  const match_results<BidirectionalIterator, Allocator>& m2);
-
-
-

-Returns: true only if the two objects refer to the same match. -

-
-
- -
-
template<class BidirectionalIterator, class Allocator> 
-  bool operator!=(const match_results<BidirectionalIterator, Allocator>& m1, 
-                  const match_results<BidirectionalIterator, Allocator>& m2);
-
-
-

-Returns: !(m1 == m2). -

-
-
- -
-
template<class BidirectionalIterator, class Allocator> 
-  void swap(match_results<BidirectionalIterator, Allocator>& m1, 
-            match_results<BidirectionalIterator, Allocator>& m2);
-
-
-

-Returns: m1.swap(m2). -

-
-
- - - - - -
-

685. reverse_iterator/move_iterator difference has invalid signatures

-

Section: 24.4.1.3.19 [reverse.iter.opdiff], 24.4.3.3.14 [move.iter.nonmember] Status: Review - Submitter: Bo Persson Date: 2007-06-10

-

View all issues with Review status.

-

Discussion:

-

-In C++03 the difference between two reverse_iterators -

-
ri1 - ri2
-
-

-is possible to compute only if both iterators have the same base -iterator. The result type is the difference_type of the base iterator. -

-

-In the current draft, the operator is defined as 24.4.1.3.19 [reverse.iter.opdiff] -

-
template<class Iterator1, class Iterator2> 
-typename reverse_iterator<Iterator>::difference_type 
-   operator-(const reverse_iterator<Iterator1>& x, 
-                    const reverse_iterator<Iterator2>& y);
-
-

-The return type is the same as the C++03 one, based on the no longer -present Iterator template parameter. -

-

-Besides being slightly invalid, should this operator work only when -Iterator1 and Iterator2 has the same difference_type? Or should the -implementation choose one of them? Which one? -

-

-The same problem now also appears in operator-() for move_iterator -24.4.3.3.14 [move.iter.nonmember]. -

- - -

Proposed resolution:

-

-Change the synopsis in 24.4.1.1 [reverse.iterator]: -

- -
-
template <class Iterator1, class Iterator2> 
-  typename reverse_iterator<Iterator>::difference_type auto operator-( 
-    const reverse_iterator<Iterator1>& x, 
-    const reverse_iterator<Iterator2>& y) -> decltype(operator-(Iterator1, Iterator2));
-
-
-

-Returns: y.current - x.current. -

-
-
- -

-Change 24.4.1.3.19 [reverse.iter.opdiff]: -

- -
-
template <class Iterator1, class Iterator2> 
-  typename reverse_iterator<Iterator>::difference_type auto operator-( 
-    const reverse_iterator<Iterator1>& x, 
-    const reverse_iterator<Iterator2>& y) -> decltype(operator-(Iterator1, Iterator2));
-
-
-

-Returns: y.current - x.current. -

-
-
- - -

-Change the synopsis in 24.4.3.1 [move.iterator]: -

- -
-
template <class Iterator1, class Iterator2> 
-  typename move_iterator<Iterator>::difference_type auto operator-( 
-    const move_iterator<Iterator1>& x, 
-    const move_iterator<Iterator2>& y) -> decltype(operator-(Iterator1, Iterator2));
-
-
-

-Returns: y.current - x.current. -

-
-
- -

-Change 24.4.3.3.14 [move.iter.nonmember]: -

- -
-
template <class Iterator1, class Iterator2> 
-  typename move_iterator<Iterator>::difference_type auto operator-( 
-    const move_iterator<Iterator1>& x, 
-    const move_iterator<Iterator2>& y) -> decltype(operator-(Iterator1, Iterator2));
-
-
-

-Returns: x.base() - y.base(). -

-
-
- - - - - -
-

686. Unique_ptr and shared_ptr fail to specify non-convertibility to int for unspecified-bool-type

-

Section: 20.6.5.2.4 [unique.ptr.single.observers], 20.6.6.2.5 [util.smartptr.shared.obs] Status: Open - Submitter: Beman Dawes Date: 2007-06-14

-

View all issues with Open status.

-

Discussion:

-

-The standard library uses the operator unspecified-bool-type() const idiom in -five places. In three of those places (20.5.15.2.3 [func.wrap.func.cap], function capacity -for example) the returned value is constrained to disallow -unintended conversions to int. The standardese is -

-

-The return type shall not be convertible to int. -

-

-This constraint is omitted for unique_ptr and shared_ptr. It should be added for those. -

- - -

Proposed resolution:

-

-To the Returns paragraph for operator unspecified-bool-type() -const -of 20.6.5.2.4 [unique.ptr.single.observers] paragraph 11 and 20.6.6.2.5 -[util.smartptr.shared.obs] paragraph 16, add the sentence: -

-

-The return type shall not be convertible to int. -

- - -

[ -Kona (2007): Uncertain if nullptr will address this issue. -]

- - - - - -
-

687. shared_ptr conversion constructor not constrained

-

Section: 20.6.6.2.1 [util.smartptr.shared.const], 20.6.6.3.1 [util.smartptr.weak.const] Status: Ready - Submitter: Peter Dimov Date: 2007-05-10

-

View all issues with Ready status.

-

Discussion:

-

-Since all conversions from shared_ptr<T> to shared_ptr<U> have the same -rank regardless of the relationship between T and U, reasonable user -code that works with raw pointers fails with shared_ptr: -

- -
void f( shared_ptr<void> );
-void f( shared_ptr<int> );
-
-int main()
-{
-  f( shared_ptr<double>() ); // ambiguous
-}
-
- -

-Now that we officially have enable_if, we can constrain the constructor -and the corresponding assignment operator to only participate in the -overload resolution when the pointer types are compatible. -

- - -

Proposed resolution:

-

-In 20.6.6.2.1 [util.smartptr.shared.const], change: -

- -

--14- Requires: For the second constructor The -second constructor shall not participate in the overload resolution -unless Y* shall be is implicitly convertible -to T*. -

- -

-In 20.6.6.3.1 [util.smartptr.weak.const], change: -

- -
-
template<class Y> weak_ptr(shared_ptr<Y> const& r);
-weak_ptr(weak_ptr const& r);
-template<class Y> weak_ptr(weak_ptr<Y> const& r);
-weak_ptr(weak_ptr const& r);
-template<class Y> weak_ptr(weak_ptr<Y> const& r);
-template<class Y> weak_ptr(shared_ptr<Y> const& r);
-
-

--4- Requires: For tThe second and -third constructors, shall not participate in the -overload resolution unless Y* shall be -is implicitly convertible to T*. -

-
- - - - - - -
-

688. reference_wrapper, cref unsafe, allow binding to rvalues

-

Section: 20.5.5.1 [refwrap.const] Status: Ready - Submitter: Peter Dimov Date: 2007-05-10

-

View other active issues in [refwrap.const].

-

View all other issues in [refwrap.const].

-

View all issues with Ready status.

-

Discussion:

-

-A reference_wrapper can be constructed from an rvalue, either by using -the constructor, or via cref (and ref in some corner cases). This leads -to a dangling reference being stored into the reference_wrapper object. -Now that we have a mechanism to detect an rvalue, we can fix them to -disallow this source of undefined behavior. -

- -

-Also please see the thread starting at c++std-lib-17398 for some good discussion on this subject. -

- - - -

Proposed resolution:

-

-In 20.5.5 [refwrap], add: -

- -
private:
-  explicit reference_wrapper(T&&);
-
- -

-In 20.5.5.1 [refwrap.const], add: -

- -
-
explicit reference_wrapper(T&&);
-
-

--?- Not defined to disallow creating a reference_wrapper from an rvalue. -

-
- -

-In the synopsis of <functional> (20.5.5 [refwrap]), change the declarations -of ref and cref to: -

- -
template<class T> reference_wrapper<T> ref(T&&);
-template<class T> reference_wrapper<const T> cref(const T&&);
-
- -

-In 20.5.5.5 [refwrap.helpers], change: -

- -
-
template<class T> reference_wrapper<T> ref(T&& t);
-
-
-

--1- Requires: t shall be an lvalue. -

-
-
- -

and change:

- -
-
template<class T> reference_wrapper<const T> cref(const T&& t);
-
-
-

--6- Requires: t shall be an lvalue. -

-
-
- - - -

[ -N2292 -addresses the first part of the resolution but not the second. -]

- - - - - -
-

689. reference_wrapper constructor overly constrained

-

Section: 20.5.5.1 [refwrap.const] Status: Ready - Submitter: Peter Dimov Date: 2007-05-10

-

View other active issues in [refwrap.const].

-

View all other issues in [refwrap.const].

-

View all issues with Ready status.

-

Discussion:

-

-The constructor of reference_wrapper is currently explicit. The primary -motivation behind this is the safety problem with respect to rvalues, -which is addressed by the proposed resolution of the previous issue. -Therefore we should consider relaxing the requirements on the -constructor since requests for the implicit conversion keep resurfacing. -

-

-Also please see the thread starting at c++std-lib-17398 for some good discussion on this subject. -

- - -

Proposed resolution:

-

-Remove the explicit from the constructor of reference_wrapper. If the -proposed resolution of the previous issue is accepted, remove the -explicit from the T&& constructor as well to keep them in sync. -

- - - - - -
-

691. const_local_iterator cbegin, cend missing from TR1

-

Section: 23.4 [unord], TR1 6.3 [tr.hash] Status: Review - Submitter: Joaquín M López Muñoz Date: 2007-06-14

-

View other active issues in [unord].

-

View all other issues in [unord].

-

View all issues with Review status.

-

Discussion:

-

-The last version of TR1 does not include the following member -functions -for unordered containers: -

- -
const_local_iterator cbegin(size_type n) const;
-const_local_iterator cend(size_type n) const;
-
- -

-which looks like an oversight to me. I've checked th TR1 issues lists -and the latest working draft of the C++0x std (N2284) and haven't -found any mention to these menfuns or to their absence. -

-

-Is this really an oversight, or am I missing something? -

- - - -

Proposed resolution:

-

-Add the following two rows to table 93 (unordered associative container -requirements) in section 23.1.3 [unord.req]: -

- -
- - - - - - - - - - - -
Unordered associative container requirements (in addition to container)
expression return type assertion/note pre/post-condition complexity
b.cbegin(n) const_local_iterator n shall be in the range [0, bucket_count()). Note: [b.cbegin(n), b.cend(n)) is a valid range containing all of the elements in the nth bucket. Constant
b.cend(n) const_local_iterator n shall be in the range [0, bucket_count()). Constant
-
- -

-Add to the synopsis in 23.4.1 [unord.map]: -

- -
const_local_iterator cbegin(size_type n) const;
-const_local_iterator cend(size_type n) const;
-
- -

-Add to the synopsis in 23.4.2 [unord.multimap]: -

- -
const_local_iterator cbegin(size_type n) const;
-const_local_iterator cend(size_type n) const;
-
- -

-Add to the synopsis in 23.4.3 [unord.set]: -

- -
const_local_iterator cbegin(size_type n) const;
-const_local_iterator cend(size_type n) const;
-
- -

-Add to the synopsis in 23.4.4 [unord.multiset]: -

- -
const_local_iterator cbegin(size_type n) const;
-const_local_iterator cend(size_type n) const;
-
- - - - - - -
-

692. get_money and put_money should be formatted I/O functions

-

Section: 27.6.4 [ext.manip] Status: New - Submitter: Martin Sebor Date: 2007-06-22

-

View all other issues in [ext.manip].

-

View all issues with New status.

-

Discussion:

-

-In a private email Bill Plauger notes: -

-

-I  believe that  the function  that  implements get_money -[from N2072] -should behave  as a  formatted input function,  and the  function that -implements put_money should  behave as a formatted output -function. This  has implications regarding the  skipping of whitespace -and the handling of errors, among other things. -

-

-The words  don't say that  right now and  I'm far from  convinced that -such a change is editorial. -

-

-Martin's response: -

-

-I agree that the manipulators should handle exceptions the same way as -formatted I/O functions do. The text in N2072 assumes so but the -Returns clause explicitly omits exception handling for the sake -of brevity. The spec should be clarified to that effect. -

-

-As for dealing  with whitespace, I also agree it  would make sense for -the extractors  and inserters involving the new  manipulators to treat -it the same way as formatted I/O. -

- - -

Proposed resolution:

-

-Add  a new  paragraph immediately  above  p4 of 27.6.4 [ext.manip] with  the -following text: -

-

-Effects:  The   expression  in >> get_money(mon, intl) -described below behaves as a formatted input function (as -described in 27.6.1.2.1 [istream.formatted.reqmts]). -

-

-Also change p4 of 27.6.4 [ext.manip] as follows: -

-

-Returns: An object s of unspecified type such that -if in is  an object of type basic_istream<charT, -traits>    then    the    expression   in >> get_money(mon, intl) behaves as a formatted input function -that    calls    f(in, mon, intl)    were -called. The function f can be defined as... -

- - - - - -
-

693. std::bitset::all() missing

-

Section: 23.3.5 [template.bitset] Status: Ready - Submitter: Martin Sebor Date: 2007-06-22

-

View other active issues in [template.bitset].

-

View all other issues in [template.bitset].

-

View all issues with Ready status.

-

Discussion:

-

-The bitset class template provides the member function -any() to determine whether an object of the type has any -bits set, and the member function none() to determine -whether all of an object's bits are clear. However, the template does -not provide a corresponding function to discover whether a -bitset object has all its bits set. While it is -possible, even easy, to obtain this information by comparing the -result of count() with the result of size() -for equality (i.e., via b.count() == b.size()) the -operation is less efficient than a member function designed -specifically for that purpose could be. (count() must -count all non-zero bits in a bitset a word at a time -while all() could stop counting as soon as it encountered -the first word with a zero bit). -

- - -

Proposed resolution:

-

-Add a declaration of the new member function all() to the -defintion of the bitset template in 23.3.5 [template.bitset], p1, -right above the declaration of any() as shown below: -

- -
bool operator!=(const bitset<N>& rhs) const;
-bool test(size_t pos) const;
-bool all() const;
-bool any() const;
-bool none() const;
-
- -

-Add a description of the new member function to the end of 23.3.5.2 [bitset.members] with the following text: -

-

-bool all() const; -

-
-Returns: count() == size(). -
-
- -

-In addition, change the description of any() and -none() for consistency with all() as -follows: -

-

-bool any() const; -

-
-

-Returns: true if any bit in *this -is onecount() != 0. -

-
-

-bool none() const; -

-
-

-Returns: true if no bit in *this -is onecount() == 0. -

-
-
- - - - - -
-

694. std::bitset and long long

-

Section: 23.3.5 [template.bitset] Status: Ready - Submitter: Martin Sebor Date: 2007-06-22

-

View other active issues in [template.bitset].

-

View all other issues in [template.bitset].

-

View all issues with Ready status.

-

Discussion:

-

-Objects of the bitset class template specializations can -be constructed from and explicitly converted to values of the widest -C++ integer type, unsigned long. With the introduction -of long long into the language the template should be -enhanced to make it possible to interoperate with values of this type -as well, or perhaps uintmax_t. See c++std-lib-18274 for -a brief discussion in support of this change. -

- - -

Proposed resolution:

-

-For simplicity, instead of adding overloads for unsigned long -long and dealing with possible ambiguities in the spec, replace -the bitset ctor that takes an unsigned long -argument with one taking unsigned long long in the -definition of the template as shown below. (The standard permits -implementations to add overloads on other integer types or employ -template tricks to achieve the same effect provided they don't cause -ambiguities or changes in behavior.) -

-
-
// [bitset.cons] constructors:
-bitset();
-bitset(unsigned long long val);
-template<class charT, class traits, class Allocator>
-explicit bitset(
-                const basic_string<charT,traits,Allocator>& str,
-                typename basic_string<charT,traits,Allocator>::size_type pos = 0,
-                typename basic_string<charT,traits,Allocator>::size_type n =
-                    basic_string<charT,traits,Allocator>::npos);
-
-
-

-Make a corresponding change in 23.3.5.1 [bitset.cons], p2: -

-
-

-bitset(unsigned long long val); -

-
-Effects: Constructs an object of class bitset<N>, -initializing the first M bit positions to the -corresponding bit values in val. -M is the smaller of N and the -number of bits in the value representation (section [basic.types]) of -unsigned long long. If M < -N is true, the remaining bit -positions are initialized to zero. -
-
- -

-Additionally, introduce a new member function to_ullong() -to make it possible to convert bitset to values of the -new type. Add the following declaration to the definition of the -template, immediate after the declaration of to_ulong() -in 23.3.5 [template.bitset], p1, as shown below: -

-
-
// element access:
-bool operator[](size_t pos) const; // for b[i];
-reference operator[](size_t pos); // for b[i];
-unsigned long to_ulong() const;
-unsigned long long to_ullong() const;
-template <class charT, class traits, class Allocator>
-basic_string<charT, traits, Allocator> to_string() const;
-
-
-

-And add a description of the new member function to 23.3.5.2 [bitset.members], -below the description of the existing to_ulong() (if -possible), with the following text: -

-
-

-unsigned long long to_ullong() const; -

-
-Throws: overflow_error if the integral value -x corresponding to the bits in *this -cannot be represented as type unsigned long long. -
-
-Returns: x. -
-
- - - - - -
-

695. ctype<char>::classic_table() not accessible

-

Section: 22.2.1.3 [facet.ctype.special] Status: Ready - Submitter: Martin Sebor Date: 2007-06-22

-

View all issues with Ready status.

-

Discussion:

-

-The ctype<char>::classic_table() static member -function returns a pointer to an array of const -ctype_base::mask objects (enums) that contains -ctype<char>::table_size elements. The table -describes the properties of the character set in the "C" locale (i.e., -whether a character at an index given by its value is alpha, digit, -punct, etc.), and is typically used to initialize the -ctype<char> facet in the classic "C" locale (the -protected ctype<char> member function -table() then returns the same value as -classic_table()). -

-

-However, while ctype<char>::table_size (the size of -the table) is a public static const member of the -ctype<char> specialization, the -classic_table() static member function is protected. That -makes getting at the classic data less than convenient (i.e., one has -to create a whole derived class just to get at the masks array). It -makes little sense to expose the size of the table in the public -interface while making the table itself protected, especially when the -table is a constant object. -

-

-The same argument can be made for the non-static protected member -function table(). -

- - -

Proposed resolution:

-

-Make the ctype<char>::classic_table() and -ctype<char>::table() member functions public by -moving their declarations into the public section of the definition of -specialization in 22.2.1.3 [facet.ctype.special] as shown below: -

-
-
  static locale::id id;
-  static const size_t table_size = IMPLEMENTATION_DEFINED;
-protected:
-  const mask* table() const throw();
-  static const mask* classic_table() throw();
-protected:
-
-~ctype(); // virtual
-virtual char do_toupper(char c) const;
-
-
- - - - - -
-

696. istream::operator>>(int&) broken

-

Section: 27.6.1.2.2 [istream.formatted.arithmetic] Status: New - Submitter: Martin Sebor Date: 2007-06-23

-

View other active issues in [istream.formatted.arithmetic].

-

View all other issues in [istream.formatted.arithmetic].

-

View all issues with New status.

-

Discussion:

-

-From message c++std-lib-17897: -

-

-The code shown in 27.6.1.2.2 [istream.formatted.arithmetic] as the "as if" -implementation of the two arithmetic extractors that don't have a -corresponding num_get interface (i.e., the -short and int overloads) is subtly buggy in -how it deals with EOF, overflow, and other similar -conditions (in addition to containing a few typos). -

-

-One problem is that if num_get::get() reaches the EOF -after reading in an otherwise valid value that exceeds the limits of -the narrower type (but not LONG_MIN or -LONG_MAX), it will set err to -eofbit. Because of the if condition testing for -(err == 0), the extractor won't set -failbit (and presumably, return a bogus value to the -caller). -

-

-Another problem with the code is that it never actually sets the -argument to the extracted value. It can't happen after the call to -setstate() since the function may throw, so we need to -show when and how it's done (we can't just punt as say: "it happens -afterwards"). However, it turns out that showing how it's done isn't -quite so easy since the argument is normally left unchanged by the -facet on error except when the error is due to a misplaced thousands -separator, which causes failbit to be set but doesn't -prevent the facet from storing the value. -

- - -

Proposed resolution:

-

-

- - - - - -
-

697. New <system_error> header leads to name clashes

-

Section: 19.4 [syserr] Status: New - Submitter: Daniel Krügler Date: 2007-06-24

-

View all issues with New status.

-

Discussion:

-

-The most recent state of -N2241 -as well as the current draft -N2284 -(section 19.4 [syserr], p.2) proposes a -new -enumeration type posix_errno immediatly in the namespace std. One of -the enumerators has the name invalid_argument, or fully qualified: -std::invalid_argument. This name clashes with the exception type -std::invalid_argument, see 19.1 [std.exceptions]/p.3. This clash makes -e.g. the following snippet invalid: -

- -
#include <system_error>
-#include <stdexcept>
-
-void foo() { throw std::invalid_argument("Don't call us - we call you!"); }
-
- -

-I propose that this enumeration type (and probably the remaining parts -of -<system_error> as well) should be moved into one additional inner -namespace, e.g. sys or system to reduce foreseeable future clashes -due -to the great number of members that std::posix_errno already contains -(Btw.: Why has the already proposed std::sys sub-namespace from -N2066 -been rejected?). A further clash candidate seems to be -std::protocol_error -(a reasonable name for an exception related to a std network library, -I guess). -

- -

-Another possible resolution would rely on the proposed strongly typed -enums, -as described in N2213. -But maybe the forbidden implicit conversion to integral types would -make -these enumerators less attractive in this special case? -

- - -

Proposed resolution:

-

-

- - - - - - -
-

698. Some system_error issues

-

Section: 19.4.5.1 [syserr.syserr.overview] Status: New - Submitter: Daniel Krügler Date: 2007-06-24

-

View all issues with New status.

-

Discussion:

-

-In 19.4.5.1 [syserr.syserr.overview] we have the class definition of -std::system_error. In contrast to all exception classes, which -are constructible with a what_arg string (see 19.1 [std.exceptions], -or ios_base::failure in 27.4.2.1.1 [ios::failure]), only overloads with with -const string& are possible. For consistency with the re-designed -remaining exception classes this class should also provide -c'tors which accept a const char* what_arg string. -

-

-Please note that this proposed addition makes sense even -considering the given implementation hint for what(), because -what_arg is required to be set as what_arg of the base class -runtime_error, which now has the additional c'tor overload -accepting a const char*. -

- - -

Proposed resolution:

-

-

- - - - - -
-

700. N1856 defines struct identity

-

Section: 20.2.2 [forward] Status: Ready - Submitter: P.J. Plauger Date: 2007-07-01

-

View all issues with Ready status.

-

Discussion:

-

-N1856 -defines struct identity in <utility> which clashes with -the traditional definition of struct identity in <functional> -(not standard, but a common extension from old STL). Be nice -if we could avoid this name clash for backward compatibility. -

- - -

Proposed resolution:

-

-Change 20.2.2 [forward]: -

- -
-
template <class T> struct identity
-{
-    typedef T type;
-    const T& operator()(const T& x) const;
-};
-
-
-
const T& operator()(const T& x) const;
-
-
-

-Returns: x. -

-
-
- -
- - - - - - -
-

701. assoc laguerre poly's

-

Section: TR1 5.2.1.1 [tr.num.sf.Lnm] Status: New - Submitter: Christopher Crawford Date: 2007-06-30

-

View all issues with New status.

-

Discussion:

-

-I see that the definition the associated Laguerre -polynomials TR1 5.2.1.1 [tr.num.sf.Lnm] has been corrected since -N1687. -However, the draft standard only specifies ranks of integer value m, -while the associated Laguerre polynomials are actually valid for real -values of m > -1.  In the case of non-integer values of m, the -definition  Ln(m) = (1/n!)exx-m (d/dx)n (e-xxm+n) -must be used, which also holds for integer values of m.  See -Abramowitz & Stegun, 22.11.6 for the general case, and 22.5.16-17 for -the integer case.  In fact fractional values are most commonly used in -physics, for example to m = +/- 1/2 to describe the harmonic -oscillator in 1 dimension, and 1/2, 3/2, 5/2, ... in 3 -dimensions. -

-

-If I am correct, the calculation of the more general case is no -more difficult, and is in fact the function implemented in the GNU -Scientific Library.  I would urge you to consider upgrading the -standard, either adding extra functions for real m or switching the -current ones to double. -

- - -

Proposed resolution:

-

-

- - - - - -
-

702. Restriction in associated Legendre functions

-

Section: TR1 5.2.1.2 [tr.num.sf.Plm] Status: New - Submitter: Christopher Crawford Date: 2007-06-30

-

View all issues with New status.

-

Discussion:

-

-One other small thing, in TR1 5.2.1.2 [tr.num.sf.Plm], the restriction should  be -|x| <= 1, not x >= 0.

- - -

Proposed resolution:

-

-

- - - - - -
-

703. map::at() need a complexity specification

-

Section: 23.3.1.2 [map.access] Status: Ready - Submitter: Joe Gottman Date: 2007-07-03

-

View all other issues in [map.access].

-

View all issues with Ready status.

-

Discussion:

-

-map::at() need a complexity specification. -

- - -

Proposed resolution:

-

-Add the following to the specification of map::at(), 23.3.1.2 [map.access]: -

-
-

-Complexity: logarithmic. -

-
- - - - - -
-

704. MoveAssignable requirement for container value type overly strict

-

Section: 23.1 [container.requirements] Status: Open - Submitter: Howard Hinnant Date: 2007-05-20

-

View other active issues in [container.requirements].

-

View all other issues in [container.requirements].

-

View all issues with Open status.

-

Discussion:

-

-The move-related changes inadvertently overwrote the intent of 276. -Issue 276 removed the requirement of CopyAssignable from -most of the member functions of node-based containers. But the move-related changes -unnecessarily introduced the MoveAssignable requirement for those members which used to -require CopyAssignable. -

- -

-We also discussed (c++std-lib-18722) the possibility of dropping MoveAssignable -from some of the sequence requirements. Additionally the in-place construction -work may further reduce requirements. For purposes of an easy reference, here are the -minimum sequence requirements as I currently understand them. Those items in requirements -table in the working draft which do not appear below have been purposefully omitted for -brevity as they do not have any requirements of this nature. Some items which do not -have any requirements of this nature are included below just to confirm that they were -not omitted by mistake. -

- - - - - - - - -
Container Requirements
X u(a)value_type must be CopyConstructible
X u(rv)array requires value_type to be MoveConstructible
a = uSequences require value_type to be CopyConstructible and CopyAssignable. - Associative containers require value_type to be CopyConstructible.
a = rvarray requires value_type to be MoveAssignable. - Sequences with non-Swappable allocators require value_type to be MoveConstructible and MoveAssignable. - Associative containers with non-Swappable allocators require value_type to be MoveConstructible.
swap(a,u)array requires value_type to be Swappable. - Sequences with non-Swappable allocators require value_type to be Swappable, MoveConstructible and MoveAssignable. - Associative containers with non-Swappable allocators require value_type to be MoveConstructible.
- -

-

- - - - - - - - - - - - - - - - - -
Sequence Requirements
X(n)value_type must be DefaultConstructible
X(n, t)value_type must be CopyConstructible
X(i, j)If the iterators return an lvalue the value_type must be CopyConstructible. - If the iterators return an rvalue the value_type must be MoveConstructible.
a.insert(p, t)The value_type must be CopyConstructible. - The sequences vector and deque also require the value_type to be CopyAssignable.
a.insert(p, rv)The value_type must be MoveConstructible. - The sequences vector and deque also require the value_type to be MoveAssignable.
a.insert(p, n, t)The value_type must be CopyConstructible. - The sequences vector and deque also require the value_type to be CopyAssignable.
a.insert(p, i, j)If the iterators return an lvalue the value_type must be CopyConstructible. - The sequences vector and deque also require the value_type to be CopyAssignable when the iterators return an lvalue. - If the iterators return an rvalue the value_type must be MoveConstructible. - The sequences vector and deque also require the value_type to be MoveAssignable when the iterators return an rvalue.
a.erase(p)The sequences vector and deque require the value_type to be MoveAssignable.
a.erase(q1, q2)The sequences vector and deque require the value_type to be MoveAssignable.
a.clear()
a.assign(i, j)If the iterators return an lvalue the value_type must be CopyConstructible and CopyAssignable. - If the iterators return an rvalue the value_type must be MoveConstructible and MoveAssignable.
a.assign(n, t)The value_type must be CopyConstructible and CopyAssignable.
a.resize(n)The value_type must be DefaultConstructible. - The sequences vector and deque also require the value_type to be MoveConstructible.
a.resize(n, t)The value_type must be CopyConstructible.
- -

-

- - - - - - - - - - - - - -
Optional Sequence Requirements
a.front()
a.back()
a.push_front(t)The value_type must be CopyConstructible.
a.push_front(rv)The value_type must be MoveConstructible.
a.push_back(t)The value_type must be CopyConstructible.
a.push_back(rv)The value_type must be MoveConstructible.
a.pop_front()
a.pop_back()
a[n]
a.at[n]
- -

-

- - - - - - - - - - - -
Associative Container Requirements
X(i, j)If the iterators return an lvalue the value_type must be CopyConstructible. - If the iterators return an rvalue the value_type must be MoveConstructible.
a_uniq.insert(t)The value_type must be CopyConstructible.
a_uniq.insert(rv)The key_type and the mapped_type (if it exists) must be MoveConstructible.
a_eq.insert(t)The value_type must be CopyConstructible.
a_eq.insert(rv)The key_type and the mapped_type (if it exists) must be MoveConstructible.
a.insert(p, t)The value_type must be CopyConstructible.
a.insert(p, rv)The key_type and the mapped_type (if it exists) must be MoveConstructible.
a.insert(i, j)If the iterators return an lvalue the value_type must be CopyConstructible. - If the iterators return an rvalue the key_type and the mapped_type (if it exists) must be MoveConstructible..
- -

-

- - - - - - - - - - - -
Unordered Associative Container Requirements
X(i, j, n, hf, eq)If the iterators return an lvalue the value_type must be CopyConstructible. - If the iterators return an rvalue the value_type must be MoveConstructible.
a_uniq.insert(t)The value_type must be CopyConstructible.
a_uniq.insert(rv)The key_type and the mapped_type (if it exists) must be MoveConstructible.
a_eq.insert(t)The value_type must be CopyConstructible.
a_eq.insert(rv)The key_type and the mapped_type (if it exists) must be MoveConstructible.
a.insert(p, t)The value_type must be CopyConstructible.
a.insert(p, rv)The key_type and the mapped_type (if it exists) must be MoveConstructible.
a.insert(i, j)If the iterators return an lvalue the value_type must be CopyConstructible. - If the iterators return an rvalue the key_type and the mapped_type (if it exists) must be MoveConstructible..
- -

-

- - - - - -
Miscellaneous Requirements
map[lvalue-key]The key_type must be CopyConstructible. - The mapped_type must be DefaultConstructible and MoveConstructible.
map[rvalue-key]The key_type must be MoveConstructible. - The mapped_type must be DefaultConstructible and MoveConstructible.
- -

[ -Kona (2007): Howard and Alan to update requirements table in issue with emplace signatures. -]

- - - - -

Proposed resolution:

- - - - - - -
-

705. type-trait decay incompletely specified

-

Section: 20.4.7 [meta.trans.other] Status: Ready - Submitter: Thorsten Ottosen Date: 2007-07-08

-

View all issues with Ready status.

-

Discussion:

-

-The current working draft has a type-trait decay in 20.4.7 [meta.trans.other]. -

- -

-Its use is to turn C++03 pass-by-value parameters into efficient C++0x -pass-by-rvalue-reference parameters. However, the current definition -introduces an incompatible change where the cv-qualification of the -parameter type is retained. The deduced type should loose such -cv-qualification, as pass-by-value does. -

- - -

Proposed resolution:

-

-In 20.4.7 [meta.trans.other] change the last sentence: -

- -

-Otherwise the member typedef type equals remove_cv<U>::type. -

- -

-In 20.3.1.2 [tuple.creation]/1 change: -

- -

-where each Vi in VTypes is X& if, for the -corresponding type Ti in Types, -remove_cv<remove_reference<Ti>::type>::type equals -reference_wrapper<X>, otherwise Vi is -decay<Ti>::type. -Let Ui be decay<Ti>::type for each -Ti in Types. Then each Vi in VTypes -is X& if Ui equals -reference_wrapper<X>, otherwise Vi is -Ui. -

- - - - - - -
-

706. make_pair() should behave as make_tuple() wrt. reference_wrapper()

-

Section: 20.2.3 [pairs] Status: Ready - Submitter: Thorsten Ottosen Date: 2007-07-08

-

View all other issues in [pairs].

-

View all issues with Ready status.

-

Discussion:

-

-The current draft has make_pair() in 20.2.3 [pairs]/16 -and make_tuple() in 20.3.1.2 [tuple.creation]. -make_tuple() detects the presence of -reference_wrapper<X> arguments and "unwraps" the reference in -such cases. make_pair() would OTOH create a -reference_wrapper<X> member. I suggest that the two -functions are made to behave similar in this respect to minimize -confusion. -

- - -

Proposed resolution:

-

-In 20.2 [utility] change the synopsis for make_pair() to read -

- -
template <class T1, class T2>
-  pair<typename decay<T1>::type V1, typename decay<T2>::type V2> make_pair(T1&&, T2&&);
-
- -

-In 20.2.3 [pairs]/16 change the declaration to match the above synopsis. -Then change the 20.2.3 [pairs]/17 to: -

- -
-

-Returns: pair<typename decay<T1>::type V1,typename decay<T2>::type V2>(forward<T1>(x),forward<T2>(y)) where V1 and -V2 are determined as follows: Let Ui be -decay<Ti>::type for each Ti. Then each -Vi is X& if Ui equals -reference_wrapper<X>, otherwise Vi is -Ui. -

-
- - - - - - -
-

707. null pointer constant for exception_ptr

-

Section: 18.7.1 [exception] Status: Open - Submitter: Jens Maurer Date: 2007-07-20

-

View all issues with Open status.

-

Discussion:

- -

-From the Toronto Core wiki: -

- -

-What do you mean by "null pointer constant"? How do you guarantee that -exception_ptr() == 1 doesn't work?  Do you even want to prevent that? -What's the semantics?  What about void *p = 0; exception_ptr() == p? -Maybe disallow those in the interface, but how do you do that with -portable C++? Could specify just "make it work". -

- -

-Peter's response: -

- -

-null pointer constant as defined in 4.10 [conv.ptr]. Intent is "just make it -work", can be implemented as assignment operator taking a unique pointer -to member, as in the unspecified bool type idiom. -

- - - -

Proposed resolution:

-

-

- - - - - -
-

708. Locales need to be per thread and updated for POSIX changes

-

Section: 22 [localization] Status: Open - Submitter: Peter Dimov Date: 2007-07-28

-

View all other issues in [localization].

-

View all issues with Open status.

-

Discussion:

-

-The POSIX "Extended API Set Part 4," -

-

-http://www.opengroup.org/sib/details.tpl?id=C065 -

-

-introduces extensions to the C locale mechanism that -allow multiple concurrent locales to be used in the same application -by introducing a type locale_t that is very similar to -std::locale, and a number of _l functions that make use of it. -

-

-The global locale (set by setlocale) is now specified to be per- -process. If a thread does not call uselocale, the global locale is -in effect for that thread. It can install a per-thread locale by -using uselocale. -

-

-There is also a nice querylocale mechanism by which one can obtain -the name (such as "de_DE") for a specific facet, even for combined -locales, with no std::locale equivalent. -

-

-std::locale should be harmonized with the new POSIX locale_t -mechanism and provide equivalents for uselocale and querylocale. -

- -

[ -Kona (2007): Bill and Nick to provide wording. -]

- - - - -

Proposed resolution:

-

-

- - - - - -
-

709. char_traits::not_eof has wrong signature

-

Section: 21.1.3 [char.traits.specializations] Status: New - Submitter: Bo Persson Date: 2007-08-13

-

View all issues with New status.

-

Discussion:

-

-The changes made for constexpr in 21.1.3 [char.traits.specializations] have -not only changed the not_eof function from pass by const reference to -pass by value, it has also changed the parameter type from int_type to -char_type. -

-

-This doesn't work for type char, and is inconsistent with the -requirements in Table 56, Traits requirements, 21.1.1 [char.traits.require]. -

- -

-Pete adds: -

- -

-For what it's worth, that may not have been an intentional change. -N2349, which detailed the changes for adding constant expressions to -the library, has strikeout bars through the const and the & that -surround the char_type argument, but none through char_type itself. -So the intention may have been just to change to pass by value, with -text incorrectly copied from the standard. -

- - - -

Proposed resolution:

-

-Change the signature in 21.1.3.1 [char.traits.specializations.char], -21.1.3.2 [char.traits.specializations.char16_t], 21.1.3.3 [char.traits.specializations.char32_t], -and 21.1.3.4 [char.traits.specializations.wchar.t] to -

- -
static constexpr int_type not_eof(char_type int_type c);
-
- - - - - - -
-

710. Missing postconditions

-

Section: 20.6.6.2 [util.smartptr.shared] Status: New - Submitter: Peter Dimov Date: 2007-08-24

-

View other active issues in [util.smartptr.shared].

-

View all other issues in [util.smartptr.shared].

-

View all issues with New status.

-

Discussion:

-

-A discussion on -comp.std.c++ -has identified a contradiction in the shared_ptr specification. -The shared_ptr move constructor and the cast functions are -missing postconditions for the get() accessor. -

- - -

Proposed resolution:

-

-Add to 20.6.6.2.1 [util.smartptr.shared.const]: -

- -
-
shared_ptr(shared_ptr&& r);
-template<class Y> shared_ptr(shared_ptr<Y>&& r);
-
-
-

-Postconditions: *this shall contain the old value of r. r -shall be empty. r.get() == 0. -

-
-
- -

-Add to 20.6.6.2.10 [util.smartptr.shared.cast]: -

- -
-
template<class T, class U> shared_ptr<T> static_pointer_cast(shared_ptr<U> const& r);
-
-
-

-Postconditions: If w is the return value, -w.get() == static_cast<T*>(r.get()) && w.use_count() == r.use_count(). -

-
-
- -
-
template<class T, class U> shared_ptr<T> dynamic_pointer_cast(shared_ptr<U> const& r);
-
-
-

-Postconditions: If w is the return value, w.get() == dynamic_cast<T*>(r.get()). -

-
-
- -
-
template<class T, class U> shared_ptr<T> const_pointer_cast(shared_ptr<U> const& r);
-
-
-

-Postconditions: If w is the return value, -w.get() == const_cast<T*>(r.get()) && w.use_count() == r.use_count(). -

-
-
- -

-Alberto Ganesh Barbati has written an -alternative proposal -where he suggests (among other things) that the casts be respecified in terms of -the aliasing constructor as follows: -

- -

-Change 20.6.6.2.10 [util.smartptr.shared.cast]: -

- -
-

--2- Returns: If r is empty, an empty -shared_ptr<T>; otherwise, a shared_ptr<T> -object that stores static_cast<T*>(r.get()) and shares ownership with -r. shared_ptr<T>(r, static_cast<T*>(r.get()). -

-
- -
-

--6- Returns: -

-
    -
  • When dynamic_cast<T*>(r.get()) returns a nonzero value, -a shared_ptr<T> object that stores a copy -of it and shares ownership with r;
  • -
  • Otherwise, an empty shared_ptr<T> object.
  • -
  • If p = dynamic_cast<T*>(r.get()) is a non-null pointer, shared_ptr<T>(r, p);
  • -
  • Otherwise, shared_ptr<T>().
  • -
-
- -
-

--10- Returns: If r is empty, an empty -shared_ptr<T>; otherwise, a shared_ptr<T> -object that stores const_cast<T*>(r.get()) and shares ownership with -r. shared_ptr<T>(r, const_cast<T*>(r.get()). -

-
- -

-This takes care of the missing postconditions for the casts by bringing -in the aliasing constructor postcondition "by reference". -

- - - - - - -
-

711. Contradiction in empty shared_ptr

-

Section: 20.6.6.2.5 [util.smartptr.shared.obs] Status: New - Submitter: Peter Dimov Date: 2007-08-24

-

View all other issues in [util.smartptr.shared.obs].

-

View all issues with New status.

-

Discussion:

-

-A discussion on -comp.std.c++ -has identified a contradiction in the shared_ptr specification. -The note: -

- -

-[ Note: this constructor allows creation of an empty shared_ptr instance with a non-NULL stored pointer. --end note ] -

- -

-after the aliasing constructor -

- -
template<class Y> shared_ptr(shared_ptr<Y> const& r, T *p);
-
- -

-reflects the intent of -N2351 -to, well, allow the creation of an empty shared_ptr -with a non-NULL stored pointer. -

- -

-This is contradicted by the second sentence in the Returns clause of 20.6.6.2.5 [util.smartptr.shared.obs]: -

- -
-
T* get() const;
-
-

-Returns: the stored pointer. Returns a null pointer if *this is empty. -

-
- - - -

Proposed resolution:

-

-In keeping the N2351 spirit and obviously my preference, change 20.6.6.2.5 [util.smartptr.shared.obs]: -

- -
-
T* get() const;
-
-

-Returns: the stored pointer. Returns a null pointer if *this is empty. -

-
- -

-Alternative proposed resolution: (I won't be happy if we do this, but it's possible): -

- -

-Change 20.6.6.2.1 [util.smartptr.shared.const]: -

- -
-
template<class Y> shared_ptr(shared_ptr<Y> const& r, T *p);
-
-
-

-Requires: If r is empty, p shall be 0. -

-

-[ Note: this constructor allows creation of an empty shared_ptr -instance with a non-NULL stored pointer. --- end note ] -

-
-
- - - - - - -
-

713. sort() complexity is too lax

-

Section: 25.3.1.1 [sort] Status: New - Submitter: Matt Austern Date: 2007-08-30

-

View all issues with New status.

-

Discussion:

-

-The complexity of sort() is specified as "Approximately N -log(N) (where N == last - first ) comparisons on the -average", with no worst case complicity specified. The intention was to -allow a median-of-three quicksort implementation, which is usually O(N -log N) but can be quadratic for pathological inputs. However, there is -no longer any reason to allow implementers the freedom to have a -worst-cast-quadratic sort algorithm. Implementers who want to use -quicksort can use a variant like David Musser's "Introsort" (Software -Practice and Experience 27:983-993, 1997), which is guaranteed to be O(N -log N) in the worst case without incurring additional overhead in the -average case. Most C++ library implementers already do this, and there -is no reason not to guarantee it in the standard. -

- - -

Proposed resolution:

-

-In 25.3.1.1 [sort], change the complexity to "O(N log N)", and remove footnote 266: -

- -
-

-Complexity: Approximately O(N log(N)) (where N == last - first ) -comparisons on the average.266) -

-

-266) -If the worst case behavior is important stable_sort() (25.3.1.2) or partial_sort() -(25.3.1.3) should be used. -

-
- - - - - - -
-

714. search_n complexity is too lax

-

Section: 25.1.9 [alg.search] Status: New - Submitter: Matt Austern Date: 2007-08-30

-

View all other issues in [alg.search].

-

View all issues with New status.

-

Discussion:

-

-The complexity for search_n (25.1.9 [alg.search] par 7) is specified as "At most -(last - first ) * count applications of the corresponding predicate if -count is positive, or 0 otherwise." This is unnecessarily pessimistic. -Regardless of the value of count, there is no reason to examine any -element in the range more than once. -

- - -

Proposed resolution:

-

-Change the complexity to "At most (last - first) applications of the corresponding predicate". -

- -
-
template<class ForwardIterator, class Size, class T> 
-  ForwardIterator 
-    search_n(ForwardIterator first , ForwardIterator last , Size count , 
-             const T& value ); 
-
-template<class ForwardIterator, class Size, class T, 
-         class BinaryPredicate> 
-  ForwardIterator 
-    search_n(ForwardIterator first , ForwardIterator last , Size count , 
-             const T& value , BinaryPredicate pred );
-
-
-

-Complexity: At most (last - first ) * count applications of the corresponding predicate -if count is positive, or 0 otherwise. -

-
-
- - - - - - -
-

715. minmax_element complexity is too lax

-

Section: 25.3.7 [alg.min.max] Status: New - Submitter: Matt Austern Date: 2007-08-30

-

View all other issues in [alg.min.max].

-

View all issues with New status.

-

Discussion:

-

-The complexity for minmax_element (25.3.7 [alg.min.max] par 16) says "At most max(2 * -(last - first ) - 2, 0) applications of the corresponding comparisons", -i.e. the worst case complexity is no better than calling min_element and -max_element separately. This is gratuitously inefficient. There is a -well known technique that does better: see section 9.1 of CLRS -(Introduction to Algorithms, by Cormen, Leiserson, Rivest, and Stein). -

- - -

Proposed resolution:

-

-Change 25.3.7 [alg.min.max] to: -

- -
-
template<class ForwardIterator> 
-  pair<ForwardIterator, ForwardIterator> 
-    minmax_element(ForwardIterator first , ForwardIterator last); 
-template<class ForwardIterator, class Compare> 
-  pair<ForwardIterator, ForwardIterator> 
-    minmax_element(ForwardIterator first , ForwardIterator last , Compare comp);
-
-
-

-Returns: make_pair(m, M), where m is -min_element(first, last) or min_element(first, last, -comp) the first iterator i in [first, -last) such that no other element in the range is smaller, and -where M is max_element(first, last) or -max_element(first, last, comp) the last iterator -i in [first, last) such that no other element in the -range is larger. -

-

-Complexity: At most max(2 * (last - first ) - 2, 0) -max(⌊(3/2) (N-1)⌋, 0) applications of the -corresponding comparisons predicate, where N is distance(first, last). -

-
-
- - - - - - -
-

716. Production in [re.grammar] not actually modified

-

Section: 28.13 [re.grammar] Status: New - Submitter: Stephan T. Lavavej Date: 2007-08-31

-

View all issues with New status.

-

Discussion:

-

-TR1 7.13 [tr.re.grammar]/3 and C++0x WP 28.13 [re.grammar]/3 say: -

- -
-

-The following productions within the ECMAScript grammar are modified as follows: -

- -
CharacterClass ::
-[ [lookahead ∉ {^}] ClassRanges ]
-[ ^ ClassRanges ]
-
- -
- -

-This definition for CharacterClass appears to be exactly identical to that in ECMA-262. -

- -

-Was an actual modification intended here and accidentally omitted, or was this production accidentally included? -

- - -

Proposed resolution:

-

-Remove this mention of the CharacterClass production. -

- -
CharacterClass ::
-[ [lookahead ∉ {^}] ClassRanges ]
-[ ^ ClassRanges ]
-
- - - - - - -
-

717. Incomplete valarray::operator[] specification in [valarray.access]

-

Section: 26.5.2.3 [valarray.access] Status: New - Submitter: Daniel Krügler Date: 2007-08-27

-

View all other issues in [valarray.access].

-

View all issues with New status.

-

Discussion:

-

-Since the return type of valarray's operator[] const overload has been -changed to const T& as described in 389 several paragraphs of -the section 26.5.2.3 [valarray.access] are now -incompletely -specified, because many requirements and guarantees should now also -apply to the const overload. Most notably, the address and reference -guarantees should be extended to the const overload case. -

- - -

Proposed resolution:

-

-Change 26.5.2.3 [valarray.access]: -

- -
-

--1- When applied to a constant array, the subscript operator returns a -reference to the corresponding element of the array. When applied to a -non-constant array, tThe subscript operator returns a -reference to the corresponding element of the array. -

- -

--3- The expression &a[i+j] == &a[i] + j evaluates as true for all size_t i -and size_t j such that i+j is less -than the length of the non-constant array a. -

- -

--4- Likewise, the expression &a[i] != &b[j] evaluates -as true for any two non-constant arrays a and -b and for any size_t i and size_t j such that -i is less than the length of a and j is less -than the length of b. This property indicates an absence of -aliasing and may be used to advantage by optimizing -compilers.281) -

- -

--5- The reference returned by the subscript operator for an non-constant array is guaranteed to be valid until -the member function resize(size_t, T) (26.5.2.7) is called for that array or until the lifetime -of that array ends, whichever happens first. -

- -
- - - - - - -
-

718. basic_string is not a sequence

-

Section: 21.3 [basic.string] Status: New - Submitter: Bo Persson Date: 2007-08-18

-

View other active issues in [basic.string].

-

View all other issues in [basic.string].

-

View all issues with New status.

-

Discussion:

-

-Paragraph 21.3 [basic.string]/3 states: -

- -
-

-The class template basic_string conforms to the requirements for a -Sequence (23.1.1) and for a Reversible Container (23.1). -

-
- -

-First of all, 23.1.1 [sequence.reqmts] is no longer "Sequence" but "Sequence container". -Secondly, after the resent changes to containers (emplace, push_back, -const_iterator parameters to insert and erase), basic_string is not -even close to conform to the current requirements. -

- - -

Proposed resolution:

-

-Remove this sentence, in recognition of the fact that basic_string is -not just a vector-light for literal types, but something quite -different, a string abstraction in its own right. -

- - - - - -
-

719. std::is_literal type traits should be provided

-

Section: 20.4 [meta] Status: New - Submitter: Daniel Krügler Date: 2007-08-25

-

View all other issues in [meta].

-

View all issues with New status.

-

Discussion:

-

-Since the inclusion of constexpr in the standard draft N2369 we have -a new type category "literal", which is defined in 3.9 [basic.types]/p.11: -

- -
-

--11- A type is a literal type if it is: -

-
    -
  • a scalar type; or
  • -
  • a class type (clause 9) with

    -
      -
    • a trivial copy constructor,
    • -
    • a trivial destructor,
    • -
    • at least one constexpr constructor other than the copy constructor,
    • -
    • no virtual base classes, and
    • -
    • all non-static data members and base classes of literal types; or
    • -
    -
  • -
  • an array of literal type.
  • -
-
- -

-I strongly suggest that the standard provides a type traits for -literal types in 20.4.4.3 [meta.unary.prop] for several reasons: -

- -
    -
  1. To keep the traits in sync with existing types.
  2. -
  3. I see many reasons for programmers to use this trait in template - code to provide optimized template definitions for these types, - see below.
  4. -
  5. A user-provided definition of this trait is practically impossible -to write portably.
  6. -
- -

-The special problem of reason (c) is that I don't see currently a -way to portably test the condition for literal class types: -

- -
-
    -
  • at least one constexpr constructor other than the copy constructor,
  • -
-
- -

-Here follows a simply example to demonstrate it's usefulness: -

- -
template <typename T>
-constexpr typename std::enable_if<std::is_literal<T>::value, T>::type
-abs(T x) {
-  return x < T() ? -x : x;
-}
-
-template <typename T>
-typename std::enable_if<!std::is_literal<T>::value, T>::type
-abs(const T& x) {
-  return x < T() ? -x : x;
-}
-
- -

-Here we have the possibility to provide a general abs function -template that can be used in ICE's if it's argument is a literal -type which's value is a constant expression, otherwise we -have an optimized version for arguments which are expensive -to copy and therefore need the usage of arguments of -reference type (instead of const T& we could decide to -use T&&, but that is another issue). -

- - - -

Proposed resolution:

-

-In 20.4.2 [meta.type.synop] in the group "type properties", -just below the line -

- -
template <class T> struct is_pod;
-
- -

-add a new one: -

- -
template <class T> struct is_literal;
-
- -

-In 20.4.4.3 [meta.unary.prop], table Type Property Predicates, just -below the line for the is_pod property add a new line: -

- - - - - - - - - - -
TemplateConditionPreconditions
template <class T> struct is_literal;T is a literal type (3.9)T shall be a complete type, an -array of unknown bound, or -(possibly cv-qualified) void.
- - - - - - -
-

720. Omissions in constexpr usages

-

Section: 23.2.1 [array], 23.3.5 [template.bitset] Status: New - Submitter: Daniel Krügler Date: 2007-08-25

-

View other active issues in [array].

-

View all other issues in [array].

-

View all issues with New status.

-

Discussion:

-
    -
  1. -The member function bool array<T,N>::empty() const should be a -constexpr because this is easily to proof and to implement following it's operational -semantics defined by Table 87 (Container requirements) which says: a.size() == 0. -
  2. -
  3. -The member function bool bitset<N>::test() const must be a -constexpr (otherwise it would violate the specification of constexpr -bitset<N>::operator[](size_t) const, because it's return clause delegates to test()). -
  4. -
  5. -I wonder how the constructor bitset<N>::bitset(unsigned long) can -be declared as a constexpr. Current implementations usually have no such bitset -c'tor which would fulfill the requirements of a constexpr c'tor because they have a -non-empty c'tor body that typically contains for-loops or memcpy to compute the -initialisation. What have I overlooked here? -
  6. -
- - -

Proposed resolution:

-
    -
  1. -

    In the class template definition of 23.2.1 [array]/p. 3 change

    -
    constexpr bool empty() const;
    -
    -
  2. - -
  3. -

    In the class template definition of 23.3.5 [template.bitset]/p. 1 change

    -
    constexpr bool test(size_t pos ) const;
    -
    - -

    -and in 23.3.5.2 [bitset.members] change -

    - -
    constexpr bool test(size_t pos ) const;
    -
    - -
  4. -
- - - - - -
-

721. wstring_convert inconsistensies

-

Section: 22.1.3.2.2 [conversions.string] Status: New - Submitter: Bo Persson Date: 2007-08-27

-

View all issues with New status.

-

Discussion:

-

-Paragraph 3 says that the Codecvt template parameter shall meet the -requirements of std::codecvt, even though std::codecvt itself cannot -be used (because of a protected destructor). -

- -

-How are we going to explain this code to beginning programmers? -

- -
template<class I, class E, class S>
-struct codecvt : std::codecvt<I, E, S>
-{
-    ~codecvt()
-    { }
-};
-
-void main()
-{
-    std::wstring_convert<codecvt<wchar_t, char, std::mbstate_t> > compiles_ok;
-    
-    std::wstring_convert<std::codecvt<wchar_t, char, std::mbstate_t> >   not_ok;
-}
-
- - - -

Proposed resolution:

-

-

- - - - - -
-

722. Missing [c.math] functions nanf and nanl

-

Section: 26.7 [c.math] Status: New - Submitter: Daniel Krügler Date: 2007-08-27

-

View other active issues in [c.math].

-

View all other issues in [c.math].

-

View all issues with New status.

-

Discussion:

-

-In the listing of 26.7 [c.math], table 108: Header <cmath> synopsis I miss -the following C99 functions (from 7.12.11.2): -

- -
float nanf(const char *tagp);
-long double nanl(const char *tagp);
-
- -

-(Note: These functions cannot be overloaded and they are also not -listed anywhere else) -

- - -

Proposed resolution:

-

-In 26.7 [c.math], table 108, section "Functions", add nanf and nanl -just after the existing entry nan. -

- - - - - -
-

723. basic_regex should be moveable

-

Section: 28.8 [re.regex] Status: New - Submitter: Daniel Krügler Date: 2007-08-29

-

View all other issues in [re.regex].

-

View all issues with New status.

-

Discussion:

-

-According to the current state of the standard draft, the class -template basic_regex, as described in 28.8 [re.regex]/3, is -neither MoveConstructible nor MoveAssignable. -IMO it should be, because typical regex state machines tend -to have a rather large data quantum and I have seen several -use cases, where a factory function returns regex values, -which would take advantage of moveabilities. -

- - -

Proposed resolution:

-
    -
  1. -

    -In the header <regex> synopsis 28.4 [re.syn], just below the function -template swap add two further overloads: -

    -
    template <class charT, class traits> 
    -  void swap(basic_regex<charT, traits>& e1,  basic_regex<charT, traits>& e2);
    -template <class charT, class traits>
    -  void swap(basic_regex<charT, traits>&& e1, basic_regex<charT, traits>& e2);
    -template <class charT, class traits>
    -  void swap(basic_regex<charT, traits>& e1,  basic_regex<charT, traits>&& e2);
    -
    -

    -In the class definition of basic_regex, just below 28.8 [re.regex]/3, -perform the following changes: -

    -
  2. - -
  3. -

    Just after the copy c'tor:

    -
    basic_regex(basic_regex&&);
    -
    -
  4. - -
  5. -

    Just after the copy-assignment op.:

    -
    basic_regex& operator=(basic_regex&&);
    -
    -
  6. - -
  7. -

    Just after the first assign overload insert:

    -
    basic_regex& assign(basic_regex&& that);
    -
    -
  8. - -
  9. -

    Change the current swap function to read:

    -
    void swap(basic_regex&&);
    -
    -
  10. - -
  11. -

    In 28.8.2 [re.regex.construct], just below the copy c'tor add a -corresponding member definition of:

    -
    basic_regex(basic_regex&&);
    -
    -
  12. - -
  13. -

    Also in 28.8.2 [re.regex.construct], just below the copy assignment -c'tor add a corresponding member definition of:

    -
    basic_regex& operator=(basic_regex&&);
    -
    -
  14. - -
  15. -

    In 28.8.3 [re.regex.assign], just below the first assign overload add -a corresponding member definition of:

    -
    basic_regex& assign(basic_regex&& that);
    -
    -
  16. - -
  17. -

    In 28.8.6 [re.regex.swap], change the signature of swap to -say:

    -
    void swap(basic_regex&& e);
    -
    -
  18. - -
  19. -

    In 28.8.7.1 [re.regex.nmswap], just below the single binary swap -function, add the two missing overloads:

    -
    template <class charT, class traits>
    -  void swap(basic_regex<charT, traits>&& e1, basic_regex<charT, traits>& e2);
    -template <class charT, class traits>
    -  void swap(basic_regex<charT, traits>& e1, basic_regex<charT, traits>&& e2);
    -
    -
  20. -
- -

-Of course there would be need of corresponding proper standardese -to describe these additions. -

- - - - - - -
-

724. DefaultConstructible is not defined

-

Section: 20.1.1 [utility.arg.requirements] Status: New - Submitter: Pablo Halpern Date: 2007-09-12

-

View other active issues in [utility.arg.requirements].

-

View all other issues in [utility.arg.requirements].

-

View all issues with New status.

-

Discussion:

-

-The DefaultConstructible requirement is referenced in -several places in the August 2007 working draft -N2369, -but is not defined anywhere. -

- - -

Proposed resolution:

-

-In section 20.1.1 [utility.arg.requirements], before table 33, add the -following table: -

- -

Table 33: DefaultConstructible requirements

- -
- - - - - - - - - - -
-

expression

-
-

post-condition

-
-

T - t;
- T()

-
-

T - is default constructed.

-
- -
- - - - - - -
-

725. Optional sequence container requirements column label

-

Section: 23.1.1 [sequence.reqmts] Status: New - Submitter: David Abrahams Date: 2007-09-16

-

View all other issues in [sequence.reqmts].

-

View all issues with New status.

-

Discussion:

-

-Table 90: (Optional sequence container operations) states the -"assertion note pre/post-condition" of operator[] to be -

- -
*(a.begin() + n)
-
- -

-Surely that's meant to be "operational semantics?" -

- - - -

Proposed resolution:

-
- - - - - -
Table 90: Optional sequence container operations
expression return type assertion/note
pre/post-condition

operational semantics
container
-
- - - - - - -
-

726. Missing regex_replace() overloads

-

Section: 28.11.4 [re.alg.replace] Status: New - Submitter: Stephan T. Lavavej Date: 2007-09-22

-

View other active issues in [re.alg.replace].

-

View all other issues in [re.alg.replace].

-

View all issues with New status.

-

Discussion:

-

-Two overloads of regex_replace() are currently provided: -

- -
template <class OutputIterator, class BidirectionalIterator, 
-    class traits, class charT> 
-  OutputIterator 
-  regex_replace(OutputIterator out, 
-                BidirectionalIterator first, BidirectionalIterator last, 
-                const basic_regex<charT, traits>& e, 
-                const basic_string<charT>& fmt, 
-                regex_constants::match_flag_type flags = 
-                  regex_constants::match_default);
- 
-template <class traits, class charT> 
-  basic_string<charT> 
-  regex_replace(const basic_string<charT>& s, 
-                const basic_regex<charT, traits>& e, 
-                const basic_string<charT>& fmt, 
-                regex_constants::match_flag_type flags = 
-                  regex_constants::match_default);
-
- -
    -
  1. Overloads taking const charT * are provided for regex_match() and -regex_search(), but not regex_replace().  This is inconsistent.
  2. -
  3. -

    The absence of const charT * overloads prevents ordinary-looking code from compiling, such as:

    - -
    const string s("kitten");
    -const regex r("en");
    -cout << regex_replace(s, r, "y") << endl;
    -
    - -

    -The compiler error message will be something like "could not deduce -template argument for 'const std::basic_string<_Elem> &' from 'const -char[1]'". -

    - -

    -Users expect that anything taking a basic_string<charT> can also take a -const charT *.  In their own code, when they write a function taking -std::string (or std::wstring), they can pass a const char * (or const -wchar_t *), thanks to basic_string's implicit constructor.  Because the -regex algorithms are templated on charT, they can't rely on -basic_string's implicit constructor (as the compiler error message -indicates, template argument deduction fails first). -

    - -

    -If a user figures out what the compiler error message means, workarounds -are available - but they are all verbose.  Explicit template arguments -could be given to regex_replace(), allowing basic_string's implicit -constructor to be invoked - but charT is the last template argument, not -the first, so this would be extremely verbose.  Therefore, constructing -a basic_string from each C string is the simplest workaround. -

    -
  4. - -
  5. -There is an efficiency consideration: constructing basic_strings can -impose performance costs that could be avoided by a library -implementation taking C strings and dealing with them directly.  -(Currently, for replacement sources, C strings can be converted into -iterator pairs at the cost of verbosity, but for format strings, there -is no way to avoid constructing a basic_string.) -
  6. -
- - - -

Proposed resolution:

-

-Provide additional overloads for regex_replace(): one additional -overload of the iterator-based form (taking const charT* fmt), and three -additional overloads of the convenience form (one taking const charT* -str, another taking const charT* fmt, and the third taking both const -charT* str and const charT* fmt). 28.11.4 [re.alg.replace]: -

- -
-
template <class OutputIterator, class BidirectionalIterator, 
-    class traits, class charT> 
-  OutputIterator 
-  regex_replace(OutputIterator out, 
-                BidirectionalIterator first, BidirectionalIterator last, 
-                const basic_regex<charT, traits>& e, 
-                const basic_string<charT>& fmt, 
-                regex_constants::match_flag_type flags = 
-                  regex_constants::match_default);
-
-template <class OutputIterator, class BidirectionalIterator, 
-    class traits, class charT> 
-  OutputIterator 
-  regex_replace(OutputIterator out, 
-                BidirectionalIterator first, BidirectionalIterator last, 
-                const basic_regex<charT, traits>& e, 
-                const charT* fmt, 
-                regex_constants::match_flag_type flags = 
-                  regex_constants::match_default);
-
-

...

-
template <class traits, class charT> 
-  basic_string<charT> 
-  regex_replace(const basic_string<charT>& s, 
-                const basic_regex<charT, traits>& e, 
-                const basic_string<charT>& fmt, 
-                regex_constants::match_flag_type flags = 
-                  regex_constants::match_default);
-
-template <class traits, class charT> 
-  basic_string<charT> 
-  regex_replace(const basic_string<charT>& s, 
-                const basic_regex<charT, traits>& e, 
-                const charT* fmt, 
-                regex_constants::match_flag_type flags = 
-                  regex_constants::match_default);
-
-template <class traits, class charT> 
-  basic_string<charT> 
-  regex_replace(const charT* s, 
-                const basic_regex<charT, traits>& e, 
-                const basic_string<charT>& fmt, 
-                regex_constants::match_flag_type flags = 
-                  regex_constants::match_default);
-
-template <class traits, class charT> 
-  basic_string<charT> 
-  regex_replace(const charT* s, 
-                const basic_regex<charT, traits>& e, 
-                const charT* fmt, 
-                regex_constants::match_flag_type flags = 
-                  regex_constants::match_default);
-
-
- - - - - - -
-

727. regex_replace() doesn't accept basic_strings with custom traits and allocators

-

Section: 28.11.4 [re.alg.replace] Status: New - Submitter: Stephan T. Lavavej Date: 2007-09-22

-

View other active issues in [re.alg.replace].

-

View all other issues in [re.alg.replace].

-

View all issues with New status.

-

Discussion:

-

-regex_match() and regex_search() take const basic_string<charT, ST, -SA>&regex_replace() takes const basic_string<charT>&.  This prevents -regex_replace() from accepting basic_strings with custom traits and -allocators. -

- - -

Proposed resolution:

-

-Overloads of regex_replace() taking basic_string should be additionally -templated on class ST, class SA and take const basic_string<charT, ST, -SA>&.  Consistency with regex_match() and regex_search() would place -class ST, class SA as the first template arguments; compatibility with -existing code using TR1 and giving explicit template arguments to -regex_replace() would place class ST, class SA as the last template -arguments. -

- - - - - -
-

728. Problem in [rand.eng.mers]/6

-

Section: 26.4.3.2 [rand.eng.mers] Status: New - Submitter: Stephan Tolksdorf Date: 2007-09-21

-

View all issues with New status.

-

Discussion:

-

-The mersenne_twister_engine is required to use a seeding method that is given -as an algorithm parameterized over the number of bits W. I doubt whether the given generalization -of an algorithm that was originally developed only for unsigned 32-bit integers is appropriate -for other bit widths. For instance, W could be theoretically 16 and UIntType a 16-bit integer, in -which case the given multiplier would not fit into the UIntType. Moreover, T. Nishimura and M. -Matsumoto have chosen a dif ferent multiplier for their 64 bit Mersenne Twister -[reference]. -

- -

-I see two possible resolutions: -

- -
    -
  1. Restrict the parameter W of the mersenne_twister_template to values of 32 or 64 and use the -multiplier from [the above reference] for the 64-bit case (my preference)
  2. -
  3. Interpret the state array for any W as a 32-bit array of appropriate length (and a specified byte -order) and always employ the 32-bit algorithm for seeding -
  4. -
- -

-See N2423 -for further discussion. -

- - - -

Proposed resolution:

- -

-See N2423 -for the proposed resolution. -

- - - - - - -
-

729. Problem in [rand.req.eng]/3

-

Section: 26.4.1.3 [rand.req.eng] Status: New - Submitter: Stephan Tolksdorf Date: 2007-09-21

-

View all other issues in [rand.req.eng].

-

View all issues with New status.

-

Discussion:

-

-The 3rd table row in 26.4.1.3 [rand.req.eng]/3 requires random number engines to accept any -arithmetic type as a seed, which is then casted to the engine's result_type and subsequently -used for seeding the state of the engine. The requirement stated as "Creates an engine with -initial state determined by static_cast<X::result_type>(s)" forces random number engines -to either use a seeding method that completely depends on the result_type (see the discussion -of seeding for the mersenne_twister_engine in point T2 above) or at least to throw away "bits -of randomness" in the seed value if the result_type is smaller than the seed type. This seems -to be inappropriate for many modern random number generators, in particular F2-linear or -cryptographic ones, which operate on an internal bit array that in principle is independent of the -type of numbers returned. -

- -

-Posible resolution: I propose to change the wording to a version similar to "Creates an -engine with initial state determined by static_cast<UintType>(s), where UintType is an -implementation specific unsigned integer type." -

- -

-Additionally, the definition of s in 26.4.1.3 [rand.req.eng]/1 c) could be restricted to unsigned integer types. -

- -

-Similarly, the type of the seed in 26.4.1.4 [rand.req.adapt]/3 e) could be left unspecified. -

- -

-See N2423 -for further discussion. -

- - - -

Proposed resolution:

-

-See N2423 -for further discussion. -

- - - - - - -
-

730. Comment on [rand.req.adapt]/3 e)

-

Section: 26.4.1.4 [rand.req.adapt] Status: New - Submitter: Stephan Tolksdorf Date: 2007-09-21

-

View all issues with New status.

-

Discussion:

-

-If an engine adaptor is invoked with an argument of type seed_seq, then all base -engines are specified to be seeded with this seed_seq. As seed_seq's randomization method is -qualified as constant, this procedure will ef fectively initialize all base engines with the same seed -(though the resulting state might still dif fer to a certain degree if the engines are of different types). -It is not clear whether this mode of operation is in general appropriate, hence -- as far as the -stated requirements are of general nature and not just specific to the engine adaptors provided by -the library -- it might be better to leave the behaviour unspecified, since the current definition of -seed_seq does not allow for a generally satisfying specification. -

- -

-Posssible resolution: [As above] -

- -

-See N2423 -for further discussion. -

- - - -

Proposed resolution:

-

-See N2423 -for the proposed resolution. -

- - - - - -
-

731. proposal for a customizable seed_seq

-

Section: 26.4.7.1 [rand.util.seedseq] Status: New - Submitter: Stephan Tolksdorf Date: 2007-09-21

-

View all other issues in [rand.util.seedseq].

-

View all issues with New status.

-

Discussion:

-

-The proper way to seed random number engines seems to be the most frequently -discussed issue of the 26.4 [rand] proposal. While the new seed_seq approach is already rather -general and probably sufficient for most situations, it is unlikely to be optimal in every case (one -problem was pointed out in point T5 above). In some situations it might, for instance, be better to -seed the state with a cryptographic generator. -

-

-In my opinion this is a pretty strong argument for extending the standard with a simple facility to -customize the seeding procedure. This could, for example, be done with the following minimal -changes: -

- -

-Possible resolution: -

- -
    -
  1. -Turn the interface specification of 26.4.7.1 [rand.util.seedseq]/2 into a "SeedSeq" requirement, where the -exact behaviour of the constructors and the randomize method are left unspecified and where the -const qualification for randomize is removed. Classes implementing this interface are additionally -required to specialize the traits class in c). -
  2. -
  3. -Provide the class seed_seq as a default implementation of the SeedSeq interface. -
  4. -
  5. -

    -Supplement the seed_seq with a traits class -

    -
    template <typename T> 
    -struct is_seed_seq { static const bool value = false; }
    -
    -

    and the specialization

    -
    template <> 
    -struct is_seed_seq<seed_seq> { static const bool value = true; }
    -
    -

    which users can supplement with further specializations.

    -
  6. -
  7. -Change 26.4.1.3 [rand.req.eng]/1 d) to "q is an lvalue of a type that fulfils the SeedSeq requirements", and -modify the constructors and seed methods in 26.4.3 [rand.eng] appropriately (the actual implementation -could be done using the SFINAE technique). -
  8. -
- - -

Proposed resolution:

-

-See N2423 -for the proposed resolution. -

- - - - - -
-

732. Defect in [rand.dist.samp.genpdf]

-

Section: 26.4.8.5.3 [rand.dist.samp.genpdf] Status: New - Submitter: Stephan Tolksdorf Date: 2007-09-21

-

View all issues with New status.

-

Discussion:

-

-26.4.8.5.3 [rand.dist.samp.genpdf] describes the interface for a distribution template that is -meant to simulate random numbers from any general distribution given only the density and the -support of the distribution. I'm not aware of any general purpose algorithm that would be capable -of correctly and efficiently implementing the described functionality. From what I know, this is -essentially an unsolved research problem. Existing algorithms either require more knowledge -about the distribution and the problem domain or work only under very limited circumstances. -Even the state of the art special purpose library UNU.RAN does not solve the problem in full -generality, and in any case, testing and customer support for such a library feature would be a -nightmare. -

- -

-Possible resolution: For these reasons, I propose to delete section 26.4.8.5.3 [rand.dist.samp.genpdf]. -

- - -

Proposed resolution:

-

-See N2423 -for the proposed resolution. -

- - - - - -
-

733. Comment on [rand.req.dist]/9

-

Section: 26.4.1.5 [rand.req.dist] Status: New - Submitter: Stephan Tolksdorf Date: 2007-09-21

-

View all issues with New status.

-

Discussion:

-

-The requirement "P shall have a declaration of the form typedef X distribution_- -type" effectively makes the use of inheritance for implementing distributions very inconvenient, -because the child of a distribution class in general will not satisfy this requirement. In my opinion -the benefits of having a typedef in the parameter class pointing back to the distribution class are -not worth the hassle this requirement causes. [In my code base I never made use of the nested -typedef but on several occasions could have profited from being able to use simple inheritance for -the implementation of a distribution class.] -

- -

-Proposed resolution: I propose to drop this requirement. -

- - -

Proposed resolution:

-

-See N2423 -for the proposed resolution. -

- - - - - -
-

734. Unnecessary restriction in [rand.dist.norm.chisq]

-

Section: 26.4.8.4.3 [rand.dist.norm.chisq] Status: New - Submitter: Stephan Tolksdorf Date: 2007-09-21

-

View all issues with New status.

-

Discussion:

-

-chi_squared_distribution, fisher_f_distribution and student_t_distribution -have parameters for the "degrees of freedom" n and m that are specified as integers. For the -following two reasons this is an unnecessary restriction: First, in many applications such as -Bayesian inference or Monte Carlo simulations it is more convenient to treat the respective param- -eters as continuous variables. Second, the standard non-naive algorithms (i.e. -O(1) algorithms) -for simulating from these distributions work with floating-point parameters anyway (all three -distributions could be easily implemented using the Gamma distribution, for instance). -

- -

-Similar arguments could in principle be made for the parameters t and k of the discrete -binomial_distribution and negative_binomial_distribution, though in both cases continuous -parameters are less frequently used in practice and in case of the binomial_distribution -the implementation would be significantly complicated by a non-discrete parameter (in most -implementations one would need an approximation of the log-gamma function instead of just the -log-factorial function). -

- -

-Possible resolution: For these reasons, I propose to change the type of the respective parameters -to double. -

- - -

Proposed resolution:

-

-See N2423 -for the proposed resolution. -

- - - - - -
-

735. Unfortunate naming

-

Section: 26.4.8.2.2 [rand.dist.bern.bin], 26.4.8.2.4 [rand.dist.bern.negbin] Status: New - Submitter: Stephan Tolksdorf Date: 2007-09-21

-

View all issues with New status.

-

Discussion:

-

-In my opinion the choice of name for the t parameter of the binomial_distribution -is very unfortunate. In virtually every internet reference, book and software implementation -this parameter is called n instead, see for example Wikipedia, Mathworld, Evans et al. (1993) -Statistical Distributions, 2nd E., Wiley, p. 38, the R statistical computing language, p. 926, -Mathematica and Matlab. -

- -

-Similarly, the choice of k for the parameter of the negative binomial distributions is rather unusual. -The most common choice for the negative binomial distribution seems to be r instead. -

- -

-Choosing unusual names for the parameters causes confusion among users and makes the -interface unnecessarily inconvenient to use. -

- -

-Possible resolution: For these reasons, I propose to change the name of the respective parameters -to n and r. -

- - -

Proposed resolution:

-

-See N2423 -for the proposed resolution. -

- - - - - -
-

736. Comment on [rand.dist.samp.discrete]

-

Section: 26.4.8.5.1 [rand.dist.samp.discrete] Status: New - Submitter: Stephan Tolksdorf Date: 2007-09-21

-

View all issues with New status.

-

Discussion:

-
    -
  1. -The specification for discrete_distribution requires the member probabilities() -to return a vector of standardized probabilities, which forces the implementation every time to -divide each probability by the sum of all probabilities, as the sum will in practice almost never be -exactly 1.0. This is unnecessarily inef ficient as the implementation would otherwise not need to -compute the standardized probabilities at all and could instead work with the non-standardized -probabilities and the sum. If there was no standardization the user would just get back the -probabilities that were previously supplied to the distribution object, which to me seems to be the -more obvious solution. -
  2. -
  3. -The behaviour of discrete_distribution is not specified in case the number of given -probabilities is larger than the maximum number representable by the IntType. -
  4. -
- -

-Possible resolution: I propose to change the specification such that the non-standardized -probabilities need to be returned and that an additional requirement is included for the number -of probabilities to be smaller than the maximum of IntType. -

- - -

Proposed resolution:

-

-See N2423 -for the proposed resolution. -

- - - - - -
-

737. Comment on [rand.dist.samp.pconst]

-

Section: 26.4.8.5.2 [rand.dist.samp.pconst] Status: New - Submitter: Stephan Tolksdorf Date: 2007-09-21

-

View all issues with New status.

-

Discussion:

-
    -
  1. -The discussion in point T11 above regarding probabilities() similarly applies -to the method densities() of piecewise_constant_distribution. -
  2. -
  3. -

    -The design of the constructor -

    -
    template <class InputIteratorB, class InputIteratorW> 
    -piecewise_constant_distribution( InputIteratorB firstB, InputIteratorB lastB, 
    -                                 InputIteratorW firstW);
    -
    -

    -is unnecessarily unsafe, as there is no separate end-iterator given for the weights. I can't see -any performance or convenience reasons that would justify the risks inherent in such a function -interface, in particular the risk that input error might go unnoticed. -

    -
  4. -
- -

-Possible resolution: I propose to add an InputIteratorW lastW argument to the interface. -

- - -

Proposed resolution:

-

-See N2423 -for the proposed resolution. -

- - - - - -
-

738. Editorial issue in [rand.adapt.disc]/3

-

Section: 26.4.4.1 [rand.adapt.disc] Status: New - Submitter: Stephan Tolksdorf Date: 2007-09-21

-

View all issues with New status.

-

Discussion:

-

-Since the template parameter p and r are of type size_t, the member n in the class -exposition should have type size_t, too. -

- - -

Proposed resolution:

-

-See N2423 -for the proposed resolution. -

- - - - - -
-

739. Defect in [rand.util.canonical]/3

-

Section: 26.4.7.2 [rand.util.canonical] Status: New - Submitter: Stephan Tolksdorf Date: 2007-09-21

-

View all other issues in [rand.util.canonical].

-

View all issues with New status.

-

Discussion:

-

-The complexity of generate_canonical is specified to be "exactly k=max(1, ceil(b/log2 -R)) invocations of g". This terms involves a logarithm that is not rounded and hence can not (in -general) be computed at compile time. As this function template is performance critical, I propose -to replace ceil(b/log2 R) with ceil(b/floor(log2 R)). -

- -

-See N2423 -for further discussion. -

- - - -

Proposed resolution:

-

-See N2423 -for the proposed resolution. -

- - - - - -
-

740. Please remove *_ptr<T[N]>

-

Section: 20.6.5.4 [unique.ptr.compiletime] Status: New - Submitter: Herb Sutter Date: 2007-10-04

-

View all issues with New status.

-

Discussion:

-

-Please don't provide *_ptr<T[N]>. It doesn't enable any useful -bounds-checking (e.g., you could imagine that doing op++ on a -shared_ptr<T[N]> yields a shared_ptr<T[N-1]>, but that promising path -immediately falters on op-- which can't reliably dereference because we -don't know the lower bound). Also, most buffers you'd want to point to -don't have a compile-time known size. -

- -

-To enable any bounds-checking would require run-time information, with -the usual triplet: base (lower bound), current offset, and max offset -(upper bound). And I can sympathize with the point of view that you -wouldn't want to require this on *_ptr itself. But please let's not -follow the <T[N]> path, especially not with additional functions to -query the bounds etc., because this sets wrong user expectations by -embarking on a path that doesn't go all the way to bounds checking as it -seems to imply. -

- -

-If bounds checking is desired, consider a checked_*_ptr instead (e.g., -checked_shared_ptr). And make the interfaces otherwise identical so that -user code could easily #define/typedef between prepending checked_ on -debug builds and not doing so on release builds (for example). -

- -

-Note that some may object that checked_*_ptr may seem to make the smart -pointer more like vector, and we don't want two ways to spell vector. I -don't agree, but if that were true that would be another reason to -remove *_ptr<T[N]> which equally makes the smart pointer more like -std::array. :-) -

- - -

Proposed resolution:

-

-Change the synopsis under 20.6.5 [unique.ptr] p2: -

- -
...
-template<class T> struct default_delete; 
-template<class T> struct default_delete<T[]>; 
-template<class T, size_t N> struct default_delete<T[N]>;
-
-template<class T, class D = default_delete<T>> class unique_ptr; 
-template<class T, class D> class unique_ptr<T[], D>; 
-template<class T, class D, size_t N> class unique_ptr<T[N], D>;
-...
-
- -

-Remove the entire section 20.6.5.1.3 [unique.ptr.dltr.dflt2] default_delete<T[N]>. -

- -

-Remove the entire section 20.6.5.4 [unique.ptr.compiletime] unique_ptr for array objects with a compile time length -and its subsections: 20.6.5.4.1 [unique.ptr.compiletime.dtor], 20.6.5.4.2 [unique.ptr.compiletime.observers], -20.6.5.4.3 [unique.ptr.compiletime.modifiers]. -

- - - - - - -
-

741. Const-incorrect get_deleter function for shared_ptr

-

Section: 20.6.6.2.11 [util.smartptr.getdeleter] Status: New - Submitter: Daniel Krügler Date: 2007-09-27

-

View all other issues in [util.smartptr.getdeleter].

-

View all issues with New status.

-

Discussion:

-

-The following issue was raised by Alf P. Steinbach in c.l.c++.mod: -

- -

-According to the recent draft N2369, both the header memory synopsis -of 20.6 [memory] and 20.6.6.2.11 [util.smartptr.getdeleter] declare: -

- -
template<class D, class T> D* get_deleter(shared_ptr<T> const& p);
-
- -

-This allows to retrieve the pointer to a mutable deleter of a const -shared_ptr (if that owns one) and therefore contradicts the usual -philosophy that associated functors are either read-only (e.g. -key_comp or value_comp of std::map) or do at least reflect -the mutability of the owner (as seen for the both overloads of -unique_ptr::get_deleter). -Even the next similar counter-part of get_deleter - the two -overloads of function::target in the class template function -synopsis 20.5.15.2 [func.wrap.func] or in 20.5.15.2.5 [func.wrap.func.targ] - do -properly mirror the const-state of the owner. -

- -Possible proposed resolutions: - -

-Replace the declarations of get_deleter in the header <memory> -synopsis of 20.6 [memory] and in 20.6.6.2.11 [util.smartptr.getdeleter] by one of the -following alternatives (A) or (B): -

- -
    -
  1. -Provide only the immutable variant. This would reflect the -current praxis of container::get_allocator(), map::key_comp(), or -map::value_comp. - -
    template<class D, class T> const D* get_deleter(shared_ptr<T> const& p);
    -
    -
  2. -
  3. -Just remove the function. -
  4. -
- -

-Alberto Ganesh Barbati adds: -

- -
    -
  1. -

    -Replace it with two functions: -

    -
    template <class D, class T> D get_deleter(shared_ptr<T> const&);
    -template <class D, class T> bool has_deleter(shared_ptr<T> const&);
    -
    - -

    -The first one would throw if D is the wrong type, while the latter would -never throw. This approach would reflect the current praxis of -use_facet/has_facet, with the twist of returning the deleter by value as -container::get_allocator() do. -

    -
  2. -
- -

-Peter Dimov adds: -

- -
-

-My favorite option is "not a defect". A, B and C break useful code. -

-
- - - -

Proposed resolution:

-

-

- - - - - -
-

742. Enabling swap for proxy iterators

-

Section: 20.1.1 [utility.arg.requirements] Status: New - Submitter: Howard Hinnant Date: 2007-10-10

-

View other active issues in [utility.arg.requirements].

-

View all other issues in [utility.arg.requirements].

-

View all issues with New status.

-

Discussion:

-

-This issue was split from 672. 672 now just -deals with changing the requirements of T in the Swappable -requirement from CopyConstructible and CopyAssignable to -MoveConstructible and MoveAssignable. -

- -

-This issue seeks to widen the Swappable requirement to support proxy iterators. Here -is example code: -

- -
namespace Mine {
-
-template <class T>
-struct proxy {...};
-
-template <class T>
-struct proxied_iterator
-{
-   typedef T value_type;
-   typedef proxy<T> reference;
-   reference operator*() const;
-   ...
-};
-
-struct A
-{
-   // heavy type, has an optimized swap, maybe isn't even copyable or movable, just swappable
-   void swap(A&);
-   ...
-};
-
-void swap(A&, A&);
-void swap(proxy<A>, A&);
-void swap(A&, proxy<A>);
-void swap(proxy<A>, proxy<A>);
-
-}  // Mine
-
-...
-
-Mine::proxied_iterator<Mine::A> i(...)
-Mine::A a;
-swap(*i1, a);
-
- -

-The key point to note in the above code is that in the call to swap, *i1 -and a are different types (currently types can only be Swappable with the -same type). A secondary point is that to support proxies, one must be able to pass rvalues -to swap. But note that I am not stating that the general purpose std::swap -should accept rvalues! Only that overloaded swaps, as in the example above, be allowed -to take rvalues. -

- -

-That is, no standard library code needs to change. We simply need to have a more flexible -definition of Swappable. -

- - - -

Proposed resolution:

-

-Change 20.1.1 [utility.arg.requirements]: -

- -
- -

--1- The template definitions in the C++ Standard Library refer to various -named requirements whose details are set out in tables 31-38. In these -tables, T and V are is a types to be supplied by a C++ program -instantiating a template; a, b, and c are -values of type const T; s and t are modifiable -lvalues of type T; u is a value of type (possibly -const) T; and rv is a non-const -rvalue of type T; w is a value of type T; and v is a value of type V. -

- - - - - - - -
Table 37: Swappable requirements [swappable]
expressionreturn typepost-condition
swap(sw,tv)voidtw has the value originally -held by uv, and -uv has the value originally held -by tw
-

-The Swappable requirement is met by satisfying one or more of the following conditions: -

-
    -
  • -T is Swappable if T and V are -the same type and T satisfies the -CopyConstructible -MoveConstructible requirements (Table 34 -33) and the CopyAssignable -MoveAssignable requirements (Table 36 -35); -
  • -
  • -T is Swappable with V if a namespace scope function named -swap exists in the same namespace as the definition of -T or V, such that the expression -swap(tw,u v) is valid and has the -semantics described in this table. -
  • -
-
-
- - - - - - -
-

743. rvalue swap for shared_ptr

-

Section: 20.6.6.2.9 [util.smartptr.shared.spec] Status: New - Submitter: Howard Hinnant Date: 2007-10-10

-

View all issues with New status.

-

Discussion:

-

-When the LWG looked at 674 in Kona the following note was made: -

- -

-We may need to open an issue to deal with the question of -whether shared_ptr needs an rvalue swap. -

- -

-This issue was opened in response to that note. -

- -

-I believe allowing rvalue shared_ptrs to swap is both -appropriate, and consistent with how other library components are currently specified. -

- - - -

Proposed resolution:

-

-Change the synopsis in 20.6.6.2 [util.smartptr.shared]: -

- -
void swap(shared_ptr&& r);
-...
-template<class T> void swap(shared_ptr<T>& a, shared_ptr<T>& b);
-template<class T> void swap(shared_ptr<T>&& a, shared_ptr<T>& b);
-template<class T> void swap(shared_ptr<T>& a, shared_ptr<T>&& b);
-
- -

-Change 20.6.6.2.4 [util.smartptr.shared.mod]: -

- -
void swap(shared_ptr&& r);
-
- -

-Change 20.6.6.2.9 [util.smartptr.shared.spec]: -

- -
template<class T> void swap(shared_ptr<T>& a, shared_ptr<T>& b);
-template<class T> void swap(shared_ptr<T>&& a, shared_ptr<T>& b);
-template<class T> void swap(shared_ptr<T>& a, shared_ptr<T>&& b);
-
- - - - - -
-

744. What is the lifetime of an exception pointed to by an exception_ptr?

-

Section: 18.7.5 [propagation] Status: New - Submitter: Alisdair Meredith Date: 2007-10-10

-

View other active issues in [propagation].

-

View all other issues in [propagation].

-

View all issues with New status.

-

Discussion:

-

-Without some lifetime guarantee, it is hard to know how this type can be -used.  Very specifically, I don't see how the current wording would -guarantee and exception_ptr caught at the end of one thread could be safely -stored and rethrown in another thread - the original motivation for this -API. -

-

-(Peter Dimov agreed it should be clearer, maybe a non-normative note to -explain?) -

- - -

Proposed resolution:

-

-

- - - - - -
-

745. copy_exception API slices.

-

Section: 18.7.5 [propagation] Status: New - Submitter: Alisdair Meredith Date: 2007-10-10

-

View other active issues in [propagation].

-

View all other issues in [propagation].

-

View all issues with New status.

-

Discussion:

-

-It could be I did not understand the design rationale, but I thought -copy_exception would produce an exception_ptr to the most-derived (dynamic) -type of the passed exception.  Instead it slices, which appears to be less -useful, and a likely source of FAQ questions in the future. -

-

-(Peter Dimov suggests NAD) -

- - -

Proposed resolution:

-

-

- - - - - -
-

746. current_exception may fail with bad_alloc

-

Section: 18.7.5 [propagation] Status: New - Submitter: Alisdair Meredith Date: 2007-10-10

-

View other active issues in [propagation].

-

View all other issues in [propagation].

-

View all issues with New status.

-

Discussion:

-

-I understand that the attempt to copy an exception may run out of memory, -but I believe this is the only part of the standard that mandates failure -with specifically bad_alloc, as opposed to allowing an -implementation-defined type derived from bad_alloc.  For instance, the Core -language for a failed new expression is: -

-
-

-Any other allocation function that fails to allocate storage shall indicate -failure only by throwing an exception of a type that would match a handler -(15.3) of type std::bad_alloc (18.5.2.1). -

-
-

-I think we should allow similar freedom here (or add a blanket -compatible-exception freedom paragraph in 17) -

-

-I prefer the clause 17 approach myself, and maybe clean up any outstanding -wording that could also rely on it. -

- - -

Proposed resolution:

-

-

- - - - - -
-

747. We have 3 separate type traits to identify classes supporting no-throw operations

-

Section: 20.4.4.3 [meta.unary.prop] Status: New - Submitter: Alisdair Meredith Date: 2007-10-10

-

View other active issues in [meta.unary.prop].

-

View all other issues in [meta.unary.prop].

-

View all issues with New status.

-

Discussion:

-

-We have 3 separate type traits to identify classes supporting no-throw -operations, which are very useful when trying to provide exception safety -guarantees.  However, I'm not entirely clear on what the current wording -requires of a conforming implementation.  To quote from -has_nothrow_default_constructor: -

-

-or T is a class type with a default constructor that is known not to throw -any exceptions -

-

-What level of magic do we expect to deduce if this is known? -

-

-E.g. -

- -
struct test{
- int x;
- test() : x() {}
-};
-
-

-Should I expect a conforming compiler to - assert( has_nothrow_constructor<test>::value ) -

-

-Is this a QoI issue? -

-

-Should I expect to 'know' only if-and-only-if there is an inline definition -available? -

-

-Should I never expect that to be true, and insist that the user supplies an -empty throw spec if they want to assert the no-throw guarantee? -

-

-It would be helpful to maybe have a footnote explaining what is required, -but right now I don't know what to suggest putting in the footnote. -

-

-(agreement since is that trivial ops and explicit no-throws are required. -Open if QoI should be allowed to detect further) -

- - -

Proposed resolution:

-

-

- - - - - -
-

748. The is_abstract type trait is defined by reference to 10.4.

-

Section: 20.4.4.3 [meta.unary.prop] Status: New - Submitter: Alisdair Meredith Date: 2007-10-10

-

View other active issues in [meta.unary.prop].

-

View all other issues in [meta.unary.prop].

-

View all issues with New status.

-

Discussion:

-

-I am trying to decide is a pure virtual function is a necessary as well as -sufficient requirement to be classified as abstract? -

-

-For instance, is the following (non-polymorphic) type considered abstract? -

-
struct abstract {
-protected:
- abstract(){}
- abstract( abstract const & ) {}
- ~abstract() {}
-};
-
-

-(Suggested that this may be NAD, with an editorial fix-up from Pete on the -core wording to make clear that abstract requires a pure virtual function) -

- - -

Proposed resolution:

-

-

- - - - - -
-

749. Currently has_nothrow_copy_constructor<T>::value is true if T has 'a' nothrow copy constructor.

-

Section: 20.4.4.3 [meta.unary.prop] Status: New - Submitter: Alisdair Meredith Date: 2007-10-10

-

View other active issues in [meta.unary.prop].

-

View all other issues in [meta.unary.prop].

-

View all issues with New status.

-

Discussion:

-

-Unfortunately a class can have multiple copy constructors, and I believe to -be useful this trait should only return true is ALL copy constructors are -no-throw. -

-

-For instance: -

-
-
struct awkward {
- awkward( const awkward & ) throw() {}
- awkward( awkward & ) { throw "oops"; } };
-
-
- - -

Proposed resolution:

-

-

- - - - - -
-

750. The current definition for is_convertible requires that the type be -implicitly convertible, so explicit constructors are ignored.

-

Section: 20.4.5 [meta.rel] Status: New - Submitter: Alisdair Meredith Date: 2007-10-10

-

View all issues with New status.

-

Discussion:

-

-With the pending arrival of explicit conversion functions though, I'm -wondering if we want an additional trait, is_explictly_convertible? -

- - -

Proposed resolution:

-

-

- - - - - -
-

751. change pass-by-reference members of vector<bool> to pass-by-value?

-

Section: 23.2.6 [vector.bool] Status: New - Submitter: Alisdair Meredith Date: 2007-10-10

-

View all issues with New status.

-

Discussion:

-

-A number of vector<bool> members take const bool& as arguments. -Is there any chance we could change them to pass-by-value or would I -be wasting everyone's time if wrote up an issue? -

- - -

Proposed resolution:

-

-

- - - - - -
-

752. Allocator complexity requirement

-

Section: 20.1.2 [allocator.requirements] Status: New - Submitter: Hans Boehm Date: 2007-10-11

-

View other active issues in [allocator.requirements].

-

View all other issues in [allocator.requirements].

-

View all issues with New status.

-

Discussion:

-

-Did LWG recently discuss 20.1.2 [allocator.requirements]-2, which states that "All the operations -on the allocators are expected to be amortized constant time."? -

-

-As I think I pointed out earlier, this is currently fiction for -allocate() if it has to obtain memory from the OS, and it's unclear to -me how to interpret this for construct() and destroy() if they deal with -large objects.  Would it be controversial to officially let these take -time linear in the size of the object, as they already do in real life? -

-

-Allocate() more blatantly takes time proportional to the size of the -object if you mix in GC.  But it's not really a new problem, and I think -we'd be confusing things by leaving the bogus requirements there.  The -current requirement on allocate() is generally not important anyway, -since it takes O(size) to construct objects in the resulting space. -There are real performance issues here, but they're all concerned with -the constants, not the asymptotic complexity. -

- - -

Proposed resolution:

-

-Change 20.1.2 [allocator.requirements]/2: -

- -
-

--2- Table 39 describes the requirements on types manipulated through -allocators. All the operations on the allocators are expected to be -amortized constant time, except that allocate and -construct may require time proportional to the size of the -object allocated or constructed. Table 40 describes the -requirements on allocator types. -

-
- - - - - -
-

753. Move constructor in draft

-

Section: 20.1.1 [utility.arg.requirements] Status: New - Submitter: Yechezkel Mett Date: 2007-10-14

-

View other active issues in [utility.arg.requirements].

-

View all other issues in [utility.arg.requirements].

-

View all issues with New status.

-

Discussion:

-

-The draft standard n2369 uses the term move constructor in a few -places, but doesn't seem to define it. -

- -

-MoveConstructible requirements are defined in Table 33 in 20.1.1 [utility.arg.requirements] as -follows: -

- -
- - - - - - - - - - - -
MoveConstructible requirements
expression post-condition
T t = rv t is equivalent to the value of rv before the construction
[Note: There is no requirement on the value of rv after the -construction. -- end note]
-
- -

-(where rv is a non-const rvalue of type T). -

- -

-So I assume the move constructor is the constructor that would be used -in filling the above requirement. -

- -

-For vector::reserve, vector::resize and the vector modifiers given in -23.2.5.4 [vector.modifiers] we have -

- -
-Requires: If value_type has a move constructor, that constructor shall -not throw any exceptions. -
- -

-Firstly "If value_type has a move constructor" is superfluous; every -type which can be put into a vector has a move constructor (a copy -constructor is also a move constructor). Secondly it means that for -any value_type which has a throwing copy constructor and no other move -constructor these functions cannot be used -- which I think will come -as a shock to people who have been using such types in vector until -now! -

- -

-I can see two ways to correct this. The simpler, which is presumably -what was intended, is to say "If value_type has a move constructor and -no copy constructor, the move constructor shall not throw any -exceptions" or "If value_type has a move constructor which changes the -value of its parameter,". -

- -

-The other alternative is add to MoveConstructible the requirement that -the expression does not throw. This would mean that not every type -that satisfies the CopyConstructible requirements also satisfies the -MoveConstructible requirements. It would mean changing requirements in -various places in the draft to allow either MoveConstructible or -CopyConstructible, but I think the result would be clearer and -possibly more concise too. -

- - -

Proposed resolution:

-

-

- - - - - -
-

754. Ambiguous return clause for std::uninitialized_copy

-

Section: 20.6.4.1 [uninitialized.copy] Status: New - Submitter: Daniel Krügler Date: 2007-10-15

-

View other active issues in [uninitialized.copy].

-

View all other issues in [uninitialized.copy].

-

View all issues with New status.

-

Discussion:

-

-14882-2003, [lib.uninitialized.copy] is currently written as follows: -

- -
-
template <class InputIterator, class ForwardIterator>
-  ForwardIterator uninitialized_copy(InputIterator first, InputIterator last,
-                                     ForwardIterator result);
-
-
-

--1- Effects: -

-
for (; first != last; ++result, ++first)
-  new (static_cast<void*>(&*result))
-    typename iterator_traits<ForwardIterator>::value_type(*first);
-
-

--2- Returns: result -

-
-
- -

-similarily for N2369, and its corresponding section -20.6.4.1 [uninitialized.copy]. -

- -

-It's not clear to me what the return clause is supposed to mean, I see -two -possible interpretations: -

- -
    -
  1. -The notion of result is supposed to mean the value given by the -function parameter result [Note to the issue editor: Please use italics for -result]. -This seems somewhat implied by recognizing that both the function -parameter -and the name used in the clause do have the same italic font. -
  2. -
  3. -The notion of "result" is supposed to mean the value of result -after the -preceding effects clause. This is in fact what all implementations I -checked -do (and which is probably it's intend, because it matches the -specification of std::copy). -
  4. -
- -

-The problem is: I see nothing in the standard which grants that this -interpretation -is correct, specifically [lib.structure.specifications] or -17.3.1.3 [structure.specifications] -resp. do not clarify which "look-up" rules apply for names found in -the elements -of the detailed specifications - Do they relate to the corresponding -synopsis or -to the effects clause (or possibly other elements)? Fortunately most -detailed -descriptions are unambigious in this regard, e.g. this problem does -not apply -for std::copy. -

- - - -

Proposed resolution:

-

-Change the wording of the return clause to say (20.6.4.1 [uninitialized.copy]): -

- -
-

--2- Returns: The value of result after effects have taken place. -

-
- - - - - - - \ No newline at end of file diff --git a/libstdc++-v3/docs/html/ext/lwg-closed.html b/libstdc++-v3/docs/html/ext/lwg-closed.html deleted file mode 100644 index 52184fb805e..00000000000 --- a/libstdc++-v3/docs/html/ext/lwg-closed.html +++ /dev/null @@ -1,10627 +0,0 @@ - -C++ Standard Library Closed Issues List - - - - - - - - - - - - - - - - - - - - - -
Doc. no.N2458=07-0328
Date:2007-10-20
Project:Programming Language C++
Reply to:Howard Hinnant <howard.hinnant@gmail.com>
-

C++ Standard Library Closed Issues List (Revision R52)

- -

Reference ISO/IEC IS 14882:1998(E)

-

Also see:

- - -

This document contains only library issues which have been closed - by the Library Working Group as duplicates or not defects. That is, - issues which have a status of Dup or - NAD. See the Library Active Issues List active issues and more - information. See the Library Defect Reports List for issues considered - defects. The introductory material in that document also applies to - this document.

- -

Revision History

-
    -
  • R52: -2007-10-19 post-Kona mailing. - -
  • -
  • R51: -2007-09-09 pre-Kona mailing. - -
  • -
  • R50: -2007-08-05 post-Toronto mailing. -
      -
    • Summary:
        -
      • 153 open issues, down by 5.
      • -
      • 555 closed issues, up by 17.
      • -
      • 708 issues total, up by 12.
      • -
    • -
    • Details:
        -
      • Added the following New issues: 697, 698, 699, 700, 701, 702, 703, 704, 705, 706, 707, 708.
      • -
      • Changed the following issues from New to NAD: 583, 584, 662.
      • -
      • Changed the following issues from Open to NAD: 528.
      • -
      • Changed the following issues from New to NAD Editorial: 637, 647, 658, 690.
      • -
      • Changed the following issues from Open to NAD Editorial: 525.
      • -
      • Changed the following issues from Pending NAD Editorial to NAD Editorial: 553, 571, 591, 633, 636, 641, 642, 648, 649, 656.
      • -
      • Changed the following issues from New to Open: 579, 631, 680.
      • -
      • Changed the following issues from Pending WP to Open: 258.
      • -
      • Changed the following issues from Ready to Pending WP: 644.
      • -
      • Changed the following issues from New to Ready: 577, 660.
      • -
      • Changed the following issues from Open to Ready: 488.
      • -
      • Changed the following issues from Open to Review: 518.
      • -
      • Changed the following issues from Ready to TRDec: 604.
      • -
      • Changed the following issues from DR to WP: 453.
      • -
      • Changed the following issues from Ready to WP: 531, 551, 566, 628, 640, 643, 646.
      • -
    • -
    -
  • -
  • R49: -2007-06-23 pre-Toronto mailing. -
      -
    • Summary:
        -
      • 158 open issues, up by 13.
      • -
      • 538 closed issues, up by 7.
      • -
      • 696 issues total, up by 20.
      • -
    • -
    • Details:
        -
      • Added the following New issues: 677, 678, 679, 680, 681, 682, 684, 685, 686, 687, 688, 689, 690, 691, 692, 693, 694, 695, 696.
      • -
      • Added the following Pending NAD Editorial issues: 683.
      • -
      • Changed the following issues from New to NAD Editorial: 587.
      • -
      • Changed the following issues from Open to NAD Editorial: 590.
      • -
      • Changed the following issues from New to Pending NAD Editorial: 636, 642, 648, 649.
      • -
    • -
    -
  • -
  • R48: -2007-05-06 post-Oxford mailing. - -
  • -
  • R47: -2007-03-09 pre-Oxford mailing. - -
  • -
  • R46: -2007-01-12 mid-term mailing. -
      -
    • Summary:
        -
      • 141 open issues, up by 11.
      • -
      • 478 closed issues, down by 1.
      • -
      • 619 issues total, up by 10.
      • -
    • -
    • Details:
    • -
    -
  • -
  • R45: -2006-11-03 post-Portland mailing. - -
  • -
  • R44: -2006-09-08 pre-Portland mailing. -
      -
    • Summary:
        -
      • 130 open issues, up by 6.
      • -
      • 462 closed issues, down by 1.
      • -
      • 592 issues total, up by 5.
      • -
    • -
    • Details:
    • -
    -
  • -
  • R43: -2006-06-23 mid-term mailing. -
      -
    • Summary:
        -
      • 124 open issues, up by 14.
      • -
      • 463 closed issues, down by 1.
      • -
      • 587 issues total, up by 13.
      • -
    • -
    • Details:
    • -
    -
  • -
  • R42: -2006-04-21 post-Berlin mailing. - -
  • -
  • R41: -2006-02-24 pre-Berlin mailing. -
      -
    • Summary:
        -
      • 126 open issues, up by 31.
      • -
      • 440 closed issues, up by 0.
      • -
      • 566 issues total, up by 31.
      • -
    • -
    • Details:
        -
      • Added new issues 536-566.
      • -
      • Moved 342 from Ready to Open.
      • -
      • Reopened 309.
      • -
    • -
    -
  • -
  • R40: -2005-12-16 mid-term mailing. -
      -
    • Summary:
        -
      • 95 open issues.
      • -
      • 440 closed issues.
      • -
      • 535 issues total.
      • -
    • -
    • Details:
    • -
    -
  • -
  • R39: -2005-10-14 post-Mont Tremblant mailing. -Added new issues 526-528. -Moved issues 280, 461, 464, 465, 467, 468, 474, 496 from Ready to WP as per the vote from Mont Tremblant. -Moved issues 247, 294, 342, 362, 369, 371, 376, 384, 475, 478, 495, 497 from Review to Ready. -Moved issues 498, 504, 506, 509, 510, 511, 512, 513, 514 from New to Open. -Moved issues 505, 507, 508, 519 from New to Ready. -Moved issue 500 from New to NAD. -Moved issue 518 from New to Review. -
  • -
  • R38: -2005-07-03 pre-Mont Tremblant mailing. -Merged open TR1 issues in 504-522. -Added new issues 523-523 -
  • -
  • R37: -2005-06 mid-term mailing. -Added new issues 498-503. -
  • -
  • R36: -2005-04 post-Lillehammer mailing. All issues in "ready" status except -for 454 were moved to "DR" status, and all issues -previously in "DR" status were moved to "WP". -
  • -
  • R35: -2005-03 pre-Lillehammer mailing. -
  • -
  • R34: -2005-01 mid-term mailing. Added new issues 488-494. -
  • -
  • R33: -2004-11 post-Redmond mailing. Reflects actions taken in Redmond. -
  • -
  • R32: -2004-09 pre-Redmond mailing: reflects new proposed resolutions and -new issues received after the 2004-07 mailing. Added -new issues 479-481. -
  • -
  • R31: -2004-07 mid-term mailing: reflects new proposed resolutions and -new issues received after the post-Sydney mailing. Added -new issues 463-478. -
  • -
  • R30: -Post-Sydney mailing: reflects decisions made at the Sydney meeting. -Voted all "Ready" issues from R29 into the working paper. -Added new issues 460-462. -
  • -
  • R29: -Pre-Sydney mailing. Added new issues 441-457. -
  • -
  • R28: -Post-Kona mailing: reflects decisions made at the Kona meeting. -Added new issues 432-440. -
  • -
  • R27: -Pre-Kona mailing. Added new issues 404-431. -
  • -
  • R26: -Post-Oxford mailing: reflects decisions made at the Oxford meeting. -All issues in Ready status were voted into DR status. All issues in -DR status were voted into WP status. -
  • -
  • R25: -Pre-Oxford mailing. Added new issues 390-402. -
  • -
  • R24: -Post-Santa Cruz mailing: reflects decisions made at the Santa Cruz -meeting. All Ready issues from R23 with the exception of 253, which has been given a new proposed resolution, were -moved to DR status. Added new issues 383-389. (Issues 387-389 were discussed -at the meeting.) Made progress on issues 225, 226, 229: 225 and 229 have been moved to Ready status, and the only remaining -concerns with 226 involve wording. -
  • -
  • R23: -Pre-Santa Cruz mailing. Added new issues 367-382. -Moved issues in the TC to TC status. -
  • -
  • R22: -Post-Curaçao mailing. Added new issues 362-366. -
  • -
  • R21: -Pre-Curaçao mailing. Added new issues 351-361. -
  • -
  • R20: -Post-Redmond mailing; reflects actions taken in Redmond. Added -new issues 336-350, of which issues -347-350 were added since Redmond, hence -not discussed at the meeting. - -All Ready issues were moved to DR status, with the exception of issues -284, 241, and 267. - -Noteworthy issues discussed at Redmond include -120 202, 226, 233, -270, 253, 254, 323. -
  • -
  • R19: -Pre-Redmond mailing. Added new issues -323-335. -
  • -
  • R18: -Post-Copenhagen mailing; reflects actions taken in Copenhagen. -Added new issues 312-317, and discussed -new issues 271-314. - -Changed status of issues -103 118 136 153 -165 171 183 184 -185 186 214 221 -234 237 243 248 -251 252 256 260 -261 262 263 265 -268 -to DR. - -Changed status of issues -49 109 117 182 -228 230 232 235 -238 241 242 250 -259 264 266 267 -271 272 273 275 -281 284 285 286 -288 292 295 297 -298 301 303 306 -307 308 312 -to Ready. - -Closed issues -111 277 279 287 -289 293 302 313 -314 -as NAD. - -
  • -
  • R17: -Pre-Copenhagen mailing. Converted issues list to XML. Added proposed -resolutions for issues 49, 76, 91, 235, 250, 267. -Added new issues 278-311. -
  • -
  • R16: -post-Toronto mailing; reflects actions taken in Toronto. Added new -issues 265-277. Changed status of issues -3, 8, 9, 19, -26, 31, 61, -63, 86, 108, -112, 114, 115, -122, 127, 129, -134, 137, 142, -144, 146, 147, -159, 164, 170, -181, 199, 208, -209, 210, 211, -212, 217, 220, -222, 223, 224, -227 to "DR". Reopened issue 23. Reopened -issue 187. Changed issues 2 and -4 to NAD. Fixed a typo in issue 17. Fixed -issue 70: signature should be changed both places it -appears. Fixed issue 160: previous version didn't fix -the bug in enough places. -
  • -
  • R15: -pre-Toronto mailing. Added issues -233-264. Some small HTML formatting -changes so that we pass Weblint tests. -
  • -
  • R14: -post-Tokyo II mailing; reflects committee actions taken in -Tokyo. Added issues 228 to 232. (00-0019R1/N1242) -
  • -
  • R13: -pre-Tokyo II updated: Added issues 212 to 227. -
  • -
  • R12: -pre-Tokyo II mailing: Added issues 199 to -211. Added "and paragraph 5" to the proposed resolution -of issue 29. Add further rationale to issue -178. -
  • -
  • R11: -post-Kona mailing: Updated to reflect LWG and full committee actions -in Kona (99-0048/N1224). Note changed resolution of issues -4 and 38. Added issues 196 -to 198. Closed issues list split into "defects" and -"closed" documents. Changed the proposed resolution of issue -4 to NAD, and changed the wording of proposed resolution -of issue 38. -
  • -
  • R10: -pre-Kona updated. Added proposed resolutions 83, -86, 91, 92, -109. Added issues 190 to -195. (99-0033/D1209, 14 Oct 99) -
  • -
  • R9: -pre-Kona mailing. Added issues 140 to -189. Issues list split into separate "active" and -"closed" documents. (99-0030/N1206, 25 Aug 99) -
  • -
  • R8: -post-Dublin mailing. Updated to reflect LWG and full committee actions -in Dublin. (99-0016/N1193, 21 Apr 99) -
  • -
  • R7: -pre-Dublin updated: Added issues 130, 131, -132, 133, 134, -135, 136, 137, -138, 139 (31 Mar 99) -
  • -
  • R6: -pre-Dublin mailing. Added issues 127, 128, -and 129. (99-0007/N1194, 22 Feb 99) -
  • -
  • R5: -update issues 103, 112; added issues -114 to 126. Format revisions to prepare -for making list public. (30 Dec 98) -
  • -
  • R4: -post-Santa Cruz II updated: Issues 110, -111, 112, 113 added, several -issues corrected. (22 Oct 98) -
  • -
  • R3: -post-Santa Cruz II: Issues 94 to 109 -added, many issues updated to reflect LWG consensus (12 Oct 98) -
  • -
  • R2: -pre-Santa Cruz II: Issues 73 to 93 added, -issue 17 updated. (29 Sep 98) -
  • -
  • R1: -Correction to issue 55 resolution, 60 code -format, 64 title. (17 Sep 98) -
  • -
- -

Closed Issues

-
-

2. Auto_ptr conversions effects incorrect

-

Section: D.9.1.3 [auto.ptr.conv] Status: NAD - Submitter: Nathan Myers Date: 1997-12-04

-

View all issues with NAD status.

-

Discussion:

-

Paragraph 1 in "Effects", says "Calls -p->release()" where it clearly must be "Calls -p.release()". (As it is, it seems to require using -auto_ptr<>::operator-> to refer to X::release, assuming that -exists.)

- - -

Proposed resolution:

-

Change 20.4.4.3 [meta.unary.prop] paragraph 1 Effects from -"Calls p->release()" to "Calls p.release()".

- - -

Rationale:

-

Not a defect: the proposed change is already found in the standard. -[Originally classified as a defect, later reclassified.]

- - - - - -
-

4. Basic_string size_type and difference_type should be implementation defined

-

Section: 21.3 [basic.string] Status: NAD - Submitter: Beman Dawes Date: 1997-11-16

-

View other active issues in [basic.string].

-

View all other issues in [basic.string].

-

View all issues with NAD status.

-

Discussion:

-

In Morristown we changed the size_type and difference_type typedefs -for all the other containers to implementation defined with a -reference to 23.1 [container.requirements]. This should probably also have been -done for strings.

- - -

Rationale:

-

Not a defect. [Originally classified as a defect, later -reclassified.] basic_string, unlike the other standard library -template containers, is severely constrained by its use of -char_traits. Those types are dictated by the traits class, and are far -from implementation defined.

- - - - - -
-

6. File position not an offset unimplementable

-

Section: 27.4.3 [fpos] Status: NAD - Submitter: Matt Austern Date: 1997-12-15

-

View all other issues in [fpos].

-

View all issues with NAD status.

-

Discussion:

-

Table 88, in I/O, is too strict; it's unimplementable on systems -where a file position isn't just an offset. It also never says just -what fpos<> is really supposed to be. [Here's my summary, which -Jerry agrees is more or less accurate. "I think I now know what -the class really is, at this point: it's a magic cookie that -encapsulates an mbstate_t and a file position (possibly represented as -an fpos_t), it has syntactic support for pointer-like arithmetic, and -implementors are required to have real, not just syntactic, support -for arithmetic." This isn't standardese, of course.]

- - -

Rationale:

-

Not a defect. The LWG believes that the Standard is already clear, -and that the above summary is what the Standard in effect says.

- - - - - -
-

10. Codecvt<>::do unclear

-

Section: 22.2.1.5 [locale.codecvt.byname] Status: Dup - Submitter: Matt Austern Date: 1998-01-14

-

View all other issues in [locale.codecvt.byname].

-

View all issues with Dup status.

-

Duplicate of: 19

-

Discussion:

-

Section 22.2.1.5.2 says that codecvt<>::do_in and do_out -should return the value noconv if "no conversion was -needed". However, I don't see anything anywhere that defines what -it means for a conversion to be needed or not needed. I can think of -several circumstances where one might plausibly think that a -conversion is not "needed", but I don't know which one is -intended here.

- - -

Rationale:

- - - - - - -
-

12. Way objects hold allocators unclear

-

Section: 20.1.2 [allocator.requirements] Status: NAD - Submitter: Angelika Langer Date: 1998-02-23

-

View other active issues in [allocator.requirements].

-

View all other issues in [allocator.requirements].

-

View all issues with NAD status.

-

Discussion:

-

I couldn't find a statement in the standard saying whether the allocator object held by -a container is held as a copy of the constructor argument or whether a pointer of -reference is maintained internal. There is an according statement for compare objects and -how they are maintained by the associative containers, but I couldn't find anything -regarding allocators.

- -

Did I overlook it? Is it an open issue or known defect? Or is it deliberately left -unspecified?

- - -

Rationale:

-

Not a defect. The LWG believes that the Standard is already -clear.  See 23.1 [container.requirements], paragraph 8.

- - - - - -
-

43. Locale table correction

-

Section: 22.2.1.5 [locale.codecvt.byname] Status: Dup - Submitter: Brendan Kehoe Date: 1998-06-01

-

View all other issues in [locale.codecvt.byname].

-

View all issues with Dup status.

-

Duplicate of: 33

-

Discussion:

- - -

Rationale:

- - - - - - -
-

45. Stringstreams read/write pointers initial position unclear

-

Section: 27.7.3 [ostringstream] Status: NAD - Submitter: Matthias Mueller Date: 1998-05-27

-

View all issues with NAD status.

-

Discussion:

-

In a comp.lang.c++.moderated Matthias Mueller wrote:

- -

"We are not sure how to interpret the CD2 (see 27.2 -[iostream.forward], 27.7.3.1 [ostringstream.cons], 27.7.1.1 -[stringbuf.cons]) -with respect to the question as to what the correct initial positions -of the write and  read pointers of a stringstream should -be."

- -

"Is it the same to output two strings or to initialize the stringstream with the -first and to output the second?"

- -

[PJ Plauger, Bjarne Stroustrup, Randy Smithey, Sean Corfield, and -Jerry Schwarz have all offered opinions; see reflector messages -lib-6518, 6519, 6520, 6521, 6523, 6524.]

- - - - -

Rationale:

-

The LWG believes the Standard is correct as written. The behavior -of stringstreams is consistent with fstreams, and there is a -constructor which can be used to obtain the desired effect. This -behavior is known to be different from strstreams.

- - - - - -
-

58. Extracting a char from a wide-oriented stream

-

Section: 27.6.1.2.3 [istream::extractors] Status: NAD - Submitter: Matt Austern Date: 1998-07-01

-

View all other issues in [istream::extractors].

-

View all issues with NAD status.

-

Discussion:

-

27.6.1.2.3 has member functions for extraction of signed char and -unsigned char, both singly and as strings. However, it doesn't say -what it means to extract a char from a -basic_streambuf<charT, Traits>.

- -

basic_streambuf, after all, has no members to extract a char, so -basic_istream must somehow convert from charT to signed char or -unsigned char. The standard doesn't say how it is to perform that -conversion.

- - -

Rationale:

-

The Standard is correct as written. There is no such extractor and -this is the intent of the LWG.

- - - - -
-

65. Underspecification of strstreambuf::seekoff

-

Section: D.7.1.3 [depr.strstreambuf.virtuals] Status: NAD - Submitter: Matt Austern Date: 1998-08-18

-

View all other issues in [depr.strstreambuf.virtuals].

-

View all issues with NAD status.

-

Discussion:

-

The standard says how this member function affects the current -stream position. (gptr or pptr) However, it does not -say how this member function affects the beginning and end of the -get/put area.

- -

This is an issue when seekoff is used to position the get pointer -beyond the end of the current read area. (Which is legal. This is -implicit in the definition of seekhigh in D.7.1, paragraph 4.) -

- - -

Rationale:

-

The LWG agrees that seekoff() is underspecified, but does not wish -to invest effort in this deprecated feature.

- - - - - -
-

67. Setw useless for strings

-

Section: 21.3.8.9 [string.io] Status: Dup - Submitter: Steve Clamage Date: 1998-07-09

-

View all other issues in [string.io].

-

View all issues with Dup status.

-

Duplicate of: 25

-

Discussion:

-

In a comp.std.c++ posting Michel Michaud wrote: What -should be output by:

- -
   string text("Hello");
-   cout << '[' << setw(10) << right << text << ']';
-
- -

Shouldn't it be:

- -
   [     Hello]
- -

Another person replied: Actually, according to the FDIS, the width -of the field should be the minimum of width and the length of the -string, so the output shouldn't have any padding. I think that this is -a typo, however, and that what is wanted is the maximum of the -two. (As written, setw is useless for strings. If that had been the -intent, one wouldn't expect them to have mentioned using its value.) -

- -

It's worth pointing out that this is a recent correction anyway; -IIRC, earlier versions of the draft forgot to mention formatting -parameters whatsoever.

- - -

Rationale:

- - - - - - -
-

72. Do_convert phantom member function

-

Section: 22.2.1.4 [locale.codecvt] Status: Dup - Submitter: Nathan Myers Date: 1998-08-24

-

View all other issues in [locale.codecvt].

-

View all issues with Dup status.

-

Duplicate of: 24

-

Discussion:

-

In 22.2.1.4 [locale.codecvt] par 3, and in 22.2.1.4.2 [locale.codecvt.virtuals] par 8, a nonexistent member function -"do_convert" is mentioned. This member was replaced with -"do_in" and "do_out", the proper referents in the -contexts above.

- - -

Rationale:

- - - - - -
-

73. is_open should be const

-

Section: 27.8.1 [fstreams] Status: NAD - Submitter: Matt Austern Date: 1998-08-27

-

View all other issues in [fstreams].

-

View all issues with NAD status.

-

Discussion:

-

Classes basic_ifstream, basic_ofstream, and -basic_fstream all have a member function is_open. It -should be a const member function, since it does nothing but -call one of basic_filebuf's const member functions.

- - -

Rationale:

-

Not a defect. This is a deliberate feature; const streams would be -meaningless.

- - - - -
-

77. Valarray operator[] const returning value

-

Section: 26.5.2.3 [valarray.access] Status: Dup - Submitter: Levente Farkas Date: 1998-09-09

-

View all other issues in [valarray.access].

-

View all issues with Dup status.

-

Duplicate of: 389

-

Discussion:

-

valarray:
-
-    T operator[] (size_t) const;
-
-why not
-
-    const T& operator[] (size_t) const;
-
-as in vector ???
-
-One can't copy even from a const valarray eg:
-
-    memcpy(ptr, &v[0], v.size() * sizeof(double));
-

-[I] find this bug in valarray is very difficult.

- - -

Rationale:

-

The LWG believes that the interface was deliberately designed that -way. That is what valarray was designed to do; that's where the -"value array" name comes from. LWG members further comment -that "we don't want valarray to be a full STL container." -26.5.2.3 [valarray.access] specifies properties that indicate "an -absence of aliasing" for non-constant arrays; this allows -optimizations, including special hardware optimizations, that are not -otherwise possible.

- - - - - -
-

81. Wrong declaration of slice operations

-

Section: 26.5.5 [template.slice.array], 26.5.7 [template.gslice.array], 26.5.8 [template.mask.array], 26.5.9 [template.indirect.array] Status: NAD - Submitter: Nico Josuttis Date: 1998-09-29

-

View all other issues in [template.slice.array].

-

View all issues with NAD status.

-

Discussion:

-

Isn't the definition of copy constructor and assignment operators wrong? -       Instead of

- -
      slice_array(const slice_array&); 
-      slice_array& operator=(const slice_array&);
- -

IMHO they have to be

- -
      slice_array(const slice_array<T>&); 
-      slice_array& operator=(const slice_array<T>&);
- -

Same for gslice_array.

- - -

Rationale:

-

Not a defect. The Standard is correct as written.

- - - - -
-

82. Missing constant for set elements

-

Section: 23.1.2 [associative.reqmts] Status: NAD - Submitter: Nico Josuttis Date: 1998-09-29

-

View all other issues in [associative.reqmts].

-

View all issues with NAD status.

-

Discussion:

-

Paragraph 5 specifies:

- -

-For set and multiset the value type is the same as the key type. For -map and multimap it is equal to pair<const Key, T>. -

- -

Strictly speaking, this is not correct because for set and multiset -the value type is the same as the constant key type.

- - -

Rationale:

-

Not a defect. The Standard is correct as written; it uses a -different mechanism (const &) for set and -multiset. See issue 103 for a related -issue.

- - - - -
-

84. Ambiguity with string::insert()

-

Section: 21.3.5 [string.access] Status: NAD - Submitter: Nico Josuttis Date: 1998-09-29

-

View all issues with NAD status.

-

Discussion:

-

If I try

-
    s.insert(0,1,' ');
- -

  I get an nasty ambiguity. It might be

-
    s.insert((size_type)0,(size_type)1,(charT)' ');
- -

which inserts 1 space character at position 0, or

-
    s.insert((char*)0,(size_type)1,(charT)' ')
- -

which inserts 1 space character at iterator/address 0 (bingo!), or

-
    s.insert((char*)0, (InputIterator)1, (InputIterator)' ')
- -

which normally inserts characters from iterator 1 to iterator ' -'. But according to 23.1.1.9 (the "do the right thing" fix) -it is equivalent to the second. However, it is still ambiguous, -because of course I mean the first!

- - -

Rationale:

-

Not a defect. The LWG believes this is a "genetic -misfortune" inherent in the design of string and thus not a -defect in the Standard as such .

- - - - -
-

85. String char types

-

Section: 21 [strings] Status: NAD - Submitter: Nico Josuttis Date: 1998-09-29

-

View all other issues in [strings].

-

View all issues with NAD status.

-

Discussion:

-

The standard seems not to require that charT is equivalent to -traits::char_type. So, what happens if charT is not equivalent to -traits::char_type?

- - -

Rationale:

-

There is already wording in 21.1 [char.traits] paragraph 3 that -requires them to be the same.

- - - - -
-

87. Error in description of string::compare()

-

Section: 21.3.6.8 [string::swap] Status: Dup - Submitter: Nico Josuttis Date: 1998-09-29

-

View all other issues in [string::swap].

-

View all issues with Dup status.

-

Duplicate of: 5

-

Discussion:

-

The following compare() description is obviously a bug:

- -
int compare(size_type pos, size_type n1, 
-            charT *s, size_type n2 = npos) const;
-
- -

because without passing n2 it should compare up to the end of the -string instead of comparing npos characters (which throws an -exception)

- - -

Rationale:

- - - - - -
-

88. Inconsistency between string::insert() and string::append()

-

Section: 21.3.6.4 [string::insert], 21.3.6.2 [string::append] Status: NAD - Submitter: Nico Josuttis Date: 1998-09-29

-

View all other issues in [string::insert].

-

View all issues with NAD status.

-

Discussion:

-

Why does

-
  template<class InputIterator> 
-       basic_string& append(InputIterator first, InputIterator last);
- -

return a string, while

-
  template<class InputIterator> 
-       void insert(iterator p, InputIterator first, InputIterator last);
- -

returns nothing ?

- - -

Rationale:

-

The LWG believes this stylistic inconsistency is not sufficiently -serious to constitute a defect.

- - - - -
-

89. Missing throw specification for string::insert() and string::replace()

-

Section: 21.3.6.4 [string::insert], 21.3.6.6 [string::replace] Status: Dup - Submitter: Nico Josuttis Date: 1998-09-29

-

View all other issues in [string::insert].

-

View all issues with Dup status.

-

Duplicate of: 83

-

Discussion:

-

All insert() and replace() members for strings with an iterator as -first argument lack a throw specification. The throw -specification should probably be: length_error if size exceeds -maximum.

- - -

Rationale:

-

Considered a duplicate because it will be solved by the resolution -of issue 83.

- - - - - -
-

93. Incomplete Valarray Subset Definitions

-

Section: 26.5 [numarray] Status: NAD - Submitter: Nico Josuttis Date: 1998-09-29

-

View all other issues in [numarray].

-

View all issues with NAD status.

-

Discussion:

-

You can easily create subsets, but you can't easily combine them -with other subsets. Unfortunately, you almost always needs an -explicit type conversion to valarray. This is because the standard -does not specify that valarray subsets provide the same operations as -valarrays.

- -

For example, to multiply two subsets and assign the result to a third subset, you can't -write the following:

- -
va[slice(0,4,3)] = va[slice(1,4,3)] * va[slice(2,4,3)];
- -

Instead, you have to code as follows:

- -
va[slice(0,4,3)] = static_cast<valarray<double> >(va[slice(1,4,3)]) * 
-                   static_cast<valarray<double> >(va[slice(2,4,3)]);
- -

This is tedious and error-prone. Even worse, it costs performance because each cast -creates a temporary objects, which could be avoided without the cast.

- - -

Proposed resolution:

-

Extend all valarray subset types so that they offer all valarray operations.

- - -

Rationale:

-

This is not a defect in the Standard; it is a request for an extension.

- - - - -
-

94. May library implementors add template parameters to Standard Library classes?

-

Section: 17.4.4 [conforming] Status: NAD - Submitter: Matt Austern Date: 1998-01-22

-

View all issues with NAD status.

-

Discussion:

-

Is it a permitted extension for library implementors to add template parameters to -standard library classes, provided that those extra parameters have defaults? For example, -instead of defining template <class T, class Alloc = allocator<T> > class -vector; defining it as template <class T, class Alloc = allocator<T>, -int N = 1> class vector;

- -

The standard may well already allow this (I can't think of any way that this extension -could break a conforming program, considering that users are not permitted to -forward-declare standard library components), but it ought to be explicitly permitted or -forbidden.

- -

comment from Steve Cleary via comp.std.c++:

-
-

I disagree [with the proposed resolution] for the following reason: -consider user library code with template template parameters. For -example, a user library object may be templated on the type of -underlying sequence storage to use (deque/list/vector), since these -classes all take the same number and type of template parameters; this -would allow the user to determine the performance tradeoffs of the -user library object. A similar example is a user library object -templated on the type of underlying set storage (set/multiset) or map -storage (map/multimap), which would allow users to change (within -reason) the semantic meanings of operations on that object.

-

I think that additional template parameters should be forbidden in -the Standard classes. Library writers don't lose any expressive power, -and can still offer extensions because additional template parameters -may be provided by a non-Standard implementation class:

-
 
-   template <class T, class Allocator = allocator<T>, int N = 1>
-   class __vector
-   { ... };
-   template <class T, class Allocator = allocator<T> >
-   class vector: public __vector<T, Allocator>
-   { ... };
-
- -
- - - -

Proposed resolution:

-

Add a new subclause [presumably 17.4.4.9] following 17.4.4.8 [res.on.exception.handling]:

- -
-

17.4.4.9 Template Parameters

A specialization of a - template class described in the C++ Standard Library behaves the - same as if the implementation declares no additional template - parameters.

Footnote: Additional template parameters with - default values are thus permitted.

-
- -

Add "template parameters" to the list of subclauses at -the end of 17.4.4 [conforming] paragraph 1.

- -

[Kona: The LWG agreed the standard needs clarification. After -discussion with John Spicer, it seems added template parameters can be -detected by a program using template-template parameters. A straw vote -- "should implementors be allowed to add template -parameters?" found no consensus ; 5 - yes, 7 - no.]

- - - - -

Rationale:

-

-There is no ambiguity; the standard is clear as written. Library -implementors are not permitted to add template parameters to standard -library classes. This does not fall under the "as if" rule, -so it would be permitted only if the standard gave explicit license -for implementors to do this. This would require a change in the -standard. -

- -

-The LWG decided against making this change, because it would break -user code involving template template parameters or specializations -of standard library class templates. -

- - - - - -
-

95. Members added by the implementation

-

Section: 17.4.4.4 [member.functions] Status: NAD - Submitter: AFNOR Date: 1998-10-07

-

View all issues with NAD status.

-

Discussion:

-

In 17.3.4.4/2 vs 17.3.4.7/0 there is a hole; an implementation could add virtual -members a base class and break user derived classes.

- -

Example:

- -
-
// implementation code:
-struct _Base { // _Base is in the implementer namespace
-        virtual void foo ();
-};
-class vector : _Base // deriving from a class is allowed
-{ ... };
-
-// user code:
-class vector_checking : public vector 
-{
-        void foo (); // don't want to override _Base::foo () as the 
-                     // user doesn't know about _Base::foo ()
-};
-
- - -

Proposed resolution:

-

Clarify the wording to make the example illegal.

- - -

Rationale:

-

This is not a defect in the Standard.  The example is already -illegal.  See 17.4.4.4 [member.functions] paragraph 2.

- - - - -
-

97. Insert inconsistent definition

-

Section: 23 [containers] Status: NAD - Submitter: AFNOR Date: 1998-10-07

-

View all other issues in [containers].

-

View all issues with NAD status.

-

Discussion:

-

insert(iterator, const value_type&) is defined both on -sequences and on set, with unrelated semantics: insert here (in -sequences), and insert with hint (in associative containers). They -should have different names (B.S. says: do not abuse overloading).

- - -

Rationale:

-

This is not a defect in the Standard. It is a genetic misfortune of -the design, for better or for worse.

- - - - -
-

99. Reverse_iterator comparisons completely wrong

-

Section: 24.4.1.3.13 [reverse.iter.op==] Status: NAD - Submitter: AFNOR Date: 1998-10-07

-

View all issues with NAD status.

-

Discussion:

-

The <, >, <=, >= comparison operator are wrong: they -return the opposite of what they should.

- -

Note: same problem in CD2, these were not even defined in CD1. SGI -STL code is correct; this problem is known since the Morristown -meeting but there it was too late

- - -

Rationale:

-

This is not a defect in the Standard. A careful reading shows the Standard is correct -as written. A review of several implementations show that they implement -exactly what the Standard says.

- - - - -
-

100. Insert iterators/ostream_iterators overconstrained

-

Section: 24.4.2 [insert.iterators], 24.5.4 [ostreambuf.iterator] Status: NAD - Submitter: AFNOR Date: 1998-10-07

-

View all issues with NAD status.

-

Discussion:

-

Overspecified For an insert iterator it, the expression *it is -required to return a reference to it. This is a simple possible -implementation, but as the SGI STL documentation says, not the only -one, and the user should not assume that this is the case.

- - -

Rationale:

-

The LWG believes this causes no harm and is not a defect in the -standard. The only example anyone could come up with caused some -incorrect code to work, rather than the other way around.

- - - - - -
-

101. No way to free storage for vector and deque

-

Section: 23.2.5 [vector], 23.2.1 [array] Status: NAD - Submitter: AFNOR Date: 1998-10-07

-

View all other issues in [vector].

-

View all issues with NAD status.

-

Discussion:

-

Reserve can not free storage, unlike string::reserve

- - -

Rationale:

-

This is not a defect in the Standard. The LWG has considered this -issue in the past and sees no need to change the Standard. Deque has -no reserve() member function. For vector, shrink-to-fit can be -expressed in a single line of code (where v is -vector<T>): -

- -
-

vector<T>(v).swap(v);  // shrink-to-fit v

-
- - - - - -
-

102. Bug in insert range in associative containers

-

Section: 23.1.2 [associative.reqmts] Status: Dup - Submitter: AFNOR Date: 1998-10-07

-

View all other issues in [associative.reqmts].

-

View all issues with Dup status.

-

Duplicate of: 264

-

Discussion:

-

Table 69 of Containers say that a.insert(i,j) is linear if [i, j) is ordered. It seems -impossible to implement, as it means that if [i, j) = [x], insert in an associative -container is O(1)!

- - -

Proposed resolution:

-

N+log (size()) if [i,j) is sorted according to value_comp()

- - -

Rationale:

-

Subsumed by issue 264.

- - - - - -
-

104. Description of basic_string::operator[] is unclear

-

Section: 21.3.4 [string.capacity] Status: NAD - Submitter: AFNOR Date: 1998-10-07

-

View all other issues in [string.capacity].

-

View all issues with NAD status.

-

Discussion:

-

It is not clear that undefined behavior applies when pos == size () -for the non const version.

- - -

Proposed resolution:

-

Rewrite as: Otherwise, if pos > size () or pos == size () and -the non-const version is used, then the behavior is undefined.

- - -

Rationale:

-

The Standard is correct. The proposed resolution already appears in -the Standard.

- - - - -
-

105. fstream ctors argument types desired

-

Section: 27.8 [file.streams] Status: NAD Future - Submitter: AFNOR Date: 1998-10-07

-

View all issues with NAD Future status.

-

Discussion:

-

fstream ctors take a const char* instead of string.
-fstream ctors can't take wchar_t

- -

An extension to add a const wchar_t* to fstream would make the -implementation non conforming.

- - -

Rationale:

-

This is not a defect in the Standard. It might be an -interesting extension for the next Standard.

- - - - -
-

107. Valarray constructor is strange

-

Section: 26.5.2 [template.valarray] Status: NAD - Submitter: AFNOR Date: 1998-10-07

-

View all other issues in [template.valarray].

-

View all issues with NAD status.

-

Discussion:

-

The order of the arguments is (elem, size) instead of the normal -(size, elem) in the rest of the library. Since elem often has an -integral or floating point type, both types are convertible to each -other and reversing them leads to a well formed program.

- - -

Proposed resolution:

-

Inverting the arguments could silently break programs. Introduce -the two signatures (const T&, size_t) and (size_t, const T&), -but make the one we do not want private so errors result in a -diagnosed access violation. This technique can also be applied to STL -containers.

- - -

Rationale:

-

The LWG believes that while the order of arguments is unfortunate, -it does not constitute a defect in the standard. The LWG believes that -the proposed solution will not work for valarray<size_t> and -perhaps other cases.

- - - - -
-

111. istreambuf_iterator::equal overspecified, inefficient

-

Section: 24.5.3.5 [istreambuf.iterator::equal] Status: NAD Future - Submitter: Nathan Myers Date: 1998-10-15

-

View all issues with NAD Future status.

-

Discussion:

-

The member istreambuf_iterator<>::equal is specified to be -unnecessarily inefficient. While this does not affect the efficiency -of conforming implementations of iostreams, because they can -"reach into" the iterators and bypass this function, it does -affect users who use istreambuf_iterators.

- -

The inefficiency results from a too-scrupulous definition, which -requires a "true" result if neither iterator is at eof. In -practice these iterators can only usefully be compared with the -"eof" value, so the extra test implied provides no benefit, -but slows down users' code.

- -

The solution is to weaken the requirement on the function to return -true only if both iterators are at eof.

- - -

Proposed resolution:

-

Replace 24.5.3.5 [istreambuf.iterator::equal], -paragraph 1,

- -
-

-1- Returns: true if and only if both iterators are at end-of-stream, or neither is at - end-of-stream, regardless of what streambuf object they use.

-
- -

with

- -
-

-1- Returns: true if and only if both iterators are at - end-of-stream, regardless of what streambuf object they use.

-
- - - -

Rationale:

-

It is not clear that this is a genuine defect. Additionally, the -LWG was reluctant to make a change that would result in -operator== not being a equivalence relation. One consequence of -this change is that an algorithm that's passed the range [i, i) -would no longer treat it as an empty range.

- - - - - -
-

113. Missing/extra iostream sync semantics

-

Section: 27.6.1.1 [istream], 27.6.1.3 [istream.unformatted] Status: NAD - Submitter: Steve Clamage Date: 1998-10-13

-

View all other issues in [istream].

-

View all issues with NAD status.

-

Discussion:

-

In 27.6.1.1, class basic_istream has a member function sync, described in 27.6.1.3, -paragraph 36.

- -

Following the chain of definitions, I find that the various sync functions have defined -semantics for output streams, but no semantics for input streams. On the other hand, -basic_ostream has no sync function.

- -

The sync function should at minimum be added to basic_ostream, for internal -consistency.

- -

A larger question is whether sync should have assigned semantics for input streams.

- -

Classic iostreams said streambuf::sync flushes pending output and attempts to return -unread input characters to the source. It is a protected member function. The filebuf -version (which is public) has that behavior (it backs up the read pointer). Class -strstreambuf does not override streambuf::sync, and so sync can't be called on a -strstream.

- -

If we can add corresponding semantics to the various sync functions, we should. If not, -we should remove sync from basic_istream.

- - -

Rationale:

-

A sync function is not needed in basic_ostream because the flush function provides the -desired functionality.

- -

As for the other points, the LWG finds the standard correct as written.

- - - - - -
-

116. bitset cannot be constructed with a const char*

-

Section: 23.3.5 [template.bitset] Status: NAD Future - Submitter: Judy Ward Date: 1998-11-06

-

View other active issues in [template.bitset].

-

View all other issues in [template.bitset].

-

View all issues with NAD Future status.

-

Discussion:

-

The following code does not compile with the EDG compiler:

- -
-
#include <bitset>
-using namespace std;
-bitset<32> b("111111111");
-
- -

If you cast the ctor argument to a string, i.e.:

- -
-
bitset<32> b(string("111111111"));
-
- -

then it will compile. The reason is that bitset has the following templatized -constructor:

- -
-
template <class charT, class traits, class Allocator>
-explicit bitset (const basic_string<charT, traits, Allocator>& str, ...);
-
- -

According to the compiler vendor, Steve Adamcyk at EDG, the user -cannot pass this template constructor a const char* and -expect a conversion to basic_string. The reason is -"When you have a template constructor, it can get used in -contexts where type deduction can be done. Type deduction basically -comes up with exact matches, not ones involving conversions." -

- -

I don't think the intention when this constructor became -templatized was for construction from a const char* to no -longer work.

- - -

Proposed resolution:

-

Add to 23.3.5 [template.bitset] a bitset constructor declaration

- -
-
explicit bitset(const char*);
-
- -

and in Section 23.3.5.1 [bitset.cons] add:

- -
-
explicit bitset(const char* str);
-

Effects:
-     Calls bitset((string) str, 0, string::npos);

-
- - -

Rationale:

-

Although the problem is real, the standard is designed that way so -it is not a defect. Education is the immediate workaround. A future -standard may wish to consider the Proposed Resolution as an -extension.

- - - - - -
-

121. Detailed definition for ctype<wchar_t> specialization

-

Section: 22.1.1.1.1 [locale.category] Status: NAD - Submitter: Judy Ward Date: 1998-12-15

-

View all other issues in [locale.category].

-

View all issues with NAD status.

-

Discussion:

-

Section 22.1.1.1.1 has the following listed in Table 51: ctype<char> , -ctype<wchar_t>.

- -

Also Section 22.2.1.1 [locale.ctype] says:

- -
-

The instantiations required in Table 51 (22.1.1.1.1) namely ctype<char> and - ctype<wchar_t> , implement character classing appropriate to the implementation's - native character set.

-
- -

However, Section 22.2.1.3 [facet.ctype.special] -only has a detailed description of the ctype<char> specialization, not the -ctype<wchar_t> specialization.

- - -

Proposed resolution:

-

Add the ctype<wchar_t> detailed class description to Section -22.2.1.3 [facet.ctype.special].

- - -

Rationale:

-

Specialization for wchar_t is not needed since the default is acceptable.

- - - - - -
-

128. Need open_mode() function for file stream, string streams, file buffers, and string  buffers

-

Section: 27.7 [string.streams], 27.8 [file.streams] Status: NAD Future - Submitter: Angelika Langer Date: 1999-02-22

-

View all other issues in [string.streams].

-

View all issues with NAD Future status.

-

Discussion:

-

The following question came from Thorsten Herlemann:

- -
-

You can set a mode when constructing or opening a file-stream or - filebuf, e.g. ios::in, ios::out, ios::binary, ... But how can I get - that mode later on, e.g. in my own operator << or operator - >> or when I want to check whether a file-stream or - file-buffer object passed as parameter is opened for input or output - or binary? Is there no possibility? Is this a design-error in the - standard C++ library?

-
- -

It is indeed impossible to find out what a stream's or stream -buffer's open mode is, and without that knowledge you don't know -how certain operations behave. Just think of the append mode.

- -

Both streams and stream buffers should have a mode() function that returns the -current open mode setting.

- - -

Proposed resolution:

-

For stream buffers, add a function to the base class as a non-virtual function -qualified as const to 27.5.2 [streambuf]:

- -

    openmode mode() const;

- -

    Returns the current open mode.

- -

With streams, I'm not sure what to suggest. In principle, the mode -could already be returned by ios_base, but the mode is only -initialized for file and string stream objects, unless I'm overlooking -anything. For this reason it should be added to the most derived -stream classes. Alternatively, it could be added to basic_ios -and would be default initialized in basic_ios<>::init().

- - -

Rationale:

-

This might be an interesting extension for some future, but it is -not a defect in the current standard. The Proposed Resolution is -retained for future reference.

- - - - - -
-

131. list::splice throws nothing

-

Section: 23.2.3.4 [list.ops] Status: NAD - Submitter: Howard Hinnant Date: 1999-03-06

-

View all other issues in [list.ops].

-

View all issues with NAD status.

-

Discussion:

-

What happens if a splice operation causes the size() of a list to grow -beyond max_size()?

- - -

Rationale:

-

Size() cannot grow beyond max_size(). 

- - - - - -
-

135. basic_iostream doubly initialized

-

Section: 27.6.1.5.1 [iostream.cons] Status: NAD - Submitter: Howard Hinnant Date: 1999-03-06

-

View all issues with NAD status.

-

Discussion:

-

-1- Effects Constructs an object of class basic_iostream, assigning -initial values to the base classes by calling -basic_istream<charT,traits>(sb) (lib.istream) and -basic_ostream<charT,traits>(sb) (lib.ostream)

- -

The called for basic_istream and basic_ostream constructors call -init(sb). This means that the basic_iostream's virtual base class is -initialized twice.

- - -

Proposed resolution:

-

Change 27.6.1.5.1, paragraph 1 to:

- -

-1- Effects Constructs an object of class basic_iostream, assigning -initial values to the base classes by calling -basic_istream<charT,traits>(sb) (lib.istream).

- - -

Rationale:

-

The LWG agreed that the init() function is called -twice, but said that this is harmless and so not a defect in the -standard.

- - - - -
-

138. Class ctype_byname<char> redundant and misleading

-

Section: 22.2.1.4 [locale.codecvt] Status: NAD Future - Submitter: Angelika Langer Date: 1999-03-18

-

View all other issues in [locale.codecvt].

-

View all issues with NAD Future status.

-

Discussion:

-

Section 22.2.1.4 [locale.codecvt] specifies that -ctype_byname<char> must be a specialization of the ctype_byname -template.

- -

It is common practice in the standard that specializations of class templates are only -mentioned where the interface of the specialization deviates from the interface of the -template that it is a specialization of. Otherwise, the fact whether or not a required -instantiation is an actual instantiation or a specialization is left open as an -implementation detail.

- -

Clause 22.2.1.4 deviates from that practice and for that reason is misleading. The -fact, that ctype_byname<char> is specified as a specialization suggests that there -must be something "special" about it, but it has the exact same interface as the -ctype_byname template. Clause 22.2.1.4 does not have any explanatory value, is at best -redundant, at worst misleading - unless I am missing anything.

- -

Naturally, an implementation will most likely implement ctype_byname<char> as a -specialization, because the base class ctype<char> is a specialization with an -interface different from the ctype template, but that's an implementation detail and need -not be mentioned in the standard.

- - -

Rationale:

-

The standard as written is mildly misleading, but the correct fix -is to deal with the underlying problem in the ctype_byname base class, -not in the specialization. See issue 228.

- - - - -
-

140. map<Key, T>::value_type does not satisfy the assignable requirement

-

Section: 23.3.1 [map] Status: NAD Future - Submitter: Mark Mitchell Date: 1999-04-14

-

View all other issues in [map].

-

View all issues with NAD Future status.

-

Discussion:

-
-

23.1 [container.requirements]
-
- expression         return type -      pre/post-condition
- -------------     -----------      - -------------------
- X::value_type    T -                    - T is assignable
-
- 23.3.1 [map]
-
- A map satisfies all the requirements of a container.
-
- For a map<Key, T> ... the value_type is pair<const Key, T>.

-
- -

There's a contradiction here. In particular, `pair<const Key, -T>' is not assignable; the `const Key' cannot be assigned -to. So,  map<Key, T>::value_type does not satisfy the -assignable requirement imposed by a container.

- -

[See issue 103 for the slightly related issue of -modification of set keys.]

- - - -

Rationale:

-

The LWG believes that the standard is inconsistent, but that this -is a design problem rather than a strict defect. May wish to -reconsider for the next standard.

- - - - -
-

143. C .h header wording unclear

-

Section: D.5 [depr.c.headers] Status: NAD - Submitter: Christophe de Dinechin Date: 1999-05-04

-

View all issues with NAD status.

-

Discussion:

-

[depr.c.headers] paragraph 2 reads:

- -
- -

Each C header, whose name has the form name.h, behaves as if each -name placed in the Standard library namespace by the corresponding -cname header is also placed within the namespace scope of the -namespace std and is followed by an explicit using-declaration -(_namespace.udecl_)

- -
- -

I think it should mention the global name space somewhere...  -Currently, it indicates that name placed in std is also placed in -std...

- -

I don't know what is the correct wording. For instance, if struct -tm is defined in time.h, ctime declares std::tm. However, the current -wording seems ambiguous regarding which of the following would occur -for use of both ctime and time.h:

- -
-
// version 1:
-namespace std {
-        struct tm { ... };
-}
-using std::tm;
-
-// version 2:
-struct tm { ... };
-namespace std {
-        using ::tm;
-}
-
-// version 3:
-struct tm { ... };
-namespace std {
-        struct tm { ... };
-}
-
- -

I think version 1 is intended.

- -

[Kona: The LWG agreed that the wording is not clear. It also -agreed that version 1 is intended, version 2 is not equivalent to -version 1, and version 3 is clearly not intended. The example below -was constructed by Nathan Myers to illustrate why version 2 is not -equivalent to version 1.

- -

Although not equivalent, the LWG is unsure if (2) is enough of -a problem to be prohibited. Points discussed in favor of allowing -(2):

- -
-
    -
  • It may be a convenience to implementors.
  • -
  • The only cases that fail are structs, of which the C library - contains only a few.
  • -
-
- -

]

- -

Example:

- -
- -
#include <time.h>
-#include <utility>
-
-int main() {
-    std::tm * t;
-    make_pair( t, t ); // okay with version 1 due to Koenig lookup
-                       // fails with version 2; make_pair not found
-    return 0;
-}
- -
- - -

Proposed resolution:

- -

Replace D.5 [depr.c.headers] paragraph 2 with:

- -
- -

Each C header, whose name has the form name.h, behaves as if each -name placed in the Standard library namespace by the corresponding -cname header is also placed within the namespace scope of the -namespace std by name.h and is followed by an explicit -using-declaration (_namespace.udecl_) in global scope.

- -
- - - -

Rationale:

-

The current wording in the standard is the result of a difficult -compromise that averted delay of the standard. Based on discussions -in Tokyo it is clear that there is no still no consensus on stricter -wording, so the issue has been closed. It is suggested that users not -write code that depends on Koenig lookup of C library functions.

- - - - -
-

145. adjustfield lacks default value

-

Section: 27.4.4.1 [basic.ios.cons] Status: NAD - Submitter: Angelika Langer Date: 1999-05-12

-

View all other issues in [basic.ios.cons].

-

View all issues with NAD status.

-

Discussion:

-

There is no initial value for the adjustfield defined, although -many people believe that the default adjustment were right. This is a -common misunderstanding. The standard only defines that, if no -adjustment is specified, all the predefined inserters must add fill -characters before the actual value, which is "as if" the -right flag were set. The flag itself need not be set.

- -

When you implement a user-defined inserter you cannot rely on right -being the default setting for the adjustfield. Instead, you must be -prepared to find none of the flags set and must keep in mind that in -this case you should make your inserter behave "as if" the -right flag were set. This is surprising to many people and complicates -matters more than necessary.

- -

Unless there is a good reason why the adjustfield should not be -initialized I would suggest to give it the default value that -everybody expects anyway.

- - - -

Rationale:

-

This is not a defect. It is deliberate that the default is no bits -set. Consider Arabic or Hebrew, for example. See 22.2.2.2.2 [facet.num.put.virtuals] paragraph 19, Table 61 - Fill padding.

- - - - -
-

149. Insert should return iterator to first element inserted

-

Section: 23.1.1 [sequence.reqmts] Status: NAD Future - Submitter: Andrew Koenig Date: 1999-06-28

-

View all other issues in [sequence.reqmts].

-

View all issues with NAD Future status.

-

Discussion:

-

Suppose that c and c1 are sequential containers and i is an -iterator that refers to an element of c. Then I can insert a copy of -c1's elements into c ahead of element i by executing

- -
- -
c.insert(i, c1.begin(), c1.end());
- -
- -

If c is a vector, it is fairly easy for me to find out where the -newly inserted elements are, even though i is now invalid:

- -
- -
size_t i_loc = i - c.begin();
-c.insert(i, c1.begin(), c1.end());
- -
- -

and now the first inserted element is at c.begin()+i_loc and one -past the last is at c.begin()+i_loc+c1.size().
-
-But what if c is a list? I can still find the location of one past the -last inserted element, because i is still valid. To find the location -of the first inserted element, though, I must execute something like

- -
- -
for (size_t n = c1.size(); n; --n)
-   --i;
- -
- -

because i is now no longer a random-access iterator.
-
-Alternatively, I might write something like

- -
- -
bool first = i == c.begin();
-list<T>::iterator j = i;
-if (!first) --j;
-c.insert(i, c1.begin(), c1.end());
-if (first)
-   j = c.begin();
-else
-   ++j;
- -
- -

which, although wretched, requires less overhead.
-
-But I think the right solution is to change the definition of insert -so that instead of returning void, it returns an iterator that refers -to the first element inserted, if any, and otherwise is a copy of its -first argument. 

- - -

Rationale:

-

The LWG believes this was an intentional design decision and so is -not a defect. It may be worth revisiting for the next standard.

- - - - -
-

157. Meaningless error handling for pword() and iword()

-

Section: 27.4.2.5 [ios.base.storage] Status: Dup - Submitter: Dietmar Kühl Date: 1999-07-20

-

View all other issues in [ios.base.storage].

-

View all issues with Dup status.

-

Duplicate of: 41

-

Discussion:

-

According to paragraphs 2 and 4 of 27.4.2.5 [ios.base.storage], the -functions iword() and pword() "set the -badbit (which might throw an exception)" on -failure. ... but what does it mean for ios_base to set the -badbit? The state facilities of the IOStream library are -defined in basic_ios, a derived class! It would be possible -to attempt a down cast but then it would be necessary to know the -character type used...

- - -

Rationale:

- - - - - -
-

162. Really "formatted input functions"?

-

Section: 27.6.1.2.3 [istream::extractors] Status: Dup - Submitter: Dietmar Kühl Date: 1999-07-20

-

View all other issues in [istream::extractors].

-

View all issues with Dup status.

-

Duplicate of: 60

-

Discussion:

-

It appears to be somewhat nonsensical to consider the functions -defined in the paragraphs 1 to 5 to be "Formatted input -function" but since these functions are defined in a section -labeled "Formatted input functions" it is unclear to me -whether these operators are considered formatted input functions which -have to conform to the "common requirements" from 27.6.1.2.1 -[istream.formatted.reqmts]: If this is the case, all manipulators, not -just -ws, would skip whitespace unless noskipws is set -(... but setting noskipws using the manipulator syntax would -also skip whitespace :-)

- -

See also issue 166 for the same problem in formatted -output

- - -

Rationale:

- - - - - -
-

163. Return of gcount() after a call to gcount

-

Section: 27.6.1.3 [istream.unformatted] Status: Dup - Submitter: Dietmar Kühl Date: 1999-07-20

-

View all other issues in [istream.unformatted].

-

View all issues with Dup status.

-

Duplicate of: 60

-

Discussion:

-

It is not clear which functions are to be considered unformatted -input functions. As written, it seems that all functions in 27.6.1.3 -[istream.unformatted] are unformatted input functions. However, it does -not -really make much sense to construct a sentry object for -gcount(), sync(), ... Also it is unclear what -happens to the gcount() if eg. gcount(), -putback(), unget(), or sync() is called: -These functions don't extract characters, some of them even -"unextract" a character. Should this still be reflected in -gcount()? Of course, it could be read as if after a call to -gcount() gcount() return 0 (the last -unformatted input function, gcount(), didn't extract any -character) and after a call to putback() gcount() -returns -1 (the last unformatted input function -putback() did "extract" back into the -stream). Correspondingly for unget(). Is this what is -intended? If so, this should be clarified. Otherwise, a corresponding -clarification should be used.

- - -

Rationale:

- - - - - -
-

166. Really "formatted output functions"?

-

Section: 27.6.2.6.3 [ostream.inserters] Status: Dup - Submitter: Dietmar Kühl Date: 1999-07-20

-

View all issues with Dup status.

-

Duplicate of: 60

-

Discussion:

-

From 27.6.2.6.1 [ostream.formatted.reqmts] it appears that all the functions -defined in 27.6.2.6.3 [ostream.inserters] have to construct a -sentry object. Is this really intended?

- -

This is basically the same problem as issue 162 but -for output instead of input.

- - -

Rationale:

- - - - - -
-

177. Complex operators cannot be explicitly instantiated

-

Section: 26.3.6 [complex.ops] Status: NAD - Submitter: Judy Ward Date: 1999-07-02

-

View all other issues in [complex.ops].

-

View all issues with NAD status.

-

Discussion:

-

A user who tries to explicitly instantiate a complex non-member operator will -get compilation errors. Below is a simplified example of the reason why. The -problem is that iterator_traits cannot be instantiated on a non-pointer type -like float, yet when the compiler is trying to decide which operator+ needs to -be instantiated it must instantiate the declaration to figure out the first -argument type of a reverse_iterator operator.

-
namespace std {
-template <class Iterator> 
-struct iterator_traits
-{
-    typedef typename Iterator::value_type value_type;
-};
-
-template <class T> class reverse_iterator;
-
-// reverse_iterator operator+
-template <class T> 
-reverse_iterator<T> operator+
-(typename iterator_traits<T>::difference_type, const reverse_iterator<T>&);
-
-template <class T> struct complex {};
-
-// complex operator +
-template <class T>
-complex<T> operator+ (const T& lhs, const complex<T>& rhs) 
-{ return complex<T>();} 
-}
-
-// request for explicit instantiation
-template std::complex<float> std::operator+<float>(const float&, 
-     const std::complex<float>&);
-

See also c++-stdlib reflector messages: lib-6814, 6815, 6816.

- - -

Rationale:

-

Implementors can make minor changes and the example will -work. Users are not affected in any case.

According to John -Spicer, It is possible to explicitly instantiate these operators using -different syntax: change "std::operator+<float>" to -"std::operator+".

- -

The proposed resolution of issue 120 is that users will not be able -to explicitly instantiate standard library templates. If that -resolution is accepted then library implementors will be the only ones -that will be affected by this problem, and they must use the indicated -syntax.

- - - - -
-

178. Should clog and cerr initially be tied to cout?

-

Section: 27.3.1 [narrow.stream.objects] Status: NAD - Submitter: Judy Ward Date: 1999-07-02

-

View all other issues in [narrow.stream.objects].

-

View all issues with NAD status.

-

Discussion:

-

-Section 27.3.1 says "After the object cerr is initialized, -cerr.flags() & unitbuf is nonzero. Its state is otherwise the same as -required for ios_base::init (lib.basic.ios.cons). It doesn't say -anything about the the state of clog. So this means that calling -cerr.tie() and clog.tie() should return 0 (see Table 89 for -ios_base::init effects). -

-

-Neither of the popular standard library implementations -that I tried does this, they both tie cerr and clog -to &cout. I would think that would be what users expect. -

- - -

Rationale:

-

The standard is clear as written.

-

27.3.1/5 says that "After the object cerr is initialized, cerr.flags() -& unitbuf is nonzero. Its state is otherwise the same as required for -ios_base::init (27.4.4.1)." Table 89 in 27.4.4.1, which gives the -postconditions of basic_ios::init(), says that tie() is 0. (Other issues correct -ios_base::init to basic_ios::init().)

- - - - -
-

180. Container member iterator arguments constness has unintended consequences

-

Section: 23 [containers] Status: NAD Future - Submitter: Dave Abrahams Date: 1999-07-01

-

View all other issues in [containers].

-

View all issues with NAD Future status.

-

Discussion:

-

It is the constness of the container which should control whether -it can be modified through a member function such as erase(), not the -constness of the iterators. The iterators only serve to give -positioning information.

- -

Here's a simple and typical example problem which is currently very -difficult or impossible to solve without the change proposed -below.

- -

Wrap a standard container C in a class W which allows clients to -find and read (but not modify) a subrange of (C.begin(), C.end()]. The -only modification clients are allowed to make to elements in this -subrange is to erase them from C through the use of a member function -of W.

- - -

Proposed resolution:

-

Change all non-const iterator parameters of standard library -container member functions to accept const_iterator parameters. -Note that this change applies to all library clauses, including -strings.

- -

For example, in 21.3.5.5 change:
-
-       iterator erase(iterator p);
-
-to:
-       iterator erase(const_iterator p); -

- - -

Rationale:

-

The issue was discussed at length. It was generally agreed that 1) -There is no major technical argument against the change (although -there is a minor argument that some obscure programs may break), and -2) Such a change would not break const correctness. The concerns about -making the change were 1) it is user detectable (although only in -boundary cases), 2) it changes a large number of signatures, and 3) it -seems more of a design issue that an out-and-out defect.

- -

The LWG believes that this issue should be considered as part of a -general review of const issues for the next revision of the -standard. Also see issue 200.

- - - - -
-

188. valarray helpers missing augmented assignment operators

-

Section: 26.5.2.6 [valarray.cassign] Status: NAD Future - Submitter: Gabriel Dos Reis Date: 1999-08-15

-

View all issues with NAD Future status.

-

Discussion:

-

26.5.2.6 defines augmented assignment operators -valarray<T>::op=(const T&), but fails to provide -corresponding versions for the helper classes. Thus making the -following illegal:

-
-
#include <valarray>
-
-int main()
-{
-std::valarray<double> v(3.14, 1999);
-
-v[99] *= 2.0; // Ok
-
-std::slice s(0, 50, 2);
-
-v[s] *= 2.0; // ERROR
-}
-
-

I can't understand the intent of that omission. It makes the -valarray library less intuitive and less useful.

- - -

Rationale:

-

Although perhaps an unfortunate -design decision, the omission is not a defect in the current -standard.  A future standard may wish to add the missing -operators.

- - - - -
-

190. min() and max() functions should be std::binary_functions

-

Section: 25.3.7 [alg.min.max] Status: NAD Future - Submitter: Mark Rintoul Date: 1999-08-26

-

View all other issues in [alg.min.max].

-

View all issues with NAD Future status.

-

Discussion:

-

Both std::min and std::max are defined as template functions. This -is very different than the definition of std::plus (and similar -structs) which are defined as function objects which inherit -std::binary_function.
-
- This lack of inheritance leaves std::min and std::max somewhat useless in standard library algorithms which require -a function object that inherits std::binary_function.

- - -

Rationale:

-

Although perhaps an unfortunate design decision, the omission is not a defect -in the current standard.  A future standard may wish to consider additional -function objects.

- - - - -
-

191. Unclear complexity for algorithms such as binary search

-

Section: 25.3.3 [alg.binary.search] Status: NAD - Submitter: Nico Josuttis Date: 1999-10-10

-

View all other issues in [alg.binary.search].

-

View all issues with NAD status.

-

Discussion:

-

The complexity of binary_search() is stated as "At most -log(last-first) + 2 comparisons", which seems to say that the -algorithm has logarithmic complexity. However, this algorithms is -defined for forward iterators. And for forward iterators, the need to -step element-by-element results into linear complexity. But such a -statement is missing in the standard. The same applies to -lower_bound(), upper_bound(), and equal_range(). 
-
-However, strictly speaking the standard contains no bug here. So this -might considered to be a clarification or improvement. -

- - -

Rationale:

-

The complexity is expressed in terms of comparisons, and that -complexity can be met even if the number of iterators accessed is -linear. Paragraph 1 already says exactly what happens to -iterators.

- - - - -
-

192. a.insert(p,t) is inefficient and overconstrained

-

Section: 23.1.2 [associative.reqmts] Status: NAD - Submitter: Ed Brey Date: 1999-06-06

-

View all other issues in [associative.reqmts].

-

View all issues with NAD status.

-

Duplicate of: 233

-

Discussion:

-

As defined in 23.1.2, paragraph 7 (table 69), a.insert(p,t) suffers from -several problems:

- - - - - - - - - - - - - -
expressionreturn typepre/post-conditioncomplexity
a.insert(p,t)iteratorinserts t if and only if there is no element with key equivalent to the key of - t in containers with unique keys; always inserts t in containers with equivalent - keys. always returns the iterator pointing to the element with key equivalent to - the key of t . iterator p is a hint pointing to where the insert should start to search.logarithmic in general, but amortized constant if t is inserted right after p .
-

1. For a container with unique keys, only logarithmic complexity is -guaranteed if no element is inserted, even though constant complexity is always -possible if p points to an element equivalent to t.

-

2. For a container with equivalent keys, the amortized constant complexity -guarantee is only useful if no key equivalent to t exists in the container. -Otherwise, the insertion could occur in one of multiple locations, at least one -of which would not be right after p.

-

3. By guaranteeing amortized constant complexity only when t is inserted -after p, it is impossible to guarantee constant complexity if t is inserted at -the beginning of the container. Such a problem would not exist if amortized -constant complexity was guaranteed if t is inserted before p, since there is -always some p immediately before which an insert can take place.

-

4. For a container with equivalent keys, p does not allow specification of -where to insert the element, but rather only acts as a hint for improving -performance. This negates the added functionality that p would provide if it -specified where within a sequence of equivalent keys the insertion should occur. -Specifying the insert location provides more control to the user, while -providing no disadvantage to the container implementation.

- - -

Proposed resolution:

-

In 23.1.2 [associative.reqmts] paragraph 7, replace the row in table 69 -for a.insert(p,t) with the following two rows:

- - - - - - - - - - - - - - - - - - - -
expressionreturn typepre/post-conditioncomplexity
a_uniq.insert(p,t)iteratorinserts t if and only if there is no element with key equivalent to the - key of t. returns the iterator pointing to the element with key equivalent - to the key of t.logarithmic in general, but amortized constant if t is inserted right - before p or p points to an element with key equivalent to t.
a_eq.insert(p,t)iteratorinserts t and returns the iterator pointing to the newly inserted - element. t is inserted right before p if doing so preserves the container - ordering.logarithmic in general, but amortized constant if t is inserted right - before p.
- - - -

Rationale:

-

Too big a change.  Furthermore, implementors report checking -both before p and after p, and don't want to change this behavior.

- - - - - -
-

194. rdbuf() functions poorly specified

-

Section: 27.4.4 [ios] Status: NAD - Submitter: Steve Clamage Date: 1999-09-07

-

View all issues with NAD status.

-

Discussion:

-

In classic iostreams, base class ios had an rdbuf function that returned a -pointer to the associated streambuf. Each derived class had its own rdbuf -function that returned a pointer of a type reflecting the actual type derived -from streambuf. Because in ARM C++, virtual function overrides had to have the -same return type, rdbuf could not be virtual.

-

In standard iostreams, we retain the non-virtual rdbuf function design, and -in addition have an overloaded rdbuf function that sets the buffer pointer. -There is no need for the second function to be virtual nor to be implemented in -derived classes.

-

Minor question: Was there a specific reason not to make the original rdbuf -function virtual?

-

Major problem: Friendly compilers warn about functions in derived classes -that hide base-class overloads. Any standard implementation of iostreams will -result in such a warning on each of the iostream classes, because of the -ill-considered decision to overload rdbuf only in a base class.

-

In addition, users of the second rdbuf function must use explicit -qualification or a cast to call it from derived classes. An explicit -qualification or cast to basic_ios would prevent access to any later overriding -version if there was one.

-

What I'd like to do in an implementation is add a using- declaration for the -second rdbuf function in each derived class. It would eliminate warnings about -hiding functions, and would enable access without using explicit qualification. -Such a change I don't think would change the behavior of any valid program, but -would allow invalid programs to compile:

-
-
 filebuf mybuf;
- fstream f;
- f.rdbuf(mybuf); // should be an error, no visible rdbuf
-
-

I'd like to suggest this problem as a defect, with the proposed resolution to -require the equivalent of a using-declaration for the rdbuf function that is not -replaced in a later derived class. We could discuss whether replacing the -function should be allowed.

- - -

Rationale:

-

For historical reasons, the standard is correct as written. There is a subtle difference between the base -class rdbuf() and derived class rdbuf(). The derived -class rdbuf() always returns the original streambuf, whereas the base class - rdbuf() will return the "current streambuf" if that has been changed by the variant you mention.

- -

Permission is not required to add such an extension. See -17.4.4.4 [member.functions].

- - - - -
-

196. Placement new example has alignment problems

-

Section: 18.5.1.3 [new.delete.placement] Status: Dup - Submitter: Herb Sutter Date: 1998-12-15

-

View all other issues in [new.delete.placement].

-

View all issues with Dup status.

-

Duplicate of: 114

-

Discussion:

-

The example in 18.5.1.3 [new.delete.placement] paragraph 4 reads:

- -
- -

[Example: This can be useful for constructing an object at a known address:
-
-   char place[sizeof(Something)];
-   Something* p = new (place) Something();
-
-
end example]

- -
- -

This example has potential alignment problems.

- - -

Rationale:

- - - - - -
-

197. max_size() underspecified

-

Section: 20.1.2 [allocator.requirements], 23.1 [container.requirements] Status: NAD - Submitter: Andy Sawyer Date: 1999-10-21

-

View other active issues in [allocator.requirements].

-

View all other issues in [allocator.requirements].

-

View all issues with NAD status.

-

Discussion:

-

Must the value returned by max_size() be unchanged from call to call?

- -

Must the value returned from max_size() be meaningful?

- -

Possible meanings identified in lib-6827:

- -

1) The largest container the implementation can support given "best -case" conditions - i.e. assume the run-time platform is "configured to -the max", and no overhead from the program itself. This may possibly -be determined at the point the library is written, but certainly no -later than compile time.
-
-2) The largest container the program could create, given "best case" -conditions - i.e. same platform assumptions as (1), but take into -account any overhead for executing the program itself. (or, roughly -"storage=storage-sizeof(program)"). This does NOT include any resource -allocated by the program. This may (or may not) be determinable at -compile time.
-
-3) The largest container the current execution of the program could -create, given knowledge of the actual run-time platform, but again, -not taking into account any currently allocated resource. This is -probably best determined at program start-up.
-
-4) The largest container the current execution program could create at -the point max_size() is called (or more correctly at the point -max_size() returns :-), given it's current environment (i.e. taking -into account the actual currently available resources). This, -obviously, has to be determined dynamically each time max_size() is -called.

- - -

Proposed resolution:

- - -

Rationale:

-

max_size() isn't useful for very many things, and the existing - wording is sufficiently clear for the few cases that max_size() can - be used for. None of the attempts to change the existing wording - were an improvement.

- -

It is clear to the LWG that the value returned by max_size() can't - change from call to call.

- - - - - - -
-

203. basic_istream::sentry::sentry() is uninstantiable with ctype<user-defined type>

-

Section: 27.6.1.1.3 [istream::sentry] Status: NAD - Submitter: Matt McClure and Dietmar Kühl Date: 2000-01-01

-

View all other issues in [istream::sentry].

-

View all issues with NAD status.

-

Discussion:

-

27.6.1.1.2 Paragraph 4 states:

-
-

To decide if the character c is a whitespace character, the constructor - performs ''as if'' it executes the following code fragment: 

-
const ctype<charT>& ctype = use_facet<ctype<charT> >(is.getloc());
-if (ctype.is(ctype.space,c)!=0)
-// c is a whitespace character.
-
- -

But Table 51 in 22.1.1.1.1 only requires an implementation to -provide specializations for ctype<char> and -ctype<wchar_t>. If sentry's constructor is implemented using -ctype, it will be uninstantiable for a user-defined character type -charT, unless the implementation has provided non-working (since it -would be impossible to define a correct ctype<charT> specialization -for an arbitrary charT) definitions of ctype's virtual member -functions.

- -

-It seems the intent the standard is that sentry should behave, in -every respect, not just during execution, as if it were implemented -using ctype, with the burden of providing a ctype specialization -falling on the user. But as it is written, nothing requires the -translation of sentry's constructor to behave as if it used the above -code, and it would seem therefore, that sentry's constructor should be -instantiable for all character types. -

- -

-Note: If I have misinterpreted the intent of the standard with -respect to sentry's constructor's instantiability, then a note should -be added to the following effect: -

- -

-An implementation is forbidden from using the above code if it renders -the constructor uninstantiable for an otherwise valid character -type. -

- -

In any event, some clarification is needed.

- - - -

Rationale:

-

It is possible but not easy to instantiate on types other than char -or wchar_t; many things have to be done first. That is by intention -and is not a defect.

- - - - -
-

204. distance(first, last) when "last" is before "first"

-

Section: 24.3.4 [iterator.operations] Status: NAD - Submitter: Rintala Matti Date: 2000-01-28

-

View all issues with NAD status.

-

Discussion:

-

Section 24.3.4 describes the function distance(first, last) (where first and -last are iterators) which calculates "the number of increments or -decrements needed to get from 'first' to 'last'".

-

The function should work for forward, bidirectional and random access -iterators, and there is a requirement 24.3.4.5 which states that "'last' -must be reachable from 'first'".

-

With random access iterators the function is easy to implement as "last -- first".

-

With forward iterators it's clear that 'first' must point to a place before -'last', because otherwise 'last' would not be reachable from 'first'.

-

But what about bidirectional iterators? There 'last' is reachable from -'first' with the -- operator even if 'last' points to an earlier position than -'first'. However, I cannot see how the distance() function could be implemented -if the implementation does not know which of the iterators points to an earlier -position (you cannot use ++ or -- on either iterator if you don't know which -direction is the "safe way to travel").

-

The paragraph 24.3.4.1 states that "for ... bidirectional iterators they -use ++ to provide linear time implementations". However, the ++ operator is -not mentioned in the reachability requirement. Furthermore 24.3.4.4 explicitly -mentions that distance() returns the number of increments _or decrements_, -suggesting that it could return a negative number also for bidirectional -iterators when 'last' points to a position before 'first'.

-

Is a further requirement is needed to state that for forward and -bidirectional iterators "'last' must be reachable from 'first' using the ++ -operator". Maybe this requirement might also apply to random access -iterators so that distance() would work the same way for every iterator -category?

- - -

Rationale:

-

"Reachable" is defined in the standard in 24.1 [iterator.requirements] paragraph 6. -The definition is only in terms of operator++(). The LWG sees no defect in -the standard.

- - - - -
-

205. numeric_limits unclear on how to determine floating point types

-

Section: 18.2.1.2 [numeric.limits.members] Status: NAD - Submitter: Steve Cleary Date: 2000-01-28

-

View all other issues in [numeric.limits.members].

-

View all issues with NAD status.

-

Discussion:

-

In several places in 18.2.1.2 [numeric.limits.members], a member is -described as "Meaningful for all floating point types." -However, no clear method of determining a floating point type is -provided.

- -

In 18.2.1.5 [numeric.special], paragraph 1 states ". . . (for -example, epsilon() is only meaningful if is_integer is -false). . ." which suggests that a type is a floating point type -if is_specialized is true and is_integer is false; however, this is -unclear.

- -

When clarifying this, please keep in mind this need of users: what -exactly is the definition of floating point? Would a fixed point or -rational representation be considered one? I guess my statement here -is that there could also be types that are neither integer or -(strictly) floating point.

- - -

Rationale:

-

It is up to the implementor of a user define type to decide if it is a -floating point type.

- - - - -
-

207. ctype<char> members return clause incomplete

-

Section: 22.2.1.3.2 [facet.ctype.char.members] Status: Dup - Submitter: Robert Klarer Date: 1999-11-02

-

View all other issues in [facet.ctype.char.members].

-

View all issues with Dup status.

-

Duplicate of: 153

-

Discussion:

-

-The widen and narrow member functions are described -in 22.2.1.3.2, paragraphs 9-11. In each case we have two overloaded -signatures followed by a Returns clause. The Returns -clause only describes one of the overloads. -

- - -

Proposed resolution:

-

Change the returns clause in 22.2.1.3.2 [facet.ctype.char.members] -paragraph 10 from:

-

    Returns: do_widen(low, high, to).

- -

to:

-

    Returns: do_widen(c) or do_widen(low, high, to), -respectively.

- -

Change the returns clause in 22.2.1.3.2 [facet.ctype.char.members] paragraph 11 -from:

-

    Returns: do_narrow(low, high, to).

- -

to:

-

    Returns: do_narrow(c) or do_narrow(low, high, to), -respectively.

- - -

Rationale:

-

Subsumed by issue 153, which addresses the same -paragraphs.

- - - - - - -
-

213. Math function overloads ambiguous

-

Section: 26.7 [c.math] Status: NAD - Submitter: Nico Josuttis Date: 2000-02-26

-

View other active issues in [c.math].

-

View all other issues in [c.math].

-

View all issues with NAD status.

-

Discussion:

-

Due to the additional overloaded versions of numeric functions for -float and long double according to Section 26.5, calls such as int x; -std::pow (x, 4) are ambiguous now in a standard conforming -implementation. Current implementations solve this problem very -different (overload for all types, don't overload for float and long -double, use preprocessor, follow the standard and get -ambiguities).

This behavior should be standardized or at least -identified as implementation defined.

- - -

Rationale:

-

These math issues are an -understood and accepted consequence of the design. They have -been discussed several times in the past. Users must write casts -or write floating point expressions as arguments.

- - - - -
-

215. Can a map's key_type be const?

-

Section: 23.1.2 [associative.reqmts] Status: NAD - Submitter: Judy Ward Date: 2000-02-29

-

View all other issues in [associative.reqmts].

-

View all issues with NAD status.

-

Discussion:

-

A user noticed that this doesn't compile with the Rogue Wave library because -the rb_tree class declares a key_allocator, and allocator<const int> is -not legal, I think:

-
-
map < const int, ... > // legal?
-
-

which made me wonder whether it is legal for a map's key_type to be const. In -email from Matt Austern he said:

-
-

I'm not sure whether it's legal to declare a map with a const key type. I -hadn't thought about that question until a couple weeks ago. My intuitive -feeling is that it ought not to be allowed, and that the standard ought to say -so. It does turn out to work in SGI's library, though, and someone in the -compiler group even used it. Perhaps this deserves to be written up as an issue -too.

-
- - -

Rationale:

-

The "key is assignable" requirement from table 69 in -23.1.2 [associative.reqmts] already implies the key cannot be const.

- - - - -
-

216. setbase manipulator description flawed

-

Section: 27.6.3 [std.manip] Status: Dup - Submitter: Hyman Rosen Date: 2000-02-29

-

View all other issues in [std.manip].

-

View all issues with Dup status.

-

Duplicate of: 193

-

Discussion:

-

27.6.3 [std.manip] paragraph 5 says:

-
-
smanip setbase(int base);
-

Returns: An object s of unspecified type such that if out is an -(instance of) basic_ostream then the expression out<<s behaves -as if f(s) were called, in is an (instance of) basic_istream then the -expression in>>s behaves as if f(s) were called. Where f can be -defined as:

-
ios_base& f(ios_base& str, int base)
-{
-  // set basefield
-  str.setf(n == 8 ? ios_base::oct :
-                n == 10 ? ios_base::dec :
-                n == 16 ? ios_base::hex :
-                  ios_base::fmtflags(0), ios_base::basefield);
-  return str;
-}
-
-

There are two problems here. First, f takes two parameters, so the -description needs to say that out<<s and in>>s behave as if f(s,base) -had been called. Second, f is has a parameter named base, but is written as if -the parameter was named n.

-

Actually, there's a third problem. The paragraph has grammatical errors. -There needs to be an "and" after the first comma, and the "Where -f" sentence fragment needs to be merged into its preceding sentence. You -may also want to format the function a little better. The formatting above is -more-or-less what the Standard contains.

- - -

Rationale:

-

The resolution of this defect is subsumed by the proposed resolution for -issue 193.

- -

[Tokyo: The LWG agrees that this is a defect and notes that it -occurs additional places in the section, all requiring fixes.]

- - - - - - - - -
-

218. Algorithms do not use binary predicate objects for default comparisons

-

Section: 25.3 [alg.sorting] Status: NAD - Submitter: Pablo Halpern Date: 2000-03-06

-

View all other issues in [alg.sorting].

-

View all issues with NAD status.

-

Discussion:

-

Many of the algorithms take an argument, pred, of template parameter type -BinaryPredicate or an argument comp of template parameter type Compare. These -algorithms usually have an overloaded version that does not take the predicate -argument. In these cases pred is usually replaced by the use of operator== and -comp is replaced by the use of operator<.

-

This use of hard-coded operators is inconsistent with other parts of the -library, particularly the containers library, where equality is established -using equal_to<> and ordering is established using less<>. Worse, -the use of operator<, would cause the following innocent-looking code to have -undefined behavior:

-
-
vector<string*> vec;
-sort(vec.begin(), vec.end());
-
-

The use of operator< is not defined for pointers to unrelated objects. If -std::sort used less<> to compare elements, then the above code would be -well-defined, since less<> is explicitly specialized to produce a total -ordering of pointers.

- - -

Rationale:

-

This use of operator== and operator< was a very deliberate, conscious, and -explicitly made design decision; these operators are often more efficient. The -predicate forms are available for users who don't want to rely on operator== and -operator<.

- - - - -
-

219. find algorithm missing version that takes a binary predicate argument

-

Section: 25.1.2 [alg.find] Status: NAD Future - Submitter: Pablo Halpern Date: 2000-03-06

-

View all other issues in [alg.find].

-

View all issues with NAD Future status.

-

Discussion:

-

The find function always searches for a value using operator== to compare the -value argument to each element in the input iterator range. This is inconsistent -with other find-related functions such as find_end and find_first_of, which -allow the caller to specify a binary predicate object to be used for determining -equality. The fact that this can be accomplished using a combination of find_if -and bind_1st or bind_2nd does not negate the desirability of a consistent, -simple, alternative interface to find.

- - -

Proposed resolution:

-
-

In section 25.1.2 [alg.find], add a second prototype for find -(between the existing prototype and the prototype for find_if), as -follows:

-
    template<class InputIterator, class T, class BinaryPredicate>
-      InputIterator find(InputIterator first, InputIterator last,
-                         const T& value, BinaryPredicate bin_pred);
-

Change the description of the return from:

-
-

Returns: The first iterator i in the range [first, last) for which the following corresponding - conditions hold: *i == value, pred(*i) != false. Returns last if no such iterator is found.

-
-

 to:

-
-

Returns: The first iterator i in the range [first, last) for which the following  - corresponding condition holds: *i == value, bin_pred(*i,value) != false, pred(*) - != false. Return last if no such iterator is found.

-
-
- - -

Rationale:

-

This is request for a pure extension, so it is not a defect in the -current standard.  As the submitter pointed out, "this can -be accomplished using a combination of find_if and bind_1st or -bind_2nd".

- - - - -
-

236. ctype<char>::is() member modifies facet

-

Section: 22.2.1.3.2 [facet.ctype.char.members] Status: Dup - Submitter: Dietmar Kühl Date: 2000-04-24

-

View all other issues in [facet.ctype.char.members].

-

View all issues with Dup status.

-

Duplicate of: 28

-

Discussion:

-

The description of the is() member in paragraph 4 of 22.2.1.3.2 [facet.ctype.char.members] is broken: According to this description, the -second form of the is() method modifies the masks in the -ctype object. The correct semantics if, of course, to obtain -an array of masks. The corresponding method in the general case, -ie. the do_is() method as described in 22.2.1.1.2 [locale.ctype.virtuals] paragraph 1 does the right thing.

- - -

Proposed resolution:

-

Change paragraph 4 from

-

- The second form, for all *p in the range [low, high), assigns - vec[p-low] to table()[(unsigned char)*p]. -

-

to become

-

- The second form, for all *p in the range [low, high), assigns - table()[(unsigned char)*p] to vec[p-low]. -

- - -

Rationale:

- - - - - -
-

244. Must find's third argument be CopyConstructible?

-

Section: 25.1.2 [alg.find] Status: NAD - Submitter: Andrew Koenig Date: 2000-05-02

-

View all other issues in [alg.find].

-

View all issues with NAD status.

-

Discussion:

-

Is the following implementation of find acceptable?

- -
        template<class Iter, class X>
-        Iter find(Iter begin, Iter end, const X& x)
-        {
-            X x1 = x;           // this is the crucial statement
-            while (begin != end && *begin != x1)
-                ++begin;
-            return begin;
-        }
-
- -

If the answer is yes, then it is implementation-dependent as to -whether the following fragment is well formed:

- -
        vector<string> v;
-
-        find(v.begin(), v.end(), "foo");
-
- -

At issue is whether there is a requirement that the third argument -of find be CopyConstructible. There may be no problem here, but -analysis is necessary.

- - -

Rationale:

-

There is no indication in the standard that find's third argument -is required to be Copy Constructible. The LWG believes that no such -requirement was intended. As noted above, there are times when a user -might reasonably pass an argument that is not Copy Constructible.

- - - - -
-

245. Which operations on istream_iterator trigger input operations?

-

Section: 24.5.1 [istream.iterator] Status: NAD - Submitter: Andrew Koenig Date: 2000-05-02

-

View all issues with NAD status.

-

Discussion:

-

I do not think the standard specifies what operation(s) on istream -iterators trigger input operations. So, for example:

- -
        istream_iterator<int> i(cin);
-
-        int n = *i++;
-
- -

I do not think it is specified how many integers have been read -from cin. The number must be at least 1, of course, but can it be 2? -More?

- - -

Rationale:

-

The standard is clear as written: the stream is read every time -operator++ is called, and it is also read either when the iterator is -constructed or when operator* is called for the first time. In the -example above, exactly two integers are read from cin.

- -

There may be a problem with the interaction between istream_iterator -and some STL algorithms, such as find. There are no guarantees about -how many times find may invoke operator++.

- - - - -
-

246. a.insert(p,t) is incorrectly specified

-

Section: 23.1.2 [associative.reqmts] Status: Dup - Submitter: Mark Rodgers Date: 2000-05-19

-

View all other issues in [associative.reqmts].

-

View all issues with Dup status.

-

Duplicate of: 233

-

Discussion:

-

Closed issue 192 raised several problems with the specification of -this function, but was rejected as Not A Defect because it was too big -a change with unacceptable impacts on existing implementations. -However, issues remain that could be addressed with a smaller change -and with little or no consequent impact.

- -
    -
  1. The specification is inconsistent with the original - proposal and with several implementations.

    - -

    The initial implementation by Hewlett Packard only ever looked - immediately before p, and I do not believe there was any - intention to standardize anything other than this behavior. - Consequently, current implementations by several leading - implementors also look immediately before p, and will only insert - after p in logarithmic time. I am only aware of one implementation - that does actually look after p, and it looks before p as well. It - is therefore doubtful that existing code would be relying on the - behavior defined in the standard, and it would seem that fixing - this defect as proposed below would standardize existing - practice.

  2. - -
  3. - The specification is inconsistent with insertion for sequence - containers.

    - -

    This is difficult and confusing to teach to newcomers. All - insert operations that specify an iterator as an insertion location - should have a consistent meaning for the location represented by - that iterator.

  4. - -
  5. As specified, there is no way to hint that the insertion - should occur at the beginning of the container, and the way to hint - that it should occur at the end is long winded and unnatural.

    - -

    For a container containing n elements, there are n+1 possible - insertion locations and n+1 valid iterators. For there to be a - one-to-one mapping between iterators and insertion locations, the - iterator must represent an insertion location immediately before - the iterator.

  6. - -
  7. When appending sorted ranges using insert_iterators, - insertions are guaranteed to be sub-optimal.

    - -

    In such a situation, the optimum location for insertion is - always immediately after the element previously inserted. The - mechanics of the insert iterator guarantee that it will try and - insert after the element after that, which will never be correct. - However, if the container first tried to insert before the hint, - all insertions would be performed in amortized constant - time.

  8. -
- - -

Proposed resolution:

-

In 23.1.2 [lib.associative.reqmts] paragraph 7, table 69, make -the following changes in the row for a.insert(p,t):

- -

assertion/note pre/post condition: -
Change the last sentence from

-

- "iterator p is a hint pointing to where the insert should - start to search." -

-

to

-

- "iterator p is a hint indicating that immediately before p - may be a correct location where the insertion could occur." -

- -

complexity:
-Change the words "right after" to "immediately before".

- - -

Rationale:

- - - - - -
-

249. Return Type of auto_ptr::operator=

-

Section: D.9.1 [auto.ptr] Status: NAD - Submitter: Joseph Gottman Date: 2000-06-30

-

View all other issues in [auto.ptr].

-

View all issues with NAD status.

-

Discussion:

-

According to section 20.4.5, the function -auto_ptr::operator=() returns a reference to an auto_ptr. -The reason that operator=() usually returns a reference is to -facilitate code like

- -
    int x,y,z;
-    x = y = z = 1;
-
- -

However, given analogous code for auto_ptrs,

-
    auto_ptr<int> x, y, z;
-    z.reset(new int(1));
-    x = y = z;
-
- -

the result would be that z and y would both be set to -NULL, instead of all the auto_ptrs being set to the same value. -This makes such cascading assignments useless and counterintuitive for -auto_ptrs.

- - -

Proposed resolution:

-

Change auto_ptr::operator=() to return void instead -of an auto_ptr reference.

- - -

Rationale:

-

The return value has uses other than cascaded assignments: a user can -call an auto_ptr member function, pass the auto_ptr to a -function, etc. Removing the return value could break working user -code.

- - - - -
-

257. STL functional object and iterator inheritance.

-

Section: 20.5.3 [base], 24.3.2 [iterator.basic] Status: NAD - Submitter: Robert Dick Date: 2000-08-17

-

View all other issues in [base].

-

View all issues with NAD status.

-

Discussion:

-

-According to the November 1997 Draft Standard, the results of deleting an -object of a derived class through a pointer to an object of its base class are -undefined if the base class has a non-virtual destructor. Therefore, it is -potentially dangerous to publicly inherit from such base classes. -

- -

Defect: -
-The STL design encourages users to publicly inherit from a number of classes -which do nothing but specify interfaces, and which contain non-virtual -destructors. -

- -

Attribution: -
-Wil Evers and William E. Kempf suggested this modification for functional -objects. -

- - -

Proposed resolution:

-

-When a base class in the standard library is useful only as an interface -specifier, i.e., when an object of the class will never be directly -instantiated, specify that the class contains a protected destructor. This -will prevent deletion through a pointer to the base class without performance, -or space penalties (on any implementation I'm aware of). -

- -

-As an example, replace... -

- -
    template <class Arg, class Result>
-    struct unary_function {
-            typedef Arg    argument_type;
-            typedef Result result_type;
-    };
-
- -

-... with... -

- -
    template <class Arg, class Result>
-    struct unary_function {
-            typedef Arg    argument_type;
-            typedef Result result_type;
-    protected:
-            ~unary_function() {}
-    };
-
- -

-Affected definitions: -
-  20.3.1 [lib.function.objects] -- unary_function, binary_function -
-  24.3.2 [lib.iterator.basic] -- iterator -

- - -

Rationale:

-

-The standard is clear as written; this is a request for change, not a -defect in the strict sense. The LWG had several different objections -to the proposed change. One is that it would prevent users from -creating objects of type unary_function and -binary_function. Doing so can sometimes be legitimate, if users -want to pass temporaries as traits or tag types in generic code. -

- - - - - -
-

267. interaction of strstreambuf::overflow() and seekoff()

-

Section: D.7.1.3 [depr.strstreambuf.virtuals] Status: NAD - Submitter: Martin Sebor Date: 2000-10-05

-

View all other issues in [depr.strstreambuf.virtuals].

-

View all issues with NAD status.

-

Discussion:

-

-It appears that the interaction of the strstreambuf members overflow() -and seekoff() can lead to undefined behavior in cases where defined -behavior could reasonably be expected. The following program -demonstrates this behavior: -

- -
    #include <strstream>
-
-    int main ()
-    {
-         std::strstreambuf sb;
-         sb.sputc ('c');
-
-         sb.pubseekoff (-1, std::ios::end, std::ios::in);
-         return !('c' == sb.sgetc ());
-    }
-
- -

-D.7.1.1, p1 initializes strstreambuf with a call to basic_streambuf<>(), -which in turn sets all pointers to 0 in 27.5.2.1, p1. -

- -

-27.5.2.2.5, p1 says that basic_streambuf<>::sputc(c) calls -overflow(traits::to_int_type(c)) if a write position isn't available (it -isn't due to the above). -

- -

-D.7.1.3, p3 says that strstreambuf::overflow(off, ..., ios::in) makes at -least one write position available (i.e., it allows the function to make -any positive number of write positions available). -

- -

-D.7.1.3, p13 computes newoff = seekhigh - eback(). In D.7.1, p4 we see -seekhigh = epptr() ? epptr() : egptr(), or seekhigh = epptr() in this -case. newoff is then epptr() - eback(). -

- -

-D.7.1.4, p14 sets gptr() so that gptr() == eback() + newoff + off, or -gptr() == epptr() + off holds. -

- -

-If strstreambuf::overflow() made exactly one write position available -then gptr() will be set to just before epptr(), and the program will -return 0. Buf if the function made more than one write position -available, epptr() and gptr() will both point past pptr() and the -behavior of the program is undefined. -

- - -

Proposed resolution:

- - -

Change the last sentence of D.7.1 [depr.strstreambuf] paragraph 4 from

- -

- Otherwise, seeklow equals gbeg and seekhigh is either pend, if - pend is not a null pointer, or gend. -

- -

to become

- -

- Otherwise, seeklow equals gbeg and seekhigh is either gend if - 0 == pptr(), or pbase() + max where max is the maximum value of - pptr() - pbase() ever reached for this stream. -

- -

[ - pre-Copenhagen: Dietmar provided wording for proposed resolution. -]

- - -

[ - post-Copenhagen: Fixed a typo: proposed resolution said to fix - 4.7.1, not D.7.1. -]

- - - - -

Rationale:

-

This is related to issue 65: it's not clear what it -means to seek beyond the current area. Without resolving issue 65 we can't resolve this. As with issue 65, -the library working group does not wish to invest time nailing down -corner cases in a deprecated feature.

- - - - - -
-

269. cstdarg and unnamed parameters

-

Section: 18.7 [support.exception] Status: NAD - Submitter: J. Stephen Adamczyk Date: 2000-10-10

-

View all other issues in [support.exception].

-

View all issues with NAD status.

-

Discussion:

-

-One of our customers asks whether this is valid C++: -

- -
   #include <cstdarg>
-
-   void bar(const char *, va_list);
-
-   void
-   foo(const char *file, const char *, ...)
-   {
-     va_list ap;
-     va_start(ap, file);
-     bar(file, ap);
-     va_end(ap);
-   }
-
- -

-The issue being whether it is valid to use cstdarg when the final -parameter before the "..." is unnamed. cstdarg is, as far -as I can tell, inherited verbatim from the C standard. and the -definition there (7.8.1.1 in the ISO C89 standard) refers to "the -identifier of the rightmost parameter". What happens when there -is no such identifier? -

- -

-My personal opinion is that this should be allowed, but some tweak -might be required in the C++ standard. -

- - -

Rationale:

-

-Not a defect, the C and C++ standards are clear. It is impossible to -use varargs if the parameter immediately before "..." has no -name, because that is the parameter that must be passed to va_start. -The example given above is broken, because va_start is being passed -the wrong parameter. -

- -

-There is no support for extending varargs to provide additional -functionality beyond what's currently there. For reasons of C/C++ -compatibility, it is especially important not to make gratuitous -changes in this part of the C++ standard. The C committee has already -been requested not to touch this part of the C standard unless -necessary. -

- - - - -
-

277. Normative encouragement in allocator requirements unclear

-

Section: 20.1.2 [allocator.requirements] Status: NAD - Submitter: Matt Austern Date: 2000-11-07

-

View other active issues in [allocator.requirements].

-

View all other issues in [allocator.requirements].

-

View all issues with NAD status.

-

Discussion:

-

-In 20.1.5, paragraph 5, the standard says that "Implementors are -encouraged to supply libraries that can accept allocators that -encapsulate more general memory models and that support non-equal -instances." This is intended as normative encouragement to -standard library implementors. However, it is possible to interpret -this sentence as applying to nonstandard third-party libraries. -

- - -

Proposed resolution:

-

-In 20.1.5, paragraph 5, change "Implementors" to -"Implementors of the library described in this International -Standard". -

- - -

Rationale:

-

The LWG believes the normative encouragement is already -sufficiently clear, and that there are no important consequences -even if it is misunderstood.

- - - - - -
-

279. const and non-const iterators should have equivalent typedefs

-

Section: 23.1 [container.requirements] Status: NAD - Submitter: Steve Cleary Date: 2000-11-27

-

View other active issues in [container.requirements].

-

View all other issues in [container.requirements].

-

View all issues with NAD status.

-

Discussion:

- -

-This came from an email from Steve Cleary to Fergus in reference to -issue 179. The library working group briefly discussed -this in Toronto and believes it should be a separate issue. -

- -

-Steve said: "We may want to state that the const/non-const iterators must have -the same difference type, size_type, and category." -

- -

-(Comment from Judy) -I'm not sure if the above sentence should be true for all -const and non-const iterators in a particular container, or if it means -the container's iterator can't be compared with the container's -const_iterator unless the above it true. I suspect the former. -

- - -

Proposed resolution:

-

-In Section: 23.1 [container.requirements], -table 65, in the assertion/note pre/post condition for X::const_iterator, -add the following: -

- -
-

-typeid(X::const_iterator::difference_type) == typeid(X::iterator::difference_type) -

- -

-typeid(X::const_iterator::size_type) == typeid(X::iterator::size_type) -

- -

-typeid(X::const_iterator::category) == typeid(X::iterator::category) -

-
- - -

Rationale:

-

Going through the types one by one: Iterators don't have a -size_type. We already know that the difference types are -identical, because the container requirements already say that the -difference types of both X::iterator and X::const_iterator are both -X::difference_type. The standard does not require that X::iterator -and X::const_iterator have the same iterator category, but the LWG -does not see this as a defect: it's possible to imagine cases in which -it would be useful for the categories to be different.

- -

It may be desirable to require X::iterator and X::const_iterator to -have the same value type, but that is a new issue. (Issue 322.)

- - - - - - -
-

287. conflicting ios_base fmtflags

-

Section: 27.4.2.2 [fmtflags.state] Status: NAD - Submitter: Judy Ward Date: 2000-12-30

-

View all other issues in [fmtflags.state].

-

View all issues with NAD status.

-

Discussion:

-

-The Effects clause for ios_base::setf(fmtflags fmtfl) says -"Sets fmtfl in flags()". What happens if the user first calls -ios_base::scientific and then calls ios_base::fixed or vice-versa? -This is an issue for all of the conflicting flags, i.e. ios_base::left -and ios_base::right or ios_base::dec, ios_base::hex and ios_base::oct. -

- -

-I see three possible solutions: -

- -
    -
  1. Set ios_base::failbit whenever the user specifies a conflicting -flag with one previously explicitly set. If the constructor is -supposed to set ios_base::dec (see discussion below), then -the user setting hex or oct format after construction will not -set failbit.
  2. -
  3. The last call to setf "wins", i.e. it clears any conflicting -previous setting.
  4. -
  5. All the flags that the user specifies are set, but when actually -interpreting them, fixed always override scientific, right always -overrides left, dec overrides hex which overrides oct.
  6. -
- -

-Most existing implementations that I tried seem to conform to resolution #3, -except that when using the iomanip manipulator hex or oct then that always -overrides dec, but calling setf(ios_base::hex) doesn't. -

- -

-There is a sort of related issue, which is that although the ios_base -constructor says that each ios_base member has an indeterminate value -after construction, all the existing implementations I tried explicitly set -ios_base::dec. -

- - -

Proposed resolution:

- - -

Rationale:

-

-adjustfield, basefield, and floatfield -are each multi-bit fields. It is possible to set multiple bits within -each of those fields. (For example, dec and -oct). These fields are used by locale facets. The LWG -reviewed the way in which each of those three fields is used, and -believes that in each case the behavior is well defined for any -possible combination of bits. See for example Table 58, in 22.2.2.2.2 -[facet.num.put.virtuals], noting the requirement in paragraph 6 of that -section. -

-

-Users are advised to use manipulators, or else use the two-argument -version of setf, to avoid unexpected behavior. -

- - - - - -
-

289. <cmath> requirements missing C float and long double versions

-

Section: 26.7 [c.math] Status: NAD - Submitter: Judy Ward Date: 2000-12-30

-

View other active issues in [c.math].

-

View all other issues in [c.math].

-

View all issues with NAD status.

-

Discussion:

-

- In ISO/IEC 9899:1990 Programming Languages C we find the following - concerning <math.h>: -

- -

- 7.13.4 Mathematics <math.h> -
- The names of all existing functions declared in the <math.h> - header, suffixed with f or l, are reserved respectively for - corresponding functions with float and long double arguments - are return values. -

- -

- For example, float sinf(float) - is reserved. -

- -

- In the C99 standard, <math.h> must contain declarations - for these functions. -

- -

-So, is it acceptable for an implementor to add these prototypes to the -C++ versions of the math headers? Are they required? -

- - -

Proposed resolution:

-

-Add these Functions to Table 80, section 26.5 and to Table 99, -section C.2: -

- -
    acosf asinf atanf atan2f ceilf cosf coshf 
-    expf fabsf floorf fmodf frexpf ldexpf 
-    logf log10f modff powf sinf sinhf sqrtf 
-    tanf tanhf 
-    acosl asinl atanl atan2l ceill cosl coshl 
-    expl fabsl floorl fmodl frexpl ldexpl 
-    logl log10l modfl powl sinl sinhl sqrtl 
-    tanl tanhl
-
- -

-There should probably be a note saying that these functions -are optional and, if supplied, should match the description in -the 1999 version of the C standard. In the next round -of C++ standardization they can then become mandatory. -

- - -

Rationale:

-

The C90 standard, as amended, already permits (but does not -require) these functions, and the C++ standard incorporates the -C90 standard by reference. C99 is not an issue, because it is -never referred to by the C++ standard.

- - - - - -
-

293. Order of execution in transform algorithm

-

Section: 25.2.4 [alg.transform] Status: NAD - Submitter: Angelika Langer Date: 2001-01-04

-

View all other issues in [alg.transform].

-

View all issues with NAD status.

-

Discussion:

-

This issue is related to issue 242. In case that the resolution -proposed for issue 242 is accepted, we have have the following -situation: The 4 numeric algorithms (accumulate and consorts) as well -as transform would allow a certain category of side effects. The -numeric algorithms specify that they invoke the functor "for -every iterator i in the range [first, last) in order". transform, -in contrast, would not give any guarantee regarding order of -invocation of the functor, which means that the functor can be invoked -in any arbitrary order. -

- -

Why would that be a problem? Consider an example: say the -transformator that is a simple enumerator ( or more generally -speaking, "is order-sensitive" ). Since a standard -compliant implementation of transform is free to invoke the enumerator -in no definite order, the result could be a garbled enumeration. -Strictly speaking this is not a problem, but it is certainly at odds -with the prevalent understanding of transform as an algorithms that -assigns "a new _corresponding_ value" to the output -elements. -

- -

All implementations that I know of invoke the transformator in -definite order, namely starting from first and proceeding to last - -1. Unless there is an optimization conceivable that takes advantage of -the indefinite order I would suggest to specify the order, because it -eliminate the uncertainty that users would otherwise have regarding -the order of execution of their potentially order-sensitive function -objects. -

- - -

Proposed resolution:

-

In section 25.2.3 - Transform [lib.alg.transform] change:

-

--1- Effects: Assigns through every iterator i in the range [result, -result + (last1 - first1)) a new corresponding -value equal to op(*(first1 + (i - result)) or binary_op(*(first1 + -(i - result), *(first2 + (i - result))). -

-

to:

-

--1- Effects: Computes values by invoking the operation op or binary_op -for every iterator in the range [first1, last1) in order. Assigns through -every iterator i in the range [result, result + (last1 - first1)) a new -corresponding -value equal to op(*(first1 + (i - result)) or binary_op(*(first1 + -(i - result), *(first2 + (i - result))). -

- - -

Rationale:

-

For Input Iterators an order is already guaranteed, because -only one order is possible. If a user who passes a Forward -Iterator to one of these algorithms really needs a specific -order of execution, it's possible to achieve that effect by -wrapping it in an Input Iterator adaptor.

- - - - - -
-

296. Missing descriptions and requirements of pair operators

-

Section: 20.2.3 [pairs] Status: NAD - Submitter: Martin Sebor Date: 2001-01-14

-

View all other issues in [pairs].

-

View all issues with NAD status.

-

Discussion:

-

The synopsis of the header <utility> in 20.2 [utility] -lists the complete set of equality and relational operators for pair -but the section describing the template and the operators only describes -operator==() and operator<(), and it fails to mention -any requirements on the template arguments. The remaining operators are -not mentioned at all. -

- - -

Rationale:

-

20.2.1 [operators] paragraph 10 already specifies the semantics. -That paragraph says that, if declarations of operator!=, operator>, -operator<=, and operator>= appear without definitions, they are -defined as specified in 20.2.1 [operators]. There should be no user -confusion, since that paragraph happens to immediately precede the -specification of pair.

- - - - - -
-

302. Need error indication from codecvt<>::do_length

-

Section: 22.2.1.5 [locale.codecvt.byname] Status: NAD - Submitter: Gregory Bumgardner Date: 2001-01-25

-

View all other issues in [locale.codecvt.byname].

-

View all issues with NAD status.

-

Discussion:

-

-The effects of codecvt<>::do_length() are described in -22.2.1.5.2, paragraph 10. As implied by that paragraph, and clarified -in issue 75, codecvt<>::do_length() must -process the source data and update the stateT argument just -as if the data had been processed by codecvt<>::in(). -However, the standard does not specify how do_length() would -report a translation failure, should the source sequence contain -untranslatable or illegal character sequences. -

- -

-The other conversion methods return an "error" result value -to indicate that an untranslatable character has been encountered, but -do_length() already has a return value (the number of source -characters that have been processed by the method). -

- - -

Proposed resolution:

-

-This issue cannot be resolved without modifying the interface. An exception -cannot be used, as there would be no way to determine how many characters -have been processed and the state object would be left in an indeterminate -state. -

- -

-A source compatible solution involves adding a fifth argument to length() -and do_length() that could be used to return position of the offending -character sequence. This argument would have a default value that would -allow it to be ignored: -

- -
  int length(stateT& state, 
-             const externT* from, 
-             const externT* from_end, 
-             size_t max,
-             const externT** from_next = 0);
-
-  virtual
-  int do_length(stateT& state, 
-                const externT* from, 
-                const externT* from_end, 
-                size_t max,
-                const externT** from_next);
-
- -

-Then an exception could be used to report any translation errors and -the from_next argument, if used, could then be used to retrieve the -location of the offending character sequence. -

- - -

Rationale:

-

The standard is already clear: the return value is the number of -"valid complete characters". If it encounters an invalid sequence of -external characters, it stops.

- - - - - -
-

304. Must *a return an lvalue when a is an input iterator?

-

Section: 24.1 [iterator.requirements] Status: NAD - Submitter: Dave Abrahams Date: 2001-02-05

-

View other active issues in [iterator.requirements].

-

View all other issues in [iterator.requirements].

-

View all issues with NAD status.

-

Discussion:

-

-We all "know" that input iterators are allowed to produce -values when dereferenced of which there is no other in-memory copy. -

- -

-But: Table 72, with a careful reading, seems to imply that this can only be -the case if the value_type has no members (e.g. is a built-in type). -

- -

The problem occurs in the following entry:

- -
  a->m     pre: (*a).m is well-defined
-           Equivalent to (*a).m
-
- -

-*a.m can be well-defined if *a is not a reference -type, but since operator->() must return a pointer for -a->m to be well-formed, it needs something to return a -pointer to. This seems to indicate that *a must be -buffered somewhere to make a legal input iterator. -

- -

I don't think this was intentional.

- - -

Rationale:

-

The current standard is clear and consistent. Input iterators that - return rvalues are in fact implementable. They may in some cases - require extra work, but it is still possible to define an operator-> - in such cases: it doesn't have to return a T*, but may return a - proxy type. No change to the standard is justified.

- - - - - -
-

313. set_terminate and set_unexpected question

-

Section: 18.7.3.3 [terminate] Status: NAD - Submitter: Judy Ward Date: 2001-04-03

-

View all other issues in [terminate].

-

View all issues with NAD status.

-

Discussion:

-

-According to section 18.7.3.3 of the standard, std::terminate() is -supposed to call the terminate_handler in effect immediately after -evaluating the throw expression. -

- -

-Question: what if the terminate_handler in effect is itself -std::terminate? -

- -

For example:

- -
  #include <exception>
-
-  int main () {
-      std::set_terminate(std::terminate);
-      throw 5;
-      return 0;
-  }
-
- -

-Is the implementation allowed to go into an infinite loop? -

- -

-I think the same issue applies to std::set_unexpected. -

- - -

Proposed resolution:

- - -

Rationale:

-

Infinite recursion is to be expected: users who set the terminate -handler to terminate are explicitly asking for terminate -to call itself.

- - - - - -
-

314. Is the stack unwound when terminate() is called?

-

Section: 18.7.3.3 [terminate] Status: NAD - Submitter: Detlef Vollmann Date: 2001-04-11

-

View all other issues in [terminate].

-

View all issues with NAD status.

-

Discussion:

- -

-The standard appears to contradict itself about whether the stack is -unwound when the implementation calls terminate(). -

- -

From 18.7.3.3p2:

-

- Calls the terminate_handler function in effect immediately - after evaluating the throw-expression (lib.terminate.handler), - if called by the implementation [...] -

- -

So the stack is guaranteed not to be unwound.

- -

But from 15.3p9:

-

- [...]whether or not the stack is unwound before this call - to terminate() is implementation-defined (except.terminate). -

- -

-And 15.5.1 actually defines that in most cases the stack is unwound. -

- - -

Proposed resolution:

- - -

Rationale:

-

There is definitely no contradiction between the core and library -clauses; nothing in the core clauses says that stack unwinding happens -after terminate is called. 18.7.3.3p2 does not say anything -about when terminate() is called; it merely specifies which -terminate_handler is used.

- - - - - -
-

323. abs() overloads in different headers

-

Section: 26.7 [c.math] Status: NAD Future - Submitter: Dave Abrahams Date: 2001-06-04

-

View other active issues in [c.math].

-

View all other issues in [c.math].

-

View all issues with NAD Future status.

-

Discussion:

-

Currently the standard mandates the following overloads of -abs():

- -
    abs(long), abs(int) in <cstdlib>
-
-    abs(float), abs(double), abs(long double) in <cmath>
-
-    template<class T> T abs(const complex<T>&) in <complex>
-
-    template<class T> valarray<T> abs(const valarray<T>&); in <valarray>
-
- -

-The problem is that having only some overloads visible of a function -that works on "implicitly inter-convertible" types is dangerous in -practice. The headers that get included at any point in a translation -unit can change unpredictably during program -development/maintenance. The wrong overload might be unintentionally -selected. -

- -

-Currently, there is nothing that mandates the simultaneous visibility -of these overloads. Indeed, some vendors have begun fastidiously -reducing dependencies among their (public) headers as a QOI issue: it -helps people to write portable code by refusing to compile unless all -the correct headers are #included. -

- -

The same issue may exist for other functions in the library.

- -

Redmond: PJP reports that C99 adds two new kinds of abs: complex, -and int_max_abs.

- -

Related issue: 343.

- - - -

Rationale:

-

The programs that could potentially be broken by this situation are - already fragile, and somewhat contrived: For example, a user-defined - class that has conversion overloads both to long and - to float. If x is a value of such a class, then - abs(x) would give the long version if the user - included <cstdlib>, the float version if the user - included <cmath>, and would be diagnosed as ambiguous at - compile time if the user included both headers. The LWG couldn't - find an example of a program whose meaning would be changed (as - opposed to changing it from well-formed to ill-formed) simply by - adding another standard header.

- -

Since the harm seems minimal, and there don't seem to be any simple - and noninvasive solutions, this is being closed as NAD. It is - marked as "Future" for two reasons. First, it might be useful to - define an <all> header that would include all - Standard Library headers. Second, we should at least make sure that - future library extensions don't make this problem worse.

- - - - - -
-

326. Missing typedef in moneypunct_byname

-

Section: 22.2.6.4 [locale.moneypunct.byname] Status: NAD - Submitter: Martin Sebor Date: 2001-07-05

-

View all issues with NAD status.

-

Discussion:

-

The definition of the moneypunct facet contains the typedefs char_type -and string_type. Only one of these names, string_type, is defined in -the derived facet, moneypunct_byname.

- - -

Proposed resolution:

-

For consistency with the numpunct facet, add a typedef for -char_type to the definition of the moneypunct_byname facet in -22.2.6.4 [locale.moneypunct.byname].

- - -

Rationale:

-

The absence of the typedef is irrelevant. Users can still access -the typedef, because it is inherited from the base class.

- - - - - -
-

330. Misleading "exposition only" value in class locale definition

-

Section: 22.1.1 [locale] Status: NAD - Submitter: Martin Sebor Date: 2001-07-15

-

View all other issues in [locale].

-

View all issues with NAD status.

-

Discussion:

-

-The "exposition only" value of the std::locale::none constant shown in -the definition of class locale is misleading in that it on many -systems conflicts with the value assigned to one if the LC_XXX -constants (specifically, LC_COLLATE on AIX, LC_ALL on HP-UX, LC_CTYPE -on Linux and SunOS). This causes incorrect behavior when such a -constant is passed to one of the locale member functions that accept a -locale::category argument and interpret it as either the C LC_XXX -constant or a bitmap of locale::category values. At least three major -implementations adopt the suggested value without a change and -consequently suffer from this problem. -

- -

-For instance, the following code will (presumably) incorrectly copy facets -belonging to the collate category from the German locale on AIX: -

- -
  std::locale l (std::locale ("C"), "de_DE", std::locale::none);
-
- - -

Rationale:

-

The LWG agrees that it may be difficult to implement locale member -functions in such a way that they can take either category -arguments or the LC_ constants defined in <cctype>. In light of -this requirement (22.1.1.1.1 [locale.category], paragraph 2), and in light -of the requirement in the preceding paragraph that it is possible to -combine category bitmask elements with bitwise operations, -defining the category elements is delicate, -particularly if an implementor is constrained to work with a -preexisting C library. (Just using the existing LC_ constants would -not work in general.) There's no set of "exposition only" values that -could give library implementors proper guidance in such a delicate -matter. The non-normative example we're giving is no worse than -any other choice would be.

- -

See issue 347.

- - - - - -
-

332. Consider adding increment and decrement operators to std::fpos< T >

-

Section: 27.4.3 [fpos] Status: NAD - Submitter: PremAnand M. Rao Date: 2001-08-27

-

View all other issues in [fpos].

-

View all issues with NAD status.

-

Discussion:

-

-Increment and decrement operators are missing from -Table 88 -- Position type requirements in 27.4.3 [fpos]. -

- - -

Proposed resolution:

-

-Table 88 (section 27.4.3) -- Position type requirements -be updated to include increment and decrement operators. -

- -
expression        return type     operational    note
-
-++p               fpos&           p += O(1)
-p++               fpos            { P tmp = p;
-                                    ++p;
-                                    return tmp; }
---p               fpos&           p -= O(1)
-p--               fpos            { P tmp = p;
-                                    --p;
-                                    return tmp; }
-
- - - -

Rationale:

-

The LWG believes this is a request for extension, not a defect -report. Additionally, nobody saw a clear need for this extension; -fpos is used only in very limited ways.

- - - - - -
-

344. grouping + showbase

-

Section: 22.2.2 [category.numeric] Status: NAD - Submitter: Howard Hinnant Date: 2001-10-13

-

View all issues with NAD status.

-

Discussion:

-

-When both grouping and showbase are active and the basefield is octal, -does the leading 0 participate in the grouping or not? For example, -should one format as: 0,123,456 or 0123,456? -

-

-An analogy can be drawn with hexadecimal. It appears that 0x123,456 is -preferred over 0x,123,456. However, this analogy is not universally -accepted to apply to the octal base. The standard is not clear on how -to format (or parse) in this manner. -

- -

Proposed resolution:

-

-Insert into 22.2.3.1.2 [facet.numpunct.virtuals] paragraph 3, just before the last -sentence: -

-

-The leading hexadecimal base specifier "0x" does not participate in -grouping. The leading '0' octal base specifier may participate in -grouping. It is unspecified if the leading '0' participates in -formatting octal numbers. In parsing octal numbers, the implementation -is encouraged to accept both the leading '0' participating in the -grouping, and not participating (e.g. 0123,456 or 0,123,456). -

- -

Rationale:

-

-The current behavior may be unspecified, but it's not clear that it -matters. This is an obscure corner case, since grouping is usually -intended for the benefit of humans and oct/hex prefixes are usually -intended for the benefit of machines. There is not a strong enough -consensus in the LWG for action. -

- - - - -
-

348. Minor issue with std::pair operator<

-

Section: 20.2.3 [pairs] Status: NAD Future - Submitter: Andy Sawyer Date: 2001-10-23

-

View all other issues in [pairs].

-

View all issues with NAD Future status.

-

Discussion:

-

-The current wording of 20.2.2 [lib.pairs] p6 precludes the use of -operator< on any pair type which contains a pointer. -

- - -

Proposed resolution:

-

In 20.2.3 [pairs] paragraph 6, replace:

-
    Returns: x.first < y.first || (!(y.first < x.first) && x.second <
-        y.second).
-
-

With:

-
    Returns: std::less<T1>()( x.first, y.first ) ||
-             (!std::less<T1>()( y.first, x.first) && 
-             std::less<T2>()( x.second, y.second ) )
-
- - - -

Rationale:

-

This is an instance of a much more general problem. If we want - operator< to translate to std::less for pairs of pointers, where - do we draw the line? The same issue applies to individual - pointers, smart pointer wrappers, std::vector<T*>, and so - on.

- -

Andy Koenig suggests that the real issue here is that we aren't - distinguishing adequately between two different orderings, a - "useful ordering" and a "canonical ordering" that's used just - because we sometimes need some ordering without caring much - which ordering it is. Another example of the later is typeinfo's - before.

- - - - - - -
-

350. allocator<>::address

-

Section: 20.6.1.1 [allocator.members], 20.1.2 [allocator.requirements], 17.4.1.1 [contents] Status: Dup - Submitter: Nathan Myers Date: 2001-10-25

-

View all other issues in [allocator.members].

-

View all issues with Dup status.

-

Duplicate of: 634

-

Discussion:

-

See c++std-lib-9006 and c++std-lib-9007. This issue is taken -verbatim from -9007.

- -

-The core language feature allowing definition of operator&() applied -to any non-builtin type makes that operator often unsafe to use in -implementing libraries, including the Standard Library. The result -is that many library facilities fail for legal user code, such as -the fragment

-
  class A { private: A* operator&(); };
-  std::vector<A> aa;
-
-  class B { };
-  B* operator&(B&) { return 0; }
-  std::vector<B> ba;
-
- -

-In particular, the requirements table for Allocator (Table 32) specifies -no semantics at all for member address(), and allocator<>::address is -defined in terms of unadorned operator &. -

- - - -

Proposed resolution:

-

-In 20.6.1.1, Change the definition of allocator<>::address from:

-

- Returns: &x -

- -

to:

- -

- Returns: The value that the built in operator&(x) would return if not - overloaded. -

- -

-In 20.1.6, Table 32, add to the Notes column of the a.address(r) and -a.address(s) lines, respectively: -

- -
  allocator<T>::address(r)
-  allocator<T>::address(s)
-
- -

In addition, in clause 17.4.1.1, add a statement:

- -

- The Standard Library does not apply operator& to any type for which - operator& may be overloaded. -

- - - -

Rationale:

-

The LWG believes both examples are ill-formed. The contained type -is required to be CopyConstructible (20.1.1 [utility.arg.requirements]), and that -includes the requirement that &t return the usual types and -values. Since allocators are intended to be used in conjunction with -containers, and since the CopyConstructible requirements appear to -have been written to deal with the concerns of this issue, the LWG -feels it is NAD unless someone can come up with a well-formed example -exhibiting a problem.

- -

It may well be that the CopyConstructible requirements are too - restrictive and that either the container requirements or the - CopyConstructive requirements should be relaxed, but that's a far - larger issue. Marking this issue as "future" as a pointer to that - larger issue.

- - - - - -
-

351. unary_negate and binary_negate: struct or class?

-

Section: 20.5 [function.objects] Status: NAD Editorial - Submitter: Dale Riley Date: 2001-11-12

-

View all other issues in [function.objects].

-

View all issues with NAD Editorial status.

-

Discussion:

-

-In 20.5 [function.objects] the header <functional> synopsis declares -the unary_negate and binary_negate function objects as struct. -However in 20.5.10 [negators] the unary_negate and binary_negate -function objects are defined as class. Given the context, they are -not "basic function objects" like negate, so this is either a typo or -an editorial oversight. -

- -

[Taken from comp.std.c++]

- - - -

Proposed resolution:

-

Change the synopsis to reflect the useage in 20.5.10 [negators]

- -

[Curaçao: Since the language permits "struct", the LWG -views this as NAD. They suggest, however, that the Project Editor -might wish to make the change as editorial.]

- - - - - - - -
-

353. std::pair missing template assignment

-

Section: 20.2.3 [pairs] Status: NAD Future - Submitter: Martin Sebor Date: 2001-12-02

-

View all other issues in [pairs].

-

View all issues with NAD Future status.

-

Discussion:

-

-The class template std::pair defines a template ctor (20.2.2, p4) but -no template assignment operator. This may lead to inefficient code since -assigning an object of pair<C, D> to pair<A, B> -where the types C and D are distinct from but convertible to -A and B, respectively, results in a call to the template copy -ctor to construct an unnamed temporary of type pair<A, B> -followed by an ordinary (perhaps implicitly defined) assignment operator, -instead of just a straight assignment. -

- - -

Proposed resolution:

-

-Add the following declaration to the definition of std::pair: -

-
    template<class U, class V>
-    pair& operator=(const pair<U, V> &p);
-
-

-And also add a paragraph describing the effects of the function template to the -end of 20.2.2: -

-
    template<class U, class V>
-    pair& operator=(const pair<U, V> &p);
-
-

- Effects: first = p.first; - second = p.second; - Returns: *this -

- -

[Curaçao: There is no indication this is was anything other than -a design decision, and thus NAD.  May be appropriate for a future -standard.]

- - - - - - -
-

356. Meaning of ctype_base::mask enumerators

-

Section: 22.2.1 [category.ctype] Status: NAD - Submitter: Matt Austern Date: 2002-01-23

-

View all other issues in [category.ctype].

-

View all issues with NAD status.

-

Discussion:

- -

What should the following program print?

- -
  #include <locale>
-  #include <iostream>
-
-  class my_ctype : public std::ctype<char>
-  {
-    typedef std::ctype<char> base;
-  public:
-    my_ctype(std::size_t refs = 0) : base(my_table, false, refs)
-    {
-      std::copy(base::classic_table(), base::classic_table() + base::table_size,
-                my_table);
-      my_table[(unsigned char) '_'] = (base::mask) (base::print | base::space);
-    }
-  private:
-    mask my_table[base::table_size];
-  };
-
-  int main()
-  {
-    my_ctype ct;
-    std::cout << "isspace: " << ct.is(std::ctype_base::space, '_') << "    "
-              << "isalpha: " << ct.is(std::ctype_base::alpha, '_') << std::endl;
-  }
-
- -

The goal is to create a facet where '_' is treated as whitespace.

- -

On gcc 3.0, this program prints "isspace: 1 isalpha: 0". On -Microsoft C++ it prints "isspace: 1 isalpha: 1".

- -

-I believe that both implementations are legal, and the standard does not -give enough guidance for users to be able to use std::ctype's -protected interface portably.

- -

-The above program assumes that ctype_base::mask enumerators like -space and print are disjoint, and that the way to -say that a character is both a space and a printing character is to or -those two enumerators together. This is suggested by the "exposition -only" values in 22.2.1 [category.ctype], but it is nowhere specified in -normative text. An alternative interpretation is that the more -specific categories subsume the less specific. The above program -gives the results it does on the Microsoft compiler because, on that -compiler, print has all the bits set for each specific -printing character class. -

- -

From the point of view of std::ctype's public interface, there's no -important difference between these two techniques. From the point of -view of the protected interface, there is. If I'm defining a facet -that inherits from std::ctype<char>, I'm the one who defines the -value that table()['a'] returns. I need to know what combination of -mask values I should use. This isn't so very esoteric: it's exactly -why std::ctype has a protected interface. If we care about users -being able to write their own ctype facets, we have to give them a -portable way to do it. -

- -

-Related reflector messages: -lib-9224, lib-9226, lib-9229, lib-9270, lib-9272, lib-9273, lib-9274, -lib-9277, lib-9279. -

- -

Issue 339 is related, but not identical. The -proposed resolution if issue 339 says that -ctype_base::mask must be a bitmask type. It does not say that the -ctype_base::mask elements are bitmask elements, so it doesn't -directly affect this issue.

- -

More comments from Benjamin Kosnik, who believes that -that C99 compatibility essentially requires what we're -calling option 1 below.

- -
-
I think the C99 standard is clear, that isspace -> !isalpha.
---------
-
-#include <locale>
-#include <iostream>
-
-class my_ctype : public std::ctype<char>
-{
-private:
-  typedef std::ctype<char> base;
-  mask my_table[base::table_size];
-
-public:
-  my_ctype(std::size_t refs = 0) : base(my_table, false, refs)
-  {
-    std::copy(base::classic_table(), base::classic_table() + base::table_size,
-              my_table);
-    mask both = base::print | base::space;
-    my_table[static_cast<mask>('_')] = both;
-  }
-};
-
-int main()
-{
-  using namespace std;
-  my_ctype ct;
-  cout << "isspace: " << ct.is(ctype_base::space, '_') << endl;
-  cout << "isprint: " << ct.is(ctype_base::print, '_') << endl;
-
-  // ISO C99, isalpha iff upper | lower set, and !space.
-  // 7.5, p 193
-  // -> looks like g++ behavior is correct.
-  // 356 -> bitmask elements are required for ctype_base
-  // 339 -> bitmask type required for mask
-  cout << "isalpha: " << ct.is(ctype_base::alpha, '_') << endl;
-}
-
-
- - - -

Proposed resolution:

-

Informally, we have three choices:

-
    -
  1. Require that the enumerators are disjoint (except for alnum and -graph)
  2. -
  3. Require that the enumerators are not disjoint, and specify which -of them subsume which others. (e.g. mandate that lower includes alpha -and print)
  4. -
  5. Explicitly leave this unspecified, which the result that the above -program is not portable.
  6. -
- -

Either of the first two options is just as good from the standpoint -of portability. Either one will require some implementations to -change.

- - -

Rationale:

-

The LWG agrees that this is a real ambiguity, and that both -interpretations are conforming under the existing standard. However, -there's no evidence that it's causing problems for real users. Users -who want to define ctype facets portably can test the ctype_base masks -to see which interpretation is being used.

- - - - - -
-

357. <cmath> float functions cannot return HUGE_VAL

-

Section: 26.7 [c.math] Status: NAD Editorial - Submitter: Ray Lischner Date: 2002-02-26

-

View other active issues in [c.math].

-

View all other issues in [c.math].

-

View all issues with NAD Editorial status.

-

Discussion:

-

-The float versions of the math functions have no meaningful value to return -for a range error. The long double versions have a value they can return, -but it isn't necessarily the most reasonable value. -

- -

-Section 26.5 [lib.c.math], paragraph 5, says that C++ "adds float and long -double overloaded versions of these functions, with the same semantics," -referring to the math functions from the C90 standard. -

- -

-The C90 standard, in section 7.5.1, paragraph 3, says that functions return -"the value of the macro HUGE_VAL" when they encounter a range error. -Section 7.5, paragraph 2, defines HUGE_VAL as a macro that "expands to a -positive double expression, not necessarily representable as a float." -

- -

-Therefore, the float versions of the math functions have no way to -signal a range error. [Curaçao: The LWG notes that this isn't -strictly correct, since errno is set.] The semantics require that they -return HUGE_VAL, but they cannot because HUGE_VAL might not be -representable as a float. -

- -

-The problem with long double functions is less severe because HUGE_VAL is -representable as a long double. On the other hand, it might not be a "huge" -long double value, and might fall well within the range of normal return -values for a long double function. Therefore, it does not make sense for a -long double function to return a double (HUGE_VAL) for a range error. -

- - -

Proposed resolution:

-

Curaçao: C99 was faced with a similar problem, which they fixed by -adding HUGE_VALF and HUGE_VALL in addition to HUGE_VAL.

- -

C++ must also fix, but it should be done in the context of the -general C99 based changes to C++, not via DR. Thus the LWG in Curaçao -felt the resolution should be NAD, FUTURE, but the issue is being held -open for one more meeting to ensure LWG members not present during the -discussion concur.

- - -

Rationale:

-

Will be fixed as part of more general work in the TR.

- - - - - -
-

361. num_get<>::do_get (..., void*&) checks grouping

-

Section: 22.2.2.2.2 [facet.num.put.virtuals] Status: NAD - Submitter: Martin Sebor Date: 2002-03-12

-

View all other issues in [facet.num.put.virtuals].

-

View all issues with NAD status.

-

Discussion:

-

-22.2.2.2.2, p12 specifies that thousands_sep is to be inserted only -for integral types (issue 282 suggests that this should be done for -all arithmetic types). -

- -

-22.2.2.1.2, p12 requires that grouping be checked for all extractors -including that for void*. -

- -

-I don't think that's right. void* values should not be checked for -grouping, should they? (Although if they should, then num_put needs -to write them out, otherwise their extraction will fail.) -

- - -

Proposed resolution:

-

-Change the first sentence of 22.2.2.2.2, p12 from -

-

- Digit grouping is checked. That is, the positions of discarded - separators is examined for consistency with - use_facet<numpunct<charT> >(loc).grouping(). - If they are not consistent then ios_base::failbit is assigned - to err. -

- -

to

-

- Except for conversions to void*, digit grouping is checked... -

- - - -

Rationale:

-

This would be a change: as it stands, the standard clearly - specifies that grouping applies to void*. A survey of existing - practice shows that most existing implementations do that, as they - should.

- - - - - -
-

366. Excessive const-qualification

-

Section: 27 [input.output] Status: NAD - Submitter: Walter Brown, Marc Paterno Date: 2002-05-10

-

View all other issues in [input.output].

-

View all issues with NAD status.

-

Discussion:

-

-The following member functions are declared const, yet return non-const -pointers. We believe they are should be changed, because they allow code -that may surprise the user. See document N1360 for details and -rationale. -

- -

[Santa Cruz: the real issue is that we've got const member -functions that return pointers to non-const, and N1360 proposes -replacing them by overloaded pairs. There isn't a consensus about -whether this is a real issue, since we've never said what our -constness policy is for iostreams. N1360 relies on a distinction -between physical constness and logical constness; that distinction, or -those terms, does not appear in the standard.]

- - - - -

Proposed resolution:

-

In 27.4.4 and 27.4.4.2

-

Replace

-
  basic_ostream<charT,traits>* tie() const;
-
-

with

-
  basic_ostream<charT,traits>* tie();
-  const basic_ostream<charT,traits>* tie() const;
-
- -

and replace

-
  basic_streambuf<charT,traits>* rdbuf() const;
-
-

with

-
  basic_streambuf<charT,traits>* rdbuf();
-  const basic_streambuf<charT,traits>* rdbuf() const;
-
- -

In 27.5.2 and 27.5.2.3.1

-

Replace

-
  char_type* eback() const;
-
-

with

-
  char_type* eback();
-  const char_type* eback() const;
-
- -

Replace

-
  char_type gptr() const;
-
-

with

-
  char_type* gptr();
-  const char_type* gptr() const;
-
- -

Replace

-
  char_type* egptr() const;
-
-

with

-
  char_type* egptr();
-  const char_type* egptr() const;
-
- -

In 27.5.2 and 27.5.2.3.2

-

Replace

-
  char_type* pbase() const;
-
-

with

-
  char_type* pbase();
-  const char_type* pbase() const;
-
- -

Replace

-
  char_type* pptr() const;
-
-

with

-
  char_type* pptr();
-  const char_type* pptr() const;
-
- -

Replace

-
  char_type* epptr() const;
-
-

with

-
  char_type* epptr();
-  const char_type* epptr() const;
-
- -

In 27.7.2, 27.7.2.2, 27.7.3 27.7.3.2, 27.7.4, and 27.7.6

-

Replace

-
  basic_stringbuf<charT,traits,Allocator>* rdbuf() const;
-
-

with

-
  basic_stringbuf<charT,traits,Allocator>* rdbuf();
-  const basic_stringbuf<charT,traits,Allocator>* rdbuf() const;
-
- -

In 27.8.1.5, 27.8.1.7, 27.8.1.8, 27.8.1.10, 27.8.1.11, and 27.8.1.13

-

Replace

-
  basic_filebuf<charT,traits>* rdbuf() const;
-
-

with

-
  basic_filebuf<charT,traits>* rdbuf();
-  const basic_filebuf<charT,traits>* rdbuf() const;
-
- - -

Rationale:

-

The existing specification is a bit sloppy, but there's no - particular reason to change this other than tidiness, and there are - a number of ways in which streams might have been designed - differently if we were starting today. There's no evidence that the - existing constness policy is harming users. We might consider - a different constness policy as part of a full stream redesign.

- - - - - -
-

367. remove_copy/remove_copy_if and Input Iterators

-

Section: 25.2.8 [alg.remove] Status: NAD - Submitter: Anthony Williams Date: 2002-05-13

-

View all other issues in [alg.remove].

-

View all issues with NAD status.

-

Discussion:

-

-remove_copy and remove_copy_if (25.2.8 [alg.remove]) permit their -input range to be marked with Input Iterators. However, since two -operations are required against the elements to copy (comparison and -assigment), when the input range uses Input Iterators, a temporary -copy must be taken to avoid dereferencing the iterator twice. This -therefore requires the value type of the InputIterator to be -CopyConstructible. If the iterators are at least Forward Iterators, -then the iterator can be dereferenced twice, or a reference to the -result maintained, so the temporary is not required. -

- - -

Proposed resolution:

-

-Add "If InputIterator does not meet the requirements of forward -iterator, then the value type of InputIterator must be copy -constructible. Otherwise copy constructible is not required." to -25.2.8 [alg.remove] paragraph 6. -

- - -

Rationale:

-

The assumption is that an input iterator can't be dereferenced - twice. There's no basis for that assumption in the Standard.

- - - - - -
-

368. basic_string::replace has two "Throws" paragraphs

-

Section: 21.3.6.6 [string::replace] Status: NAD Editorial - Submitter: Beman Dawes Date: 2002-06-03

-

View all issues with NAD Editorial status.

-

Discussion:

-

-21.3.6.6 [string::replace] basic_string::replace, second -signature, given in paragraph 1, has two "Throws" paragraphs (3 and -5). -

- -

-In addition, the second "Throws" paragraph (5) includes specification -(beginning with "Otherwise, the function replaces ...") that should be -part of the "Effects" paragraph. -

- - -

Proposed resolution:

- - -

Rationale:

-

This is editorial. Both "throws" statements are true. The bug is - just that the second one should be a sentence, part of the "Effects" - clause, not a separate "Throws". The project editor has been - notified.

- - - - - -
-

372. Inconsistent description of stdlib exceptions

-

Section: 17.4.4.8 [res.on.exception.handling], 18.6.1 [type.info] Status: NAD - Submitter: Randy Maddox Date: 2002-07-22

-

View all other issues in [res.on.exception.handling].

-

View all issues with NAD status.

-

Discussion:

- -

Paragraph 3 under clause 17.4.4.8 [res.on.exception.handling], Restrictions on -Exception Handling, states that "Any other functions defined in the -C++ Standard Library that do not have an exception-specification may -throw implementation-defined exceptions unless otherwise specified." -This statement is followed by a reference to footnote 178 at the -bottom of that page which states, apparently in reference to the C++ -Standard Library, that "Library implementations are encouraged (but -not required) to report errors by throwing exceptions from (or derived -from) the standard exceptions."

- -

These statements appear to be in direct contradiction to clause -18.6.1 [type.info], which states "The class exception defines the -base class for the types of objects thrown as exceptions by the C++ -Standard library components ...".

- -

Is this inconsistent?

- - - -

Proposed resolution:

- - -

Rationale:

-

Clause 17 is setting the overall library requirements, and it's - clear and consistent. This sentence from Clause 18 is descriptive, - not setting a requirement on any other class. -

- - - - - -
-

374. moneypunct::frac_digits returns int not unsigned

-

Section: 22.2.6.3.1 [locale.moneypunct.members], 22.2.6.3.2 [locale.moneypunct.virtuals] Status: NAD - Submitter: Ray Lischner Date: 2002-08-08

-

View all issues with NAD status.

-

Discussion:

-

-In section 22.2.6.3.1 [locale.moneypunct.members], frac_digits() returns type -"int". This implies that frac_digits() might return a negative value, -but a negative value is nonsensical. It should return "unsigned". -

- -

-Similarly, in section 22.2.6.3.2 [locale.moneypunct.virtuals], do_frac_digits() -should return "unsigned". -

- - - -

Proposed resolution:

- - -

Rationale:

-

Regardless of whether the return value is int or unsigned, it's -always conceivable that frac_digits might return a nonsensical -value. (Is 4294967295 really any better than -1?) The clients of -moneypunct, the get and put facets, can and do perform range -checks.

- - - - - -
-

377. basic_string::insert and length_error

-

Section: 21.3.6.4 [string::insert] Status: NAD - Submitter: Ray Lischner Date: 2002-08-16

-

View all other issues in [string::insert].

-

View all issues with NAD status.

-

Discussion:

-

-Section 21.3.6.4 [string::insert], paragraph 4, contains the following, -"Then throws length_error if size() >= npos - rlen." -

- -

-Related to DR 83, this sentence should probably be removed. -

- - -

Proposed resolution:

- - -

Rationale:

This requirement is redundant but correct. No change is -needed.

- - - - -
-

378. locale immutability and locale::operator=()

-

Section: 22.1.1 [locale] Status: Dup - Submitter: Martin Sebor Date: 2002-09-06

-

View all other issues in [locale].

-

View all issues with Dup status.

-

Duplicate of: 31

-

Discussion:

-

-I think there is a problem with 22.1.1, p6 which says that -

-
    -6- An instance of locale is immutable; once a facet reference
-        is obtained from it, that reference remains usable as long
-        as the locale value itself exists.
-
-

-and 22.1.1.2, p4: -

-
    const locale& operator=(const locale& other) throw();
-
-    -4- Effects: Creates a copy of other, replacing the current value.
-
-

-How can a reference to a facet obtained from a locale object remain -valid after an assignment that clearly must replace all the facets -in the locale object? Imagine a program such as this -

-
    std::locale loc ("de_DE");
-    const std::ctype<char> &r0 = std::use_facet<std::ctype<char> >(loc);
-    loc = std::locale ("en_US");
-    const std::ctype<char> &r1 = std::use_facet<std::ctype<char> >(loc);
-
-

-Is r0 really supposed to be preserved and destroyed only when loc goes -out of scope? -

- - -

Proposed resolution:

-

[Summer '04 mid-meeting mailing: Martin and Dietmar believe this - is a duplicate of issue 31 and recommend that it be - closed. -]

- - - - - - -
-

385. Does call by value imply the CopyConstructible requirement?

-

Section: 17 [library] Status: NAD - Submitter: Matt Austern Date: 2002-10-23

-

View all other issues in [library].

-

View all issues with NAD status.

-

Discussion:

-

-Many function templates have parameters that are passed by value; -a typical example is find_if's pred parameter in -25.1.2 [alg.find]. Are the corresponding template parameters -(Predicate in this case) implicitly required to be -CopyConstructible, or does that need to be spelled out explicitly? -

- -

-This isn't quite as silly a question as it might seem to be at first -sight. If you call find_if in such a way that template -argument deduction applies, then of course you'll get call by value -and you need to provide a copy constructor. If you explicitly provide -the template arguments, however, you can force call by reference by -writing something like find_if<my_iterator, -my_predicate&>. The question is whether implementation -are required to accept this, or whether this is ill-formed because -my_predicate& is not CopyConstructible. -

- -

-The scope of this problem, if it is a problem, is unknown. Function -object arguments to generic algorithms in clauses 25 [algorithms] -and 26 [numerics] are obvious examples. A review of the whole -library is necessary. -

-

[ -This is really two issues. First, predicates are typically passed by -value but we don't say they must be Copy Constructible. They should -be. Second: is specialization allowed to transform value arguments -into references? References aren't copy constructible, so this should -not be allowed. -]

- -

[ -2007-01-12, Howard: First, despite the note above, references are -copy constructible. They just aren't assignable. Second, this is very -closely related to 92 and should be consistent with that. -That issue already says that implementations are allowed to copy -function objects. If one passes in a reference, it is copyable, but -susceptible to slicing if one passes in a reference to a base. Third, -with rvalue reference in the language one only needs to satisfy -MoveConstructible to pass an rvalue "by value". Though the function -might still copy the function object internally (requiring -CopyConstructible). Finally (and fwiw), if we wanted to, it is easy to -code all of the std::algorithms such that they do not copy function -objects internally. One merely passes them by reference internally if -desired (this has been fully implemented and shipped for several years). - If this were mandated, it would reverse 92, allowing -function objects to reliably maintain state. E.g. the example in 92 would reliably remove only the third element. -]

- - - -

Proposed resolution:

-

-Recommend NAD. -

- - -

Rationale:

-

-Generic algorithms will be marked with concepts and these will imply a requirement -of MoveConstructible (not CopyConstructible). The signature of the function will -then precisely describe and enforce the precise requirements. -

- - - - - -
-

388. Use of complex as a key in associative containers

-

Section: 26.3 [complex.numbers] Status: NAD Future - Submitter: Gabriel Dos Reis Date: 2002-11-08

-

View all other issues in [complex.numbers].

-

View all issues with NAD Future status.

-

Discussion:

-

-Practice with std::complex<> and the associative containers -occasionally reveals artificial and distracting issues with constructs -resembling: std::set<std::complex<double> > s; -

- -

-The main reason for the above to fail is the absence of an approriate -definition for std::less<std::complex<T> >. That in turn comes from -the definition of the primary template std::less<> in terms of -operator<. -

- -

-The usual argument goes as follows: Since there is no ordering over -the complex field compatible with field operations it makes little -sense to define a function operator< operating on the datatype -std::complex<T>. That is fine. However, that reasoning does not carry -over to std::less<T> which is used, among other things, by associative -containers as an ordering useful to meet complexity requirements. -

- -

Related issue: 348.

- - - -

Proposed resolution:

-

Informally: Add a specialization of std::less for std::complex.

- - -

Rationale:

-

Discussed in Santa Cruz. An overwhelming majority of the LWG -believes this should not be treated a DR: it's a request for a design -change, not a defect in the existing standard. Most people (10-3) -believed that we probably don't want this change, period: as with -issue 348, it's hard to know where to draw the line. -The LWG noted that users who want to put objects into an associative -container for which operator< isn't defined can simply -provide their own comparison function object.

- - - - - -
-

390. CopyConstructible requirements too strict

-

Section: 20.1.1 [utility.arg.requirements] Status: NAD Future - Submitter: Doug Gregor Date: 2002-10-24

-

View other active issues in [utility.arg.requirements].

-

View all other issues in [utility.arg.requirements].

-

View all issues with NAD Future status.

-

Discussion:

-

-The CopyConstructible requirements in Table 30 state that for an -object t of type T (where T is CopyConstructible), the expression &t -returns the address of t (with type T*). This requirement is overly -strict, in that it disallows types that overload operator& to not -return a value of type T*. This occurs, for instance, in the Boost.Lambda library, where -operator& is overloaded for a Boost.Lambda function object to return -another function object. -

- -

Example:

- -
  std::vector<int> u, v;
-  int x;
-  // ...
-  std::transform(u.begin(), u.end(), std::back_inserter(v), _1 * x);
-
- -

-_1 * x returns an unnamed function object with operator& overloaded to -not return T* , therefore rendering the std::transform call ill-formed. -However, most standard library implementations will compile this code -properly, and the viability of such binder libraries is severely hindered -by the unnecessary restriction in the CopyConstructible requirements. -

- -

-For reference, the address of an object can be retrieved without using -the address-of operator with the following function template: -

- -
  template <typename T> T* addressof(T& v)
-  {
-    return reinterpret_cast<T*>(
-         &const_cast<char&>(reinterpret_cast<const volatile char &>(v)));
-  }
-
- -

-Note: this relates directly to library issue 350, which -will need to be reexamined if the CopyConstructible requirements -change. -

- - -

Proposed resolution:

-

-Remove the last two rows of Table 30, eliminating the requirements -that &t and &u return the address of t and u, respectively. -

- - -

Rationale:

-

This was a deliberate design decision. Perhaps it should be - reconsidered for C++0x.

- - - - - -
-

392. 'equivalence' for input iterators

-

Section: 24.1.1 [input.iterators] Status: NAD - Submitter: Corwin Joy Date: 2002-12-11

-

View all other issues in [input.iterators].

-

View all issues with NAD status.

-

Discussion:

- -

-In section 24.1.1 [input.iterators] table 72 - -'Input Iterator Requirements' we have as a postcondition of *a: -"If a==b and (a, b) is in the domain of == then *a is equivalent to *b". -

- -

-In section 24.5.3.5 [istreambuf.iterator::equal] it states that -"istreambuf_iterator::equal returns true if and only if both iterators -are at end-of-stream, or neither is at end-of-stream, regardless of -what streambuf object they use." (My emphasis). -

- -

-The defect is that either 'equivalent' needs to be more precisely -defined or the conditions for equality in 24.5.3.5 [istreambuf.iterator::equal] -are incorrect. (Or both). -

- -

Consider the following example:

-
   #include <iostream>
-   #include <fstream>
-   #include <iterator>
-   using namespace std;
-
-   int main() {
-    ifstream file1("file1.txt"), file2("file2.txt");
-    istreambuf_iterator<char> f1(file1), f2(file2);
-    cout << "f1 == f2 : " << boolalpha << (f1 == f2) << endl;
-    cout << "f1 = " << *f1 << endl;
-    cout << "f2 = " << *f2 << endl;
-    return 0;
-   }
-
- -

Now assuming that neither f1 or f2 are at the end-of-stream then -f1 == f2 by 24.5.3.5 [istreambuf.iterator::equal].

- -

However, it is unlikely that *f1 will give the same value as *f2 except -by accident.

- -

So what does *f1 'equivalent' to *f2 mean? I think the standard should -be clearer on this point, or at least be explicit that this does not -mean that *f1 and *f2 are required to have the same value in the case -of input iterators.

- - -

Proposed resolution:

- - -

Rationale:

The two iterators aer not in the domain of ==

- - - - - - -
-

393. do_in/do_out operation on state unclear

-

Section: 22.2.1.4.2 [locale.codecvt.virtuals] Status: Pending NAD Editorial - Submitter: Alberto Barbati Date: 2002-12-24

-

View other active issues in [locale.codecvt.virtuals].

-

View all other issues in [locale.codecvt.virtuals].

-

View all issues with Pending NAD Editorial status.

-

Discussion:

-

-this DR follows the discussion on the previous thread "codecvt::do_in -not consuming external characters". It's just a clarification issue -and not a request for a change. -

-

-Can do_in()/do_out() produce output characters without consuming input -characters as a result of operation on state? -

- - -

Proposed resolution:

-

-Add a note at the end of 22.2.1.4.2 [locale.codecvt.virtuals], -paragraph 3: -

- -

-[Note: As a result of operations on state, it can return ok or partial -and set from_next == from and to_next != to. --end note] -

- - -

Rationale:

-

-The submitter believes that standard already provides an affirmative -answer to the question. However, the current wording has induced a few -library implementors to make the incorrect assumption that -do_in()/do_out() always consume at least one internal character when -they succeed. -

- -

-The submitter also believes that the proposed resolution is not in -conflict with the related issue 76. Moreover, by explicitly allowing -operations on state to produce characters, a codecvt implementation -may effectively implement N-to-M translations without violating the -"one character at a time" principle described in such issue. On a side -note, the footnote in the proposed resolution of issue 76 that -informally rules out N-to-M translations for basic_filebuf should be -removed if this issue is accepted as valid. -

- - -

[ -Kona (2007): The proposed resolution is to add a note. Since this is -non-normative, the issue is editorial, but we believe that the note is -correct. Proposed Disposition: NAD, Editorial -]

- - - - - - -
-

399. volations of unformatted input function requirements

-

Section: 27.6.1.3 [istream.unformatted] Status: NAD - Submitter: Martin Sebor Date: 2003-01-05

-

View all other issues in [istream.unformatted].

-

View all issues with NAD status.

-

Discussion:

-

-The Effects clauses for the two functions below violate the -general requirements on unformatted input functions outlined -in 27.6.1.3: they do not begin by constructing a sentry object. -Instead, they begin by calling widen ('\n'), which may throw -an exception. The exception is then allowed to propagate from -the unformatted input function irrespective of the setting of -exceptions(). -

-

-Note that in light of 27.6.1.1, p3 and p4, the fact that the -functions allow exceptions thrown from widen() to propagate -may not strictly speaking be a defect (but the fact that the -functions do not start by constructing a sentry object still -is). However, since an exception thrown from ctype<charT> -::widen() during any other input operation (say, from within -a call to num_get<charT>::get()) will be caught and cause -badbit to be set, these two functions should not be treated -differently for the sake of consistency. -

- - -

Proposed resolution:

- - -

Rationale:

-

-Not a defect. The standard is consistent, and the behavior required -by the standard is unambiguous. Yes, it's theoretically possible for -widen to throw. (Not that this will happen for the default ctype -facet or for most real-world replacement ctype facets.) Users who -define ctype facets that can throw, and who care about this behavior, -can use alternative signatures that don't call widen. -

- - - - - - -
-

429. typo in basic_ios::clear(iostate)

-

Section: 27.4.4.3 [iostate.flags] Status: Dup - Submitter: Martin Sebor Date: 2003-09-18

-

View all other issues in [iostate.flags].

-

View all issues with Dup status.

-

Duplicate of: 412

-

Discussion:

-

- -The Effects clause in 27.4.4.3, p5 describing the effects of a call to -the ios_base member function clear(iostate state) says that the function -only throws if the respective bits are already set prior to the function -call. That's obviously not the intent. If it was, a call to clear(badbit) -on an object for which (rdstate() == goodbit && exceptions() == badbit) -holds would not result in an exception being thrown. - -

- -

Proposed resolution:

-

- -The text ought to be changed from -
- -"If (rdstate() & exceptions()) == 0, returns. ..." -
- -to -
- -"If (state & exceptions()) == 0, returns. ..." -

- - -

Rationale:

- - - - - - -
-

433. Contradiction in specification of unexpected()

-

Section: 18.7.2.4 [unexpected] Status: NAD - Submitter: Vyatcheslav Sysoltsev Date: 2003-09-29

-

View all issues with NAD status.

-

Discussion:

-

-Clause 15.5.2 [except.unexpected] paragraph 1 says that "void unexpected(); -is called (18.7.2) immediately after completing the stack unwinding -for the former function", but 18.7.2.4 (Effects) says that "void -unexpected(); . . . Calls the unexpected_handler function in effect -immediately after evaluating the throwexpression (18.7.2.2),". Isn't -here a contradiction: 15.5.2 requires stack have been unwound when in -void unexpected() and therefore in unexpected_handler but 18.7.2.4 -claims that unexpected_handler is called "in effect immediately" after -evaluation of throw expression is finished, so there is no space left -for stack to be unwound therefore? I think the phrase "in effect -immediately" should be removed from the standard because it brings -ambiguity in understanding. -

- - -

Proposed resolution:

- - -

Rationale:

-

There is no contradiction. The phrase "in effect immediately" is - just to clarify which handler is to be called.

- - - - - -
-

437. Formatted output of function pointers is confusing

-

Section: 27.6.2.6.2 [ostream.inserters.arithmetic] Status: NAD - Submitter: Ivan Godard Date: 2003-10-24

-

View all other issues in [ostream.inserters.arithmetic].

-

View all issues with NAD status.

-

Discussion:

-

-Given: -

-
void f(int) {}
-void(*g)(int) = f;
-cout << g;
-
- -

-(with the expected #include and usings), the value printed is a rather -surprising "true". Rather useless too. -

- -

The standard defines:

- -
ostream& operator<<(ostream&, void*);
- -

which picks up all data pointers and prints their hex value, but does -not pick up function pointers because there is no default conversion -from function pointer to void*. Absent that, we fall back to legacy -conversions from C and the function pointer is converted to bool. -

- -

There should be an analogous inserter that prints the address of a - function pointer.

- - -

Proposed resolution:

- - -

Rationale:

-

This is indeed a wart, but there is no good way to solve it. C - doesn't provide a portable way of outputting the address of a - function point either.

- - - - - -
-

439. Should facets be copyable?

-

Section: 22.2 [locale.categories] Status: NAD - Submitter: Matt Austern Date: 2003-11-02

-

View other active issues in [locale.categories].

-

View all other issues in [locale.categories].

-

View all issues with NAD status.

-

Discussion:

-

The following facets classes have no copy constructors described in - the standard, which, according to the standard, means that they are - supposed to use the compiler-generated defaults. Default copy - behavior is probably inappropriate. We should either make these - classes uncopyable or else specify exactly what their constructors do.

- -

Related issue: 421.

- -
        ctype_base
-        ctype
-        ctype_byname
-        ctype<char>
-        ctype_byname<char>
-        codecvt_base
-        codecvt
-        codecvt_byname
-        num_get
-        num_put
-        numpunct
-        numpunct_byname
-        collate
-        collate_byname
-        time_base
-        time_get
-        time_get_byname
-        time_put
-        time_put_byname
-        money_get
-        money_put
-        money_base
-        moneypunct
-        moneypunct_byname
-        messages_base
-        messages
-        messages_byname
-
- - - -

Proposed resolution:

- - -

Rationale:

-

The copy constructor in the base class is private.

- - - - - -
-

440. Should std::complex use unqualified transcendentals?

-

Section: 26.3.8 [complex.transcendentals] Status: NAD - Submitter: Matt Austern Date: 2003-11-05

-

View all issues with NAD status.

-

Discussion:

-

-Operations like pow and exp on -complex<T> are typically implemented in terms of -operations like sin and cos on T. -Should implementations write this as std::sin, or as plain -unqualified sin? -

- -

The issue, of course, is whether we want to use -argument-dependent lookup in the case where T is a -user-defined type. This is similar to the issue of valarray -transcendentals, as discussed in issue 226.

- -

This issue differs from valarray transcendentals in two important -ways. First, "the effect of instantiating the template -complex for types other than float, double or long double is -unspecified." (26.3.1 [complex.synopsis]) Second, the standard does not -dictate implementation, so there is no guarantee that a particular -real math function is used in the implementation of a particular -complex function.

- - - -

Proposed resolution:

- - -

Rationale:

-

If you instantiate std::complex for user-defined types, all bets -are off.

- - - - - -
-

447. Wrong template argument for time facets

-

Section: 22.1.1.1.1 [locale.category] Status: Dup - Submitter: Pete Becker Date: 2003-12-26

-

View all other issues in [locale.category].

-

View all issues with Dup status.

-

Duplicate of: 327

-

Discussion:

-

-22.1.1.1.1/4, table 52, "Required Instantiations", lists, among others: -

-
    time_get<char,InputIterator>
-    time_get_byname<char,InputIterator>
-    time_get<wchar_t,OutputIterator>
-    time_get_byname<wchar_t,OutputIterator>
-
- -

-The second argument to the last two should be InputIterator, not -OutputIterator. -

- - -

Proposed resolution:

-

-Change the second template argument to InputIterator. -

- - -

Rationale:

- - - - - - -
-

450. set::find is inconsistent with associative container requirements

-

Section: 23.3.3 [set] Status: Dup - Submitter: Bill Plauger Date: 2004-01-30

-

View all other issues in [set].

-

View all issues with Dup status.

-

Duplicate of: 214

-

Discussion:

-

map/multimap have:

- -
	iterator find(const key_type& x) const;
-	const_iterator find(const key_type& x) const;
-
- -

-which is consistent with the table of associative container requirements. -But set/multiset have: -

-
	iterator find(const key_type&) const;
-
- -

-set/multiset should look like map/multimap, and honor the requirements -table, in this regard. -

- - -

Proposed resolution:

- - -

Rationale:

- - - - - - -
-

451. Associative erase should return an iterator

-

Section: 23.1.2 [associative.reqmts], 23.3 [associative] Status: Dup - Submitter: Bill Plauger Date: 2004-01-30

-

View all other issues in [associative.reqmts].

-

View all issues with Dup status.

-

Duplicate of: 130

-

Discussion:

-

map/multimap/set/multiset have:

-
	void erase(iterator);
-	void erase(iterator, iterator);
-
- -

But there's no good reason why these can't return an iterator, as for -vector/deque/list:

-
	iterator erase(iterator);
-	iterator erase(iterator, iterator);
-
- - - -

Proposed resolution:

-

-Informally: The table of associative container requirements, and the -relevant template classes, should return an iterator designating the -first element beyond the erased subrange. -

- - -

Rationale:

- - - - - - -
-

452. locale::combine should be permitted to generate a named locale

-

Section: 22.1.1.3 [locale.members] Status: NAD - Submitter: Bill Plauger Date: 2004-01-30

-

View all other issues in [locale.members].

-

View all issues with NAD status.

-

Discussion:

-
template<class Facet>
-	locale::combine(const locale&) const;
-
-

-is obliged to create a locale that has no name. This is overspecification -and overkill. The resulting locale should follow the usual rules -- it -has a name if the locale argument has a name and Facet is one of the -standard facets. -

- -

[ - Sydney and post-Sydney (see c++std-lib-13439, c++std-lib-13440, - c++std-lib-13443): agreed that it's overkill to say that the locale - is obligated to be nameless. However, we also can't require it to - have a name. At the moment, locale names are based on categories - and not on individual facets. If a locale contains two different - facets of different names from the same category, then this would - not fit into existing naming schemes. We need to give - implementations more freedom. Bill will provide wording. -]

- - - - -

Rationale:

-

After further discussion the LWG decided to close this as NAD. - The fundamental problem is that names right now are per-category, - not per-facet. The combine member function works at the - wrong level of granularity.

- - - - - -
-

463. auto_ptr usability issues

-

Section: D.9.1 [auto.ptr] Status: NAD - Submitter: Rani Sharoni Date: 2003-12-07

-

View all other issues in [auto.ptr].

-

View all issues with NAD status.

-

Discussion:

- -

-TC1 CWG DR #84 effectively made the template<class Y> operator auto_ptr<Y>() -member of auto_ptr (20.4.5.3/4) obsolete. -

- -

-The sole purpose of this obsolete conversion member is to enable copy -initialization base from r-value derived (or any convertible types like -cv-types) case: -

-
#include <memory>
-using std::auto_ptr;
-
-struct B {};
-struct D : B {};
-
-auto_ptr<D> source();
-int sink(auto_ptr<B>);
-int x1 = sink( source() ); // #1 EDG - no suitable copy constructor
-
- -

-The excellent analysis of conversion operations that was given in the final -auto_ptr proposal -(http://anubis.dkuug.dk/jtc1/sc22/wg21/docs/papers/1997/N1128.pdf) -explicitly specifies this case analysis (case 4). DR #84 makes the analysis -wrong and actually comes to forbid the loophole that was exploited by the -auto_ptr designers. -

- -

-I didn't encounter any compliant compiler (e.g. EDG, GCC, BCC and VC) that -ever allowed this case. This is probably because it requires 3 user defined -conversions and in fact current compilers conform to DR #84. -

- -

-I was surprised to discover that the obsolete conversion member actually has -negative impact of the copy initialization base from l-value derived -case:

-
auto_ptr<D> dp;
-int x2 = sink(dp); // #2 EDG - more than one user-defined conversion applies
-
- -

-I'm sure that the original intention was allowing this initialization using -the template<class Y> auto_ptr(auto_ptr<Y>& a) constructor (20.4.5.1/4) but -since in this copy initialization it's merely user defined conversion (UDC) -and the obsolete conversion member is UDC with the same rank (for the early -overloading stage) there is an ambiguity between them. -

- -

-Removing the obsolete member will have impact on code that explicitly -invokes it: -

-
int y = sink(source().operator auto_ptr<B>());
-
- -

-IMHO no one ever wrote such awkward code and the reasonable workaround for -#1 is: -

-
int y = sink( auto_ptr<B>(source()) );
-
- -

-I was even more surprised to find out that after removing the obsolete -conversion member the initialization was still ill-formed: -int x3 = sink(dp); // #3 EDG - no suitable copy constructor -

- -

-This copy initialization semantically requires copy constructor which means -that both template conversion constructor and the auto_ptr_ref conversion -member (20.4.5.3/3) are required which is what was explicitly forbidden in -DR #84. This is a bit amusing case in which removing ambiguity results with -no candidates. -

- -

-I also found exception safety issue with auto_ptr related to auto_ptr_ref: -

-
int f(auto_ptr<B>, std::string);
-auto_ptr<B> source2();
-
-// string constructor throws while auto_ptr_ref
-// "holds" the pointer
-int x4 = f(source2(), "xyz"); // #4
-
- -

-The theoretic execution sequence that will cause a leak: -

-
    -
  1. call auto_ptr<B>::operator auto_ptr_ref<B>()
  2. -
  3. call string::string(char const*) and throw
  4. -
- -

-According to 20.4.5.3/3 and 20.4.5/2 the auto_ptr_ref conversion member -returns auto_ptr_ref<Y> that holds *this and this is another defect since -the type of *this is auto_ptr<X> where X might be different from Y. Several -library vendors (e.g. SGI) implement auto_ptr_ref<Y> with Y* as member which -is much more reasonable. Other vendor implemented auto_ptr_ref as -defectively required and it results with awkward and catastrophic code: -int oops = sink(auto_ptr<B>(source())); // warning recursive on all control -paths -

- -

-Dave Abrahams noticed that there is no specification saying that -auto_ptr_ref copy constructor can't throw. -

- -

-My proposal comes to solve all the above issues and significantly simplify -auto_ptr implementation. One of the fundamental requirements from auto_ptr -is that it can be constructed in an intuitive manner (i.e. like ordinary -pointers) but with strict ownership semantics which yield that source -auto_ptr in initialization must be non-const. My idea is to add additional -constructor template with sole propose to generate ill-formed, diagnostic -required, instance for const auto_ptr arguments during instantiation of -declaration. This special constructor will not be instantiated for other -types which is achievable using 14.8.2/2 (SFINAE). Having this constructor -in hand makes the constructor template<class Y> auto_ptr(auto_ptr<Y> const&) -legitimate since the actual argument can't be const yet non const r-value -are acceptable. -

- -

-This implementation technique makes the "private auxiliary class" -auto_ptr_ref obsolete and I found out that modern C++ compilers (e.g. EDG, -GCC and VC) consume the new implementation as expected and allow all -intuitive initialization and assignment cases while rejecting illegal cases -that involve const auto_ptr arguments. -

- -

The proposed auto_ptr interface:

- -
namespace std {
-    template<class X> class auto_ptr {
-    public:
-        typedef X element_type;
-
-        // 20.4.5.1 construct/copy/destroy:
-        explicit auto_ptr(X* p=0) throw();
-        auto_ptr(auto_ptr&) throw();
-        template<class Y> auto_ptr(auto_ptr<Y> const&) throw();
-        auto_ptr& operator=(auto_ptr&) throw();
-        template<class Y> auto_ptr& operator=(auto_ptr<Y>) throw();
-        ~auto_ptr() throw();
-
-        // 20.4.5.2 members:
-        X& operator*() const throw();
-        X* operator->() const throw();
-        X* get() const throw();
-        X* release() throw();
-        void reset(X* p=0) throw();
-
-    private:
-        template<class U>
-        auto_ptr(U& rhs, typename
-unspecified_error_on_const_auto_ptr<U>::type = 0);
-    };
-}
-
- -

-One compliant technique to implement the unspecified_error_on_const_auto_ptr -helper class is using additional private auto_ptr member class template like -the following: -

-
template<typename T> struct unspecified_error_on_const_auto_ptr;
-
-template<typename T>
-struct unspecified_error_on_const_auto_ptr<auto_ptr<T> const>
-{ typedef typename auto_ptr<T>::const_auto_ptr_is_not_allowed type; };
-
- -

-There are other techniques to implement this helper class that might work -better for different compliers (i.e. better diagnostics) and therefore I -suggest defining its semantic behavior without mandating any specific -implementation. IMO, and I didn't found any compiler that thinks otherwise, -14.7.1/5 doesn't theoretically defeat the suggested technique but I suggest -verifying this with core language experts. -

- -

Further changes in standard text:

-

Remove section 20.4.5.3

- -

Change 20.4.5/2 to read something like: -Initializing auto_ptr<X> from const auto_ptr<Y> will result with unspecified -ill-formed declaration that will require unspecified diagnostic.

- -

Change 20.4.5.1/4,5,6 to read:

- -
template<class Y> auto_ptr(auto_ptr<Y> const& a) throw();
-

4 Requires: Y* can be implicitly converted to X*.

-

5 Effects: Calls const_cast<auto_ptr<Y>&>(a).release().

-

6 Postconditions: *this holds the pointer returned from a.release().

- -

Change 20.4.5.1/10

-
template<class Y> auto_ptr& operator=(auto_ptr<Y> a) throw();
-
-

-10 Requires: Y* can be implicitly converted to X*. The expression delete -get() is well formed. -

- -

LWG TC DR #127 is obsolete.

- -

-Notice that the copy constructor and copy assignment operator should remain -as before and accept non-const auto_ptr& since they have effect on the form -of the implicitly declared copy constructor and copy assignment operator of -class that contains auto_ptr as member per 12.8/5,10: -

-
struct X {
-    // implicit X(X&)
-    // implicit X& operator=(X&)
-    auto_ptr<D> aptr_;
-};
-
- -

-In most cases this indicates about sloppy programming but preserves the -current auto_ptr behavior. -

- -

-Dave Abrahams encouraged me to suggest fallback implementation in case that -my suggestion that involves removing of auto_ptr_ref will not be accepted. -In this case removing the obsolete conversion member to auto_ptr<Y> and -20.4.5.3/4,5 is still required in order to eliminate ambiguity in legal -cases. The two constructors that I suggested will co exist with the current -members but will make auto_ptr_ref obsolete in initialization contexts. -auto_ptr_ref will be effective in assignment contexts as suggested in DR -#127 and I can't see any serious exception safety issues in those cases -(although it's possible to synthesize such). auto_ptr_ref<X> semantics will -have to be revised to say that it strictly holds pointer of type X and not -reference to an auto_ptr for the favor of cases in which auto_ptr_ref<Y> is -constructed from auto_ptr<X> in which X is different from Y (i.e. assignment -from r-value derived to base). -

- - - -

Proposed resolution:

-

[Redmond: punt for the moment. We haven't decided yet whether we - want to fix auto_ptr for C++-0x, or remove it and replace it with - move_ptr and unique_ptr.]

- - - -

Rationale:

-

-Recommend NAD. We're just going to deprecate it. It still works for simple use cases -and people know how to deal with it. Going forward unique_ptr is the recommended -tool. -

- - - - - -
-

466. basic_string ctor should prevent null pointer error

-

Section: 21.3.1 [string.require] Status: NAD - Submitter: Daniel Frey Date: 2004-06-10

-

View all other issues in [string.require].

-

View all issues with NAD status.

-

Discussion:

-

-Today, my colleagues and me wasted a lot of time. After some time, I -found the problem. It could be reduced to the following short example: -

- -
  #include <string>
-  int main() { std::string( 0 ); }
-
- -

The problem is that the tested compilers (GCC 2.95.2, GCC 3.3.1 and -Comeau online) compile the above without errors or warnings! The -programs (at least for the GCC) resulted in a SEGV.

- -

I know that the standard explicitly states that the ctor of string -requires a char* which is not zero. STLs could easily detect the above -case with a private ctor for basic_string which takes a single 'int' -argument. This would catch the above code at compile time and would not -ambiguate any other legal ctors.

- -

[Redmond: No great enthusiasm for doing this. If we do, - however, we want to do it for all places that take charT* - pointers, not just the single-argument constructor. The other - question is whether we want to catch this at compile time (in which - case we catch the error of a literal 0, but not an expression whose - value is a null pointer), at run time, or both.]

- - - - -

Proposed resolution:

- - -

Rationale:

-

-Recommend NAD. Relegate this functionality to debugging implementations. -

- - - - - -
-

470. accessing containers from their elements' special functions

-

Section: 23 [containers] Status: NAD - Submitter: Martin Sebor Date: 2004-06-28

-

View all other issues in [containers].

-

View all issues with NAD status.

-

Discussion:

- -

-The standard doesn't prohibit the destructors (or any other special -functions) of containers' elements invoked from a member function -of the container from "recursively" calling the same (or any other) -member function on the same container object, potentially while the -container is in an intermediate state, or even changing the state -of the container object while it is being modified. This may result -in some surprising (i.e., undefined) behavior. -

- -

Read email thread starting with c++std-lib-13637 for more.

- - - -

Proposed resolution:

- -

Add to Container Requirements the following new paragraph:

- -
    Unless otherwise specified, the behavior of a program that
-    invokes a container member function f from a member function
-    g of the container's value_type on a container object c that
-    called g from its mutating member function h, is undefined.
-    I.e., if v is an element of c, directly or indirectly calling
-    c.h() from v.g() called from c.f(), is undefined.
-
- -

[Redmond: This is a real issue, but it's probably a clause 17 - issue, not clause 23. We get the same issue, for example, if we - try to destroy a stream from one of the stream's callback functions.]

- - - - -

Rationale:

-

-Recommend NAD. We agree this is an issue, but not a defect. -We believe that there is no wording we can put in the standard -that will cover all cases without introducing unfortunate -corner cases. -

- - - - - -
-

472. Missing "Returns" clause in std::equal_range

-

Section: 25.3.3.3 [equal.range] Status: Dup - Submitter: Prateek R Karandikar Date: 2004-06-30

-

View all other issues in [equal.range].

-

View all issues with Dup status.

-

Duplicate of: 270

-

Discussion:

-

-There is no "Returns:" clause for std::equal_range, which returns non-void. -

- - -

Proposed resolution:

- - -

Rationale:

-

Fixed as part of issue 270.

- - - - - - -
-

476. Forward Iterator implied mutability

-

Section: 24.1.3 [forward.iterators] Status: NAD - Submitter: Dave Abrahams Date: 2004-07-09

-

View all other issues in [forward.iterators].

-

View all issues with NAD status.

-

Discussion:

- -

24.1/3 says:

-

- Forward iterators satisfy all the requirements of the input and - output iterators and can be used whenever either kind is specified -

- -

-The problem is that satisfying the requirements of output iterator -means that you can always assign *something* into the result of -dereferencing it. That makes almost all non-mutable forward -iterators non-conforming. I think we need to sever the refinement -relationship between forward iterator and output iterator. -

- -

Related issue: 200. But this is not a dup.

- - - -

Proposed resolution:

- - -

Rationale:

-

Yes, 24.1/3 does say that. But it's introductory material. The -precise specification is in 24.1.3, and the requrements table there is -right. We don't need to fine-tune introductory wording. (Especially -since this wording is likely to be changed as part of the iterator -overhaul.)

- - - - - -
-

477. Operator-> for const forward iterators

-

Section: 24.1.3 [forward.iterators] Status: Dup - Submitter: Dave Abrahams Date: 2004-07-11

-

View all other issues in [forward.iterators].

-

View all issues with Dup status.

-

Duplicate of: 478

-

Discussion:

-

-The Forward Iterator requirements table contains the following: -

-
 expression  return type         operational  precondition
-                                  semantics
-  ==========  ==================  ===========  ==========================
-  a->m        U& if X is mutable, (*a).m       pre: (*a).m is well-defined.
-              otherwise const U&
-
-  r->m        U&                  (*r).m       pre: (*r).m is well-defined.
-
- -

-The first line is exactly right. The second line is wrong. Basically -it implies that the const-ness of the iterator affects the const-ness -of referenced members. But Paragraph 11 of [lib.iterator.requirements] says: -

- -

- In the following sections, a and b denote values of type const X, n - denotes a value of the difference type Distance, u, tmp, and m - denote identifiers, r denotes a value of X&, t denotes a value of - value type T, o denotes a value of some type that is writable to - the output iterator. -

- -

AFAICT if we need the second line at all, it should read the same -as the first line.

- -

Related issue: 478

- - -

Proposed resolution:

- - -

Rationale:

-

The LWG agrees that this is a real problem. Marked as a DUP - because the LWG chose to adopt the solution proposed in - 478. -

- - - - - -
-

479. Container requirements and placement new

-

Section: 23.1 [container.requirements] Status: Dup - Submitter: Herb Sutter Date: 2004-08-01

-

View other active issues in [container.requirements].

-

View all other issues in [container.requirements].

-

View all issues with Dup status.

-

Duplicate of: 580

-

Discussion:

-

Nothing in the standard appears to make this program ill-formed:

- -
  struct C {
-    void* operator new( size_t s ) { return ::operator new( s ); }
-    // NOTE: this hides in-place and nothrow new
-  };
-
-  int main() {
-    vector<C> v;
-    v.push_back( C() );
-  }
-
- -

Is that intentional? We should clarify whether or not we intended - to require containers to support types that define their own special - versions of operator new.

- -

[ -Lillehammer: A container will definitely never use this overridden -operator new, but whether it will fail to compile is unclear from the -standard. Are containers supposed to use qualified or unqualified -placement new? 20.4.1.1 is somewhat relevant, but the standard -doesn't make it completely clear whether containers have to use -Allocator::construct(). If containers don't use it, the details of how -containers use placement new are unspecified. That is the real bug, -but it needs to be fixed as part of the allocator overhaul. Weak -support that the eventual solution should make this code well formed. -]

- - - - -

Proposed resolution:

- - - - - - - -
-

480. unary_function and binary_function should have protected nonvirtual destructors

-

Section: 20.5.3 [base] Status: NAD - Submitter: Joe Gottman Date: 2004-08-19

-

View all other issues in [base].

-

View all issues with NAD status.

-

Discussion:

-

The classes std::unary_function and std::binary_function are both -designed to be inherited from but contain no virtual functions. This -makes it too easy for a novice programmer to write code like -binary_function<int, int, int> *p = new plus<int>; delete p;

- -

There are two common ways to prevent this source of undefined -behavior: give the base class a public virtual destructor, or give it -a protected nonvirtual destructor. Since unary_function and -binary_function have no other virtual functions, (note in particular -the absence of an operator()() ), it would cost too much to give them -public virtual destructors. Therefore, they should be given protected -nonvirtual destructors.

- - -

Proposed resolution:

-

Change Paragraph 20.3.1 of the Standard from

-
    template <class Arg, class Result>
-    struct unary_function {
-        typedef Arg argument_type;
-        typedef Result result_type;
-    };
-
-    template <class Arg1, class Arg2, class Result>
-    struct binary_function {
-        typedef Arg1 first_argument_type;
-        typedef Arg2 second_argument_type;
-        typedef Result result_type;
-    };
-
- -

to

-
    template <class Arg, class Result>
-        struct unary_function {
-        typedef Arg argument_type;
-        typedef Result result_type;
-    protected:
-        ~unary_function() {}
-    };
-
-    template <class Arg1, class Arg2, class Result>
-    struct binary_function {
-        typedef Arg1 first_argument_type;
-        typedef Arg2 second_argument_type;
-        typedef Result result_type;
-    protected:
-        ~binary_function() {}
-    };
-
- - -

Rationale:

-

The LWG doesn't believe the existing definition causes anybody any - concrete harm.

- - - - - -
-

481. unique's effects on the range [result, last)

-

Section: 25.2.9 [alg.unique] Status: NAD - Submitter: Andrew Koenig Date: 2004-08-30

-

View all other issues in [alg.unique].

-

View all issues with NAD status.

-

Discussion:

-

-The standard says that unique(first, last) "eliminates all but the -first element from every consecutive group of equal elements" in -[first, last) and returns "the end of the resulting range". So a -postcondition is that [first, result) is the same as the old [first, -last) except that duplicates have been eliminated. -

- -

What postconditions are there on the range [result, last)? One - might argue that the standard says nothing about those values, so - they can be anything. One might also argue that the standard - doesn't permit those values to be changed, so they must not be. - Should the standard say something explicit one way or the other?

- - - -

Proposed resolution:

-

-

- - -

Rationale:

-

We don't want to make many guarantees about what's in [result, -end). Maybe we aren't being quite explicit enough about not being -explicit, but it's hard to think that's a major problem.

- - - - - -
-

482. Swapping pairs

-

Section: 20.2.3 [pairs], 20.3 [tuple] Status: NAD Editorial - Submitter: Andrew Koenig Date: 2004-09-14

-

View all other issues in [pairs].

-

View all issues with NAD Editorial status.

-

Discussion:

-

(Based on recent comp.std.c++ discussion)

- -

Pair (and tuple) should specialize std::swap to work in terms of -std::swap on their components. For example, there's no obvious reason -why swapping two objects of type pair<vector<int>, -list<double> > should not take O(1).

- -

[Lillehammer: We agree it should be swappable. Howard will - provide wording.]

- - -

[ -Post Oxford: We got swap for pair but accidently -missed tuple. tuple::swap is being tracked by 522. -]

- - - - -

Proposed resolution:

-

-Wording provided in -N1856. -

- -

Rationale:

-

-Recommend NAD, fixed by -N1856. -

- - - - - -
-

483. Heterogeneous equality and EqualityComparable

-

Section: 25.1 [alg.nonmodifying], 25.2 [alg.modifying.operations] Status: Dup - Submitter: Peter Dimov Date: 2004-09-20

-

View all issues with Dup status.

-

Duplicate of: 283

-

Discussion:

-

c++std-lib-14262

- -

[lib.alg.find] requires T to be EqualityComparable:

- -
template <class InputIterator, class T>
-   InputIterator find(InputIterator first, InputIterator last,
-                      const T& value);
-
- -

-However the condition being tested, as specified in the Effects -clause, is actually *i == value, where i is an InputIterator. -

- -

-The two clauses are in agreement only if the type of *i is T, but this -isn't necessarily the case. *i may have a heterogeneous comparison -operator that takes a T, or a T may be convertible to the type of *i. -

- -

Further discussion (c++std-lib-14264): this problem affects a - number of algorithsm in clause 25, not just find. We - should try to resolve this problem everywhere it appears.

- - -

Proposed resolution:

- -

[lib.alg.find]:

-

- Remove [lib.alg.find]/1. -

- -

[lib.alg.count]:

-

- Remove [lib.alg.count]/1. -

- -

[lib.alg.search]:

-

- Remove "Type T is EqualityComparable (20.1.1), " from [lib.alg.search]/4. -

- -

[lib.alg.replace]:

- -
-

- Remove [lib.alg.replace]/1. - Replace [lb.alg.replace]/2 with: -

- -

- For every iterator i in the range [first, last) for which *i == value - or pred(*i) holds perform *i = new_value. -

- -

- Remove the first sentence of /4. - Replace the beginning of /5 with: -

- -

- For every iterator i in the range [result, result + (last - - first)), assign to *i either... -

- -

(Note the defect here, current text says assign to i, not *i).

-
- -

[lib.alg.fill]:

- -
-

- Remove "Type T is Assignable (23.1), " from /1. - Replace /2 with: -

- -

- For every iterator i in the range [first, last) or [first, first + n), - perform *i = value. -

-
- -

[lib.alg.remove]:

-

- Remove /1. - Remove the first sentence of /6. -

- - - -

Rationale:

-

Duplicate of (a subset of) issue 283.

- - - - - - -
-

486. min/max CopyConstructible requirement is too strict

-

Section: 25.3.7 [alg.min.max] Status: Dup - Submitter: Dave Abrahams Date: 2004-10-13

-

View all other issues in [alg.min.max].

-

View all issues with Dup status.

-

Duplicate of: 281

-

Discussion:

-

A straightforward implementation of these algorithms does not need to -copy T.

- - -

Proposed resolution:

-

drop the the words "and CopyConstructible" from paragraphs 1 and 4

- - -

Rationale:

- - - - - - -
-

487. Allocator::construct is too limiting

-

Section: 20.1.2 [allocator.requirements] Status: NAD - Submitter: Dhruv Matani Date: 2004-10-17

-

View other active issues in [allocator.requirements].

-

View all other issues in [allocator.requirements].

-

View all issues with NAD status.

-

Discussion:

-

-The standard's version of allocator::construct(pointer, -const_reference) severely limits what you can construct using this -function. Say you can construct a socket from a file descriptor. Now, -using this syntax, I first have to manually construct a socket from -the fd, and then pass the constructed socket to the construct() -function so it will just to an uninitialized copy of the socket I -manually constructed. Now it may not always be possible to copy -construct a socket eh! So, I feel that the changes should go in the -allocator::construct(), making it: -

-
    template<typename T>
-    struct allocator{
-      template<typename T1>
-      void construct(pointer T1 const& rt1);
-    };
-
- -

-Now, the ctor of the class T which matches the one that takes a T1 can -be called! Doesn't that sound great? -

- - -

Proposed resolution:

- - -

Rationale:

-

NAD. STL uses copying all the time, and making it possible for - allocators to construct noncopyable objects is useless in the - absence of corresponding container changes. We might consider this - as part of a larger redesign of STL.

- - - - - -
-

489. std::remove / std::remove_if wrongly specified

-

Section: 25.2.8 [alg.remove] Status: NAD - Submitter: Thomas Mang Date: 2004-12-12

-

View all other issues in [alg.remove].

-

View all issues with NAD status.

-

Discussion:

-

In Section 25.2.7 [lib.alg.remove], paragraphs 1 to 5 describe the -behavior of the mutating sequence operations std::remove and -std::remove_if. However, the wording does not reflect the intended -behavior [Note: See definition of intended behavior below] of these -algorithms, as it is known to the C++ community [1]. -

- - - -

1) Analysis of current wording:

- - -

25.2.7 [lib.alg.remove], paragraph 2:

- -

Current wording says: -"Effects: Eliminates all the elements referred to by iterator i in the -range [first, last) for which the following corresponding conditions -hold: *i == value, pred(*i) != false."

- -

-This sentences expresses specifically that all elements denoted by the -(original) range [first, last) for which the corresponding condition -hold will be eliminated. Since there is no formal definition of the term -"eliminate" provided, the meaning of "eliminate" in everyday language -implies that as postcondition, no element in the range denoted by -[first, last) will hold the corresponding condition on reiteration over -the range [first, last). -

- -

-However, this is neither the intent [Note: See definition of intended -behavior below] nor a general possible approach. It can be easily proven -that if all elements of the original range[first, last) will hold the -condition, it is not possible to substitute them by an element for which -the condition will not hold. -

- - -

25.2.7 [lib.alg.remove], paragraph 3:

- -

-Current wording says: -"Returns: The end of the resulting range." -

- -

-The resulting range is not specified. In combination with 25.2.7 -[lib.alg.remove], paragraph 2, the only reasonable interpretation of -this so-called resulting range is the range [first,last) - thus -returning always the ForwardIterator 'last' parameter. -

- - -

-25.2.7 [lib.alg.remove], paragraph 4: -

- -

-Current wording says: -"Notes: Stable: the relative order of the elements that are not removed -is the same as their relative order in the original range" -

- -

-This sentences makes use of the term "removed", which is neither -specified, nor used in a previous paragraph (which uses the term -"eliminate"), nor unamgiuously separated from the name of the algorithm. -

- - -

2) Description of intended behavior:

- -

-For the rest of this Defect Report, it is assumed that the intended -behavior was that all elements of the range [first, last) which do not -hold the condition *i == value (std::remove) or pred(*i) != false -(std::remove_if)], call them s-elements [Note: s...stay], will be placed -into a contiguous subrange of [first, last), denoted by the iterators -[first, return value). The number of elements in the resulting range -[first, return value) shall be equal to the number of s-elements in the -original range [first, last). The relative order of the elements in the -resulting subrange[first, return value) shall be the same as the -relative order of the corresponding elements in the original range. It -is undefined whether any elements in the resulting subrange [return -value, last) will hold the corresponding condition, or not. -

- -

-All implementations known to the author of this Defect Report comply -with this intent. Since the intent of the behavior (contrary to the -current wording) is also described in various utility references serving -the C++ community [1], it is not expected that fixing the paragraphs -will influence current code - unless the code relies on the behavior as -it is described by current wording and the implementation indeed -reflects the current wording, and not the intent. -

- - - -

3) Proposed fixes:

- - -

Change 25.2.7 [lib.alg.remove], paragraph 2 to:

- -

-"Effect: Places all the elements referred to by iterator i in the range -[first, last) for which the following corresponding conditions hold : -!(*i == value), pred(*i) == false into the subrange [first, k) of the -original range, where k shall denote a value of type ForwardIterator. It -is undefined whether any elements in the resulting subrange [k, last) -will hold the corresponding condition, or not." -

- -

Comments to the new wording:

- -

-a) "Places" has no special meaning, and the everyday language meaning -should fit. -b) The corresponding conditions were negated compared to the current -wording, becaue the new wording requires it. -c) The wording "of the original range" might be redundant, since any -subrange starting at 'first' and containing no more elements than the -original range is implicitly a subrange of the original range [first, -last). -d) The iterator k was introduced instead of "return value" in order to -avoid a cyclic dependency on 25.2.7/3. The wording ", where k shall -denote a value of type ForwardIterator" might be redundant, because it -follows implicitly by 25.2.7/3. -e) "Places" does, in the author's opinion, explicitly forbid duplicating -any element holding the corresponding condition in the original range -[first, last) within the resulting range [first, k). If there is doubt -this term might be not unambiguous regarding this, it is suggested that -k is specified more closely by the following wording: "k shall denote a -value of type ForwardIterator [Note: see d)] so that k - first is equal -to the number of elements in the original range [first, last) for which -the corresponding condition did hold". This could also be expressed as a -separate paragraph "Postcondition:" -f) The senctence "It is undefined whether any elements in the resulting -subrange [k, last) will hold the corresponding condition, or not." was -added consciously so the term "Places" does not imply if the original -range [first, last) contains n elements holding the corresponding -condition, the identical range[first, last) will also contain exactly n -elements holding the corresponding condition after application of the -algorithm. -

- -

-Change 25.2.7 [lib.alg.remove], paragraph 3 to: - -"Returns: The iterator k." -

- -

-Change 25.2.7 [lib.alg.remove], paragraph 4 to: - -"Notes: Stable: the relative order of the elements that are placed into -the subrange [first, return value) shall be the same as their relative -order was in the original range [first, last) prior to application of -the algorithm." -

- -

-Comments to the new wording: -

- -

-a) the wording "was ... prior to application of the algorithm" is used -to explicitly distinguish the original range not only by means of -iterators, but also by a 'chronological' factor from the resulting range -[first, return value). It might be redundant. -

- -

-[1]: -The wording of these references is not always unambiguous, and provided -examples partially contradict verbal description of the algorithms, -because the verbal description resembles the problematic wording of -ISO/IEC 14882:2003. -

- - -

Proposed resolution:

- - -

Rationale:

-

The LWG believes that the standard is sufficiently clear, and that - there is no evidence of any real-world confusion about this point.

- - - - - -
-

490. std::unique wrongly specified

-

Section: 25.2.9 [alg.unique] Status: NAD - Submitter: Thomas Mang Date: 2004-12-12

-

View all other issues in [alg.unique].

-

View all issues with NAD status.

-

Discussion:

-

In Section 25.2.8 [lib.alg.unique], paragraphs 1 to 3 describe the -behavior of the mutating sequence operation std::unique. However, the -wording does not reflect the intended behavior [Note: See definition of -intended behavior below] of these algorithms, as it is known to the C++ -community [1].

- - - -

1) Analysis of current wording:

- - -

25.2.8 [lib.alg.unique], paragraph 1:

- -

-Current wording says: -"Effects: Eliminates all but the first element from every consecutive -group of equal elements referred to by the iterator i in the range -[first, last) for which the following corresponding conditions hold: *i -== *(i - 1) or pred(*i, *(i -1)) != false" -

- -

-This sentences expresses specifically that all elements denoted by the -(original) range [first, last) which are not but the first element from -a consecutive group of equal elements (where equality is defined as *i -== *(i - 1) or pred(*i, *(i - 1)) ! = false) [Note: See DR 202], call -them r-elements [Note: r...remove], will be eliminated. Since there is -no formal definition of the term "eliminate" provided, it is undefined -how this "elimination" takes place. But the meaning of "eliminate" in -everyday language seems to disallow explicitly that after application of -the algorithm, any r-element will remain at any position of the range -[first, last) [2]. -

- -

-Another defect in the current wording concerns the iterators used to -compare two elements for equality: The current wording contains the -expression "(i - 1)", which is not covered by 25/9 [Note: See DR -submitted by Thomas Mang regarding invalid iterator arithmetic -expressions]. -

- - -

-25.2.8 [lib.alg.unique], paragraph 2: -

-

Current wording says: -"Returns: The end of the resulting range."

- -

-The resulting range is not specified. In combination with 25.2.8 -[lib.alg.unique], paragraph 1, one reasonable interpretation (in the -author's opinion even the only possible interpretation) of this -so-called resulting range is the range [first, last) - thus returning -always the ForwardIterator 'last' parameter. -

- -

2) Description of intended behavior:

- -

-For the rest of this Defect Report, it is assumed that the intended -behavior was that all elements denoted by the original range [first, -last) which are the first element from a consecutive group of elements -for which the corresponding conditions: *(i-1) == *i (for the version of -unique without a predicate argument) or pred(*(i-1), *i) ! = false (for -the version of unique with a predicate argument) [Note: If such a group -of elements consists of only a single element, this is also considered -the first element] [Note: See resolutions of DR 202], call them -s-elements [Note: s...stay], will be placed into a contiguous subrange -of [first, last), denoted by the iterators [first, return value). The -number of elements in the resulting range [first, return value) shall be -equal to the number of s-elements in the original range [first, last). -Invalid iterator arithmetic expressions are expected to be resolved as -proposed in DR submitted by Thomas Mang regarding invalid iterator -arithmetic expressions. It is also assumed by the author that the -relative order of the elements in the resulting subrange [first, return -value) shall be the same as the relative order of the corresponding -elements (the s-elements) in the original range [Note: If this was not -intended behavior, the additional proposed paragraph about stable order -will certainly become obsolete]. -Furthermore, the resolutions of DR 202 are partially considered. -

- -

-All implementations known to the author of this Defect Report comply -with this intent [Note: Except possible effects of DR 202]. Since this -intent of the behavior (contrary to the current wording) is also -described in various utility references serving the C++ community [1], -it is not expected that fixing the paragraphs will influence current -code [Note: Except possible effects of DR 202] - unless the code relies -on the behavior as it is described by current wording and the -implementation indeed reflects the current wording, and not the intent. -

- - - -

3) Proposed fixes:

- -

-Change 25.2.8 [lib.alg.unique], paragraph 1 to: -

- -

-"Effect: Places the first element from every consecutive group of -elements, referred to by the iterator i in the range [first, last), for -which the following conditions hold: *(i-1) == *i (for the version of -unique without a predicate argument) or pred(*(i -1), *i) != false (for -the version of unique with a predicate argument), into the subrange -[first, k) of the original range, where k shall denote a value of type -ForwardIterator." -

- -

Comments to the new wording:

- -

-a) The new wording was influenced by the resolutions of DR 202. If DR -202 is resolved in another way, the proposed wording need also -additional review. -b) "Places" has no special meaning, and the everyday language meaning -should fit. -c) The expression "(i - 1)" was left, but is expected that DR submitted -by Thomas Mang regarding invalid iterator arithmetic expressions will -take this into account. -d) The wording "(for the version of unique without a predicate -argument)" and "(for the version of unique with a predicate argument)" -was added consciously for clarity and is in resemblence with current -23.2.2.4 [lib.list.ops], paragraph 19. It might be considered redundant. -e) The wording "of the original range" might be redundant, since any -subrange starting at first and containing no more elements than the -original range is implicitly a subrange of the original range [first, -last). -f) The iterator k was introduced instead of "return value" in order to -avoid a cyclic dependency on 25.2.8 [lib.alg.unique], paragraph 2. The -wording ", where k shall denote a value of type ForwardIterator" might -be redundant, because it follows implicitly by 25.2.8 [lib.alg.unique], -paragraph 2. -g) "Places" does, in the author's opinion, explicitly forbid duplicating -any s-element in the original range [first, last) within the resulting -range [first, k). If there is doubt this term might be not unambiguous -regarding this, it is suggested that k is specified more closely by the -following wording: "k shall denote a value of type ForwardIterator -[Note: See f)] so that k - first is equal to the number of elements in -the original range [first, last) being the first element from every -consecutive group of elements for which the corresponding condition did -hold". This could also be expressed as a separate paragraph -"Postcondition:". -h) If it is considered that the wording is unclear whether it declares -the element of a group which consists of only a single element -implicitly to be the first element of this group [Note: Such an -interpretation could eventually arise especially in case last - first == -1] , the following additional sentence is proposed: "If such a group of -elements consists of only a single element, this element is also -considered the first element." -

- -

-Change 25.2.8 [lib.alg.unique], paragraph 2 to: -"Returns: The iterator k." -

- -

-Add a separate paragraph "Notes:" as 25.2.8 [lib.alg.unique], paragraph -2a or 3a, or a separate paragraph "Postcondition:" before 25.2.8 -[lib.alg.unique], paragraph 2 (wording inside {} shall be eliminated if -the preceding expressions are used, or the preceding expressions shall -be eliminated if wording inside {} is used): -

- -

-"Notes:{Postcondition:} Stable: the relative order of the elements that -are placed into the subrange [first, return value {k}) shall be the same -as their relative order was in the original range [first, last) prior to -application of the algorithm." -

- -

Comments to the new wording:

- -

-a) It is assumed by the author that the algorithm was intended to be -stable. -In case this was not the intent, this paragraph becomes certainly -obsolete. -b) The wording "was ... prior to application of the algorithm" is used -to explicitly distinguish the original range not only by means of -iterators, but also by a 'chronological' factor from the resulting range -[first, return value). It might be redundant. -

- -

-25.2.8 [lib.alg.unique], paragraph 3: -

-

See DR 239.

- -

-4) References to other DRs: -

- -

-See DR 202, but which does not address any of the problems described in -this Defect Report [Note: This DR is supposed to complement DR 202]. -See DR 239. -See DR submitted by Thomas Mang regarding invalid iterator arithmetic -expressions. -

- -

-[1]: -The wording of these references is not always unambiguous, and provided -examples partially contradict verbal description of the algorithms, -because the verbal description resembles the problematic wording of -ISO/IEC 14882:2003. -

- -

-[2]: -Illustration of conforming implementations according to current wording: -

- -

-One way the author of this DR considers how this "elimination" could be -achieved by a conforming implementation according to current wording is -by substituting each r-element by _any_ s-element [Note: s...stay; any -non-r-element], since all r-elements are "eliminated". -

- -

-In case of a sequence consisting of elements being all 'equal' [Note: -See DR 202], substituting each r-element by the single s-element is the -only possible solution according to current wording. -

- - -

Proposed resolution:

- - -

Rationale:

-

The LWG believes the standard is sufficiently clear. No -implementers get it wrong, and changing it wouldn't cause any code to -change, so there is no real-world harm here.

- - - - - -
-

491. std::list<>::unique incorrectly specified

-

Section: 23.2.3.4 [list.ops] Status: NAD - Submitter: Thomas Mang Date: 2004-12-12

-

View all other issues in [list.ops].

-

View all issues with NAD status.

-

Discussion:

-

In Section 23.2.3.4 [list.ops], paragraphs 19 to 21 describe the -behavior of the std::list<T, Allocator>::unique operation. However, the -current wording is defective for various reasons.

- - - -

-1) Analysis of current wording: -

- -

23.2.3.4 [list.ops], paragraph 19:

- -

-Current wording says: -"Effects: Eliminates all but the first element from every consecutive -group of equal elements referred to by the iterator i in the range -[first + 1, last) for which *i == *(i - 1) (for the version of unique -with no argument) or pred(*i, *(i -1)) (for the version of unique with a -predicate argument) holds."

- -

-This sentences makes use of the undefined term "Eliminates". Although it -is, to a certain degree, reasonable to consider the term "eliminate" -synonymous with "erase", using "Erase" in the first place, as the -wording of 23.2.3.4 [list.ops], paragraph 15 does, would be clearer.

- -

-The range of the elements referred to by iterator i is "[first + 1, -last)". However, neither "first" nor "last" is defined.

- -

-The sentence makes three times use of iterator arithmetic expressions ( -"first + 1", "*i == *(i - 1)", "pred(*i, *(i -1))" ) which is not -defined for bidirectional iterator [see DR submitted by Thomas Mang -regarding invalid iterator arithmetic expressions].

- -

-The same problems as pointed out in DR 202 (equivalence relation / order -of arguments for pred()) apply to this paragraph.

- -

-23.2.3.4 [list.ops], paragraph 20: -

- -

-Current wording says: -"Throws: Nothing unless an exception in thrown by *i == *(i-1) or -pred(*i, *(i - 1))"

- -

-The sentence makes two times use of invalid iterator arithmetic -expressions ( "*i == *(i - 1)", "pred(*i, *(i -1))" ). -

-

-[Note: Minor typos: "in" / missing dot at end of sentence.] -

- -

-23.2.3.4 [list.ops], paragraph 21:

- -

-Current wording says: -"Complexity: If the range (last - first) is not empty, exactly (last - -first) - 1 applications of the corresponding predicate, otherwise no -application of the predicate.

- -

-See DR 315 regarding "(last - first)" not yielding a range.

- -

-Invalid iterator arithmetic expression "(last - first) - 1" left .

- - -

2) Description of intended behavior:

- -

-For the rest of this Defect Report, it is assumed that "eliminate" is -supposed to be synonymous to "erase", that "first" is equivalent to an -iterator obtained by a call to begin(), "last" is equivalent to an -iterator obtained by a call to end(), and that all invalid iterator -arithmetic expressions are resolved as described in DR submitted by -Thomas Mang regarding invalid iterator arithmetic expressions.

- -

-Furthermore, the resolutions of DR 202 are considered regarding -equivalence relation and order of arguments for a call to pred.

- -

-All implementations known to the author of this Defect Report comply -with these assumptions, apart from the impact of the alternative -resolution of DR 202. Except for the changes implied by the resolutions -of DR 202, no impact on current code is expected.

- -

-3) Proposed fixes:

- -

-Change 23.2.3.4 [list.ops], paragraph 19 to:

- -

-"Effect: Erases all but the first element from every consecutive group -of elements, referred to by the iterator i in the range [begin(), -end()), for which the following conditions hold: *(i-1) == *i (for the -version of unique with no argument) or pred(*(i-1), *i) != false (for -the version of unique with a predicate argument)."

- -

-Comments to the new wording:

- -

-a) The new wording was influenced by DR 202 and the resolutions -presented there. If DR 202 is resolved in another way, the proposed -wording need also additional review. -b) "Erases" refers in the author's opinion unambiguously to the member -function "erase". In case there is doubt this might not be unamgibuous, -a direct reference to the member function "erase" is suggested [Note: -This would also imply a change of 23.2.3.4 [list.ops], paragraph -15.]. -c) The expression "(i - 1)" was left, but is expected that DR submitted -by Thomas Mang regarding invalid iterator arithmetic expressions will -take this into account. -d) The wording "(for the version of unique with no argument)" and "(for -the version of unique with a predicate argument)" was kept consciously -for clarity. -e) "begin()" substitutes "first", and "end()" substitutes "last". The -range need adjustment from "[first + 1, last)" to "[begin(), end())" to -ensure a valid range in case of an empty list. -f) If it is considered that the wording is unclear whether it declares -the element of a group which consists of only a single element -implicitly to be the first element of this group [Note: Such an -interpretation could eventually arise especially in case size() == 1] , -the following additional sentence is proposed: "If such a group of -elements consists of only a single element, this element is also -considered the first element."

- -

-Change 23.2.3.4 [list.ops], paragraph 20 to:

- -

-"Throws: Nothing unless an exception is thrown by *(i-1) == *i or -pred(*(i-1), *i)."

- -

-Comments to the new wording:

- -

-a) The wording regarding the conditions is identical to proposed -23.2.3.4 [list.ops], paragraph 19. If 23.2.3.4 [list.ops], -paragraph 19 is resolved in another way, the proposed wording need also -additional review. -b) The expression "(i - 1)" was left, but is expected that DR submitted -by Thomas Mang regarding invalid iterator arithmetic expressions will -take this into account. -c) Typos fixed.

- -

-Change 23.2.3.4 [list.ops], paragraph 21 to:

- -

-"Complexity: If empty() == false, exactly size() - 1 applications of the -corresponding predicate, otherwise no applications of the corresponding -predicate."

- -

-Comments to the new wording:

- -

-a) The new wording is supposed to also replace the proposed resolution -of DR 315, which suffers from the problem of undefined "first" / "last". -

- -

-5) References to other DRs:

- -

See DR 202. -See DR 239. -See DR 315. -See DR submitted by Thomas Mang regarding invalid iterator arithmetic -expressions.

- - - -

Proposed resolution:

- - -

Rationale:

-

"All implementations known to the author of this Defect Report -comply with these assumption", and "no impact on current code is -expected", i.e. there is no evidence of real-world confusion or -harm.

- - - - - -
-

493. Undefined Expression in Input Iterator Note Title

-

Section: 24.1.1 [input.iterators] Status: NAD - Submitter: Chris Jefferson Date: 2004-12-13

-

View all other issues in [input.iterators].

-

View all issues with NAD status.

-

Discussion:

-

1) In 24.1.1/3, the following text is currently present.

- -

"Note: For input iterators, a==b does not imply ++a=++b (Equality does -not guarantee the substitution property or referential transparency)."

- -

However, when in Table 72, part of the definition of ++r is given as:

- -

"pre: r is dereferenceable. -post: any copies of the previous value of r are no longer required -either to be dereferenceable ..."

- -

While a==b does not imply that b is a copy of a, this statement should -perhaps still be made more clear.

- -

2) There are no changes to intended behaviour

- -

-3) This Note should be altered to say "Note: For input iterators a==b, -when its behaviour is defined ++a==++b may still be false (Equality does -not guarantee the substitution property or referential transparency).

- - - -

Proposed resolution:

- - -

Rationale:

-

This is descriptive text, not normative, and the meaning is clear.

- - - - - -
-

494. Wrong runtime complexity for associative container's insert and delete

-

Section: 23.1.2 [associative.reqmts] Status: NAD - Submitter: Hans B os Date: 2004-12-19

-

View all other issues in [associative.reqmts].

-

View all issues with NAD status.

-

Discussion:

-

According to [lib.associative.reqmts] table 69, the runtime comlexity -of insert(p, t) and erase(q) can be done in amortized constant time.

- -

It was my understanding that an associative container could be -implemented as a balanced binary tree.

- -

For inser(p, t), you 'll have to iterate to p's next node to see if t -can be placed next to p. Furthermore, the insertion usually takes -place at leaf nodes. An insert next to the root node will be done at -the left of the root next node

- -

So when p is the root node you 'll have to iterate from the root to -its next node, which takes O(log(size)) time in a balanced tree.

- -

If you insert all values with insert(root, t) (where root is the -root of the tree before insertion) then each insert takes O(log(size)) -time. The amortized complexity per insertion will be O(log(size)) -also.

- -

For erase(q), the normal algorithm for deleting a node that has no -empty left or right subtree, is to iterate to the next (or previous), -which is a leaf node. Then exchange the node with the next and delete -the leaf node. Furthermore according to DR 130, erase should return -the next node of the node erased. Thus erasing the root node, -requires iterating to the next node.

- -

Now if you empty a map by deleting the root node until the map is -empty, each operation will take O(log(size)), and the amortized -complexity is still O(log(size)).

- -

The operations can be done in amortized constant time if iterating -to the next node can be done in (non amortized) constant time. This -can be done by putting all nodes in a double linked list. This -requires two extra links per node. To me this is a bit overkill since -you can already efficiently insert or erase ranges with erase(first, -last) and insert(first, last).

- - - -

Proposed resolution:

- - -

Rationale:

-

Only "amortized constant" in special circumstances, and we believe - that's implementable. That is: doing this N times will be O(N), not - O(log N).

- - - - - -
-

499. Std. doesn't seem to require stable_sort() to be stable!

-

Section: 25.3.1.2 [stable.sort] Status: NAD Editorial - Submitter: Prateek Karandikar Date: 2005-04-12

-

View all issues with NAD Editorial status.

-

Discussion:

-

-17.3.1.1 Summary

- -

-1 The Summary provides a synopsis of the category, and introduces the -first-level subclauses. Each subclause also provides a summary, listing -the headers specified in the subclause and the library entities -provided in each header. -

-

-2 Paragraphs labelled "Note(s):" or "Example(s):" are informative, -other paragraphs are normative. -

- -

So this means that a "Notes" paragraph wouldn't be normative.

- -

-25.3.1.2 stable_sort -

-
template<class RandomAccessIterator> 
-void stable_sort(RandomAccessIterat or first, RandomAccessIterator last); 
-
-template<class RandomAccessIterator, class Compare> 
-void stable_sort(RandomAccessIterat or first, RandomAccessIterator last, Compare comp);
-
-

-1 Effects: Sorts the elements in the range [first, last). -

-

-2 Complexity: It does at most N(log N)^2 (where N == last - first) -comparisons; if enough extra memory is available, it is N log N. -

-

-3 Notes: Stable: the relative order of the equivalent elements is -preserved. -

- -

-The Notes para is informative, and nowhere else is stability mentioned above. -

- -

-Also, I just searched for the word "stable" in my copy of the Standard. -and the phrase "Notes: Stable: the relative order of the elements..." -is repeated several times in the Standard library clauses for -describing various functions. How is it that stability is talked about -in the informative paragraph? Or am I missing something obvious? -

- - -

Proposed resolution:

-

-

- - -

Rationale:

-

-This change has already been made. -

- - - - - -
-

500. do_length cannot be implemented correctly

-

Section: 22.2.1.5 [locale.codecvt.byname] Status: NAD - Submitter: Krzysztof Żelechowski Date: 2005-05-24

-

View all other issues in [locale.codecvt.byname].

-

View all issues with NAD status.

-

Discussion:

-
    -
  1. codecvt::do_length is of type int;
  2. -
  3. it is assumed to be sort-of returning from_next - from of type ptrdiff_t;
  4. -
  5. ptrdiff_t cannot be cast to an int without data loss.
  6. -
-

-Contradiction. -

- - -

Proposed resolution:

-

-

- - - - - -
-

501. Proposal: strengthen guarantees of lib.comparisons

-

Section: 20.5.3 [base] Status: NAD - Submitter: Me <anti_spam_email2003@yahoo.com> Date: 2005-06-07

-

View all other issues in [base].

-

View all issues with NAD status.

-

Discussion:

-

-"For templates greater, less, greater_equal, and less_equal, -the specializations for any pointer type yield a total order, even if -the built-in operators <, >, <=, >= do not." -

- -

-The standard should do much better than guarantee that these provide a -total order, it should guarantee that it can be used to test if memory -overlaps, i.e. write a portable memmove. You can imagine a platform -where the built-in operators use a uint32_t comparison (this tests for -overlap on this platform) but the less<T*> functor is allowed to be -defined to use a int32_t comparison. On this platform, if you use -std::less with the intent of making a portable memmove, comparison on -an array that straddles the 0x7FFFFFFF/0x8000000 boundary can give -incorrect results. -

- - -

Proposed resolution:

-

-Add a footnote to 20.5.3/8 saying: -

- -

-Given a p1 and p2 such that p1 points to N objects of type T and p2 -points to M objects of type T. If [p1,p1+N) does not overlap [p2,p2+M), -less returns the same value when comparing all pointers in [p1,p1+N) to -all pointers in [p2,p2+M). Otherwise, there is a value Q and a value R -such that less returns the same value when comparing all pointers in -[p1,p1+Q) to all pointers in [p2,p2+R) and an opposite value when -comparing all pointers in [p1+Q,p1+N) to all pointers in [p2+R,p2+M). -For the sake of completeness, the null pointer value (4.10) for T is -considered to be an array of 1 object that doesn't overlap with any -non-null pointer to T. less_equal, greater, greater_equal, equal_to, -and not_equal_to give the expected results based on the total ordering -semantics of less. For T of void, treat it as having similar semantics -as T of char i.e. less<cv T*>(a, b) gives the same results as less<cv -void*>(a, b) which gives the same results as less<cv char*>((cv -char*)(cv void*)a, (cv char*)(cv void*)b). -

- -

-I'm also thinking there should be a footnote to 20.5.3/1 saying that if -A and B are similar types (4.4/4), comp<A>(a,b) returns the same value -as comp<B>(a,b) (where comp is less, less_equal, etc.). But this might -be problematic if there is some really funky operator overloading going -on that does different things based on cv (that should be undefined -behavior if somebody does that though). This at least should be -guaranteed for all POD types (especially pointers) that use the -built-in comparison operators. -

- - - -

Rationale:

-

-less is already required to provide a strict weak ordering which is good enough -to detect overlapping memory situations. -

- - - - - -
-

504. Integer types in pseudo-random number engine requirements

-

Section: 26.4.1 [rand.req], TR1 5.1.1 [tr.rand.req] Status: NAD Editorial - Submitter: Walter Brown Date: 2005-07-03

-

View all other issues in [rand.req].

-

View all issues with NAD Editorial status.

-

Discussion:

-

-In [tr.rand.req], Paragraph 2 states that "... s is a value of integral type, -g is an ... object returning values of unsigned integral type ..." -

- - -

Proposed resolution:

-

-In 5.1.1 [tr.rand.req], Paragraph 2 replace -

- -

-... s is a value of integral type, g is an lvalue of a type other than X that -defines a zero-argument function object returning values of unsigned integral type -unsigned long int, -... -

- -

-In 5.1.1 [tr.rand.seq], Table 16, replace in the line for X(s) -

- -

-creates an engine with the initial internal state -determined by static_cast<unsigned long>(s) -

- -

[ -Mont Tremblant: Both s and g should be unsigned long. -This should refer to the constructor signatures. Jens provided wording post Mont Tremblant. -]

- - -

[ -Berlin: N1932 adopts the proposed resolution: see 26.3.1.3/1e and Table 3 row 2. Moved -to Ready. -]

- - - - -

Rationale:

-

-Jens: Just requiring X(unsigned long) still makes it possible -for an evil library writer to also supply a X(int) that does something -unexpected. The wording above requires that X(s) always performs -as if X(unsigned long) would have been called. I believe that is -sufficient and implements our intentions from Mont Tremblant. I -see no additional use in actually requiring a X(unsigned long) -signature. u.seed(s) is covered by its reference to X(s), same -arguments. -

- - -

[ -Portland: Subsumed by N2111. -]

- - - - - -
-

506. Requirements of Distribution parameter for variate_generator

-

Section: 26.4 [rand], TR1 5.1.3 [tr.rand.var] Status: NAD - Submitter: Walter Brown Date: 2005-07-03

-

View all other issues in [rand].

-

View all issues with NAD status.

-

Discussion:

-

-Paragraph 3 requires that template argument U (which corresponds to template -parameter Engine) satisfy all uniform random number generator requirements. -However, there is no analogous requirement regarding the template argument -that corresponds to template parameter Distribution. We believe there should -be, and that it should require that this template argument satisfy all random -distribution requirements. -

- - -

Proposed resolution:

-

-Consequence 1: Remove the precondition clauses [tr.rand.var]/16 and /18. -

-

-Consequence 2: Add max() and min() functions to those distributions that -do not already have them. -

- -

[ -Mont Tremblant: Jens reccommends NAD, min/max not needed everywhere. -Marc supports having min and max to satisfy generic programming interface. -]

- - - - -

Rationale:

-

Berlin: N1932 makes this moot: variate_generator has been eliminated.

- - - - - -
-

509. Uniform_int template parameters

-

Section: 26.4.8.1 [rand.dist.uni], TR1 5.1.7.1 [tr.rand.dist.iunif] Status: NAD - Submitter: Walter Brown Date: 2005-07-03

-

View all issues with NAD status.

-

Discussion:

-

-In [tr.rand.dist.iunif] the uniform_int distribution currently has a single -template parameter, IntType, used as the input_type and as the result_type -of the distribution. We believe there is no reason to conflate these types -in this way. -

- - -

Proposed resolution:

-

-We recommend that there be a second template parameter to -reflect the distribution's input_type, and that the existing first template -parameter continue to reflect (solely) the result_type: -

-
template< class IntType = int, UIntType = unsigned int >
-class uniform_int
-{
-public:
-  // types
-  typedef  UIntType  input_type;
-  typedef  IntType   result_type;
-
- -

[ -Berlin: Moved to NAD. N1932 makes this moot: the input_type template parameter has been -eliminated. -]

- - - - - - - -
-

510. Input_type for bernoulli_distribution

-

Section: 26.4.8.2 [rand.dist.bern], TR1 5.1.7.2 [tr.rand.dist.bern] Status: NAD - Submitter: Walter Brown Date: 2005-07-03

-

View all issues with NAD status.

-

Discussion:

-

-In [tr.rand.dist.bern] the distribution currently requires; -

-
typedef  int  input_type;
-
- - -

Proposed resolution:

-

-We believe this is an unfortunate choice, and recommend instead: -

-
typedef  unsigned int  input_type;
-
- -

[ -Berlin: Moved to NAD. N1932 makes this moot: the input_type template parameter has been -eliminated. -]

- - - - - - - -
-

511. Input_type for binomial_distribution

-

Section: 26.4.8 [rand.dist], TR1 5.1.7.5 [tr.rand.dist.bin] Status: NAD - Submitter: Walter Brown Date: 2005-07-03

-

View all other issues in [rand.dist].

-

View all issues with NAD status.

-

Discussion:

-

-Unlike all other distributions in TR1, this binomial_distribution has an -implementation-defined input_type. We believe this is an unfortunate choice, -because it hinders users from writing portable code. It also hinders the -writing of compliance tests. We recommend instead: -

-
typedef  RealType  input_type;
-
-

-While this choice is somewhat arbitrary (as it was for some of the other -distributions), we make this particular choice because (unlike all other -distributions) otherwise this template would not publish its RealType -argument and so users could not write generic code that accessed this -second template parameter. In this respect, the choice is consistent with -the other distributions in TR1. -

-

-We have two reasons for recommending that a real type be specified instead. -One reason is based specifically on characteristics of binomial distribution -implementations, while the other is based on mathematical characteristics of -probability distribution functions in general. -

-

-Implementations of binomial distributions commonly use Stirling approximations -for values in certain ranges. It is far more natural to use real values to -represent these approximations than it would be to use integral values to do -so. In other ranges, implementations reply on the Bernoulli distribution to -obtain values. While TR1's bernoulli_distribution::input_type is specified as -int, we believe this would be better specified as double. -

-

-This brings us to our main point: The notion of a random distribution rests -on the notion of a cumulative distribution function, which in turn mathematically -depends on a continuous dependent variable. Indeed, such a distribution function -would be meaningless if it depended on discrete values such as integers - and this -remains true even if the distribution function were to take discrete steps. -

-

-Although this note is specifically about binomial_distribution::input_type, -we intend to recommend that all of the random distributions input_types be -specified as a real type (either a RealType template parameter, or double, -as appropriate). -

-

-Of the nine distributions in TR1, four already have this characteristic -(uniform_real, exponential_distribution, normal_distribution, and -gamma_distribution). We have already argued the case for the binomial the -remaining four distributions. -

-

-In the case of uniform_int, we believe that the calculations to produce an -integer result in a specified range from an integer in a different specified -range is best done using real arithmetic. This is because it involves a -product, one of whose terms is the ratio of the extents of the two ranges. -Without real arithmetic, the results become less uniform: some numbers become -more (or less) probable that they should be. This is, of course, undesireable -behavior in a uniform distribution. -

-

-Finally, we believe that in the case of the bernoulli_distribution (briefly -mentioned earlier), as well as the cases of the geometric_distribution and the -poisson_distribution, it would be far more natural to have a real input_type. -This is because the most natural computation involves the random number -delivered and the distribution's parameter p (in the case of bernoulli_distribution, -for example, the computation is a comparison against p), and p is already specified -in each case as having some real type. -

- - -

Proposed resolution:

-
typedef  RealType  input_type;
-
- -

[ -Berlin: Moved to NAD. N1932 makes this moot: the input_type template parameter has been -eliminated. -]

- - - - - - -
-

512. Seeding subtract_with_carry_01 from a single unsigned long

-

Section: 26.4.3 [rand.eng], TR1 5.1.4.4 [tr.rand.eng.sub1] Status: NAD Editorial - Submitter: Walter Brown Date: 2005-07-03

-

View all other issues in [rand.eng].

-

View all issues with NAD Editorial status.

-

Discussion:

-

-Paragraph 8 specifies the algorithm by which a subtract_with_carry_01 engine -is to be seeded given a single unsigned long. This algorithm is seriously -flawed in the case where the engine parameter w (also known as word_size) -exceeds 31 [bits]. The key part of the paragraph reads: -

-

-sets x(-r) ... x(-1) to (lcg(1)*2**(-w)) mod 1 -

-

-and so forth. -

-

-Since the specified linear congruential engine, lcg, delivers numbers with -a maximum of 2147483563 (just a shade under 31 bits), then when w is, for -example, 48, each of the x(i) will be less than 2**-17. The consequence -is that roughly the first 400 numbers delivered will be conspicuously -close to either zero or one. -

-

-Unfortunately, this is not an innocuous flaw: One of the predefined engines -in [tr.rand.predef], namely ranlux64_base_01, has w = 48 and would exhibit -this poor behavior, while the original N1378 proposal states that these -pre-defined engines are intended to be of "known good properties." -

- - -

Proposed resolution:

-

-In 5.1.4.4 [tr.rand.eng.sub1], replace the "effects" clause for -void seed(unsigned long value = 19780503) by -

- -

-Effects: If value == 0, sets value to 19780503. In any -case, with a linear congruential generator lcg(i) having parameters -mlcg = 2147483563, alcg = 40014, -clcg = 0, and lcg(0) = value, -sets carry(-1) and x(-r) … x(-1) -as if executing

- -

-linear_congruential<unsigned long, 40014, 0, 2147483563> lcg(value);
-seed(lcg);
-
- -

-to (lcg(1) · 2-w) mod 1 -… (lcg(r) · 2-w) mod 1, -respectively. If x(-1) == 0, sets carry(-1) = 2-w, -else sets carry(-1) = 0.

-
- -

[ -Jens provided revised wording post Mont Tremblant. -]

- - -

[ -Berlin: N1932 adopts the originally-proposed resolution of the issue. -Jens's supplied wording is a clearer description of what is -intended. Moved to Ready. -]

- - - - -

Rationale:

-

-Jens: I'm using an explicit type here, because fixing the -prose would probably not qualify for the (with issue 504 even -stricter) requirements we have for seed(Gen&). -

- -

[ -Portland: Subsumed by N2111. -]

- - - - - - -
-

513. Size of state for subtract_with_carry_01

-

Section: 26.4.3 [rand.eng], TR1 5.1.4.4 [tr.rand.eng.sub1] Status: NAD Editorial - Submitter: Walter Brown Date: 2005-07-03

-

View all other issues in [rand.eng].

-

View all issues with NAD Editorial status.

-

Discussion:

-

-Paragraph 3 begins: -

-

-The size of the state is r. -

-

-However, this is not quite consistent with the remainder of the paragraph -which specifies a total of nr+1 items in the textual representation of -the state. We recommend the sentence be corrected to match: -

-

-The size of the state is nr+1. -

-

-To give meaning to the coefficient n, it may be also desirable to move -n's definition from later in the paragraph. Either of the following -seem reasonable formulations: -

-

-With n=..., the size of the state is nr+1. -

-

-The size of the state is nr+1, where n=... . -

- - - -

Proposed resolution:

-

[ -Jens: I plead for "NAD" on the grounds that "size of state" is only -used as an argument for big-O complexity notation, thus -constant factors and additions don't count. -]

- - -

[ -Berlin: N1932 adopts the proposed NAD. -]

- - - - - - - -
-

514. Size of state for subtract_with_carry

-

Section: 26.4.3.3 [rand.eng.sub], TR1 5.1.4.3 [tr.rand.eng.sub] Status: NAD Editorial - Submitter: Walter Brown Date: 2005-07-03

-

View all issues with NAD Editorial status.

-

Discussion:

-

-Paragraph 2 begins: -

-

-The size of the state is r. -

-

-However, the next sentence specifies a total of r+1 items in the textual -representation of the state, r specific x's as well as a specific carry. -This makes a total of r+1 items that constitute the size of the state, -rather than r. -

- - -

Proposed resolution:

-

-We recommend the sentence be corrected to match: -

-

- The size of the state is r+1. -

- -

[ -Jens: I plead for "NAD" on the grounds that "size of state" is only -used as an argument for big-O complexity notation, thus -constant factors and additions don't count. -]

- - -

[ -Berlin: N1932 adopts the proposed NAD. -]

- - - - - - - -
-

515. Random number engine traits

-

Section: 26.4.2 [rand.synopsis], TR1 5.1.2 [tr.rand.synopsis] Status: NAD - Submitter: Walter Brown Date: 2005-07-03

-

View all other issues in [rand.synopsis].

-

View all issues with NAD status.

-

Discussion:

-

-To accompany the concept of a pseudo-random number engine as defined in Table 17, -we propose and recommend an adjunct template, engine_traits, to be declared in -[tr.rand.synopsis] as: -

-
template< class PSRE >
-class engine_traits;
-
-

-This template's primary purpose would be as an aid to generic programming involving -pseudo-random number engines. Given only the facilities described in tr1, it would -be very difficult to produce any algorithms involving the notion of a generic engine. -The intent of this proposal is to provide, via engine_traits<>, sufficient -descriptive information to allow an algorithm to employ a pseudo-random number engine -without regard to its exact type, i.e., as a template parameter. -

-

-For example, today it is not possible to write an efficient generic function that -requires any specific number of random bits. More specifically, consider a -cryptographic application that internally needs 256 bits of randomness per call: -

-
template< class Eng, class InIter, class OutIter >
-void crypto( Eng& e, InIter in, OutIter out );
-
-

-Without knowning the number of bits of randomness produced per call to a provided -engine, the algorithm has no means of determining how many times to call the engine. -

-

-In a new section [tr.rand.eng.traits], we proposed to define the engine_traits -template as: -

-
template< class PSRE >
-class engine_traits
-{
-  static  std::size_t  bits_of_randomness = 0u;
-  static  std::string  name()  { return "unknown_engine"; }
-  // TODO: other traits here
-};
-
-

-Further, each engine described in [tr.rand.engine] would be accompanied by a -complete specialization of this new engine_traits template. -

- - - -

Proposed resolution:

-

[ -Berlin: Walter: While useful for implementation per TR1, N1932 has no need for this -feature. Recommend close as NAD. -]

- - - -

Rationale:

-

-Recommend NAD, -N1932, -N2111 -covers this. Already in WP. -

- - - - - -
-

516. Seeding subtract_with_carry_01 using a generator

-

Section: 26.4.3 [rand.eng], TR1 5.1.4.4 [tr.rand.eng.sub1] Status: NAD Editorial - Submitter: Walter Brown Date: 2005-07-03

-

View all other issues in [rand.eng].

-

View all issues with NAD Editorial status.

-

Discussion:

-

-Paragraph 6 says: -

-

-... obtained by successive invocations of g, ... -

-

-We recommend instead: -

-

-... obtained by taking successive invocations of g mod 2**32, ... -

-

-as the context seems to require only 32-bit quantities be used here. -

- - -

Proposed resolution:

-

-Berlin: N1932 adopts the proposed resultion: see 26.3.3.4/7. Moved to Ready. -

- -

[ -Portland: Subsumed by N2111. -]

- - - - - - -
-

517. Should include name in external representation

-

Section: 26.4.1 [rand.req], TR1 5.1.1 [tr.rand.req] Status: NAD - Submitter: Walter Brown Date: 2005-07-03

-

View all other issues in [rand.req].

-

View all issues with NAD status.

-

Discussion:

-

-The last two rows of Table 16 deal with the i/o requirements of an engine, -specifying that the textual representation of an engine's state, -appropriately formatted, constitute the engine's external representation. -

-

-This seems adequate when an engine's type is known. However, it seems -inadequate in the context of generic code, where it becomes useful and -perhaps even necessary to determine an engine's type via input. -

-

-

- - -

Proposed resolution:

-

-We therefore recommend that, in each of these two rows of Table 16, the -text "textual representation" be expanded so as to read "engine name -followed by the textual representation." -

- -

[ -Berlin: N1932 considers this NAD. This is a QOI issue. -]

- - - - - - - -
-

525. type traits definitions not clear

-

Section: 20.4.4 [meta.unary], TR1 4.5 [tr.meta.unary] Status: NAD Editorial - Submitter: Robert Klarer Date: 2005-07-11

-

View all issues with NAD Editorial status.

-

Discussion:

-

-It is not completely clear how the primary type traits deal with -cv-qualified types. And several of the secondary type traits -seem to be lacking a definition. -

- -

[ -Berlin: Howard to provide wording. -]

- - - -

Proposed resolution:

-

-Wording provided in N2028. -A -revision (N2157) -provides more detail for motivation. -

- - -

Rationale:

-Solved by revision (N2157) -in the WP. - - - - - -
-

526. Is it undefined if a function in the standard changes in parameters?

-

Section: 23.1.1 [sequence.reqmts] Status: NAD - Submitter: Chris Jefferson Date: 2005-09-14

-

View all other issues in [sequence.reqmts].

-

View all issues with NAD status.

-

Discussion:

-

-Problem: There are a number of places in the C++ standard library where -it is possible to write what appear to be sensible ways of calling -functions, but which can cause problems in some (or all) -implementations, as they cause the values given to the function to be -changed in a way not specified in standard (and therefore not coded to -correctly work). These fall into two similar categories. -

- -

-1) Parameters taken by const reference can be changed during execution -of the function -

- -

-Examples: -

- -

-Given std::vector<int> v: -

-

-v.insert(v.begin(), v[2]); -

-

-v[2] can be changed by moving elements of vector -

- - -

-Given std::list<int> l: -

-

-l.remove(*l.begin()); -

-

-Will delete the first element, and then continue trying to access it. -This is particularily vicious, as it will appear to work in almost all -cases. -

- -

-2) A range is given which changes during the execution of the function: -Similarly, -

- -

-v.insert(v.begin(), v.begin()+4, v.begin()+6); -

- -

-This kind of problem has been partly covered in some cases. For example -std::copy(first, last, result) states that result cannot be in the range -[first, last). However, does this cover the case where result is a -reverse_iterator built from some iterator in the range [first, last)? -Also, std::copy would still break if result was reverse_iterator(last + -1), yet this is not forbidden by the standard -

- -

-Solution: -

- -

-One option would be to try to more carefully limit the requirements of -each function. There are many functions which would have to be checked. -However as has been shown in the std::copy case, this may be difficult. -A simpler, more global option would be to somewhere insert text similar to: -

- -

-If the execution of any function would change either any values passed -by reference or any value in any range passed to a function in a way not -defined in the definition of that function, the result is undefined. -

- -

-Such code would have to at least cover chapters 23 and 25 (the sections -I read through carefully). I can see no harm on applying it to much of -the rest of the standard. -

- -

-Some existing parts of the standard could be improved to fit with this, -for example the requires for 25.2.1 (Copy) could be adjusted to: -

- -

-Requires: For each non-negative integer n < (last - first), assigning to -*(result + n) must not alter any value in the range [first + n, last). -

- -

-However, this may add excessive complication. -

- -

-One other benefit of clearly introducing this text is that it would -allow a number of small optimisations, such as caching values passed -by const reference. -

- -

-Matt Austern adds that this issue also exists for the insert and -erase members of the ordered and unordered associative containers. -

- -

[ -Berlin: Lots of controversey over how this should be solved. Lots of confusion -as to whether we're talking about self referencing iterators or references. -Needs a good survey as to the cases where this matters, for which -implementations, and how expensive it is to fix each case. -]

- - - - -

Proposed resolution:

- - -

Rationale:

-

-Recommend NAD. -

-
    -
  • vector::insert(iter, value) is required to work because the standard -doesn't give permission for it not to work.
  • -
  • list::remove(value) is required to work because the standard -doesn't give permission for it not to work.
  • -
  • vector::insert(iter, iter, iter) is not required to work because -23.1.1 [sequence.reqmts], p4 says so.
  • -
  • copy has to work, except where 25.2.1 [alg.copy] says -it doesn't have to work. While a language lawyer can tear this wording apart, -it is felt that the wording is not prone to accidental interpretation.
  • -
  • The current working draft provide exceptions for the unordered associative -containers similar to the containers requirements which exempt the member -template insert functions from self referencing.
  • -
- - - - - -
-

528. const_iterator iterator issue when they are the same type

-

Section: 23.4 [unord], TR1 6.3.4 [tr.unord.unord] Status: NAD - Submitter: Paolo Carlini Date: 2005-10-12

-

View other active issues in [unord].

-

View all other issues in [unord].

-

View all issues with NAD status.

-

Discussion:

-

-while implementing the resolution of issue 6.19 I'm noticing the -following: according to 6.3.4.3/2 (and 6.3.4.5/2), for unordered_set and -unordered_multiset: -

- -

- "The iterator and const_iterator types are both const types. It is -unspecified whether they are the same type" -

- -

-Now, according to the resolution of 6.19, we have overloads of insert -with hint and erase (single and range) both for iterator and -const_iterator, which, AFAICS, can be meaningful at the same time *only* -if iterator and const_iterator *are* in fact different types. -

-

-Then, iterator and const_iterator are *required* to be different types? -Or that is an unintended consequence? Maybe the overloads for plain -iterators should be added only to unordered_map and unordered_multimap? -Or, of course, I'm missing something? -

- - - -

Proposed resolution:

-

-Add to 6.3.4.3p2 (and 6.3.4.5p2): -

-

-2 ... The iterator and const_iterator types are both const -constant iterator types. -It is unspecified whether they are the same type. -

- -

-Add a new subsection to 17.4.4 [lib.conforming]: -

- -
-

-An implementation shall not supply an overloaded function - signature specified in any library clause if such a signature - would be inherently ambiguous during overload resolution - due to two library types referring to the same type. -

-

- [Note: For example, this occurs when a container's iterator - and const_iterator types are the same. -- end note] -

-
- -

[ -Post-Berlin: Beman supplied wording. -]

- - - - -

Rationale:

-Toronto: The first issue has been fixed by N2350 (the insert and erase members -are collapsed into one signature). Alisdair to open a separate issue on the -chapter 17 wording. - - - - - -
-

532. Tuple comparison

-

Section: 20.3.1.5 [tuple.rel], TR1 6.1.3.5 [tr.tuple.rel] Status: Pending NAD Editorial - Submitter: David Abrahams Date: 2005-11-29

-

View all issues with Pending NAD Editorial status.

-

Discussion:

-

-Where possible, tuple comparison operators <,<=,=>, and > ought to be -defined in terms of std::less rather than operator<, in order to -support comparison of tuples of pointers. -

- - -

Proposed resolution:

-

-change 6.1.3.5/5 from: -

- -

- Returns: The result of a lexicographical comparison between t and - u. The result is defined as: (bool)(get<0>(t) < get<0>(u)) || - (!(bool)(get<0>(u) < get<0>(t)) && ttail < utail), where rtail for - some tuple r is a tuple containing all but the first element of - r. For any two zero-length tuples e and f, e < f returns false. -

- -

-to: -

- -
-

- Returns: The result of a lexicographical comparison between t and - u. For any two zero-length tuples e and f, e < f returns false. - Otherwise, the result is defined as: cmp( get<0>(t), get<0>(u)) || - (!cmp(get<0>(u), get<0>(t)) && ttail < utail), where rtail for some - tuple r is a tuple containing all but the first element of r, and - cmp(x,y) is an unspecified function template defined as follows. -

-

- Where T is the type of x and U is the type of y: -

- -

- if T and U are pointer types and T is convertible to U, returns - less<U>()(x,y) -

- -

- otherwise, if T and U are pointer types, returns less<T>()(x,y) -

- -

- otherwise, returns (bool)(x < y) -

-
- -

[ -Berlin: This issue is much bigger than just tuple (pair, containers, -algorithms). Dietmar will survey and work up proposed wording. -]

- - - - -

Rationale:

-

-Recommend NAD. This will be fixed with the next revision of concepts. -

- - - - - -
-

536. Container iterator constructor and explicit convertibility

-

Section: 23.1 [container.requirements] Status: Dup - Submitter: Joaquín M López Muñoz Date: 2005-12-17

-

View other active issues in [container.requirements].

-

View all other issues in [container.requirements].

-

View all issues with Dup status.

-

Duplicate of: 589

-

Discussion:

-

-The iterator constructor X(i,j) for containers as defined in 23.1.1 and -23.2.2 does only require that i and j be input iterators but -nothing is said about their associated value_type. There are three -sensible -options: -

-
    -
  1. iterator's value_type is exactly X::value_type (modulo cv).
  2. -
  3. iterator's value_type is *implicitly* convertible to X::value_type.
  4. -
  5. iterator's value_type is *explicitly* convertible to X::value_type.
  6. -
-

-The issue has practical implications, and stdlib vendors have -taken divergent approaches to it: Dinkumware follows 2, -libstdc++ follows 3. -

-

-The same problem applies to the definition of insert(p,i,j) for -sequences and insert(i,j) for associative contianers, as well as -assign. -

- -

[ -The following added by Howard and the example code was originally written by -Dietmar. -]

- -

-Valid code below? -

- -
#include <vector> 
-#include <iterator> 
-#include <iostream> 
-
-struct foo 
-{ 
-    explicit foo(int) {} 
-}; 
-
-int main() 
-{ 
-    std::vector<int> v_int; 
-    std::vector<foo> v_foo1(v_int.begin(), v_int.end()); 
-    std::vector<foo> v_foo2((std::istream_iterator<int>(std::cin)), 
-                             std::istream_iterator<int>()); 
-} 
-
-

[ -Berlin: Some support, not universal, for respecting the explicit qualifier. -]

- - - - -

Proposed resolution:

- - - - - - -
-

544. minor NULL problems in C.2

-

Section: C.2 [diff.library] Status: NAD Editorial - Submitter: Martin Sebor Date: 2005-11-25

-

View all issues with NAD Editorial status.

-

Discussion:

-

-According to C.2.2.3, p1, "the macro NULL, defined in any of <clocale>, -<cstddef>, <cstdio>, <cstdlib>, <cstring>, <ctime>, -or <cwchar>." This is consistent with the C standard. -

-

-However, Table 95 in C.2 fails to mention <clocale> and <cstdlib>. -

-

-In addition, C.2, p2 claims that "The C++ Standard library provides -54 standard macros from the C library, as shown in Table 95." While -table 95 does have 54 entries, since a couple of them (including the -NULL macro) are listed more than once, the actual number of macros -defined by the C++ Standard Library may not be 54. -

- - -

Proposed resolution:

-

-I propose we add <clocale> and <cstdlib> to Table 96 and remove the -number of macros from C.2, p2 and reword the sentence as follows: -

-

-The C++ Standard library provides 54 standard macros from -defines a number macros corresponding to those defined by the C -Standard library, as shown in Table 96. -

- -

[ -Portland: Resolution is considered editorial. It will be incorporated into the WD. -]

- - - - - - - -
-

547. division should be floating-point, not integer

-

Section: 26.4 [rand], TR1 5.1 [tr.rand] Status: NAD - Submitter: Matt Austern Date: 2006-01-10

-

View all other issues in [rand].

-

View all issues with NAD status.

-

Discussion:

-

-Paragraph 10 describes how a variate generator uses numbers produced by an -engine to pass to a generator. The sentence that concerns me is: "Otherwise, if -the value for engine_value_type::result_type is true and the value for -Distribution::input_type is false [i.e. if the engine produces integers and the -engine wants floating-point values], then the numbers in s_eng are divided by -engine().max() - engine().min() + 1 to obtain the numbers in s_e." Since the -engine is producing integers, both the numerator and the denominator are -integers and we'll be doing integer division, which I don't think is what we -want. Shouldn't we be performing a conversion to a floating-point type first? -

- - -

Proposed resolution:

- - -

Rationale:

-

-Recommend NAD as the affected section is now gone and so the issue is moot. -N2111. -

- - - - - -
-

548. May random_device block?

-

Section: 26.4.6 [rand.device], TR1 5.1.6 [tr.rand.device] Status: NAD - Submitter: Matt Austern Date: 2006-01-10

-

View all issues with NAD status.

-

Discussion:

-

-Class random_device "produces non-deterministic random numbers", using some -external source of entropy. In most real-world systems, the amount of available -entropy is limited. Suppose that entropy has been exhausted. What is an -implementation permitted to do? In particular, is it permitted to block -indefinitely until more random bits are available, or is the implementation -required to detect failure immediately? This is not an academic question. On -Linux a straightforward implementation would read from /dev/random, and "When -the entropy pool is empty, reads to /dev/random will block until additional -environmental noise is gathered." Programmers need to know whether random_device -is permitted to (or possibly even required to?) behave the same way. -

- -

[ -Berlin: Walter: N1932 considers this NAD. Does the standard specify whether std::cin -may block? -]

- - -

-See N2391 and -N2423 -for some further discussion. -

- - -

Proposed resolution:

-

-Adopt the proposed resolution in -N2423 (NAD). -

- - - - - -
-

549. Undefined variable in binomial_distribution

-

Section: 26.4.8 [rand.dist], TR1 5.1.7.5 [tr.rand.dist.bin] Status: NAD Editorial - Submitter: Matt Austern Date: 2006-01-10

-

View all other issues in [rand.dist].

-

View all issues with NAD Editorial status.

-

Discussion:

-

-Paragraph 1 says that "A binomial distributon random distribution produces -integer values i>0 with p(i) = (n choose i) * p*i * (1-p)^(t-i), where t and -p are the parameters of the distribution. OK, that tells us what t, p, and i -are. What's n? -

- - -

Proposed resolution:

-

-Berlin: Typo: "n" replaced by "t" in N1932: see 26.3.7.2.2/1. -

- -

[ -Portland: Subsumed by N2111. -]

- - - - - - -
-

553. very minor editorial change intptr_t / uintptr_t

-

Section: 18.3.1 [cstdint.syn], TR1 8.22.1 [tr.c99.cstdint.syn] Status: NAD Editorial - Submitter: Paolo Carlini Date: 2006-01-30

-

View all issues with NAD Editorial status.

-

Discussion:

-

-In the synopsis, some types are identified as optional: int8_t, int16_t, -and so on, consistently with C99, indeed. -

-

-On the other hand, intptr_t and uintptr_t, are not marked as such and -probably should, consistently with C99, 7.18.1.4. -

- - -

Proposed resolution:

-

-Change 18.3.1 [cstdint.syn]: -

- -
...
-typedef signed integer type intptr_t;    // optional
-...
-typedef unsigned integer type uintptr_t;    // optional
-...
-
- - - -

Rationale:

-Recommend NAD and fix as editorial with the proposed resolution. - - - - - -
-

554. Problem with lwg DR 184 numeric_limits<bool>

-

Section: 18.2.1.5 [numeric.special] Status: NAD - Submitter: Howard Hinnant Date: 2006-01-29

-

View all other issues in [numeric.special].

-

View all issues with NAD status.

-

Discussion:

-

-I believe we have a bug in the resolution of: -lwg 184 -(WP status). -

- -

-The resolution spells out each member of numeric_limits<bool>. -The part I'm having a little trouble with is: -

-
static const bool traps = false;
-
- -

-Should this not be implementation defined? Given: -

- -
int main()
-{
-     bool b1 = true;
-     bool b2 = false;
-     bool b3 = b1/b2;
-}
-
- -

-If this causes a trap, shouldn't numeric_limits<bool>::traps be -true? -

- - -

Proposed resolution:

-

-Change 18.2.1.5p3: -

- -

--3- The specialization for bool shall be provided as follows:

-
namespace std { 
-   template <> class numeric_limits<bool> {
-      ...
-      static const bool traps = false implementation-defined;
-      ...
-   };
-}
-
-
- -

[ -Redmond: NAD because traps refers to values, not operations. There is no bool -value that will trap. -]

- - - - - - - -
-

555. TR1, 8.21/1: typo

-

Section: TR1 8.21 [tr.c99.boolh] Status: NAD Editorial - Submitter: Paolo Carlini Date: 2006-02-02

-

View all issues with NAD Editorial status.

-

Discussion:

-

-This one, if nobody noticed it yet, seems really editorial: -s/cstbool/cstdbool/ -

- - -

Proposed resolution:

-

-Change 8.21p1: -

-

--1- The header behaves as if it defines the additional macro defined in -<cstdbool> by including the header <cstdbool>. -

- -

[ -Redmond: Editorial. -]

- - - - - - - -
-

558. lib.input.iterators Defect

-

Section: 24.1.1 [input.iterators] Status: NAD Editorial - Submitter: David Abrahams Date: 2006-02-09

-

View all other issues in [input.iterators].

-

View all issues with NAD Editorial status.

-

Discussion:

-
-

- 24.1.1 Input iterators [lib.input.iterators] -

-

- 1 A class or a built-in type X satisfies the requirements of an - input iterator for the value type T if the following expressions are - valid, where U is the type of any specified member of type T, as - shown in Table 73. -

-
-

-There is no capital U used in table 73. There is a lowercase u, but -that is clearly not meant to denote a member of type T. Also, there's -no description in 24.1.1 of what lowercase a means. IMO the above -should have been...Hah, a and b are already covered in 24.1/11, so maybe it -should have just been: -

- - -

Proposed resolution:

-

-Change 24.1.1p1: -

-

--1- A class or a built-in type X satisfies the requirements of an -input iterator for the value type T if the following expressions -are valid, where U is the type of any specified member of type -T, as shown in Table 73. -

- -

[ -Portland: Editorial. -]

- - - - - - - -
-

560. User-defined allocators without default constructor

-

Section: 20.1.2 [allocator.requirements] Status: NAD - Submitter: Sergey P. Derevyago Date: 2006-02-17

-

View other active issues in [allocator.requirements].

-

View all other issues in [allocator.requirements].

-

View all issues with NAD status.

-

Discussion:

-

1. The essence of the problem.

-

-User-defined allocators without default constructor are not explicitly -supported by the standard but they can be supported just like std::vector -supports elements without default constructor. -

-

-As a result, there exist implementations that work well with such allocators -and implementations that don't. -

- -

2. The cause of the problem.

-

-1) The standard doesn't explicitly state this intent but it should. In -particular, 20.1.5p5 explicitly state the intent w.r.t. the allocator -instances that compare non-equal. So it can similarly state the intent w.r.t. -the user-defined allocators without default constructor. -

-

-2) Some container operations are obviously underspecified. In particular, -21.3.7.1p2 tells: -

-
template<class charT, class traits, class Allocator>
-  basic_string<charT,traits,Allocator> operator+(
-    const charT* lhs,
-    const basic_string<charT,traits,Allocator>& rhs
-  );
-
-

-Returns: basic_string<charT,traits,Allocator>(lhs) + rhs. -

-
-

-That leads to the basic_string<charT,traits,Allocator>(lhs, Allocator()) call. -Obviously, the right requirement is: -

-

-Returns: basic_string<charT,traits,Allocator>(lhs, rhs.get_allocator()) + rhs. -

-

-It seems like a lot of DRs can be submitted on this "Absent call to -get_allocator()" topic. -

- -

3. Proposed actions.

-

-1) Explicitly state the intent to allow for user-defined allocators without -default constructor in 20.1.5 Allocator requirements. -

-

-2) Correct all the places, where a correct allocator object is available -through the get_allocator() call but default Allocator() gets passed instead. -

-

4. Code sample.

-

-Let's suppose that the following memory pool is available: -

-
class mem_pool {
-      // ...
-      void* allocate(size_t size);
-      void deallocate(void* ptr, size_t size);
-};
-
-

-So the following allocator can be implemented via this pool: -

-
class stl_allocator {
-      mem_pool& pool;
-
- public:
-      explicit stl_allocator(mem_pool& mp) : pool(mp) {}
-      stl_allocator(const stl_allocator& sa) : pool(sa.pool) {}
-      template <class U>
-      stl_allocator(const stl_allocator<U>& sa)  : pool(sa.get_pool()) {}
-      ~stl_allocator() {}
-
-      pointer allocate(size_type n, std::allocator<void>::const_pointer = 0)
-      {
-       return (n!=0) ? static_cast<pointer>(pool.allocate(n*sizeof(T))) : 0;
-      }
-
-      void deallocate(pointer p, size_type n)
-      {
-       if (n!=0) pool.deallocate(p, n*sizeof(T));
-      }
-
-      // ...
-};
-
-

-Then the following code works well on some implementations and doesn't work on -another: -

-
typedef basic_string<char, char_traits<char>, stl_allocator<char> > 
-  tl_string;
-mem_pool mp;
-tl_string s1("abc", stl_allocator<int>(mp));
-printf("(%s)\n", ("def"+s1).c_str());
-
-

-In particular, on some implementations the code can't be compiled without -default stl_allocator() constructor. -

-

-The obvious way to solve the compile-time problems is to intentionally define -a NULL pointer dereferencing default constructor -

-
stl_allocator() : pool(*static_cast<mem_pool*>(0)) {}
-
-

-in a hope that it will not be called. The problem is that it really gets -called by operator+(const char*, const string&) under the current 21.3.7.1p2 -wording. -

- - -

Proposed resolution:

-

-

- - -

Rationale:

-

-Recommend NAD. operator+() with string already requires the desired -semantics of copying the allocator from one of the strings (lhs when there is a choice). -

- - - - - -
-

569. Postcondition for basic_ios::clear(iostate) incorrectly stated

-

Section: 27.4.4.3 [iostate.flags] Status: Dup - Submitter: Seungbeom Kim Date: 2006-03-10

-

View all other issues in [iostate.flags].

-

View all issues with Dup status.

-

Duplicate of: 272

-

Discussion:

-

-Section: 27.4.4.3 [lib.iostate.flags] -

-

-Paragraph 4 says: -

-
-
void clear(iostate state = goodbit);
-
-

-Postcondition: If rdbuf()!=0 then state == rdstate(); -otherwise rdstate()==state|ios_base::badbit. -

-
- -

-The postcondition "rdstate()==state|ios_base::badbit" is parsed as -"(rdstate()==state)|ios_base::badbit", which is probably what the -committee meant. -

- - - - -

Rationale:

- - - - - - -
-

571. Update C90 references to C99?

-

Section: 1.2 [intro.refs] Status: NAD Editorial - Submitter: Beman Dawes Date: 2006-04-08

-

View all other issues in [intro.refs].

-

View all issues with NAD Editorial status.

-

Discussion:

-

-1.2 Normative references [intro.refs] of the WP currently refers to ISO/IEC -9899:1990, Programming languages - C. Should that be changed to ISO/IEC -9899:1999? -

-

-What impact does this have on the library? -

- - -

Proposed resolution:

-

-In 1.2/1 [intro.refs] of the WP, change: -

-
-
    -
  • ISO/IEC 9899:19901999 + TC1 + TC2, Programming languages - C
  • -
-
- - - -

Rationale:

-Recommend NAD, fixed editorially. - - - - - -
-

572. Oops, we gave 507 WP status

-

Section: 26.4 [rand], TR1 5.1 [tr.rand] Status: NAD - Submitter: Howard Hinnant Date: 2006-04-11

-

View all other issues in [rand].

-

View all issues with NAD status.

-

Discussion:

-

-In Berlin, as a working group, we voted in favor of N1932 which makes issue 507 moot: -variate_generator has been eliminated. Then in full committee we voted to give -this issue WP status (mistakenly). -

- - -

Proposed resolution:

-

-Strike the proposed resolution of issue 507. -

-

[ -post-Portland: Walter and Howard recommend NAD. The proposed resolution of 507 no longer -exists in the current WD. -]

- - - -

Rationale:

-

-NAD. Will be moot once -N2135 -is adopted. -

- - - - - -
-

583. div() for unsigned integral types

-

Section: 26.7 [c.math] Status: NAD - Submitter: Beman Dawes Date: 2006-06-15

-

View other active issues in [c.math].

-

View all other issues in [c.math].

-

View all issues with NAD status.

-

Discussion:

-

-There is no div() function for unsigned integer types. -

-

-There are several possible resolutions. The simplest one is noted below. Other -possibilities include a templated solution. -

- - -

Proposed resolution:

-

-Add to 26.7 [lib.c.math] paragraph 8: -

- -
struct udiv_t div(unsigned, unsigned);
-struct uldiv_t div(unsigned long, unsigned long);
-struct ulldiv_t div(unsigned long long, unsigned long long);
-
- - - -

Rationale:

-Toronto: C99 does not have these unsigned versions because -the signed version exist just to define the implementation-defined behavior -of signed integer division. Unsigned integer division has no implementation-defined -behavior and thus does not need this treatment. - - - - - -
-

584. missing int pow(int,int) functionality

-

Section: 26.7 [c.math] Status: NAD - Submitter: Beman Dawes Date: 2006-06-15

-

View other active issues in [c.math].

-

View all other issues in [c.math].

-

View all issues with NAD status.

-

Discussion:

-

-There is no pow() function for any integral type. -

- - -

Proposed resolution:

-

-Add something like: -

- -
template< typename T>
-T power( T x, int n );
-// requires: n >=0
-
- - -

Rationale:

-Toronto: We already have double pow(integral, integral) from 26.7 [c.math] p11. - - - - - -
-

587. iststream ctor missing description

-

Section: D.7.2.1 [depr.istrstream.cons] Status: NAD Editorial - Submitter: Martin Sebor Date: 2006-06-22

-

View all issues with NAD Editorial status.

-

Discussion:

-

- -The iststream(char*, streamsize) ctor is in the class -synopsis in D.7.2 but its signature is missing in the description -below (in D.7.2.1). - -

- - -

Proposed resolution:

-

- -This seems like a simple editorial issue and the missing signature can -be added to the one for const char* in paragraph 2. - -

- -

[ -post Oxford: Noted that it is already fixed in -N2284 -]

- - - - - - -
-

590. Type traits implementation latitude should be removed for C++0x

-

Section: 20.4 [meta], TR1 4.9 [tr.meta.req] Status: NAD Editorial - Submitter: Beman Dawes Date: 2006-08-10

-

View all other issues in [meta].

-

View all issues with NAD Editorial status.

-

Discussion:

-

-20.4.9 [lib.meta.req], Implementation requirements, provides latitude for type -traits implementers that is not needed in C++0x. It includes the wording: -

- -

-[Note: the latitude granted to implementers in this clause is temporary, -and is expected to be removed in future revisions of this document. -- end note] -

- -

-Note: -N2157: Minor Modifications to the type traits Wording -also has the intent of removing this wording from the WP. -

- - - -

Proposed resolution:

-

-Remove 20.4.9 [lib.meta.req] in its entirety from the WP. -

- -

[ -post-Oxford: Recommend NAD Editorial. This resolution is now in the -current working draft. -]

- - - - - - - -
-

591. Misleading "built-in

-

Section: 18.2.1.2 [numeric.limits.members] Status: NAD Editorial - Submitter: whyglinux Date: 2006-08-08

-

View all other issues in [numeric.limits.members].

-

View all issues with NAD Editorial status.

-

Discussion:

-

-18.2.1.2 numeric_limits members [lib.numeric.limits.members] -Paragraph 7: -

-

-"For built-in integer types, the number of non-sign bits in the -representation." -

- -

-26.1 Numeric type requirements [lib.numeric.requirements] -Footnote: -

- -

-"In other words, value types. These include built-in arithmetic types, -pointers, the library class complex, and instantiations of valarray for -value types." -

- -

-Integer types (which are bool, char, wchar_t, and the signed and -unsigned integer types) and arithmetic types (which are integer and -floating types) are all built-in types and thus there are no -non-built-in (that is, user-defined) integer or arithmetic types. Since -the redundant "built-in" in the above 2 sentences can mislead that -there may be built-in or user-defined integer and arithmetic types -(which is not correct), the "built-in" should be removed. -

- - -

Proposed resolution:

-

-18.2.1.2 numeric_limits members [lib.numeric.limits.members] -Paragraph 7: -

-

-"For built-in integer types, the number of non-sign bits in the -representation." -

- -

-26.1 Numeric type requirements [lib.numeric.requirements] -Footnote: -

- -

-"In other words, value types. These include built-in arithmetic types, -pointers, the library class complex, and instantiations of valarray for -value types." -

- - -

Rationale:

-

-Recommend NAD / Editorial. The proposed resolution is accepted as editorial. -

- - - - - -
-

592. Incorrect treatment of rdbuf()->close() return type

-

Section: 27.8.1.9 [ifstream.members] Status: Pending NAD Editorial - Submitter: Christopher Kohlhoff Date: 2006-08-17

-

View all other issues in [ifstream.members].

-

View all issues with Pending NAD Editorial status.

-

Discussion:

-

-I just spotted a minor problem in 27.8.1.7 -[lib.ifstream.members] para 4 and also 27.8.1.13 -[lib.fstream.members] para 4. In both places it says: -

-
-
void close();
-
-

-Effects: Calls rdbuf()->close() and, if that function returns false, ... -

-
-

-However, basic_filebuf::close() (27.8.1.2) returns a pointer to the -filebuf on success, null on failure, so I think it is meant to -say "if that function returns a null pointer". Oddly, it is -correct for basic_ofstream. -

- - -

Proposed resolution:

-

-Change 27.8.1.9 [ifstream.members], p5: -

- -

-Effects: Calls rdbuf()->close() and, if that function -fails (returns false a null pointer), -calls setstate(failbit) (which may throw ios_base::failure -(27.4.4.3)). -

- -

-Change 27.8.1.17 [fstream.members], p5: -

- -

-Effects: Calls rdbuf()->close() and, if that function -fails (returns false a null pointer), -calls setstate(failbit) (which may throw ios_base::failure -(27.4.4.3)). -

- - - -

[ -Kona (2007): Proposed Disposition: NAD, Editorial -]

- - - - - -
-

594. Disadvantages of defining Swappable in terms of CopyConstructible and Assignable

-

Section: 20.1.1 [utility.arg.requirements] Status: Pending NAD Editorial - Submitter: Niels Dekker Date: 2006-11-02

-

View other active issues in [utility.arg.requirements].

-

View all other issues in [utility.arg.requirements].

-

View all issues with Pending NAD Editorial status.

-

Discussion:

-

-It seems undesirable to define the Swappable requirement in terms of -CopyConstructible and Assignable requirements. And likewise, once the -MoveConstructible and MoveAssignable requirements (N1860) have made it -into the Working Draft, it seems undesirable to define the Swappable -requirement in terms of those requirements. Instead, it appears -preferable to have the Swappable requirement defined exclusively in -terms of the existence of an appropriate swap function. -

-

-Section 20.1.4 [lib.swappable] of the current Working Draft (N2009) -says: -

-

-The Swappable requirement is met by satisfying one or more of the -following conditions:

-
    -
  • -T is Swappable if T satisfies the CopyConstructible requirements -(20.1.3) and the Assignable requirements (23.1); -
  • -
  • -T is Swappable if a namespace scope function named swap exists in the -same namespace as the definition of T, such that the expression -swap(t,u) is valid and has the semantics described in Table 33. -
  • -
-
-I can think of three disadvantages of this definition: -
    -
  1. -If a client's type T satisfies the first condition (T is both -CopyConstructible and Assignable), the client cannot stop T from -satisfying the Swappable requirement without stopping T from -satisfying the first condition. -

    -A client might want to stop T from satisfying the Swappable -requirement, because swapping by means of copy construction and -assignment might throw an exception, and she might find a throwing -swap unacceptable for her type. On the other hand, she might not feel -the need to fully implement her own swap function for this type. In -this case she would want to be able to simply prevent algorithms that -would swap objects of type T from being used, e.g., by declaring a -swap function for T, and leaving this function purposely undefined. -This would trigger a link error, if an attempt would be made to use -such an algorithm for this type. For most standard library -implementations, this practice would indeed have the effect of -stopping T from satisfying the Swappable requirement. -

    -
  2. -
  3. -A client's type T that does not satisfy the first condition can not be -made Swappable by providing a specialization of std::swap for T. -

    -While I'm aware about the fact that people have mixed feelings about -providing a specialization of std::swap, it is well-defined to do so. -It sounds rather counter-intuitive to say that T is not Swappable, if -it has a valid and semantically correct specialization of std::swap. -Also in practice, providing such a specialization will have the same -effect as satisfying the Swappable requirement. -

    -
  4. -
  5. -For a client's type T that satisfies both conditions of the Swappable -requirement, it is not specified which of the two conditions prevails. -After reading section 20.1.4 [lib.swappable], one might wonder whether -objects of T will be swapped by doing copy construction and -assignments, or by calling the swap function of T. -

    -I'm aware that the intention of the Draft is to prefer calling the -swap function of T over doing copy construction and assignments. Still -in my opinion, it would be better to make this clear in the wording of -the definition of Swappable. -

    -
  6. -
-

-I would like to have the Swappable requirement defined in such a way -that the following code fragment will correctly swap two objects of a -type T, if and only if T is Swappable: -

-
   using std::swap;
-   swap(t, u);  // t and u are of type T.
-
-

-This is also the way Scott Meyers recommends calling a swap function, -in Effective C++, Third Edition, item 25. -

-

-Most aspects of this issue have been dealt with in a discussion on -comp.std.c++ about the Swappable requirement, from 13 September to 4 -October 2006, including valuable input by David Abrahams, Pete Becker, -Greg Herlihy, Howard Hinnant and others. -

- -

Proposed resolution:

-

-Change section 20.1.4 [lib.swappable] as follows: -

-

-The Swappable requirement is met by satisfying -one or more of the following conditions: -the following condition:

-
    - -
  • -T is Swappable if T satisfies the CopyConstructible requirements -(20.1.3) and the Assignable requirements (23.1); -
  • -
  • - -T is Swappable if a namespace scope function named swap exists in the -same namespace as the definition of T, such that the expression -swap(t,u) is valid and has the semantics described in Table 33. - -T is Swappable if an unqualified function call swap(t,u) is valid -within the namespace std, and has the semantics described in Table 33. -
  • -
-
- - -

Rationale:

-

-Recommend NAD. Concepts, specifically -N2082 -and -N2084, -will essentially rewrite this section and provide the desired semantics. -

- - - - - -
-

615. Inconsistencies in Section 21.4

-

Section: 21.5 [c.strings] Status: NAD Editorial - Submitter: Bo Persson Date: 2006-12-11

-

View all other issues in [c.strings].

-

View all issues with NAD Editorial status.

-

Discussion:

-

-In the current draft N2134, 21.4/1 says -

-

-"Tables 59,228) 60, 61, 62,and 63 229) 230) describe headers <cctype>, -<cwctype>, <cstring>, <cwchar>, and <cstdlib> (character conversions), -respectively." -

-

-Here footnote 229 applies to table 62, not table 63. -

-

-Also, footnote 230 lists the new functions in table 63, "atoll, strtoll, -strtoull, strtof, and strtold added by TR1". However, strtof is not present -in table 63. -

- - -

Proposed resolution:

-

-

- - -

Rationale:

-

-Recommend NAD, editorial. Send to Pete. -

- - - - - -
-

633. Return clause mentions undefined "type()"

-

Section: 20.5.15.2.5 [func.wrap.func.targ] Status: NAD Editorial - Submitter: Daniel Krügler Date: 2007-02-03

-

View all issues with NAD Editorial status.

-

Discussion:

-

-20.5.15.2.5 [func.wrap.func.targ], p4 says: -

-

-Returns: If type() == typeid(T), a pointer to the stored -function target; otherwise a null pointer. -

- -
    -
  1. -There exists neither a type, a typedef type, nor member -function type() in class template function nor in the global or -std namespace. -
  2. -
  3. -Assuming that type should have been target_type(), -this description would lead to false results, if T = cv -void due to returns clause 20.5.15.2.5 [func.wrap.func.targ], p1. -
  4. -
- - - -

Proposed resolution:

-

-Change 20.5.15.2.5 [func.wrap.func.targ], p4: -

- -

-Returns: If type() target_type() == typeid(T) && typeid(T) != -typeid(void), a pointer to the stored function target; -otherwise a null pointer. -

- -

[ -Pete: Agreed. It's editorial, so I'll fix it. -]

- - - - - - - -
-

636. 26.5.2.3 valarray::operator[]

-

Section: 26.5.2.3 [valarray.access] Status: NAD Editorial - Submitter: Bo Persson Date: 2007-02-11

-

View all other issues in [valarray.access].

-

View all issues with NAD Editorial status.

-

Discussion:

-

-The signature of the const operator[] has been changed to return a const -reference. -

-

-The description in paragraph 1 still says that the operator returns by -value. -

-

[ -Pete recommends editorial fix. -]

- - - -

Proposed resolution:

-

-

- - - - - -
-

637. [c.math]/10 inconsistent return values

-

Section: 26.7 [c.math] Status: NAD Editorial - Submitter: Bo Persson Date: 2007-02-13

-

View other active issues in [c.math].

-

View all other issues in [c.math].

-

View all issues with NAD Editorial status.

-

Discussion:

-

-26.7 [c.math], paragraph 10 has long lists of added signatures for float and long double -functions. All the signatures have float/long double return values, which is -inconsistent with some of the double functions they are supposed to -overload. -

- - -

Proposed resolution:

-

-Change 26.7 [c.math], paragraph 10, -

- -
float int ilogb(float);
-float long lrint(float);
-float long lround(float);
-float long long llrint(float);
-float long long llround(float);
-
-long double int ilogb(long double);
-long double long lrint(long double);
-long double long lround(long double);
-long double long long llrint(long double);
-long double long long llround(long double);
-
- - - - - -
-

639. Still problems with exceptions during streambuf IO

-

Section: 27.6.1.2.3 [istream::extractors], 27.6.2.6.3 [ostream.inserters] Status: NAD - Submitter: Daniel Krügler Date: 2007-02-17

-

View all other issues in [istream::extractors].

-

View all issues with NAD status.

-

Discussion:

-

-There already exist two active DR's for the wording of 27.6.1.2.3 [istream::extractors]/13 -from 14882:2003(E), namely 64 and 413. -

- -

-Even with these proposed corrections, already maintained in N2134, -I have the feeling, that the current wording does still not properly -handle the "exceptional" situation. The combination of para 14 -

- -

-"[..] Characters are extracted and inserted until -any of the following occurs: -

-

-[..] -

-

-- an exception occurs (in which case the exception is caught)." -

- -

-and 15 -

- -

-"If the function inserts no characters, it calls setstate(failbit), -which -may throw ios_base::failure (27.4.4.3). If it inserted no characters -because it caught an exception thrown while extracting characters -from *this and failbit is on in exceptions() (27.4.4.3), then the -caught -exception is rethrown." -

- -

-both in N2134 seems to imply that any exception, which occurs -*after* at least one character has been inserted is caught and lost -for -ever. It seems that even if failbit is on in exceptions() rethrow is -not -allowed due to the wording "If it inserted no characters because it -caught an exception thrown while extracting". -

- -

-Is this behaviour by design? -

- -

-I would like to add that its output counterpart in 27.6.2.6.3 [ostream.inserters]/7-9 -(also -N2134) does not demonstrate such an exception-loss-behaviour. -On the other side, I wonder concerning several subtle differences -compared to input:: -

-

-1) Paragraph 8 says at its end: -

- -

-"- an exception occurs while getting a character from sb." -

- -

-Note that there is nothing mentioned which would imply that such -an exception will be caught compared to 27.6.1.2.3 [istream::extractors]/14. -

- -

-2) Paragraph 9 says: -

- -

-"If the function inserts no characters, it calls setstate(failbit) -(which -may throw ios_base::failure (27.4.4.3)). If an exception was thrown -while extracting a character, the function sets failbit in error -state, -and if failbit is on in exceptions() the caught exception is -rethrown." -

- -

-The sentence starting with "If an exception was thrown" seems to -imply that such an exception *should* be caught before. -

- - -

Proposed resolution:

-

-(a) In 27.6.1.2.3 [istream::extractors]/15 (N2134) change the sentence -

- -

-If the function inserts no characters, it calls -setstate(failbit), which may throw ios_base::failure -(27.4.4.3). If it inserted no characters because it caught an -exception thrown while extracting characters from *this -an exception was thrown while extracting a character from -*this, the function sets failbit in error state, -and failbit is on in exceptions() (27.4.4.3), then the -caught exception is rethrown. -

- -

-(b) In 27.6.2.6.3 [ostream.inserters]/8 (N2134) change the sentence: -

- -
-

-Gets characters from sb and inserts them in *this. -Characters are read from sb and inserted until any of the -following occurs: -

-
    -
  • end-of-file occurs on the input sequence;
  • -
  • inserting in the output sequence fails (in which case the character to be inserted is not extracted);
  • -
  • an exception occurs while getting a character from sb (in which -case the exception is caught).
  • -
-
- - - -

Rationale:

-This extractor is described as a formatted input function so the -exception behavior is already specified. There is additional behavior -described in this section that applies to the case in which failbit is -set. This doesn't contradict the usual exception behavior for formatted -input functions because that applies to the case in which badbit is set. - - - - - -
-

641. Editorial fix for 27.6.4 (N2134)

-

Section: 27.6.4 [ext.manip] Status: NAD Editorial - Submitter: Daniel Krügler Date: 2007-02-18

-

View all other issues in [ext.manip].

-

View all issues with NAD Editorial status.

-

Discussion:

-

-The function f in para 4 (27.6.4 [ext.manip]) references an unknown strm -in the following line: -

- -
mg.get(Iter(str.rdbuf()), Iter(), intl, strm, err, mon);
-
- - -

Proposed resolution:

-

-Change 27.6.4 [ext.manip], p4: -

- -
mg.get(Iter(str.rdbuf()), Iter(), intl, strm, err, mon);
-
- -

[ -Oxford: Editorial. -]

- - - - - - - -
-

642. Invalidated fstream footnotes in N2134

-

Section: 27.8.1.9 [ifstream.members], 27.8.1.13 [ofstream.members] Status: NAD Editorial - Submitter: Daniel Krügler Date: 2007-02-20

-

View all other issues in [ifstream.members].

-

View all issues with NAD Editorial status.

-

Discussion:

-

-The standard wording of N2134 has extended the 14882:2003(E) -wording for the ifstream/ofstream/fstream open function to fix -a long standing problem, see 409. -

- -

-Now it's properly written as -

- -

-"If that function does not return a null pointer calls clear(), -otherwise -calls setstate(failbit)[..]" -

- -

-instead of the previous -

- -

-"If that function returns a null pointer, calls setstate(failbit)[..] -

- -

-While the old footnotes saying -

- -

-"A successful open does not change the error state." -

- -

-where correct and important, they are invalid now for ifstream and -ofstream (because clear *does* indeed modify the error state) and -should be removed (Interestingly fstream itself never had these, -although -they where needed for that time). -

- - -

Proposed resolution:

-

-In 27.8.1.9 [ifstream.members], remove footnote: -

- -

-334) A successful open does not change the error state. -

- -

-In 27.8.1.13 [ofstream.members], remove footnote: -

- -

-335) A successful open does not change the error state. -

- - - - - - -
-

647. Inconsistent regex_search params

-

Section: 28.11.3 [re.alg.search] Status: NAD Editorial - Submitter: Daniel Krügler Date: 2007-02-26

-

View all issues with NAD Editorial status.

-

Discussion:

-

-28.11.3 [re.alg.search]/5 declares -

- -
template <class iterator, class charT, class traits>
-bool regex_search(iterator first, iterator last,
-                  const basic_regex<charT, traits>& e,
-                  regex_constants::match_flag_type flags =
-                      regex_constants::match_default);
-
- -

-where it's not explained, which iterator category -the parameter iterator belongs to. This is inconsistent -to the preceding declaration in the synopsis section -28.4 [re.syn], which says: -

- -
template <class BidirectionalIterator, class charT, class traits>
-bool regex_search(BidirectionalIterator first, BidirectionalIterator last,
-                  const basic_regex<charT, traits>& e,
-                  regex_constants::match_flag_type flags =
-                      regex_constants::match_default);
-
- - -

Proposed resolution:

-

-In 28.11.3 [re.alg.search]/5 replace all three occurences of param "iterator" with -"BidirectionalIterator" -

- -
template <class iterator BidirectionalIterator, class charT, class traits>
-  bool regex_search(iterator BidirectionalIterator first, iterator BidirectionalIterator last, 
-                    const basic_regex<charT, traits>& e, 
-                    regex_constants::match_flag_type flags = 
-                      regex_constants::match_default);
-
-

--6- Effects: Behaves "as if" by constructing an object what of -type match_results<iterator -BidirectionalIterator> and then returning the result -of regex_search(first, last, what, e, flags). -

-
- - -

Rationale:

-Applied to working paper while issue was still in New status. - - - - - -
-

648. regex_iterator c'tor needs clarification/editorial fix

-

Section: 28.12.1.1 [re.regiter.cnstr] Status: NAD Editorial - Submitter: Daniel Krügler Date: 2007-03-03

-

View all issues with NAD Editorial status.

-

Discussion:

-

-In 28.12.1.1 [re.regiter.cnstr]/2 the effects paragraph starts with: -

- -
-

-Effects: Initializes begin and end to point to the beginning and the -end of the target sequence, sets pregex to &re, sets flags to f,[..] -

- -

-There are two issues with this description: -

- -
    -
  1. -The meaning of very first part of this quote is unclear, because -there is no target sequence provided, instead there are given two -parameters a and b, both of type BidirectionalIterator. The mentioned -part does not explain what a and b represent. -
  2. -
  3. -There does not exist any parameter f, but instead a parameter -m in the constructor declaration, so this is actually an editorial -fix. -
  4. -
- - -

Proposed resolution:

-

-In 28.12.1.1 [re.regiter.cnstr]/2 change the above quoted part by -

- -

-Effects: Initializes begin and end to point to -the beginning and the end of the target sequence designated by the -iterator range [a, b), sets pregex to -&re, sets flags to f -m, then calls regex_search(begin, end, match, -*pregex, flags). If this call returns false the -constructor sets *this to the end-of-sequence iterator. -

- - - - - -
-

649. Several typos in regex_token_iterator constructors

-

Section: 28.12.2.1 [re.tokiter.cnstr] Status: NAD Editorial - Submitter: Daniel Krügler Date: 2007-03-03

-

View all other issues in [re.tokiter.cnstr].

-

View all issues with NAD Editorial status.

-

Discussion:

-

-In 28.12.2.1 [re.tokiter.cnstr]/1+2 both the constructor declaration -and the following text shows some obvious typos: -

-

-1) The third constructor form is written as -

-
template <std::size_t N>
-  regex_token_iterator(BidirectionalIterator a, BidirectionalIterator b, 
-                       const regex_type& re, 
-                       const int (&submatches)[R], 
-                       regex_constants::match_flag_type m = 
-                         regex_constants::match_default);
-
- -

-where the dimensions of submatches are specified by an -unknown value R, which should be N. -

-

-2) Paragraph 2 of the same section says in its last sentence: -

- -

-The third constructor initializes the member subs to hold a -copy of the sequence of integer values pointed to by the iterator range -[&submatches, &submatches + R). -

- -

-where again R must be replaced by N. -

- -

-3) Paragraph 3 of the same section says in its first sentence: -

- -

-Each constructor then sets N to 0, and -position to position_iterator(a, b, re, f). -

- -

-where a non-existing parameter "f" is mentioned, which must be -replaced -by the parameter "m". -

- - -

Proposed resolution:

-

-Change 28.12.2.1 [re.tokiter.cnstr]/1: -

-
template <std::size_t N>
-  regex_token_iterator(BidirectionalIterator a, BidirectionalIterator b, 
-                       const regex_type& re, 
-                       const int (&submatches)[R N], 
-                       regex_constants::match_flag_type m = 
-                         regex_constants::match_default);
-
- -

-Change 28.12.2.1 [re.tokiter.cnstr]/2: -

- -

-Effects: The first constructor initializes the member -subs to hold the single value submatch. The second -constructor initializes the member subs to hold a copy of the -argument submatches. The third constructor initializes the -member subs to hold a copy of the sequence of integer values -pointed to by the iterator range [&submatches, &submatches + -R N). -

- -

-Change 28.12.2.1 [re.tokiter.cnstr]/3: -

- -

-Each constructor then sets N to 0, and -position to position_iterator(a, b, re, f -m). If position is not an end-of-sequence -iterator the constructor sets result to the address of the -current match. Otherwise if any of the values stored in subs is -equal to -1 the constructor sets *this to a suffix -iterator that points to the range [a, b), otherwise the -constructor sets *this to an end-of-sequence iterator. -

- - - - - - -
-

656. Typo in subtract_with_carry_engine declaration

-

Section: 26.4.2 [rand.synopsis] Status: NAD Editorial - Submitter: Daniel Krügler Date: 2007-03-08

-

View all other issues in [rand.synopsis].

-

View all issues with NAD Editorial status.

-

Discussion:

-

-26.4.2 [rand.synopsis] the header <random> synopsis -contains an unreasonable closing curly brace inside the -subtract_with_carry_engine declaration. -

- - -

Proposed resolution:

-

-Change the current declaration in 26.4.2 [rand.synopsis] -

- -
template <class UIntType, size_t w}, size_t s, size_t r>
-class subtract_with_carry_engine;
-
- - -

[ -Pete: Recommends editorial. -]

- - - - - -
-

657. unclear requirement about header inclusion

-

Section: 17.4.2.1 [using.headers] Status: NAD - Submitter: Gennaro Prota Date: 2007-03-14

-

View all issues with NAD status.

-

Discussion:

-

-17.4.2.1 [using.headers] states: -

- -

-A translation unit shall include a header only outside of any -external declaration or definition, [...] -

- -

-I see three problems with this requirement: -

- -
    -
  1. The C++ standard doesn't define what an "external declaration" or -an "external definition" are (incidentally the C99 standard does, and -has a sentence very similar to the above regarding header inclusion). -

    -I think the intent is that the #include directive shall lexically -appear outside *any* declaration; instead, when the issue was pointed -out on comp.std.c++ at least one poster interpreted "external -declaration" as "declaration of an identifier with external linkage". -If this were the correct interpretation, then the two inclusions below -would be legal: -

    -
      // at global scope
    -  static void f()
    -  {
    -# include <cstddef>
    -  }
    -
    -  static void g()
    -  {
    -# include <stddef.h>
    -  }
    -
    -

    -(note that while the first example is unlikely to compile correctly, -the second one may well do) -

  2. - -
  3. as the sentence stands, violations will require a diagnostic; is -this the intent? It was pointed out on comp.std.c++ (by several -posters) that at least one way to ensure a diagnostic exists: -

    -

    - [If there is an actual file for each header,] one simple way - to implement this would be to insert a reserved identifier - such as __begin_header at the start of each standard header. - This reserved identifier would be ignored for all other - purposes, except that, at the appropriate point in phase 7, if - it is found inside an external definition, a diagnostic is - generated. There's many other similar ways to achieve the same - effect. -

    -

    --James Kuyper, on comp.std.c++ -

  4. - -
  5. is the term "header" meant to be limited to standard headers? -Clause 17 is all about the library, but still the general question is -interesting and affects one of the points in the explicit namespaces -proposal (n1691): -

    -

    - Those seeking to conveniently enable argument-dependent - lookups for all operators within an explicit namespace - could easily create a header file that does so: -

        namespace mymath::
    -    {
    -        #include "using_ops.hpp"
    -    }
    -
    -
  6. -
- - -

Proposed resolution:

-

-

- - -

Rationale:

-We believe that the existing language does not cause any real confusion -and any new formulation of the rules that we could come up with are -unlikely to be better than what's already in the standard. - - - - - -
-

658. Two unspecified function comparators in [function.objects]

-

Section: 20.5 [function.objects] Status: NAD Editorial - Submitter: Daniel Krügler Date: 2007-03-19

-

View all other issues in [function.objects].

-

View all issues with NAD Editorial status.

-

Discussion:

-

-The header <functional> synopsis in 20.5 [function.objects] -contains the following two free comparison operator templates -for the function class template -

- -
template<class Function1, class Function2>
-void operator==(const function<Function1>&, const function<Function2>&);
-template<class Function1, class Function2>
-void operator!=(const function<Function1>&, const function<Function2>&);
-
- -

-which are nowhere described. I assume that they are relicts before the -corresponding two private and undefined member templates in the function -template (see 20.5.15.2 [func.wrap.func] and X [func.wrap.func.undef]) have been introduced. The original free -function templates should be removed, because using an undefined entity -would lead to an ODR violation of the user. -

- - -

Proposed resolution:

-

-Remove the above mentioned two function templates from -the header <functional> synopsis (20.5 [function.objects]) -

- -
template<class Function1, class Function2>
-void operator==(const function<Function1>&, const function<Function2>&);
-template<class Function1, class Function2>
-void operator!=(const function<Function1>&, const function<Function2>&);
-
- - - -

Rationale:

-Fixed by -N2292 -Standard Library Applications for Deleted Functions. - - - - - -
-

662. Inconsistent handling of incorrectly-placed thousands separators

-

Section: 22.2.2.1.2 [facet.num.get.virtuals] Status: NAD - Submitter: Cosmin Truta Date: 2007-04-05

-

View other active issues in [facet.num.get.virtuals].

-

View all other issues in [facet.num.get.virtuals].

-

View all issues with NAD status.

-

Discussion:

-

-From Section 22.2.2.1.2 [facet.num.get.virtuals], paragraphs 11 and 12, it is implied -that the value read from a stream must be stored -even if the placement of thousands separators does not conform to the -grouping() specification from the numpunct facet. -Since incorrectly-placed thousands separators are flagged as an extraction -failure (by the means of failbit), we believe it is better not -to store the value. A consistent strategy, in which any kind of extraction -failure leaves the input item intact, is conceptually cleaner, is able to avoid -corner-case traps, and is also more understandable from the programmer's point -of view. -

-

-Here is a quote from "The C++ Programming Language (Special Edition)" -by B. Stroustrup (Section D.4.2.3, pg. 897): -

-

-"If a value of the desired type could not be read, failbit is set in r. -[...] An input operator will use r to determine how to set the state of its -stream. If no error was encountered, the value read is assigned through v; -otherwise, v is left unchanged." -

-

-This statement implies that rdstate() alone is sufficient to -determine whether an extracted value is to be assigned to the input item -val passed to do_get. However, this is in disagreement -with the current C++ Standard. The above-mentioned assumption is true in all -cases, except when there are mismatches in digit grouping. In the latter case, -the parsed value is assigned to val, and, at the same time, err -is assigned to ios_base::failbit (essentially "lying" about the -success of the operation). Is this intentional? The current behavior raises -both consistency and usability concerns. -

-

-Although digit grouping is outside the scope of scanf (on which -the virtual methods of num_get are based), handling of grouping -should be consistent with the overall behavior of scanf. The specification of -scanf makes a distinction between input failures and matching -failures, and yet both kinds of failures have no effect on the input items -passed to scanf. A mismatch in digit grouping logically falls in -the category of matching failures, and it would be more consistent, and less -surprising to the user, to leave the input item intact whenever a failure is -being signaled. -

-

-The extraction of bool is another example outside the scope of -scanf, and yet consistent, even in the event of a successful -extraction of a long but a failed conversion from -long to bool. -

-

-Inconsistency is further aggravated by the fact that, when failbit is set, -subsequent extraction operations are no-ops until failbit is -explicitly cleared. Assuming that there is no explicit handling of -rdstate() (as in cin>>i>>j) it is -counter-intuitive to be able to extract an integer with mismatched digit -grouping, but to be unable to extract another, properly-formatted integer -that immediately follows. -

-

-Moreover, setting failbit, and selectively assigning a value to -the input item, raises usability problems. Either the strategy of -scanf (when there is no extracted value in case of failure), or -the strategy of the strtol family (when there is always an -extracted value, and there are well-defined defaults in case of a failure) are -easy to understand and easy to use. On the other hand, if failbit -alone cannot consistently make a difference between a failed extraction, and a -successful but not-quite-correct extraction whose output happens to be the same -as the previous value, the programmer must resort to implementation tricks. -Consider the following example: -

-
    int i = old_i;
-    cin >> i;
-    if (cin.fail())
-        // can the value of i be trusted?
-        // what does it mean if i == old_i?
-        // ...
-
-

-Last but not least, the current behvaior is not only confusing to the casual -reader, but it has also been confusing to some book authors. Besides -Stroustrup's book, other books (e.g. "Standard C++ IOStreams and Locales" by -Langer and Kreft) are describing the same mistaken assumption. Although books -are not to be used instead of the standard reference, the readers of these -books, as well as the people who are generally familiar to scanf, -are even more likely to misinterpret the standard, and expect the input items -to remain intact when a failure occurs. -

- - -

Proposed resolution:

- -

-Change 22.2.2.1.2 [facet.num.get.virtuals]: -

- -
-

-Stage 3: The result of stage 2 processing can be one of -

-
    -
  • A sequence of chars has been accumulated in stage 2 that is converted (according to the rules of scanf) to a value of the type of val. This value is stored in val and ios_base::goodbit is stored in err.
  • - -
  • The sequence of chars accumulated in stage 2 would have caused scanf to report an input failure. ios_base::failbit is assigned to err.
  • -
-

-In the first case, Ddigit grouping is checked. That is, the positions of discarded separators is examined for consistency with use_facet<numpunct<charT> >(loc).grouping(). If they are not consistent then ios_base::failbit is assigned to err. Otherwise, the value that was converted in stage 2 is stored in val and ios_base::goodbit is stored in err. -

-
- - -

Rationale:

-post-Toronto: Changed from New to NAD at the request of the author. The preferred solution of -N2327 -makes this resolution obsolete. - - - - - -
-

663. Complexity Requirements

-

Section: 17.3.1.3 [structure.specifications] Status: NAD - Submitter: Thomas Plum Date: 2007-04-16

-

View all other issues in [structure.specifications].

-

View all issues with NAD status.

-

Discussion:

-

-17.3.1.3 [structure.specifications] para 5 says -

- -

--5- Complexity requirements specified in the library  -clauses are upper bounds, and implementations that provide better -complexity guarantees satisfy the requirements. -

- -

-The following -objection has been raised: -

- -

-The library clauses suggest general -guidelines regarding complexity, but we have been unable to discover -any absolute hard-and-fast formulae for these requirements.  Unless -or until the Library group standardizes specific hard-and-fast -formulae, we regard all the complexity requirements as subject to a  -"fudge factor" without any intrinsic upper bound. -

- -

-[Plum ref  -_23213Y31 etc] -

- - -

Proposed resolution:

-

-

- - -

Rationale:

-Kona (2007): No specific instances of underspecification have been -identified, and big-O notation always involves constant factors. - - - - - -
-

683. regex_token_iterator summary error

-

Section: 28.12.2 [re.tokiter] Status: Pending NAD Editorial - Submitter: Eric Niebler Date: 2007-06-02

-

View all other issues in [re.tokiter].

-

View all issues with Pending NAD Editorial status.

-

Discussion:

-

-28.12.2 [re.tokiter], p3 says: -

-
-

-After it is constructed, the iterator finds and stores a value -match_results<BidirectionalIterator> position and sets the -internal count N to zero. -

-
- -

-Should read: -

- -
-

-After it is constructed, the iterator finds and stores a value -match_resultsregex_iterator<BidirectionalIterator, charT, traits> -position and sets the internal count N to zero. -

-
- -

[ -John adds: -]

- - -

-Yep, looks like a typo/administrative fix to me. -

- - - -

Proposed resolution:

-

-

- - - - - -
-

690. abs(long long) should return long long

-

Section: 26.7 [c.math] Status: NAD Editorial - Submitter: Niels Dekker Date: 2007-06-10

-

View other active issues in [c.math].

-

View all other issues in [c.math].

-

View all issues with NAD Editorial status.

-

Discussion:

-

-Quoting the latest draft (n2135), 26.7 [c.math]: -

- -
-

-The added signatures are: -

-
long abs(long); // labs()
-long abs(long long); // llabs()
-
-
-

-Shouldn't abs(long long) have long long as return type? -

- - -

Proposed resolution:

-

-Change 26.7 [c.math]: -

-
long long abs(long long); // llabs()
-
- - -

Rationale:

-Had already been fixed in the WP by the time the LWG reviewed this. - - - - - - \ No newline at end of file diff --git a/libstdc++-v3/docs/html/ext/lwg-defects.html b/libstdc++-v3/docs/html/ext/lwg-defects.html deleted file mode 100644 index cefbee652e6..00000000000 --- a/libstdc++-v3/docs/html/ext/lwg-defects.html +++ /dev/null @@ -1,24284 +0,0 @@ - -C++ Standard Library Defect Report List - - - - - - - - - - - - - - - - - - - - - -
Doc. no.N2457=07-0327
Date:2007-10-20
Project:Programming Language C++
Reply to:Howard Hinnant <howard.hinnant@gmail.com>
-

C++ Standard Library Defect Report List (Revision R52)

- -

Reference ISO/IEC IS 14882:1998(E)

-

Also see:

- -

This document contains only library issues which have been closed - by the Library Working Group (LWG) after being found to be defects - in the standard. That is, issues which have a status of DR, - TC, or RR. See the - Library Closed Issues List for issues closed as non-defects. See the - Library Active Issues List for active issues and more information. The - introductory material in that document also applies to this - document.

- -

Revision History

-
    -
  • R52: -2007-10-19 post-Kona mailing. - -
  • -
  • R51: -2007-09-09 pre-Kona mailing. - -
  • -
  • R50: -2007-08-05 post-Toronto mailing. -
      -
    • Summary:
        -
      • 153 open issues, down by 5.
      • -
      • 555 closed issues, up by 17.
      • -
      • 708 issues total, up by 12.
      • -
    • -
    • Details:
        -
      • Added the following New issues: 697, 698, 699, 700, 701, 702, 703, 704, 705, 706, 707, 708.
      • -
      • Changed the following issues from New to NAD: 583, 584, 662.
      • -
      • Changed the following issues from Open to NAD: 528.
      • -
      • Changed the following issues from New to NAD Editorial: 637, 647, 658, 690.
      • -
      • Changed the following issues from Open to NAD Editorial: 525.
      • -
      • Changed the following issues from Pending NAD Editorial to NAD Editorial: 553, 571, 591, 633, 636, 641, 642, 648, 649, 656.
      • -
      • Changed the following issues from New to Open: 579, 631, 680.
      • -
      • Changed the following issues from Pending WP to Open: 258.
      • -
      • Changed the following issues from Ready to Pending WP: 644.
      • -
      • Changed the following issues from New to Ready: 577, 660.
      • -
      • Changed the following issues from Open to Ready: 488.
      • -
      • Changed the following issues from Open to Review: 518.
      • -
      • Changed the following issues from Ready to TRDec: 604.
      • -
      • Changed the following issues from DR to WP: 453.
      • -
      • Changed the following issues from Ready to WP: 531, 551, 566, 628, 640, 643, 646.
      • -
    • -
    -
  • -
  • R49: -2007-06-23 pre-Toronto mailing. -
      -
    • Summary:
        -
      • 158 open issues, up by 13.
      • -
      • 538 closed issues, up by 7.
      • -
      • 696 issues total, up by 20.
      • -
    • -
    • Details:
        -
      • Added the following New issues: 677, 678, 679, 680, 681, 682, 684, 685, 686, 687, 688, 689, 690, 691, 692, 693, 694, 695, 696.
      • -
      • Added the following Pending NAD Editorial issues: 683.
      • -
      • Changed the following issues from New to NAD Editorial: 587.
      • -
      • Changed the following issues from Open to NAD Editorial: 590.
      • -
      • Changed the following issues from New to Pending NAD Editorial: 636, 642, 648, 649.
      • -
    • -
    -
  • -
  • R48: -2007-05-06 post-Oxford mailing. - -
  • -
  • R47: -2007-03-09 pre-Oxford mailing. - -
  • -
  • R46: -2007-01-12 mid-term mailing. -
      -
    • Summary:
        -
      • 141 open issues, up by 11.
      • -
      • 478 closed issues, down by 1.
      • -
      • 619 issues total, up by 10.
      • -
    • -
    • Details:
    • -
    -
  • -
  • R45: -2006-11-03 post-Portland mailing. - -
  • -
  • R44: -2006-09-08 pre-Portland mailing. -
      -
    • Summary:
        -
      • 130 open issues, up by 6.
      • -
      • 462 closed issues, down by 1.
      • -
      • 592 issues total, up by 5.
      • -
    • -
    • Details:
    • -
    -
  • -
  • R43: -2006-06-23 mid-term mailing. -
      -
    • Summary:
        -
      • 124 open issues, up by 14.
      • -
      • 463 closed issues, down by 1.
      • -
      • 587 issues total, up by 13.
      • -
    • -
    • Details:
    • -
    -
  • -
  • R42: -2006-04-21 post-Berlin mailing. - -
  • -
  • R41: -2006-02-24 pre-Berlin mailing. -
      -
    • Summary:
        -
      • 126 open issues, up by 31.
      • -
      • 440 closed issues, up by 0.
      • -
      • 566 issues total, up by 31.
      • -
    • -
    • Details:
        -
      • Added new issues 536-566.
      • -
      • Moved 342 from Ready to Open.
      • -
      • Reopened 309.
      • -
    • -
    -
  • -
  • R40: -2005-12-16 mid-term mailing. -
      -
    • Summary:
        -
      • 95 open issues.
      • -
      • 440 closed issues.
      • -
      • 535 issues total.
      • -
    • -
    • Details:
    • -
    -
  • -
  • R39: -2005-10-14 post-Mont Tremblant mailing. -Added new issues 526-528. -Moved issues 280, 461, 464, 465, 467, 468, 474, 496 from Ready to WP as per the vote from Mont Tremblant. -Moved issues 247, 294, 342, 362, 369, 371, 376, 384, 475, 478, 495, 497 from Review to Ready. -Moved issues 498, 504, 506, 509, 510, 511, 512, 513, 514 from New to Open. -Moved issues 505, 507, 508, 519 from New to Ready. -Moved issue 500 from New to NAD. -Moved issue 518 from New to Review. -
  • -
  • R38: -2005-07-03 pre-Mont Tremblant mailing. -Merged open TR1 issues in 504-522. -Added new issues 523-523 -
  • -
  • R37: -2005-06 mid-term mailing. -Added new issues 498-503. -
  • -
  • R36: -2005-04 post-Lillehammer mailing. All issues in "ready" status except -for 454 were moved to "DR" status, and all issues -previously in "DR" status were moved to "WP". -
  • -
  • R35: -2005-03 pre-Lillehammer mailing. -
  • -
  • R34: -2005-01 mid-term mailing. Added new issues 488-494. -
  • -
  • R33: -2004-11 post-Redmond mailing. Reflects actions taken in Redmond. -
  • -
  • R32: -2004-09 pre-Redmond mailing: reflects new proposed resolutions and -new issues received after the 2004-07 mailing. Added -new issues 479-481. -
  • -
  • R31: -2004-07 mid-term mailing: reflects new proposed resolutions and -new issues received after the post-Sydney mailing. Added -new issues 463-478. -
  • -
  • R30: -Post-Sydney mailing: reflects decisions made at the Sydney meeting. -Voted all "Ready" issues from R29 into the working paper. -Added new issues 460-462. -
  • -
  • R29: -Pre-Sydney mailing. Added new issues 441-457. -
  • -
  • R28: -Post-Kona mailing: reflects decisions made at the Kona meeting. -Added new issues 432-440. -
  • -
  • R27: -Pre-Kona mailing. Added new issues 404-431. -
  • -
  • R26: -Post-Oxford mailing: reflects decisions made at the Oxford meeting. -All issues in Ready status were voted into DR status. All issues in -DR status were voted into WP status. -
  • -
  • R25: -Pre-Oxford mailing. Added new issues 390-402. -
  • -
  • R24: -Post-Santa Cruz mailing: reflects decisions made at the Santa Cruz -meeting. All Ready issues from R23 with the exception of 253, which has been given a new proposed resolution, were -moved to DR status. Added new issues 383-389. (Issues 387-389 were discussed -at the meeting.) Made progress on issues 225, 226, 229: 225 and 229 have been moved to Ready status, and the only remaining -concerns with 226 involve wording. -
  • -
  • R23: -Pre-Santa Cruz mailing. Added new issues 367-382. -Moved issues in the TC to TC status. -
  • -
  • R22: -Post-Curaçao mailing. Added new issues 362-366. -
  • -
  • R21: -Pre-Curaçao mailing. Added new issues 351-361. -
  • -
  • R20: -Post-Redmond mailing; reflects actions taken in Redmond. Added -new issues 336-350, of which issues -347-350 were added since Redmond, hence -not discussed at the meeting. - -All Ready issues were moved to DR status, with the exception of issues -284, 241, and 267. - -Noteworthy issues discussed at Redmond include -120 202, 226, 233, -270, 253, 254, 323. -
  • -
  • R19: -Pre-Redmond mailing. Added new issues -323-335. -
  • -
  • R18: -Post-Copenhagen mailing; reflects actions taken in Copenhagen. -Added new issues 312-317, and discussed -new issues 271-314. - -Changed status of issues -103 118 136 153 -165 171 183 184 -185 186 214 221 -234 237 243 248 -251 252 256 260 -261 262 263 265 -268 -to DR. - -Changed status of issues -49 109 117 182 -228 230 232 235 -238 241 242 250 -259 264 266 267 -271 272 273 275 -281 284 285 286 -288 292 295 297 -298 301 303 306 -307 308 312 -to Ready. - -Closed issues -111 277 279 287 -289 293 302 313 -314 -as NAD. - -
  • -
  • R17: -Pre-Copenhagen mailing. Converted issues list to XML. Added proposed -resolutions for issues 49, 76, 91, 235, 250, 267. -Added new issues 278-311. -
  • -
  • R16: -post-Toronto mailing; reflects actions taken in Toronto. Added new -issues 265-277. Changed status of issues -3, 8, 9, 19, -26, 31, 61, -63, 86, 108, -112, 114, 115, -122, 127, 129, -134, 137, 142, -144, 146, 147, -159, 164, 170, -181, 199, 208, -209, 210, 211, -212, 217, 220, -222, 223, 224, -227 to "DR". Reopened issue 23. Reopened -issue 187. Changed issues 2 and -4 to NAD. Fixed a typo in issue 17. Fixed -issue 70: signature should be changed both places it -appears. Fixed issue 160: previous version didn't fix -the bug in enough places. -
  • -
  • R15: -pre-Toronto mailing. Added issues -233-264. Some small HTML formatting -changes so that we pass Weblint tests. -
  • -
  • R14: -post-Tokyo II mailing; reflects committee actions taken in -Tokyo. Added issues 228 to 232. (00-0019R1/N1242) -
  • -
  • R13: -pre-Tokyo II updated: Added issues 212 to 227. -
  • -
  • R12: -pre-Tokyo II mailing: Added issues 199 to -211. Added "and paragraph 5" to the proposed resolution -of issue 29. Add further rationale to issue -178. -
  • -
  • R11: -post-Kona mailing: Updated to reflect LWG and full committee actions -in Kona (99-0048/N1224). Note changed resolution of issues -4 and 38. Added issues 196 -to 198. Closed issues list split into "defects" and -"closed" documents. Changed the proposed resolution of issue -4 to NAD, and changed the wording of proposed resolution -of issue 38. -
  • -
  • R10: -pre-Kona updated. Added proposed resolutions 83, -86, 91, 92, -109. Added issues 190 to -195. (99-0033/D1209, 14 Oct 99) -
  • -
  • R9: -pre-Kona mailing. Added issues 140 to -189. Issues list split into separate "active" and -"closed" documents. (99-0030/N1206, 25 Aug 99) -
  • -
  • R8: -post-Dublin mailing. Updated to reflect LWG and full committee actions -in Dublin. (99-0016/N1193, 21 Apr 99) -
  • -
  • R7: -pre-Dublin updated: Added issues 130, 131, -132, 133, 134, -135, 136, 137, -138, 139 (31 Mar 99) -
  • -
  • R6: -pre-Dublin mailing. Added issues 127, 128, -and 129. (99-0007/N1194, 22 Feb 99) -
  • -
  • R5: -update issues 103, 112; added issues -114 to 126. Format revisions to prepare -for making list public. (30 Dec 98) -
  • -
  • R4: -post-Santa Cruz II updated: Issues 110, -111, 112, 113 added, several -issues corrected. (22 Oct 98) -
  • -
  • R3: -post-Santa Cruz II: Issues 94 to 109 -added, many issues updated to reflect LWG consensus (12 Oct 98) -
  • -
  • R2: -pre-Santa Cruz II: Issues 73 to 93 added, -issue 17 updated. (29 Sep 98) -
  • -
  • R1: -Correction to issue 55 resolution, 60 code -format, 64 title. (17 Sep 98) -
  • -
- -

Defect Reports

-
-

1. C library linkage editing oversight

-

Section: 17.4.2.2 [using.linkage] Status: TC - Submitter: Beman Dawes Date: 1997-11-16

-

View all issues with TC status.

-

Discussion:

-

The change specified in the proposed resolution below did not make -it into the Standard. This change was accepted in principle at the -London meeting, and the exact wording below was accepted at the -Morristown meeting.

- - -

Proposed resolution:

-

Change 17.4.2.2 [using.linkage] paragraph 2 -from:

- -
-

It is unspecified whether a name from the Standard C library - declared with external linkage has either extern "C" or - extern "C++" linkage.

-
- -

to:

- -
-

Whether a name from the Standard C library declared with external - linkage has extern "C" or extern "C++" linkage - is implementation defined. It is recommended that an implementation - use extern "C++" linkage for this purpose.

-
- - - - - -
-

3. Atexit registration during atexit() call is not described

-

Section: 18.4 [support.start.term] Status: TC - Submitter: Steve Clamage Date: 1997-12-12

-

View all issues with TC status.

-

Discussion:

-

We appear not to have covered all the possibilities of - exit processing with respect to -atexit registration.
-
-Example 1: (C and C++)

- -
    #include <stdlib.h>
-    void f1() { }
-    void f2() { atexit(f1); }
-    
-    int main()
-    {
-        atexit(f2); // the only use of f2
-        return 0; // for C compatibility
-    }
- -

At program exit, f2 gets called due to its registration in -main. Running f2 causes f1 to be newly registered during the exit -processing. Is this a valid program? If so, what are its -semantics?

- -

-Interestingly, neither the C standard, nor the C++ draft standard nor -the forthcoming C9X Committee Draft says directly whether you can -register a function with atexit during exit processing.

- -

-All 3 standards say that functions are run in reverse order of their -registration. Since f1 is registered last, it ought to be run first, -but by the time it is registered, it is too late to be first.

- -

If the program is valid, the standards are self-contradictory about -its semantics.

- -

Example 2: (C++ only)

- -
    
-    void F() { static T t; } // type T has a destructor
-
-    int main()
-    {
-        atexit(F); // the only use of F
-    }
-
- -

Function F registered with atexit has a local static variable t, -and F is called for the first time during exit processing. A local -static object is initialized the first time control flow passes -through its definition, and all static objects are destroyed during -exit processing. Is the code valid? If so, what are its semantics?

- -

-Section 18.3 "Start and termination" says that if a function -F is registered with atexit before a static object t is initialized, F -will not be called until after t's destructor completes.

- -

-In example 2, function F is registered with atexit before its local -static object O could possibly be initialized. On that basis, it must -not be called by exit processing until after O's destructor -completes. But the destructor cannot be run until after F is called, -since otherwise the object could not be constructed in the first -place.

- -

If the program is valid, the standard is self-contradictory about -its semantics.

- -

I plan to submit Example 1 as a public comment on the C9X CD, with -a recommendation that the results be undefined. (Alternative: make it -unspecified. I don't think it is worthwhile to specify the case where -f1 itself registers additional functions, each of which registers -still more functions.)

- -

I think we should resolve the situation in the whatever way the C -committee decides.

- -

For Example 2, I recommend we declare the results undefined.

- -

[See reflector message lib-6500 for further discussion.]

- - - - -

Proposed resolution:

-

Change section 18.3/8 from:

-

- First, objects with static storage duration are destroyed and - functions registered by calling atexit are called. Objects with - static storage duration are destroyed in the reverse order of the - completion of their constructor. (Automatic objects are not - destroyed as a result of calling exit().) Functions registered with - atexit are called in the reverse order of their registration. A - function registered with atexit before an object obj1 of static - storage duration is initialized will not be called until obj1's - destruction has completed. A function registered with atexit after - an object obj2 of static storage duration is initialized will be - called before obj2's destruction starts. -

-

to:

-

- First, objects with static storage duration are destroyed and - functions registered by calling atexit are called. Non-local objects - with static storage duration are destroyed in the reverse order of - the completion of their constructor. (Automatic objects are not - destroyed as a result of calling exit().) Functions registered with - atexit are called in the reverse order of their registration, except - that a function is called after any previously registered functions - that had already been called at the time it was registered. A - function registered with atexit before a non-local object obj1 of - static storage duration is initialized will not be called until - obj1's destruction has completed. A function registered with atexit - after a non-local object obj2 of static storage duration is - initialized will be called before obj2's destruction starts. A local - static object obj3 is destroyed at the same time it would be if a - function calling the obj3 destructor were registered with atexit at - the completion of the obj3 constructor. -

- - -

Rationale:

-

See 99-0039/N1215, October 22, 1999, by Stephen D. Clamage for the analysis -supporting to the proposed resolution.

- - - - - -
-

5. String::compare specification questionable

-

Section: 21.3.6.8 [string::swap] Status: TC - Submitter: Jack Reeves Date: 1997-12-11

-

View all other issues in [string::swap].

-

View all issues with TC status.

-

Duplicate of: 87

-

Discussion:

-

At the very end of the basic_string class definition is the signature: int -compare(size_type pos1, size_type n1, const charT* s, size_type n2 = npos) const; In the -following text this is defined as: returns -basic_string<charT,traits,Allocator>(*this,pos1,n1).compare( -basic_string<charT,traits,Allocator>(s,n2);

- -

Since the constructor basic_string(const charT* s, size_type n, const Allocator& a -= Allocator()) clearly requires that s != NULL and n < npos and further states that it -throws length_error if n == npos, it appears the compare() signature above should always -throw length error if invoked like so: str.compare(1, str.size()-1, s); where 's' is some -null terminated character array.

- -

This appears to be a typo since the obvious intent is to allow either the call above or -something like: str.compare(1, str.size()-1, s, strlen(s)-1);

- -

This would imply that what was really intended was two signatures int compare(size_type -pos1, size_type n1, const charT* s) const int compare(size_type pos1, size_type n1, const -charT* s, size_type n2) const; each defined in terms of the corresponding constructor.

- - -

Proposed resolution:

-

Replace the compare signature in 21.3 [basic.string] -(at the very end of the basic_string synopsis) which reads:

- -
-

int compare(size_type pos1, size_type n1,
-             const charT* s, - size_type n2 = npos) const;

-
- -

with:

- -
-

int compare(size_type pos1, size_type n1,
-             const charT* s) const;
- int compare(size_type pos1, size_type n1,
-             const charT* s, - size_type n2) const;

-
- -

Replace the portion of 21.3.6.8 [string::swap] -paragraphs 5 and 6 which read:

- -
-

int compare(size_type pos, size_type n1,
-             charT * s, size_type n2 - = npos) const;
-
Returns:
- basic_string<charT,traits,Allocator>(*this, pos, n1).compare(
-              - basic_string<charT,traits,Allocator>( s, n2))

-
- -

with:

- -
-

int compare(size_type pos, size_type n1,
-             const charT * s) const;
-
Returns:
- basic_string<charT,traits,Allocator>(*this, pos, n1).compare(
-              - basic_string<charT,traits,Allocator>( s ))
-
- int compare(size_type pos, size_type n1,
-             const charT * s, - size_type n2) const;
-
Returns:
- basic_string<charT,traits,Allocator>(*this, pos, n1).compare(
-              - basic_string<charT,traits,Allocator>( s, n2))

-
- -

Editors please note that in addition to splitting the signature, the third argument -becomes const, matching the existing synopsis.

- - -

Rationale:

-

While the LWG dislikes adding signatures, this is a clear defect in -the Standard which must be fixed.  The same problem was also -identified in issues 7 (item 5) and 87.

- - - - - -
-

7. String clause minor problems

-

Section: 21 [strings] Status: TC - Submitter: Matt Austern Date: 1997-12-15

-

View all other issues in [strings].

-

View all issues with TC status.

-

Discussion:

-

(1) In 21.3.6.4 [string::insert], the description of template -<class InputIterator> insert(iterator, InputIterator, -InputIterator) makes no sense. It refers to a member function that -doesn't exist. It also talks about the return value of a void -function.

- -

(2) Several versions of basic_string::replace don't appear in the -class synopsis.

- -

(3) basic_string::push_back appears in the synopsis, but is never -described elsewhere. In the synopsis its argument is const charT, -which doesn't makes much sense; it should probably be charT, or -possible const charT&.

- -

(4) basic_string::pop_back is missing.

- -

(5) int compare(size_type pos, size_type n1, charT* s, size_type n2 -= npos) make no sense. First, it's const charT* in the synopsis and -charT* in the description. Second, given what it says in RETURNS, -leaving out the final argument will always result in an exception -getting thrown. This is paragraphs 5 and 6 of -21.3.6.8 [string::swap]

- -

(6) In table 37, in section 21.1.1 [char.traits.require], -there's a note for X::move(s, p, n). It says "Copies correctly -even where p is in [s, s+n)". This is correct as far as it goes, -but it doesn't go far enough; it should also guarantee that the copy -is correct even where s in in [p, p+n). These are two orthogonal -guarantees, and neither one follows from the other. Both guarantees -are necessary if X::move is supposed to have the same sort of -semantics as memmove (which was clearly the intent), and both -guarantees are necessary if X::move is actually supposed to be -useful.

- - -

Proposed resolution:

-

ITEM 1: In 21.3.5.4 [lib.string::insert], change paragraph 16 to
-
-    EFFECTS: Equivalent to insert(p - begin(), basic_string(first, last)).
-
-ITEM 2:  Not a defect; the Standard is clear.. There are ten versions of replace() in -the synopsis, and ten versions in 21.3.5.6 [lib.string::replace].
-
-ITEM 3: Change the declaration of push_back in the string synopsis (21.3, -[lib.basic.string]) from:

- -

     void push_back(const charT)
-
-to
-
-     void push_back(charT)
-
-Add the following text immediately after 21.3.5.2 [lib.string::append], paragraph 10.
-
-    void basic_string::push_back(charT c);
-    EFFECTS: Equivalent to append(static_cast<size_type>(1), c);
-
-ITEM 4: Not a defect. The omission appears to have been deliberate.
-
-ITEM 5: Duplicate; see issue 5 (and 87).
-
-ITEM 6: In table 37, Replace:
-
-    "Copies correctly even where p is in [s, s+n)."
-
-with:
-
-     "Copies correctly even where the ranges [p, p+n) and [s, -s+n) overlap."

- - - - - -
-

8. Locale::global lacks guarantee

-

Section: 22.1.1.5 [locale.statics] Status: TC - Submitter: Matt Austern Date: 1997-12-24

-

View all issues with TC status.

-

Discussion:

-

It appears there's an important guarantee missing from clause -22. We're told that invoking locale::global(L) sets the C locale if L -has a name. However, we're not told whether or not invoking -setlocale(s) sets the global C++ locale.

- -

The intent, I think, is that it should not, but I can't find any -such words anywhere.

- - -

Proposed resolution:

-

Add a sentence at the end of 22.1.1.5 [locale.statics], -paragraph 2: 

- -
-

No library function other than locale::global() shall affect - the value returned by locale().

- -
- - - - - -
-

9. Operator new(0) calls should not yield the same pointer

-

Section: 18.5.1 [new.delete] Status: TC - Submitter: Steve Clamage Date: 1998-01-04

-

View all issues with TC status.

-

Discussion:

-

Scott Meyers, in a comp.std.c++ posting: I just noticed that -section 3.7.3.1 of CD2 seems to allow for the possibility that all -calls to operator new(0) yield the same pointer, an implementation -technique specifically prohibited by ARM 5.3.3.Was this prohibition -really lifted? Does the FDIS agree with CD2 in the regard? [Issues -list maintainer's note: the IS is the same.]

- - -

Proposed resolution:

-

Change the last paragraph of 3.7.3 from:

-
-

Any allocation and/or deallocation functions defined in a C++ program shall - conform to the semantics specified in 3.7.3.1 and 3.7.3.2.

-
-

to:

-
-

Any allocation and/or deallocation functions defined in a C++ program, - including the default versions in the library, shall conform to the semantics - specified in 3.7.3.1 and 3.7.3.2.

-
-

Change 3.7.3.1/2, next-to-last sentence, from :

-
-

If the size of the space requested is zero, the value returned shall not be - a null pointer value (4.10).

-
-

to:

-
-

Even if the size of the space requested is zero, the request can fail. If - the request succeeds, the value returned shall be a non-null pointer value - (4.10) p0 different from any previously returned value p1, unless that value - p1 was since passed to an operator delete.

-
-

5.3.4/7 currently reads:

-
-

When the value of the expression in a direct-new-declarator is zero, the - allocation function is called to allocate an array with no elements. The - pointer returned by the new-expression is non-null. [Note: If the library - allocation function is called, the pointer returned is distinct from the - pointer to any other object.]

-
-

Retain the first sentence, and delete the remainder.

-

18.5.1 currently has no text. Add the following:

-
-

Except where otherwise specified, the provisions of 3.7.3 apply to the - library versions of operator new and operator delete.

-
-

To 18.5.1.3, add the following text:

-
-

The provisions of 3.7.3 do not apply to these reserved placement forms of - operator new and operator delete.

-
- - -

Rationale:

-

See 99-0040/N1216, October 22, 1999, by Stephen D. Clamage for the analysis -supporting to the proposed resolution.

- - - - - -
-

11. Bitset minor problems

-

Section: 23.3.5 [template.bitset] Status: TC - Submitter: Matt Austern Date: 1998-01-22

-

View other active issues in [template.bitset].

-

View all other issues in [template.bitset].

-

View all issues with TC status.

-

Discussion:

-

(1) bitset<>::operator[] is mentioned in the class synopsis (23.3.5), but it is -not documented in 23.3.5.2.

- -

(2) The class synopsis only gives a single signature for bitset<>::operator[], -reference operator[](size_t pos). This doesn't make much sense. It ought to be overloaded -on const. reference operator[](size_t pos); bool operator[](size_t pos) const.

- -

(3) Bitset's stream input function (23.3.5.3) ought to skip all whitespace before -trying to extract 0s and 1s. The standard doesn't explicitly say that, though. This should -go in the Effects clause.

- - -

Proposed resolution:

-

ITEMS 1 AND 2:
-
-In the bitset synopsis (23.3.5 [template.bitset]), -replace the member function
-
-    reference operator[](size_t pos);
-

-with the two member functions
-
-    bool operator[](size_t pos) const;
-    reference operator[](size_t pos);
-

-Add the following text at the end of 23.3.5.2 [bitset.members], -immediately after paragraph 45:

- -
-

bool operator[](size_t pos) const;
- Requires: pos is valid
- Throws: nothing
- Returns: test(pos)
-
- bitset<N>::reference operator[](size_t pos);
- Requires: pos is valid
- Throws: nothing
- Returns: An object of type bitset<N>::reference such that (*this)[pos] - == this->test(pos), and such that (*this)[pos] = val is equivalent to this->set(pos, - val);

-
- - -

Rationale:

-

The LWG believes Item 3 is not a defect. "Formatted -input" implies the desired semantics. See 27.6.1.2 [istream.formatted]. -

- - - - - -
-

13. Eos refuses to die

-

Section: 27.6.1.2.3 [istream::extractors] Status: TC - Submitter: William M. Miller Date: 1998-03-03

-

View all other issues in [istream::extractors].

-

View all issues with TC status.

-

Discussion:

-

In 27.6.1.2.3, there is a reference to "eos", which is -the only one in the whole draft (at least using Acrobat search), so -it's undefined.

- - -

Proposed resolution:

-

In 27.6.1.2.3 [istream::extractors], replace "eos" with -"charT()"

- - - - - -
-

14. Locale::combine should be const

-

Section: 22.1.1.3 [locale.members] Status: TC - Submitter: Nathan Myers Date: 1998-08-06

-

View all other issues in [locale.members].

-

View all issues with TC status.

-

Discussion:

-

locale::combine is the only member function of locale (other than constructors and -destructor) that is not const. There is no reason for it not to be const, and good reasons -why it should have been const. Furthermore, leaving it non-const conflicts with 22.1.1 -paragraph 6: "An instance of a locale is immutable."

- -

History: this member function originally was a constructor. it happened that the -interface it specified had no corresponding language syntax, so it was changed to a member -function. As constructors are never const, there was no "const" in the interface -which was transformed into member "combine". It should have been added at that -time, but the omission was not noticed.

- - -

Proposed resolution:

-

In 22.1.1 [locale] and also in 22.1.1.3 [locale.members], add -"const" to the declaration of member combine:

-
-
template <class Facet> locale combine(const locale& other) const; 
-
- - - - - -
-

15. Locale::name requirement inconsistent

-

Section: 22.1.1.3 [locale.members] Status: TC - Submitter: Nathan Myers Date: 1998-08-06

-

View all other issues in [locale.members].

-

View all issues with TC status.

-

Discussion:

-

locale::name() is described as returning a string that can be passed to a locale -constructor, but there is no matching constructor.

- - -

Proposed resolution:

-

In 22.1.1.3 [locale.members], paragraph 5, replace -"locale(name())" with -"locale(name().c_str())". -

- - - - - -
-

16. Bad ctype_byname<char> decl

-

Section: 22.2.1.4 [locale.codecvt] Status: TC - Submitter: Nathan Myers Date: 1998-08-06

-

View all other issues in [locale.codecvt].

-

View all issues with TC status.

-

Discussion:

-

The new virtual members ctype_byname<char>::do_widen and do_narrow did not get -edited in properly. Instead, the member do_widen appears four times, with wrong argument -lists.

- - -

Proposed resolution:

-

The correct declarations for the overloaded members -do_narrow and do_widen should be copied -from 22.2.1.3 [facet.ctype.special].

- - - - - -
-

17. Bad bool parsing

-

Section: 22.2.2.1.2 [facet.num.get.virtuals] Status: TC - Submitter: Nathan Myers Date: 1998-08-06

-

View other active issues in [facet.num.get.virtuals].

-

View all other issues in [facet.num.get.virtuals].

-

View all issues with TC status.

-

Discussion:

-

This section describes the process of parsing a text boolean value from the input -stream. It does not say it recognizes either of the sequences "true" or -"false" and returns the corresponding bool value; instead, it says it recognizes -only one of those sequences, and chooses which according to the received value of a -reference argument intended for returning the result, and reports an error if the other -sequence is found. (!) Furthermore, it claims to get the names from the ctype<> -facet rather than the numpunct<> facet, and it examines the "boolalpha" -flag wrongly; it doesn't define the value "loc"; and finally, it computes -wrongly whether to use numeric or "alpha" parsing.
-
-I believe the correct algorithm is "as if":

- -
  // in, err, val, and str are arguments.
-  err = 0;
-  const numpunct<charT>& np = use_facet<numpunct<charT> >(str.getloc());
-  const string_type t = np.truename(), f = np.falsename();
-  bool tm = true, fm = true;
-  size_t pos = 0;
-  while (tm && pos < t.size() || fm && pos < f.size()) {
-    if (in == end) { err = str.eofbit; }
-    bool matched = false;
-    if (tm && pos < t.size()) {
-      if (!err && t[pos] == *in) matched = true;
-      else tm = false;
-    }
-    if (fm && pos < f.size()) {
-      if (!err && f[pos] == *in) matched = true;
-      else fm = false;
-    }
-    if (matched) { ++in; ++pos; }
-    if (pos > t.size()) tm = false;
-    if (pos > f.size()) fm = false;
-  }
-  if (tm == fm || pos == 0) { err |= str.failbit; }
-  else                      { val = tm; }
-  return in;
- -

Notice this works reasonably when the candidate strings are both empty, or equal, or -when one is a substring of the other. The proposed text below captures the logic of the -code above.

- - -

Proposed resolution:

-

In 22.2.2.1.2 [facet.num.get.virtuals], in the first line of paragraph 14, -change "&&" to "&".

- -

Then, replace paragraphs 15 and 16 as follows:

- -
- -

Otherwise target sequences are determined "as if" by - calling the members falsename() and - truename() of the facet obtained by - use_facet<numpunct<charT> >(str.getloc()). - Successive characters in the range [in,end) (see - [lib.sequence.reqmts]) are obtained and matched against - corresponding positions in the target sequences only as necessary to - identify a unique match. The input iterator in is - compared to end only when necessary to obtain a - character. If and only if a target sequence is uniquely matched, - val is set to the corresponding value.

- -
- -
-

The in iterator is always left pointing one position beyond the last character - successfully matched. If val is set, then err is set to str.goodbit; or to - str.eofbit if, when seeking another character to match, it is found that - (in==end). If val is not set, then err is set to str.failbit; or to - (str.failbit|str.eofbit)if - the reason for the failure was that (in==end). [Example: for targets - true:"a" and false:"abb", the input sequence "a" yields - val==true and err==str.eofbit; the input sequence "abc" yields - err=str.failbit, with in ending at the 'c' element. For targets - true:"1" - and false:"0", the input sequence "1" yields val==true - and err=str.goodbit. For empty targets (""), any input sequence yields - err==str.failbit. --end example]

-
- - - - - -
-

18. Get(...bool&) omitted

-

Section: 22.2.2.1.1 [facet.num.get.members] Status: TC - Submitter: Nathan Myers Date: 1998-08-06

-

View all other issues in [facet.num.get.members].

-

View all issues with TC status.

-

Discussion:

-

In the list of num_get<> non-virtual members on page 22-23, the member -that parses bool values was omitted from the list of definitions of non-virtual -members, though it is listed in the class definition and the corresponding -virtual is listed everywhere appropriate.

- - -

Proposed resolution:

-

Add at the beginning of 22.2.2.1.1 [facet.num.get.members] -another get member for bool&, copied from the entry in -22.2.2.1 [locale.num.get].

- - - - - -
-

19. "Noconv" definition too vague

-

Section: 22.2.1.4 [locale.codecvt] Status: TC - Submitter: Nathan Myers Date: 1998-08-06

-

View all other issues in [locale.codecvt].

-

View all issues with TC status.

-

Duplicate of: 10

-

Discussion:

-

-In the definitions of codecvt<>::do_out and do_in, they are -specified to return noconv if "no conversion is -needed". This definition is too vague, and does not say -normatively what is done with the buffers. -

- - -

Proposed resolution:

-

-Change the entry for noconv in the table under paragraph 4 in section -22.2.1.4.2 [locale.codecvt.virtuals] to read: -

-
-

noconv: internT and externT are the same type, - and input sequence is identical to converted sequence.

-
-

Change the Note in paragraph 2 to normative text as follows:

-
-

If returns noconv, internT and externT are the - same type and the converted sequence is identical to the input sequence [from,from_next). - to_next is set equal to to, the value of state is - unchanged, and there are no changes to the values in [to, to_limit).

-
- - - - - -
-

20. Thousands_sep returns wrong type

-

Section: 22.2.3.1.2 [facet.numpunct.virtuals] Status: TC - Submitter: Nathan Myers Date: 1998-08-06

-

View all issues with TC status.

-

Discussion:

-

The synopsis for numpunct<>::do_thousands_sep, and the -definition of numpunct<>::thousands_sep which calls it, specify -that it returns a value of type char_type. Here it is erroneously -described as returning a "string_type".

- - -

Proposed resolution:

-

In 22.2.3.1.2 [facet.numpunct.virtuals], above paragraph 2, change -"string_type" to "char_type".

- - - - - -
-

21. Codecvt_byname<> instantiations

-

Section: 22.1.1.1.1 [locale.category] Status: TC - Submitter: Nathan Myers Date: 1998-08-06

-

View all other issues in [locale.category].

-

View all issues with TC status.

-

Discussion:

-

In the second table in the section, captioned "Required -instantiations", the instantiations for codecvt_byname<> -have been omitted. These are necessary to allow users to construct a -locale by name from facets.

- - -

Proposed resolution:

-

Add in 22.1.1.1.1 [locale.category] to the table captioned -"Required instantiations", in the category "ctype" -the lines

- -
-
codecvt_byname<char,char,mbstate_t>,
-codecvt_byname<wchar_t,char,mbstate_t> 
-
- - - - - -
-

22. Member open vs. flags

-

Section: 27.8.1.9 [ifstream.members] Status: TC - Submitter: Nathan Myers Date: 1998-08-06

-

View all other issues in [ifstream.members].

-

View all issues with TC status.

-

Discussion:

-

The description of basic_istream<>::open leaves unanswered questions about how it -responds to or changes flags in the error status for the stream. A strict reading -indicates that it ignores the bits and does not change them, which confuses users who do -not expect eofbit and failbit to remain set after a successful open. There are three -reasonable resolutions: 1) status quo 2) fail if fail(), ignore eofbit 3) clear failbit -and eofbit on call to open().

- - -

Proposed resolution:

-

In 27.8.1.9 [ifstream.members] paragraph 3, and in 27.8.1.13 [ofstream.members] paragraph 3, under open() effects, add a footnote: -

- -
-

A successful open does not change the error state.

-
- - -

Rationale:

-

This may seem surprising to some users, but it's just an instance -of a general rule: error flags are never cleared by the -implementation. The only way error flags are are ever cleared is if -the user explicitly clears them by hand.

- -

The LWG believed that preserving this general rule was -important enough so that an exception shouldn't be made just for this -one case. The resolution of this issue clarifies what the LWG -believes to have been the original intent.

- - - - - - -
-

24. "do_convert" doesn't exist

-

Section: 22.2.1.4 [locale.codecvt] Status: TC - Submitter: Nathan Myers Date: 1998-08-06

-

View all other issues in [locale.codecvt].

-

View all issues with TC status.

-

Duplicate of: 72

-

Discussion:

-

The description of codecvt<>::do_out and do_in mentions a -symbol "do_convert" which is not defined in the -standard. This is a leftover from an edit, and should be "do_in -and do_out".

- - -

Proposed resolution:

-

In 22.2.1.4 [locale.codecvt], paragraph 3, change -"do_convert" to "do_in or do_out". Also, in 22.2.1.4.2 [locale.codecvt.virtuals], change "do_convert()" to "do_in -or do_out".

- - - - - -
-

25. String operator<< uses width() value wrong

-

Section: 21.3.8.9 [string.io] Status: TC - Submitter: Nathan Myers Date: 1998-08-06

-

View all other issues in [string.io].

-

View all issues with TC status.

-

Duplicate of: 67

-

Discussion:

-

In the description of operator<< applied to strings, the standard says that uses -the smaller of os.width() and str.size(), to pad "as described in stage 3" -elsewhere; but this is inconsistent, as this allows no possibility of space for padding.

- - -

Proposed resolution:

-

Change 21.3.8.9 [string.io] paragraph 4 from:
-
-    "... where n is the smaller of os.width() and str.size(); -..."
-
-to:
-
-    "... where n is the larger of os.width() and str.size(); -..."

- - - - - -
-

26. Bad sentry example

-

Section: 27.6.1.1.3 [istream::sentry] Status: TC - Submitter: Nathan Myers Date: 1998-08-06

-

View all other issues in [istream::sentry].

-

View all issues with TC status.

-

Discussion:

-

In paragraph 6, the code in the example:

- -
  template <class charT, class traits = char_traits<charT> >
-  basic_istream<charT,traits>::sentry(
-           basic_istream<charT,traits>& is, bool noskipws = false) {
-      ...
-      int_type c;
-      typedef ctype<charT> ctype_type;
-      const ctype_type& ctype = use_facet<ctype_type>(is.getloc());
-      while ((c = is.rdbuf()->snextc()) != traits::eof()) {
-        if (ctype.is(ctype.space,c)==0) {
-          is.rdbuf()->sputbackc (c);
-          break;
-        }
-      }
-      ...
-   }
- -

fails to demonstrate correct use of the facilities described. In -particular, it fails to use traits operators, and specifies incorrect -semantics. (E.g. it specifies skipping over the first character in the -sequence without examining it.)

- - -

Proposed resolution:

-

Remove the example above from 27.6.1.1.3 [istream::sentry] -paragraph 6.

- - -

Rationale:

-

The originally proposed replacement code for the example was not -correct. The LWG tried in Kona and again in Tokyo to correct it -without success. In Tokyo, an implementor reported that actual working -code ran over one page in length and was quite complicated. The LWG -decided that it would be counter-productive to include such a lengthy -example, which might well still contain errors.

- - - - - -
-

27. String::erase(range) yields wrong iterator

-

Section: 21.3.6.5 [string::erase] Status: TC - Submitter: Nathan Myers Date: 1998-08-06

-

View all other issues in [string::erase].

-

View all issues with TC status.

-

Discussion:

-

The string::erase(iterator first, iterator last) is specified to return an element one -place beyond the next element after the last one erased. E.g. for the string -"abcde", erasing the range ['b'..'d') would yield an iterator for element 'e', -while 'd' has not been erased.

- - -

Proposed resolution:

-

In 21.3.6.5 [string::erase], paragraph 10, change:

- -
-

Returns: an iterator which points to the element immediately following _last_ prior to - the element being erased.

-
- -

to read

- -
-

Returns: an iterator which points to the element pointed to by _last_ prior to the - other elements being erased.

-
- - - - - -
-

28. Ctype<char>is ambiguous

-

Section: 22.2.1.3.2 [facet.ctype.char.members] Status: TC - Submitter: Nathan Myers Date: 1998-08-06

-

View all other issues in [facet.ctype.char.members].

-

View all issues with TC status.

-

Duplicate of: 236

-

Discussion:

-

The description of the vector form of ctype<char>::is can be interpreted to mean -something very different from what was intended. Paragraph 4 says

- -
-

Effects: The second form, for all *p in the range [low, high), assigns vec[p-low] to - table()[(unsigned char)*p].

-
- -

This is intended to copy the value indexed from table()[] into the place identified in -vec[].

- - -

Proposed resolution:

-

Change 22.2.1.3.2 [facet.ctype.char.members], paragraph 4, to read

- -
-

Effects: The second form, for all *p in the range [low, high), assigns into vec[p-low] - the value table()[(unsigned char)*p].

-
- - - - - -
-

29. Ios_base::init doesn't exist

-

Section: 27.3.1 [narrow.stream.objects] Status: TC - Submitter: Nathan Myers Date: 1998-08-06

-

View all other issues in [narrow.stream.objects].

-

View all issues with TC status.

-

Discussion:

-

Sections 27.3.1 [narrow.stream.objects] and 27.3.2 [wide.stream.objects] mention -a function ios_base::init, which is not defined. Probably they mean -basic_ios<>::init, defined in 27.4.4.1 [basic.ios.cons], -paragraph 3.

- - -

Proposed resolution:

-

[R12: modified to include paragraph 5.]

- -

In 27.3.1 [narrow.stream.objects] paragraph 2 and 5, change

- -
-

ios_base::init

-
- -

to

- -
-

basic_ios<char>::init

-
- -

Also, make a similar change in 27.3.2 [wide.stream.objects] except it -should read

- -
-

basic_ios<wchar_t>::init

-
- - - - - -
-

30. Wrong header for LC_*

-

Section: 22.1.1.1.1 [locale.category] Status: TC - Submitter: Nathan Myers Date: 1998-08-06

-

View all other issues in [locale.category].

-

View all issues with TC status.

-

Discussion:

-

Paragraph 2 implies that the C macros LC_CTYPE etc. are defined in <cctype>, -where they are in fact defined elsewhere to appear in <clocale>.

- - -

Proposed resolution:

-

In 22.1.1.1.1 [locale.category], paragraph 2, change -"<cctype>" to read "<clocale>".

- - - - - -
-

31. Immutable locale values

-

Section: 22.1.1 [locale] Status: TC - Submitter: Nathan Myers Date: 1998-08-06

-

View all other issues in [locale].

-

View all issues with TC status.

-

Duplicate of: 378

-

Discussion:

-

Paragraph 6, says "An instance of locale is -immutable; once a facet reference is obtained from it, -...". This has caused some confusion, because locale variables -are manifestly assignable.

- - -

Proposed resolution:

-

In 22.1.1 [locale] replace paragraph 6

- -
-

An instance of locale is immutable; once a facet - reference is obtained from it, that reference remains usable as long - as the locale value itself exists.

-
- -

with

- -
-

Once a facet reference is obtained from a locale object by - calling use_facet<>, that reference remains usable, and the - results from member functions of it may be cached and re-used, as - long as some locale object refers to that facet.

-
- - - - - -
-

32. Pbackfail description inconsistent

-

Section: 27.5.2.4.4 [streambuf.virt.pback] Status: TC - Submitter: Nathan Myers Date: 1998-08-06

-

View all issues with TC status.

-

Discussion:

-

The description of the required state before calling virtual member -basic_streambuf<>::pbackfail requirements is inconsistent with the conditions -described in 27.5.2.2.4 [lib.streambuf.pub.pback] where member sputbackc calls it. -Specifically, the latter says it calls pbackfail if:

- -

    traits::eq(c,gptr()[-1]) is false

- -

where pbackfail claims to require:

- -

    traits::eq(*gptr(),traits::to_char_type(c)) returns false

- -

It appears that the pbackfail description is wrong.

- - -

Proposed resolution:

-

In 27.5.2.4.4 [streambuf.virt.pback], paragraph 1, change:

- -
-

"traits::eq(*gptr(),traits::to_char_type( c))"

-
- -

to

- -
-

"traits::eq(traits::to_char_type(c),gptr()[-1])" -

-
- - -

Rationale:

-

Note deliberate reordering of arguments for clarity in addition to the correction of -the argument value.

- - - - - -
-

33. Codecvt<> mentions from_type

-

Section: 22.2.1.4 [locale.codecvt] Status: TC - Submitter: Nathan Myers Date: 1998-08-06

-

View all other issues in [locale.codecvt].

-

View all issues with TC status.

-

Duplicate of: 43

-

Discussion:

-

In the table defining the results from do_out and do_in, the specification for the -result error says

- -
-

encountered a from_type character it could not convert

-
- -

but from_type is not defined. This clearly is intended to be an externT for do_in, or -an internT for do_out.

- - -

Proposed resolution:

-

In 22.2.1.4.2 [locale.codecvt.virtuals] paragraph 4, replace the definition -in the table for the case of _error_ with

- -
-

encountered a character in [from,from_end) that it could not convert.

-
- - - - - -
-

34. True/falsename() not in ctype<>

-

Section: 22.2.2.2.2 [facet.num.put.virtuals] Status: TC - Submitter: Nathan Myers Date: 1998-08-06

-

View all other issues in [facet.num.put.virtuals].

-

View all issues with TC status.

-

Discussion:

-

In paragraph 19, Effects:, members truename() and falsename are used from facet -ctype<charT>, but it has no such members. Note that this is also a problem in -22.2.2.1.2, addressed in (4).

- - -

Proposed resolution:

-

In 22.2.2.2.2 [facet.num.put.virtuals], paragraph 19, in the Effects: -clause for member put(...., bool), replace the initialization of the -string_type value s as follows:

- -
-
const numpunct& np = use_facet<numpunct<charT> >(loc);
-string_type s = val ? np.truename() : np.falsename(); 
-
- - - - - -
-

35. No manipulator unitbuf in synopsis

-

Section: 27.4 [iostreams.base] Status: TC - Submitter: Nathan Myers Date: 1998-08-06

-

View all issues with TC status.

-

Discussion:

-

In 27.4.5.1 [fmtflags.manip], we have a definition for a manipulator -named "unitbuf". Unlike other manipulators, it's not listed -in synopsis. Similarly for "nounitbuf".

- - -

Proposed resolution:

-

Add to the synopsis for <ios> in 27.4 [iostreams.base], after -the entry for "nouppercase", the prototypes:

- -
-
ios_base& unitbuf(ios_base& str);
-ios_base& nounitbuf(ios_base& str); 
-
- - - - - -
-

36. Iword & pword storage lifetime omitted

-

Section: 27.4.2.5 [ios.base.storage] Status: TC - Submitter: Nathan Myers Date: 1998-08-06

-

View all other issues in [ios.base.storage].

-

View all issues with TC status.

-

Discussion:

-

In the definitions for ios_base::iword and pword, the lifetime of the storage is -specified badly, so that an implementation which only keeps the last value stored appears -to conform. In particular, it says:

- -

The reference returned may become invalid after another call to the object's iword -member with a different index ...

- -

This is not idle speculation; at least one implementation was done this way.

- - -

Proposed resolution:

-

Add in 27.4.2.5 [ios.base.storage], in both paragraph 2 and also in -paragraph 4, replace the sentence:

- -
-

The reference returned may become invalid after another call to the object's iword - [pword] member with a different index, after a call to its copyfmt member, or when the - object is destroyed.

-
- -

with:

- -
-

The reference returned is invalid after any other operations on the object. However, - the value of the storage referred to is retained, so that until the next call to copyfmt, - calling iword [pword] with the same index yields another reference to the same value.

-
- -

substituting "iword" or "pword" as appropriate.

- - - - - -
-

37. Leftover "global" reference

-

Section: 22.1.1 [locale] Status: TC - Submitter: Nathan Myers Date: 1998-08-06

-

View all other issues in [locale].

-

View all issues with TC status.

-

Discussion:

-

In the overview of locale semantics, paragraph 4, is the sentence

- -
-

If Facet is not present in a locale (or, failing that, in the global locale), it throws - the standard exception bad_cast.

-
- -

This is not supported by the definition of use_facet<>, and represents semantics -from an old draft.

- - -

Proposed resolution:

-

In 22.1.1 [locale], paragraph 4, delete the parenthesized -expression

- -
-

(or, failing that, in the global locale)

-
- - - - - -
-

38. Facet definition incomplete

-

Section: 22.1.2 [locale.global.templates] Status: TC - Submitter: Nathan Myers Date: 1998-08-06

-

View all issues with TC status.

-

Discussion:

-

It has been noticed by Esa Pulkkinen that the definition of -"facet" is incomplete. In particular, a class derived from -another facet, but which does not define a member id, cannot -safely serve as the argument F to use_facet<F>(loc), -because there is no guarantee that a reference to the facet instance -stored in loc is safely convertible to F.

- - -

Proposed resolution:

-

In the definition of std::use_facet<>(), replace the text in paragraph 1 which -reads:

- -
-

Get a reference to a facet of a locale.

-
- -

with:

- -
-

Requires: Facet is a facet class whose definition - contains the public static member id as defined in 22.1.1.1.2 [locale.facet].

-
- -

[ -Kona: strike as overspecification the text "(not inherits)" -from the original resolution, which read "... whose definition -contains (not inherits) the public static member -id..." -]

- - - - - - - -
-

39. istreambuf_iterator<>::operator++(int) definition garbled

-

Section: 24.5.3.4 [istreambuf.iterator::op++] Status: TC - Submitter: Nathan Myers Date: 1998-08-06

-

View all issues with TC status.

-

Discussion:

-

Following the definition of istreambuf_iterator<>::operator++(int) in paragraph -3, the standard contains three lines of garbage text left over from a previous edit.

- -
-
istreambuf_iterator<charT,traits> tmp = *this;
-sbuf_->sbumpc();
-return(tmp); 
-
- - -

Proposed resolution:

-

In 24.5.3.4 [istreambuf.iterator::op++], delete the three lines of code at the -end of paragraph 3.

- - - - - -
-

40. Meaningless normative paragraph in examples

-

Section: 22.2.8 [facets.examples] Status: TC - Submitter: Nathan Myers Date: 1998-08-06

-

View all other issues in [facets.examples].

-

View all issues with TC status.

-

Discussion:

-

Paragraph 3 of the locale examples is a description of part of an -implementation technique that has lost its referent, and doesn't mean -anything.

- - -

Proposed resolution:

-

Delete 22.2.8 [facets.examples] paragraph 3 which begins "This -initialization/identification system depends...", or (at the -editor's option) replace it with a place-holder to keep the paragraph -numbering the same.

- - - - - -
-

41. Ios_base needs clear(), exceptions()

-

Section: 27.4.2 [ios.base] Status: TC - Submitter: Nathan Myers Date: 1998-08-06

-

View all other issues in [ios.base].

-

View all issues with TC status.

-

Duplicate of: 157

-

Discussion:

-

The description of ios_base::iword() and pword() in 27.4.2.4 [ios.members.static], say that if they fail, they "set badbit, -which may throw an exception". However, ios_base offers no -interface to set or to test badbit; those interfaces are defined in -basic_ios<>.

- - -

Proposed resolution:

-

Change the description in 27.4.2.5 [ios.base.storage] in -paragraph 2, and also in paragraph 4, as follows. Replace

- -
-

If the function fails it sets badbit, which may throw an exception.

-
- -

with

- -
-

If the function fails, and *this is a base sub-object of - a basic_ios<> object or sub-object, the effect is - equivalent to calling basic_ios<>::setstate(badbit) - on the derived object (which may throw failure).

-
- -

[Kona: LWG reviewed wording; setstate(failbit) changed to -setstate(badbit).]

- - - - - - - -
-

42. String ctors specify wrong default allocator

-

Section: 21.3 [basic.string] Status: TC - Submitter: Nathan Myers Date: 1998-08-06

-

View other active issues in [basic.string].

-

View all other issues in [basic.string].

-

View all issues with TC status.

-

Discussion:

-

The basic_string<> copy constructor:

- -
basic_string(const basic_string& str, size_type pos = 0,
-             size_type n = npos, const Allocator& a = Allocator()); 
- -

specifies an Allocator argument default value that is -counter-intuitive. The natural choice for a the allocator to copy from -is str.get_allocator(). Though this cannot be expressed in -default-argument notation, overloading suffices.

- -

Alternatively, the other containers in Clause 23 (deque, list, -vector) do not have this form of constructor, so it is inconsistent, -and an evident source of confusion, for basic_string<> to have -it, so it might better be removed.

- - -

Proposed resolution:

-

In 21.3 [basic.string], replace the declaration of the copy -constructor as follows:

- -
-
basic_string(const basic_string& str);
-basic_string(const basic_string& str, size_type pos, size_type n = npos,
-             const Allocator& a = Allocator());
-
- -

In 21.3.1 [string.require], replace the copy constructor declaration -as above. Add to paragraph 5, Effects:

- -
-

In the first form, the Allocator value used is copied from - str.get_allocator().

-
- - -

Rationale:

-

The LWG believes the constructor is actually broken, rather than -just an unfortunate design choice.

- -

The LWG considered two other possible resolutions:

- -

A. In 21.3 [basic.string], replace the declaration of the copy -constructor as follows:

- -
-
basic_string(const basic_string& str, size_type pos = 0,
-             size_type n = npos);
-basic_string(const basic_string& str, size_type pos,
-             size_type n, const Allocator& a); 
-
- -

In 21.3.1 [string.require], replace the copy constructor declaration -as above. Add to paragraph 5, Effects:

- -
-

When no Allocator argument is provided, the string is constructed using the - value str.get_allocator().

-
- -

B. In 21.3 [basic.string], and also in 21.3.1 [string.require], replace -the declaration of the copy constructor as follows:

- -
-
basic_string(const basic_string& str, size_type pos = 0,
-             size_type n = npos); 
-
- -

The proposed resolution reflects the original intent of the LWG. It -was also noted by Pete Becker that this fix "will cause -a small amount of existing code to now work correctly."

- -

[ -Kona: issue editing snafu fixed - the proposed resolution now correctly -reflects the LWG consensus. -]

- - - - - - -
-

44. Iostreams use operator== on int_type values

-

Section: 27 [input.output] Status: WP - Submitter: Nathan Myers Date: 1998-08-06

-

View all other issues in [input.output].

-

View all issues with WP status.

-

Discussion:

-

Many of the specifications for iostreams specify that character -values or their int_type equivalents are compared using operators == -or !=, though in other places traits::eq() or traits::eq_int_type is -specified to be used throughout. This is an inconsistency; we should -change uses of == and != to use the traits members instead.

- - -

Proposed resolution:

- -

[Pre-Kona: Dietmar supplied wording]

- - -

List of changes to clause 27:

-
    -
  1. - In lib.basic.ios.members paragraph 13 (postcondition clause for - 'fill(cT)') change - -
         fillch == fill()
    -
    - - to - -
         traits::eq(fillch, fill())
    -
    - - -
  2. -
  3. - In lib.istream.unformatted paragraph 7 (effects clause for - 'get(cT,streamsize,cT)'), third bullet, change - -
         c == delim for the next available input character c
    -
    - - to - -
         traits::eq(c, delim) for the next available input character c
    -
    - -
  4. -
  5. - In lib.istream.unformatted paragraph 12 (effects clause for - 'get(basic_streambuf<cT,Tr>&,cT)'), third bullet, change - -
         c == delim for the next available input character c
    -
    - - to - -
         traits::eq(c, delim) for the next available input character c
    -
    - -
  6. -
  7. - In lib.istream.unformatted paragraph 17 (effects clause for - 'getline(cT,streamsize,cT)'), second bullet, change - -
         c == delim for the next available input character c
    -
    - - to - -
         traits::eq(c, delim) for the next available input character c
    -  
    - -
  8. -
  9. - In lib.istream.unformatted paragraph 24 (effects clause for - 'ignore(int,int_type)'), second bullet, change - -
         c == delim for the next available input character c
    -
    - - to - -
         traits::eq_int_type(c, delim) for the next available input
    -     character c
    -
    - -
  10. -
  11. - In lib.istream.unformatted paragraph 25 (notes clause for - 'ignore(int,int_type)'), second bullet, change - -
         The last condition will never occur if delim == traits::eof()
    -
    - - to - -
         The last condition will never occur if
    -     traits::eq_int_type(delim, traits::eof()).
    -
    - -
  12. -
  13. - In lib.istream.sentry paragraph 6 (example implementation for the - sentry constructor) change - -
         while ((c = is.rdbuf()->snextc()) != traits::eof()) {
    -
    - - to - -
         while (!traits::eq_int_type(c = is.rdbuf()->snextc(), traits::eof())) {
    -
    - -
  14. -
- -

List of changes to Chapter 21:

- -
    -
  1. - In lib.string::find paragraph 1 (effects clause for find()), - second bullet, change - -
         at(xpos+I) == str.at(I) for all elements ...
    -
    - - to - -
         traits::eq(at(xpos+I), str.at(I)) for all elements ...
    -
    - -
  2. -
  3. - In lib.string::rfind paragraph 1 (effects clause for rfind()), - second bullet, change - -
         at(xpos+I) == str.at(I) for all elements ...
    -
    - - to - -
         traits::eq(at(xpos+I), str.at(I)) for all elements ...
    -
    - -
  4. -
  5. - In lib.string::find.first.of paragraph 1 (effects clause for - find_first_of()), second bullet, change - -
         at(xpos+I) == str.at(I) for all elements ...
    -
    - - to - -
         traits::eq(at(xpos+I), str.at(I)) for all elements ...
    -
    - -
  6. -
  7. - In lib.string::find.last.of paragraph 1 (effects clause for - find_last_of()), second bullet, change - -
         at(xpos+I) == str.at(I) for all elements ...
    -
    - - to - -
         traits::eq(at(xpos+I), str.at(I)) for all elements ...
    -
    - -
  8. -
  9. - In lib.string::find.first.not.of paragraph 1 (effects clause for - find_first_not_of()), second bullet, change - -
         at(xpos+I) == str.at(I) for all elements ...
    -
    - - to - -
         traits::eq(at(xpos+I), str.at(I)) for all elements ...
    -
    -
  10. - -
  11. - In lib.string::find.last.not.of paragraph 1 (effects clause for - find_last_not_of()), second bullet, change - -
         at(xpos+I) == str.at(I) for all elements ...
    -
    - - to - -
         traits::eq(at(xpos+I), str.at(I)) for all elements ...
    -
    -
  12. - -
  13. - In lib.string.ios paragraph 5 (effects clause for getline()), - second bullet, change - -
         c == delim for the next available input character c 
    -
    - - to - -
         traits::eq(c, delim) for the next available input character c 
    -
    -
  14. - -
- -

Notes:

-
    -
  • - Fixing this issue highlights another sloppyness in - lib.istream.unformatted paragraph 24: this clause mentions a "character" - which is then compared to an 'int_type' (see item 5. in the list - below). It is not clear whether this requires explicit words and - if so what these words are supposed to be. A similar issue exists, - BTW, for operator*() of istreambuf_iterator which returns the result - of sgetc() as a character type (see lib.istreambuf.iterator::op* - paragraph 1), and for operator++() of istreambuf_iterator which - passes the result of sbumpc() to a constructor taking a char_type - (see lib.istreambuf.iterator::operator++ paragraph 3). Similarily, the - assignment operator ostreambuf_iterator passes a char_type to a function - taking an int_type (see lib.ostreambuf.iter.ops paragraph 1). -
  • -
  • - It is inconsistent to use comparisons using the traits functions in - Chapter 27 while not using them in Chapter 21, especially as some - of the inconsistent uses actually involve streams (eg. getline() on - streams). To avoid leaving this issue open still longer due to this - inconsistency (it is open since 1998), a list of changes to Chapter - 21 is below. -
  • -
  • - In Chapter 24 there are several places with statements like "the end - of stream is reached (streambuf_type::sgetc() returns traits::eof())" - (lib.istreambuf.iterator paragraph 1, lib.ostreambuf.iter.ops - paragraph 5). It is unclear whether these should be clarified to use - traits::eq_int_type() for detecting traits::eof(). -
  • -
- - - - - - -
-

46. Minor Annex D errors

-

Section: D.7 [depr.str.strstreams] Status: TC - Submitter: Brendan Kehoe Date: 1998-06-01

-

View all issues with TC status.

-

Discussion:

See lib-6522 and edit-814.

- -

Proposed resolution:

-

Change D.7.1 [depr.strstreambuf] (since streambuf is a typedef of -basic_streambuf<char>) from:

- -
         virtual streambuf<char>* setbuf(char* s, streamsize n);
- -

to:

- -
         virtual streambuf* setbuf(char* s, streamsize n);
- -

In D.7.4 [depr.strstream] insert the semicolon now missing after -int_type:

- -
     namespace std {
-       class strstream
-         : public basic_iostream<char> {
-       public:
-         // Types
-         typedef char                                char_type;
-         typedef typename char_traits<char>::int_type int_type
-         typedef typename char_traits<char>::pos_type pos_type;
- - - - - -
-

47. Imbue() and getloc() Returns clauses swapped

-

Section: 27.4.2.3 [ios.base.locales] Status: TC - Submitter: Matt Austern Date: 1998-06-21

-

View all other issues in [ios.base.locales].

-

View all issues with TC status.

-

Discussion:

-

Section 27.4.2.3 specifies how imbue() and getloc() work. That -section has two RETURNS clauses, and they make no sense as -stated. They make perfect sense, though, if you swap them. Am I -correct in thinking that paragraphs 2 and 4 just got mixed up by -accident?

- - -

Proposed resolution:

-

In 27.4.2.3 [ios.base.locales] swap paragraphs 2 and 4.

- - - - - -
-

48. Use of non-existent exception constructor

-

Section: 27.4.2.1.1 [ios::failure] Status: TC - Submitter: Matt Austern Date: 1998-06-21

-

View all other issues in [ios::failure].

-

View all issues with TC status.

-

Discussion:

-

27.4.2.1.1, paragraph 2, says that class failure initializes the -base class, exception, with exception(msg). Class exception (see -18.6.1) has no such constructor.

- - -

Proposed resolution:

-

Replace 27.4.2.1.1 [ios::failure], paragraph 2, with

- -
-

EFFECTS: Constructs an object of class failure.

-
- - - - - -
-

49. Underspecification of ios_base::sync_with_stdio

-

Section: 27.4.2.4 [ios.members.static] Status: WP - Submitter: Matt Austern Date: 1998-06-21

-

View all issues with WP status.

-

Discussion:

-

Two problems

- -

(1) 27.4.2.4 doesn't say what ios_base::sync_with_stdio(f) -returns. Does it return f, or does it return the previous -synchronization state? My guess is the latter, but the standard -doesn't say so.

- -

(2) 27.4.2.4 doesn't say what it means for streams to be -synchronized with stdio. Again, of course, I can make some -guesses. (And I'm unhappy about the performance implications of those -guesses, but that's another matter.)

- - -

Proposed resolution:

-

Change the following sentence in 27.4.2.4 [ios.members.static] -returns clause from:

- -
-

true if the standard iostream objects (27.3) are - synchronized and otherwise returns false.

-
- -

to:

- -
-

true if the previous state of the standard iostream - objects (27.3) was synchronized and otherwise returns - false.

-
- -

Add the following immediately after 27.4.2.4 [ios.members.static], -paragraph 2:

- -
-

When a standard iostream object str is synchronized with a -standard stdio stream f, the effect of inserting a character c by

-
  fputc(f, c);
-
- -

is the same as the effect of

-
  str.rdbuf()->sputc(c);
-
- -

for any sequence of characters; the effect of extracting a -character c by

-
  c = fgetc(f);
-
- -

is the same as the effect of:

-
  c = str.rdbuf()->sbumpc(c);
-
- -

for any sequences of characters; and the effect of pushing -back a character c by

-
  ungetc(c, f);
-
- -

is the same as the effect of

-
  str.rdbuf()->sputbackc(c);
-
- -

for any sequence of characters. [Footnote: This implies -that operations on a standard iostream object can be mixed arbitrarily -with operations on the corresponding stdio stream. In practical -terms, synchronization usually means that a standard iostream object -and a standard stdio object share a buffer. --End Footnote]

-
- -

[pre-Copenhagen: PJP and Matt contributed the definition -of "synchronization"]

- - -

[post-Copenhagen: proposed resolution was revised slightly: -text was added in the non-normative footnote to say that operations -on the two streams can be mixed arbitrarily.]

- - - - - - -
-

50. Copy constructor and assignment operator of ios_base

-

Section: 27.4.2 [ios.base] Status: TC - Submitter: Matt Austern Date: 1998-06-21

-

View all other issues in [ios.base].

-

View all issues with TC status.

-

Discussion:

-

As written, ios_base has a copy constructor and an assignment -operator. (Nothing in the standard says it doesn't have one, and all -classes have copy constructors and assignment operators unless you -take specific steps to avoid them.) However, nothing in 27.4.2 says -what the copy constructor and assignment operator do.

- -

My guess is that this was an oversight, that ios_base is, like -basic_ios, not supposed to have a copy constructor or an assignment -operator.

- -

-Jerry Schwarz comments: Yes, its an oversight, but in the opposite -sense to what you're suggesting. At one point there was a definite -intention that you could copy ios_base. It's an easy way to save the -entire state of a stream for future use. As you note, to carry out -that intention would have required a explicit description of the -semantics (e.g. what happens to the iarray and parray stuff). -

- - -

Proposed resolution:

-

In 27.4.2 [ios.base], class ios_base, specify the copy -constructor and operator= members as being private.

- - -

Rationale:

-

The LWG believes the difficulty of specifying correct semantics -outweighs any benefit of allowing ios_base objects to be copyable.

- - - - - -
-

51. Requirement to not invalidate iterators missing

-

Section: 23.1 [container.requirements] Status: TC - Submitter: David Vandevoorde Date: 1998-06-23

-

View other active issues in [container.requirements].

-

View all other issues in [container.requirements].

-

View all issues with TC status.

-

Discussion:

-

The std::sort algorithm can in general only sort a given sequence -by moving around values. The list<>::sort() member on the other -hand could move around values or just update internal pointers. Either -method can leave iterators into the list<> dereferencable, but -they would point to different things.

- -

Does the FDIS mandate anywhere which method should be used for -list<>::sort()?

- -

Matt Austern comments:

- -

I think you've found an omission in the standard.

- -

The library working group discussed this point, and there was -supposed to be a general requirement saying that list, set, map, -multiset, and multimap may not invalidate iterators, or change the -values that iterators point to, except when an operation does it -explicitly. So, for example, insert() doesn't invalidate any iterators -and erase() and remove() only invalidate iterators pointing to the -elements that are being erased.

- -

I looked for that general requirement in the FDIS, and, while I -found a limited form of it for the sorted associative containers, I -didn't find it for list. It looks like it just got omitted.

- -

The intention, though, is that list<>::sort does not -invalidate any iterators and does not change the values that any -iterator points to. There would be no reason to have the member -function otherwise.

- - -

Proposed resolution:

-

Add a new paragraph at the end of 23.1:

- -
-

Unless otherwise specified (either explicitly or by defining a function in terms of - other functions), invoking a container member function or passing a container as an - argument to a library function shall not invalidate iterators to, or change the values of, - objects within that container.

-
- - -

Rationale:

-

This was US issue CD2-23-011; it was accepted in London but the -change was not made due to an editing oversight. The wording in the -proposed resolution below is somewhat updated from CD2-23-011, -particularly the addition of the phrase "or change the values -of"

- - - - - -
-

52. Small I/O problems

-

Section: 27.4.3.2 [fpos.operations] Status: TC - Submitter: Matt Austern Date: 1998-06-23

-

View all issues with TC status.

-

Discussion:

-

First, 27.4.4.1 [basic.ios.cons], table 89. This is pretty obvious: -it should be titled "basic_ios<>() effects", not -"ios_base() effects".

- -

[The second item is a duplicate; see issue 6 for -resolution.]

- -

Second, 27.4.3.2 [fpos.operations] table 88 . There are a couple -different things wrong with it, some of which I've already discussed -with Jerry, but the most obvious mechanical sort of error is that it -uses expressions like P(i) and p(i), without ever defining what sort -of thing "i" is. -

- -

(The other problem is that it requires support for streampos -arithmetic. This is impossible on some systems, i.e. ones where file -position is a complicated structure rather than just a number. Jerry -tells me that the intention was to require syntactic support for -streampos arithmetic, but that it wasn't actually supposed to do -anything meaningful except on platforms, like Unix, where genuine -arithmetic is possible.)

- - -

Proposed resolution:

-

Change 27.4.4.1 [basic.ios.cons] table 89 title from -"ios_base() effects" to "basic_ios<>() -effects".

- - - - - -
-

53. Basic_ios destructor unspecified

-

Section: 27.4.4.1 [basic.ios.cons] Status: TC - Submitter: Matt Austern Date: 1998-06-23

-

View all other issues in [basic.ios.cons].

-

View all issues with TC status.

-

Discussion:

-

There's nothing in 27.4.4 saying what basic_ios's destructor does. -The important question is whether basic_ios::~basic_ios() destroys -rdbuf().

- - -

Proposed resolution:

-

Add after 27.4.4.1 [basic.ios.cons] paragraph 2:

- -
-

virtual ~basic_ios();

-

Notes: The destructor does not destroy rdbuf().

-
- - -

Rationale:

-

The LWG reviewed the additional question of whether or not -rdbuf(0) may set badbit. The answer is -clearly yes; it may be set via clear(). See 27.4.4.2 [basic.ios.members], paragraph 6. This issue was reviewed at length -by the LWG, which removed from the original proposed resolution a -footnote which incorrectly said "rdbuf(0) does not set -badbit".

- - - - - -
-

54. Basic_streambuf's destructor

-

Section: 27.5.2.1 [streambuf.cons] Status: TC - Submitter: Matt Austern Date: 1998-06-25

-

View all other issues in [streambuf.cons].

-

View all issues with TC status.

-

Discussion:

-

The class synopsis for basic_streambuf shows a (virtual) -destructor, but the standard doesn't say what that destructor does. My -assumption is that it does nothing, but the standard should say so -explicitly.

- - -

Proposed resolution:

-

Add after 27.5.2.1 [streambuf.cons] paragraph 2:

- -
-

virtual  ~basic_streambuf();

-

Effects: None.

-
- - - - - -
-

55. Invalid stream position is undefined

-

Section: 27 [input.output] Status: TC - Submitter: Matt Austern Date: 1998-06-26

-

View all other issues in [input.output].

-

View all issues with TC status.

-

Discussion:

-

Several member functions in clause 27 are defined in certain -circumstances to return an "invalid stream position", a term -that is defined nowhere in the standard. Two places (27.5.2.4.2, -paragraph 4, and 27.8.1.4, paragraph 15) contain a cross-reference to -a definition in _lib.iostreams.definitions_, a nonexistent -section.

- -

I suspect that the invalid stream position is just supposed to be -pos_type(-1). Probably best to say explicitly in (for example) -27.5.2.4.2 that the return value is pos_type(-1), rather than to use -the term "invalid stream position", define that term -somewhere, and then put in a cross-reference.

- -

The phrase "invalid stream position" appears ten times in -the C++ Standard. In seven places it refers to a return value, and it -should be changed. In three places it refers to an argument, and it -should not be changed. Here are the three places where "invalid -stream position" should not be changed:

- -
-

27.7.1.4 [stringbuf.virtuals], paragraph 14
- 27.8.1.5 [filebuf.virtuals], paragraph 14
- D.7.1.3 [depr.strstreambuf.virtuals], paragraph 17 -

-
- - -

Proposed resolution:

-

In 27.5.2.4.2 [streambuf.virt.buffer], paragraph 4, change "Returns an -object of class pos_type that stores an invalid stream position -(_lib.iostreams.definitions_)" to "Returns -pos_type(off_type(-1))". -

- -

In 27.5.2.4.2 [streambuf.virt.buffer], paragraph 6, change "Returns -an object of class pos_type that stores an invalid stream -position" to "Returns pos_type(off_type(-1))".

- -

In 27.7.1.4 [stringbuf.virtuals], paragraph 13, change "the object -stores an invalid stream position" to "the return value is -pos_type(off_type(-1))".

- -

In 27.8.1.5 [filebuf.virtuals], paragraph 13, change "returns an -invalid stream position (27.4.3)" to "returns -pos_type(off_type(-1))"

- -

In 27.8.1.5 [filebuf.virtuals], paragraph 15, change "Otherwise -returns an invalid stream position (_lib.iostreams.definitions_)" -to "Otherwise returns pos_type(off_type(-1))" -

- -

In D.7.1.3 [depr.strstreambuf.virtuals], paragraph 15, change "the object -stores an invalid stream position" to "the return value is -pos_type(off_type(-1))"

- -

In D.7.1.3 [depr.strstreambuf.virtuals], paragraph 18, change "the object -stores an invalid stream position" to "the return value is -pos_type(off_type(-1))"

- - - - - -
-

56. Showmanyc's return type

-

Section: 27.5.2 [streambuf] Status: TC - Submitter: Matt Austern Date: 1998-06-29

-

View all other issues in [streambuf].

-

View all issues with TC status.

-

Discussion:

-

The class summary for basic_streambuf<>, in 27.5.2, says that -showmanyc has return type int. However, 27.5.2.4.3 says that its -return type is streamsize.

- - -

Proposed resolution:

-

Change showmanyc's return type in the -27.5.2 [streambuf] class summary to streamsize.

- - - - - -
-

57. Mistake in char_traits

-

Section: 21.1.3.4 [char.traits.specializations.wchar.t] Status: TC - Submitter: Matt Austern Date: 1998-07-01

-

View all issues with TC status.

-

Discussion:

-

21.1.3.2, paragraph 3, says "The types streampos and -wstreampos may be different if the implementation supports no shift -encoding in narrow-oriented iostreams but supports one or more shift -encodings in wide-oriented streams".

- -

That's wrong: the two are the same type. The <iosfwd> summary -in 27.2 says that streampos and wstreampos are, respectively, synonyms -for fpos<char_traits<char>::state_type> and -fpos<char_traits<wchar_t>::state_type>, and, flipping back -to clause 21, we see in 21.1.3.1 and 21.1.3.2 that -char_traits<char>::state_type and -char_traits<wchar_t>::state_type must both be mbstate_t.

- - -

Proposed resolution:

-

Remove the sentence in 21.1.3.4 [char.traits.specializations.wchar.t] paragraph 3 which -begins "The types streampos and wstreampos may be -different..." .

- - - - - -
-

59. Ambiguity in specification of gbump

-

Section: 27.5.2.3.2 [streambuf.get.area] Status: TC - Submitter: Matt Austern Date: 1998-07-28

-

View all issues with TC status.

-

Discussion:

-

27.5.2.3.1 says that basic_streambuf::gbump() "Advances the -next pointer for the input sequence by n."

- -

The straightforward interpretation is that it is just gptr() += -n. An alternative interpretation, though, is that it behaves as if it -calls sbumpc n times. (The issue, of course, is whether it might ever -call underflow.) There is a similar ambiguity in the case of -pbump.

- -

(The "classic" AT&T implementation used the -former interpretation.)

- - -

Proposed resolution:

-

Change 27.5.2.3.2 [streambuf.get.area] paragraph 4 gbump effects from:

- -
-

Effects: Advances the next pointer for the input sequence by n.

-
- -

to:

- -
-

Effects: Adds n to the next pointer for the input sequence.

-
- -

Make the same change to 27.5.2.3.3 [streambuf.put.area] paragraph 4 pbump -effects.

- - - - - -
-

60. What is a formatted input function?

-

Section: 27.6.1.2.1 [istream.formatted.reqmts] Status: TC - Submitter: Matt Austern Date: 1998-08-03

-

View all other issues in [istream.formatted.reqmts].

-

View all issues with TC status.

-

Duplicate of: 162, 163, 166

-

Discussion:

-

Paragraph 1 of 27.6.1.2.1 contains general requirements for all -formatted input functions. Some of the functions defined in section -27.6.1.2 explicitly say that those requirements apply ("Behaves -like a formatted input member (as described in 27.6.1.2.1)"), but -others don't. The question: is 27.6.1.2.1 supposed to apply to -everything in 27.6.1.2, or only to those member functions that -explicitly say "behaves like a formatted input member"? Or -to put it differently: are we to assume that everything that appears -in a section called "Formatted input functions" really is a -formatted input function? I assume that 27.6.1.2.1 is intended to -apply to the arithmetic extractors (27.6.1.2.2), but I assume that it -is not intended to apply to extractors like

- -
    basic_istream& operator>>(basic_istream& (*pf)(basic_istream&));
- -

and

- -
    basic_istream& operator>>(basic_streammbuf*);
- -

There is a similar ambiguity for unformatted input, formatted output, and unformatted -output.

- -

Comments from Judy Ward: It seems like the problem is that the -basic_istream and basic_ostream operator <<()'s that are used -for the manipulators and streambuf* are in the wrong section and -should have their own separate section or be modified to make it clear -that the "Common requirements" listed in section 27.6.1.2.1 -(for basic_istream) and section 27.6.2.5.1 (for basic_ostream) do not -apply to them.

- -

Additional comments from Dietmar Kühl: It appears to be somewhat -nonsensical to consider the functions defined in 27.6.1.2.3 -[istream::extractors] paragraphs 1 to 5 to be "Formatted input -function" but since these functions are defined in a section -labeled "Formatted input functions" it is unclear to me -whether these operators are considered formatted input functions which -have to conform to the "common requirements" from 27.6.1.2.1 -[istream.formatted.reqmts]: If this is the case, all manipulators, not -just ws, would skip whitespace unless noskipws is -set (... but setting noskipws using the manipulator syntax -would also skip whitespace :-)

It is not clear which functions -are to be considered unformatted input functions. As written, it seems -that all functions in 27.6.1.3 [istream.unformatted] are unformatted input -functions. However, it does not really make much sense to construct a -sentry object for gcount(), sync(), ... Also it is -unclear what happens to the gcount() if -eg. gcount(), putback(), unget(), or -sync() is called: These functions don't extract characters, -some of them even "unextract" a character. Should this still -be reflected in gcount()? Of course, it could be read as if -after a call to gcount() gcount() return 0 -(the last unformatted input function, gcount(), didn't -extract any character) and after a call to putback() -gcount() returns -1 (the last unformatted input -function putback() did "extract" back into the -stream). Correspondingly for unget(). Is this what is -intended? If so, this should be clarified. Otherwise, a corresponding -clarification should be used.

- - -

Proposed resolution:

-

-In 27.6.1.2.2 [lib.istream.formatted.arithmetic], paragraph 1. -Change the beginning of the second sentence from "The conversion -occurs" to "These extractors behave as formatted input functions (as -described in 27.6.1.2.1). After a sentry object is constructed, -the conversion occurs" -

- -

-In 27.6.1.2.3, [lib.istream::extractors], before paragraph 1. -Add an effects clause. "Effects: None. This extractor does -not behave as a formatted input function (as described in -27.6.1.2.1). -

- -

-In 27.6.1.2.3, [lib.istream::extractors], paragraph 2. Change the -effects clause to "Effects: Calls pf(*this). This extractor does not -behave as a formatted input function (as described in 27.6.1.2.1). -

- -

-In 27.6.1.2.3, [lib.istream::extractors], paragraph 4. Change the -effects clause to "Effects: Calls pf(*this). This extractor does not -behave as a formatted input function (as described in 27.6.1.2.1). -

- -

-In 27.6.1.2.3, [lib.istream::extractors], paragraph 12. Change the -first two sentences from "If sb is null, calls setstate(failbit), -which may throw ios_base::failure (27.4.4.3). Extracts characters -from *this..." to "Behaves as a formatted input function (as described -in 27.6.1.2.1). If sb is null, calls setstate(failbit), which may -throw ios_base::failure (27.4.4.3). After a sentry object is -constructed, extracts characters from *this...". -

- -

-In 27.6.1.3, [lib.istream.unformatted], before paragraph 2. Add an -effects clause. "Effects: none. This member function does not behave -as an unformatted input function (as described in 27.6.1.3, paragraph 1)." -

- -

-In 27.6.1.3, [lib.istream.unformatted], paragraph 3. Change the -beginning of the first sentence of the effects clause from "Extracts a -character" to "Behaves as an unformatted input function (as described -in 27.6.1.3, paragraph 1). After constructing a sentry object, extracts a -character" -

- -

-In 27.6.1.3, [lib.istream.unformatted], paragraph 5. Change the -beginning of the first sentence of the effects clause from "Extracts a -character" to "Behaves as an unformatted input function (as described -in 27.6.1.3, paragraph 1). After constructing a sentry object, extracts a -character" -

- -

-In 27.6.1.3, [lib.istream.unformatted], paragraph 7. Change the -beginning of the first sentence of the effects clause from "Extracts -characters" to "Behaves as an unformatted input function (as described -in 27.6.1.3, paragraph 1). After constructing a sentry object, extracts -characters" -

- -

-[No change needed in paragraph 10, because it refers to paragraph 7.] -

- -

-In 27.6.1.3, [lib.istream.unformatted], paragraph 12. Change the -beginning of the first sentence of the effects clause from "Extracts -characters" to "Behaves as an unformatted input function (as described -in 27.6.1.3, paragraph 1). After constructing a sentry object, extracts -characters" -

- -

-[No change needed in paragraph 15.] -

- -

-In 27.6.1.3, [lib.istream.unformatted], paragraph 17. Change the -beginning of the first sentence of the effects clause from "Extracts -characters" to "Behaves as an unformatted input function (as described -in 27.6.1.3, paragraph 1). After constructing a sentry object, extracts -characters" -

- -

-[No change needed in paragraph 23.] -

- -

-In 27.6.1.3, [lib.istream.unformatted], paragraph 24. Change the -beginning of the first sentence of the effects clause from "Extracts -characters" to "Behaves as an unformatted input function (as described -in 27.6.1.3, paragraph 1). After constructing a sentry object, extracts -characters" -

- -

-In 27.6.1.3, [lib.istream.unformatted], before paragraph 27. Add an -Effects clause: "Effects: Behaves as an unformatted input function (as -described in 27.6.1.3, paragraph 1). After constructing a sentry -object, reads but does not extract the current input character." -

- -

-In 27.6.1.3, [lib.istream.unformatted], paragraph 28. Change the -first sentence of the Effects clause from "If !good() calls" to -Behaves as an unformatted input function (as described in 27.6.1.3, -paragraph 1). After constructing a sentry object, if !good() calls" -

- -

-In 27.6.1.3, [lib.istream.unformatted], paragraph 30. Change the -first sentence of the Effects clause from "If !good() calls" to -"Behaves as an unformatted input function (as described in 27.6.1.3, -paragraph 1). After constructing a sentry object, if !good() calls" -

- -

-In 27.6.1.3, [lib.istream.unformatted], paragraph 32. Change the -first sentence of the Effects clause from "If !good() calls..." to -"Behaves as an unformatted input function (as described in 27.6.1.3, -paragraph 1). After constructing a sentry object, if !good() -calls..." Add a new sentence to the end of the Effects clause: -"[Note: this function extracts no characters, so the value returned -by the next call to gcount() is 0.]" -

- -

-In 27.6.1.3, [lib.istream.unformatted], paragraph 34. Change the -first sentence of the Effects clause from "If !good() calls" to -"Behaves as an unformatted input function (as described in 27.6.1.3, -paragraph 1). After constructing a sentry object, if !good() calls". -Add a new sentence to the end of the Effects clause: "[Note: this -function extracts no characters, so the value returned by the next -call to gcount() is 0.]" -

- -

-In 27.6.1.3, [lib.istream.unformatted], paragraph 36. Change the -first sentence of the Effects clause from "If !rdbuf() is" to "Behaves -as an unformatted input function (as described in 27.6.1.3, paragraph -1), except that it does not count the number of characters extracted -and does not affect the value returned by subsequent calls to -gcount(). After constructing a sentry object, if rdbuf() is" -

- -

-In 27.6.1.3, [lib.istream.unformatted], before paragraph 37. Add an -Effects clause: "Effects: Behaves as an unformatted input function (as -described in 27.6.1.3, paragraph 1), except that it does not count the -number of characters extracted and does not affect the value returned -by subsequent calls to gcount()." Change the first sentence of -paragraph 37 from "if fail()" to "after constructing a sentry object, -if fail()". -

- -

-In 27.6.1.3, [lib.istream.unformatted], paragraph 38. Change the -first sentence of the Effects clause from "If fail()" to "Behaves -as an unformatted input function (as described in 27.6.1.3, paragraph -1), except that it does not count the number of characters extracted -and does not affect the value returned by subsequent calls to -gcount(). After constructing a sentry object, if fail() -

- -

-In 27.6.1.3, [lib.istream.unformatted], paragraph 40. Change the -first sentence of the Effects clause from "If fail()" to "Behaves -as an unformatted input function (as described in 27.6.1.3, paragraph -1), except that it does not count the number of characters extracted -and does not affect the value returned by subsequent calls to -gcount(). After constructing a sentry object, if fail() -

- -

-In 27.6.2.5.2 [lib.ostream.inserters.arithmetic], paragraph 1. Change -the beginning of the third sentence from "The formatting conversion" -to "These extractors behave as formatted output functions (as -described in 27.6.2.5.1). After the sentry object is constructed, the -conversion occurs". -

- -

-In 27.6.2.5.3 [lib.ostream.inserters], before paragraph 1. Add an -effects clause: "Effects: None. Does not behave as a formatted output -function (as described in 27.6.2.5.1).". -

- -

-In 27.6.2.5.3 [lib.ostream.inserters], paragraph 2. Change the -effects clause to "Effects: calls pf(*this). This extractor does not -behave as a formatted output function (as described in 27.6.2.5.1).". -

- -

-In 27.6.2.5.3 [lib.ostream.inserters], paragraph 4. Change the -effects clause to "Effects: calls pf(*this). This extractor does not -behave as a formatted output function (as described in 27.6.2.5.1).". -

- -

-In 27.6.2.5.3 [lib.ostream.inserters], paragraph 6. Change the first -sentence from "If sb" to "Behaves as a formatted output function (as -described in 27.6.2.5.1). After the sentry object is constructed, if -sb". -

- -

-In 27.6.2.6 [lib.ostream.unformatted], paragraph 2. Change the first -sentence from "Inserts the character" to "Behaves as an unformatted -output function (as described in 27.6.2.6, paragraph 1). After -constructing a sentry object, inserts the character". -

- -

-In 27.6.2.6 [lib.ostream.unformatted], paragraph 5. Change the first -sentence from "Obtains characters" to "Behaves as an unformatted -output function (as described in 27.6.2.6, paragraph 1). After -constructing a sentry object, obtains characters". -

- -

-In 27.6.2.6 [lib.ostream.unformatted], paragraph 7. Add a new -sentence at the end of the paragraph: "Does not behave as an -unformatted output function (as described in 27.6.2.6, paragraph 1)." -

- - -

Rationale:

-

See J16/99-0043==WG21/N1219, Proposed Resolution to Library Issue 60, -by Judy Ward and Matt Austern. This proposed resolution is section -VI of that paper.

- - - - - -
-

61. Ambiguity in iostreams exception policy

-

Section: 27.6.1.3 [istream.unformatted] Status: TC - Submitter: Matt Austern Date: 1998-08-06

-

View all other issues in [istream.unformatted].

-

View all issues with TC status.

-

Discussion:

-

The introduction to the section on unformatted input (27.6.1.3) -says that every unformatted input function catches all exceptions that -were thrown during input, sets badbit, and then conditionally rethrows -the exception. That seems clear enough. Several of the specific -functions, however, such as get() and read(), are documented in some -circumstances as setting eofbit and/or failbit. (The standard notes, -correctly, that setting eofbit or failbit can sometimes result in an -exception being thrown.) The question: if one of these functions -throws an exception triggered by setting failbit, is this an exception -"thrown during input" and hence covered by 27.6.1.3, or does -27.6.1.3 only refer to a limited class of exceptions? Just to make -this concrete, suppose you have the following snippet.

- -
  
-  char buffer[N];
-  istream is;
-  ...
-  is.exceptions(istream::failbit); // Throw on failbit but not on badbit.
-  is.read(buffer, N);
- -

Now suppose we reach EOF before we've read N characters. What -iostate bits can we expect to be set, and what exception (if any) will -be thrown?

- - -

Proposed resolution:

-

-In 27.6.1.3, paragraph 1, after the sentence that begins -"If an exception is thrown...", add the following -parenthetical comment: "(Exceptions thrown from -basic_ios<>::clear() are not caught or rethrown.)" -

- - -

Rationale:

-

The LWG looked to two alternative wordings, and choose the proposed -resolution as better standardese.

- - - - - -
-

62. Sync's return value

-

Section: 27.6.1.3 [istream.unformatted] Status: TC - Submitter: Matt Austern Date: 1998-08-06

-

View all other issues in [istream.unformatted].

-

View all issues with TC status.

-

Discussion:

-

The Effects clause for sync() (27.6.1.3, paragraph 36) says that it -"calls rdbuf()->pubsync() and, if that function returns -1 -... returns traits::eof()."

- -

That looks suspicious, because traits::eof() is of type -traits::int_type while the return type of sync() is int.

- - -

Proposed resolution:

-

In 27.6.1.3 [istream.unformatted], paragraph 36, change "returns -traits::eof()" to "returns -1". -

- - - - - -
-

63. Exception-handling policy for unformatted output

-

Section: 27.6.2.7 [ostream.unformatted] Status: TC - Submitter: Matt Austern Date: 1998-08-11

-

View all other issues in [ostream.unformatted].

-

View all issues with TC status.

-

Discussion:

-

Clause 27 details an exception-handling policy for formatted input, -unformatted input, and formatted output. It says nothing for -unformatted output (27.6.2.6). 27.6.2.6 should either include the same -kind of exception-handling policy as in the other three places, or -else it should have a footnote saying that the omission is -deliberate.

- - -

Proposed resolution:

-

-In 27.6.2.6, paragraph 1, replace the last sentence ("In any -case, the unformatted output function ends by destroying the sentry -object, then returning the value specified for the formatted output -function.") with the following text: -

-

-If an exception is thrown during output, then ios::badbit is -turned on [Footnote: without causing an ios::failure to be -thrown.] in *this's error state. If (exceptions() & -badbit) != 0 then the exception is rethrown. In any case, the -unformatted output function ends by destroying the sentry object, -then, if no exception was thrown, returning the value specified for -the formatted output function. -

- - -

Rationale:

-

-This exception-handling policy is consistent with that of formatted -input, unformatted input, and formatted output. -

- - - - - -
-

64. Exception handling in basic_istream::operator>>(basic_streambuf*)

-

Section: 27.6.1.2.3 [istream::extractors] Status: TC - Submitter: Matt Austern Date: 1998-08-11

-

View all other issues in [istream::extractors].

-

View all issues with TC status.

-

Discussion:

-

27.6.1.2.3, paragraph 13, is ambiguous. It can be interpreted two -different ways, depending on whether the second sentence is read as an -elaboration of the first.

- - -

Proposed resolution:

-

Replace 27.6.1.2.3 [istream::extractors], paragraph 13, which begins -"If the function inserts no characters ..." with:

- -
-

If the function inserts no characters, it calls - setstate(failbit), which may throw - ios_base::failure (27.4.4.3). If it inserted no characters - because it caught an exception thrown while extracting characters - from sb and failbit is on in exceptions() - (27.4.4.3), then the caught exception is rethrown.

-
- - - - - -
-

66. Strstreambuf::setbuf

-

Section: D.7.1.3 [depr.strstreambuf.virtuals] Status: TC - Submitter: Matt Austern Date: 1998-08-18

-

View all other issues in [depr.strstreambuf.virtuals].

-

View all issues with TC status.

-

Discussion:

-

D.7.1.3, paragraph 19, says that strstreambuf::setbuf -"Performs an operation that is defined separately for each class -derived from strstreambuf". This is obviously an incorrect -cut-and-paste from basic_streambuf. There are no classes derived from -strstreambuf.

- - -

Proposed resolution:

-

D.7.1.3 [depr.strstreambuf.virtuals], paragraph 19, replace the setbuf effects -clause which currently says "Performs an operation that is -defined separately for each class derived from strstreambuf" -with:

- -
-

Effects: implementation defined, except that - setbuf(0,0) has no effect.

-
- - - - - -
-

68. Extractors for char* should store null at end

-

Section: 27.6.1.2.3 [istream::extractors] Status: TC - Submitter: Angelika Langer Date: 1998-07-14

-

View all other issues in [istream::extractors].

-

View all issues with TC status.

-

Discussion:

-

Extractors for char* (27.6.1.2.3) do not store a null character -after the extracted character sequence whereas the unformatted -functions like get() do. Why is this?

- -

Comment from Jerry Schwarz: There is apparently an editing -glitch. You'll notice that the last item of the list of what stops -extraction doesn't make any sense. It was supposed to be the line that -said a null is stored.

- - -

Proposed resolution:

-

27.6.1.2.3 [istream::extractors], paragraph 7, change the last list -item from:

- -

- A null byte (charT()) in the next position, which may be - the first position if no characters were extracted. -

- -

to become a new paragraph which reads:

- -

- Operator>> then stores a null byte (charT()) in the - next position, which may be the first position if no characters were - extracted. -

- - - - - -
-

69. Must elements of a vector be contiguous?

-

Section: 23.2.5 [vector] Status: TC - Submitter: Andrew Koenig Date: 1998-07-29

-

View all other issues in [vector].

-

View all issues with TC status.

-

Discussion:

-

The issue is this: Must the elements of a vector be in contiguous memory?

- -

(Please note that this is entirely separate from the question of -whether a vector iterator is required to be a pointer; the answer to -that question is clearly "no," as it would rule out -debugging implementations)

- - -

Proposed resolution:

-

Add the following text to the end of 23.2.5 [vector], -paragraph 1.

- -
-

The elements of a vector are stored contiguously, meaning that if - v is a vector<T, Allocator> where T is some type - other than bool, then it obeys the identity &v[n] - == &v[0] + n for all 0 <= n < v.size().

-
- - -

Rationale:

-

The LWG feels that as a practical matter the answer is clearly -"yes". There was considerable discussion as to the best way -to express the concept of "contiguous", which is not -directly defined in the standard. Discussion included:

- -
    -
  • An operational definition similar to the above proposed resolution is - already used for valarray (26.5.2.3 [valarray.access]).
  • -
  • There is no need to explicitly consider a user-defined operator& - because elements must be copyconstructible (23.1 [container.requirements] para 3) - and copyconstructible (20.1.1 [utility.arg.requirements]) specifies - requirements for operator&.
  • -
  • There is no issue of one-past-the-end because of language rules.
  • -
- - - - - -
-

70. Uncaught_exception() missing throw() specification

-

Section: 18.7 [support.exception], 18.7.4 [uncaught] Status: TC - Submitter: Steve Clamage Date: 1998-08-03

-

View all other issues in [support.exception].

-

View all issues with TC status.

-

Discussion:

-

In article 3E04@pratique.fr, Valentin Bonnard writes:

- -

uncaught_exception() doesn't have a throw specification.

- -

It is intentional ? Does it means that one should be prepared to -handle exceptions thrown from uncaught_exception() ?

- -

uncaught_exception() is called in exception handling contexts where -exception safety is very important.

- - -

Proposed resolution:

-

In 15.5.3 [except.uncaught], paragraph 1, 18.7 [support.exception], -and 18.7.4 [uncaught], add "throw()" to uncaught_exception().

- - - - -
-

71. Do_get_monthname synopsis missing argument

-

Section: 22.2.5.1 [locale.time.get] Status: TC - Submitter: Nathan Myers Date: 1998-08-13

-

View all issues with TC status.

-

Discussion:

-

The locale facet member time_get<>::do_get_monthname -is described in 22.2.5.1.2 [locale.time.get.virtuals] with five arguments, -consistent with do_get_weekday and with its specified use by member -get_monthname. However, in the synopsis, it is specified instead with -four arguments. The missing argument is the "end" iterator -value.

- - -

Proposed resolution:

-

In 22.2.5.1 [locale.time.get], add an "end" argument to -the declaration of member do_monthname as follows:

- -
  virtual iter_type do_get_monthname(iter_type s, iter_type end, ios_base&,
-                                     ios_base::iostate& err, tm* t) const;
- - - - -
-

74. Garbled text for codecvt::do_max_length

-

Section: 22.2.1.4 [locale.codecvt] Status: TC - Submitter: Matt Austern Date: 1998-09-08

-

View all other issues in [locale.codecvt].

-

View all issues with TC status.

-

Discussion:

-

The text of codecvt::do_max_length's "Returns" -clause (22.2.1.5.2, paragraph 11) is garbled. It has unbalanced -parentheses and a spurious n.

- - -

Proposed resolution:

-

Replace 22.2.1.4.2 [locale.codecvt.virtuals] paragraph 11 with the -following:

- -

- Returns: The maximum value that - do_length(state, from, from_end, 1) can return for any - valid range [from, from_end) and stateT value - state. The specialization codecvt<char, char, - mbstate_t>::do_max_length() returns 1. -

- - - - -
-

75. Contradiction in codecvt::length's argument types

-

Section: 22.2.1.4 [locale.codecvt] Status: TC - Submitter: Matt -Austern Date: 1998-09-18

-

View all other issues in [locale.codecvt].

-

View all issues with TC status.

-

Discussion:

-

The class synopses for classes codecvt<> (22.2.1.5) -and codecvt_byname<> (22.2.1.6) say that the first -parameter of the member functions length and -do_length is of type const stateT&. The member -function descriptions, however (22.2.1.5.1, paragraph 6; 22.2.1.5.2, -paragraph 9) say that the type is stateT&. Either the -synopsis or the summary must be changed.

- -

If (as I believe) the member function descriptions are correct, -then we must also add text saying how do_length changes its -stateT argument.

- - -

Proposed resolution:

-

In 22.2.1.4 [locale.codecvt], and also in 22.2.1.5 [locale.codecvt.byname], -change the stateT argument type on both member -length() and member do_length() from

- -
-

const stateT&

-
- -

to

- -
-

stateT&

-
- -

In 22.2.1.4.2 [locale.codecvt.virtuals], add to the definition for member -do_length a paragraph:

- -
-

Effects: The effect on the state argument is ``as if'' - it called do_in(state, from, from_end, from, to, to+max, - to) for to pointing to a buffer of at least - max elements.

-
- - - - -
-

76. Can a codecvt facet always convert one internal character at a time?

-

Section: 22.2.1.4 [locale.codecvt] Status: WP - Submitter: Matt Austern Date: 1998-09-25

-

View all other issues in [locale.codecvt].

-

View all issues with WP status.

-

Discussion:

-

This issue concerns the requirements on classes derived from -codecvt, including user-defined classes. What are the -restrictions on the conversion from external characters -(e.g. char) to internal characters (e.g. wchar_t)? -Or, alternatively, what assumptions about codecvt facets can -the I/O library make?

- -

The question is whether it's possible to convert from internal -characters to external characters one internal character at a time, -and whether, given a valid sequence of external characters, it's -possible to pick off internal characters one at a time. Or, to put it -differently: given a sequence of external characters and the -corresponding sequence of internal characters, does a position in the -internal sequence correspond to some position in the external -sequence?

- -

To make this concrete, suppose that [first, last) is a -sequence of M external characters and that [ifirst, -ilast) is the corresponding sequence of N internal -characters, where N > 1. That is, my_encoding.in(), -applied to [first, last), yields [ifirst, -ilast). Now the question: does there necessarily exist a -subsequence of external characters, [first, last_1), such -that the corresponding sequence of internal characters is the single -character *ifirst? -

- -

(What a "no" answer would mean is that -my_encoding translates sequences only as blocks. There's a -sequence of M external characters that maps to a sequence of -N internal characters, but that external sequence has no -subsequence that maps to N-1 internal characters.)

- -

Some of the wording in the standard, such as the description of -codecvt::do_max_length (22.2.1.4.2 [locale.codecvt.virtuals], -paragraph 11) and basic_filebuf::underflow (27.8.1.5 [filebuf.virtuals], paragraph 3) suggests that it must always be -possible to pick off internal characters one at a time from a sequence -of external characters. However, this is never explicitly stated one -way or the other.

- -

This issue seems (and is) quite technical, but it is important if -we expect users to provide their own encoding facets. This is an area -where the standard library calls user-supplied code, so a well-defined -set of requirements for the user-supplied code is crucial. Users must -be aware of the assumptions that the library makes. This issue affects -positioning operations on basic_filebuf, unbuffered input, -and several of codecvt's member functions.

- - -

Proposed resolution:

-

Add the following text as a new paragraph, following 22.2.1.4.2 [locale.codecvt.virtuals] paragraph 2:

- -
-

A codecvt facet that is used by basic_filebuf -(27.8 [file.streams]) must have the property that if

-
    do_out(state, from, from_end, from_next, to, to_lim, to_next)
-
-

would return ok, where from != from_end, then

-
    do_out(state, from, from + 1, from_next, to, to_end, to_next)
-
-

must also return ok, and that if

-
    do_in(state, from, from_end, from_next, to, to_lim, to_next)
-
-

would return ok, where to != to_lim, then

-
    do_in(state, from, from_end, from_next, to, to + 1, to_next)
-
-

must also return ok. [Footnote: Informally, this -means that basic_filebuf assumes that the mapping from -internal to external characters is 1 to N: a codecvt that is -used by basic_filebuf must be able to translate characters -one internal character at a time. --End Footnote]

-
- -

[Redmond: Minor change in proposed resolution. Original -proposed resolution talked about "success", with a parenthetical -comment that success meant returning ok. New wording -removes all talk about "success", and just talks about the -return value.]

- - - - -

Rationale:

- -

The proposed resoluion says that conversions can be performed one - internal character at a time. This rules out some encodings that - would otherwise be legal. The alternative answer would mean there - would be some internal positions that do not correspond to any - external file position.

-

- An example of an encoding that this rules out is one where the - internT and externT are of the same type, and - where the internal sequence c1 c2 corresponds to the - external sequence c2 c1. -

-

It was generally agreed that basic_filebuf relies - on this property: it was designed under the assumption that - the external-to-internal mapping is N-to-1, and it is not clear - that basic_filebuf is implementable without that - restriction. -

-

- The proposed resolution is expressed as a restriction on - codecvt when used by basic_filebuf, rather - than a blanket restriction on all codecvt facets, - because basic_filebuf is the only other part of the - library that uses codecvt. If a user wants to define - a codecvt facet that implements a more general N-to-M - mapping, there is no reason to prohibit it, so long as the user - does not expect basic_filebuf to be able to use it. -

- - - - - -
-

78. Typo: event_call_back

-

Section: 27.4.2 [ios.base] Status: TC - Submitter: Nico Josuttis Date: 1998-09-29

-

View all other issues in [ios.base].

-

View all issues with TC status.

-

Discussion:

-

typo: event_call_back should be event_callback  

- - -

Proposed resolution:

-

In the 27.4.2 [ios.base] synopsis change -"event_call_back" to "event_callback".

- - - - -
-

79. Inconsistent declaration of polar()

-

Section: 26.3.1 [complex.synopsis], 26.3.7 [complex.value.ops] Status: TC - Submitter: Nico Josuttis Date: 1998-09-29

-

View all other issues in [complex.synopsis].

-

View all issues with TC status.

-

Discussion:

-

In 26.3.1 [complex.synopsis] polar is declared as follows:

-
   template<class T> complex<T> polar(const T&, const T&); 
- -

In 26.3.7 [complex.value.ops] it is declared as follows:

-
   template<class T> complex<T> polar(const T& rho, const T& theta = 0); 
- -

Thus whether the second parameter is optional is not clear.

- - -

Proposed resolution:

-

In 26.3.1 [complex.synopsis] change:

-
   template<class T> complex<T> polar(const T&, const T&);
- -

to:

-
   template<class T> complex<T> polar(const T& rho, const T& theta = 0); 
- - - - - -
-

80. Global Operators of complex declared twice

-

Section: 26.3.1 [complex.synopsis], 26.3.2 [complex] Status: TC - Submitter: Nico Josuttis Date: 1998-09-29

-

View all other issues in [complex.synopsis].

-

View all issues with TC status.

-

Discussion:

-

Both 26.2.1 and 26.2.2 contain declarations of global operators for -class complex. This redundancy should be removed.

- - -

Proposed resolution:

-

Reduce redundancy according to the general style of the standard.

- - - - -
-

83. String::npos vs. string::max_size()

-

Section: 21.3 [basic.string] Status: TC - Submitter: Nico Josuttis Date: 1998-09-29

-

View other active issues in [basic.string].

-

View all other issues in [basic.string].

-

View all issues with TC status.

-

Duplicate of: 89

-

Discussion:

-

Many string member functions throw if size is getting or exceeding -npos. However, I wonder why they don't throw if size is getting or -exceeding max_size() instead of npos. May be npos is known at compile -time, while max_size() is known at runtime. However, what happens if -size exceeds max_size() but not npos, then? It seems the standard -lacks some clarifications here.

- - -

Proposed resolution:

-

After 21.3 [basic.string] paragraph 4 ("The functions -described in this clause...") add a new paragraph:

- -
-

For any string operation, if as a result of the operation, size() would exceed - max_size() then - the operation throws length_error.

-
- - -

Rationale:

-

The LWG believes length_error is the correct exception to throw.

- - - - -
-

86. String constructors don't describe exceptions

-

Section: 21.3.1 [string.require] Status: TC - Submitter: Nico Josuttis Date: 1998-09-29

-

View all other issues in [string.require].

-

View all issues with TC status.

-

Discussion:

-

The constructor from a range:

- -
template<class InputIterator> 
-         basic_string(InputIterator begin, InputIterator end, 
-                      const Allocator& a = Allocator());
- -

lacks a throws clause. However, I would expect that it throws -according to the other constructors if the numbers of characters in -the range equals npos (or exceeds max_size(), see above).

- - -

Proposed resolution:

-

In 21.3.1 [string.require], Strike throws paragraphs for -constructors which say "Throws: length_error if n == -npos."

- - -

Rationale:

-

Throws clauses for length_error if n == npos are no longer needed -because they are subsumed by the general wording added by the -resolution for issue 83.

- - - - -
-

90. Incorrect description of operator >> for strings

-

Section: 21.3.8.9 [string.io] Status: TC - Submitter: Nico Josuttis Date: 1998-09-29

-

View all other issues in [string.io].

-

View all issues with TC status.

-

Discussion:

-

The effect of operator >> for strings contain the following item:

- -

    isspace(c,getloc()) is true for the next available input -character c.

- -

Here getloc() has to be replaced by is.getloc().

- - -

Proposed resolution:

-

In 21.3.8.9 [string.io] paragraph 1 Effects clause replace:

- -
-

isspace(c,getloc()) is true for the next available input character c.

-
- -

with:

- -
-

isspace(c,is.getloc()) is true for the next available input character c.

-
- - - - - -
-

91. Description of operator>> and getline() for string<> might cause endless loop

-

Section: 21.3.8.9 [string.io] Status: WP - Submitter: Nico Josuttis Date: 1998-09-29

-

View all other issues in [string.io].

-

View all issues with WP status.

-

Discussion:

-

Operator >> and getline() for strings read until eof() -in the input stream is true. However, this might never happen, if the -stream can't read anymore without reaching EOF. So shouldn't it be -changed into that it reads until !good() ?

- - -

Proposed resolution:

-

In 21.3.8.9 [string.io], paragraph 1, replace:

-

-Effects: Begins by constructing a sentry object k as if k were -constructed by typename basic_istream<charT,traits>::sentry k( is). If -bool( k) is true, it calls str.erase() and then extracts characters -from is and appends them to str as if by calling str.append(1, c). If -is.width() is greater than zero, the maximum number n of characters -appended is is.width(); otherwise n is str.max_size(). Characters are -extracted and appended until any of the following occurs: -

-

with:

-

-Effects: Behaves as a formatted input function (27.6.1.2.1 -[istream.formatted.reqmts]). After constructing a sentry object, if the -sentry converts to true, calls str.erase() and then extracts -characters from is and appends them to str as if by calling -str.append(1,c). If is.width() is greater than zero, the maximum -number n of characters appended is is.width(); otherwise n is -str.max_size(). Characters are extracted and appended until any of the -following occurs: -

- -

In 21.3.8.9 [string.io], paragraph 6, replace

-

-Effects: Begins by constructing a sentry object k as if by typename -basic_istream<charT,traits>::sentry k( is, true). If bool( k) is true, -it calls str.erase() and then extracts characters from is and appends -them to str as if by calling str.append(1, c) until any of the -following occurs: -

-

with:

-

Effects: Behaves as an unformatted input function -(27.6.1.3 [istream.unformatted]), except that it does not affect the -value returned -by subsequent calls to basic_istream<>::gcount(). After -constructing a sentry object, if the sentry converts to true, calls -str.erase() and then extracts characters from is and appends them to -str as if by calling str.append(1,c) until any of the following -occurs: -

- -

[Redmond: Made changes in proposed resolution. operator>> -should be a formatted input function, not an unformatted input function. -getline should not be required to set gcount, since -there is no mechanism for gcount to be set except by one of -basic_istream's member functions.]

- - -

[Curaçao: Nico agrees with proposed resolution.]

- - - - -

Rationale:

-

The real issue here is whether or not these string input functions -get their characters from a streambuf, rather than by calling an -istream's member functions, a streambuf signals failure either by -returning eof or by throwing an exception; there are no other -possibilities. The proposed resolution makes it clear that these two -functions do get characters from a streambuf.

- - - - - -
-

92. Incomplete Algorithm Requirements

-

Section: 25 [algorithms] Status: WP - Submitter: Nico Josuttis Date: 1998-09-29

-

View all other issues in [algorithms].

-

View all issues with WP status.

-

Discussion:

-

The standard does not state, how often a function object is copied, -called, or the order of calls inside an algorithm. This may lead to -surprising/buggy behavior. Consider the following example:

- -
class Nth {    // function object that returns true for the nth element 
-  private: 
-    int nth;     // element to return true for 
-    int count;   // element counter 
-  public: 
-    Nth (int n) : nth(n), count(0) { 
-    } 
-    bool operator() (int) { 
-        return ++count == nth; 
-    } 
-}; 
-.... 
-// remove third element 
-    list<int>::iterator pos; 
-    pos = remove_if(coll.begin(),coll.end(),  // range 
-                    Nth(3)),                  // remove criterion 
-    coll.erase(pos,coll.end()); 
- -

This call, in fact removes the 3rd AND the 6th element. This -happens because the usual implementation of the algorithm copies the -function object internally:

- -
template <class ForwIter, class Predicate> 
-ForwIter std::remove_if(ForwIter beg, ForwIter end, Predicate op) 
-{ 
-    beg = find_if(beg, end, op); 
-    if (beg == end) { 
-        return beg; 
-    } 
-    else { 
-        ForwIter next = beg; 
-        return remove_copy_if(++next, end, beg, op); 
-    } 
-} 
- -

The algorithm uses find_if() to find the first element that should -be removed. However, it then uses a copy of the passed function object -to process the resulting elements (if any). Here, Nth is used again -and removes also the sixth element. This behavior compromises the -advantage of function objects being able to have a state. Without any -cost it could be avoided (just implement it directly instead of -calling find_if()).

- - -

Proposed resolution:

- -

Add a new paragraph following 25 [algorithms] paragraph 8:

-

-[Note: Unless otherwise specified, algorithms that take function -objects as arguments are permitted to copy those function objects -freely. Programmers for whom object identity is important should -consider using a wrapper class that points to a noncopied -implementation object, or some equivalent solution.] -

- -

[Dublin: Pete Becker felt that this may not be a defect, -but rather something that programmers need to be educated about. -There was discussion of adding wording to the effect that the number -and order of calls to function objects, including predicates, not -affect the behavior of the function object.]

- - -

[Pre-Kona: Nico comments: It seems the problem is that we don't -have a clear statement of "predicate" in the -standard. People including me seemed to think "a function -returning a Boolean value and being able to be called by an STL -algorithm or be used as sorting criterion or ... is a -predicate". But a predicate has more requirements: It should -never change its behavior due to a call or being copied. IMHO we have -to state this in the standard. If you like, see section 8.1.4 of my -library book for a detailed discussion.]

- - -

[Kona: Nico will provide wording to the effect that "unless -otherwise specified, the number of copies of and calls to function -objects by algorithms is unspecified".  Consider placing in -25 [algorithms] after paragraph 9.]

- - -

[Santa Cruz: The standard doesn't currently guarantee that - functions object won't be copied, and what isn't forbidden is - allowed. It is believed (especially since implementations that were - written in concert with the standard do make copies of function - objects) that this was intentional. Thus, no normative change is - needed. What we should put in is a non-normative note suggesting to - programmers that if they want to guarantee the lack of copying they - should use something like the ref wrapper.]

- - -

[Oxford: Matt provided wording.]

- - - - - - - - -
-

98. Input iterator requirements are badly written

-

Section: 24.1.1 [input.iterators] Status: WP - Submitter: AFNOR Date: 1998-10-07

-

View all other issues in [input.iterators].

-

View all issues with WP status.

-

Discussion:

-

Table 72 in 24.1.1 [input.iterators] specifies semantics for -*r++ of:

- -

   { T tmp = *r; ++r; return tmp; }

- -

There are two problems with this. First, the return type is -specified to be "T", as opposed to something like "convertible to T". -This is too specific: we want to allow *r++ to return an lvalue.

- -

Second, writing the semantics in terms of code misleadingly -suggests that the effects *r++ should precisely replicate the behavior -of this code, including side effects. (Does this mean that *r++ -should invoke the copy constructor exactly as many times as the sample -code above would?) See issue 334 for a similar -problem.

- - - -

Proposed resolution:

-

In Table 72 in 24.1.1 [input.iterators], change the return type -for *r++ from T to "convertible to T".

- - -

Rationale:

-

This issue has two parts: the return type, and the number of times - the copy constructor is invoked.

- -

The LWG believes the the first part is a real issue. It's - inappropriate for the return type to be specified so much more - precisely for *r++ than it is for *r. In particular, if r is of - (say) type int*, then *r++ isn't int, - but int&.

- -

The LWG does not believe that the number of times the copy - constructor is invoked is a real issue. This can vary in any case, - because of language rules on copy constructor elision. That's too - much to read into these semantics clauses.

- -

Additionally, as Dave Abrahams pointed out (c++std-lib-13703): since - we're told (24.1/3) that forward iterators satisfy all the requirements - of input iterators, we can't impose any requirements in the Input - Iterator requirements table that forward iterators don't satisfy.

- - - - - -
-

103. set::iterator is required to be modifiable, but this allows modification of keys

-

Section: 23.1.2 [associative.reqmts] Status: WP - Submitter: AFNOR Date: 1998-10-07

-

View all other issues in [associative.reqmts].

-

View all issues with WP status.

-

Discussion:

-

Set::iterator is described as implementation-defined with a -reference to the container requirement; the container requirement says -that const_iterator is an iterator pointing to const T and iterator an -iterator pointing to T.

- -

23.1.2 paragraph 2 implies that the keys should not be modified to -break the ordering of elements. But that is not clearly -specified. Especially considering that the current standard requires -that iterator for associative containers be different from -const_iterator. Set, for example, has the following:

- -

typedef implementation defined iterator;
-       // See _lib.container.requirements_

- -

23.1 [container.requirements] actually requires that iterator type pointing -to T (table 65). Disallowing user modification of keys by changing the -standard to require an iterator for associative container to be the -same as const_iterator would be overkill since that will unnecessarily -significantly restrict the usage of associative container. A class to -be used as elements of set, for example, can no longer be modified -easily without either redesigning the class (using mutable on fields -that have nothing to do with ordering), or using const_cast, which -defeats requiring iterator to be const_iterator. The proposed solution -goes in line with trusting user knows what he is doing.

- -

Other Options Evaluated:

- -

Option A.   In 23.1.2 [associative.reqmts], paragraph 2, after -first sentence, and before "In addition,...", add one line: -

- -
-

Modification of keys shall not change their strict weak ordering.

-
- -

Option B. Add three new sentences to 23.1.2 [associative.reqmts]:

- -
-

At the end of paragraph 5: "Keys in an associative container - are immutable." At the end of paragraph 6: "For - associative containers where the value type is the same as the key - type, both iterator and const_iterator are - constant iterators. It is unspecified whether or not - iterator and const_iterator are the same - type."

-
- -

Option C. To 23.1.2 [associative.reqmts], paragraph 3, which -currently reads:

- -
-

The phrase ``equivalence of keys'' means the equivalence relation imposed by the - comparison and not the operator== on keys. That is, two keys k1 and k2 in the same - container are considered to be equivalent if for the comparison object comp, comp(k1, k2) - == false && comp(k2, k1) == false.

-
- -

  add the following:

- -
-

For any two keys k1 and k2 in the same container, comp(k1, k2) shall return the same - value whenever it is evaluated. [Note: If k2 is removed from the container and later - reinserted, comp(k1, k2) must still return a consistent value but this value may be - different than it was the first time k1 and k2 were in the same container. This is - intended to allow usage like a string key that contains a filename, where comp compares - file contents; if k2 is removed, the file is changed, and the same k2 (filename) is - reinserted, comp(k1, k2) must again return a consistent value but this value may be - different than it was the previous time k2 was in the container.]

-
- - - -

Proposed resolution:

-

Add the following to 23.1.2 [associative.reqmts] at -the indicated location:

- -
-

At the end of paragraph 3: "For any two keys k1 and k2 in the same container, - calling comp(k1, k2) shall always return the same - value."

-

At the end of paragraph 5: "Keys in an associative container are immutable."

-

At the end of paragraph 6: "For associative containers where the value type is the - same as the key type, both iterator and const_iterator are constant - iterators. It is unspecified whether or not iterator and const_iterator - are the same type."

-
- - -

Rationale:

-

Several arguments were advanced for and against allowing set elements to be -mutable as long as the ordering was not effected. The argument which swayed the -LWG was one of safety; if elements were mutable, there would be no compile-time -way to detect of a simple user oversight which caused ordering to be -modified. There was a report that this had actually happened in practice, -and had been painful to diagnose. If users need to modify elements, -it is possible to use mutable members or const_cast.

- -

Simply requiring that keys be immutable is not sufficient, because the comparison -object may indirectly (via pointers) operate on values outside of the keys.

- -

-The types iterator and const_iterator are permitted -to be different types to allow for potential future work in which some -member functions might be overloaded between the two types. No such -member functions exist now, and the LWG believes that user functionality -will not be impaired by permitting the two types to be the same. A -function that operates on both iterator types can be defined for -const_iterator alone, and can rely on the automatic -conversion from iterator to const_iterator. -

- -

[Tokyo: The LWG crafted the proposed resolution and rationale.]

- - - - - - -
-

106. Numeric library private members are implementation defined

-

Section: 26.5.5 [template.slice.array] Status: TC - Submitter: AFNOR Date: 1998-10-07

-

View all other issues in [template.slice.array].

-

View all issues with TC status.

-

Discussion:

-

This is the only place in the whole standard where the implementation has to document -something private.

- - -

Proposed resolution:

-

-Remove the comment which says "// remainder implementation defined" from: -

- -
    -
  • 26.5.5 [template.slice.array]
  • -
  • 26.5.7 [template.gslice.array]
  • -
  • 26.5.8 [template.mask.array]
  • -
  • 26.5.9 [template.indirect.array]
  • -
- - - - - -
-

108. Lifetime of exception::what() return unspecified

-

Section: 18.6.1 [type.info] Status: TC - Submitter: AFNOR Date: 1998-10-07

-

View all other issues in [type.info].

-

View all issues with TC status.

-

Discussion:

-

In 18.6.1, paragraphs 8-9, the lifetime of the return value of -exception::what() is left unspecified. This issue has implications -with exception safety of exception handling: some exceptions should -not throw bad_alloc.

- - -

Proposed resolution:

-

Add to 18.6.1 [type.info] paragraph 9 (exception::what notes -clause) the sentence:

- -
-

The return value remains valid until the exception object from which it is obtained is - destroyed or a non-const member function of the exception object is called.

-
- - -

Rationale:

-

If an exception object has non-const members, they may be used -to set internal state that should affect the contents of the string -returned by what(). -

- - - - - -
-

109. Missing binders for non-const sequence elements

-

Section: D.8 [depr.lib.binders] Status: WP - Submitter: Bjarne Stroustrup Date: 1998-10-07

-

View all other issues in [depr.lib.binders].

-

View all issues with WP status.

-

Discussion:

- -

There are no versions of binders that apply to non-const elements -of a sequence. This makes examples like for_each() using bind2nd() on -page 521 of "The C++ Programming Language (3rd)" -non-conforming. Suitable versions of the binders need to be added.

- -

Further discussion from Nico:

- -

What is probably meant here is shown in the following example:

- -
class Elem { 
-  public: 
-    void print (int i) const { } 
-    void modify (int i) { } 
-}; 
-
int main() 
-{ 
-    vector<Elem> coll(2); 
-    for_each (coll.begin(), coll.end(), bind2nd(mem_fun_ref(&Elem::print),42));    // OK 
-    for_each (coll.begin(), coll.end(), bind2nd(mem_fun_ref(&Elem::modify),42));   // ERROR 
-}
- -

The error results from the fact that bind2nd() passes its first -argument (the argument of the sequence) as constant reference. See the -following typical implementation:

- -
-
template <class Operation> 
-class binder2nd 
-  : public unary_function<typename Operation::first_argument_type, 
-                          typename Operation::result_type> { 
-protected: 
-  Operation op; 
-  typename Operation::second_argument_type value; 
-public: 
-  binder2nd(const Operation& o, 
-            const typename Operation::second_argument_type& v) 
-      : op(o), value(v) {} 
-
 typename Operation::result_type 
-  operator()(const typename Operation::first_argument_type& x) const { 
-    return op(x, value); 
-  } 
-};
-
- -

The solution is to overload operator () of bind2nd for non-constant arguments:

- -
-
template <class Operation> 
-class binder2nd 
-  : public unary_function<typename Operation::first_argument_type, 
-                          typename Operation::result_type> { 
-protected: 
-  Operation op; 
-  typename Operation::second_argument_type value; 
-public: 
-  binder2nd(const Operation& o, 
-            const typename Operation::second_argument_type& v) 
-      : op(o), value(v) {} 
-
 typename Operation::result_type 
-  operator()(const typename Operation::first_argument_type& x) const { 
-    return op(x, value); 
-  } 
-  typename Operation::result_type 
-  operator()(typename Operation::first_argument_type& x) const { 
-    return op(x, value); 
-  } 
-};
-
- - -

Proposed resolution:

- -

Howard believes there is a flaw in this resolution. -See c++std-lib-9127. We may need to reopen this issue.

- -

In D.8 [depr.lib.binders] in the declaration of binder1st after:

-
-

typename Operation::result_type
-  operator()(const typename Operation::second_argument_type& x) const;

-
-

insert:

-
-

typename Operation::result_type
-  operator()(typename Operation::second_argument_type& x) const;

-
-

In D.8 [depr.lib.binders] in the declaration of binder2nd after:

-
-

typename Operation::result_type
-  operator()(const typename Operation::first_argument_type& x) const;

-
-

insert:

-
-

typename Operation::result_type
-  operator()(typename Operation::first_argument_type& x) const;

-
- -

[Kona: The LWG discussed this at some length.It was agreed that -this is a mistake in the design, but there was no consensus on whether -it was a defect in the Standard. Straw vote: NAD - 5. Accept -proposed resolution - 3. Leave open - 6.]

- - -

[Copenhagen: It was generally agreed that this was a defect. -Strap poll: NAD - 0. Accept proposed resolution - 10. -Leave open - 1.]

- - - - - - - -
-

110. istreambuf_iterator::equal not const

-

Section: 24.5.3 [istreambuf.iterator], 24.5.3.5 [istreambuf.iterator::equal] Status: TC - Submitter: Nathan Myers Date: 1998-10-15

-

View all other issues in [istreambuf.iterator].

-

View all issues with TC status.

-

Discussion:

-

Member istreambuf_iterator<>::equal is not declared -"const", yet 24.5.3.6 [istreambuf.iterator::op==] says that operator==, -which is const, calls it. This is contradictory.

- - -

Proposed resolution:

-

In 24.5.3 [istreambuf.iterator] and also in 24.5.3.5 [istreambuf.iterator::equal], -replace:

- -
-
bool equal(istreambuf_iterator& b);
-
- -

with:

- -
-
bool equal(const istreambuf_iterator& b) const;
-
- - - - - -
-

112. Minor typo in ostreambuf_iterator constructor

-

Section: 24.5.4.1 [ostreambuf.iter.cons] Status: TC - Submitter: Matt Austern Date: 1998-10-20

-

View all issues with TC status.

-

Discussion:

-

The requires clause for ostreambuf_iterator's -constructor from an ostream_type (24.5.4.1, paragraph 1) -reads "s is not null". However, s is a -reference, and references can't be null.

- - -

Proposed resolution:

-

In 24.5.4.1 [ostreambuf.iter.cons]:

- -

Move the current paragraph 1, which reads "Requires: s is not -null.", from the first constructor to the second constructor.

- -

Insert a new paragraph 1 Requires clause for the first constructor -reading:

- -
-

Requires: s.rdbuf() is not null.

-
- - - - - -
-

114. Placement forms example in error twice

-

Section: 18.5.1.3 [new.delete.placement] Status: TC - Submitter: Steve Clamage Date: 1998-10-28

-

View all other issues in [new.delete.placement].

-

View all issues with TC status.

-

Duplicate of: 196

-

Discussion:

-

Section 18.5.1.3 contains the following example:

- -
[Example: This can be useful for constructing an object at a known address:
-        char place[sizeof(Something)];
-        Something* p = new (place) Something();
- -end example]
- -

First code line: "place" need not have any special alignment, and the -following constructor could fail due to misaligned data.

- -

Second code line: Aren't the parens on Something() incorrect?  [Dublin: the LWG -believes the () are correct.]

- -

Examples are not normative, but nevertheless should not show code that is invalid or -likely to fail.

- - -

Proposed resolution:

-

Replace the first line of code in the example in -18.5.1.3 [new.delete.placement] with: -

- -
-
void* place = operator new(sizeof(Something));
-
- - - - - -
-

115. Typo in strstream constructors

-

Section: D.7.4.1 [depr.strstream.cons] Status: TC - Submitter: Steve Clamage Date: 1998-11-02

-

View all issues with TC status.

-

Discussion:

-

D.7.4.1 strstream constructors paragraph 2 says:

- -
-

Effects: Constructs an object of class strstream, initializing the base class with - iostream(& sb) and initializing sb with one of the two constructors:

-

- If mode&app==0, then s shall designate the first element of an array of n - elements. The constructor is strstreambuf(s, n, s).

-

- If mode&app==0, then s shall designate the first element of an array of n - elements that contains an NTBS whose first element is designated by s. The constructor is - strstreambuf(s, n, s+std::strlen(s)).

-
- -

Notice the second condition is the same as the first. I think the second condition -should be "If mode&app==app", or "mode&app!=0", meaning that -the append bit is set.

- - -

Proposed resolution:

-

In D.7.3.1 [depr.ostrstream.cons] paragraph 2 and D.7.4.1 [depr.strstream.cons] -paragraph 2, change the first condition to (mode&app)==0 -and the second condition to (mode&app)!=0.

- - - - - -
-

117. basic_ostream uses nonexistent num_put member functions

-

Section: 27.6.2.6.2 [ostream.inserters.arithmetic] Status: WP - Submitter: Matt Austern Date: 1998-11-20

-

View all other issues in [ostream.inserters.arithmetic].

-

View all issues with WP status.

-

Discussion:

-

The effects clause for numeric inserters says that -insertion of a value x, whose type is either bool, -short, unsigned short, int, unsigned -int, long, unsigned long, float, -double, long double, or const void*, is -delegated to num_put, and that insertion is performed as if -through the following code fragment:

- -
bool failed = use_facet<
-   num_put<charT,ostreambuf_iterator<charT,traits> > 
-   >(getloc()).put(*this, *this, fill(), val). failed();
- -

This doesn't work, because num_put<>::put is only -overloaded for the types bool, long, unsigned -long, double, long double, and const -void*. That is, the code fragment in the standard is incorrect -(it is diagnosed as ambiguous at compile time) for the types -short, unsigned short, int, unsigned -int, and float.

- -

We must either add new member functions to num_put, or -else change the description in ostream so that it only calls -functions that are actually there. I prefer the latter.

- - -

Proposed resolution:

-

Replace 27.6.2.5.2, paragraph 1 with the following:

- -
-

-The classes num_get<> and num_put<> handle locale-dependent numeric -formatting and parsing. These inserter functions use the imbued -locale value to perform numeric formatting. When val is of type bool, -long, unsigned long, double, long double, or const void*, the -formatting conversion occurs as if it performed the following code -fragment: -

- -
bool failed = use_facet<
-   num_put<charT,ostreambuf_iterator<charT,traits> >
-   >(getloc()).put(*this, *this, fill(), val). failed();
-
- -

-When val is of type short the formatting conversion occurs as if it -performed the following code fragment: -

- -
ios_base::fmtflags baseflags = ios_base::flags() & ios_base::basefield;
-bool failed = use_facet<
-   num_put<charT,ostreambuf_iterator<charT,traits> >
-   >(getloc()).put(*this, *this, fill(),
-      baseflags == ios_base::oct || baseflags == ios_base::hex
-         ? static_cast<long>(static_cast<unsigned short>(val))
-         : static_cast<long>(val)). failed();
-
- -

-When val is of type int the formatting conversion occurs as if it performed -the following code fragment: -

- -
ios_base::fmtflags baseflags = ios_base::flags() & ios_base::basefield;
-bool failed = use_facet<
-   num_put<charT,ostreambuf_iterator<charT,traits> >
-   >(getloc()).put(*this, *this, fill(),
-      baseflags == ios_base::oct || baseflags == ios_base::hex
-         ? static_cast<long>(static_cast<unsigned int>(val))
-         : static_cast<long>(val)). failed();
-
- -

-When val is of type unsigned short or unsigned int the formatting conversion -occurs as if it performed the following code fragment: -

- -
bool failed = use_facet<
-   num_put<charT,ostreambuf_iterator<charT,traits> >
-   >(getloc()).put(*this, *this, fill(), static_cast<unsigned long>(val)).
-failed();
-
- -

-When val is of type float the formatting conversion occurs as if it -performed the following code fragment: -

- -
bool failed = use_facet<
-   num_put<charT,ostreambuf_iterator<charT,traits> >
-   >(getloc()).put(*this, *this, fill(), static_cast<double>(val)).
-failed();
-
- -
- -

[post-Toronto: This differs from the previous proposed -resolution; PJP provided the new wording. The differences are in -signed short and int output.]

- - - -

Rationale:

-

The original proposed resolution was to cast int and short to long, -unsigned int and unsigned short to unsigned long, and float to double, -thus ensuring that we don't try to use nonexistent num_put<> -member functions. The current proposed resolution is more -complicated, but gives more expected results for hex and octal output -of signed short and signed int. (On a system with 16-bit short, for -example, printing short(-1) in hex format should yield 0xffff.)

- - - - - -
-

118. basic_istream uses nonexistent num_get member functions

-

Section: 27.6.1.2.2 [istream.formatted.arithmetic] Status: WP - Submitter: Matt Austern Date: 1998-11-20

-

View other active issues in [istream.formatted.arithmetic].

-

View all other issues in [istream.formatted.arithmetic].

-

View all issues with WP status.

-

Discussion:

-

Formatted input is defined for the types short, unsigned short, int, -unsigned int, long, unsigned long, float, double, -long double, bool, and void*. According to section 27.6.1.2.2, -formatted input of a value x is done as if by the following code fragment:

- -
typedef num_get< charT,istreambuf_iterator<charT,traits> > numget; 
-iostate err = 0; 
-use_facet< numget >(loc).get(*this, 0, *this, err, val); 
-setstate(err);
- -

According to section 22.2.2.1.1 [facet.num.get.members], however, -num_get<>::get() is only overloaded for the types -bool, long, unsigned short, unsigned -int, unsigned long, unsigned long, -float, double, long double, and -void*. Comparing the lists from the two sections, we find -that 27.6.1.2.2 is using a nonexistent function for types -short and int.

- - -

Proposed resolution:

-

In 27.6.1.2.2 [istream.formatted.arithmetic] Arithmetic Extractors, remove the -two lines (1st and 3rd) which read:

-
-
operator>>(short& val);
-...
-operator>>(int& val);
-
- -

And add the following at the end of that section (27.6.1.2.2) :

- -
-
operator>>(short& val);
-

The conversion occurs as if performed by the following code fragment (using - the same notation as for the preceding code fragment):

-
  typedef num_get< charT,istreambuf_iterator<charT,traits> > numget;
-  iostate err = 0;
-  long lval;
-  use_facet< numget >(loc).get(*this, 0, *this, err, lval);
-        if (err == 0
-                && (lval < numeric_limits<short>::min() || numeric_limits<short>::max() < lval))
-                err = ios_base::failbit;
-  setstate(err);
-
operator>>(int& val);
-

The conversion occurs as if performed by the following code fragment (using - the same notation as for the preceding code fragment):

-
  typedef num_get< charT,istreambuf_iterator<charT,traits> > numget;
-  iostate err = 0;
-  long lval;
-  use_facet< numget >(loc).get(*this, 0, *this, err, lval);
-        if (err == 0
-                && (lval < numeric_limits<int>::min() || numeric_limits<int>::max() < lval))
-                err = ios_base::failbit;
-  setstate(err);
-
- -

[Post-Tokyo: PJP provided the above wording.]

- - - - - - -
-

119. Should virtual functions be allowed to strengthen the exception specification?

-

Section: 17.4.4.8 [res.on.exception.handling] Status: TC - Submitter: Judy Ward Date: 1998-12-15

-

View all other issues in [res.on.exception.handling].

-

View all issues with TC status.

-

Discussion:

-

Section 17.4.4.8 [res.on.exception.handling] states:

- -

"An implementation may strengthen the exception-specification -for a function by removing listed exceptions."

- -

The problem is that if an implementation is allowed to do this for -virtual functions, then a library user cannot write a class that -portably derives from that class.

- -

For example, this would not compile if ios_base::failure::~failure -had an empty exception specification:

- -
#include <ios>
-#include <string>
-
-class D : public std::ios_base::failure {
-public:
-        D(const std::string&);
-        ~D(); // error - exception specification must be compatible with 
-              // overridden virtual function ios_base::failure::~failure()
-};
- - -

Proposed resolution:

-

Change Section 17.4.4.8 [res.on.exception.handling] from:

- -

     "may strengthen the -exception-specification for a function"

- -

to:

- -

     "may strengthen the -exception-specification for a non-virtual function".

- - - - - -
-

120. Can an implementor add specializations?

-

Section: 17.4.3.1 [reserved.names] Status: WP - Submitter: Judy Ward Date: 1998-12-15

-

View all other issues in [reserved.names].

-

View all issues with WP status.

-

Discussion:

- -

The original issue asked whether a library implementor could -specialize standard library templates for built-in types. (This was -an issue because users are permitted to explicitly instantiate -standard library templates.)

- -

Specializations are no longer a problem, because of the resolution -to core issue 259. Under the proposed resolution, it will be legal -for a translation unit to contain both a specialization and an -explicit instantiation of the same template, provided that the -specialization comes first. In such a case, the explicit -instantiation will be ignored. Further discussion of library issue -120 assumes that the core 259 resolution will be adopted.

- -

However, as noted in lib-7047, one piece of this issue still -remains: what happens if a standard library implementor explicitly -instantiates a standard library templates? It's illegal for a program -to contain two different explicit instantiations of the same template -for the same type in two different translation units (ODR violation), -and the core working group doesn't believe it is practical to relax -that restriction.

- -

The issue, then, is: are users allowed to explicitly instantiate -standard library templates for non-user defined types? The status quo -answer is 'yes'. Changing it to 'no' would give library implementors -more freedom.

- -

This is an issue because, for performance reasons, library -implementors often need to explicitly instantiate standard library -templates. (for example, std::basic_string<char>) Does giving -users freedom to explicitly instantiate standard library templates for -non-user defined types make it impossible or painfully difficult for -library implementors to do this?

- -

John Spicer suggests, in lib-8957, that library implementors have a -mechanism they can use for explicit instantiations that doesn't -prevent users from performing their own explicit instantiations: put -each explicit instantiation in its own object file. (Different -solutions might be necessary for Unix DSOs or MS-Windows DLLs.) On -some platforms, library implementors might not need to do anything -special: the "undefined behavior" that results from having two -different explicit instantiations might be harmless.

- - - -

Proposed resolution:

-

Append to 17.4.3.1 [reserved.names] paragraph 1:

-

- A program may explicitly instantiate any templates in the standard - library only if the declaration depends on the name of a user-defined - type of external linkage and the instantiation meets the standard library - requirements for the original template. -

- -

[Kona: changed the wording from "a user-defined name" to "the name of - a user-defined type"]

- - - - -

Rationale:

-

The LWG considered another possible resolution:

-
-

In light of the resolution to core issue 259, no normative changes - in the library clauses are necessary. Add the following non-normative - note to the end of 17.4.3.1 [reserved.names] paragraph 1:

-

- [Note: A program may explicitly instantiate standard library - templates, even when an explicit instantiation does not depend on - a user-defined name. --end note] -

-
- -

The LWG rejected this because it was believed that it would make - it unnecessarily difficult for library implementors to write - high-quality implementations. A program may not include an - explicit instantiation of the same template, for the same template - arguments, in two different translation units. If users are - allowed to provide explicit instantiations of Standard Library - templates for built-in types, then library implementors aren't, - at least not without nonportable tricks.

- -

The most serious problem is a class template that has writeable - static member variables. Unfortunately, such class templates are - important and, in existing Standard Library implementations, are - often explicitly specialized by library implementors: locale facets, - which have a writeable static member variable id. If a - user's explicit instantiation collided with the implementations - explicit instantiation, iostream initialization could cause locales - to be constructed in an inconsistent state.

- -

One proposed implementation technique was for Standard Library - implementors to provide explicit instantiations in separate object - files, so that they would not be picked up by the linker when the - user also provides an explicit instantiation. However, this - technique only applies for Standard Library implementations that - are packaged as static archives. Most Standard Library - implementations nowadays are packaged as dynamic libraries, so this - technique would not apply.

- -

The Committee is now considering standardization of dynamic - linking. If there are such changes in the future, it may be - appropriate to revisit this issue later.

- - - - - -
-

122. streambuf/wstreambuf description should not say they are specializations

-

Section: 27.5.2 [streambuf] Status: TC - Submitter: Judy Ward Date: 1998-12-15

-

View all other issues in [streambuf].

-

View all issues with TC status.

-

Discussion:

-

Section 27.5.2 describes the streambuf classes this way:

- -
- -

The class streambuf is a specialization of the template class basic_streambuf -specialized for the type char.

- -

The class wstreambuf is a specialization of the template class basic_streambuf -specialized for the type wchar_t.

- -
- -

This implies that these classes must be template specializations, not typedefs.

- -

It doesn't seem this was intended, since Section 27.5 has them declared as typedefs.

- - -

Proposed resolution:

-

Remove 27.5.2 [streambuf] paragraphs 2 and 3 (the above two -sentences).

- - -

Rationale:

-

The streambuf synopsis already has a declaration for the -typedefs and that is sufficient.

- - - - - -
-

123. Should valarray helper arrays fill functions be const?

-

Section: 26.5.5.3 [slice.arr.fill], 26.5.7.3 [gslice.array.fill], 26.5.8.3 [mask.array.fill], 26.5.9.3 [indirect.array.fill] Status: WP - Submitter: Judy Ward Date: 1998-12-15

-

View all issues with WP status.

-

Discussion:

-

One of the operator= in the valarray helper arrays is const and one -is not. For example, look at slice_array. This operator= in Section -26.5.5.1 [slice.arr.assign] is const:

- -

    void operator=(const valarray<T>&) const;

- -

but this one in Section 26.5.5.3 [slice.arr.fill] is not:

- -

    void operator=(const T&);

- -

The description of the semantics for these two functions is similar.

- - -

Proposed resolution:

- -

26.5.5 [template.slice.array] Template class slice_array

-
- -

In the class template definition for slice_array, replace the member - function declaration

-
      void operator=(const T&);
-    
-

with

-
      void operator=(const T&) const;
-    
-
- -

26.5.5.3 [slice.arr.fill] slice_array fill function

-
- -

Change the function declaration

-
      void operator=(const T&);
-    
-

to

-
      void operator=(const T&) const;
-    
-
- -

26.5.7 [template.gslice.array] Template class gslice_array

-
- -

In the class template definition for gslice_array, replace the member - function declaration

-
      void operator=(const T&);
-    
-

with

-
      void operator=(const T&) const;
-    
-
- -

26.5.7.3 [gslice.array.fill] gslice_array fill function

-
- -

Change the function declaration

-
      void operator=(const T&);
-    
-

to

-
      void operator=(const T&) const;
-    
-
- -

26.5.8 [template.mask.array] Template class mask_array

-
- -

In the class template definition for mask_array, replace the member - function declaration

-
      void operator=(const T&);
-    
-

with

-
      void operator=(const T&) const;
-    
-
- -

26.5.8.3 [mask.array.fill] mask_array fill function

-
- -

Change the function declaration

-
      void operator=(const T&);
-    
-

to

-
      void operator=(const T&) const;
-    
-
- -

26.5.9 [template.indirect.array] Template class indirect_array

-
- -

In the class template definition for indirect_array, replace the member - function declaration

-
      void operator=(const T&);
-    
-

with

-
      void operator=(const T&) const;
-    
-
- -

26.5.9.3 [indirect.array.fill] indirect_array fill function

-
- -

Change the function declaration

-
      void operator=(const T&);
-    
-

to

-
      void operator=(const T&) const;
-    
-
- - -

[Redmond: Robert provided wording.]

- - - - -

Rationale:

-

There's no good reason for one version of operator= being const and -another one not. Because of issue 253, this now -matters: these functions are now callable in more circumstances. In -many existing implementations, both versions are already const.

- - - - - -
-

124. ctype_byname<charT>::do_scan_is & do_scan_not return type should be const charT*

-

Section: 22.2.1.2 [locale.ctype.byname] Status: TC - Submitter: Judy Ward Date: 1998-12-15

-

View all other issues in [locale.ctype.byname].

-

View all issues with TC status.

-

Discussion:

-

In Section 22.2.1.2 [locale.ctype.byname] -ctype_byname<charT>::do_scan_is() and do_scan_not() are declared -to return a const char* not a const charT*.

- - -

Proposed resolution:

-

Change Section 22.2.1.2 [locale.ctype.byname] do_scan_is() and -do_scan_not() to return a const -charT*.

- - - - - -
-

125. valarray<T>::operator!() return type is inconsistent

-

Section: 26.5.2 [template.valarray] Status: TC - Submitter: Judy Ward Date: 1998-12-15

-

View all other issues in [template.valarray].

-

View all issues with TC status.

-

Discussion:

-

In Section 26.5.2 [template.valarray] valarray<T>::operator!() -is -declared to return a valarray<T>, but in Section 26.5.2.5 -[valarray.unary] it is declared to return a valarray<bool>. The -latter appears to be correct.

- - -

Proposed resolution:

-

Change in Section 26.5.2 [template.valarray] the declaration of -operator!() so that the return type is -valarray<bool>.

- - - - -
-

126. typos in Effects clause of ctype::do_narrow()

-

Section: 22.2.1.1.2 [locale.ctype.virtuals] Status: TC - Submitter: Judy Ward Date: 1998-12-15

-

View all other issues in [locale.ctype.virtuals].

-

View all issues with TC status.

-

Discussion:

Typos in 22.2.1.1.2 need to be fixed.

- -

Proposed resolution:

-

In Section 22.2.1.1.2 [locale.ctype.virtuals] change:

- -
   do_widen(do_narrow(c),0) == c
- -

to:

- -
   do_widen(do_narrow(c,0)) == c
- -

and change:

- -
   (is(M,c) || !ctc.is(M, do_narrow(c),dfault) )
- -

to:

- -
   (is(M,c) || !ctc.is(M, do_narrow(c,dfault)) )
- - - - - -
-

127. auto_ptr<> conversion issues

-

Section: D.9.1 [auto.ptr] Status: TC - Submitter: Greg Colvin Date: 1999-02-17

-

View all other issues in [auto.ptr].

-

View all issues with TC status.

-

Discussion:

-

There are two problems with the current auto_ptr wording -in the standard:

- -

First, the auto_ptr_ref definition cannot be nested -because auto_ptr<Derived>::auto_ptr_ref is unrelated to -auto_ptr<Base>::auto_ptr_ref. Also submitted by -Nathan Myers, with the same proposed resolution.

- -

Second, there is no auto_ptr assignment operator taking an -auto_ptr_ref argument.

- -

I have discussed these problems with my proposal coauthor, Bill -Gibbons, and with some compiler and library implementors, and we -believe that these problems are not desired or desirable implications -of the standard.

- -

25 Aug 1999: The proposed resolution now reflects changes suggested -by Dave Abrahams, with Greg Colvin's concurrence; 1) changed -"assignment operator" to "public assignment -operator", 2) changed effects to specify use of release(), 3) -made the conversion to auto_ptr_ref const.

- -

2 Feb 2000: Lisa Lippincott comments: [The resolution of] this issue -states that the conversion from auto_ptr to auto_ptr_ref should -be const. This is not acceptable, because it would allow -initialization and assignment from _any_ const auto_ptr! It also -introduces an implementation difficulty in writing this conversion -function -- namely, somewhere along the line, a const_cast will be -necessary to remove that const so that release() may be called. This -may result in undefined behavior [7.1.5.1/4]. The conversion -operator does not have to be const, because a non-const implicit -object parameter may be bound to an rvalue [13.3.3.1.4/3] -[13.3.1/5].

- -

Tokyo: The LWG removed the following from the proposed resolution:

- -

In 20.4.4 [meta.unary], paragraph 2, and 20.4.4.3 [meta.unary.prop], - paragraph 2, make the conversion to auto_ptr_ref const:

-
-
template<class Y> operator auto_ptr_ref<Y>() const throw();
-
- - -

Proposed resolution:

-

In 20.4.4 [meta.unary], paragraph 2, move -the auto_ptr_ref definition to namespace scope.

- -

In 20.4.4 [meta.unary], paragraph 2, add -a public assignment operator to the auto_ptr definition:

- -
-
auto_ptr& operator=(auto_ptr_ref<X> r) throw();
-
- -

Also add the assignment operator to 20.4.4.3 [meta.unary.prop]:

- -
-
auto_ptr& operator=(auto_ptr_ref<X> r) throw()
- -

Effects: Calls reset(p.release()) for the auto_ptr - p that r holds a reference to.
- Returns: *this.

- -
- - - - - -
-

129. Need error indication from seekp() and seekg()

-

Section: 27.6.1.3 [istream.unformatted], 27.6.2.5 [ostream.seeks] Status: TC - Submitter: Angelika Langer Date: 1999-02-22

-

View all other issues in [istream.unformatted].

-

View all issues with TC status.

-

Discussion:

-

Currently, the standard does not specify how seekg() and seekp() -indicate failure. They are not required to set failbit, and they can't -return an error indication because they must return *this, i.e. the -stream. Hence, it is undefined what happens if they fail. And they -can fail, for instance, when a file stream is disconnected from the -underlying file (is_open()==false) or when a wide character file -stream must perform a state-dependent code conversion, etc.

- -

The stream functions seekg() and seekp() should set failbit in the -stream state in case of failure.

- - -

Proposed resolution:

-

Add to the Effects: clause of  seekg() in -27.6.1.3 [istream.unformatted] and to the Effects: clause of seekp() in -27.6.2.5 [ostream.seeks]:

- -
-

In case of failure, the function calls setstate(failbit) (which may throw ios_base::failure). -

-
- - -

Rationale:

-

Setting failbit is the usual error reporting mechanism for streams

- - - - -
-

130. Return type of container::erase(iterator) differs for associative containers

-

Section: 23.1.2 [associative.reqmts], 23.1.1 [sequence.reqmts] Status: DR - Submitter: Andrew Koenig Date: 1999-03-02

-

View all other issues in [associative.reqmts].

-

View all issues with DR status.

-

Duplicate of: 451

-

Discussion:

-

Table 67 (23.1.1) says that container::erase(iterator) returns an -iterator. Table 69 (23.1.2) says that in addition to this requirement, -associative containers also say that container::erase(iterator) -returns void. That's not an addition; it's a change to the -requirements, which has the effect of making associative containers -fail to meet the requirements for containers.

- - -

Proposed resolution:

- -

-In 23.1.2 [associative.reqmts], in Table 69 Associative container -requirements, change the return type of a.erase(q) from -void to iterator. Change the -assertion/not/pre/post-condition from "erases the element pointed to -by q" to "erases the element pointed to by q. -Returns an iterator pointing to the element immediately following q -prior to the element being erased. If no such element exists, a.end() -is returned." -

- -

-In 23.1.2 [associative.reqmts], in Table 69 Associative container -requirements, change the return type of a.erase(q1, q2) -from void to iterator. Change the -assertion/not/pre/post-condition from "erases the elements in the -range [q1, q2)" to "erases the elements in the range [q1, -q2). Returns q2." -

- -

-In 23.3.1 [map], in the map class synopsis; and -in 23.3.2 [multimap], in the multimap class synopsis; and -in 23.3.3 [set], in the set class synopsis; and -in 23.3.4 [multiset], in the multiset class synopsis: -change the signature of the first erase overload to -

-
   iterator erase(iterator position);
-
-

and change the signature of the third erase overload to

-
  iterator erase(iterator first, iterator last); 
-
- - -

[Pre-Kona: reopened at the request of Howard Hinnant]

- - -

[Post-Kona: the LWG agrees the return type should be -iterator, not void. (Alex Stepanov agrees too.) -Matt provided wording.]

- - -

[ - Sydney: the proposed wording went in the right direction, but it - wasn't good enough. We want to return an iterator from the range form - of erase as well as the single-iterator form. Also, the wording is - slightly different from the wording we have for sequences; there's no - good reason for having a difference. Matt provided new wording, -(reflected above) which we will review at the next meeting. -]

- - -

[ -Redmond: formally voted into WP. -]

- - - - - - - -
-

132. list::resize description uses random access iterators

-

Section: 23.2.3.2 [list.capacity] Status: TC - Submitter: Howard Hinnant Date: 1999-03-06

-

View all issues with TC status.

-

Discussion:

-

The description reads:

- -

-1- Effects:

- -
         if (sz > size())
-           insert(end(), sz-size(), c);
-         else if (sz < size())
-           erase(begin()+sz, end());
-         else
-           ;                           //  do nothing
- -

Obviously list::resize should not be specified in terms of random access iterators.

- - -

Proposed resolution:

-

Change 23.2.3.2 [list.capacity] paragraph 1 to:

- -

Effects:

- -
         if (sz > size())
-           insert(end(), sz-size(), c);
-         else if (sz < size())
-         {
-           iterator i = begin();
-           advance(i, sz);
-           erase(i, end());
-         }
- -

[Dublin: The LWG asked Howard to discuss exception safety offline -with David Abrahams. They had a discussion and believe there is -no issue of exception safety with the proposed resolution.]

- - - - - - -
-

133. map missing get_allocator()

-

Section: 23.3.1 [map] Status: TC - Submitter: Howard Hinnant Date: 1999-03-06

-

View all other issues in [map].

-

View all issues with TC status.

-

Discussion:

The title says it all.

- -

Proposed resolution:

-

Insert in 23.3.1 [map], paragraph 2, -after operator= in the map declaration:

- -
    allocator_type get_allocator() const;
- - - - -
-

134. vector constructors over specified

-

Section: 23.2.5.1 [vector.cons] Status: TC - Submitter: Howard Hinnant Date: 1999-03-06

-

View all issues with TC status.

-

Discussion:

-

The complexity description says: "It does at most 2N calls to the copy constructor -of T and logN reallocations if they are just input iterators ...".

- -

This appears to be overly restrictive, dictating the precise memory/performance -tradeoff for the implementor.

- - -

Proposed resolution:

-

Change 23.2.5.1 [vector.cons], paragraph 1 to:

- -

-1- Complexity: The constructor template <class -InputIterator> vector(InputIterator first, InputIterator last) -makes only N calls to the copy constructor of T (where N is the -distance between first and last) and no reallocations if iterators -first and last are of forward, bidirectional, or random access -categories. It makes order N calls to the copy constructor of T and -order logN reallocations if they are just input iterators. -

- - -

Rationale:

-

"at most 2N calls" is correct only if the growth factor -is greater than or equal to 2. -

- - - - -
-

136. seekp, seekg setting wrong streams?

-

Section: 27.6.1.3 [istream.unformatted] Status: WP - Submitter: Howard Hinnant Date: 1999-03-06

-

View all other issues in [istream.unformatted].

-

View all issues with WP status.

-

Discussion:

-

I may be misunderstanding the intent, but should not seekg set only -the input stream and seekp set only the output stream? The description -seems to say that each should set both input and output streams. If -that's really the intent, I withdraw this proposal.

- - -

Proposed resolution:

-

In section 27.6.1.3 change:

- -
basic_istream<charT,traits>& seekg(pos_type pos);
-Effects: If fail() != true, executes rdbuf()->pubseekpos(pos). 
- -

To:

- -
basic_istream<charT,traits>& seekg(pos_type pos);
-Effects: If fail() != true, executes rdbuf()->pubseekpos(pos, ios_base::in). 
- -

In section 27.6.1.3 change:

- -
basic_istream<charT,traits>& seekg(off_type& off, ios_base::seekdir dir);
-Effects: If fail() != true, executes rdbuf()->pubseekoff(off, dir). 
- -

To:

- -
basic_istream<charT,traits>& seekg(off_type& off, ios_base::seekdir dir);
-Effects: If fail() != true, executes rdbuf()->pubseekoff(off, dir, ios_base::in). 
- -

In section 27.6.2.4, paragraph 2 change:

- -
-2- Effects: If fail() != true, executes rdbuf()->pubseekpos(pos). 
- -

To:

- -
-2- Effects: If fail() != true, executes rdbuf()->pubseekpos(pos, ios_base::out). 
- -

In section 27.6.2.4, paragraph 4 change:

- -
-4- Effects: If fail() != true, executes rdbuf()->pubseekoff(off, dir). 
- -

To:

- -
-4- Effects: If fail() != true, executes rdbuf()->pubseekoff(off, dir, ios_base::out). 
- -

[Dublin: Dietmar Kühl thinks this is probably correct, but would -like the opinion of more iostream experts before taking action.]

- - -

[Tokyo: Reviewed by the LWG. PJP noted that although his docs are -incorrect, his implementation already implements the Proposed -Resolution.]

- - -

[Post-Tokyo: Matt Austern comments:
-Is it a problem with basic_istream and basic_ostream, or is it a problem -with basic_stringbuf? -We could resolve the issue either by changing basic_istream and -basic_ostream, or by changing basic_stringbuf. I prefer the latter -change (or maybe both changes): I don't see any reason for the standard to -require that std::stringbuf s(std::string("foo"), std::ios_base::in); -s.pubseekoff(0, std::ios_base::beg); must fail.
-This requirement is a bit weird. There's no similar requirement -for basic_streambuf<>::seekpos, or for basic_filebuf<>::seekoff or -basic_filebuf<>::seekpos.]

- - - - - - -
-

137. Do use_facet and has_facet look in the global locale?

-

Section: 22.1.1 [locale] Status: TC - Submitter: Angelika Langer Date: 1999-03-17

-

View all other issues in [locale].

-

View all issues with TC status.

-

Discussion:

-

Section 22.1.1 [locale] says:

- -

-4- In the call to use_facet<Facet>(loc), the type argument -chooses a facet, making available all members of the named type. If -Facet is not present in a locale (or, failing that, in the global -locale), it throws the standard exception bad_cast. A C++ program can -check if a locale implements a particular facet with the template -function has_facet<Facet>().

- -

This contradicts the specification given in section -22.1.2 [locale.global.templates]: -

-template <class  Facet> const  Facet& use_facet(const -locale&  loc);
-
--1- Get a reference to a facet of a locale.
--2- Returns: a reference to the corresponding facet of loc, if present.
--3- Throws: bad_cast if has_facet<Facet>(loc) is false.
--4- Notes: The reference returned remains valid at least as long as any copy of loc exists -

- - -

Proposed resolution:

-

Remove the phrase "(or, failing that, in the global locale)" -from section 22.1.1.

- - -

Rationale:

-

Needed for consistency with the way locales are handled elsewhere -in the standard.

- - - - -
-

139. Optional sequence operation table description unclear

-

Section: 23.1.1 [sequence.reqmts] Status: TC - Submitter: Andrew Koenig Date: 1999-03-30

-

View all other issues in [sequence.reqmts].

-

View all issues with TC status.

-

Discussion:

-

The sentence introducing the Optional sequence operation table -(23.1.1 paragraph 12) has two problems:

- -

A. It says ``The operations in table 68 are provided only for the containers for which -they take constant time.''
-
-That could be interpreted in two ways, one of them being ``Even though table 68 shows -particular operations as being provided, implementations are free to omit them if they -cannot implement them in constant time.''
-
-B. That paragraph says nothing about amortized constant time, and it should. 

- - -

Proposed resolution:

-

Replace the wording in 23.1.1 paragraph 12  which begins ``The operations in table 68 are provided only..." -with:

- -
-

Table 68 lists sequence operations that are provided for some types of sequential - containers but not others. An implementation shall provide these operations for all - container types shown in the ``container'' column, and shall implement them so as to take - amortized constant time.

-
- - - - -
-

141. basic_string::find_last_of, find_last_not_of say pos instead of xpos

-

Section: 21.3.6.4 [string::insert], 21.3.6.6 [string::replace] Status: TC - Submitter: Arch Robison Date: 1999-04-28

-

View all other issues in [string::insert].

-

View all issues with TC status.

-

Discussion:

-

Sections 21.3.6.4 paragraph 1 and 21.3.6.6 paragraph 1 surely have misprints where they -say:
-
-— xpos <= pos and pos < size();

- -

Surely the document meant to say ``xpos < size()'' in both places.

- -

[Judy Ward also sent in this issue for 21.3.6.4 with the same -proposed resolution.]

- - - -

Proposed resolution:

-

Change Sections 21.3.6.4 paragraph 1 and 21.3.6.6 paragraph 1, the line which says:
-
-— xpos <= pos and pos < size();
-
-
to:
-
-
xpos <= pos and xpos < size();

- - - - -
-

142. lexicographical_compare complexity wrong

-

Section: 25.3.8 [alg.lex.comparison] Status: TC - Submitter: Howard Hinnant Date: 1999-06-20

-

View all issues with TC status.

-

Discussion:

-

The lexicographical_compare complexity is specified as:
-
-     "At most min((last1 - first1), (last2 - first2)) -applications of the corresponding comparison."
-
-The best I can do is twice that expensive.

- -

Nicolai Josuttis comments in lib-6862: You mean, to check for -equality you have to check both < and >? Yes, IMO you are -right! (and Matt states this complexity in his book)

- - - -

Proposed resolution:

-

Change 25.3.8 [alg.lex.comparison] complexity to:

-

- At most 2*min((last1 - first1), (last2 - first2)) - applications of the corresponding comparison. -

- -

Change the example at the end of paragraph 3 to read:

-

- [Example:
-
-     for ( ; first1 != last1 && first2 != last2 ; - ++first1, ++first2) {
-       if (*first1 < *first2) return true;
-       if (*first2 < *first1) return false;
-     }
-     return first1 == last1 && first2 != last2;
-    
- --end example] -

- - - - -
-

144. Deque constructor complexity wrong

-

Section: 23.2.2.1 [deque.cons] Status: TC - Submitter: Herb Sutter Date: 1999-05-09

-

View all other issues in [deque.cons].

-

View all issues with TC status.

-

Discussion:

-

In 23.2.2.1 [deque.cons] paragraph 6, the deque ctor that takes an iterator range appears -to have complexity requirements which are incorrect, and which contradict the -complexity requirements for insert(). I suspect that the text in question, -below, was taken from vector:

-
-

Complexity: If the iterators first and last are forward iterators, - bidirectional iterators, or random access iterators the constructor makes only - N calls to the copy constructor, and performs no reallocations, where N is - last - first.

-
-

The word "reallocations" does not really apply to deque. Further, -all of the following appears to be spurious:

-
-

It makes at most 2N calls to the copy constructor of T and log N - reallocations if they are input iterators.1)

-

1) The complexity is greater in the case of input iterators because each - element must be added individually: it is impossible to determine the distance - between first abd last before doing the copying.

-
-

This makes perfect sense for vector, but not for deque. Why should deque gain -an efficiency advantage from knowing in advance the number of elements to -insert?

- - -

Proposed resolution:

-

In 23.2.2.1 [deque.cons] paragraph 6, replace the Complexity description, including the -footnote, with the following text (which also corrects the "abd" -typo):

-
-

Complexity: Makes last - first calls to the copy constructor of T.

-
- - - - -
-

146. complex<T> Inserter and Extractor need sentries

-

Section: 26.3.6 [complex.ops] Status: TC - Submitter: Angelika Langer Date: 1999-05-12

-

View all other issues in [complex.ops].

-

View all issues with TC status.

-

Discussion:

-

The extractor for complex numbers is specified as: 

- -
- -

template<class T, class charT, class traits> 
- basic_istream<charT, traits>& 
- operator>>(basic_istream<charT, traits>& is, complex<T>& x);

-Effects: Extracts a complex number x of the form: u, (u), or (u,v), -where u is the real part and v is the imaginary part -(lib.istream.formatted). 
-Requires: The input values be convertible to T. If bad input is -encountered, calls is.setstate(ios::failbit) (which may throw -ios::failure (lib.iostate.flags). 
-Returns: is .

- -
-

Is it intended that the extractor for complex numbers does not skip -whitespace, unlike all other extractors in the standard library do? -Shouldn't a sentry be used? 
-
-The inserter for complex numbers is specified as:

- -
- -

template<class T, class charT, class traits> 
- basic_ostream<charT, traits>& 
- operator<<(basic_ostream<charT, traits>& o, const complex<T>& x);
-
-Effects: inserts the complex number x onto the stream o as if it were implemented as follows:
-
- template<class T, class charT, class traits> 
- basic_ostream<charT, traits>& 
- operator<<(basic_ostream<charT, traits>& o, const complex<T>& x) 
- { 
- basic_ostringstream<charT, traits> s; 
- s.flags(o.flags()); 
- s.imbue(o.getloc()); 
- s.precision(o.precision()); 
- s << '(' << x.real() << "," << x.imag() << ')'; 
- return o << s.str(); 
- }

- -
- -

Is it intended that the inserter for complex numbers ignores the -field width and does not do any padding? If, with the suggested -implementation above, the field width were set in the stream then the -opening parentheses would be adjusted, but the rest not, because the -field width is reset to zero after each insertion.

- -

I think that both operations should use sentries, for sake of -consistency with the other inserters and extractors in the -library. Regarding the issue of padding in the inserter, I don't know -what the intent was. 

- - -

Proposed resolution:

-

After 26.3.6 [complex.ops] paragraph 14 (operator>>), add a -Notes clause:

- -
- -

Notes: This extraction is performed as a series of simpler -extractions. Therefore, the skipping of whitespace is specified to be the -same for each of the simpler extractions.

- -
- - -

Rationale:

-

For extractors, the note is added to make it clear that skipping whitespace -follows an "all-or-none" rule.

- -

For inserters, the LWG believes there is no defect; the standard is correct -as written.

- - - - -
-

147. Library Intro refers to global functions that aren't global

-

Section: 17.4.4.3 [global.functions] Status: TC - Submitter: Lois Goldthwaite Date: 1999-06-04

-

View all other issues in [global.functions].

-

View all issues with TC status.

-

Discussion:

-

The library had many global functions until 17.4.1.1 [lib.contents] -paragraph 2 was added:

- -
- -

All library entities except macros, operator new and operator -delete are defined within the namespace std or namespaces nested -within namespace std.

- -
- -

It appears "global function" was never updated in the following:

- -
- -

17.4.4.3 - Global functions [lib.global.functions]
-
--1- It is unspecified whether any global functions in the C++ Standard -Library are defined as inline (dcl.fct.spec).
-
--2- A call to a global function signature described in Clauses -lib.language.support through lib.input.output behaves the same as if -the implementation declares no additional global function -signatures.*
-
- [Footnote: A valid C++ program always calls the expected library - global function. An implementation may also define additional - global functions that would otherwise not be called by a valid C++ - program. --- end footnote]
-
--3- A global function cannot be declared by the implementation as -taking additional default arguments. 
-
-17.4.4.4 - Member functions [lib.member.functions]
-
--2- An implementation can declare additional non-virtual member -function signatures within a class:

- -
- -

-- by adding arguments with default values to a member function -signature; The same latitude does not extend to the implementation of -virtual or global functions, however.

- -
-
- - -

Proposed resolution:

-

Change "global" to "global or non-member" in:

-
-

17.4.4.3 [lib.global.functions] section title,
- 17.4.4.3 [lib.global.functions] para 1,
- 17.4.4.3 [lib.global.functions] para 2 in 2 places plus 2 - places in the footnote,
- 17.4.4.3 [lib.global.functions] para 3,
- 17.4.4.4 [lib.member.functions] para 2

-
- - -

Rationale:

-

-Because operator new and delete are global, the proposed resolution -was changed from "non-member" to "global or non-member. -

- - - - -
-

148. Functions in the example facet BoolNames should be const

-

Section: 22.2.8 [facets.examples] Status: TC - Submitter: Jeremy Siek Date: 1999-06-03

-

View all other issues in [facets.examples].

-

View all issues with TC status.

-

Discussion:

-

In 22.2.8 [facets.examples] paragraph 13, the do_truename() and -do_falsename() functions in the example facet BoolNames should be -const. The functions they are overriding in -numpunct_byname<char> are const.

- - -

Proposed resolution:

-

In 22.2.8 [facets.examples] paragraph 13, insert "const" in -two places:

-
-

string do_truename() const { return "Oui Oui!"; }
- string do_falsename() const { return "Mais Non!"; }

-
- - - - -
-

150. Find_first_of says integer instead of iterator

-

Section: 25.1.4 [alg.find.first.of] Status: TC - Submitter: Matt McClure Date: 1999-06-30

-

View all other issues in [alg.find.first.of].

-

View all issues with TC status.

-

Discussion:

- - -

Proposed resolution:

-

Change 25.1.4 [alg.find.first.of] paragraph 2 from:

- -
-

Returns: The first iterator i in the range [first1, last1) such -that for some integer j in the range [first2, last2) ...

-
- -

to:

- -
-

Returns: The first iterator i in the range [first1, last1) such -that for some iterator j in the range [first2, last2) ...

-
- - - - -
-

151. Can't currently clear() empty container

-

Section: 23.1.1 [sequence.reqmts] Status: TC - Submitter: Ed Brey Date: 1999-06-21

-

View all other issues in [sequence.reqmts].

-

View all issues with TC status.

-

Discussion:

-

For both sequences and associative containers, a.clear() has the -semantics of erase(a.begin(),a.end()), which is undefined for an empty -container since erase(q1,q2) requires that q1 be dereferenceable -(23.1.1,3 and 23.1.2,7). When the container is empty, a.begin() is -not dereferenceable.
-
-The requirement that q1 be unconditionally dereferenceable causes many -operations to be intuitively undefined, of which clearing an empty -container is probably the most dire.
-
-Since q1 and q2 are only referenced in the range [q1, q2), and [q1, -q2) is required to be a valid range, stating that q1 and q2 must be -iterators or certain kinds of iterators is unnecessary. -

- - -

Proposed resolution:

-

In 23.1.1, paragraph 3, change:

-
-

p and q2 denote valid iterators to a, q and q1 denote valid dereferenceable iterators to a, [q1, q2) denotes a valid range

-
-

to:

-
-

p denotes a valid iterator to a, q denotes a valid dereferenceable iterator to a, [q1, q2) denotes a valid range - in a

-
-

In 23.1.2, paragraph 7, change:

-
-

p and q2 are valid iterators to a, q and q1 are valid dereferenceable - iterators to a, [q1, q2) is a valid range

-
-

to

-
-

p is a valid iterator to a, q is a valid dereferenceable iterator to a, [q1, q2) is a valid range - into a

-
- - - - -
-

152. Typo in scan_is() semantics

-

Section: 22.2.1.1.2 [locale.ctype.virtuals] Status: TC - Submitter: Dietmar Kühl Date: 1999-07-20

-

View all other issues in [locale.ctype.virtuals].

-

View all issues with TC status.

-

Discussion:

-

The semantics of scan_is() (paragraphs 4 and 6) is not exactly described -because there is no function is() which only takes a character as -argument. Also, in the effects clause (paragraph 3), the semantic is also kept -vague.

- - -

Proposed resolution:

-

In 22.2.1.1.2 [locale.ctype.virtuals] paragraphs 4 and 6, change the returns -clause from:

-
-

"... such that is(*p) -would..."

-
-

to:  "... such that is(m, *p) - would...."

- - - - - -
-

153. Typo in narrow() semantics

-

Section: 22.2.1.3.2 [facet.ctype.char.members] Status: WP - Submitter: Dietmar Kühl Date: 1999-07-20

-

View all other issues in [facet.ctype.char.members].

-

View all issues with WP status.

-

Duplicate of: 207

-

Discussion:

-

The description of the array version of narrow() (in -paragraph 11) is flawed: There is no member do_narrow() which -takes only three arguments because in addition to the range a default -character is needed.

- -

Additionally, for both widen and narrow we have -two signatures followed by a Returns clause that only addresses -one of them.

- - - -

Proposed resolution:

-

Change the returns clause in 22.2.1.3.2 [facet.ctype.char.members] -paragraph 10 from:

-

    Returns: do_widen(low, high, to).

- -

to:

-

    Returns: do_widen(c) or do_widen(low, high, to), -respectively.

- -

Change 22.2.1.3.2 [facet.ctype.char.members] paragraph 10 and 11 from:

-
        char        narrow(char c, char /*dfault*/) const;
-        const char* narrow(const char* low, const char* high,
-                           char /*dfault*/, char* to) const;
-
        Returns: do_narrow(low, high, to).
-

to:

-
        char        narrow(char c, char dfault) const;
-        const char* narrow(const char* low, const char* high,
-                           char dfault, char* to) const;
-
        Returns: do_narrow(c, dfault) or
-                 do_narrow(low, high, dfault, to), respectively.
- -

[Kona: 1) the problem occurs in additional places, 2) a user -defined version could be different.]

- - -

[Post-Tokyo: Dietmar provided the above wording at the request of -the LWG. He could find no other places the problem occurred. He -asks for clarification of the Kona "a user defined -version..." comment above. Perhaps it was a circuitous way of -saying "dfault" needed to be uncommented?]

- - -

[Post-Toronto: the issues list maintainer has merged in the -proposed resolution from issue 207, which addresses the -same paragraphs.]

- - - - - - -
-

154. Missing double specifier for do_get()

-

Section: 22.2.2.1.2 [facet.num.get.virtuals] Status: TC - Submitter: Dietmar Kühl Date: 1999-07-20

-

View other active issues in [facet.num.get.virtuals].

-

View all other issues in [facet.num.get.virtuals].

-

View all issues with TC status.

-

Discussion:

-

The table in paragraph 7 for the length modifier does not list the length -modifier l to be applied if the type is double. Thus, the -standard asks the implementation to do undefined things when using scanf() -(the missing length modifier for scanf() when scanning doubles -is actually a problem I found quite often in production code, too).

- - -

Proposed resolution:

-

In 22.2.2.1.2 [facet.num.get.virtuals], paragraph 7, add a row in the Length -Modifier table to say that for double a length modifier -l is to be used.

- - -

Rationale:

-

The standard makes an embarrassing beginner's mistake.

- - - - -
-

155. Typo in naming the class defining the class Init

-

Section: 27.3 [iostream.objects] Status: TC - Submitter: Dietmar Kühl Date: 1999-07-20

-

View all other issues in [iostream.objects].

-

View all issues with TC status.

-

Discussion:

-

There are conflicting statements about where the class -Init is defined. According to 27.3 [iostream.objects] paragraph 2 -it is defined as basic_ios::Init, according to 27.4.2 [ios.base] it is defined as ios_base::Init.

- - -

Proposed resolution:

-

Change 27.3 [iostream.objects] paragraph 2 from -"basic_ios::Init" to -"ios_base::Init".

- - -

Rationale:

-

Although not strictly wrong, the standard was misleading enough to warrant -the change.

- - - - -
-

156. Typo in imbue() description

-

Section: 27.4.2.3 [ios.base.locales] Status: TC - Submitter: Dietmar Kühl Date: 1999-07-20

-

View all other issues in [ios.base.locales].

-

View all issues with TC status.

-

Discussion:

-

There is a small discrepancy between the declarations of -imbue(): in 27.4.2 [ios.base] the argument is passed as -locale const& (correct), in 27.4.2.3 [ios.base.locales] it -is passed as locale const (wrong).

- - -

Proposed resolution:

-

In 27.4.2.3 [ios.base.locales] change the imbue argument -from "locale const" to "locale -const&".

- - - - -
-

158. Underspecified semantics for setbuf()

-

Section: 27.5.2.4.2 [streambuf.virt.buffer] Status: TC - Submitter: Dietmar Kühl Date: 1999-07-20

-

View all other issues in [streambuf.virt.buffer].

-

View all issues with TC status.

-

Discussion:

-

The default behavior of setbuf() is described only for the -situation that gptr() != 0 && gptr() != egptr(): -namely to do nothing. What has to be done in other situations  -is not described although there is actually only one reasonable -approach, namely to do nothing, too.

- -

Since changing the buffer would almost certainly mess up most -buffer management of derived classes unless these classes do it -themselves, the default behavior of setbuf() should always be -to do nothing.

- - -

Proposed resolution:

-

Change 27.5.2.4.2 [streambuf.virt.buffer], paragraph 3, Default behavior, -to: "Default behavior: Does nothing. Returns this."

- - - - -
-

159. Strange use of underflow()

-

Section: 27.5.2.4.3 [streambuf.virt.get] Status: TC - Submitter: Dietmar Kühl Date: 1999-07-20

-

View all issues with TC status.

-

Discussion:

-

The description of the meaning of the result of -showmanyc() seems to be rather strange: It uses calls to -underflow(). Using underflow() is strange because -this function only reads the current character but does not extract -it, uflow() would extract the current character. This should -be fixed to use sbumpc() instead.

- - -

Proposed resolution:

-

Change 27.5.2.4.3 [streambuf.virt.get] paragraph 1, -showmanyc()returns clause, by replacing the word -"supplied" with the words "extracted from the -stream".

- - - - -
-

160. Typo: Use of non-existing function exception()

-

Section: 27.6.1.1 [istream] Status: TC - Submitter: Dietmar Kühl Date: 1999-07-20

-

View all other issues in [istream].

-

View all issues with TC status.

-

Discussion:

-

The paragraph 4 refers to the function exception() which -is not defined. Probably, the referred function is -basic_ios<>::exceptions().

- - -

Proposed resolution:

-

In 27.6.1.1 [istream], 27.6.1.3 [istream.unformatted], paragraph 1, -27.6.2.1 [ostream], paragraph 3, and 27.6.2.6.1 [ostream.formatted.reqmts], -paragraph 1, change "exception()" to -"exceptions()".

- -

[Note to Editor: "exceptions" with an "s" -is the correct spelling.]

- - - - - - -
-

161. Typo: istream_iterator vs. istreambuf_iterator

-

Section: 27.6.1.2.2 [istream.formatted.arithmetic] Status: TC - Submitter: Dietmar Kühl Date: 1999-07-20

-

View other active issues in [istream.formatted.arithmetic].

-

View all other issues in [istream.formatted.arithmetic].

-

View all issues with TC status.

-

Discussion:

-

The note in the second paragraph pretends that the first argument -is an object of type istream_iterator. This is wrong: It is -an object of type istreambuf_iterator.

- - -

Proposed resolution:

-

Change 27.6.1.2.2 [istream.formatted.arithmetic] from:

-
-

The first argument provides an object of the istream_iterator class...

-
-

to

-
-

The first argument provides an object of the istreambuf_iterator class...

-
- - - - - -
-

164. do_put() has apparently unused fill argument

-

Section: 22.2.5.3.2 [locale.time.put.virtuals] Status: TC - Submitter: Angelika Langer Date: 1999-07-23

-

View all issues with TC status.

-

Discussion:

-

In 22.2.5.3.2 [locale.time.put.virtuals] the do_put() function is specified -as taking a fill character as an argument, but the description of the -function does not say whether the character is used at all and, if so, -in which way. The same holds for any format control parameters that -are accessible through the ios_base& argument, such as the -adjustment or the field width. Is strftime() supposed to use the fill -character in any way? In any case, the specification of -time_put.do_put() looks inconsistent to me.

Is the -signature of do_put() wrong, or is the effects clause incomplete?

- - -

Proposed resolution:

-

Add the following note after 22.2.5.3.2 [locale.time.put.virtuals] -paragraph 2:

-
-

[Note: the fill argument may be used in the implementation-defined formats, or by derivations. A space character is a reasonable default - for this argument. --end Note]

-
- - -

Rationale:

-

The LWG felt that while the normative text was correct, -users need some guidance on what to pass for the fill -argument since the standard doesn't say how it's used.

- - - - -
-

165. xsputn(), pubsync() never called by basic_ostream members?

-

Section: 27.6.2.1 [ostream] Status: WP - Submitter: Dietmar Kühl Date: 1999-07-20

-

View all other issues in [ostream].

-

View all issues with WP status.

-

Discussion:

-

Paragraph 2 explicitly states that none of the basic_ostream -functions falling into one of the groups "formatted output functions" -and "unformatted output functions" calls any stream buffer function -which might call a virtual function other than overflow(). Basically -this is fine but this implies that sputn() (this function would call -the virtual function xsputn()) is never called by any of the standard -output functions. Is this really intended? At minimum it would be convenient to -call xsputn() for strings... Also, the statement that overflow() -is the only virtual member of basic_streambuf called is in conflict -with the definition of flush() which calls rdbuf()->pubsync() -and thereby the virtual function sync() (flush() is listed -under "unformatted output functions").

-

In addition, I guess that the sentence starting with "They may use other -public members of basic_ostream ..." probably was intended to -start with "They may use other public members of basic_streamuf..." -although the problem with the virtual members exists in both cases.

-

I see two obvious resolutions:

-
    -
  1. state in a footnote that this means that xsputn() will never be - called by any ostream member and that this is intended.
  2. -
  3. relax the restriction and allow calling overflow() and xsputn(). - Of course, the problem with flush() has to be resolved in some way.
  4. -
- - -

Proposed resolution:

-

Change the last sentence of 27.6.2.1 (lib.ostream) paragraph 2 from:

-
-

They may use other public members of basic_ostream except that they do not - invoke any virtual members of rdbuf() except overflow().

-
-

to:

-
-

They may use other public members of basic_ostream except that they shall - not invoke any virtual members of rdbuf() except overflow(), xsputn(), and - sync().

-
- -

[Kona: the LWG believes this is a problem. Wish to ask Jerry or -PJP why the standard is written this way.]

- - -

[Post-Tokyo: Dietmar supplied wording at the request of the -LWG. He comments: The rules can be made a little bit more specific if -necessary be explicitly spelling out what virtuals are allowed to be -called from what functions and eg to state specifically that flush() -is allowed to call sync() while other functions are not.]

- - - - - - -
-

167. Improper use of traits_type::length()

-

Section: 27.6.2.6.4 [ostream.inserters.character] Status: WP - Submitter: Dietmar Kühl Date: 1999-07-20

-

View all other issues in [ostream.inserters.character].

-

View all issues with WP status.

-

Discussion:

-

Paragraph 4 states that the length is determined using -traits::length(s). Unfortunately, this function is not -defined for example if the character type is wchar_t and the -type of s is char const*. Similar problems exist if -the character type is char and the type of s is -either signed char const* or unsigned char -const*.

- - -

Proposed resolution:

-

Change 27.6.2.6.4 [ostream.inserters.character] paragraph 4 from:

-
-

Effects: Behaves like an formatted inserter (as described in - lib.ostream.formatted.reqmts) of out. After a sentry object is - constructed it inserts characters. The number of characters starting - at s to be inserted is traits::length(s). Padding is determined as - described in lib.facet.num.put.virtuals. The traits::length(s) - characters starting at s are widened using out.widen - (lib.basic.ios.members). The widened characters and any required - padding are inserted into out. Calls width(0).

-
-

to:

-
-

Effects: Behaves like a formatted inserter (as described in - lib.ostream.formatted.reqmts) of out. After a sentry object is - constructed it inserts n characters starting at s, - where n is the number that would be computed as if by:

-
    -
  • traits::length(s) for the overload where the first argument is of - type basic_ostream<charT, traits>& and the second is - of type const charT*, and also for the overload where the first - argument is of type basic_ostream<char, traits>& and - the second is of type const char*.
  • -
  • std::char_traits<char>::length(s) - for the overload where the first argument is of type - basic_ostream<charT, traits>& and the second is of type - const char*.
  • -
  • traits::length(reinterpret_cast<const char*>(s)) - for the other two overloads.
  • -
-

Padding is determined as described in - lib.facet.num.put.virtuals. The n characters starting at - s are widened using out.widen (lib.basic.ios.members). The - widened characters and any required padding are inserted into - out. Calls width(0).

-
- -

[Santa Cruz: Matt supplied new wording]

- - -

[Kona: changed "where n is" to " where n is the - number that would be computed as if by"]

- - - - -

Rationale:

-

We have five separate cases. In two of them we can use the -user-supplied traits class without any fuss. In the other three we -try to use something as close to that user-supplied class as possible. -In two cases we've got a traits class that's appropriate for -char and what we've got is a const signed char* or a const -unsigned char*; that's close enough so we can just use a reinterpret -cast, and continue to use the user-supplied traits class. Finally, -there's one case where we just have to give up: where we've got a -traits class for some arbitrary charT type, and we somehow have to -deal with a const char*. There's nothing better to do but fall back -to char_traits<char>

- - - - - -
-

168. Typo: formatted vs. unformatted

-

Section: 27.6.2.7 [ostream.unformatted] Status: TC - Submitter: Dietmar Kühl Date: 1999-07-20

-

View all other issues in [ostream.unformatted].

-

View all issues with TC status.

-

Discussion:

-

The first paragraph begins with a descriptions what has to be done -in formatted output functions. Probably this is a typo and the -paragraph really want to describe unformatted output functions...

- - -

Proposed resolution:

-

In 27.6.2.7 [ostream.unformatted] paragraph 1, the first and last -sentences, change the word "formatted" to -"unformatted":

-
-

"Each unformatted output function begins ..."
- "... value specified for the unformatted output - function."

-
- - - - -
-

169. Bad efficiency of overflow() mandated

-

Section: 27.7.1.4 [stringbuf.virtuals] Status: TC - Submitter: Dietmar Kühl Date: 1999-07-20

-

View other active issues in [stringbuf.virtuals].

-

View all other issues in [stringbuf.virtuals].

-

View all issues with TC status.

-

Discussion:

-

Paragraph 8, Notes, of this section seems to mandate an extremely -inefficient way of buffer handling for basic_stringbuf, -especially in view of the restriction that basic_ostream -member functions are not allowed to use xsputn() (see 27.6.2.1 [ostream]): For each character to be inserted, a new buffer -is to be created.

-

Of course, the resolution below requires some handling of -simultaneous input and output since it is no longer possible to update -egptr() whenever epptr() is changed. A possible -solution is to handle this in underflow().

- - -

Proposed resolution:

-

In 27.7.1.4 [stringbuf.virtuals] paragraph 8, Notes, insert the words -"at least" as in the following:

-
-

To make a write position available, the function reallocates (or initially - allocates) an array object with a sufficient number of elements to hold the - current array object (if any), plus at least one additional write - position.

-
- - - - -
-

170. Inconsistent definition of traits_type

-

Section: 27.7.4 [stringstream] Status: TC - Submitter: Dietmar Kühl Date: 1999-07-20

-

View all issues with TC status.

-

Discussion:

-

The classes basic_stringstream (27.7.4 [stringstream]), -basic_istringstream (27.7.2 [istringstream]), and -basic_ostringstream (27.7.3 [ostringstream]) are inconsistent -in their definition of the type traits_type: For -istringstream, this type is defined, for the other two it is -not. This should be consistent.

- - -

Proposed resolution:

-

Proposed resolution:

To the declarations of -basic_ostringstream (27.7.3 [ostringstream]) and -basic_stringstream (27.7.4 [stringstream]) add:

-
-
typedef traits traits_type;
-
- - - - -
-

171. Strange seekpos() semantics due to joint position

-

Section: 27.8.1.5 [filebuf.virtuals] Status: WP - Submitter: Dietmar Kühl Date: 1999-07-20

-

View all other issues in [filebuf.virtuals].

-

View all issues with WP status.

-

Discussion:

-

Overridden virtual functions, seekpos()

In 27.8.1.1 [filebuf] paragraph 3, it is stated that a joint input and -output position is maintained by basic_filebuf. Still, the -description of seekpos() seems to talk about different file -positions. In particular, it is unclear (at least to me) what is -supposed to happen to the output buffer (if there is one) if only the -input position is changed. The standard seems to mandate that the -output buffer is kept and processed as if there was no positioning of -the output position (by changing the input position). Of course, this -can be exactly what you want if the flag ios_base::ate is -set. However, I think, the standard should say something like -this:

-
    -
  • If (which & mode) == 0 neither read nor write position is - changed and the call fails. Otherwise, the joint read and write position is - altered to correspond to sp.
  • -
  • If there is an output buffer, the output sequences is updated and any - unshift sequence is written before the position is altered.
  • -
  • If there is an input buffer, the input sequence is updated after the - position is altered.
  • -
-

Plus the appropriate error handling, that is...

- - -

Proposed resolution:

-

Change the unnumbered paragraph in 27.8.1.4 (lib.filebuf.virtuals) before -paragraph 14 from:

-
-

pos_type seekpos(pos_type sp, ios_base::openmode = ios_base::in | - ios_base::out);

-

Alters the file position, if possible, to correspond to the position stored - in sp (as described below).

-

- if (which&ios_base::in)!=0, set the file position to sp, then update - the input sequence

-

- if (which&ios_base::out)!=0, then update the output sequence, write - any unshift sequence, and set the file position to sp.

-
-

to:

-
-

pos_type seekpos(pos_type sp, ios_base::openmode = ios_base::in | - ios_base::out);

-

Alters the file position, if possible, to correspond to the position stored - in sp (as described below). Altering the file position performs as follows:

-

1. if (om & ios_base::out)!=0, then update the output sequence and - write any unshift sequence;

-

2. set the file position to sp;

-

3. if (om & ios_base::in)!=0, then update the input sequence;

-

where om is the open mode passed to the last call to open(). The operation - fails if is_open() returns false.

-
- -

[Kona: Dietmar is working on a proposed resolution.]

- -

[Post-Tokyo: Dietmar supplied the above wording.]

- - - - - - -
-

172. Inconsistent types for basic_istream::ignore()

-

Section: 27.6.1.3 [istream.unformatted] Status: TC - Submitter: Greg Comeau, Dietmar Kühl Date: 1999-07-23

-

View all other issues in [istream.unformatted].

-

View all issues with TC status.

-

Discussion:

-

In 27.6.1.1 [istream] the function -ignore() gets an object of type streamsize as first -argument. However, in 27.6.1.3 [istream.unformatted] -paragraph 23 the first argument is of type int.

- -

As far as I can see this is not really a contradiction because -everything is consistent if streamsize is typedef to be -int. However, this is almost certainly not what was -intended. The same thing happened to basic_filebuf::setbuf(), -as described in issue 173.

- -

Darin Adler also -submitted this issue, commenting: Either 27.6.1.1 should be modified -to show a first parameter of type int, or 27.6.1.3 should be modified -to show a first parameter of type streamsize and use -numeric_limits<streamsize>::max.

- - -

Proposed resolution:

-

In 27.6.1.3 [istream.unformatted] paragraph 23 and 24, change both uses -of int in the description of ignore() to -streamsize.

- - - - -
-

173. Inconsistent types for basic_filebuf::setbuf()

-

Section: 27.8.1.5 [filebuf.virtuals] Status: TC - Submitter: Greg Comeau, Dietmar Kühl Date: 1999-07-23

-

View all other issues in [filebuf.virtuals].

-

View all issues with TC status.

-

Discussion:

- -

-In 27.8.1.1 [filebuf] the function setbuf() gets an -object of type streamsize as second argument. However, in -27.8.1.5 [filebuf.virtuals] paragraph 9 the second argument is of type -int. -

- -

-As far as I can see this is not really a contradiction because -everything is consistent if streamsize is typedef to be -int. However, this is almost certainly not what was -intended. The same thing happened to basic_istream::ignore(), -as described in issue 172. -

- - - -

Proposed resolution:

-

In 27.8.1.5 [filebuf.virtuals] paragraph 9, change all uses of -int in the description of setbuf() to -streamsize.

- - - - -
-

174. Typo: OFF_T vs. POS_T

-

Section: D.6 [depr.ios.members] Status: TC - Submitter: Dietmar Kühl Date: 1999-07-23

-

View all other issues in [depr.ios.members].

-

View all issues with TC status.

-

Discussion:

-

According to paragraph 1 of this section, streampos is the -type OFF_T, the same type as streamoff. However, in -paragraph 6 the streampos gets the type POS_T

- - -

Proposed resolution:

-

Change D.6 [depr.ios.members] paragraph 1 from "typedef -OFF_T streampos;" to "typedef POS_T -streampos;"

- - - - -
-

175. Ambiguity for basic_streambuf::pubseekpos() and a few other functions.

-

Section: D.6 [depr.ios.members] Status: TC - Submitter: Dietmar Kühl Date: 1999-07-23

-

View all other issues in [depr.ios.members].

-

View all issues with TC status.

-

Discussion:

-

According to paragraph 8 of this section, the methods -basic_streambuf::pubseekpos(), -basic_ifstream::open(), and basic_ofstream::open -"may" be overloaded by a version of this function taking the -type ios_base::open_mode as last argument argument instead of -ios_base::openmode (ios_base::open_mode is defined -in this section to be an alias for one of the integral types). The -clause specifies, that the last argument has a default argument in -three cases. However, this generates an ambiguity with the overloaded -version because now the arguments are absolutely identical if the last -argument is not specified.

- - -

Proposed resolution:

-

In D.6 [depr.ios.members] paragraph 8, remove the default arguments for -basic_streambuf::pubseekpos(), -basic_ifstream::open(), and -basic_ofstream::open().

- - - - -
-

176. exceptions() in ios_base...?

-

Section: D.6 [depr.ios.members] Status: TC - Submitter: Dietmar Kühl Date: 1999-07-23

-

View all other issues in [depr.ios.members].

-

View all issues with TC status.

-

Discussion:

-

The "overload" for the function exceptions() in -paragraph 8 gives the impression that there is another function of -this function defined in class ios_base. However, this is not -the case. Thus, it is hard to tell how the semantics (paragraph 9) can -be implemented: "Call the corresponding member function specified -in clause 27 [input.output]."

- - -

Proposed resolution:

-

In D.6 [depr.ios.members] paragraph 8, move the declaration of the -function exceptions()into class basic_ios.

- - - - -
-

179. Comparison of const_iterators to iterators doesn't work

-

Section: 23.1 [container.requirements] Status: WP - Submitter: Judy Ward Date: 1998-07-02

-

View other active issues in [container.requirements].

-

View all other issues in [container.requirements].

-

View all issues with WP status.

-

Discussion:

-

Currently the following will not compile on two well-known standard -library implementations:

- -
-
#include <set>
-using namespace std;
-
-void f(const set<int> &s)
-{
-  set<int>::iterator i;
-  if (i==s.end()); // s.end() returns a const_iterator
-}
-
- -

-The reason this doesn't compile is because operator== was implemented -as a member function of the nested classes set:iterator and -set::const_iterator, and there is no conversion from const_iterator to -iterator. Surprisingly, (s.end() == i) does work, though, because of -the conversion from iterator to const_iterator. -

- -

-I don't see a requirement anywhere in the standard that this must -work. Should there be one? If so, I think the requirement would need -to be added to the tables in section 24.1.1. I'm not sure about the -wording. If this requirement existed in the standard, I would think -that implementors would have to make the comparison operators -non-member functions.

- -

This issues was also raised on comp.std.c++ by Darin -Adler.  The example given was:

- -
-
bool check_equal(std::deque<int>::iterator i,
-std::deque<int>::const_iterator ci)
-{
-return i == ci;
-}
-
- -

Comment from John Potter:

-
-

- In case nobody has noticed, accepting it will break reverse_iterator. -

- -

- The fix is to make the comparison operators templated on two types. -

- -
    template <class Iterator1, class Iterator2>
-    bool operator== (reverse_iterator<Iterator1> const& x,
-                     reverse_iterator<Iterator2> const& y);
-    
- -

- Obviously: return x.base() == y.base(); -

- -

- Currently, no reverse_iterator to const_reverse_iterator compares are - valid. -

- -

- BTW, I think the issue is in support of bad code. Compares should be - between two iterators of the same type. All std::algorithms require - the begin and end iterators to be of the same type. -

-
- - -

Proposed resolution:

-

Insert this paragraph after 23.1 [container.requirements] paragraph 7:

-
-

In the expressions

-
    i == j
-    i != j
-    i < j
-    i <= j
-    i >= j
-    i > j
-    i - j
-  
-

Where i and j denote objects of a container's iterator type, - either or both may be replaced by an object of the container's - const_iterator type referring to the same element with no - change in semantics.

-
- -

[post-Toronto: Judy supplied a proposed resolution saying that -iterator and const_iterator could be freely mixed in -iterator comparison and difference operations.]

- - -

[Redmond: Dave and Howard supplied a new proposed resolution which -explicitly listed expressions; there was concern that the previous -proposed resolution was too informal.]

- - - -

Rationale:

-

-The LWG believes it is clear that the above wording applies only to -the nested types X::iterator and X::const_iterator, -where X is a container. There is no requirement that -X::reverse_iterator and X::const_reverse_iterator -can be mixed. If mixing them is considered important, that's a -separate issue. (Issue 280.) -

- - - - -
-

181. make_pair() unintended behavior

-

Section: 20.2.3 [pairs] Status: TC - Submitter: Andrew Koenig Date: 1999-08-03

-

View all other issues in [pairs].

-

View all issues with TC status.

-

Discussion:

-

The claim has surfaced in Usenet that expressions such as
-
-       make_pair("abc", 3)
-
-are illegal, notwithstanding their use in examples, because template instantiation tries to bind the first template -parameter to const char (&)[4], which type is uncopyable.
-
-I doubt anyone intended that behavior... -

- - -

Proposed resolution:

-

In 20.2 [utility], paragraph 1 change the following -declaration of make_pair():

-
-
template <class T1, class T2> pair<T1,T2> make_pair(const T1&, const T2&);
-
-

to:

-
-
template <class T1, class T2> pair<T1,T2> make_pair(T1, T2);
-
-

In 20.2.3 [pairs] paragraph 7 and the line before, change:

-
-
template <class T1, class T2>
-pair<T1, T2> make_pair(const T1& x, const T2& y);
-
-

to:

-
-
template <class T1, class T2>
-pair<T1, T2> make_pair(T1 x, T2 y);
-
-

and add the following footnote to the effects clause:

-
-

According to 12.8 [class.copy], an implementation is permitted - to not perform a copy of an argument, thus avoiding unnecessary - copies.

-
- - -

Rationale:

-

Two potential fixes were suggested by Matt Austern and Dietmar -Kühl, respectively, 1) overloading with array arguments, and 2) use of -a reference_traits class with a specialization for arrays. Andy -Koenig suggested changing to pass by value. In discussion, it appeared -that this was a much smaller change to the standard that the other two -suggestions, and any efficiency concerns were more than offset by the -advantages of the solution. Two implementors reported that the -proposed resolution passed their test suites.

- - - - -
-

182. Ambiguous references to size_t

-

Section: 17 [library] Status: WP - Submitter: Al Stevens Date: 1999-08-15

-

View all other issues in [library].

-

View all issues with WP status.

-

Discussion:

-

Many references to size_t throughout the document -omit the std:: namespace qualification.

For -example, 17.4.3.4 [replacement.functions] paragraph 2:

-
-
 operator new(size_t)
- operator new(size_t, const std::nothrow_t&)
- operator new[](size_t)
- operator new[](size_t, const std::nothrow_t&)
-
- - -

Proposed resolution:

-

In 17.4.3.4 [replacement.functions] paragraph 2: replace:

-
-

- operator new(size_t)
- - operator new(size_t, const std::nothrow_t&)
- - operator new[](size_t)
- - operator new[](size_t, const std::nothrow_t&)

-
-

by:

-
-
- operator new(std::size_t)
-- operator new(std::size_t, const std::nothrow_t&)
-- operator new[](std::size_t)
-- operator new[](std::size_t, const std::nothrow_t&)
-
-

In [lib.allocator.requirements] 20.1.5, paragraph 4: replace:

-
-

The typedef members pointer, const_pointer, size_type, and difference_type - are required to be T*, T const*, size_t, and ptrdiff_t, respectively.

-
-

 by:

-
-

The typedef members pointer, const_pointer, size_type, and difference_type - are required to be T*, T const*, std::size_t, and std::ptrdiff_t, - respectively.

-
-

In [lib.allocator.members] 20.4.1.1, paragraphs 3 and 6: replace:

-
-

3 Notes: Uses ::operator new(size_t) (18.4.1).

-

6 Note: the storage is obtained by calling ::operator new(size_t), but it - is unspecified when or how often this function is called. The use of hint is - unspecified, but intended as an aid to locality if an implementation so - desires.

-
-

by:

-
-

3 Notes: Uses ::operator new(std::size_t) (18.4.1).

-

6 Note: the storage is obtained by calling ::operator new(std::size_t), but - it is unspecified when or how often this function is called. The use of hint - is unspecified, but intended as an aid to locality if an implementation so - desires.

-
-

In [lib.char.traits.require] 21.1.1, paragraph 1: replace:

-
-

In Table 37, X denotes a Traits class defining types and functions for the - character container type CharT; c and d denote values of type CharT; p and q - denote values of type const CharT*; s denotes a value of type CharT*; n, i and - j denote values of type size_t; e and f denote values of type X::int_type; pos - denotes a value of type X::pos_type; and state denotes a value of type X::state_type.

-
-

by:

-
-

In Table 37, X denotes a Traits class defining types and functions for the - character container type CharT; c and d denote values of type CharT; p and q - denote values of type const CharT*; s denotes a value of type CharT*; n, i and - j denote values of type std::size_t; e and f denote values of type X::int_type; - pos denotes a value of type X::pos_type; and state denotes a value of type X::state_type.

-
-

In [lib.char.traits.require] 21.1.1, table 37: replace the return type of -X::length(p): "size_t" by "std::size_t".

-

In [lib.std.iterator.tags] 24.3.3, paragraph 2: replace:
-    typedef ptrdiff_t difference_type;
- by:
-    typedef std::ptrdiff_t difference_type;

-

In [lib.locale.ctype] 22.2.1.1 put namespace std { ...} around the -declaration of template <class charT> class ctype.
-
- In [lib.iterator.traits] 24.3.1, paragraph 2 put namespace std { ...} around the declaration of:
-
-    template<class Iterator> struct iterator_traits
-    template<class T> struct iterator_traits<T*>
-    template<class T> struct iterator_traits<const T*>

- - -

Rationale:

-

The LWG believes correcting names like size_t and -ptrdiff_t to std::size_t and std::ptrdiff_t -to be essentially editorial. There there can't be another size_t or -ptrdiff_t meant anyway because, according to 17.4.3.1.4 [extern.types],

- -

-For each type T from the Standard C library, the types ::T and std::T -are reserved to the implementation and, when defined, ::T shall be -identical to std::T. -

- -

The issue is treated as a Defect Report to make explicit the Project -Editor's authority to make this change.

- -

[Post-Tokyo: Nico Josuttis provided the above wording at the -request of the LWG.]

- - -

[Toronto: This is tangentially related to issue 229, but only tangentially: the intent of this issue is to -address use of the name size_t in contexts outside of -namespace std, such as in the description of ::operator new. -The proposed changes should be reviewed to make sure they are -correct.]

- - -

[pre-Copenhagen: Nico has reviewed the changes and believes -them to be correct.]

- - - - - - - -
-

183. I/O stream manipulators don't work for wide character streams

-

Section: 27.6.3 [std.manip] Status: WP - Submitter: Andy Sawyer Date: 1999-07-07

-

View all other issues in [std.manip].

-

View all issues with WP status.

-

Discussion:

-

27.6.3 [std.manip] paragraph 3 says (clause numbering added for -exposition):

-
-

Returns: An object s of unspecified type such that if [1] out is an (instance -of) basic_ostream then the expression out<<s behaves as if f(s) were -called, and if [2] in is an (instance of) basic_istream then the expression -in>>s behaves as if f(s) were called. Where f can be defined as: ios_base& -f(ios_base& str, ios_base::fmtflags mask) { // reset specified flags -str.setf(ios_base::fmtflags(0), mask); return str; } [3] The expression -out<<s has type ostream& and value out. [4] The expression in>>s -has type istream& and value in.

-
-

Given the definitions [1] and [2] for out and in, surely [3] should read: -"The expression out << s has type basic_ostream& ..." and -[4] should read: "The expression in >> s has type basic_istream& -..."

-

If the wording in the standard is correct, I can see no way of implementing -any of the manipulators so that they will work with wide character streams.

-

e.g. wcout << setbase( 16 );

-

Must have value 'wcout' (which makes sense) and type 'ostream&' (which -doesn't).

-

The same "cut'n'paste" type also seems to occur in Paras 4,5,7 and -8. In addition, Para 6 [setfill] has a similar error, but relates only to -ostreams.

-

I'd be happier if there was a better way of saying this, to make it clear -that the value of the expression is "the same specialization of -basic_ostream as out"&

- - -

Proposed resolution:

-

Replace section 27.6.3 [std.manip] except paragraph 1 with the -following:

-
-

2- The type designated smanip in each of the following function -descriptions is implementation-specified and may be different for each -function.
-
-smanip resetiosflags(ios_base::fmtflags mask);
-
--3- Returns: An object s of unspecified type such that if out is an -instance of basic_ostream<charT,traits> then the expression -out<<s behaves -as if f(s, mask) were called, or if in is an instance of -basic_istream<charT,traits> then the expression in>>s -behaves as if -f(s, mask) were called. The function f can be defined as:*
-
-[Footnote: The expression cin >> resetiosflags(ios_base::skipws) -clears ios_base::skipws in the format flags stored in the -basic_istream<charT,traits> object cin (the same as cin >> -noskipws), and the expression cout << -resetiosflags(ios_base::showbase) clears -ios_base::showbase in the format flags stored in the -basic_ostream<charT,traits> object cout (the same as cout -<< -noshowbase). --- end footnote]
-
-     ios_base& f(ios_base& str, ios_base::fmtflags mask)
-   {
-   // reset specified flags
-   str.setf(ios_base::fmtflags(0), mask);
-   return str;
-   }
-

-The expression out<<s has type basic_ostream<charT,traits>& and value out. -The expression in>>s has type basic_istream<charT,traits>& and value in.
-
smanip setiosflags(ios_base::fmtflags mask);
-
--4- Returns: An object s of unspecified type such that if out is an -instance of basic_ostream<charT,traits> then the expression -out<<s behaves -as if f(s, mask) were called, or if in is an instance of -basic_istream<charT,traits> then the expression in>>s -behaves as if f(s, -mask) were called. The function f can be defined as:
-
-     ios_base& f(ios_base& str, ios_base::fmtflags mask)
-   {
-   // set specified flags
-   str.setf(mask);
-   return str;
-   }
-

-The expression out<<s has type basic_ostream<charT,traits>& and value out. -The expression in>>s has type basic_istream<charT,traits>& and value in.
-
-smanip setbase(int base);
-
--5- Returns: An object s of unspecified type such that if out is an -instance of basic_ostream<charT,traits> then the expression -out<<s behaves -as if f(s, base) were called, or if in is an instance of -basic_istream<charT,traits> then the expression in>>s -behaves as if f(s, -base) were called. The function f can be defined as:
-
-     ios_base& f(ios_base& str, int base)
-   {
-   // set basefield
-   str.setf(base == 8 ? ios_base::oct :
-   base == 10 ? ios_base::dec :
-   base == 16 ? ios_base::hex :
-   ios_base::fmtflags(0), ios_base::basefield);
-   return str;
-   }
-

-The expression out<<s has type basic_ostream<charT,traits>& and value out. -The expression in>>s has type basic_istream<charT,traits>& and value in.
-
-smanip setfill(char_type c);
-

--6- Returns: An object s of unspecified type such that if out is (or is -derived from) basic_ostream<charT,traits> and c has type charT -then the -expression out<<s behaves as if f(s, c) were called. The function -f can be -defined as:
-
-      template<class charT, class traits>
-   basic_ios<charT,traits>& f(basic_ios<charT,traits>& str, charT c)
-   {
-   // set fill character
-   str.fill(c);
-   return str;
-   }
-

-The expression out<<s has type basic_ostream<charT,traits>& and value out.
-
-smanip setprecision(int n);
-
--7- Returns: An object s of unspecified type such that if out is an -instance of basic_ostream<charT,traits> then the expression -out<<s behaves -as if f(s, n) were called, or if in is an instance of -basic_istream<charT,traits> then the expression in>>s -behaves as if f(s, n) -were called. The function f can be defined as:
-
-      ios_base& f(ios_base& str, int n)
-   {
-   // set precision
-   str.precision(n);
-   return str;
-   }
-

-The expression out<<s has type basic_ostream<charT,traits>& and value out. -The expression in>>s has type basic_istream<charT,traits>& and value in
-.
-smanip setw(int n);
-

--8- Returns: An object s of unspecified type such that if out is an -instance of basic_ostream<charT,traits> then the expression -out<<s behaves -as if f(s, n) were called, or if in is an instance of -basic_istream<charT,traits> then the expression in>>s -behaves as if f(s, n) -were called. The function f can be defined as:
-
-      ios_base& f(ios_base& str, int n)
-   {
-   // set width
-   str.width(n);
-   return str;
-   }
-

-The expression out<<s has type -basic_ostream<charT,traits>& and value out. The expression -in>>s has type basic_istream<charT,traits>& and value -in. -

-
- -

[Kona: Andy Sawyer and Beman Dawes will work to improve the wording of -the proposed resolution.]

- - -

[Tokyo - The LWG noted that issue 216 involves -the same paragraphs.]

- - -

[Post-Tokyo: The issues list maintainer combined the proposed -resolution of this issue with the proposed resolution for issue 216 as they both involved the same paragraphs, and were so -intertwined that dealing with them separately appear fraught with -error. The full text was supplied by Bill Plauger; it was cross -checked against changes supplied by Andy Sawyer. It should be further -checked by the LWG.]

- - - - - - -
-

184. numeric_limits<bool> wording problems

-

Section: 18.2.1.5 [numeric.special] Status: WP - Submitter: Gabriel Dos Reis Date: 1999-07-21

-

View all other issues in [numeric.special].

-

View all issues with WP status.

-

Discussion:

-

bools are defined by the standard to be of integer types, as per -3.9.1 [basic.fundamental] paragraph 7. However "integer types" -seems to have a special meaning for the author of 18.2. The net effect -is an unclear and confusing specification for -numeric_limits<bool> as evidenced below.

- -

18.2.1.2/7 says numeric_limits<>::digits is, for built-in integer -types, the number of non-sign bits in the representation.

- -

4.5/4 states that a bool promotes to int ; whereas 4.12/1 says any non zero -arithmetical value converts to true.

- -

I don't think it makes sense at all to require -numeric_limits<bool>::digits and numeric_limits<bool>::digits10 to -be meaningful.

- -

The standard defines what constitutes a signed (resp. unsigned) integer -types. It doesn't categorize bool as being signed or unsigned. And the set of -values of bool type has only two elements.

- -

I don't think it makes sense to require numeric_limits<bool>::is_signed -to be meaningful.

- -

18.2.1.2/18 for numeric_limits<integer_type>::radix  says:

-
-

For integer types, specifies the base of the representation.186)

-
- -

This disposition is at best misleading and confusing for the standard -requires a "pure binary numeration system" for integer types as per -3.9.1/7

- -

The footnote 186) says: "Distinguishes types with base other than 2 (e.g -BCD)."  This also erroneous as the standard never defines any integer -types with base representation other than 2.

- -

Furthermore, numeric_limits<bool>::is_modulo and -numeric_limits<bool>::is_signed have similar problems.

- - -

Proposed resolution:

-

Append to the end of 18.2.1.5 [numeric.special]:

-
-

The specialization for bool shall be provided as follows:

-
    namespace std {
-       template<> class numeric_limits<bool> {
-       public:
-         static const bool is_specialized = true;
-         static bool min() throw() { return false; }
-         static bool max() throw() { return true; }
-
-         static const int  digits = 1;
-         static const int  digits10 = 0;
-         static const bool is_signed = false;
-         static const bool is_integer = true;
-         static const bool is_exact = true;
-         static const int  radix = 2;
-         static bool epsilon() throw() { return 0; }
-         static bool round_error() throw() { return 0; }
-
-         static const int  min_exponent = 0;
-         static const int  min_exponent10 = 0;
-         static const int  max_exponent = 0;
-         static const int  max_exponent10 = 0;
-
-         static const bool has_infinity = false;
-         static const bool has_quiet_NaN = false;
-         static const bool has_signaling_NaN = false;
-         static const float_denorm_style has_denorm = denorm_absent;
-         static const bool has_denorm_loss = false;
-         static bool infinity() throw() { return 0; }
-         static bool quiet_NaN() throw() { return 0; }
-         static bool signaling_NaN() throw() { return 0; }
-         static bool denorm_min() throw() { return 0; }
-
-         static const bool is_iec559 = false;
-         static const bool is_bounded = true;
-         static const bool is_modulo = false;
-
-         static const bool traps = false;
-         static const bool tinyness_before = false;
-         static const float_round_style round_style = round_toward_zero;
-       };
-     }
-
- -

[Tokyo:  The LWG desires wording that specifies exact values -rather than more general wording in the original proposed -resolution.]

- - -

[Post-Tokyo:  At the request of the LWG in Tokyo, Nico -Josuttis provided the above wording.]

- - - - - - -
-

185. Questionable use of term "inline"

-

Section: 20.5 [function.objects] Status: WP - Submitter: UK Panel Date: 1999-07-26

-

View all other issues in [function.objects].

-

View all issues with WP status.

-

Discussion:

-

Paragraph 4 of 20.5 [function.objects] says:

-
-

 [Example: To negate every element of a: transform(a.begin(), a.end(), - a.begin(), negate<double>()); The corresponding functions will inline - the addition and the negation. end example]

-
-

(Note: The "addition" referred to in the above is in para 3) we can -find no other wording, except this (non-normative) example which suggests that -any "inlining" will take place in this case.

-

Indeed both:

-
-

17.4.4.3 Global Functions [lib.global.functions] 1 It is - unspecified whether any global functions in the C++ Standard Library - are defined as inline (7.1.2).

-
-

and

-
-

17.4.4.4 Member Functions [lib.member.functions] 1 It is - unspecified whether any member functions in the C++ Standard Library - are defined as inline (7.1.2).

-
-

take care to state that this may indeed NOT be the case.

-

Thus the example "mandates" behavior that is explicitly -not required elsewhere.

- - -

Proposed resolution:

-

In 20.5 [function.objects] paragraph 1, remove the sentence:

-
-

They are important for the effective use of the library.

-
-

Remove 20.5 [function.objects] paragraph 2, which reads:

-
-

Using function objects together with function templates - increases the expressive power of the library as well as making the - resulting code much more efficient.

-
-

In 20.5 [function.objects] paragraph 4, remove the sentence:

-
-

The corresponding functions will inline the addition and the - negation.

-
- -

[Kona: The LWG agreed there was a defect.]

- -

[Tokyo: The LWG crafted the proposed resolution.]

- - - - - - -
-

186. bitset::set() second parameter should be bool

-

Section: 23.3.5.2 [bitset.members] Status: WP - Submitter: Darin Adler Date: 1999-08-13

-

View all other issues in [bitset.members].

-

View all issues with WP status.

-

Discussion:

-

In section 23.3.5.2 [bitset.members], paragraph 13 defines the -bitset::set operation to take a second parameter of type int. The -function tests whether this value is non-zero to determine whether to -set the bit to true or false. The type of this second parameter should -be bool. For one thing, the intent is to specify a Boolean value. For -another, the result type from test() is bool. In addition, it's -possible to slice an integer that's larger than an int. This can't -happen with bool, since conversion to bool has the semantic of -translating 0 to false and any non-zero value to true.

- - -

Proposed resolution:

-

In 23.3.5 [template.bitset] Para 1 Replace:

-
-
bitset<N>& set(size_t pos, int val = true ); 
-
-

With:

-
-
bitset<N>& set(size_t pos, bool val = true );
-
-

In 23.3.5.2 [bitset.members] Para 12(.5) Replace:

-
-
bitset<N>& set(size_t pos, int val = 1 );
-
-

With:

-
-
bitset<N>& set(size_t pos, bool val = true );
-
- -

[Kona: The LWG agrees with the description.  Andy Sawyer will work -on better P/R wording.]

- -

[Post-Tokyo: Andy provided the above wording.]

- - - -

Rationale:

-

bool is a better choice. It is believed that binary -compatibility is not an issue, because this member function is -usually implemented as inline, and because it is already -the case that users cannot rely on the type of a pointer to a -nonvirtual member of a standard library class.

- - - - - -
-

187. iter_swap underspecified

-

Section: 25.2.3 [alg.swap] Status: WP - Submitter: Andrew Koenig Date: 1999-08-14

-

View all other issues in [alg.swap].

-

View all issues with WP status.

-

Discussion:

-

The description of iter_swap in 25.2.2 paragraph 7,says that it -``exchanges the values'' of the objects to which two iterators -refer.

What it doesn't say is whether it does so using swap -or using the assignment operator and copy constructor.

This -question is an important one to answer, because swap is specialized to -work efficiently for standard containers.
For example:

-
-
vector<int> v1, v2;
-iter_swap(&v1, &v2);
-
-

Is this call to iter_swap equivalent to calling swap(v1, v2)?  -Or is it equivalent to

-
-
{
-vector<int> temp = v1;
-v1 = v2;
-v2 = temp;
-}
-
-

The first alternative is O(1); the second is O(n).

-

A LWG member, Dave Abrahams, comments:

-
-

Not an objection necessarily, but I want to point out the cost of -that requirement:

-
-

iter_swap(list<T>::iterator, list<T>::iterator)

-
-

can currently be specialized to be more efficient than -iter_swap(T*,T*) for many T (by using splicing). Your proposal would -make that optimization illegal. 

-
- -

[Kona: The LWG notes the original need for iter_swap was proxy iterators -which are no longer permitted.]

- - - -

Proposed resolution:

-

Change the effect clause of iter_swap in 25.2.2 paragraph 7 from:

-
-

Exchanges the values pointed to by the two iterators a and b.

-
-

to

-
-

swap(*a, *b).

-
- - - -

Rationale:

-

It's useful to say just what iter_swap does. There may be - some iterators for which we want to specialize iter_swap, - but the fully general version should have a general specification.

- -

Note that in the specific case of list<T>::iterator, -iter_swap should not be specialized as suggested above. That would do -much more than exchanging the two iterators' values: it would change -predecessor/successor relationships, possibly moving the iterator from -one list to another. That would surely be inappropriate.

- - - - - -
-

189. setprecision() not specified correctly

-

Section: 27.4.2.2 [fmtflags.state] Status: TC - Submitter: Andrew Koenig Date: 1999-08-25

-

View all other issues in [fmtflags.state].

-

View all issues with TC status.

-

Discussion:

-

27.4.2.2 paragraph 9 claims that setprecision() sets the precision, -and includes a parenthetical note saying that it is the number of -digits after the decimal point.
-
-This claim is not strictly correct. For example, in the default -floating-point output format, setprecision sets the number of -significant digits printed, not the number of digits after the decimal -point.
-
-I would like the committee to look at the definition carefully and -correct the statement in 27.4.2.2

- - -

Proposed resolution:

-

Remove from 27.4.2.2 [fmtflags.state], paragraph 9, the text -"(number of digits after the decimal point)".

- - - - -
-

193. Heap operations description incorrect

-

Section: 25.3.6 [alg.heap.operations] Status: TC - Submitter: Markus Mauhart Date: 1999-09-24

-

View all issues with TC status.

-

Duplicate of: 216

-

Discussion:

-

25.3.6 [lib.alg.heap.operations] states two key properties of a heap [a,b), the first of them -is
-
-    `"(1) *a is the largest element"
-
-I think this is incorrect and should be changed to the wording in the proposed -resolution.

-

Actually there are two independent changes:

-
-

A-"part of largest equivalence class" instead of "largest", cause 25.3 - [lib.alg.sorting] asserts "strict weak ordering" for all its sub clauses.

-

B-Take -'an oldest' from that equivalence class, otherwise the heap functions -could not be used for a priority queue as explained in 23.2.3.2.2 -[lib.priqueue.members] (where I assume that a "priority queue" respects -priority AND time).

-
- - -

Proposed resolution:

-

Change 25.3.6 [alg.heap.operations] property (1) from:

-
-

(1) *a is the largest element

-
-

to:

-
-

(1) There is no element greater than *a

-
- - - - - -
-

195. Should basic_istream::sentry's constructor ever set eofbit?

-

Section: 27.6.1.1.3 [istream::sentry] Status: TC - Submitter: Matt Austern Date: 1999-10-13

-

View all other issues in [istream::sentry].

-

View all issues with TC status.

-

Discussion:

-

Suppose that is.flags() & ios_base::skipws is nonzero. -What should basic_istream<>::sentry's constructor do if it -reaches eof while skipping whitespace? 27.6.1.1.2/5 suggests it -should set failbit. Should it set eofbit as well? The standard -doesn't seem to answer that question.

- -

On the one hand, nothing in 27.6.1.1.3 [istream::sentry] says that -basic_istream<>::sentry should ever set eofbit. On the -other hand, 27.6.1.1 [istream] paragraph 4 says that if -extraction from a streambuf "returns -traits::eof(), then the input function, except as explicitly -noted otherwise, completes its actions and does -setstate(eofbit)". So the question comes down to -whether basic_istream<>::sentry's constructor is an -input function.

- -

Comments from Jerry Schwarz:

-
-

It was always my intention that eofbit should be set any time that a -virtual returned something to indicate eof, no matter what reason -iostream code had for calling the virtual.

-

-The motivation for this is that I did not want to require streambufs -to behave consistently if their virtuals are called after they have -signaled eof.

-

-The classic case is a streambuf reading from a UNIX file. EOF isn't -really a state for UNIX file descriptors. The convention is that a -read on UNIX returns 0 bytes to indicate "EOF", but the file -descriptor isn't shut down in any way and future reads do not -necessarily also return 0 bytes. In particular, you can read from -tty's on UNIX even after they have signaled "EOF". (It -isn't always understood that a ^D on UNIX is not an EOF indicator, but -an EOL indicator. By typing a "line" consisting solely of -^D you cause a read to return 0 bytes, and by convention this is -interpreted as end of file.)

-
- - -

Proposed resolution:

-

Add a sentence to the end of 27.6.1.1.2 paragraph 2:

-
-

If is.rdbuf()->sbumpc() or is.rdbuf()->sgetc() -returns traits::eof(), the function calls -setstate(failbit | eofbit) (which may throw -ios_base::failure). -

-
- - - - -
-

198. Validity of pointers and references unspecified after iterator destruction

-

Section: 24.1 [iterator.requirements] Status: WP - Submitter: Beman Dawes Date: 1999-11-03

-

View other active issues in [iterator.requirements].

-

View all other issues in [iterator.requirements].

-

View all issues with WP status.

-

Discussion:

-

-Is a pointer or reference obtained from an iterator still valid after -destruction of the iterator? -

-

-Is a pointer or reference obtained from an iterator still valid after the value -of the iterator changes? -

-
-
#include <iostream>
-#include <vector>
-#include <iterator>
-
-int main()
-{
-    typedef std::vector<int> vec_t;
-    vec_t v;
-    v.push_back( 1 );
-
-    // Is a pointer or reference obtained from an iterator still
-    // valid after destruction of the iterator?
-    int * p = &*v.begin();
-    std::cout << *p << '\n';  // OK?
-
-    // Is a pointer or reference obtained from an iterator still
-    // valid after the value of the iterator changes?
-    vec_t::iterator iter( v.begin() );
-    p = &*iter++;
-    std::cout << *p << '\n';  // OK?
-
-    return 0;
-}
-
-
- -

The standard doesn't appear to directly address these -questions. The standard needs to be clarified. At least two real-world -cases have been reported where library implementors wasted -considerable effort because of the lack of clarity in the -standard. The question is important because requiring pointers and -references to remain valid has the effect for practical purposes of -prohibiting iterators from pointing to cached rather than actual -elements of containers.

- -

The standard itself assumes that pointers and references obtained -from an iterator are still valid after iterator destruction or -change. The definition of reverse_iterator::operator*(), 24.4.1.3.3 [reverse.iter.conv], which returns a reference, defines -effects:

- -
-
Iterator tmp = current;
-return *--tmp;
-
-

The definition of reverse_iterator::operator->(), 24.4.1.3.4 -[reverse.iter.op.star], which returns a pointer, defines effects:

-
-
return &(operator*());
-
- -

Because the standard itself assumes pointers and references remain -valid after iterator destruction or change, the standard should say so -explicitly. This will also reduce the chance of user code breaking -unexpectedly when porting to a different standard library -implementation.

- - -

Proposed resolution:

-

Add a new paragraph to 24.1 [iterator.requirements]:

-

-Destruction of an iterator may invalidate pointers and references -previously obtained from that iterator. -

- -

Replace paragraph 1 of 24.4.1.3.3 [reverse.iter.conv] with:

- -
-

Effects:

-
  this->tmp = current;
-  --this->tmp;
-  return *this->tmp;
-
- -

-[Note: This operation must use an auxiliary member variable, -rather than a temporary variable, to avoid returning a reference that -persists beyond the lifetime of its associated iterator. (See -24.1 [iterator.requirements].) The name of this member variable is shown for -exposition only. --end note] -

-
- -

[Post-Tokyo: The issue has been reformulated purely -in terms of iterators.]

- - -

[Pre-Toronto: Steve Cleary pointed out the no-invalidation -assumption by reverse_iterator. The issue and proposed resolution was -reformulated yet again to reflect this reality.]

- - -

[Copenhagen: Steve Cleary pointed out that reverse_iterator -assumes its underlying iterator has persistent pointers and -references. Andy Koenig pointed out that it is possible to rewrite -reverse_iterator so that it no longer makes such an assupmption. -However, this issue is related to issue 299. If we -decide it is intentional that p[n] may return by value -instead of reference when p is a Random Access Iterator, -other changes in reverse_iterator will be necessary.]

- - - -

Rationale:

-

This issue has been discussed extensively. Note that it is -not an issue about the behavior of predefined iterators. It is -asking whether or not user-defined iterators are permitted to have -transient pointers and references. Several people presented examples -of useful user-defined iterators that have such a property; examples -include a B-tree iterator, and an "iota iterator" that doesn't point -to memory. Library implementors already seem to be able to cope with -such iterators: they take pains to avoid forming references to memory -that gets iterated past. The only place where this is a problem is -reverse_iterator, so this issue changes -reverse_iterator to make it work.

- -

This resolution does not weaken any guarantees provided by -predefined iterators like list<int>::iterator. -Clause 23 should be reviewed to make sure that guarantees for -predefined iterators are as strong as users expect.

- - - - - - -
-

199. What does allocate(0) return?

-

Section: 20.1.2 [allocator.requirements] Status: TC - Submitter: Matt Austern Date: 1999-11-19

-

View other active issues in [allocator.requirements].

-

View all other issues in [allocator.requirements].

-

View all issues with TC status.

-

Discussion:

-

-Suppose that A is a class that conforms to the -Allocator requirements of Table 32, and a is an -object of class A What should be the return -value of a.allocate(0)? Three reasonable -possibilities: forbid the argument 0, return -a null pointer, or require that the return value be a -unique non-null pointer. -

- - -

Proposed resolution:

-

-Add a note to the allocate row of Table 32: -"[Note: If n == 0, the return value is unspecified. --end note]"

- - -

Rationale:

-

A key to understanding this issue is that the ultimate use of -allocate() is to construct an iterator, and that iterator for zero -length sequences must be the container's past-the-end -representation. Since this already implies special case code, it -would be over-specification to mandate the return value. -

- - - - -
-

200. Forward iterator requirements don't allow constant iterators

-

Section: 24.1.3 [forward.iterators] Status: WP - Submitter: Matt Austern Date: 1999-11-19

-

View all other issues in [forward.iterators].

-

View all issues with WP status.

-

Discussion:

-

-In table 74, the return type of the expression *a is given -as T&, where T is the iterator's value type. -For constant iterators, however, this is wrong. ("Value type" -is never defined very precisely, but it is clear that the value type -of, say, std::list<int>::const_iterator is supposed to be -int, not const int.) -

- - -

Proposed resolution:

-

-In table 74, in the *a and *r++ rows, change the -return type from "T&" to "T& -if X is mutable, otherwise const T&". -In the a->m row, change the return type from -"U&" to "U& if X is mutable, -otherwise const U&". -

- -

[Tokyo: The LWG believes this is the tip of a larger iceberg; -there are multiple const problems with the STL portion of the library -and that these should be addressed as a single package.  Note -that issue 180 has already been declared NAD Future for -that very reason.]

- - -

[Redmond: the LWG thinks this is separable from other constness -issues. This issue is just cleanup; it clarifies language that was -written before we had iterator_traits. Proposed resolution was -modified: the original version only discussed *a. It was pointed out -that we also need to worry about *r++ and a->m.]

- - - - - - - -
-

201. Numeric limits terminology wrong

-

Section: 18.2.1 [limits] Status: WP - Submitter: Stephen Cleary Date: 1999-12-21

-

View all other issues in [limits].

-

View all issues with WP status.

-

Discussion:

-

-In some places in this section, the terms "fundamental types" and -"scalar types" are used when the term "arithmetic types" is intended. -The current usage is incorrect because void is a fundamental type and -pointers are scalar types, neither of which should have -specializations of numeric_limits. -

-

[Lillehammer: it remains true that numeric_limits is using - imprecise language. However, none of the proposals for changed - wording are clearer. A redesign of numeric_limits is needed, but this - is more a task than an open issue.]

- - - -

Proposed resolution:

- -

-Change 18.2 [support.limits] to: -

- -
-

--1- The headers <limits>, <climits>, -<cfloat>, and <cinttypes> supply -characteristics of implementation-dependent fundamental -arithmetic types (3.9.1). -

-
- -

-Change 18.2.1 [limits] to: -

- -
-

--1- The numeric_limits component provides a C++ program with -information about various properties of the implementation's -representation of the fundamental arithmetic -types. -

-

--2- Specializations shall be provided for each fundamental -arithmetic type, both floating point and integer, including -bool. The member is_specialized shall be true -for all such specializations of numeric_limits. -

-

--4- Non-fundamentalarithmetic standard types, such -as complex<T> (26.3.2), shall not have specializations. -

-
- -

-Change 18.2.1.1 [numeric.limits] to: -

- -
-

--1- The member is_specialized makes it possible to distinguish -between fundamental types, which have specializations, and non-scalar types, -which do not. -

-
- - - - - - -
-

202. unique() effects unclear when predicate not an equivalence relation

-

Section: 25.2.9 [alg.unique] Status: WP - Submitter: Andrew Koenig Date: 2000-01-13

-

View all other issues in [alg.unique].

-

View all issues with WP status.

-

Discussion:

-

-What should unique() do if you give it a predicate that is not an -equivalence relation? There are at least two plausible answers: -

- -
- -

- 1. You can't, because 25.2.8 says that it it "eliminates all but - the first element from every consecutive group of equal - elements..." and it wouldn't make sense to interpret "equal" as - meaning anything but an equivalence relation. [It also doesn't - make sense to interpret "equal" as meaning ==, because then there - would never be any sense in giving a predicate as an argument at - all.] -

- -

- 2. The word "equal" should be interpreted to mean whatever the - predicate says, even if it is not an equivalence relation - (and in particular, even if it is not transitive). -

- -
- -

-The example that raised this question is from Usenet: -

- -
- -
int f[] = { 1, 3, 7, 1, 2 };
-int* z = unique(f, f+5, greater<int>());
- -
- -

-If one blindly applies the definition using the predicate -greater<int>, and ignore the word "equal", you get: -

- -
- -

- Eliminates all but the first element from every consecutive group - of elements referred to by the iterator i in the range [first, last) - for which *i > *(i - 1). -

- -
- -

-The first surprise is the order of the comparison. If we wanted to -allow for the predicate not being an equivalence relation, then we -should surely compare elements the other way: pred(*(i - 1), *i). If -we do that, then the description would seem to say: "Break the -sequence into subsequences whose elements are in strictly increasing -order, and keep only the first element of each subsequence". So the -result would be 1, 1, 2. If we take the description at its word, it -would seem to call for strictly DEcreasing order, in which case the -result should be 1, 3, 7, 2.
-
-In fact, the SGI implementation of unique() does neither: It yields 1, -3, 7. -

- - -

Proposed resolution:

-

Change 25.2.9 [alg.unique] paragraph 1 to:

-

-For a nonempty range, eliminates all but the first element from every -consecutive group of equivalent elements referred to by the iterator -i in the range [first+1, last) for which the following -conditions hold: *(i-1) == *i or pred(*(i-1), *i) != -false. -

- -

-Also insert a new paragraph, paragraph 2a, that reads: "Requires: The -comparison function must be an equivalence relation." -

- -

[Redmond: discussed arguments for and against requiring the -comparison function to be an equivalence relation. Straw poll: -14-2-5. First number is to require that it be an equivalence -relation, second number is to explicitly not require that it be an -equivalence relation, third number is people who believe they need -more time to consider the issue. A separate issue: Andy Sawyer -pointed out that "i-1" is incorrect, since "i" can refer to the first -iterator in the range. Matt provided wording to address this -problem.]

- - -

[Curaçao: The LWG changed "... the range (first, -last)..." to "... the range [first+1, last)..." for -clarity. They considered this change close enough to editorial to not -require another round of review.]

- - - - -

Rationale:

-

The LWG also considered an alternative resolution: change -25.2.9 [alg.unique] paragraph 1 to:

- -

-For a nonempty range, eliminates all but the first element from every -consecutive group of elements referred to by the iterator -i in the range (first, last) for which the following -conditions hold: *(i-1) == *i or pred(*(i-1), *i) != -false. -

- -

-Also insert a new paragraph, paragraph 1a, that reads: "Notes: The -comparison function need not be an equivalence relation." -

- - -

Informally: the proposed resolution imposes an explicit requirement -that the comparison function be an equivalence relation. The -alternative resolution does not, and it gives enough information so -that the behavior of unique() for a non-equivalence relation is -specified. Both resolutions are consistent with the behavior of -existing implementations.

- - - - - -
-

206. operator new(size_t, nothrow) may become unlinked to ordinary operator new if ordinary version replaced

-

Section: 18.5.1.1 [new.delete.single] Status: WP - Submitter: Howard Hinnant Date: 1999-08-29

-

View all other issues in [new.delete.single].

-

View all issues with WP status.

-

Discussion:

-

As specified, the implementation of the nothrow version of operator -new does not necessarily call the ordinary operator new, but may -instead simply call the same underlying allocator and return a null -pointer instead of throwing an exception in case of failure.

- -

Such an implementation breaks code that replaces the ordinary -version of new, but not the nothrow version. If the ordinary version -of new/delete is replaced, and if the replaced delete is not -compatible with pointers returned from the library versions of new, -then when the replaced delete receives a pointer allocated by the -library new(nothrow), crash follows.

- -

The fix appears to be that the lib version of new(nothrow) must -call the ordinary new. Thus when the ordinary new gets replaced, the -lib version will call the replaced ordinary new and things will -continue to work.

- -

An alternative would be to have the ordinary new call -new(nothrow). This seems sub-optimal to me as the ordinary version of -new is the version most commonly replaced in practice. So one would -still need to replace both ordinary and nothrow versions if one wanted -to replace the ordinary version.

- -

Another alternative is to put in clear text that if one version is -replaced, then the other must also be replaced to maintain -compatibility. Then the proposed resolution below would just be a -quality of implementation issue. There is already such text in -paragraph 7 (under the new(nothrow) version). But this nuance is -easily missed if one reads only the paragraphs relating to the -ordinary new.

- -

-N2158 -has been written explaining the rationale for the proposed resolution below. -

- - - -

Proposed resolution:

-

-Change 18.5.1.1 [new.delete.single]: -

- -
-
void* operator new(std::size_t size, const std::nothrow_t&) throw();
-
-
-

--5- Effects: Same as above, except that it is called by a placement -version of a new-expression when a C++ program prefers a null pointer result as -an error indication, instead of a bad_alloc exception. -

- -

--6- Replaceable: a C++ program may define a function with this function -signature that displaces the default version defined by the C++ Standard -library. -

- -

--7- Required behavior: Return a non-null pointer to suitably aligned -storage (3.7.4), or else return a null pointer. This nothrow version of operator -new returns a pointer obtained as if acquired from the (possibly -replaced) ordinary version. This requirement is binding on a replacement -version of this function. -

- -

--8- Default behavior: -

-
    -
  • -Calls operator new(size). -
  • -
  • -If the call to operator new(size) returns normally, returns -the result of that call, else -
  • -
  • -if the call to operator new(size) throws an exception, returns -a null pointer. -
  • -
  • -Executes a loop: Within the loop, the function first attempts to allocate the -requested storage. Whether the attempt involves a call to the Standard C library -function malloc is unspecified. -
  • -
  • -Returns a pointer to the allocated storage if the attempt is successful. -Otherwise, if the last argument to set_new_handler() was a null -pointer, return a null pointer. -
  • -
  • -Otherwise, the function calls the current new_handler (18.5.2.2). If the -called function returns, the loop repeats. -
  • -
  • -The loop terminates when an attempt to allocate the requested storage is -successful or when a called new_handler function does not return. If the -called new_handler function terminates by throwing a bad_alloc -exception, the function returns a null pointer. -
  • -
-

--9- [Example: -

-
T* p1 = new T;                 // throws bad_alloc if it fails
-T* p2 = new(nothrow) T;        // returns 0 if it fails
-
-

---end example] -

-
- -
void operator delete(void* ptr) throw();
-void operator delete(void* ptr, const std::nothrow_t&) throw();
-
- -
-

--10- Effects: The deallocation function (3.7.4.2) called by a -delete-expression to render the value of ptr invalid. -

-

--11- Replaceable: a C++ program may define a function with this function -signature that displaces the default version defined by the C++ Standard -library. -

-

--12- Requires: the value of ptr is null or the value -returned by an earlier call to the default (possibly -replaced) operator new(std::size_t) or operator -new(std::size_t, const std::nothrow_t&). -

-

--13- Default behavior: -

-
    -
  • -For a null value of ptr, do nothing. -
  • -
  • -Any other value of ptr shall be a value returned earlier by a -call to the default operator new, which was not invalidated by an -intervening call to operator delete(void*) (17.4.3.7). For such a -non-null value of ptr, reclaims storage allocated by the earlier -call to the default operator new. -
  • -
-

--14- Remarks: It is unspecified under what conditions part or all of -such reclaimed storage is allocated by a subsequent call to operator -new or any of calloc, malloc, or realloc, -declared in <cstdlib>. -

-
- -
void operator delete(void* ptr, const std::nothrow_t&) throw();
-
- -
-

--15- Effects: Same as above, except that it is called by the -implementation when an exception propagates from a nothrow placement version -of the new-expression (i.e. when the constructor throws an exception). -

-

--16- Replaceable: a C++ program may define a function with this function -signature that displaces the default version defined by the C++ Standard -library. -

-

--17- Requires: the value of ptr is null or the -value returned by an earlier call to the (possibly replaced) operator -new(std::size_t) or operator new(std::size_t, const -std::nothrow_t&).

-

--18- Default behavior: Calls operator delete(ptr). -

-
- -
- -

-Change 18.5.1.2 [new.delete.array] -

- -
-
void* operator new[](std::size_t size, const std::nothrow_t&) throw();
-
- -
-

--5- Effects: Same as above, except that it is called by a placement -version of a new-expression when a C++ program prefers a null pointer result as -an error indication, instead of a bad_alloc exception. -

- -

--6- Replaceable: a C++ program can define a function with this function -signature that displaces the default version defined by the C++ Standard -library. -

- -

--7- Required behavior: Same as for operator new(std::size_t, -const std::nothrow_t&). This nothrow version of operator new[] -returns a pointer obtained as if acquired from the ordinary version. -Return a non-null pointer to suitably aligned storage (3.7.4), or else -return a null pointer. This nothrow version of operator new returns a pointer -obtained as if acquired from the (possibly replaced) operator -new[](std::size_t size). This requirement is binding on a -replacement version of this function. -

- -

--8- Default behavior: Returns operator new(size, -nothrow). -

- -
    -
  • -Calls operator new[](size). -
  • -
  • -If the call to operator new[](size) returns normally, returns -the result of that call, else -
  • -
  • -if the call to operator new[](size) throws an exception, returns -a null pointer. -
  • -
-
- -
void operator delete[](void* ptr) throw(); 
-void operator delete[](void* ptr, const std::nothrow_t&) throw();
-
- -
-

--9- Effects: The deallocation function (3.7.4.2) called by the -array form of a delete-expression to render the value of -ptr invalid. -

- -

--10- Replaceable: a C++ program can define a function with this function -signature that displaces the default version defined by the C++ Standard -library. -

- -

--11- Requires: the value of -ptr is null or the value returned by an earlier call to -operator new[](std::size_t) or operator new[](std::size_t, const -std::nothrow_t&). -

- -

--12- Default behavior: Calls operator delete(ptr) or -operator delete[](ptr, std::nothrow) respectively. -

-
- -
- - - -

Rationale:

-

Yes, they may become unlinked, and that is by design. If a user -replaces one, the user should also replace the other.

- -

[ -Reopened due to a gcc conversation between Howard, Martin and Gaby. Forwarding -or not is visible behavior to the client and it would be useful for the client -to know which behavior it could depend on. -]

- - -

[ -Batavia: Robert voiced serious reservations about backwards compatibility for -his customers. -]

- - - - - - -
-

208. Unnecessary restriction on past-the-end iterators

-

Section: 24.1 [iterator.requirements] Status: TC - Submitter: Stephen Cleary Date: 2000-02-02

-

View other active issues in [iterator.requirements].

-

View all other issues in [iterator.requirements].

-

View all issues with TC status.

-

Discussion:

-

In 24.1 paragraph 5, it is stated ". . . Dereferenceable and -past-the-end values are always non-singular."

-

This places an unnecessary restriction on past-the-end iterators for -containers with forward iterators (for example, a singly-linked list). If the -past-the-end value on such a container was a well-known singular value, it would -still satisfy all forward iterator requirements.

-

Removing this restriction would allow, for example, a singly-linked list -without a "footer" node.

-

This would have an impact on existing code that expects past-the-end -iterators obtained from different (generic) containers being not equal.

- - -

Proposed resolution:

-

Change 24.1 [iterator.requirements] paragraph 5, the last sentence, from:

-
-

Dereferenceable and past-the-end values are always non-singular.

-
-

to:

-
-

Dereferenceable values are always non-singular. 

-
- - -

Rationale:

-

For some kinds of containers, including singly linked lists and -zero-length vectors, null pointers are perfectly reasonable past-the-end -iterators. Null pointers are singular. -

- - - - -
-

209. basic_string declarations inconsistent

-

Section: 21.3 [basic.string] Status: TC - Submitter: Igor Stauder Date: 2000-02-11

-

View other active issues in [basic.string].

-

View all other issues in [basic.string].

-

View all issues with TC status.

-

Discussion:

-

In Section 21.3 [basic.string] the basic_string member function -declarations use a consistent style except for the following functions:

-
-
void push_back(const charT);
-basic_string& assign(const basic_string&);
-void swap(basic_string<charT,traits,Allocator>&);
-
-

- push_back, assign, swap: missing argument name 
-- push_back: use of const with charT (i.e. POD type passed by value -not by reference - should be charT or const charT& )
-- swap: redundant use of template parameters in argument -basic_string<charT,traits,Allocator>&

- - -

Proposed resolution:

-

In Section 21.3 [basic.string] change the basic_string member -function declarations push_back, assign, and swap to:

-
-
void push_back(charT c); 
-
-basic_string& assign(const basic_string& str);
-void swap(basic_string& str);
-
- - -

Rationale:

-

Although the standard is in general not consistent in declaration -style, the basic_string declarations are consistent other than the -above. The LWG felt that this was sufficient reason to merit the -change. -

- - - - -
-

210. distance first and last confused

-

Section: 25 [algorithms] Status: TC - Submitter: Lisa Lippincott Date: 2000-02-15

-

View all other issues in [algorithms].

-

View all issues with TC status.

-

Discussion:

-

In paragraph 9 of section 25 [algorithms], it is written:

-
-

In the description of the algorithms operators + and - are used - for some of the iterator categories for which they do not have to - be defined. In these cases the semantics of [...] a-b is the same - as of
-
-      return distance(a, b);

-
- - -

Proposed resolution:

-

On the last line of paragraph 9 of section 25 [algorithms] change -"a-b" to "b-a".

- - -

Rationale:

-

There are two ways to fix the defect; change the description to b-a -or change the return to distance(b,a). The LWG preferred the -former for consistency.

- - - - -
-

211. operator>>(istream&, string&) doesn't set failbit

-

Section: 21.3.8.9 [string.io] Status: TC - Submitter: Scott Snyder Date: 2000-02-04

-

View all other issues in [string.io].

-

View all issues with TC status.

-

Discussion:

-

The description of the stream extraction operator for std::string (section -21.3.7.9 [lib.string.io]) does not contain a requirement that failbit be set in -the case that the operator fails to extract any characters from the input -stream.

-

This implies that the typical construction

-
-
std::istream is;
-std::string str;
-...
-while (is >> str) ... ;
-
-

(which tests failbit) is not required to terminate at EOF.

-

Furthermore, this is inconsistent with other extraction operators, -which do include this requirement. (See sections 27.6.1.2 [istream.formatted] and 27.6.1.3 [istream.unformatted]), where this -requirement is present, either explicitly or implicitly, for the -extraction operators. It is also present explicitly in the description -of getline (istream&, string&, charT) in section 21.3.8.9 [string.io] paragraph 8.)

- - -

Proposed resolution:

-

Insert new paragraph after paragraph 2 in section 21.3.8.9 [string.io]:

-
- -

If the function extracts no characters, it calls -is.setstate(ios::failbit) which may throw ios_base::failure -(27.4.4.3).

-
- - - - -
-

212. Empty range behavior unclear for several algorithms

-

Section: 25.3.7 [alg.min.max] Status: TC - Submitter: Nico Josuttis Date: 2000-02-26

-

View all other issues in [alg.min.max].

-

View all issues with TC status.

-

Discussion:

-

The standard doesn't specify what min_element() and max_element() shall -return if the range is empty (first equals last). The usual implementations -return last. This problem seems also apply to partition(), stable_partition(), -next_permutation(), and prev_permutation().

- - -

Proposed resolution:

-

In 25.3.7 [alg.min.max] - Minimum and maximum, paragraphs 7 and -9, append: Returns last if first==last.

- - -

Rationale:

-

The LWG looked in some detail at all of the above mentioned -algorithms, but believes that except for min_element() and -max_element() it is already clear that last is returned if first == -last.

- - - - -
-

214. set::find() missing const overload

-

Section: 23.3.3 [set], 23.3.4 [multiset] Status: WP - Submitter: Judy Ward Date: 2000-02-28

-

View all other issues in [set].

-

View all issues with WP status.

-

Duplicate of: 450

-

Discussion:

-

The specification for the associative container requirements in -Table 69 state that the find member function should "return -iterator; const_iterator for constant a". The map and multimap -container descriptions have two overloaded versions of find, but set -and multiset do not, all they have is:

-
-
iterator find(const key_type & x) const;
-
- - -

Proposed resolution:

-

Change the prototypes for find(), lower_bound(), upper_bound(), and -equal_range() in section 23.3.3 [set] and section 23.3.4 [multiset] to each have two overloads:

-
-
iterator find(const key_type & x);
-const_iterator find(const key_type & x) const;
-
iterator lower_bound(const key_type & x);
-const_iterator lower_bound(const key_type & x) const;
-
iterator upper_bound(const key_type & x);
-const_iterator upper_bound(const key_type & x) const;
-
pair<iterator, iterator> equal_range(const key_type & x);
-pair<const_iterator, const_iterator> equal_range(const key_type & x) const;
-
- -

[Tokyo: At the request of the LWG, Judy Ward provided wording -extending the proposed resolution to lower_bound, upper_bound, and -equal_range.]

- - - - - - -
-

217. Facets example (Classifying Japanese characters) contains errors

-

Section: 22.2.8 [facets.examples] Status: TC - Submitter: Martin Sebor Date: 2000-02-29

-

View all other issues in [facets.examples].

-

View all issues with TC status.

-

Discussion:

-

The example in 22.2.8, paragraph 11 contains the following errors:

-

1) The member function `My::JCtype::is_kanji()' is non-const; the function -must be const in order for it to be callable on a const object (a reference to -which which is what std::use_facet<>() returns).

-

2) In file filt.C, the definition of `JCtype::id' must be qualified with the -name of the namespace `My'.

-

3) In the definition of `loc' and subsequently in the call to use_facet<>() -in main(), the name of the facet is misspelled: it should read `My::JCtype' -rather than `My::JCType'.

- - -

Proposed resolution:

-

Replace the "Classifying Japanese characters" example in 22.2.8, -paragraph 11 with the following:

-
#include <locale>
-
namespace My {
-    using namespace std;
-    class JCtype : public locale::facet {
-    public:
-        static locale::id id;     //  required for use as a new locale facet
-        bool is_kanji (wchar_t c) const;
-        JCtype() {}
-    protected:
-        ~JCtype() {}
-    };
-}
-
//  file:  filt.C
-#include <iostream>
-#include <locale>
-#include "jctype"                 //  above
-std::locale::id My::JCtype::id;   //  the static  JCtype  member
-declared above.
-
int main()
-{
-    using namespace std;
-    typedef ctype<wchar_t> wctype;
-    locale loc(locale(""),              //  the user's preferred locale...
-               new My::JCtype);         //  and a new feature ...
-    wchar_t c = use_facet<wctype>(loc).widen('!');
-    if (!use_facet<My::JCtype>(loc).is_kanji(c))
-        cout << "no it isn't!" << endl;
-    return 0;
-}
- - - - -
-

220. ~ios_base() usage valid?

-

Section: 27.4.2.7 [ios.base.cons] Status: TC - Submitter: Jonathan Schilling, Howard Hinnant Date: 2000-03-13

-

View all issues with TC status.

-

Discussion:

-

The pre-conditions for the ios_base destructor are described in 27.4.2.7 -paragraph 2:

-
-

Effects: Destroys an object of class ios_base. Calls each registered - callback pair (fn,index) (27.4.2.6) as (*fn)(erase_event,*this,index) at such - time that any ios_base member function called from within fn has well defined - results.

-
-

But what is not clear is: If no callback functions were ever registered, does -it matter whether the ios_base members were ever initialized?

-

For instance, does this program have defined behavior:

-
-
#include <ios>
-
class D : public std::ios_base { };
-
int main() { D d; }
-
-

It seems that registration of a callback function would surely affect the -state of an ios_base. That is, when you register a callback function with an -ios_base, the ios_base must record that fact somehow.

-

But if after construction the ios_base is in an indeterminate state, and that -state is not made determinate before the destructor is called, then how would -the destructor know if any callbacks had indeed been registered? And if the -number of callbacks that had been registered is indeterminate, then is not the -behavior of the destructor undefined?

-

By comparison, the basic_ios class description in 27.4.4.1 paragraph 2 makes -it explicit that destruction before initialization results in undefined -behavior.

- - -

Proposed resolution:

-

Modify 27.4.2.7 paragraph 1 from

-
-

Effects: Each ios_base member has an indeterminate value after - construction.

-
-

to

-
-

Effects: Each ios_base member has an indeterminate -value after construction. These members must be initialized by calling -basic_ios::init. If an ios_base object is destroyed before these -initializations have taken place, the behavior is undefined.

-
- - - - -
-

221. num_get<>::do_get stage 2 processing broken

-

Section: 22.2.2.1.2 [facet.num.get.virtuals] Status: WP - Submitter: Matt Austern Date: 2000-03-14

-

View other active issues in [facet.num.get.virtuals].

-

View all other issues in [facet.num.get.virtuals].

-

View all issues with WP status.

-

Discussion:

-

Stage 2 processing of numeric conversion is broken.

- -

Table 55 in 22.2.2.1.2 says that when basefield is 0 the integral -conversion specifier is %i. A %i specifier determines a number's base -by its prefix (0 for octal, 0x for hex), so the intention is clearly -that a 0x prefix is allowed. Paragraph 8 in the same section, -however, describes very precisely how characters are processed. (It -must be done "as if" by a specified code fragment.) That -description does not allow a 0x prefix to be recognized.

- -

Very roughly, stage 2 processing reads a char_type ct. It converts -ct to a char, not by using narrow but by looking it up in a -translation table that was created by widening the string literal -"0123456789abcdefABCDEF+-". The character "x" is -not found in that table, so it can't be recognized by stage 2 -processing.

- - -

Proposed resolution:

-

In 22.2.2.1.2 paragraph 8, replace the line:

-
-
static const char src[] = "0123456789abcdefABCDEF+-";
-
-

with the line:

-
-
static const char src[] = "0123456789abcdefxABCDEFX+-";
-
- - -

Rationale:

-

If we're using the technique of widening a string literal, the -string literal must contain every character we wish to recognize. -This technique has the consequence that alternate representations -of digits will not be recognized. This design decision was made -deliberately, with full knowledge of that limitation.

- - - - - -
-

222. Are throw clauses necessary if a throw is already implied by the effects clause?

-

Section: 17.3.1.3 [structure.specifications] Status: TC - Submitter: Judy Ward Date: 2000-03-17

-

View all other issues in [structure.specifications].

-

View all issues with TC status.

-

Discussion:

-

Section 21.3.6.8 describes the basic_string::compare function this way:

-
-
21.3.6.8 - basic_string::compare [lib.string::compare]
-
-int compare(size_type pos1, size_type n1,
-                const basic_string<charT,traits,Allocator>&  str ,
-                size_type  pos2 , size_type  n2 ) const;
-
--4- Returns: 
-
-    basic_string<charT,traits,Allocator>(*this,pos1,n1).compare(
-                 basic_string<charT,traits,Allocator>(str,pos2,n2)) .
-
-

and the constructor that's implicitly called by the above is -defined to throw an out-of-range exception if pos > str.size(). See -section 21.3.1 [string.require] paragraph 4.

- -

On the other hand, the compare function descriptions themselves don't have -"Throws: " clauses and according to 17.3.1.3, paragraph 3, elements -that do not apply to a function are omitted.

-

So it seems there is an inconsistency in the standard -- are the -"Effects" clauses correct, or are the "Throws" clauses -missing?

- - -

Proposed resolution:

-

In 17.3.1.3 [structure.specifications] paragraph 3, the footnote 148 attached to -the sentence "Descriptions of function semantics contain the -following elements (as appropriate):", insert the word -"further" so that the foot note reads:

-
-

To save space, items that do not apply to a function are - omitted. For example, if a function does not specify any further - preconditions, there will be no "Requires" paragraph.

-
- - -

Rationale:

-

The standard is somewhat inconsistent, but a failure to note a -throw condition in a throws clause does not grant permission not to -throw. The inconsistent wording is in a footnote, and thus -non-normative. The proposed resolution from the LWG clarifies the -footnote.

- - - - -
-

223. reverse algorithm should use iter_swap rather than swap

-

Section: 25.2.10 [alg.reverse] Status: TC - Submitter: Dave Abrahams Date: 2000-03-21

-

View all issues with TC status.

-

Discussion:

-

Shouldn't the effects say "applies iter_swap to all pairs..."?

- - -

Proposed resolution:

-

In 25.2.10 [alg.reverse], replace:

-

- Effects: For each non-negative integer i <= (last - first)/2, - applies swap to all pairs of iterators first + i, (last - i) - 1. -

-

with:

-

- Effects: For each non-negative integer i <= (last - first)/2, - applies iter_swap to all pairs of iterators first + i, (last - i) - 1. -

- - - - -
-

224. clear() complexity for associative containers refers to undefined N

-

Section: 23.1.2 [associative.reqmts] Status: TC - Submitter: Ed Brey Date: 2000-03-23

-

View all other issues in [associative.reqmts].

-

View all issues with TC status.

-

Discussion:

-

In the associative container requirements table in 23.1.2 paragraph 7, -a.clear() has complexity "log(size()) + N". However, the meaning of N -is not defined.

- - -

Proposed resolution:

-

In the associative container requirements table in 23.1.2 paragraph -7, the complexity of a.clear(), change "log(size()) + N" to -"linear in size()".

- - -

Rationale:

-

It's the "log(size())", not the "N", that is in -error: there's no difference between O(N) and O(N + -log(N)). The text in the standard is probably an incorrect -cut-and-paste from the range version of erase.

- - - - -
-

225. std:: algorithms use of other unqualified algorithms

-

Section: 17.4.4.3 [global.functions] Status: WP - Submitter: Dave Abrahams Date: 2000-04-01

-

View all other issues in [global.functions].

-

View all issues with WP status.

-

Discussion:

-

Are algorithms in std:: allowed to use other algorithms without qualification, so functions in -user namespaces might be found through Koenig lookup?

-

For example, a popular standard library implementation includes this -implementation of std::unique:

-
-
namespace std {
-    template <class _ForwardIter>
-    _ForwardIter unique(_ForwardIter __first, _ForwardIter __last) {
-      __first = adjacent_find(__first, __last);
-      return unique_copy(__first, __last, __first);
-    }
-    }
-
-

Imagine two users on opposite sides of town, each using unique on his own -sequences bounded by my_iterators . User1 looks at his standard library -implementation and says, "I know how to implement a more efficient -unique_copy for my_iterators", and writes:

-
-
namespace user1 {
-    class my_iterator;
-    // faster version for my_iterator
-    my_iterator unique_copy(my_iterator, my_iterator, my_iterator);
-    }
-
-

user1::unique_copy() is selected by Koenig lookup, as he intended.

-

User2 has other needs, and writes:

-
-
namespace user2 {
-    class my_iterator;
-    // Returns true iff *c is a unique copy of *a and *b.
-    bool unique_copy(my_iterator a, my_iterator b, my_iterator c);
-    }
-
-

User2 is shocked to find later that his fully-qualified use of -std::unique(user2::my_iterator, user2::my_iterator, user2::my_iterator) fails to -compile (if he's lucky). Looking in the standard, he sees the following Effects -clause for unique():

-
-

Effects: Eliminates all but the first element from every consecutive group - of equal elements referred to by the iterator i in the range [first, last) for - which the following corresponding conditions hold: *i == *(i - 1) or pred(*i, - *(i - 1)) != false

-
-

The standard gives user2 absolutely no reason to think he can interfere with -std::unique by defining names in namespace user2. His standard library has been -built with the template export feature, so he is unable to inspect the -implementation. User1 eventually compiles his code with another compiler, and -his version of unique_copy silently stops being called. Eventually, he realizes -that he was depending on an implementation detail of his library and had no -right to expect his unique_copy() to be called portably.

-

On the face of it, and given above scenario, it may seem obvious that the -implementation of unique() shown is non-conforming because it uses unique_copy() -rather than ::std::unique_copy(). Most standard library implementations, -however, seem to disagree with this notion.

-

[Tokyo:  Steve Adamczyk from -the core working group indicates that "std::" is sufficient;  -leading "::" qualification is not required because any namespace -qualification is sufficient to suppress Koenig lookup.]

- - -

Proposed resolution:

-

Add a paragraph and a note at the end of -17.4.4.3 [global.functions]:

-
- -

Unless otherwise specified, no global or non-member function in the -standard library shall use a function from another namespace which is -found through argument-dependent name lookup (3.4.2 [basic.lookup.argdep]).

- -

[Note: the phrase "unless otherwise specified" is intended to -allow Koenig lookup in cases like that of ostream_iterators:
- -
- Effects:

-
-

*out_stream << value;
- if(delim != 0) *out_stream << delim;
- return (*this);

-

--end note]

-
-
- -

[Tokyo: The LWG agrees that this is a defect in the standard, but -is as yet unsure if the proposed resolution is the best -solution. Furthermore, the LWG believes that the same problem of -unqualified library names applies to wording in the standard itself, -and has opened issue 229 accordingly. Any resolution of -issue 225 should be coordinated with the resolution of -issue 229.]

- - -

[Toronto: The LWG is not sure if this is a defect in the -standard. Most LWG members believe that an implementation of -std::unique like the one quoted in this issue is already -illegal, since, under certain circumstances, its semantics are not -those specified in the standard. The standard's description of -unique does not say that overloading adjacent_find -should have any effect.]

- - -

[Curaçao: An LWG-subgroup spent an afternoon working on issues -225, 226, and 229. Their conclusion was that the issues should be -separated into an LWG portion (Howard's paper, N1387=02-0045), and a -EWG portion (Dave will write a proposal). The LWG and EWG had -(separate) discussions of this plan the next day. The proposed -resolution for this issue is in accordance with Howard's paper.]

- - - - -

Rationale:

-

It could be argued that this proposed isn't strictly necessary, - that the Standard doesn't grant implementors license to write a - standard function that behaves differently than specified in the - Standard just because of an unrelated user-defined name in some - other namespace. However, this is at worst a clarification. It is - surely right that algorithsm shouldn't pick up random names, that - user-defined names should have no effect unless otherwise specified. - Issue 226 deals with the question of when it is - appropriate for the standard to explicitly specify otherwise.

- - - - - -
-

226. User supplied specializations or overloads of namespace std function templates

-

Section: 17.4.3.1 [reserved.names] Status: WP - Submitter: Dave Abrahams Date: 2000-04-01

-

View all other issues in [reserved.names].

-

View all issues with WP status.

-

Discussion:

-

The issues are: 

-

1. How can a 3rd party library implementor (lib1) write a version of a standard -algorithm which is specialized to work with his own class template? 

-

2. How can another library implementor (lib2) write a generic algorithm which -will take advantage of the specialized algorithm in lib1?

-

This appears to be the only viable answer under current language rules:

-
-
namespace lib1
-{
-    // arbitrary-precision numbers using T as a basic unit
-    template <class T>
-    class big_num { //...
-    };
-    
-
    // defining this in namespace std is illegal (it would be an
-    // overload), so we hope users will rely on Koenig lookup
-    template <class T>
-    void swap(big_int<T>&, big_int<T>&);
-}
-
#include <algorithm>
-namespace lib2
-{
-    template <class T>
-    void generic_sort(T* start, T* end)
-    {
-            ...
-        // using-declaration required so we can work on built-in types
-        using std::swap;
-        // use Koenig lookup to find specialized algorithm if available
-        swap(*x, *y);
-    }
-}
-
-

This answer has some drawbacks. First of all, it makes writing lib2 difficult -and somewhat slippery. The implementor needs to remember to write the -using-declaration, or generic_sort will fail to compile when T is a built-in -type. The second drawback is that the use of this style in lib2 effectively -"reserves" names in any namespace which defines types which may -eventually be used with lib2. This may seem innocuous at first when applied to -names like swap, but consider more ambiguous names like unique_copy() instead. -It is easy to imagine the user wanting to define these names differently in his -own namespace. A definition with semantics incompatible with the standard -library could cause serious problems (see issue 225).

-

Why, you may ask, can't we just partially specialize std::swap()? It's -because the language doesn't allow for partial specialization of function -templates. If you write:

-
-
namespace std
-{
-    template <class T>
-    void swap(lib1::big_int<T>&, lib1::big_int<T>&);
-}
-
-

You have just overloaded std::swap, which is illegal under the current -language rules. On the other hand, the following full specialization is legal:

-
-
namespace std
-{
-    template <>
-    void swap(lib1::other_type&, lib1::other_type&);
-}
-
- -

This issue reflects concerns raised by the "Namespace issue -with specialized swap" thread on comp.lang.c++.moderated. A -similar set of concerns was earlier raised on the boost.org mailing -list and the ACCU-general mailing list. Also see library reflector -message c++std-lib-7354.

- -

-J. C. van Winkel points out (in c++std-lib-9565) another unexpected -fact: it's impossible to output a container of std::pair's using copy -and an ostream_iterator, as long as both pair-members are built-in or -std:: types. That's because a user-defined operator<< for (for -example) std::pair<const std::string, int> will not be found: -lookup for operator<< will be performed only in namespace std. -Opinions differed on whether or not this was a defect, and, if so, -whether the defect is that something is wrong with user-defined -functionality and std, or whether it's that the standard library does -not provide an operator<< for std::pair<>. -

- - - -

Proposed resolution:

- -

Adopt the wording proposed in Howard Hinnant's paper - N1523=03-0106, "Proposed Resolution To LWG issues 225, 226, 229".

- - -

[Tokyo: Summary, "There is no conforming way to extend -std::swap for user defined templates."  The LWG agrees that -there is a problem. Would like more information before -proceeding. This may be a core issue. Core issue 229 has been opened -to discuss the core aspects of this problem. It was also noted that -submissions regarding this issue have been received from several -sources, but too late to be integrated into the issues list. -]

- - -

[Post-Tokyo: A paper with several proposed resolutions, -J16/00-0029==WG21/N1252, "Shades of namespace std functions -" by Alan Griffiths, is in the Post-Tokyo mailing. It -should be considered a part of this issue.]

- - -

[Toronto: Dave Abrahams and Peter Dimov have proposed a -resolution that involves core changes: it would add partial -specialization of function template. The Core Working Group is -reluctant to add partial specialization of function templates. It is -viewed as a large change, CWG believes that proposal presented leaves -some syntactic issues unanswered; if the CWG does add partial -specialization of function templates, it wishes to develop its own -proposal. The LWG continues to believe that there is a serious -problem: there is no good way for users to force the library to use -user specializations of generic standard library functions, and in -certain cases (e.g. transcendental functions called by -valarray and complex) this is important. Koenig -lookup isn't adequate, since names within the library must be -qualified with std (see issue 225), specialization doesn't -work (we don't have partial specialization of function templates), and -users aren't permitted to add overloads within namespace std. -]

- - -

[Copenhagen: Discussed at length, with no consensus. Relevant -papers in the pre-Copenhagen mailing: N1289, N1295, N1296. Discussion -focused on four options. (1) Relax restrictions on overloads within -namespace std. (2) Mandate that the standard library use unqualified -calls for swap and possibly other functions. (3) Introduce -helper class templates for swap and possibly other functions. -(4) Introduce partial specialization of function templates. Every -option had both support and opposition. Straw poll (first number is -support, second is strongly opposed): (1) 6, 4; (2) 6, 7; (3) 3, 8; -(4) 4, 4.]

- - -

[Redmond: Discussed, again no consensus. Herb presented an -argument that a user who is defining a type T with an -associated swap should not be expected to put that -swap in namespace std, either by overloading or by partial -specialization. The argument is that swap is part of -T's interface, and thus should to in the same namespace as -T and only in that namespace. If we accept this argument, -the consequence is that standard library functions should use -unqualified call of swap. (And which other functions? Any?) -A small group (Nathan, Howard, Jeremy, Dave, Matt, Walter, Marc) will -try to put together a proposal before the next meeting.]

- - -

[Curaçao: An LWG-subgroup spent an afternoon working on issues -225, 226, and 229. Their conclusion was that the issues should be -separated into an LWG portion (Howard's paper, N1387=02-0045), and a -EWG portion (Dave will write a proposal). The LWG and EWG had -(separate) discussions of this plan the next day. The proposed -resolution is the one proposed by Howard.]

- - -

[Santa Cruz: the LWG agreed with the general direction of - Howard's paper, N1387. (Roughly: Koenig lookup is disabled unless - we say otherwise; this issue is about when we do say otherwise.) - However, there were concerns about wording. Howard will provide new - wording. Bill and Jeremy will review it.]

- - -

[Kona: Howard proposed the new wording. The LWG accepted his - proposed resolution.]

- - - - -

Rationale:

-

Informally: introduce a Swappable concept, and specify that the - value types of the iterators passed to certain standard algorithms - (such as iter_swap, swap_ranges, reverse, rotate, and sort) conform - to that concept. The Swappable concept will make it clear that - these algorithms use unqualified lookup for the calls - to swap. Also, in 26.5.3.3 [valarray.transcend] paragraph 1, - state that the valarray transcendentals use unqualified lookup.

- - - - - -
-

227. std::swap() should require CopyConstructible or DefaultConstructible arguments

-

Section: 25.2.3 [alg.swap] Status: TC - Submitter: Dave Abrahams Date: 2000-04-09

-

View all other issues in [alg.swap].

-

View all issues with TC status.

-

Discussion:

-

25.2.2 reads:

-
-

template<class T> void swap(T& a, T& b);
-
- Requires: Type T is Assignable (_lib.container.requirements_).
- Effects: Exchanges values stored in two locations.

-
-

The only reasonable** generic implementation of swap requires construction of a - new temporary copy of one of its arguments:

-
-
template<class T> void swap(T& a, T& b);
-  {
-      T tmp(a);
-      a = b;
-      b = tmp;
-  }
-
-

But a type which is only Assignable cannot be swapped by this implementation.

-

**Yes, there's also an unreasonable implementation which would require T to be - DefaultConstructible instead of CopyConstructible. I don't think this is worthy - of consideration:

-
-
template<class T> void swap(T& a, T& b);
-{
-    T tmp;
-    tmp = a;
-    a = b;
-    b = tmp;
-}
-
- - -

Proposed resolution:

-

Change 25.2.2 paragraph 1 from:

-
-

Requires: Type T is Assignable (23.1).

-
-

to:

-
-

Requires: Type T is CopyConstructible (20.1.3) and Assignable (23.1)

-
- - - - - -
-

228. Incorrect specification of "..._byname" facets

-

Section: 22.2 [locale.categories] Status: WP - Submitter: Dietmar Kühl Date: 2000-04-20

-

View other active issues in [locale.categories].

-

View all other issues in [locale.categories].

-

View all issues with WP status.

-

Discussion:

-

The sections 22.2.1.2 [locale.ctype.byname], 22.2.1.5 -[locale.codecvt.byname], -sref ref="22.2.1.6", 22.2.3.2 [locale.numpunct.byname], 22.2.4.2 -[locale.collate.byname], 22.2.5.4 [locale.time.put.byname], 22.2.6.4 -[locale.moneypunct.byname], and 22.2.7.2 [locale.messages.byname] -overspecify the -definitions of the "..._byname" classes by listing a bunch -of virtual functions. At the same time, no semantics of these -functions are defined. Real implementations do not define these -functions because the functional part of the facets is actually -implemented in the corresponding base classes and the constructor of -the "..._byname" version just provides suitable date used by -these implementations. For example, the 'numpunct' methods just return -values from a struct. The base class uses a statically initialized -struct while the derived version reads the contents of this struct -from a table. However, no virtual function is defined in -'numpunct_byname'.

- -

For most classes this does not impose a problem but specifically -for 'ctype' it does: The specialization for 'ctype_byname<char>' -is required because otherwise the semantics would change due to the -virtual functions defined in the general version for 'ctype_byname': -In 'ctype<char>' the method 'do_is()' is not virtual but it is -made virtual in both 'ctype<cT>' and 'ctype_byname<cT>'. -Thus, a class derived from 'ctype_byname<char>' can tell whether -this class is specialized or not under the current specification: -Without the specialization, 'do_is()' is virtual while with -specialization it is not virtual.

- - -

Proposed resolution:

-

  Change section 22.2.1.2 (lib.locale.ctype.byname) to become:

-
     namespace std {
-       template <class charT>
-       class ctype_byname : public ctype<charT> {
-       public:
-         typedef ctype<charT>::mask mask;
-         explicit ctype_byname(const char*, size_t refs = 0);
-       protected:
-        ~ctype_byname();             //  virtual
-       };
-     }
-

  Change section 22.2.1.6 (lib.locale.codecvt.byname) to become:

-
    namespace std {
-      template <class internT, class externT, class stateT>
-      class codecvt_byname : public codecvt<internT, externT, stateT> {
-      public:
-       explicit codecvt_byname(const char*, size_t refs = 0);
-      protected:
-      ~codecvt_byname();             //  virtual
-       };
-     }
-
-

  Change section 22.2.3.2 (lib.locale.numpunct.byname) to become:

-
     namespace std {
-       template <class charT>
-       class numpunct_byname : public numpunct<charT> {
-     //  this class is specialized for  char  and  wchar_t.
-       public:
-         typedef charT                char_type;
-         typedef basic_string<charT>  string_type;
-         explicit numpunct_byname(const char*, size_t refs = 0);
-       protected:
-        ~numpunct_byname();          //  virtual
-       };
-     }
-

  Change section 22.2.4.2 (lib.locale.collate.byname) to become:

-
     namespace std {
-       template <class charT>
-       class collate_byname : public collate<charT> {
-       public:
-         typedef basic_string<charT> string_type;
-         explicit collate_byname(const char*, size_t refs = 0);
-       protected:
-        ~collate_byname();           //  virtual
-       };
-     }
-

  Change section 22.2.5.2 (lib.locale.time.get.byname) to become:

-
     namespace std {
-       template <class charT, class InputIterator = istreambuf_iterator<charT> >
-       class time_get_byname : public time_get<charT, InputIterator> {
-       public:
-         typedef time_base::dateorder dateorder;
-         typedef InputIterator        iter_type
-
         explicit time_get_byname(const char*, size_t refs = 0);
-       protected:
-        ~time_get_byname();          //  virtual
-       };
-     }
-

  Change section 22.2.5.4 (lib.locale.time.put.byname) to become:

-
     namespace std {
-       template <class charT, class OutputIterator = ostreambuf_iterator<charT> >
-       class time_put_byname : public time_put<charT, OutputIterator>
-       {
-       public:
-         typedef charT          char_type;
-         typedef OutputIterator iter_type;
-
         explicit time_put_byname(const char*, size_t refs = 0);
-       protected:
-        ~time_put_byname();          //  virtual
-       };
-     }"
-

  Change section 22.2.6.4 (lib.locale.moneypunct.byname) to become:

-
     namespace std {
-       template <class charT, bool Intl = false>
-       class moneypunct_byname : public moneypunct<charT, Intl> {
-       public:
-         typedef money_base::pattern pattern;
-         typedef basic_string<charT> string_type;
-
         explicit moneypunct_byname(const char*, size_t refs = 0);
-       protected:
-        ~moneypunct_byname();        //  virtual
-       };
-     }
-

  Change section 22.2.7.2 (lib.locale.messages.byname) to become:

-
     namespace std {
-       template <class charT>
-       class messages_byname : public messages<charT> {
-       public:
-         typedef messages_base::catalog catalog;
-         typedef basic_string<charT>    string_type;
-
         explicit messages_byname(const char*, size_t refs = 0);
-       protected:
-        ~messages_byname();          //  virtual
-       };
-     }
-

Remove section 22.2.1.4 [locale.codecvt] completely (because in -this case only those members are defined to be virtual which are -defined to be virtual in 'ctype<cT>'.)

- -

[Post-Tokyo: Dietmar Kühl submitted this issue at the request of -the LWG to solve the underlying problems raised by issue 138.]

- - -

[Copenhagen: proposed resolution was revised slightly, to remove -three last virtual functions from messages_byname.]

- - - - - - - -
-

229. Unqualified references of other library entities

-

Section: 17.4.1.1 [contents] Status: WP - Submitter: Steve Clamage Date: 2000-04-19

-

View all issues with WP status.

-

Discussion:

-

Throughout the library chapters, the descriptions of library entities refer -to other library entities without necessarily qualifying the names.

- -

For example, section 25.2.2 "Swap" describes the effect of -swap_ranges in terms of the unqualified name "swap". This section -could reasonably be interpreted to mean that the library must be implemented so -as to do a lookup of the unqualified name "swap", allowing users to -override any ::std::swap function when Koenig lookup applies.

- -

Although it would have been best to use explicit qualification with -"::std::" throughout, too many lines in the standard would have to be -adjusted to make that change in a Technical Corrigendum.

- -

Issue 182, which addresses qualification of -size_t, is a special case of this. -

- - -

Proposed resolution:

-

To section 17.4.1.1 "Library contents" Add the following paragraph:

-
-

Whenever a name x defined in the standard library is mentioned, the name x - is assumed to be fully qualified as ::std::x, unless explicitly described - otherwise. For example, if the Effects section for library function F is - described as calling library function G, the function ::std::G is meant.

-
- -

[Post-Tokyo: Steve Clamage submitted this issue at the request of -the LWG to solve a problem in the standard itself similar to the -problem within implementations of library identified by issue 225. Any resolution of issue 225 should be -coordinated with the resolution of this issue.]

- - -

[post-Toronto: Howard is undecided about whether it is -appropriate for all standard library function names referred to in -other standard library functions to be explicitly qualified by -std: it is common advice that users should define global -functions that operate on their class in the same namespace as the -class, and this requires argument-dependent lookup if those functions -are intended to be called by library code. Several LWG members are -concerned that valarray appears to require argument-dependent lookup, -but that the wording may not be clear enough to fall under -"unless explicitly described otherwise".]

- - -

[Curaçao: An LWG-subgroup spent an afternoon working on issues -225, 226, and 229. Their conclusion was that the issues should be -separated into an LWG portion (Howard's paper, N1387=02-0045), and a -EWG portion (Dave will write a proposal). The LWG and EWG had -(separate) discussions of this plan the next day. This paper resolves -issues 225 and 226. In light of that resolution, the proposed -resolution for the current issue makes sense.]

- - - - - - - -
-

230. Assignable specified without also specifying CopyConstructible

-

Section: 17 [library] Status: WP - Submitter: Beman Dawes Date: 2000-04-26

-

View all other issues in [library].

-

View all issues with WP status.

-

Discussion:

-

Issue 227 identified an instance (std::swap) where -Assignable was specified without also specifying -CopyConstructible. The LWG asked that the standard be searched to -determine if the same defect existed elsewhere.

- -

There are a number of places (see proposed resolution below) where -Assignable is specified without also specifying -CopyConstructible. There are also several cases where both are -specified. For example, 26.4.1 [rand.req].

- - -

Proposed resolution:

-

In 23.1 [container.requirements] table 65 for value_type: -change "T is Assignable" to "T is CopyConstructible and -Assignable" -

- -

In 23.1.2 [associative.reqmts] table 69 X::key_type; change -"Key is Assignable" to "Key is -CopyConstructible and Assignable"
-

- -

In 24.1.2 [output.iterators] paragraph 1, change: -

-
-

A class or a built-in type X satisfies the requirements of an -output iterator if X is an Assignable type (23.1) and also the -following expressions are valid, as shown in Table 73: -

-
-

to: -

-
-

A class or a built-in type X satisfies the requirements of an -output iterator if X is a CopyConstructible (20.1.3) and Assignable -type (23.1) and also the following expressions are valid, as shown in -Table 73: -

-
- -

[Post-Tokyo: Beman Dawes submitted this issue at the request of -the LWG. He asks that the 25.2.5 [alg.replace] and 25.2.6 [alg.fill] changes be studied carefully, as it is not clear that -CopyConstructible is really a requirement and may be -overspecification.]

- - -

[Portions of the resolution for issue 230 have been superceded by -the resolution of issue 276.]

- - - - -

Rationale:

-

The original proposed resolution also included changes to input -iterator, fill, and replace. The LWG believes that those changes are -not necessary. The LWG considered some blanket statement, where an -Assignable type was also required to be Copy Constructible, but -decided against this because fill and replace really don't require the -Copy Constructible property.

- - - - -
-

231. Precision in iostream?

-

Section: 22.2.2.2.2 [facet.num.put.virtuals] Status: WP - Submitter: James Kanze, Stephen Clamage Date: 2000-04-25

-

View all other issues in [facet.num.put.virtuals].

-

View all issues with WP status.

-

Discussion:

-

What is the following program supposed to output?

-
#include <iostream>
-
-    int
-    main()
-    {
-        std::cout.setf( std::ios::scientific , std::ios::floatfield ) ;
-        std::cout.precision( 0 ) ;
-        std::cout << 1.00 << '\n' ;
-        return 0 ;
-    }
-

From my C experience, I would expect "1e+00"; this is what -printf("%.0e" , 1.00 ); does. G++ outputs -"1.000000e+00".

- -

The only indication I can find in the standard is 22.2.2.2.2/11, -where it says "For conversion from a floating-point type, if -(flags & fixed) != 0 or if str.precision() > 0, then -str.precision() is specified in the conversion specification." -This is an obvious error, however, fixed is not a mask for a field, -but a value that a multi-bit field may take -- the results of and'ing -fmtflags with ios::fixed are not defined, at least not if -ios::scientific has been set. G++'s behavior corresponds to what might -happen if you do use (flags & fixed) != 0 with a typical -implementation (floatfield == 3 << something, fixed == 1 -<< something, and scientific == 2 << something).

- -

Presumably, the intent is either (flags & floatfield) != 0, or -(flags & floatfield) == fixed; the first gives something more or -less like the effect of precision in a printf floating point -conversion. Only more or less, of course. In order to implement printf -formatting correctly, you must know whether the precision was -explicitly set or not. Say by initializing it to -1, instead of 6, and -stating that for floating point conversions, if precision < -1, 6 -will be used, for fixed point, if precision < -1, 1 will be used, -etc. Plus, of course, if precision == 0 and flags & floatfield == -0, 1 should be = used. But it probably isn't necessary to emulate all -of the anomalies of printf:-).

- - -

Proposed resolution:

-

-Replace 22.2.2.2.2 [facet.num.put.virtuals], paragraph 11, with the following -sentence: -

-

-For conversion from a floating-point type, -str.precision() is specified in the conversion -specification. -

- - -

Rationale:

-

The floatfield determines whether numbers are formatted as if -with %f, %e, or %g. If the fixed bit is set, it's %f, -if scientific it's %e, and if both bits are set, or -neither, it's %g.

-

Turning to the C standard, a precision of 0 is meaningful -for %f and %e. For %g, precision 0 is taken to be the same as -precision 1.

-

The proposed resolution has the effect that if neither -fixed nor scientific is set we'll be -specifying a precision of 0, which will be internally -turned into 1. There's no need to call it out as a special -case.

-

The output of the above program will be "1e+00".

- -

[Post-Curaçao: Howard provided improved wording covering the case -where precision is 0 and mode is %g.]

- - - - - - - -
-

232. "depends" poorly defined in 17.4.3.1

-

Section: 17.4.3.1 [reserved.names] Status: WP - Submitter: Peter Dimov Date: 2000-04-18

-

View all other issues in [reserved.names].

-

View all issues with WP status.

-

Discussion:

-

17.4.3.1/1 uses the term "depends" to limit the set of allowed -specializations of standard templates to those that "depend on a -user-defined name of external linkage."

-

This term, however, is not adequately defined, making it possible to -construct a specialization that is, I believe, technically legal according to -17.4.3.1/1, but that specializes a standard template for a built-in type such as -'int'.

-

The following code demonstrates the problem:

-
-
#include <algorithm>
-
template<class T> struct X
-{
- typedef T type;
-};
-
namespace std
-{
- template<> void swap(::X<int>::type& i, ::X<int>::type& j);
-}
-
- - -

Proposed resolution:

-

Change "user-defined name" to "user-defined -type".

- - -

Rationale:

-

This terminology is used in section 2.5.2 and 4.1.1 of The C++ -Programming Language. It disallows the example in the issue, -since the underlying type itself is not user-defined. The only -possible problem I can see is for non-type templates, but there's no -possible way for a user to come up with a specialization for bitset, -for example, that might not have already been specialized by the -implementor?

- -

[Toronto: this may be related to issue 120.]

- - -

[post-Toronto: Judy provided the above proposed resolution and -rationale.]

- - - - - - -
-

233. Insertion hints in associative containers

-

Section: 23.1.2 [associative.reqmts] Status: WP - Submitter: Andrew Koenig Date: 2000-04-30

-

View all other issues in [associative.reqmts].

-

View all issues with WP status.

-

Duplicate of: 192, 246

-

Discussion:

-

-If mm is a multimap and p is an iterator -into the multimap, then mm.insert(p, x) inserts -x into mm with p as a hint as -to where it should go. Table 69 claims that the execution time is -amortized constant if the insert winds up taking place adjacent to -p, but does not say when, if ever, this is guaranteed to -happen. All it says it that p is a hint as to where to -insert. -

-

-The question is whether there is any guarantee about the relationship -between p and the insertion point, and, if so, what it -is. -

-

-I believe the present state is that there is no guarantee: The user -can supply p, and the implementation is allowed to -disregard it entirely. -

- -

Additional comments from Nathan:
- -The vote [in Redmond] was on whether to elaborately specify the use of -the hint, or to require behavior only if the value could be inserted -adjacent to the hint. I would like to ensure that we have a chance to -vote for a deterministic treatment: "before, if possible, otherwise -after, otherwise anywhere appropriate", as an alternative to the -proposed "before or after, if possible, otherwise [...]". -

- -

[Toronto: there was general agreement that this is a real defect: -when inserting an element x into a multiset that already contains -several copies of x, there is no way to know whether the hint will be -used. The proposed resolution was that the new element should always -be inserted as close to the hint as possible. So, for example, if -there is a subsequence of equivalent values, then providing a.begin() -as the hint means that the new element should be inserted before the -subsequence even if a.begin() is far away. JC van Winkel supplied -precise wording for this proposed resolution, and also for an -alternative resolution in which hints are only used when they are -adjacent to the insertion point.]

- - -

[Copenhagen: the LWG agreed to the original proposed resolution, -in which an insertion hint would be used even when it is far from the -insertion point. This was contingent on seeing a reference -implementation showing that it is possible to implement this -requirement without loss of efficiency. John Potter provided such a -reference implementation.]

- - -

[Redmond: The LWG was reluctant to adopt the proposal that -emerged from Copenhagen: it seemed excessively complicated, and went -beyond fixing the defect that we identified in Toronto. PJP provided -the new wording described in this issue. Nathan agrees that we -shouldn't adopt the more detailed semantics, and notes: "we know that -you can do it efficiently enough with a red-black tree, but there are -other (perhaps better) balanced tree techniques that might differ -enough to make the detailed semantics hard to satisfy."]

- - -

[Curaçao: Nathan should give us the alternative wording he -suggests so the LWG can decide between the two options.]

- - -

[Lillehammer: The LWG previously rejected the more detailed - semantics, because it seemed more loike a new feature than like - defect fixing. We're now more sympathetic to it, but we (especially - Bill) are still worried about performance. N1780 describes a naive - algorithm, but it's not clear whether there is a non-naive - implementation. Is it possible to implement this as efficently as - the current version of insert?]

- - -

[Post Lillehammer: -N1780 -updated in post meeting mailing with -feedback from Lillehammer with more information regarding performance. -]

- - -

[ -Batavia: -1780 -accepted with minor wording changes in the proposed wording (reflected in the -proposed resolution below). Concerns about the performance of the algorithm -were satisfactorily met by -1780. -371 already handles the stability of equal ranges -and so that part of the resolution from -1780 -is no longer needed (or reflected in the proposed wording below). -]

- - - - -

Proposed resolution:

- -

-Change the indicated rows of the "Associative container requirements" Table in -23.1.2 [associative.reqmts] to: -

- -

- - - - - - - - - - - - - -
Associative container requirements
expression return typeassertion/note
pre/post-condition
complexity
a_eq.insert(t)iterator -inserts t and returns the iterator pointing to the newly inserted -element. If a range containing elements equivalent to t exists in -a_eq, t is inserted at the end of that range. - -logarithmic -
a.insert(p,t)iterator -inserts t if and only if there is no element with key equivalent to the -key of t in containers with unique keys; always inserts t in containers -with equivalent keys. always returns the iterator pointing to the element with key -equivalent to the key of t. iterator p is a hint pointing to where -the insert should start to search. t is inserted as close as possible -to the position just prior to p. - -logarithmic in general, but amortized constant if t is inserted right after - before p. -
-
- - - - - - -
-

234. Typos in allocator definition

-

Section: 20.6.1.1 [allocator.members] Status: WP - Submitter: Dietmar Kühl Date: 2000-04-24

-

View all other issues in [allocator.members].

-

View all issues with WP status.

-

Discussion:

-

In paragraphs 12 and 13 the effects of construct() and -destruct() are described as returns but the functions actually -return void.

- - -

Proposed resolution:

-

Substitute "Returns" by "Effect".

- - - - -
-

235. No specification of default ctor for reverse_iterator

-

Section: 24.4.1.1 [reverse.iterator] Status: WP - Submitter: Dietmar Kühl Date: 2000-04-24

-

View all issues with WP status.

-

Discussion:

-

The declaration of reverse_iterator lists a default -constructor. However, no specification is given what this constructor -should do.

- - -

Proposed resolution:

-

In section 24.4.1.3.1 [reverse.iter.cons] add the following - paragraph:

-
-

reverse_iterator()

- -

Default initializes current. Iterator operations - applied to the resulting iterator have defined behavior if and - only if the corresponding operations are defined on a default - constructed iterator of type Iterator.

-
-

[pre-Copenhagen: Dietmar provide wording for proposed - resolution.]

- - - - - - -
-

237. Undefined expression in complexity specification

-

Section: 23.2.2.1 [deque.cons] Status: WP - Submitter: Dietmar Kühl Date: 2000-04-24

-

View all other issues in [deque.cons].

-

View all issues with WP status.

-

Discussion:

-

The complexity specification in paragraph 6 says that the complexity -is linear in first - last. Even if operator-() is -defined on iterators this term is in general undefined because it -would have to be last - first.

- - -

Proposed resolution:

-

Change paragraph 6 from

-

Linear in first - last.

-

to become

-

Linear in distance(first, last).

- - - - -
-

238. Contradictory results of stringbuf initialization.

-

Section: 27.7.1.1 [stringbuf.cons] Status: WP - Submitter: Dietmar Kühl Date: 2000-05-11

-

View all issues with WP status.

-

Discussion:

-

In 27.7.1.1 paragraph 4 the results of calling the constructor of -'basic_stringbuf' are said to be str() == str. This is fine -that far but consider this code:

- -
  std::basic_stringbuf<char> sbuf("hello, world", std::ios_base::openmode(0));
-  std::cout << "'" << sbuf.str() << "'\n";
-
- -

Paragraph 3 of 27.7.1.1 basically says that in this case neither -the output sequence nor the input sequence is initialized and -paragraph 2 of 27.7.1.2 basically says that str() either -returns the input or the output sequence. None of them is initialized, -ie. both are empty, in which case the return from str() is -defined to be basic_string<cT>().

- -

However, probably only test cases in some testsuites will detect this -"problem"...

- - -

Proposed resolution:

-

Remove 27.7.1.1 paragraph 4.

- - -

Rationale:

-

We could fix 27.7.1.1 paragraph 4, but there would be no point. If -we fixed it, it would say just the same thing as text that's already -in the standard.

- - - - -
-

239. Complexity of unique() and/or unique_copy incorrect

-

Section: 25.2.9 [alg.unique] Status: WP - Submitter: Angelika Langer Date: 2000-05-15

-

View all other issues in [alg.unique].

-

View all issues with WP status.

-

Discussion:

-

The complexity of unique and unique_copy are inconsistent with each -other and inconsistent with the implementations.  The standard -specifies:

- -

for unique():

- -

-3- Complexity: If the range (last - first) is not empty, exactly -(last - first) - 1 applications of the corresponding predicate, otherwise -no applications of the predicate.

- -

for unique_copy():

- -

-7- Complexity: Exactly last - first applications of the corresponding -predicate.

- -

-The implementations do it the other way round: unique() applies the -predicate last-first times and unique_copy() applies it last-first-1 -times.

- -

As both algorithms use the predicate for pair-wise comparison of -sequence elements I don't see a justification for unique_copy() -applying the predicate last-first times, especially since it is not -specified to which pair in the sequence the predicate is applied -twice.

- - -

Proposed resolution:

-

Change both complexity sections in 25.2.9 [alg.unique] to:

- -

Complexity: For nonempty ranges, exactly last - first - 1 -applications of the corresponding predicate.

- - - - - - -
-

240. Complexity of adjacent_find() is meaningless

-

Section: 25.1.5 [alg.adjacent.find] Status: WP - Submitter: Angelika Langer Date: 2000-05-15

-

View all issues with WP status.

-

Discussion:

-

The complexity section of adjacent_find is defective:

- -
-
template <class ForwardIterator>
-ForwardIterator adjacent_find(ForwardIterator first, ForwardIterator last
-                              BinaryPredicate pred);
-
- -

-1- Returns: The first iterator i such that both i and i + 1 are in -the range [first, last) for which the following corresponding -conditions hold: *i == *(i + 1), pred(*i, *(i + 1)) != false. Returns -last if no such iterator is found.

- -

-2- Complexity: Exactly find(first, last, value) - first applications -of the corresponding predicate. -

-
- -

In the Complexity section, it is not defined what "value" -is supposed to mean. My best guess is that "value" means an -object for which one of the conditions pred(*i,value) or -pred(value,*i) is true, where i is the iterator defined in the Returns -section. However, the value type of the input sequence need not be -equality-comparable and for this reason the term find(first, last, -value) - first is meaningless.

- -

A term such as find_if(first, last, bind2nd(pred,*i)) - first or -find_if(first, last, bind1st(pred,*i)) - first might come closer to -the intended specification. Binders can only be applied to function -objects that have the function call operator declared const, which is -not required of predicates because they can have non-const data -members. For this reason, a specification using a binder could only be -an "as-if" specification.

- - -

Proposed resolution:

-

Change the complexity section in 25.1.5 [alg.adjacent.find] to:

-

-For a nonempty range, exactly min((i - first) + 1, -(last - first) - 1) applications of the -corresponding predicate, where i is adjacent_find's -return value. -

- -

[Copenhagen: the original resolution specified an upper -bound. The LWG preferred an exact count.]

- - - - - - - -
-

241. Does unique_copy() require CopyConstructible and Assignable?

-

Section: 25.2.9 [alg.unique] Status: WP - Submitter: Angelika Langer Date: 2000-05-15

-

View all other issues in [alg.unique].

-

View all issues with WP status.

-

Discussion:

- -

Some popular implementations of unique_copy() create temporary -copies of values in the input sequence, at least if the input iterator -is a pointer. Such an implementation is built on the assumption that -the value type is CopyConstructible and Assignable.

- -

It is common practice in the standard that algorithms explicitly -specify any additional requirements that they impose on any of the -types used by the algorithm. An example of an algorithm that creates -temporary copies and correctly specifies the additional requirements -is accumulate(), 26.4.1 [rand.req].

- -

Since the specifications of unique() and unique_copy() do not -require CopyConstructible and Assignable of the InputIterator's value -type the above mentioned implementations are not standard-compliant. I -cannot judge whether this is a defect in the standard or a defect in -the implementations.

- - -

Proposed resolution:

-

In 25.2.8 change:

- -

--4- Requires: The ranges [first, last) and [result, result+(last-first)) -shall not overlap. -

- -

to:

- -
-

-4- Requires: The ranges [first, last) and [result, - result+(last-first)) shall not overlap. The expression *result = - *first must be valid. If neither InputIterator nor OutputIterator - meets the requirements of forward iterator then the value type of - InputIterator must be copy constructible. Otherwise copy - constructible is not required.

-
- -

[Redmond: the original proposed resolution didn't impose an -explicit requirement that the iterator's value type must be copy -constructible, on the grounds that an input iterator's value type must -always be copy constructible. Not everyone in the LWG thought that -this requirement was clear from table 72. It has been suggested that -it might be possible to implement unique_copy without -requiring assignability, although current implementations do impose -that requirement. Howard provided new wording.]

- - -

[ -Curaçao: The LWG changed the PR editorially to specify -"neither...nor...meet..." as clearer than -"both...and...do not meet...". Change believed to be so -minor as not to require re-review. -]

- - - - - - - - -
-

242. Side effects of function objects

-

Section: 25.2.4 [alg.transform], 26.4 [rand] Status: WP - Submitter: Angelika Langer Date: 2000-05-15

-

View all other issues in [alg.transform].

-

View all issues with WP status.

-

Discussion:

-

The algorithms transform(), accumulate(), inner_product(), -partial_sum(), and adjacent_difference() require that the function -object supplied to them shall not have any side effects.

- -

The standard defines a side effect in 1.9 [intro.execution] as:

-

-7- Accessing an object designated by a volatile lvalue (basic.lval), -modifying an object, calling a library I/O function, or calling a function -that does any of those operations are all side effects, which are changes -in the state of the execution environment.

- -

As a consequence, the function call operator of a function object supplied -to any of the algorithms listed above cannot modify data members, cannot -invoke any function that has a side effect, and cannot even create and -modify temporary objects.  It is difficult to imagine a function object -that is still useful under these severe limitations. For instance, any -non-trivial transformator supplied to transform() might involve creation -and modification of temporaries, which is prohibited according to the current -wording of the standard.

- -

On the other hand, popular implementations of these algorithms exhibit -uniform and predictable behavior when invoked with a side-effect-producing -function objects. It looks like the strong requirement is not needed for -efficient implementation of these algorithms.

- -

The requirement of  side-effect-free function objects could be -replaced by a more relaxed basic requirement (which would hold for all -function objects supplied to any algorithm in the standard library):

-

A function objects supplied to an algorithm shall not invalidate -any iterator or sequence that is used by the algorithm. Invalidation of -the sequence includes destruction of the sorting order if the algorithm -relies on the sorting order (see section 25.3 - Sorting and related operations -[lib.alg.sorting]).

- -

I can't judge whether it is intended that the function objects supplied -to transform(), accumulate(), inner_product(), partial_sum(), or adjacent_difference() -shall not modify sequence elements through dereferenced iterators.

- -

It is debatable whether this issue is a defect or a change request. -Since the consequences for user-supplied function objects are drastic and -limit the usefulness of the algorithms significantly I would consider it -a defect.

- - -

Proposed resolution:

- -

Things to notice about these changes:

- -
    -
  1. The fully-closed ("[]" as opposed to half-closed "[)" ranges - are intentional. we want to prevent side-effects from - invalidating the end iterators.
  2. - -
  3. That has the unintentional side-effect of prohibiting - modification of the end element as a side-effect. This could - conceivably be significant in some cases.
  4. - -
  5. The wording also prevents side-effects from modifying elements - of the output sequence. I can't imagine why anyone would want - to do this, but it is arguably a restriction that implementors - don't need to place on users.
  6. - -
  7. Lifting the restrictions imposed in #2 and #3 above is possible - and simple, but would require more verbiage.
  8. -
- -

Change 25.2.3/2 from:

- -

- -2- Requires: op and binary_op shall not have any side effects. -

- -

to:

- -

- -2- Requires: in the ranges [first1, last1], [first2, first2 + - (last1 - first1)] and [result, result + (last1- first1)], op and - binary_op shall neither modify elements nor invalidate iterators or - subranges. - [Footnote: The use of fully closed ranges is intentional --end footnote] -

- - -

Change 25.2.3/2 from:

- -

- -2- Requires: op and binary_op shall not have any side effects. -

- -

to:

- -

- -2- Requires: op and binary_op shall not invalidate iterators or - subranges, or modify elements in the ranges [first1, last1], - [first2, first2 + (last1 - first1)], and [result, result + (last1 - - first1)]. - [Footnote: The use of fully closed ranges is intentional --end footnote] -

- - -

Change 26.4.1/2 from:

- -

- -2- Requires: T must meet the requirements of CopyConstructible - (lib.copyconstructible) and Assignable (lib.container.requirements) - types. binary_op shall not cause side effects. -

- -

to:

- -

- -2- Requires: T must meet the requirements of CopyConstructible - (lib.copyconstructible) and Assignable - (lib.container.requirements) types. In the range [first, last], - binary_op shall neither modify elements nor invalidate iterators - or subranges. - [Footnote: The use of a fully closed range is intentional --end footnote] -

- -

Change 26.4.2/2 from:

- -

- -2- Requires: T must meet the requirements of CopyConstructible - (lib.copyconstructible) and Assignable (lib.container.requirements) - types. binary_op1 and binary_op2 shall not cause side effects. -

- -

to:

- -

- -2- Requires: T must meet the requirements of CopyConstructible - (lib.copyconstructible) and Assignable (lib.container.requirements) - types. In the ranges [first, last] and [first2, first2 + (last - - first)], binary_op1 and binary_op2 shall neither modify elements - nor invalidate iterators or subranges. - [Footnote: The use of fully closed ranges is intentional --end footnote] -

- - -

Change 26.4.3/4 from:

- -

- -4- Requires: binary_op is expected not to have any side effects. -

- -

to:

- -

- -4- Requires: In the ranges [first, last] and [result, result + - (last - first)], binary_op shall neither modify elements nor - invalidate iterators or subranges. - [Footnote: The use of fully closed ranges is intentional --end footnote] -

- -

Change 26.4.4/2 from:

- -

- -2- Requires: binary_op shall not have any side effects. -

- -

to:

- -

- -2- Requires: In the ranges [first, last] and [result, result + - (last - first)], binary_op shall neither modify elements nor - invalidate iterators or subranges. - [Footnote: The use of fully closed ranges is intentional --end footnote] -

- -

[Toronto: Dave Abrahams supplied wording.]

- - -

[Copenhagen: Proposed resolution was modified slightly. Matt -added footnotes pointing out that the use of closed ranges was -intentional.]

- - - - - - - -
-

243. get and getline when sentry reports failure

-

Section: 27.6.1.3 [istream.unformatted] Status: WP - Submitter: Martin Sebor Date: 2000-05-15

-

View all other issues in [istream.unformatted].

-

View all issues with WP status.

-

Discussion:

-

basic_istream<>::get(), and basic_istream<>::getline(), -are unclear with respect to the behavior and side-effects of the named -functions in case of an error.

- -

27.6.1.3, p1 states that "... If the sentry object returns -true, when converted to a value of type bool, the function endeavors -to obtain the requested input..." It is not clear from this (or -the rest of the paragraph) what precisely the behavior should be when -the sentry ctor exits by throwing an exception or when the sentry -object returns false. In particular, what is the number of characters -extracted that gcount() returns supposed to be?

- -

27.6.1.3 p8 and p19 say about the effects of get() and getline(): -"... In any case, it then stores a null character (using -charT()) into the next successive location of the array." Is not -clear whether this sentence applies if either of the conditions above -holds (i.e., when sentry fails).

- - -

Proposed resolution:

-

Add to 27.6.1.3, p1 after the sentence

- -

-"... If the sentry object returns true, when converted to a value of -type bool, the function endeavors to obtain the requested input." -

- -

the following

- - -

-"Otherwise, if the sentry constructor exits by throwing an exception or -if the sentry object returns false, when converted to a value of type -bool, the function returns without attempting to obtain any input. In -either case the number of extracted characters is set to 0; unformatted -input functions taking a character array of non-zero size as an argument -shall also store a null character (using charT()) in the first location -of the array." -

- - -

Rationale:

-

Although the general philosophy of the input functions is that the -argument should not be modified upon failure, getline -historically added a terminating null unconditionally. Most -implementations still do that. Earlier versions of the draft standard -had language that made this an unambiguous requirement; those words -were moved to a place where their context made them less clear. See -Jerry Schwarz's message c++std-lib-7618.

- - - - -
-

247. vector, deque::insert complexity

-

Section: 23.2.5.4 [vector.modifiers] Status: WP - Submitter: Lisa Lippincott Date: 2000-06-06

-

View all other issues in [vector.modifiers].

-

View all issues with WP status.

-

Discussion:

-

Paragraph 2 of 23.2.5.4 [vector.modifiers] describes the complexity -of vector::insert:

- -

- Complexity: If first and last are forward iterators, bidirectional - iterators, or random access iterators, the complexity is linear in - the number of elements in the range [first, last) plus the distance - to the end of the vector. If they are input iterators, the complexity - is proportional to the number of elements in the range [first, last) - times the distance to the end of the vector. -

- -

First, this fails to address the non-iterator forms of -insert.

- -

Second, the complexity for input iterators misses an edge case -- -it requires that an arbitrary number of elements can be added at -the end of a vector in constant time.

- -

I looked to see if deque had a similar problem, and was -surprised to find that deque places no requirement on the -complexity of inserting multiple elements (23.2.2.3 [deque.modifiers], -paragraph 3):

- -

- Complexity: In the worst case, inserting a single element into a - deque takes time linear in the minimum of the distance from the - insertion point to the beginning of the deque and the distance - from the insertion point to the end of the deque. Inserting a - single element either at the beginning or end of a deque always - takes constant time and causes a single call to the copy constructor - of T. -

- - -

Proposed resolution:

- -

Change Paragraph 2 of 23.2.5.4 [vector.modifiers] to

-

- Complexity: The complexity is linear in the number of elements - inserted plus the distance to the end of the vector. -

- -

[For input iterators, one may achieve this complexity by first - inserting at the end of the vector, and then using - rotate.]

- - -

Change 23.2.2.3 [deque.modifiers], paragraph 3, to:

- -

- Complexity: The complexity is linear in the number of elements - inserted plus the shorter of the distances to the beginning and - end of the deque. Inserting a single element at either the - beginning or the end of a deque causes a single call to the copy - constructor of T. -

- - - -

Rationale:

-

This is a real defect, and proposed resolution fixes it: some - complexities aren't specified that should be. This proposed - resolution does constrain deque implementations (it rules out the - most naive possible implementations), but the LWG doesn't see a - reason to permit that implementation.

- - - - - -
-

248. time_get fails to set eofbit

-

Section: 22.2.5 [category.time] Status: WP - Submitter: Martin Sebor Date: 2000-06-22

-

View all issues with WP status.

-

Discussion:

-

There is no requirement that any of time_get member functions set -ios::eofbit when they reach the end iterator while parsing their input. -Since members of both the num_get and money_get facets are required to -do so (22.2.2.1.2, and 22.2.6.1.2, respectively), time_get members -should follow the same requirement for consistency.

- - -

Proposed resolution:

-

Add paragraph 2 to section 22.2.5.1 with the following text:

- -

-If the end iterator is reached during parsing by any of the get() -member functions, the member sets ios_base::eofbit in err. -

- - -

Rationale:

-

Two alternative resolutions were proposed. The LWG chose this one -because it was more consistent with the way eof is described for other -input facets.

- - - - -
-

250. splicing invalidates iterators

-

Section: 23.2.3.4 [list.ops] Status: WP - Submitter: Brian Parker Date: 2000-07-14

-

View all other issues in [list.ops].

-

View all issues with WP status.

-

Discussion:

-

-Section 23.2.3.4 [list.ops] states that -

-
  void splice(iterator position, list<T, Allocator>& x);
-
-

-invalidates all iterators and references to list x. -

- -

-This is unnecessary and defeats an important feature of splice. In -fact, the SGI STL guarantees that iterators to x remain valid -after splice. -

- - -

Proposed resolution:

- -

Add a footnote to 23.2.3.4 [list.ops], paragraph 1:

-

-[Footnote: As specified in [default.con.req], paragraphs -4-5, the semantics described in this clause applies only to the case -where allocators compare equal. --end footnote] -

- -

In 23.2.3.4 [list.ops], replace paragraph 4 with:

-

-Effects: Inserts the contents of x before position and x becomes -empty. Pointers and references to the moved elements of x now refer to -those same elements but as members of *this. Iterators referring to the -moved elements will continue to refer to their elements, but they now -behave as iterators into *this, not into x. -

- -

In 23.2.3.4 [list.ops], replace paragraph 7 with:

-

-Effects: Inserts an element pointed to by i from list x before -position and removes the element from x. The result is unchanged if -position == i or position == ++i. Pointers and references to *i continue -to refer to this same element but as a member of *this. Iterators to *i -(including i itself) continue to refer to the same element, but now -behave as iterators into *this, not into x. -

- -

In 23.2.3.4 [list.ops], replace paragraph 12 with:

-

-Requires: [first, last) is a valid range in x. The result is -undefined if position is an iterator in the range [first, last). -Pointers and references to the moved elements of x now refer to those -same elements but as members of *this. Iterators referring to the moved -elements will continue to refer to their elements, but they now behave as -iterators into *this, not into x. -

- -

[pre-Copenhagen: Howard provided wording.]

- - - -

Rationale:

-

The original proposed resolution said that iterators and references -would remain "valid". The new proposed resolution clarifies what that -means. Note that this only applies to the case of equal allocators. -From [default.con.req] paragraph 4, the behavior of list when -allocators compare nonequal is outside the scope of the standard.

- - - - -
-

251. basic_stringbuf missing allocator_type

-

Section: 27.7.1 [stringbuf] Status: WP - Submitter: Martin Sebor Date: 2000-07-28

-

View all issues with WP status.

-

Discussion:

-

The synopsis for the template class basic_stringbuf -doesn't list a typedef for the template parameter -Allocator. This makes it impossible to determine the type of -the allocator at compile time. It's also inconsistent with all other -template classes in the library that do provide a typedef for the -Allocator parameter.

- - -

Proposed resolution:

-

Add to the synopses of the class templates basic_stringbuf (27.7.1), -basic_istringstream (27.7.2), basic_ostringstream (27.7.3), and -basic_stringstream (27.7.4) the typedef:

-
  typedef Allocator allocator_type;
-
- - - - -
-

252. missing casts/C-style casts used in iostreams

-

Section: 27.7 [string.streams] Status: WP - Submitter: Martin Sebor Date: 2000-07-28

-

View all other issues in [string.streams].

-

View all issues with WP status.

-

Discussion:

-

27.7.2.2, p1 uses a C-style cast rather than the more appropriate -const_cast<> in the Returns clause for basic_istringstream<>::rdbuf(). -The same C-style cast is being used in 27.7.3.2, p1, D.7.2.2, p1, and -D.7.3.2, p1, and perhaps elsewhere. 27.7.6, p1 and D.7.2.2, p1 are missing -the cast altogether.

- -

C-style casts have not been deprecated, so the first part of this -issue is stylistic rather than a matter of correctness.

- - -

Proposed resolution:

-

In 27.7.2.2, p1 replace

-
  -1- Returns: (basic_stringbuf<charT,traits,Allocator>*)&sb.
- -

with

-
  -1- Returns: const_cast<basic_stringbuf<charT,traits,Allocator>*>(&sb).
- - -

In 27.7.3.2, p1 replace

-
  -1- Returns: (basic_stringbuf<charT,traits,Allocator>*)&sb.
- -

with

-
  -1- Returns: const_cast<basic_stringbuf<charT,traits,Allocator>*>(&sb).
- -

In 27.7.6, p1, replace

-
  -1- Returns: &sb
- -

with

-
  -1- Returns: const_cast<basic_stringbuf<charT,traits,Allocator>*>(&sb).
- -

In D.7.2.2, p1 replace

-
  -2- Returns: &sb. 
- -

with

-
  -2- Returns: const_cast<strstreambuf*>(&sb).
- - - - -
-

253. valarray helper functions are almost entirely useless

-

Section: 26.5.2.1 [valarray.cons], 26.5.2.2 [valarray.assign] Status: WP - Submitter: Robert Klarer Date: 2000-07-31

-

View other active issues in [valarray.cons].

-

View all other issues in [valarray.cons].

-

View all issues with WP status.

-

Discussion:

-

This discussion is adapted from message c++std-lib-7056 posted -November 11, 1999. I don't think that anyone can reasonably claim -that the problem described below is NAD.

- -

These valarray constructors can never be called:

- -
   template <class T>
-         valarray<T>::valarray(const slice_array<T> &);
-   template <class T>
-         valarray<T>::valarray(const gslice_array<T> &);
-   template <class T>
-         valarray<T>::valarray(const mask_array<T> &);
-   template <class T>
-         valarray<T>::valarray(const indirect_array<T> &);
-
- -

Similarly, these valarray assignment operators cannot be -called:

- -
     template <class T>
-     valarray<T> valarray<T>::operator=(const slice_array<T> &);
-     template <class T>
-     valarray<T> valarray<T>::operator=(const gslice_array<T> &);
-     template <class T>
-     valarray<T> valarray<T>::operator=(const mask_array<T> &);
-     template <class T>
-     valarray<T> valarray<T>::operator=(const indirect_array<T> &);
-
- -

Please consider the following example:

- -
   #include <valarray>
-   using namespace std;
-
-   int main()
-   {
-       valarray<double> va1(12);
-       valarray<double> va2(va1[slice(1,4,3)]); // line 1
-   }
-
- - -

Since the valarray va1 is non-const, the result of the sub-expression -va1[slice(1,4,3)] at line 1 is an rvalue of type const -std::slice_array<double>. This slice_array rvalue is then used to -construct va2. The constructor that is used to construct va2 is -declared like this:

- -
     template <class T>
-     valarray<T>::valarray(const slice_array<T> &);
-
- -

Notice the constructor's const reference parameter. When the -constructor is called, a slice_array must be bound to this reference. -The rules for binding an rvalue to a const reference are in 8.5.3, -paragraph 5 (see also 13.3.3.1.4). Specifically, paragraph 5 -indicates that a second slice_array rvalue is constructed (in this -case copy-constructed) from the first one; it is this second rvalue -that is bound to the reference parameter. Paragraph 5 also requires -that the constructor that is used for this purpose be callable, -regardless of whether the second rvalue is elided. The -copy-constructor in this case is not callable, however, because it is -private. Therefore, the compiler should report an error.

- -

Since slice_arrays are always rvalues, the valarray constructor that has a -parameter of type const slice_array<T> & can never be called. The -same reasoning applies to the three other constructors and the four -assignment operators that are listed at the beginning of this post. -Furthermore, since these functions cannot be called, the valarray helper -classes are almost entirely useless.

- - -

Proposed resolution:

-

slice_array:

-
    -
  • Make the copy constructor and copy-assignment operator declarations - public in the slice_array class template definition in 26.5.5 [template.slice.array]
  • -
  • remove paragraph 3 of 26.5.5 [template.slice.array]
  • -
  • remove the copy constructor declaration from [cons.slice.arr]
  • -
  • change paragraph 1 of [cons.slice.arr] to read "This constructor is declared - to be private. This constructor need not be defined."
  • -
  • remove the first sentence of paragraph 1 of 26.5.5.1 [slice.arr.assign]
  • -
  • Change the first three words of the second sentence of paragraph 1 of - 26.5.5.1 [slice.arr.assign] to "These assignment operators have"
  • -
- -

gslice_array:

-
    -
  • Make the copy constructor and copy-assignment operator declarations - public in the gslice_array class template definition in 26.5.7 [template.gslice.array]
  • -
  • remove the note in paragraph 3 of 26.5.7 [template.gslice.array]
  • -
  • remove the copy constructor declaration from [gslice.array.cons]
  • -
  • change paragraph 1 of [gslice.array.cons] to read "This constructor is declared - to be private. This constructor need not be defined."
  • -
  • remove the first sentence of paragraph 1 of 26.5.7.1 [gslice.array.assign]
  • -
  • Change the first three words of the second sentence of paragraph 1 of - 26.5.7.1 [gslice.array.assign] to "These assignment operators have"
  • -
- -

mask_array:

-
    -
  • Make the copy constructor and copy-assignment operator declarations - public in the mask_array class template definition in 26.5.8 [template.mask.array]
  • -
  • remove the note in paragraph 2 of 26.5.8 [template.mask.array]
  • -
  • remove the copy constructor declaration from [mask.array.cons]
  • -
  • change paragraph 1 of [mask.array.cons] to read "This constructor is declared - to be private. This constructor need not be defined."
  • -
  • remove the first sentence of paragraph 1 of 26.5.8.1 [mask.array.assign]
  • -
  • Change the first three words of the second sentence of paragraph 1 of - 26.5.8.1 [mask.array.assign] to "These assignment operators have"
  • -
- -

indirect_array:

-
    -
  • Make the copy constructor and copy-assignment operator declarations - public in the indirect_array class definition in 26.5.9 [template.indirect.array]
  • -
  • remove the note in paragraph 2 of 26.5.9 [template.indirect.array]
  • -
  • remove the copy constructor declaration from [indirect.array.cons]
  • -
  • change the descriptive text in [indirect.array.cons] to read "This constructor is - declared to be private. This constructor need not be defined."
  • -
  • remove the first sentence of paragraph 1 of 26.5.9.1 [indirect.array.assign]
  • -
  • Change the first three words of the second sentence of paragraph 1 of - 26.5.9.1 [indirect.array.assign] to "These assignment operators have"
  • -
-

[Proposed resolution was modified in Santa Cruz: explicitly make -copy constructor and copy assignment operators public, instead of -removing them.]

- - - -

Rationale:

-

Keeping the valarray constructors private is untenable. Merely -making valarray a friend of the helper classes isn't good enough, -because access to the copy constructor is checked in the user's -environment.

- -

Making the assignment operator public is not strictly necessary to -solve this problem. A majority of the LWG (straw poll: 13-4) -believed we should make the assignment operators public, in addition -to the copy constructors, for reasons of symmetry and user -expectation.

- - - - - -
-

254. Exception types in clause 19 are constructed from std::string

-

Section: 19.1 [std.exceptions], 27.4.2.1.1 [ios::failure] Status: WP - Submitter: Dave Abrahams Date: 2000-08-01

-

View all issues with WP status.

-

Discussion:

-

-Many of the standard exception types which implementations are -required to throw are constructed with a const std::string& -parameter. For example: -

- -
     19.1.5  Class out_of_range                          [lib.out.of.range]
-     namespace std {
-       class out_of_range : public logic_error {
-       public:
-         explicit out_of_range(const string& what_arg);
-       };
-     }
-
-   1 The class out_of_range defines the type of objects  thrown  as  excep-
-     tions to report an argument value not in its expected range.
-
-     out_of_range(const string& what_arg);
-
-     Effects:
-       Constructs an object of class out_of_range.
-     Postcondition:
-       strcmp(what(), what_arg.c_str()) == 0.
-
- -

-There are at least two problems with this: -

-
    -
  1. A program which is low on memory may end up throwing -std::bad_alloc instead of out_of_range because memory runs out while -constructing the exception object.
  2. -
  3. An obvious implementation which stores a std::string data member -may end up invoking terminate() during exception unwinding because the -exception object allocates memory (or rather fails to) as it is being -copied.
  4. -
- -

-There may be no cure for (1) other than changing the interface to -out_of_range, though one could reasonably argue that (1) is not a -defect. Personally I don't care that much if out-of-memory is reported -when I only have 20 bytes left, in the case when out_of_range would -have been reported. People who use exception-specifications might care -a lot, though. -

- -

-There is a cure for (2), but it isn't completely obvious. I think a -note for implementors should be made in the standard. Avoiding -possible termination in this case shouldn't be left up to chance. The -cure is to use a reference-counted "string" implementation -in the exception object. I am not necessarily referring to a -std::string here; any simple reference-counting scheme for a NTBS -would do. -

- -

Further discussion, in email:

- -

-...I'm not so concerned about (1). After all, a library implementation -can add const char* constructors as an extension, and users don't -need to avail themselves of the standard exceptions, though this is -a lame position to be forced into. FWIW, std::exception and -std::bad_alloc don't require a temporary basic_string. -

- -

-...I don't think the fixed-size buffer is a solution to the problem, -strictly speaking, because you can't satisfy the postcondition -
-   strcmp(what(), what_arg.c_str()) == 0 -
-For all values of what_arg (i.e. very long values). That means that -the only truly conforming solution requires a dynamic allocation. -

- -

Further discussion, from Redmond:

- -

The most important progress we made at the Redmond meeting was -realizing that there are two separable issues here: the const -string& constructor, and the copy constructor. If a user writes -something like throw std::out_of_range("foo"), the const -string& constructor is invoked before anything gets thrown. The -copy constructor is potentially invoked during stack unwinding.

- -

The copy constructor is a more serious problem, becuase failure -during stack unwinding invokes terminate. The copy -constructor must be nothrow. Curaçao: Howard thinks this -requirement may already be present.

- -

The fundamental problem is that it's difficult to get the nothrow -requirement to work well with the requirement that the exception -objects store a string of unbounded size, particularly if you also try -to make the const string& constructor nothrow. Options discussed -include:

- -
    -
  • Limit the size of a string that exception objects are required to -throw: change the postconditions of 19.1.2 [domain.error] paragraph 3 -and 19.1.6 [runtime.error] paragraph 3 to something like this: -"strncmp(what(), what_arg._str(), N) == 0, where N is an -implementation defined constant no smaller than 256".
  • -
  • Allow the const string& constructor to throw, but not the -copy constructor. It's the implementor's responsibility to get it -right. (An implementor might use a simple refcount class.)
  • -
  • Compromise between the two: an implementation is not allowed to -throw if the string's length is less than some N, but, if it doesn't -throw, the string must compare equal to the argument.
  • -
  • Add a new constructor that takes a const char*
  • -
- -

(Not all of these options are mutually exclusive.)

- - - -

Proposed resolution:

- -

-Change 19.1.1 [logic.error] -

- -
-
namespace std {
-  class logic_error : public exception {
-  public:
-    explicit logic_error(const string& what_arg);
-    explicit logic_error(const char* what_arg);
-  };
-}
-
-

...

-

-logic_error(const char* what_arg); -

-
-

--4- Effects: Constructs an object of class logic_error. -

-

--5- Postcondition: strcmp(what(), what_arg) == 0. -

-
- -
- -

-Change 19.1.2 [domain.error] -

- -
-
namespace std {
-  class domain_error : public logic_error {
-  public:
-    explicit domain_error(const string& what_arg);
-    explicit domain_error(const char* what_arg);
-  };
-}
-
-

...

-

-domain_error(const char* what_arg); -

-
-

--4- Effects: Constructs an object of class domain_error. -

-

--5- Postcondition: strcmp(what(), what_arg) == 0. -

- -
-
- -

-Change 19.1.3 [invalid.argument] -

- -
-
namespace std {
-  class invalid_argument : public logic_error {
-  public:
-    explicit invalid_argument(const string& what_arg);
-    explicit invalid_argument(const char* what_arg);
-  };
-}
-
-

...

-

-invalid_argument(const char* what_arg); -

-
-

--4- Effects: Constructs an object of class invalid_argument. -

-

--5- Postcondition: strcmp(what(), what_arg) == 0. -

-
- -
- -

-Change 19.1.4 [length.error] -

- -
-
namespace std {
-  class length_error : public logic_error {
-  public:
-    explicit length_error(const string& what_arg);
-    explicit length_error(const char* what_arg);
-  };
-}
-
-

...

-

-length_error(const char* what_arg); -

-
-

--4- Effects: Constructs an object of class length_error. -

-

--5- Postcondition: strcmp(what(), what_arg) == 0. -

-
- -
- -

-Change 19.1.5 [out.of.range] -

- -
-
namespace std {
-  class out_of_range : public logic_error {
-  public:
-    explicit out_of_range(const string& what_arg);
-    explicit out_of_range(const char* what_arg);
-  };
-}
-
-

...

-

-out_of_range(const char* what_arg); -

-
-

--4- Effects: Constructs an object of class out_of_range. -

-

--5- Postcondition: strcmp(what(), what_arg) == 0. -

-
- -
- -

-Change 19.1.6 [runtime.error] -

- -
-
namespace std {
-  class runtime_error : public exception {
-  public:
-    explicit runtime_error(const string& what_arg);
-    explicit runtime_error(const char* what_arg);
-  };
-}
-
-

...

-

-runtime_error(const char* what_arg); -

-
-

--4- Effects: Constructs an object of class runtime_error. -

-

--5- Postcondition: strcmp(what(), what_arg) == 0. -

-
- -
- -

-Change 19.1.7 [range.error] -

- -
-
namespace std {
-  class range_error : public runtime_error {
-  public:
-    explicit range_error(const string& what_arg);
-    explicit range_error(const char* what_arg);
-  };
-}
-
-

...

-

-range_error(const char* what_arg); -

-
-

--4- Effects: Constructs an object of class range_error. -

-

--5- Postcondition: strcmp(what(), what_arg) == 0. -

-
- -
- -

-Change 19.1.8 [overflow.error] -

- -
-
namespace std {
-  class overflow_error : public runtime_error {
-  public:
-    explicit overflow_error(const string& what_arg);
-    explicit overflow_error(const char* what_arg);
-  };
-}
-
-

...

-

-overflow_error(const char* what_arg); -

-
-

--4- Effects: Constructs an object of class overflow_error. -

-

--5- Postcondition: strcmp(what(), what_arg) == 0. -

-
- -
- -

-Change 19.1.9 [underflow.error] -

- -
-
namespace std {
-  class underflow_error : public runtime_error {
-  public:
-    explicit underflow_error(const string& what_arg);
-    explicit underflow_error(const char* what_arg);
-  };
-}
-
-

...

-

-underflow_error(const char* what_arg); -

-
-

--4- Effects: Constructs an object of class underflow_error. -

-

--5- Postcondition: strcmp(what(), what_arg) == 0. -

-
- -
- -

-Change 27.4.2.1.1 [ios::failure] -

- -
-
namespace std {
-  class ios_base::failure : public exception {
-  public:
-    explicit failure(const string& msg);
-    explicit failure(const char* msg);
-    virtual const char* what() const throw();
-};
-}
-
-

...

-

-failure(const char* msg); -

-
-

--4- Effects: Constructs an object of class failure. -

-

--5- Postcondition: strcmp(what(), msg) == 0. -

-
- -
- - - -

Rationale:

- -

Throwing a bad_alloc while trying to construct a message for another -exception-derived class is not necessarily a bad thing. And the -bad_alloc constructor already has a no throw spec on it (18.4.2.1).

- -

Future:

- -

All involved would like to see const char* constructors added, but -this should probably be done for C++0X as opposed to a DR.

- -

I believe the no throw specs currently decorating these functions -could be improved by some kind of static no throw spec checking -mechanism (in a future C++ language). As they stand, the copy -constructors might fail via a call to unexpected. I think what is -intended here is that the copy constructors can't fail.

- -

[Pre-Sydney: reopened at the request of Howard Hinnant. - Post-Redmond: James Kanze noticed that the copy constructors of - exception-derived classes do not have nothrow clauses. Those - classes have no copy constructors declared, meaning the - compiler-generated implicit copy constructors are used, and those - compiler-generated constructors might in principle throw anything.]

- - -

[ -Batavia: Merged copy constructor and assignment operator spec into exception -and added ios::failure into the proposed resolution. -]

- - -

[ -Oxford: The proposed resolution simply addresses the issue of constructing -the exception objects with const char* and string literals without -the need to explicit include or construct a std::string. -]

- - - - - - - -
-

256. typo in 27.4.4.2, p17: copy_event does not exist

-

Section: 27.4.4.2 [basic.ios.members] Status: WP - Submitter: Martin Sebor Date: 2000-08-21

-

View all other issues in [basic.ios.members].

-

View all issues with WP status.

-

Discussion:

-

-27.4.4.2, p17 says -

- -

--17- Before copying any parts of rhs, calls each registered callback -pair (fn,index) as (*fn)(erase_event,*this,index). After all parts but -exceptions() have been replaced, calls each callback pair that was -copied from rhs as (*fn)(copy_event,*this,index). -

- -

-The name copy_event isn't defined anywhere. The intended name was -copyfmt_event. -

- - -

Proposed resolution:

-

Replace copy_event with copyfmt_event in the named paragraph.

- - - - -
-

258. Missing allocator requirement

-

Section: 20.1.2 [allocator.requirements] Status: WP - Submitter: Matt Austern Date: 2000-08-22

-

View other active issues in [allocator.requirements].

-

View all other issues in [allocator.requirements].

-

View all issues with WP status.

-

Discussion:

-

-From lib-7752: -

- -

-I've been assuming (and probably everyone else has been assuming) that -allocator instances have a particular property, and I don't think that -property can be deduced from anything in Table 32. -

- -

-I think we have to assume that allocator type conversion is a -homomorphism. That is, if x1 and x2 are of type X, where -X::value_type is T, and if type Y is X::template -rebind<U>::other, then Y(x1) == Y(x2) if and only if x1 == x2. -

- -

-Further discussion: Howard Hinnant writes, in lib-7757: -

- -

-I think I can prove that this is not provable by Table 32. And I agree -it needs to be true except for the "and only if". If x1 != x2, I see no -reason why it can't be true that Y(x1) == Y(x2). Admittedly I can't -think of a practical instance where this would happen, or be valuable. -But I also don't see a need to add that extra restriction. I think we -only need: -

- -

- if (x1 == x2) then Y(x1) == Y(x2) -

- -

-If we decide that == on allocators is transitive, then I think I can -prove the above. But I don't think == is necessarily transitive on -allocators. That is: -

- -

-Given x1 == x2 and x2 == x3, this does not mean x1 == x3. -

- -

Example:

- -
-

-x1 can deallocate pointers from: x1, x2, x3
-x2 can deallocate pointers from: x1, x2, x4
-x3 can deallocate pointers from: x1, x3
-x4 can deallocate pointers from: x2, x4 -

- -

-x1 == x2, and x2 == x4, but x1 != x4 -

-
-

[Toronto: LWG members offered multiple opinions. One -opinion is that it should not be required that x1 == x2 -implies Y(x1) == Y(x2), and that it should not even be -required that X(x1) == x1. Another opinion is that -the second line from the bottom in table 32 already implies the -desired property. This issue should be considered in light of -other issues related to allocator instances.]

- - - -

Proposed resolution:

-

-Accept proposed wording from -N2436 part 3. -

- - -

[Lillehammer: Same conclusion as before: this should be - considered as part of an allocator redesign, not solved on its own.]

- - -

[ -Batavia: An allocator redesign is not forthcoming and thus we fixed this one issue. -]

- - -

[ -Toronto: Reopened at the request of the project editor (Pete) because the proposed -wording did not fit within the indicated table. The intent of the resolution remains -unchanged. Pablo to work with Pete on improved wording. -]

- - -

[ -Kona (2007): The LWG adopted the proposed resolution of N2387 for this issue which -was subsequently split out into a separate paper N2436 for the purposes of voting. -The resolution in N2436 addresses this issue. The LWG voted to accelerate this -issue to Ready status to be voted into the WP at Kona. -]

- - - - - -
-

259. basic_string::operator[] and const correctness

-

Section: 21.3.4 [string.capacity] Status: WP - Submitter: Chris Newton Date: 2000-08-27

-

View all other issues in [string.capacity].

-

View all issues with WP status.

-

Discussion:

-

-Paraphrased from a message that Chris Newton posted to comp.std.c++: -

- -

-The standard's description of basic_string<>::operator[] -seems to violate const correctness. -

- -

-The standard (21.3.4/1) says that "If pos < size(), -returns data()[pos]." The types don't work. The -return value of data() is const charT*, but -operator[] has a non-const version whose return type is reference. -

- - -

Proposed resolution:

-

-In section 21.3.4, paragraph 1, change -"data()[pos]" to "*(begin() + -pos)". -

- - - - -
-

260. Inconsistent return type of istream_iterator::operator++(int)

-

Section: 24.5.1.2 [istream.iterator.ops] Status: WP - Submitter: Martin Sebor Date: 2000-08-27

-

View all other issues in [istream.iterator.ops].

-

View all issues with WP status.

-

Discussion:

-

The synopsis of istream_iterator::operator++(int) in 24.5.1 shows -it as returning the iterator by value. 24.5.1.2, p5 shows the same -operator as returning the iterator by reference. That's incorrect -given the Effects clause below (since a temporary is returned). The -`&' is probably just a typo.

- - -

Proposed resolution:

-

Change the declaration in 24.5.1.2, p5 from

-
 istream_iterator<T,charT,traits,Distance>& operator++(int);
- 
-

to

-
 istream_iterator<T,charT,traits,Distance> operator++(int);
- 
-

(that is, remove the `&').

- - - - -
-

261. Missing description of istream_iterator::operator!=

-

Section: 24.5.1.2 [istream.iterator.ops] Status: WP - Submitter: Martin Sebor Date: 2000-08-27

-

View all other issues in [istream.iterator.ops].

-

View all issues with WP status.

-

Discussion:

-

-24.5.1, p3 lists the synopsis for -

- -
   template <class T, class charT, class traits, class Distance>
-        bool operator!=(const istream_iterator<T,charT,traits,Distance>& x,
-                        const istream_iterator<T,charT,traits,Distance>& y);
-
- -

-but there is no description of what the operator does (i.e., no Effects -or Returns clause) in 24.5.1.2. -

- - -

Proposed resolution:

-

-Add paragraph 7 to the end of section 24.5.1.2 with the following text: -

- -
   template <class T, class charT, class traits, class Distance>
-        bool operator!=(const istream_iterator<T,charT,traits,Distance>& x,
-                        const istream_iterator<T,charT,traits,Distance>& y);
-
- -

-7- Returns: !(x == y).

- - - - -
-

262. Bitmask operator ~ specified incorrectly

-

Section: 17.3.2.1.2 [bitmask.types] Status: WP - Submitter: Beman Dawes Date: 2000-09-03

-

View all issues with WP status.

-

Discussion:

-

-The ~ operation should be applied after the cast to int_type. -

- - -

Proposed resolution:

-

-Change 17.3.2.1.2 [lib.bitmask.types] operator~ from: -

- -
   bitmask operator~ ( bitmask X )
-     { return static_cast< bitmask>(static_cast<int_type>(~ X)); }
-
- -

-to: -

- -
   bitmask operator~ ( bitmask X )
-     { return static_cast< bitmask>(~static_cast<int_type>(X)); }
-
- - - - -
-

263. Severe restriction on basic_string reference counting

-

Section: 21.3 [basic.string] Status: WP - Submitter: Kevlin Henney Date: 2000-09-04

-

View other active issues in [basic.string].

-

View all other issues in [basic.string].

-

View all issues with WP status.

-

Discussion:

-

-The note in paragraph 6 suggests that the invalidation rules for -references, pointers, and iterators in paragraph 5 permit a reference- -counted implementation (actually, according to paragraph 6, they permit -a "reference counted implementation", but this is a minor editorial fix). -

- -

-However, the last sub-bullet is so worded as to make a reference-counted -implementation unviable. In the following example none of the -conditions for iterator invalidation are satisfied: -

- -
    // first example: "*******************" should be printed twice
-    string original = "some arbitrary text", copy = original;
-    const string & alias = original;
-
-    string::const_iterator i = alias.begin(), e = alias.end();
-    for(string::iterator j = original.begin(); j != original.end(); ++j)
-        *j = '*';
-    while(i != e)
-        cout << *i++;
-    cout << endl;
-    cout << original << endl;
-
- -

-Similarly, in the following example: -

- -
    // second example: "some arbitrary text" should be printed out
-    string original = "some arbitrary text", copy = original;
-    const string & alias = original;
-
-    string::const_iterator i = alias.begin();
-    original.begin();
-    while(i != alias.end())
-        cout << *i++;
-
- -

-I have tested this on three string implementations, two of which were -reference counted. The reference-counted implementations gave -"surprising behavior" because they invalidated iterators on -the first call to non-const begin since construction. The current -wording does not permit such invalidation because it does not take -into account the first call since construction, only the first call -since various member and non-member function calls. -

- - -

Proposed resolution:

-

-Change the following sentence in 21.3 paragraph 5 from -

- -

- Subsequent to any of the above uses except the forms of insert() and - erase() which return iterators, the first call to non-const member - functions operator[](), at(), begin(), rbegin(), end(), or rend(). -

- -

to

- -

- Following construction or any of the above uses, except the forms of - insert() and erase() that return iterators, the first call to non- - const member functions operator[](), at(), begin(), rbegin(), end(), - or rend(). -

- - - - -
-

264. Associative container insert(i, j) complexity requirements are not feasible.

-

Section: 23.1.2 [associative.reqmts] Status: WP - Submitter: John Potter Date: 2000-09-07

-

View all other issues in [associative.reqmts].

-

View all issues with WP status.

-

Duplicate of: 102

-

Discussion:

-

-Table 69 requires linear time if [i, j) is sorted. Sorted is necessary but not sufficient. -Consider inserting a sorted range of even integers into a set<int> containing the odd -integers in the same range. -

- -

Related issue: 102

- - -

Proposed resolution:

-

-In Table 69, in section 23.1.2, change the complexity clause for -insertion of a range from "N log(size() + N) (N is the distance -from i to j) in general; linear if [i, j) is sorted according to -value_comp()" to "N log(size() + N), where N is the distance -from i to j". -

- -

[Copenhagen: Minor fix in proposed resolution: fixed unbalanced -parens in the revised wording.]

- - - - -

Rationale:

-

-Testing for valid insertions could be less efficient than simply -inserting the elements when the range is not both sorted and between -two adjacent existing elements; this could be a QOI issue. -

- -

-The LWG considered two other options: (a) specifying that the -complexity was linear if [i, j) is sorted according to value_comp() -and between two adjacent existing elements; or (b) changing to -Klog(size() + N) + (N - K) (N is the distance from i to j and K is the -number of elements which do not insert immediately after the previous -element from [i, j) including the first). The LWG felt that, since -we can't guarantee linear time complexity whenever the range to be -inserted is sorted, it's more trouble than it's worth to say that it's -linear in some special cases. -

- - - - -
-

265. std::pair::pair() effects overly restrictive

-

Section: 20.2.3 [pairs] Status: WP - Submitter: Martin Sebor Date: 2000-09-11

-

View all other issues in [pairs].

-

View all issues with WP status.

-

Discussion:

-

-I don't see any requirements on the types of the elements of the -std::pair container in 20.2.2. From the descriptions of the member -functions it appears that they must at least satisfy the requirements of -20.1.3 [lib.copyconstructible] and 20.1.4 [lib.default.con.req], and in -the case of the [in]equality operators also the requirements of 20.1.1 -[lib.equalitycomparable] and 20.1.2 [lib.lessthancomparable]. -

- -

-I believe that the the CopyConstructible requirement is unnecessary in -the case of 20.2.2, p2. -

- - -

Proposed resolution:

-

Change the Effects clause in 20.2.2, p2 from

- -

--2- Effects: Initializes its members as if implemented: pair() : -first(T1()), second(T2()) {} -

- -

to

- -

--2- Effects: Initializes its members as if implemented: pair() : -first(), second() {} -

- - -

Rationale:

-

The existing specification of pair's constructor appears to be a -historical artifact: there was concern that pair's members be properly -zero-initialized when they are built-in types. At one time there was -uncertainty about whether they would be zero-initialized if the -default constructor was written the obvious way. This has been -clarified by core issue 178, and there is no longer any doubt that -the straightforward implementation is correct.

- - - - -
-

266. bad_exception::~bad_exception() missing Effects clause

-

Section: 18.7.2.1 [bad.exception] Status: WP - Submitter: Martin Sebor Date: 2000-09-24

-

View all issues with WP status.

-

Discussion:

-

-The synopsis for std::bad_exception lists the function ~bad_exception() -but there is no description of what the function does (the Effects -clause is missing). -

- - -

Proposed resolution:

-

-Remove the destructor from the class synopses of -bad_alloc (18.5.2.1 [bad.alloc]), -bad_cast (18.6.2 [bad.cast]), -bad_typeid (18.6.3 [bad.typeid]), -and bad_exception (18.7.2.1 [bad.exception]). -

- - -

Rationale:

-

-This is a general problem with the exception classes in clause 18. -The proposed resolution is to remove the destructors from the class -synopses, rather than to document the destructors' behavior, because -removing them is more consistent with how exception classes are -described in clause 19. -

- - - - -
-

268. Typo in locale synopsis

-

Section: 22.1.1 [locale] Status: WP - Submitter: Martin Sebor Date: 2000-10-05

-

View all other issues in [locale].

-

View all issues with WP status.

-

Discussion:

-

The synopsis of the class std::locale in 22.1.1 contains two typos: -the semicolons after the declarations of the default ctor -locale::locale() and the copy ctor locale::locale(const locale&) -are missing.

- - -

Proposed resolution:

-

Add the missing semicolons, i.e., change

- -
    //  construct/copy/destroy:
-        locale() throw()
-        locale(const locale& other) throw()
-
- -

in the synopsis in 22.1.1 to

- -
    //  construct/copy/destroy:
-        locale() throw();
-        locale(const locale& other) throw();
-
- - - - -
-

270. Binary search requirements overly strict

-

Section: 25.3.3 [alg.binary.search] Status: WP - Submitter: Matt Austern Date: 2000-10-18

-

View all other issues in [alg.binary.search].

-

View all issues with WP status.

-

Duplicate of: 472

-

Discussion:

-

-Each of the four binary search algorithms (lower_bound, upper_bound, -equal_range, binary_search) has a form that allows the user to pass a -comparison function object. According to 25.3, paragraph 2, that -comparison function object has to be a strict weak ordering. -

- -

-This requirement is slightly too strict. Suppose we are searching -through a sequence containing objects of type X, where X is some -large record with an integer key. We might reasonably want to look -up a record by key, in which case we would want to write something -like this: -

-
    struct key_comp {
-      bool operator()(const X& x, int n) const {
-        return x.key() < n;
-      }
-    }
-
-    std::lower_bound(first, last, 47, key_comp());
-
- -

-key_comp is not a strict weak ordering, but there is no reason to -prohibit its use in lower_bound. -

- -

-There's no difficulty in implementing lower_bound so that it allows -the use of something like key_comp. (It will probably work unless an -implementor takes special pains to forbid it.) What's difficult is -formulating language in the standard to specify what kind of -comparison function is acceptable. We need a notion that's slightly -more general than that of a strict weak ordering, one that can encompass -a comparison function that involves different types. Expressing that -notion may be complicated. -

- -

Additional questions raised at the Toronto meeting:

-
    -
  • Do we really want to specify what ordering the implementor must - use when calling the function object? The standard gives - specific expressions when describing these algorithms, but it also - says that other expressions (with different argument order) are - equivalent.
  • -
  • If we are specifying ordering, note that the standard uses both - orderings when describing equal_range.
  • -
  • Are we talking about requiring these algorithms to work properly - when passed a binary function object whose two argument types - are not the same, or are we talking about requirements when - they are passed a binary function object with several overloaded - versions of operator()?
  • -
  • The definition of a strict weak ordering does not appear to give - any guidance on issues of overloading; it only discusses expressions, - and all of the values in these expressions are of the same type. - Some clarification would seem to be in order.
  • -
- -

Additional discussion from Copenhagen:

-
    -
  • It was generally agreed that there is a real defect here: if -the predicate is merely required to be a Strict Weak Ordering, then -it's possible to pass in a function object with an overloaded -operator(), where the version that's actually called does something -completely inappropriate. (Such as returning a random value.)
  • - -
  • An alternative formulation was presented in a paper distributed by -David Abrahams at the meeting, "Binary Search with Heterogeneous -Comparison", J16-01/0027 = WG21 N1313: Instead of viewing the -predicate as a Strict Weak Ordering acting on a sorted sequence, view -the predicate/value pair as something that partitions a sequence. -This is almost equivalent to saying that we should view binary search -as if we are given a unary predicate and a sequence, such that f(*p) -is true for all p below a specific point and false for all p above it. -The proposed resolution is based on that alternative formulation.
  • -
- - -

Proposed resolution:

- -

Change 25.3 [lib.alg.sorting] paragraph 3 from:

- -

- 3 For all algorithms that take Compare, there is a version that uses - operator< instead. That is, comp(*i, *j) != false defaults to *i < - *j != false. For the algorithms to work correctly, comp has to - induce a strict weak ordering on the values. -

- -

to:

- -

- 3 For all algorithms that take Compare, there is a version that uses - operator< instead. That is, comp(*i, *j) != false defaults to *i - < *j != false. For algorithms other than those described in - lib.alg.binary.search (25.3.3) to work correctly, comp has to induce - a strict weak ordering on the values. -

- -

Add the following paragraph after 25.3 [lib.alg.sorting] paragraph 5:

- -

- -6- A sequence [start, finish) is partitioned with respect to an - expression f(e) if there exists an integer n such that - for all 0 <= i < distance(start, finish), f(*(begin+i)) is true if - and only if i < n. -

- -

Change 25.3.3 [lib.alg.binary.search] paragraph 1 from:

- -

- -1- All of the algorithms in this section are versions of binary - search and assume that the sequence being searched is in order - according to the implied or explicit comparison function. They work - on non-random access iterators minimizing the number of - comparisons, which will be logarithmic for all types of - iterators. They are especially appropriate for random access - iterators, because these algorithms do a logarithmic number of - steps through the data structure. For non-random access iterators - they execute a linear number of steps. -

- -

to:

- -

- -1- All of the algorithms in this section are versions of binary - search and assume that the sequence being searched is partitioned - with respect to an expression formed by binding the search key to - an argument of the implied or explicit comparison function. They - work on non-random access iterators minimizing the number of - comparisons, which will be logarithmic for all types of - iterators. They are especially appropriate for random access - iterators, because these algorithms do a logarithmic number of - steps through the data structure. For non-random access iterators - they execute a linear number of steps. -

- -

Change 25.3.3.1 [lib.lower.bound] paragraph 1 from:

- -

- -1- Requires: Type T is LessThanComparable - (lib.lessthancomparable). -

- -

to:

- -

- -1- Requires: The elements e of [first, last) are partitioned with - respect to the expression e < value or comp(e, value) -

- - -

Remove 25.3.3.1 [lib.lower.bound] paragraph 2:

- -

- -2- Effects: Finds the first position into which value can be - inserted without violating the ordering. -

- -

Change 25.3.3.2 [lib.upper.bound] paragraph 1 from:

- -

- -1- Requires: Type T is LessThanComparable (lib.lessthancomparable). -

- -

to:

- -

- -1- Requires: The elements e of [first, last) are partitioned with - respect to the expression !(value < e) or !comp(value, e) -

- -

Remove 25.3.3.2 [lib.upper.bound] paragraph 2:

- -

- -2- Effects: Finds the furthermost position into which value can be - inserted without violating the ordering. -

- -

Change 25.3.3.3 [lib.equal.range] paragraph 1 from:

- -

- -1- Requires: Type T is LessThanComparable - (lib.lessthancomparable). -

- -

to:

- -

- -1- Requires: The elements e of [first, last) are partitioned with - respect to the expressions e < value and !(value < e) or - comp(e, value) and !comp(value, e). Also, for all elements e of - [first, last), e < value implies !(value < e) or comp(e, - value) implies !comp(value, e) -

- -

Change 25.3.3.3 [lib.equal.range] paragraph 2 from:

- -

- -2- Effects: Finds the largest subrange [i, j) such that the value - can be inserted at any iterator k in it without violating the - ordering. k satisfies the corresponding conditions: !(*k < value) - && !(value < *k) or comp(*k, value) == false && comp(value, *k) == - false. -

- -

to:

- -
   -2- Returns: 
-         make_pair(lower_bound(first, last, value),
-                   upper_bound(first, last, value))
-       or
-         make_pair(lower_bound(first, last, value, comp),
-                   upper_bound(first, last, value, comp))
-
- -

Change 25.3.3.3 [lib.binary.search] paragraph 1 from:

- -

- -1- Requires: Type T is LessThanComparable - (lib.lessthancomparable). -

- -

to:

- -

- -1- Requires: The elements e of [first, last) are partitioned with - respect to the expressions e < value and !(value < e) or comp(e, - value) and !comp(value, e). Also, for all elements e of [first, - last), e < value implies !(value < e) or comp(e, value) implies - !comp(value, e) -

- -

[Copenhagen: Dave Abrahams provided this wording]

- - -

[Redmond: Minor changes in wording. (Removed "non-negative", and -changed the "other than those described in" wording.) Also, the LWG -decided to accept the "optional" part.]

- - - - -

Rationale:

-

The proposed resolution reinterprets binary search. Instead of -thinking about searching for a value in a sorted range, we view that -as an important special case of a more general algorithm: searching -for the partition point in a partitioned range.

- -

We also add a guarantee that the old wording did not: we ensure -that the upper bound is no earlier than the lower bound, that -the pair returned by equal_range is a valid range, and that the first -part of that pair is the lower bound.

- - - - - -
-

271. basic_iostream missing typedefs

-

Section: 27.6.1.5 [iostreamclass] Status: WP - Submitter: Martin Sebor Date: 2000-11-02

-

View all issues with WP status.

-

Discussion:

-

-Class template basic_iostream has no typedefs. The typedefs it -inherits from its base classes can't be used, since (for example) -basic_iostream<T>::traits_type is ambiguous. -

- - -

Proposed resolution:

- -

Add the following to basic_iostream's class synopsis in -27.6.1.5 [iostreamclass], immediately after public:

- -
  // types:
-  typedef charT                     char_type;
-  typedef typename traits::int_type int_type;
-  typedef typename traits::pos_type pos_type;
-  typedef typename traits::off_type off_type;
-  typedef traits                    traits_type;
-
- - - - -
-

272. Missing parentheses around subexpression

-

Section: 27.4.4.3 [iostate.flags] Status: WP - Submitter: Martin Sebor Date: 2000-11-02

-

View all other issues in [iostate.flags].

-

View all issues with WP status.

-

Duplicate of: 569

-

Discussion:

-

-27.4.4.3, p4 says about the postcondition of the function: If -rdbuf()!=0 then state == rdstate(); otherwise -rdstate()==state|ios_base::badbit. -

- -

-The expression on the right-hand-side of the operator==() needs to be -parenthesized in order for the whole expression to ever evaluate to -anything but non-zero. -

- - -

Proposed resolution:

-

-Add parentheses like so: rdstate()==(state|ios_base::badbit). -

- - - - -
-

273. Missing ios_base qualification on members of a dependent class

-

Section: 27 [input.output] Status: WP - Submitter: Martin Sebor Date: 2000-11-02

-

View all other issues in [input.output].

-

View all issues with WP status.

-

Discussion:

-

27.5.2.4.2, p4, and 27.8.1.6, p2, 27.8.1.7, p3, 27.8.1.9, p2, -27.8.1.10, p3 refer to in and/or out w/o ios_base:: qualification. -That's incorrect since the names are members of a dependent base -class (14.6.2 [temp.dep]) and thus not visible.

- - -

Proposed resolution:

-

Qualify the names with the name of the class of which they are -members, i.e., ios_base.

- - - - -
-

274. a missing/impossible allocator requirement

-

Section: 20.1.2 [allocator.requirements] Status: WP - Submitter: Martin Sebor Date: 2000-11-02

-

View other active issues in [allocator.requirements].

-

View all other issues in [allocator.requirements].

-

View all issues with WP status.

-

Discussion:

-

-I see that table 31 in 20.1.5, p3 allows T in std::allocator<T> to be of -any type. But the synopsis in 20.4.1 calls for allocator<>::address() to -be overloaded on reference and const_reference, which is ill-formed for -all T = const U. In other words, this won't work: -

- -

-template class std::allocator<const int>; -

- -

-The obvious solution is to disallow specializations of allocators on -const types. However, while containers' elements are required to be -assignable (which rules out specializations on const T's), I think that -allocators might perhaps be potentially useful for const values in other -contexts. So if allocators are to allow const types a partial -specialization of std::allocator<const T> would probably have to be -provided. -

- - -

Proposed resolution:

-

Change the text in row 1, column 2 of table 32 in 20.1.5, p3 from

- -

- any type -

- -

to

-

- any non-const, non-reference type -

- -

[Redmond: previous proposed resolution was "any non-const, -non-volatile, non-reference type". Got rid of the "non-volatile".]

- - - - -

Rationale:

-

-Two resolutions were originally proposed: one that partially -specialized std::allocator for const types, and one that said an -allocator's value type may not be const. The LWG chose the second. -The first wouldn't be appropriate, because allocators are intended for -use by containers, and const value types don't work in containers. -Encouraging the use of allocators with const value types would only -lead to unsafe code. -

-

-The original text for proposed resolution 2 was modified so that it -also forbids volatile types and reference types. -

- -

[Curaçao: LWG double checked and believes volatile is correctly -excluded from the PR.]

- - - - - - - -
-

275. Wrong type in num_get::get() overloads

-

Section: 22.2.2.1.1 [facet.num.get.members] Status: WP - Submitter: Matt Austern Date: 2000-11-02

-

View all other issues in [facet.num.get.members].

-

View all issues with WP status.

-

Discussion:

-

-In 22.2.2.1.1, we have a list of overloads for num_get<>::get(). -There are eight overloads, all of which are identical except for the -last parameter. The overloads are: -

-
    -
  • long&
  • -
  • unsigned short&
  • -
  • unsigned int&
  • -
  • unsigned long&
  • -
  • short&
  • -
  • double&
  • -
  • long double&
  • -
  • void*&
  • -
- -

-There is a similar list, in 22.2.2.1.2, of overloads for -num_get<>::do_get(). In this list, the last parameter has -the types: -

-
    -
  • long&
  • -
  • unsigned short&
  • -
  • unsigned int&
  • -
  • unsigned long&
  • -
  • float&
  • -
  • double&
  • -
  • long double&
  • -
  • void*&
  • -
- -

-These two lists are not identical. They should be, since -get is supposed to call do_get with exactly -the arguments it was given. -

- - -

Proposed resolution:

-

In 22.2.2.1.1 [facet.num.get.members], change

-
  iter_type get(iter_type in, iter_type end, ios_base& str,
-                ios_base::iostate& err, short& val) const;
-
-

to

-
  iter_type get(iter_type in, iter_type end, ios_base& str,
-                ios_base::iostate& err, float& val) const;
-
- - - - -
-

276. Assignable requirement for container value type overly strict

-

Section: 23.1 [container.requirements] Status: WP - Submitter: Peter Dimov Date: 2000-11-07

-

View other active issues in [container.requirements].

-

View all other issues in [container.requirements].

-

View all issues with WP status.

-

Discussion:

-

-23.1/3 states that the objects stored in a container must be -Assignable. 23.3.1 [map], paragraph 2, -states that map satisfies all requirements for a container, while in -the same time defining value_type as pair<const Key, T> - a type -that is not Assignable. -

- -

-It should be noted that there exists a valid and non-contradictory -interpretation of the current text. The wording in 23.1/3 avoids -mentioning value_type, referring instead to "objects stored in a -container." One might argue that map does not store objects of -type map::value_type, but of map::mapped_type instead, and that the -Assignable requirement applies to map::mapped_type, not -map::value_type. -

- -

-However, this makes map a special case (other containers store objects of -type value_type) and the Assignable requirement is needlessly restrictive in -general. -

- -

-For example, the proposed resolution of active library issue -103 is to make set::iterator a constant iterator; this -means that no set operations can exploit the fact that the stored -objects are Assignable. -

- -

-This is related to, but slightly broader than, closed issue -140. -

- - -

Proposed resolution:

-

23.1/3: Strike the trailing part of the sentence:

-

- , and the additional requirements of Assignable types from 23.1/3 -

-

so that it reads:

-

- -3- The type of objects stored in these components must meet the - requirements of CopyConstructible types (lib.copyconstructible). -

- -

23.1/4: Modify to make clear that this requirement is not for all -containers. Change to:

- -

--4- Table 64 defines the Assignable requirement. Some containers -require this property of the types to be stored in the container. T is -the type used to instantiate the container. t is a value of T, and u is -a value of (possibly const) T. -

- -

23.1, Table 65: in the first row, change "T is Assignable" to "T is -CopyConstructible".

- -

23.2.1/2: Add sentence for Assignable requirement. Change to:

- -

--2- A deque satisfies all of the requirements of a container and of a -reversible container (given in tables in lib.container.requirements) and -of a sequence, including the optional sequence requirements -(lib.sequence.reqmts). In addition to the requirements on the stored -object described in 23.1[lib.container.requirements], the stored object -must also meet the requirements of Assignable. Descriptions are -provided here only for operations on deque that are not described in one -of these tables or for operations where there is additional semantic -information. -

- -

23.2.2/2: Add Assignable requirement to specific methods of list. -Change to:

- -
-

-2- A list satisfies all of the requirements of a container and of a -reversible container (given in two tables in lib.container.requirements) -and of a sequence, including most of the the optional sequence -requirements (lib.sequence.reqmts). The exceptions are the operator[] -and at member functions, which are not provided. - -[Footnote: These member functions are only provided by containers whose -iterators are random access iterators. --- end foonote] -

- -

list does not require the stored type T to be Assignable unless the -following methods are instantiated: - -[Footnote: Implementors are permitted but not required to take advantage -of T's Assignable properties for these methods. -- end foonote] -

-
     list<T,Allocator>& operator=(const list<T,Allocator>&  x );
-     template <class InputIterator>
-       void assign(InputIterator first, InputIterator last);
-     void assign(size_type n, const T& t);
-
- - -

Descriptions are provided here only for operations on list that are not -described in one of these tables or for operations where there is -additional semantic information.

-
- -

23.2.4/2: Add sentence for Assignable requirement. Change to:

- -

--2- A vector satisfies all of the requirements of a container and of a -reversible container (given in two tables in lib.container.requirements) -and of a sequence, including most of the optional sequence requirements -(lib.sequence.reqmts). The exceptions are the push_front and pop_front -member functions, which are not provided. In addition to the -requirements on the stored object described in -23.1[lib.container.requirements], the stored object must also meet the -requirements of Assignable. Descriptions are provided here only for -operations on vector that are not described in one of these tables or -for operations where there is additional semantic information. -

- - -

Rationale:

-

list, set, multiset, map, multimap are able to store non-Assignables. -However, there is some concern about list<T>: -although in general there's no reason for T to be Assignable, some -implementations of the member functions operator= and -assign do rely on that requirement. The LWG does not want -to forbid such implementations.

- -

Note that the type stored in a standard container must still satisfy -the requirements of the container's allocator; this rules out, for -example, such types as "const int". See issue 274 -for more details. -

- -

In principle we could also relax the "Assignable" requirement for -individual vector member functions, such as -push_back. However, the LWG did not see great value in such -selective relaxation. Doing so would remove implementors' freedom to -implement vector::push_back in terms of -vector::insert.

- - - - - -
-

278. What does iterator validity mean?

-

Section: 23.2.3.4 [list.ops] Status: WP - Submitter: P.J. Plauger Date: 2000-11-27

-

View all other issues in [list.ops].

-

View all issues with WP status.

-

Discussion:

-

-Section 23.2.3.4 [list.ops] states that -

-
  void splice(iterator position, list<T, Allocator>& x);
-
-

-invalidates all iterators and references to list x. -

- -

-But what does the C++ Standard mean by "invalidate"? You -can still dereference the iterator to a spliced list element, but -you'd better not use it to delimit a range within the original -list. For the latter operation, it has definitely lost some of its -validity. -

- -

-If we accept the proposed resolution to issue 250, -then we'd better clarify that a "valid" iterator need no -longer designate an element within the same container as it once did. -We then have to clarify what we mean by invalidating a past-the-end -iterator, as when a vector or string grows by reallocation. Clearly, -such an iterator has a different kind of validity. Perhaps we should -introduce separate terms for the two kinds of "validity." -

- - -

Proposed resolution:

-

Add the following text to the end of section 24.1 [iterator.requirements], -after paragraph 5:

-

-An invalid iterator is an iterator that may be -singular. [Footnote: This definition applies to pointers, since -pointers are iterators. The effect of dereferencing an iterator that -has been invalidated is undefined.] -

- -

[post-Copenhagen: Matt provided wording.]

- - -

[Redmond: General agreement with the intent, some objections to -the wording. Dave provided new wording.]

- - - -

Rationale:

-

This resolution simply defines a term that the Standard uses but - never defines, "invalid", in terms of a term that is defined, - "singular".

- -

Why do we say "may be singular", instead of "is singular"? That's - becuase a valid iterator is one that is known to be nonsingular. - Invalidating an iterator means changing it in such a way that it's - no longer known to be nonsingular. An example: inserting an - element into the middle of a vector is correctly said to invalidate - all iterators pointing into the vector. That doesn't necessarily - mean they all become singular.

- - - - - -
-

280. Comparison of reverse_iterator to const reverse_iterator

-

Section: 24.4.1 [reverse.iterators] Status: WP - Submitter: Steve Cleary Date: 2000-11-27

-

View all issues with WP status.

-

Discussion:

-

-This came from an email from Steve Cleary to Fergus in reference to -issue 179. The library working group briefly discussed -this in Toronto and believed it should be a separate issue. There was -also some reservations about whether this was a worthwhile problem to -fix. -

- -

-Steve said: "Fixing reverse_iterator. std::reverse_iterator can -(and should) be changed to preserve these additional -requirements." He also said in email that it can be done without -breaking user's code: "If you take a look at my suggested -solution, reverse_iterator doesn't have to take two parameters; there -is no danger of breaking existing code, except someone taking the -address of one of the reverse_iterator global operator functions, and -I have to doubt if anyone has ever done that. . . But, just in -case they have, you can leave the old global functions in as well -- -they won't interfere with the two-template-argument functions. With -that, I don't see how any user code could break." -

- - -

Proposed resolution:

-

-Section: 24.4.1.1 [reverse.iterator] -add/change the following declarations:

-
  A) Add a templated assignment operator, after the same manner
-        as the templated copy constructor, i.e.:
-
-  template < class U >
-  reverse_iterator < Iterator >& operator=(const reverse_iterator< U >& u);
-
-  B) Make all global functions (except the operator+) have
-  two template parameters instead of one, that is, for
-  operator ==, !=, <, >, <=, >=, - replace:
-
-       template < class Iterator >
-       typename reverse_iterator< Iterator >::difference_type operator-(
-                 const reverse_iterator< Iterator >& x,
-                 const reverse_iterator< Iterator >& y);
-
-  with:
-
-      template < class Iterator1, class Iterator2 >
-      typename reverse_iterator < Iterator1 >::difference_type operator-(
-                 const reverse_iterator < Iterator1 > & x,
-                 const reverse_iterator < Iterator2 > & y);
-
-

-Also make the addition/changes for these signatures in -24.4.1.3 [reverse.iter.ops]. -

- -

[ -Copenhagen: The LWG is concerned that the proposed resolution -introduces new overloads. Experience shows that introducing -overloads is always risky, and that it would be inappropriate to -make this change without implementation experience. It may be -desirable to provide this feature in a different way. -]

- - -

[ -Lillehammer: We now have implementation experience, and agree that -this solution is safe and correct. -]

- - - - - - - -
-

281. std::min() and max() requirements overly restrictive

-

Section: 25.3.7 [alg.min.max] Status: WP - Submitter: Martin Sebor Date: 2000-12-02

-

View all other issues in [alg.min.max].

-

View all issues with WP status.

-

Duplicate of: 486

-

Discussion:

-

The requirements in 25.3.7, p1 and 4 call for T to satisfy the -requirements of LessThanComparable ( [lessthancomparable]) -and CopyConstructible (20.1.1 [utility.arg.requirements]). -Since the functions take and return their arguments and result by -const reference, I believe the CopyConstructible requirement -is unnecessary. -

- - -

Proposed resolution:

-

Remove the CopyConstructible requirement. Specifically, replace -25.3.7, p1 with

-

-1- Requires: Type T is LessThanComparable -( [lessthancomparable]). -

-

and replace 25.3.7, p4 with

-

-4- Requires: Type T is LessThanComparable -( [lessthancomparable]). -

- - - - -
-

282. What types does numpunct grouping refer to?

-

Section: 22.2.2.2.2 [facet.num.put.virtuals] Status: WP - Submitter: Howard Hinnant Date: 2000-12-05

-

View all other issues in [facet.num.put.virtuals].

-

View all issues with WP status.

-

Discussion:

-

-Paragraph 16 mistakenly singles out integral types for inserting -thousands_sep() characters. This conflicts with the syntax for floating -point numbers described under 22.2.3.1/2. -

- - -

Proposed resolution:

-

Change paragraph 16 from:

- -

-For integral types, punct.thousands_sep() characters are inserted into -the sequence as determined by the value returned by punct.do_grouping() -using the method described in 22.2.3.1.2 [facet.numpunct.virtuals]. -

- -

To:

- -

-For arithmetic types, punct.thousands_sep() characters are inserted into -the sequence as determined by the value returned by punct.do_grouping() -using the method described in 22.2.3.1.2 [facet.numpunct.virtuals]. -

- -

[ -Copenhagen: Opinions were divided about whether this is actually an -inconsistency, but at best it seems to have been unintentional. This -is only an issue for floating-point output: The standard is -unambiguous that implementations must parse thousands_sep characters -when performing floating-point. The standard is also unambiguous that -this requirement does not apply to the "C" locale. -]

- - -

[ -A survey of existing practice is needed; it is believed that some -implementations do insert thousands_sep characters for floating-point -output and others fail to insert thousands_sep characters for -floating-point input even though this is unambiguously required by the -standard. -]

- - -

[Post-Curaçao: the above proposed resolution is the consensus of -Howard, Bill, Pete, Benjamin, Nathan, Dietmar, Boris, and Martin.]

- - - - - - -
-

283. std::replace() requirement incorrect/insufficient

-

Section: 25.2.5 [alg.replace] Status: WP - Submitter: Martin Sebor Date: 2000-12-15

-

View all other issues in [alg.replace].

-

View all issues with WP status.

-

Duplicate of: 483

-

Discussion:

-

-(revision of the further discussion) -There are a number of problems with the requires clauses for the -algorithms in 25.1 and 25.2. The requires clause of each algorithm -should describe the necessary and sufficient requirements on the inputs -to the algorithm such that the algorithm compiles and runs properly. -Many of the requires clauses fail to do this. Here is a summary of the kinds -of mistakes: -

- -
    -
  1. -Use of EqualityComparable, which only puts requirements on a single -type, when in fact an equality operator is required between two -different types, typically either T and the iterator's value type -or between the value types of two different iterators. -
  2. -
  3. -Use of Assignable for T when in fact what was needed is Assignable -for the value_type of the iterator, and convertability from T to the -value_type of the iterator. Or for output iterators, the requirement -should be that T is writable to the iterator (output iterators do -not have value types). -
  4. -
- -

-Here is the list of algorithms that contain mistakes: -

- -
    -
  • 25.1.2 std::find
  • -
  • 25.1.6 std::count
  • -
  • 25.1.8 std::equal
  • -
  • 25.1.9 std::search, std::search_n
  • -
  • 25.2.4 std::replace, std::replace_copy
  • -
  • 25.2.5 std::fill
  • -
  • 25.2.7 std::remove, std::remove_copy
  • -
- -

-Also, in the requirements for EqualityComparable, the requirement that -the operator be defined for const objects is lacking. -

- - - -

Proposed resolution:

- -

20.1.1 Change p1 from

- -

In Table 28, T is a type to be supplied by a C++ program -instantiating a template, a, b, and c are -values of type T. -

- -

to

- -

-In Table 28, T is a type to be supplied by a C++ program -instantiating a template, a, b, and c are -values of type const T. -

- -

25 Between p8 and p9

- -

Add the following sentence:

- -

When the description of an algorithm gives an expression such as -*first == value for a condition, it is required that the expression -evaluate to either true or false in boolean contexts.

- -

25.1.2 Change p1 by deleting the requires clause.

- -

25.1.6 Change p1 by deleting the requires clause.

- -

25.1.9

- -

Change p4 from

- -

-4- Requires: Type T is EqualityComparable -(20.1.1), type Size is convertible to integral type (4.7.12.3). -

- -

to

- -

-4- Requires: The type Size is convertible to integral -type (4.7.12.3).

- -

25.2.4 Change p1 from

- -

-1- Requires: Type T is Assignable (23.1 ) (and, for replace(), EqualityComparable (20.1.1 )).

- -

to

- -

-1- Requires: The expression *first = new_value must be valid.

- -

and change p4 from

- -

-4- Requires: Type T is Assignable (23.1) (and, -for replace_copy(), EqualityComparable -(20.1.1)). The ranges [first, last) and [result, result + -(last - first)) shall not overlap.

- -

to

- -

-4- Requires: The results of the expressions *first and -new_value must be writable to the result output iterator. The -ranges [first, last) and [result, result + (last - -first)) shall not overlap.

- - -

25.2.5 Change p1 from

- -

-1- Requires: Type T is Assignable (23.1). The -type Size is convertible to an integral type (4.7.12.3).

- -

to

- -

-1- Requires: The expression value must be is writable to -the output iterator. The type Size is convertible to an -integral type (4.7.12.3).

- -

25.2.7 Change p1 from

- -

-1- Requires: Type T is EqualityComparable (20.1.1).

- -

to

- -

--1- Requires: The value type of the iterator must be -Assignable (23.1). -

- - - -

Rationale:

-

-The general idea of the proposed solution is to remove the faulty -requires clauses and let the returns and effects clauses speak for -themselves. That is, the returns clauses contain expressions that must -be valid, and therefore already imply the correct requirements. In -addition, a sentence is added at the beginning of chapter 25 saying -that expressions given as conditions must evaluate to true or false in -a boolean context. An alternative would be to say that the type of -these condition expressions must be literally bool, but that would be -imposing a greater restriction that what the standard currently says -(which is convertible to bool). -

- - - - - -
-

284. unportable example in 20.3.7, p6

-

Section: 20.5.7 [comparisons] Status: WP - Submitter: Martin Sebor Date: 2000-12-26

-

View all issues with WP status.

-

Discussion:

-

The example in 20.5.7 [comparisons], p6 shows how to use the C -library function strcmp() with the function pointer adapter -ptr_fun(). But since it's unspecified whether the C library -functions have extern "C" or extern -"C++" linkage [17.4.2.2 [using.linkage]], and since -function pointers with different the language linkage specifications -(7.5 [dcl.link]) are incompatible, whether this example is -well-formed is unspecified. -

- - -

Proposed resolution:

-

Change 20.5.7 [comparisons] paragraph 6 from:

-
-

[Example:

-
    replace_if(v.begin(), v.end(), not1(bind2nd(ptr_fun(strcmp), "C")), "C++");
-  
-

replaces each C with C++ in sequence v.

-
- - -

to:

-
-

[Example:

-
    int compare(const char*, const char*);
-    replace_if(v.begin(), v.end(),
-               not1(bind2nd(ptr_fun(compare), "abc")), "def");
-  
-

replaces each abc with def in sequence v.

-
- -

Also, remove footnote 215 in that same paragraph.

- -

[Copenhagen: Minor change in the proposed resolution. Since this -issue deals in part with C and C++ linkage, it was believed to be too -confusing for the strings in the example to be "C" and "C++". -]

- - -

[Redmond: More minor changes. Got rid of the footnote (which -seems to make a sweeping normative requirement, even though footnotes -aren't normative), and changed the sentence after the footnote so that -it corresponds to the new code fragment.]

- - - - - - -
-

285. minor editorial errors in fstream ctors

-

Section: 27.8.1.7 [ifstream.cons] Status: WP - Submitter: Martin Sebor Date: 2000-12-31

-

View all issues with WP status.

-

Discussion:

-

27.8.1.7 [ifstream.cons], p2, 27.8.1.11 [ofstream.cons], p2, and -27.8.1.15 [fstream.cons], p2 say about the effects of each constructor: -

- -

... If that function returns a null pointer, calls -setstate(failbit) (which may throw ios_base::failure). -

- -

The parenthetical note doesn't apply since the ctors cannot throw an -exception due to the requirement in 27.4.4.1 [basic.ios.cons], p3 -that exceptions() be initialized to ios_base::goodbit. -

- - -

Proposed resolution:

-

-Strike the parenthetical note from the Effects clause in each of the -paragraphs mentioned above. -

- - - - -
-

286. <cstdlib> requirements missing size_t typedef

-

Section: 25.4 [alg.c.library] Status: WP - Submitter: Judy Ward Date: 2000-12-30

-

View all other issues in [alg.c.library].

-

View all issues with WP status.

-

Discussion:

-

-The <cstdlib> header file contains prototypes for bsearch and -qsort (C++ Standard section 25.4 paragraphs 3 and 4) and other -prototypes (C++ Standard section 21.4 paragraph 1 table 49) that -require the typedef size_t. Yet size_t is not listed in the -<cstdlib> synopsis table 78 in section 25.4. -

- - -

Proposed resolution:

-

-Add the type size_t to Table 78 (section 25.4) and add -the type size_t <cstdlib> to Table 97 (section C.2). -

- - -

Rationale:

-

Since size_t is in <stdlib.h>, it must also be in <cstdlib>.

- - - - - -
-

288. <cerrno> requirements missing macro EILSEQ

-

Section: 19.3 [errno] Status: WP - Submitter: Judy Ward Date: 2000-12-30

-

View all issues with WP status.

-

Discussion:

-

-ISO/IEC 9899:1990/Amendment1:1994 Section 4.3 States: "The list -of macros defined in <errno.h> is adjusted to include a new -macro, EILSEQ" -

- -

-ISO/IEC 14882:1998(E) section 19.3 does not refer -to the above amendment. -

- - - -

Proposed resolution:

-

-Update Table 26 (section 19.3) "Header <cerrno> synopsis" -and Table 95 (section C.2) "Standard Macros" to include EILSEQ. -

- - - - - -
-

291. Underspecification of set algorithms

-

Section: 25.3.5 [alg.set.operations] Status: WP - Submitter: Matt Austern Date: 2001-01-03

-

View all other issues in [alg.set.operations].

-

View all issues with WP status.

-

Discussion:

-

-The standard library contains four algorithms that compute set -operations on sorted ranges: set_union, set_intersection, -set_difference, and set_symmetric_difference. Each -of these algorithms takes two sorted ranges as inputs, and writes the -output of the appropriate set operation to an output range. The elements -in the output range are sorted. -

- -

-The ordinary mathematical definitions are generalized so that they -apply to ranges containing multiple copies of a given element. Two -elements are considered to be "the same" if, according to an -ordering relation provided by the user, neither one is less than the -other. So, for example, if one input range contains five copies of an -element and another contains three, the output range of set_union -will contain five copies, the output range of -set_intersection will contain three, the output range of -set_difference will contain two, and the output range of -set_symmetric_difference will contain two. -

- -

-Because two elements can be "the same" for the purposes -of these set algorithms, without being identical in other respects -(consider, for example, strings under case-insensitive comparison), -this raises a number of unanswered questions: -

- -
    -
  • If we're copying an element that's present in both of the -input ranges, which one do we copy it from?
  • -
  • If there are n copies of an element in the relevant -input range, and the output range will contain fewer copies (say -m) which ones do we choose? The first m, or the last -m, or something else?
  • -
  • Are these operations stable? That is, does a run of equivalent -elements appear in the output range in the same order as as it -appeared in the input range(s)?
  • -
- -

-The standard should either answer these questions, or explicitly -say that the answers are unspecified. I prefer the former option, -since, as far as I know, all existing implementations behave the -same way. -

- - - -

Proposed resolution:

- -

Add the following to the end of 25.3.5.2 [set.union] paragraph 5:

-

-If [first1, last1) contains m elements that are equivalent to -each other and [first2, last2) contains n elements that are -equivalent to them, then max(m, n) of these elements -will be copied to the output range: all m of these elements -from [first1, last1), and the last max(n-m, 0) of them from -[first2, last2), in that order. -

- -

Add the following to the end of 25.3.5.3 [set.intersection] paragraph 5:

-

-If [first1, last1) contains m elements that are equivalent to each -other and [first2, last2) contains n elements that are -equivalent to them, the first min(m, n) of those -elements from [first1, last1) are copied to the output range. -

- -

Add a new paragraph, Notes, after 25.3.5.4 [set.difference] -paragraph 4:

-

-If [first1, last1) contains m elements that are equivalent to each -other and [first2, last2) contains n elements that are -equivalent to them, the last max(m-n, 0) elements from -[first1, last1) are copied to the output range. -

- -

Add a new paragraph, Notes, after 25.3.5.5 [set.symmetric.difference] -paragraph 4:

-

-If [first1, last1) contains m elements that are equivalent to -each other and [first2, last2) contains n elements that are -equivalent to them, then |m - n| of those elements will be -copied to the output range: the last m - n of these elements -from [first1, last1) if m > n, and the last n - -m of these elements from [first2, last2) if m < n. -

- -

[Santa Cruz: it's believed that this language is clearer than - what's in the Standard. However, it's also believed that the - Standard may already make these guarantees (although not quite in - these words). Bill and Howard will check and see whether they think - that some or all of these changes may be redundant. If so, we may - close this issue as NAD.]

- - - - -

Rationale:

-

For simple cases, these descriptions are equivalent to what's - already in the Standard. For more complicated cases, they describe - the behavior of existing implementations.

- - - - - -
-

292. effects of a.copyfmt (a)

-

Section: 27.4.4.2 [basic.ios.members] Status: WP - Submitter: Martin Sebor Date: 2001-01-05

-

View all other issues in [basic.ios.members].

-

View all issues with WP status.

-

Discussion:

-

The Effects clause of the member function copyfmt() in -27.4.4.2, p15 doesn't consider the case where the left-hand side -argument is identical to the argument on the right-hand side, that is -(this == &rhs). If the two arguments are identical there -is no need to copy any of the data members or call any callbacks -registered with register_callback(). Also, as Howard Hinnant -points out in message c++std-lib-8149 it appears to be incorrect to -allow the object to fire erase_event followed by -copyfmt_event since the callback handling the latter event -may inadvertently attempt to access memory freed by the former. -

- - -

Proposed resolution:

-

Change the Effects clause in 27.4.4.2, p15 from

- -

--15- Effects:Assigns to the member objects of *this -the corresponding member objects of rhs, except that... -

- -

to

- -

--15- Effects:If (this == &rhs) does nothing. Otherwise -assigns to the member objects of *this the corresponding member -objects of rhs, except that... -

- - - - -
-

294. User defined macros and standard headers

-

Section: 17.4.3.1.1 [macro.names] Status: WP - Submitter: James Kanze Date: 2001-01-11

-

View all issues with WP status.

-

Discussion:

-

Paragraph 2 of 17.4.3.1.1 [macro.names] reads: "A -translation unit that includes a header shall not contain any macros -that define names declared in that header." As I read this, it -would mean that the following program is legal:

- -
  #define npos 3.14
-  #include <sstream>
-
- -

since npos is not defined in <sstream>. It is, however, defined -in <string>, and it is hard to imagine an implementation in -which <sstream> didn't include <string>.

- -

I think that this phrase was probably formulated before it was -decided that a standard header may freely include other standard -headers. The phrase would be perfectly appropriate for C, for -example. In light of 17.4.4.1 [res.on.headers] paragraph 1, however, -it isn't stringent enough.

- - -

Proposed resolution:

-

For 17.4.3.1.1 [macro.names], replace the current wording, which reads:

-
-

Each name defined as a macro in a header is reserved to the - implementation for any use if the translation unit includes - the header.168)

- -

A translation unit that includes a header shall not contain any - macros that define names declared or defined in that header. Nor shall - such a translation unit define macros for names lexically - identical to keywords.

- -

168) It is not permissible to remove a library macro definition by - using the #undef directive.

-
- -

with the wording:

- -
-

A translation unit that includes a standard library header shall not - #define or #undef names declared in any standard library header.

- -

A translation unit shall not #define or #undef names lexically - identical to keywords.

-
- -

[Lillehammer: Beman provided new wording]

- - - - - - -
-

295. Is abs defined in <cmath>?

-

Section: 26.7 [c.math] Status: WP - Submitter: Jens Maurer Date: 2001-01-12

-

View other active issues in [c.math].

-

View all other issues in [c.math].

-

View all issues with WP status.

-

Discussion:

-

-Table 80 lists the contents of the <cmath> header. It does not -list abs(). However, 26.5, paragraph 6, which lists added -signatures present in <cmath>, does say that several overloads -of abs() should be defined in <cmath>. -

- - -

Proposed resolution:

-

-Add abs to Table 80. Also, remove the parenthetical list -of functions "(abs(), div(), rand(), srand())" from 26.5 [numarray], -paragraph 1. -

- -

[Copenhagen: Modified proposed resolution so that it also gets -rid of that vestigial list of functions in paragraph 1.]

- - - - -

Rationale:

-

All this DR does is fix a typo; it's uncontroversial. A -separate question is whether we're doing the right thing in -putting some overloads in <cmath> that we aren't also -putting in <cstdlib>. That's issue 323.

- - - - - -
-

297. const_mem_fun_t<>::argument_type should be const T*

-

Section: 20.5.8 [logical.operations] Status: WP - Submitter: Martin Sebor Date: 2001-01-06

-

View all issues with WP status.

-

Discussion:

-

The class templates const_mem_fun_t in 20.5.8, p8 and -const_mem_fun1_t -in 20.5.8, p9 derive from unary_function<T*, S>, and -binary_function<T*, -A, S>, respectively. Consequently, their argument_type, and -first_argument_type -members, respectively, are both defined to be T* (non-const). -However, their function call member operator takes a const T* -argument. It is my opinion that argument_type should be const -T* instead, so that one can easily refer to it in generic code. The -example below derived from existing code fails to compile due to the -discrepancy: -

- -

template <class T> -
void foo (typename T::argument_type arg)   // #1 -
{ -
    typename T::result_type (T::*pf) (typename -T::argument_type) -const =   // #2 -
        &T::operator(); -
} -

- -

struct X { /* ... */ };

- -

int main () -
{ -
    const X x; -
    foo<std::const_mem_fun_t<void, X> ->(&x);   -// #3 -
} -

- -

#1 foo() takes a plain unqualified X* as an argument -
#2 the type of the pointer is incompatible with the type of the member -function -
#3 the address of a constant being passed to a function taking a non-const -X* -

- - -

Proposed resolution:

-

Replace the top portion of the definition of the class template -const_mem_fun_t in 20.5.8, p8 -

-

template <class S, class T> class const_mem_fun_t -
          : public -unary_function<T*, S> { -

-

with

-

template <class S, class T> class const_mem_fun_t -
          : public -unary_function<const T*, S> { -

-

Also replace the top portion of the definition of the class template -const_mem_fun1_t in 20.5.8, p9

-

template <class S, class T, class A> class const_mem_fun1_t -
          : public -binary_function<T*, A, S> { -

-

with

-

template <class S, class T, class A> class const_mem_fun1_t -
          : public -binary_function<const T*, A, S> { -

- - -

Rationale:

-

This is simply a contradiction: the argument_type typedef, -and the argument type itself, are not the same.

- - - - - -
-

298. ::operator delete[] requirement incorrect/insufficient

-

Section: 18.5.1.2 [new.delete.array] Status: WP - Submitter: John A. Pedretti Date: 2001-01-10

-

View all issues with WP status.

-

Discussion:

-

-The default behavior of operator delete[] described in 18.5.1.2, p12 - -namely that for non-null value of ptr, the operator reclaims storage -allocated by the earlier call to the default operator new[] - is not -correct in all cases. Since the specified operator new[] default -behavior is to call operator new (18.5.1.2, p4, p8), which can be -replaced, along with operator delete, by the user, to implement their -own memory management, the specified default behavior of operator -delete[] must be to call operator delete. -

- - -

Proposed resolution:

-

Change 18.5.1.2, p12 from

-

--12- Default behavior:

-
    -
  • -For a null value of ptr , does nothing. -
  • -
  • -Any other value of ptr shall be a value returned -earlier by a call to the default operator new[](std::size_t). -[Footnote: The value must not have been invalidated by an intervening -call to operator delete[](void*) (17.4.3.7 [res.on.arguments]). ---- end footnote] -For such a non-null value of ptr , reclaims storage -allocated by the earlier call to the default operator new[]. -
  • -
-
- -

to

- -

--12- Default behavior: Calls operator -delete(ptr) -or operator delete(ptr, std::nothrow) respectively. -

-

and expunge paragraph 13.

- - - - -
-

300. list::merge() specification incomplete

-

Section: 23.2.3.4 [list.ops] Status: WP - Submitter: John Pedretti Date: 2001-01-23

-

View all other issues in [list.ops].

-

View all issues with WP status.

-

Discussion:

-

-The "Effects" clause for list::merge() (23.2.3.4 [list.ops], p23) -appears to be incomplete: it doesn't cover the case where the argument -list is identical to *this (i.e., this == &x). The requirement in the -note in p24 (below) is that x be empty after the merge which is surely -unintended in this case. -

- - -

Proposed resolution:

-

In 23.2.3.4 [list.ops], replace paragraps 23-25 with:

-
-

-23 Effects: if (&x == this) does nothing; otherwise, merges the two -sorted ranges [begin(), end()) and [x.begin(), x.end()). The result -is a range in which the elements will be sorted in non-decreasing -order according to the ordering defined by comp; that is, for every -iterator i in the range other than the first, the condition comp(*i, -*(i - 1)) will be false. -

- -

-24 Notes: Stable: if (&x != this), then for equivalent elements in the -two original ranges, the elements from the original range [begin(), -end()) always precede the elements from the original range [x.begin(), -x.end()). If (&x != this) the range [x.begin(), x.end()) is empty -after the merge. -

- -

-25 Complexity: At most size() + x.size() - 1 applications of comp if -(&x ! = this); otherwise, no applications of comp are performed. If -an exception is thrown other than by a comparison there are no -effects. -

- -
- -

[Copenhagen: The original proposed resolution did not fix all of -the problems in 23.2.3.4 [list.ops], p22-25. Three different -paragraphs (23, 24, 25) describe the effects of merge. -Changing p23, without changing the other two, appears to introduce -contradictions. Additionally, "merges the argument list into the -list" is excessively vague.]

- - -

[Post-Curaçao: Robert Klarer provided new wording.]

- - - - - - - -
-

301. basic_string template ctor effects clause omits allocator argument

-

Section: 21.3.1 [string.require] Status: WP - Submitter: Martin Sebor Date: 2001-01-27

-

View all other issues in [string.require].

-

View all issues with WP status.

-

Discussion:

-

-The effects clause for the basic_string template ctor in 21.3.1, p15 -leaves out the third argument of type Allocator. I believe this to be -a mistake. -

- - -

Proposed resolution:

-

Replace

- -
-

-15- Effects: If InputIterator is an integral - type, equivalent to

- -

basic_string(static_cast<size_type>(begin), - static_cast<value_type>(end))

-
- -

with

- -
-

-15- Effects: If InputIterator is an integral - type, equivalent to

- -

basic_string(static_cast<size_type>(begin), - static_cast<value_type>(end), a)

-
- - - - -
-

303. Bitset input operator underspecified

-

Section: 23.3.5.3 [bitset.operators] Status: WP - Submitter: Matt Austern Date: 2001-02-05

-

View all issues with WP status.

-

Discussion:

-

-In 23.3.5.3, we are told that bitset's input operator -"Extracts up to N (single-byte) characters from -is.", where is is a stream of type -basic_istream<charT, traits>. -

- -

-The standard does not say what it means to extract single byte -characters from a stream whose character type, charT, is in -general not a single-byte character type. Existing implementations -differ. -

- -

-A reasonable solution will probably involve widen() and/or -narrow(), since they are the supplied mechanism for -converting a single character between char and -arbitrary charT. -

- -

Narrowing the input characters is not the same as widening the -literals '0' and '1', because there may be some -locales in which more than one wide character maps to the narrow -character '0'. Narrowing means that alternate -representations may be used for bitset input, widening means that -they may not be.

- -

Note that for numeric input, num_get<> -(22.2.2.1.2/8) compares input characters to widened version of narrow -character literals.

- -

From Pete Becker, in c++std-lib-8224:

-
-

-Different writing systems can have different representations for the -digits that represent 0 and 1. For example, in the Unicode representation -of the Devanagari script (used in many of the Indic languages) the digit 0 -is 0x0966, and the digit 1 is 0x0967. Calling narrow would translate those -into '0' and '1'. But Unicode also provides the ASCII values 0x0030 and -0x0031 for for the Latin representations of '0' and '1', as well as code -points for the same numeric values in several other scripts (Tamil has no -character for 0, but does have the digits 1-9), and any of these values -would also be narrowed to '0' and '1'. -

- -

...

- -

-It's fairly common to intermix both native and Latin -representations of numbers in a document. So I think the rule has to be -that if a wide character represents a digit whose value is 0 then the bit -should be cleared; if it represents a digit whose value is 1 then the bit -should be set; otherwise throw an exception. So in a Devanagari locale, -both 0x0966 and 0x0030 would clear the bit, and both 0x0967 and 0x0031 -would set it. Widen can't do that. It would pick one of those two values, -and exclude the other one. -

- -
- -

From Jens Maurer, in c++std-lib-8233:

- -
-

-Whatever we decide, I would find it most surprising if -bitset conversion worked differently from int conversion -with regard to alternate local representations of -numbers. -

- -

Thus, I think the options are:

-
    -
  • Have a new defect issue for 22.2.2.1.2/8 so that it will -require the use of narrow().
  • - -
  • Have a defect issue for bitset() which describes clearly -that widen() is to be used.
  • -
-
- - - -

Proposed resolution:

- -

Replace the first two sentences of paragraph 5 with:

- -

- Extracts up to N characters from is. Stores these - characters in a temporary object str of type - basic_string<charT, traits>, then evaluates the - expression x = bitset<N>(str). -

- -

Replace the third bullet item in paragraph 5 with:

-
  • - the next input character is neither is.widen(0) - nor is.widen(1) (in which case the input character - is not extracted). -
- - - -

Rationale:

-

Input for bitset should work the same way as numeric -input. Using widen does mean that alternative digit -representations will not be recognized, but this was a known -consequence of the design choice.

- - - - - -
-

305. Default behavior of codecvt<wchar_t, char, mbstate_t>::length()

-

Section: 22.2.1.5 [locale.codecvt.byname] Status: WP - Submitter: Howard Hinnant Date: 2001-01-24

-

View all other issues in [locale.codecvt.byname].

-

View all issues with WP status.

-

Discussion:

-

22.2.1.5/3 introduces codecvt in part with:

- -

- codecvt<wchar_t,char,mbstate_t> converts between the native - character sets for tiny and wide characters. Instantiations on - mbstate_t perform conversion between encodings known to the library - implementor. -

- -

But 22.2.1.5.2/10 describes do_length in part with:

- -

- ... codecvt<wchar_t, char, mbstate_t> ... return(s) the lesser of max and - (from_end-from). -

- -

-The semantics of do_in and do_length are linked. What one does must -be consistent with what the other does. 22.2.1.5/3 leads me to -believe that the vendor is allowed to choose the algorithm that -codecvt<wchar_t,char,mbstate_t>::do_in performs so that it makes -his customers happy on a given platform. But 22.2.1.5.2/10 explicitly -says what codecvt<wchar_t,char,mbstate_t>::do_length must -return. And thus indirectly specifies the algorithm that -codecvt<wchar_t,char,mbstate_t>::do_in must perform. I believe -that this is not what was intended and is a defect. -

- -

Discussion from the -lib reflector: - -
This proposal would have the effect of making the semantics of -all of the virtual functions in codecvt<wchar_t, char, -mbstate_t> implementation specified. Is that what we want, or -do we want to mandate specific behavior for the base class virtuals -and leave the implementation specified behavior for the codecvt_byname -derived class? The tradeoff is that former allows implementors to -write a base class that actually does something useful, while the -latter gives users a way to get known and specified---albeit -useless---behavior, and is consistent with the way the standard -handles other facets. It is not clear what the original intention -was.

- -

-Nathan has suggest a compromise: a character that is a widened version -of the characters in the basic execution character set must be -converted to a one-byte sequence, but there is no such requirement -for characters that are not part of the basic execution character set. -

- - -

Proposed resolution:

-

-Change 22.2.1.5.2/5 from: -

-

-The instantiations required in Table 51 (lib.locale.category), namely -codecvt<wchar_t,char,mbstate_t> and -codecvt<char,char,mbstate_t>, store no characters. Stores no more -than (to_limit-to) destination elements. It always leaves the to_next -pointer pointing one beyond the last element successfully stored. -

-

-to: -

-

-Stores no more than (to_limit-to) destination elements, and leaves the -to_next pointer pointing one beyond the last element successfully -stored. codecvt<char,char,mbstate_t> stores no characters. -

- -

Change 22.2.1.5.2/10 from:

- -

--10- Returns: (from_next-from) where from_next is the largest value in -the range [from,from_end] such that the sequence of values in the -range [from,from_next) represents max or fewer valid complete -characters of type internT. The instantiations required in Table 51 -(21.1.1.1.1), namely codecvt<wchar_t, char, mbstate_t> and -codecvt<char, char, mbstate_t>, return the lesser of max and -(from_end-from). -

- -

to:

- -

--10- Returns: (from_next-from) where from_next is the largest value in -the range [from,from_end] such that the sequence of values in the range -[from,from_next) represents max or fewer valid complete characters of -type internT. The instantiation codecvt<char, char, mbstate_t> returns -the lesser of max and (from_end-from). -

- -

[Redmond: Nathan suggested an alternative resolution: same as -above, but require that, in the default encoding, a character from the -basic execution character set would map to a single external -character. The straw poll was 8-1 in favor of the proposed -resolution.]

- - - - -

Rationale:

-

The default encoding should be whatever users of a given platform -would expect to be the most natural. This varies from platform to -platform. In many cases there is a preexisting C library, and users -would expect the default encoding to be whatever C uses in the default -"C" locale. We could impose a guarantee like the one Nathan suggested -(a character from the basic execution character set must map to a -single external character), but this would rule out important -encodings that are in common use: it would rule out JIS, for -example, and it would rule out a fixed-width encoding of UCS-4.

- -

[Curaçao: fixed rationale typo at the request of Ichiro Koshida; -"shift-JIS" changed to "JIS".]

- - - - - - - -
-

306. offsetof macro and non-POD types

-

Section: 18.1 [support.types] Status: WP - Submitter: Steve Clamage Date: 2001-02-21

-

View all other issues in [support.types].

-

View all issues with WP status.

-

Discussion:

-

Spliced together from reflector messages c++std-lib-8294 and -8295:

- -

18.1, paragraph 5, reads: "The macro offsetof -accepts a restricted set of type arguments in this -International Standard. type shall be a POD structure or a POD -union (clause 9). The result of applying the offsetof macro to a field -that is a static data member or a function member is -undefined."

- -

For the POD requirement, it doesn't say "no diagnostic -required" or "undefined behavior". I read 1.4 [intro.compliance], paragraph 1, to mean that a diagnostic is required. -It's not clear whether this requirement was intended. While it's -possible to provide such a diagnostic, the extra complication doesn't -seem to add any value. -

- - -

Proposed resolution:

-

Change 18.1, paragraph 5, to "If type is not a POD -structure or a POD union the results are undefined."

- -

[Copenhagen: straw poll was 7-4 in favor. It was generally -agreed that requiring a diagnostic was inadvertent, but some LWG -members thought that diagnostics should be required whenever -possible.]

- - - - - - -
-

307. Lack of reference typedefs in container adaptors

-

Section: 23.2.3 [list] Status: WP - Submitter: Howard Hinnant Date: 2001-03-13

-

View all issues with WP status.

-

Discussion:

- -

From reflector message c++std-lib-8330. See also lib-8317.

- -

-The standard is currently inconsistent in 23.2.3.2 [list.capacity] -paragraph 1 and 23.2.3.3 [list.modifiers] paragraph 1. -23.2.3.3/1, for example, says: -

- -

--1- Any sequence supporting operations back(), push_back() and pop_back() -can be used to instantiate stack. In particular, vector (lib.vector), list -(lib.list) and deque (lib.deque) can be used. -

- -

But this is false: vector<bool> can not be used, because the -container adaptors return a T& rather than using the underlying -container's reference type.

- -

This is a contradiction that can be fixed by:

- -
    -
  1. Modifying these paragraphs to say that vector<bool> - is an exception.
  2. -
  3. Removing the vector<bool> specialization.
  4. -
  5. Changing the return types of stack and priority_queue to use - reference typedef's.
  6. -
- -

-I propose 3. This does not preclude option 2 if we choose to do it -later (see issue 96); the issues are independent. Option -3 offers a small step towards support for proxied containers. This -small step fixes a current contradiction, is easy for vendors to -implement, is already implemented in at least one popular lib, and -does not break any code. -

- - - -

Proposed resolution:

-

Summary: Add reference and const_reference typedefs to queue, -priority_queue and stack. Change return types of "value_type&" to -"reference". Change return types of "const value_type&" to -"const_reference". Details:

- -

Change 23.2.3.1/1 from:

- -
  namespace std {
-    template <class T, class Container = deque<T> >
-    class queue {
-    public:
-      typedef typename Container::value_type            value_type;
-      typedef typename Container::size_type             size_type;
-      typedef          Container                        container_type;
-    protected:
-      Container c;
-
-    public:
-      explicit queue(const Container& = Container());
-
-      bool      empty() const             { return c.empty(); }
-      size_type size()  const             { return c.size(); }
-      value_type&       front()           { return c.front(); }
-      const value_type& front() const     { return c.front(); }
-      value_type&       back()            { return c.back(); }
-      const value_type& back() const      { return c.back(); }
-      void push(const value_type& x)      { c.push_back(x); }
-      void pop()                          { c.pop_front(); }
-    };
-
- -

to:

- -
  namespace std {
-    template <class T, class Container = deque<T> >
-    class queue {
-    public:
-      typedef typename Container::value_type            value_type;
-      typedef typename Container::reference             reference;
-      typedef typename Container::const_reference       const_reference;
-      typedef typename Container::value_type            value_type;
-      typedef typename Container::size_type             size_type;
-      typedef          Container                        container_type;
-    protected:
-      Container c;
-
-    public:
-      explicit queue(const Container& = Container());
-
-      bool      empty() const             { return c.empty(); }
-      size_type size()  const             { return c.size(); }
-      reference         front()           { return c.front(); }
-      const_reference   front() const     { return c.front(); }
-      reference         back()            { return c.back(); }
-      const_reference   back() const      { return c.back(); }
-      void push(const value_type& x)      { c.push_back(x); }
-      void pop()                          { c.pop_front(); }
-    };
-
- -

Change 23.2.3.2/1 from:

- -
  namespace std {
-    template <class T, class Container = vector<T>,
-              class Compare = less<typename Container::value_type> >
-    class priority_queue {
-    public:
-      typedef typename Container::value_type            value_type;
-      typedef typename Container::size_type             size_type;
-      typedef          Container                        container_type;
-    protected:
-      Container c;
-      Compare comp;
-
-    public:
-      explicit priority_queue(const Compare& x = Compare(),
-                              const Container& = Container());
-      template <class InputIterator>
-        priority_queue(InputIterator first, InputIterator last,
-                       const Compare& x = Compare(),
-                       const Container& = Container());
-
-      bool      empty() const       { return c.empty(); }
-      size_type size()  const       { return c.size(); }
-      const value_type& top() const { return c.front(); }
-      void push(const value_type& x);
-      void pop();
-    };
-                                  //  no equality is provided
-  }
-
- -

to:

- -
  namespace std {
-    template <class T, class Container = vector<T>,
-              class Compare = less<typename Container::value_type> >
-    class priority_queue {
-    public:
-      typedef typename Container::value_type            value_type;
-      typedef typename Container::reference             reference;
-      typedef typename Container::const_reference       const_reference;
-      typedef typename Container::size_type             size_type;
-      typedef          Container                        container_type;
-    protected:
-      Container c;
-      Compare comp;
-
-    public:
-      explicit priority_queue(const Compare& x = Compare(),
-                              const Container& = Container());
-      template <class InputIterator>
-        priority_queue(InputIterator first, InputIterator last,
-                       const Compare& x = Compare(),
-                       const Container& = Container());
-
-      bool      empty() const       { return c.empty(); }
-      size_type size()  const       { return c.size(); }
-      const_reference   top() const { return c.front(); }
-      void push(const value_type& x);
-      void pop();
-    };
-                                  //  no equality is provided
-  }
-
- -

And change 23.2.3.3/1 from:

- -
  namespace std {
-    template <class T, class Container = deque<T> >
-    class stack {
-    public:
-      typedef typename Container::value_type            value_type;
-      typedef typename Container::size_type             size_type;
-      typedef          Container                        container_type;
-    protected:
-      Container c;
-
-    public:
-      explicit stack(const Container& = Container());
-
-      bool      empty() const             { return c.empty(); }
-      size_type size()  const             { return c.size(); }
-      value_type&       top()             { return c.back(); }
-      const value_type& top() const       { return c.back(); }
-      void push(const value_type& x)      { c.push_back(x); }
-      void pop()                          { c.pop_back(); }
-    };
-
-    template <class T, class Container>
-      bool operator==(const stack<T, Container>& x,
-                      const stack<T, Container>& y);
-    template <class T, class Container>
-      bool operator< (const stack<T, Container>& x,
-                      const stack<T, Container>& y);
-    template <class T, class Container>
-      bool operator!=(const stack<T, Container>& x,
-                      const stack<T, Container>& y);
-    template <class T, class Container>
-      bool operator> (const stack<T, Container>& x,
-                      const stack<T, Container>& y);
-    template <class T, class Container>
-      bool operator>=(const stack<T, Container>& x,
-                      const stack<T, Container>& y);
-    template <class T, class Container>
-      bool operator<=(const stack<T, Container>& x,
-                      const stack<T, Container>& y);
-  }
-
- -

to:

- -
  namespace std {
-    template <class T, class Container = deque<T> >
-    class stack {
-    public:
-      typedef typename Container::value_type            value_type;
-      typedef typename Container::reference             reference;
-      typedef typename Container::const_reference       const_reference;
-      typedef typename Container::size_type             size_type;
-      typedef          Container                        container_type;
-    protected:
-      Container c;
-
-    public:
-      explicit stack(const Container& = Container());
-
-      bool      empty() const             { return c.empty(); }
-      size_type size()  const             { return c.size(); }
-      reference         top()             { return c.back(); }
-      const_reference   top() const       { return c.back(); }
-      void push(const value_type& x)      { c.push_back(x); }
-      void pop()                          { c.pop_back(); }
-    };
-
-    template <class T, class Container>
-      bool operator==(const stack<T, Container>& x,
-                      const stack<T, Container>& y);
-    template <class T, class Container>
-      bool operator< (const stack<T, Container>& x,
-                      const stack<T, Container>& y);
-    template <class T, class Container>
-      bool operator!=(const stack<T, Container>& x,
-                      const stack<T, Container>& y);
-    template <class T, class Container>
-      bool operator> (const stack<T, Container>& x,
-                      const stack<T, Container>& y);
-    template <class T, class Container>
-      bool operator>=(const stack<T, Container>& x,
-                      const stack<T, Container>& y);
-    template <class T, class Container>
-      bool operator<=(const stack<T, Container>& x,
-                      const stack<T, Container>& y);
-  }
-
- -

[Copenhagen: This change was discussed before the IS was released -and it was deliberately not adopted. Nevertheless, the LWG believes -(straw poll: 10-2) that it is a genuine defect.]

- - - - - - -
-

308. Table 82 mentions unrelated headers

-

Section: 27 [input.output] Status: WP - Submitter: Martin Sebor Date: 2001-03-15

-

View all other issues in [input.output].

-

View all issues with WP status.

-

Discussion:

-

-Table 82 in section 27 mentions the header <cstdlib> for String -streams (27.7 [string.streams]) and the headers <cstdio> and -<cwchar> for File streams (27.8 [file.streams]). It's not clear -why these headers are mentioned in this context since they do not -define any of the library entities described by the -subclauses. According to 17.4.1.1 [contents], only such headers -are to be listed in the summary. -

- - -

Proposed resolution:

-

Remove <cstdlib> and <cwchar> from -Table 82.

- -

[Copenhagen: changed the proposed resolution slightly. The -original proposed resolution also said to remove <cstdio> from -Table 82. However, <cstdio> is mentioned several times within -section 27.8 [file.streams], including 27.8.2 [c.files].]

- - - - - - -
-

310. Is errno a macro?

-

Section: 17.4.1.2 [headers], 19.3 [errno] Status: WP - Submitter: Steve Clamage Date: 2001-03-21

-

View all other issues in [headers].

-

View all issues with WP status.

-

Discussion:

-

- Exactly how should errno be declared in a conforming C++ header? -

- -

- The C standard says in 7.1.4 that it is unspecified whether errno is a - macro or an identifier with external linkage. In some implementations - it can be either, depending on compile-time options. (E.g., on - Solaris in multi-threading mode, errno is a macro that expands to a - function call, but is an extern int otherwise. "Unspecified" allows - such variability.) -

- -

The C++ standard:

-
    -
  • 17.4.1.2 says in a note that errno must be macro in C. (false)
  • -
  • 17.4.3.1.3 footnote 166 says errno is reserved as an external - name (true), and implies that it is an identifier.
  • -
  • 19.3 simply lists errno as a macro (by what reasoning?) and goes - on to say that the contents of of C++ <errno.h> are the - same as in C, begging the question.
  • -
  • C.2, table 95 lists errno as a macro, without comment.
  • -
- -

I find no other references to errno.

- -

We should either explicitly say that errno must be a macro, even - though it need not be a macro in C, or else explicitly leave it - unspecified. We also need to say something about namespace std. - A user who includes <cerrno> needs to know whether to write - errno, or ::errno, or std::errno, or - else <cerrno> is useless.

- -

Two acceptable fixes:

-
    -
  • errno must be a macro. This is trivially satisfied by adding
    -   #define errno (::std::errno)
    - to the headers if errno is not already a macro. You then always - write errno without any scope qualification, and it always expands - to a correct reference. Since it is always a macro, you know to - avoid using errno as a local identifer.

  • -
  • errno is in the global namespace. This fix is inferior, because - ::errno is not guaranteed to be well-formed.

  • -
- -

[ - This issue was first raised in 1999, but it slipped through - the cracks. - ]

- - - -

Proposed resolution:

-

Change the Note in section 17.4.1.2p5 from

- -

- Note: the names defined as macros in C include the following: - assert, errno, offsetof, setjmp, va_arg, va_end, and va_start. -

- -

to

- -

- Note: the names defined as macros in C include the following: - assert, offsetof, setjmp, va_arg, va_end, and va_start. -

- -

In section 19.3, change paragraph 2 from

- -

- The contents are the same as the Standard C library header - <errno.h>. -

- -

to

- -

- The contents are the same as the Standard C library header - <errno.h>, except that errno shall be defined as a macro. -

- - -

Rationale:

-

C++ must not leave it up to the implementation to decide whether or -not a name is a macro; it must explicitly specify exactly which names -are required to be macros. The only one that really works is for it -to be a macro.

- -

[Curaçao: additional rationale added.]

- - - - - - - -
-

311. Incorrect wording in basic_ostream class synopsis

-

Section: 27.6.2.1 [ostream] Status: WP - Submitter: Andy Sawyer Date: 2001-03-21

-

View all other issues in [ostream].

-

View all issues with WP status.

-

Discussion:

- -

In 27.6.2.1 [ostream], the synopsis of class basic_ostream says:

- -
  // partial specializationss
-  template<class traits>
-    basic_ostream<char,traits>& operator<<( basic_ostream<char,traits>&,
-                                            const char * );
-
- -

Problems:

-
    -
  • Too many 's's at the end of "specializationss"
  • -
  • This is an overload, not a partial specialization
  • -
- - - -

Proposed resolution:

-

In the synopsis in 27.6.2.1 [ostream], remove the -// partial specializationss comment. Also remove the same -comment (correctly spelled, but still incorrect) from the synopsis in -27.6.2.6.4 [ostream.inserters.character]. -

- -

[ -Pre-Redmond: added 27.6.2.6.4 [ostream.inserters.character] because of Martin's -comment in c++std-lib-8939. -]

- - - - - - - -
-

312. Table 27 is missing headers

-

Section: 20 [utilities] Status: WP - Submitter: Martin Sebor Date: 2001-03-29

-

View all issues with WP status.

-

Discussion:

-

Table 27 in section 20 lists the header <memory> (only) for -Memory (lib.memory) but neglects to mention the headers -<cstdlib> and <cstring> that are discussed in 20.4.5 [meta.rel].

- - -

Proposed resolution:

-

Add <cstdlib> and <cstring> to Table 27, in the same row -as <memory>.

- - - - - -
-

315. Bad "range" in list::unique complexity

-

Section: 23.2.3.4 [list.ops] Status: WP - Submitter: Andy Sawyer Date: 2001-05-01

-

View all other issues in [list.ops].

-

View all issues with WP status.

-

Discussion:

-

-23.2.3.4 [list.ops], Para 21 describes the complexity of -list::unique as: "If the range (last - first) is not empty, exactly -(last - first) -1 applications of the corresponding predicate, -otherwise no applications of the predicate)". -

- -

-"(last - first)" is not a range. -

- - -

Proposed resolution:

-

-Change the "range" from (last - first) to [first, last). -

- - - - -
-

316. Vague text in Table 69

-

Section: 23.1.2 [associative.reqmts] Status: WP - Submitter: Martin Sebor Date: 2001-05-04

-

View all other issues in [associative.reqmts].

-

View all issues with WP status.

-

Discussion:

-

Table 69 says this about a_uniq.insert(t):

- -

-inserts t if and only if there is no element in the container with key -equivalent to the key of t. The bool component of the returned pair -indicates whether the insertion takes place and the iterator component of the -pair points to the element with key equivalent to the key of t. -

- -

The description should be more specific about exactly how the bool component -indicates whether the insertion takes place.

- - -

Proposed resolution:

-

Change the text in question to

- -

-...The bool component of the returned pair is true if and only if the insertion -takes place... -

- - - - - -
-

317. Instantiation vs. specialization of facets

-

Section: 22 [localization] Status: WP - Submitter: Martin Sebor Date: 2001-05-04

-

View all other issues in [localization].

-

View all issues with WP status.

-

Discussion:

-

-The localization section of the standard refers to specializations of -the facet templates as instantiations even though the required facets -are typically specialized rather than explicitly (or implicitly) -instantiated. In the case of ctype<char> and -ctype_byname<char> (and the wchar_t versions), these facets are -actually required to be specialized. The terminology should be -corrected to make it clear that the standard doesn't mandate explicit -instantiation (the term specialization encompasses both explicit -instantiations and specializations). -

- - -

Proposed resolution:

-

-In the following paragraphs, replace all occurrences of the word -instantiation or instantiations with specialization or specializations, -respectively: -

- -

-22.1.1.1.1, p4, Table 52, 22.2.1.1, p2, 22.2.1.5, p3, 22.2.1.5.1, p5, -22.2.1.5.2, p10, 22.2.2, p2, 22.2.3.1, p1, 22.2.3.1.2, p1, p2 and p3, -22.2.4.1, p1, 22.2.4.1.2, p1, 22,2,5, p1, 22,2,6, p2, 22.2.6.3.2, p7, and -Footnote 242. -

- -

And change the text in 22.1.1.1.1, p4 from

- -

- An implementation is required to provide those instantiations - for facet templates identified as members of a category, and - for those shown in Table 52: -

- -

to

- -

- An implementation is required to provide those specializations... -

- -

[Nathan will review these changes, and will look for places where -explicit specialization is necessary.]

- - - - -

Rationale:

-

This is a simple matter of outdated language. The language to -describe templates was clarified during the standardization process, -but the wording in clause 22 was never updated to reflect that -change.

- - - - - - - -
-

318. Misleading comment in definition of numpunct_byname

-

Section: 22.2.3.2 [locale.numpunct.byname] Status: WP - Submitter: Martin Sebor Date: 2001-05-12

-

View all issues with WP status.

-

Discussion:

-

The definition of the numpunct_byname template contains the following -comment:

- -
    namespace std {
-        template <class charT>
-        class numpunct_byname : public numpunct<charT> {
-    // this class is specialized for char and wchar_t.
-        ...
-
- -

There is no documentation of the specializations and it seems -conceivable that an implementation will not explicitly specialize the -template at all, but simply provide the primary template.

- - -

Proposed resolution:

-

Remove the comment from the text in 22.2.3.2 and from the proposed -resolution of library issue 228.

- - - - -
-

319. Storage allocation wording confuses "Required behavior", "Requires"

-

Section: 18.5.1.1 [new.delete.single], 18.5.1.2 [new.delete.array] Status: WP - Submitter: Beman Dawes Date: 2001-05-15

-

View all other issues in [new.delete.single].

-

View all issues with WP status.

-

Discussion:

-

The standard specifies 17.3.1.3 [structure.specifications] that "Required -behavior" elements describe "the semantics of a function definition -provided by either the implementation or a C++ program."

- -

The standard specifies 17.3.1.3 [structure.specifications] that "Requires" -elements describe "the preconditions for calling the function."

- -

In the sections noted below, the current wording specifies -"Required Behavior" for what are actually preconditions, and thus -should be specified as "Requires".

- - - -

Proposed resolution:

- -

In 18.5.1.1 [new.delete.single] Para 12 Change:

-
-

Required behavior: accept a value of ptr that is null or that was - returned by an earlier call ...

-
-

to:

-
-

Requires: the value of ptr is null or the value returned by an - earlier call ...

-
- -

In 18.5.1.2 [new.delete.array] Para 11 Change:

-
-

Required behavior: accept a value of ptr that is null or that was - returned by an earlier call ...

-
-

to:

-
-

Requires: the value of ptr is null or the value returned by an - earlier call ...

-
- - - - - -
-

320. list::assign overspecified

-

Section: 23.2.3.1 [list.cons] Status: WP - Submitter: Howard Hinnant Date: 2001-05-17

-

View all other issues in [list.cons].

-

View all issues with WP status.

-

Discussion:

-

-Section 23.2.3.1 [list.cons], paragraphs 6-8 specify that list assign (both forms) have -the "effects" of a call to erase followed by a call to insert. -

- -

-I would like to document that implementers have the freedom to implement -assign by other methods, as long as the end result is the same and the -exception guarantee is as good or better than the basic guarantee. -

- -

-The motivation for this is to use T's assignment operator to recycle -existing nodes in the list instead of erasing them and reallocating -them with new values. It is also worth noting that, with careful -coding, most common cases of assign (everything but assignment with -true input iterators) can elevate the exception safety to strong if -T's assignment has a nothrow guarantee (with no extra memory cost). -Metrowerks does this. However I do not propose that this subtlety be -standardized. It is a QoI issue.

- -

Existing practise: -Metrowerks and SGI recycle nodes, Dinkumware and Rogue Wave don't. -

- - -

Proposed resolution:

-

Change 23.2.3.1 [list.cons]/7 from:

- -
-

Effects:

- -
   erase(begin(), end());
-   insert(begin(), first, last);
-
-
- -

to:

- -
-

Effects: Replaces the contents of the list with the range [first, last).

-
- -

In 23.1.1 [sequence.reqmts], in Table 67 (sequence requirements), -add two new rows:

-
      a.assign(i,j)     void      pre: i,j are not iterators into a.
-                                  Replaces elements in a with a copy
-                                  of [i, j).
-
-      a.assign(n,t)     void      pre: t is not a reference into a.
-                                  Replaces elements in a with n copies
-                                  of t.
-
- -

Change 23.2.3.1 [list.cons]/8 from:

- -
-

Effects:

-
   erase(begin(), end());
-   insert(begin(), n, t);
-
-
-

to:

- -
-

Effects: Replaces the contents of the list with n copies of t.

-
- -

[Redmond: Proposed resolution was changed slightly. Previous -version made explicit statement about exception safety, which wasn't -consistent with the way exception safety is expressed elsewhere. -Also, the change in the sequence requirements is new. Without that -change, the proposed resolution would have required that assignment of -a subrange would have to work. That too would have been -overspecification; it would effectively mandate that assignment use a -temporary. Howard provided wording. -]

- - -

[Curaçao: Made editorial improvement in wording; changed -"Replaces elements in a with copies of elements in [i, j)." -with "Replaces the elements of a with a copy of [i, j)." -Changes not deemed serious enough to requre rereview.]

- - - - - - - -
-

321. Typo in num_get

-

Section: 22.2.2.1.2 [facet.num.get.virtuals] Status: WP - Submitter: Kevin Djang Date: 2001-05-17

-

View other active issues in [facet.num.get.virtuals].

-

View all other issues in [facet.num.get.virtuals].

-

View all issues with WP status.

-

Discussion:

-

-Section 22.2.2.1.2 at p7 states that "A length specifier is added to -the conversion function, if needed, as indicated in Table 56." -However, Table 56 uses the term "length modifier", not "length -specifier". -

- - -

Proposed resolution:

-

-In 22.2.2.1.2 at p7, change the text "A length specifier is added ..." -to be "A length modifier is added ..." -

- - -

Rationale:

-

C uses the term "length modifier". We should be consistent.

- - - - - - -
-

322. iterator and const_iterator should have the same value type

-

Section: 23.1 [container.requirements] Status: WP - Submitter: Matt Austern Date: 2001-05-17

-

View other active issues in [container.requirements].

-

View all other issues in [container.requirements].

-

View all issues with WP status.

-

Discussion:

-

-It's widely assumed that, if X is a container, -iterator_traits<X::iterator>::value_type and -iterator_traits<X::const_iterator>::value_type should both be -X::value_type. However, this is nowhere stated. The language in -Table 65 is not precise about the iterators' value types (it predates -iterator_traits), and could even be interpreted as saying that -iterator_traits<X::const_iterator>::value_type should be "const -X::value_type". -

- -

Related issue: 279.

- - -

Proposed resolution:

-

In Table 65 ("Container Requirements"), change the return type for -X::iterator to "iterator type whose value type is T". Change the -return type for X::const_iterator to "constant iterator type whose -value type is T".

- - -

Rationale:

-

-This belongs as a container requirement, rather than an iterator -requirement, because the whole notion of iterator/const_iterator -pairs is specific to containers' iterator. -

-

-It is existing practice that (for example) -iterator_traits<list<int>::const_iterator>::value_type -is "int", rather than "const int". This is consistent with -the way that const pointers are handled: the standard already -requires that iterator_traits<const int*>::value_type is int. -

- - - - - -
-

324. Do output iterators have value types?

-

Section: 24.1.2 [output.iterators] Status: WP - Submitter: Dave Abrahams Date: 2001-06-07

-

View all other issues in [output.iterators].

-

View all issues with WP status.

-

Discussion:

- -

Table 73 suggests that output iterators have value types. It -requires the expression "*a = t". Additionally, although Table 73 -never lists "a = t" or "X(a) = t" in the "expressions" column, it -contains a note saying that "a = t" and "X(a) = t" have equivalent -(but nowhere specified!) semantics.

- -

According to 24.1/9, t is supposed to be "a value of value type -T":

- -

- In the following sections, a and b denote values of X, n denotes a - value of the difference type Distance, u, tmp, and m denote - identifiers, r denotes a value of X&, t denotes a value of - value type T. -

- -

Two other parts of the standard that are relevant to whether -output iterators have value types:

- -
    -
  • 24.1/1 says "All iterators i support the expression *i, - resulting in a value of some class, enumeration, or built-in type - T, called the value type of the iterator".
  • - -
  • - 24.3.1/1, which says "In the case of an output iterator, the types - iterator_traits<Iterator>::difference_type - iterator_traits<Iterator>::value_type are both defined as void." -
  • -
- -

The first of these passages suggests that "*i" is supposed to -return a useful value, which contradicts the note in 24.1.2/2 saying -that the only valid use of "*i" for output iterators is in an -expression of the form "*i = t". The second of these passages appears -to contradict Table 73, because it suggests that "*i"'s return value -should be void. The second passage is also broken in the case of a an -iterator type, like non-const pointers, that satisfies both the output -iterator requirements and the forward iterator requirements.

- -

What should the standard say about *i's return value when -i is an output iterator, and what should it say about that t is in the -expression "*i = t"? Finally, should the standard say anything about -output iterators' pointer and reference types?

- - - -

Proposed resolution:

-

24.1 p1, change

- -
-

All iterators i support the expression *i, resulting -in a value of some class, enumeration, or built-in type T, -called the value type of the iterator.

-
- -

to

- -
-

All input iterators i support the expression *i, -resulting in a value of some class, enumeration, or built-in type -T, called the value type of the iterator. All output -iterators support the expression *i = o where o is a -value of some type that is in the set of types that are writable to -the particular iterator type of i. -

-
- -

24.1 p9, add

- -
-

o denotes a value of some type that is writable to the -output iterator. -

-
- -

Table 73, change

- -
-
*a = t
-
-
- -

to

- -
-
*r = o
-
-
- -

and change

- -
-
*r++ = t
-
-
- -

to

- -
-
*r++ = o
-
-
- -

[post-Redmond: Jeremy provided wording]

- - - - -

Rationale:

-

The LWG considered two options: change all of the language that -seems to imply that output iterators have value types, thus making it -clear that output iterators have no value types, or else define value -types for output iterator consistently. The LWG chose the former -option, because it seems clear that output iterators were never -intended to have value types. This was a deliberate design decision, -and any language suggesting otherwise is simply a mistake.

- -

A future revision of the standard may wish to revisit this design -decision.

- - - - - -
-

325. Misleading text in moneypunct<>::do_grouping

-

Section: 22.2.6.3.2 [locale.moneypunct.virtuals] Status: WP - Submitter: Martin Sebor Date: 2001-07-02

-

View all other issues in [locale.moneypunct.virtuals].

-

View all issues with WP status.

-

Discussion:

-

The Returns clause in 22.2.6.3.2, p3 says about -moneypunct<charT>::do_grouping() -

- -

- Returns: A pattern defined identically as the result of - numpunct<charT>::do_grouping().241) -

- -

Footnote 241 then reads

- -

- This is most commonly the value "\003" (not "3"). -

- -

-The returns clause seems to imply that the two member functions must -return an identical value which in reality may or may not be true, -since the facets are usually implemented in terms of struct std::lconv -and return the value of the grouping and mon_grouping, respectively. -The footnote also implies that the member function of the moneypunct -facet (rather than the overridden virtual functions in moneypunct_byname) -most commonly return "\003", which contradicts the C standard which -specifies the value of "" for the (most common) C locale. -

- - - -

Proposed resolution:

-

Replace the text in Returns clause in 22.2.6.3.2, p3 with the following:

- -

- Returns: A pattern defined identically as, but not necessarily - equal to, the result of numpunct<charT>::do_grouping().241) -

- -

and replace the text in Footnote 241 with the following:

- -

- To specify grouping by 3s the value is "\003", not "3". -

- - -

Rationale:

-

-The fundamental problem is that the description of the locale facet -virtuals serves two purposes: describing the behavior of the base -class, and describing the meaning of and constraints on the behavior -in arbitrary derived classes. The new wording makes that separation a -little bit clearer. The footnote (which is nonnormative) is not -supposed to say what the grouping is in the "C" locale or in any other -locale. It is just a reminder that the values are interpreted as small -integers, not ASCII characters. -

- - - - -
-

327. Typo in time_get facet in table 52

-

Section: 22.1.1.1.1 [locale.category] Status: WP - Submitter: Tiki Wan Date: 2001-07-06

-

View all other issues in [locale.category].

-

View all issues with WP status.

-

Duplicate of: 447

-

Discussion:

-

The wchar_t versions of time_get and -time_get_byname are listed incorrectly in table 52, -required instantiations. In both cases the second template -parameter is given as OutputIterator. It should instead be -InputIterator, since these are input facets.

- - -

Proposed resolution:

-

-In table 52, required instantiations, in -22.1.1.1.1 [locale.category], change

-
    time_get<wchar_t, OutputIterator>
-    time_get_byname<wchar_t, OutputIterator>
-
-

to

-
    time_get<wchar_t, InputIterator>
-    time_get_byname<wchar_t, InputIterator>
-
- -

[Redmond: Very minor change in proposed resolution. Original had -a typo, wchart instead of wchar_t.]

- - - - - - -
-

328. Bad sprintf format modifier in money_put<>::do_put()

-

Section: 22.2.6.2.2 [locale.money.put.virtuals] Status: WP - Submitter: Martin Sebor Date: 2001-07-07

-

View all issues with WP status.

-

Discussion:

-

The sprintf format string , "%.01f" (that's the digit one), in the -description of the do_put() member functions of the money_put facet in -22.2.6.2.2, p1 is incorrect. First, the f format specifier is wrong -for values of type long double, and second, the precision of 01 -doesn't seem to make sense. What was most likely intended was -"%.0Lf"., that is a precision of zero followed by the L length -modifier.

- - -

Proposed resolution:

-

Change the format string to "%.0Lf".

- - -

Rationale:

Fixes an obvious typo

- - - - -
-

329. vector capacity, reserve and reallocation

-

Section: 23.2.5.2 [vector.capacity], 23.2.5.4 [vector.modifiers] Status: WP - Submitter: Anthony Williams Date: 2001-07-13

-

View all other issues in [vector.capacity].

-

View all issues with WP status.

-

Discussion:

-

-There is an apparent contradiction about which circumstances can cause -a reallocation of a vector in Section 23.2.5.2 [vector.capacity] and -section 23.2.5.4 [vector.modifiers]. -

- -

23.2.5.2 [vector.capacity],p5 says:

-

-Notes: Reallocation invalidates all the references, pointers, and iterators -referring to the elements in the sequence. It is guaranteed that no -reallocation takes place during insertions that happen after a call to -reserve() until the time when an insertion would make the size of the vector -greater than the size specified in the most recent call to reserve(). -

- -

Which implies if I do

- -
  std::vector<int> vec;
-  vec.reserve(23);
-  vec.reserve(0);
-  vec.insert(vec.end(),1);
-
- -

then the implementation may reallocate the vector for the insert, -as the size specified in the previous call to reserve was zero.

- -

However, the previous paragraphs (23.2.5.2 [vector.capacity], p1-2) state:

-
-

-(capacity) Returns: The total number of elements the vector -can hold without requiring reallocation -

-

-...After reserve(), capacity() is greater or equal to the -argument of reserve if reallocation happens; and equal to the previous value -of capacity() otherwise... -

-
- -

-This implies that vec.capacity() is still 23, and so the insert() -should not require a reallocation, as vec.size() is 0. This is backed -up by 23.2.5.4 [vector.modifiers], p1: -

-

-(insert) Notes: Causes reallocation if the new size is greater than the old -capacity. -

- -

-Though this doesn't rule out reallocation if the new size is less -than the old capacity, I think the intent is clear. -

- - - -

Proposed resolution:

-

Change the wording of 23.2.5.2 [vector.capacity] paragraph 5 to:

- -

-Notes: Reallocation invalidates all the references, pointers, and -iterators referring to the elements in the sequence. It is guaranteed -that no reallocation takes place during insertions that happen after a -call to reserve() until the time when an insertion would make the size -of the vector greater than the value of capacity(). -

- -

[Redmond: original proposed resolution was modified slightly. In -the original, the guarantee was that there would be no reallocation -until the size would be greater than the value of capacity() after the -most recent call to reserve(). The LWG did not believe that the -"after the most recent call to reserve()" added any useful -information.]

- - - - -

Rationale:

-

There was general agreement that, when reserve() is called twice in -succession and the argument to the second invocation is smaller than -the argument to the first, the intent was for the second invocation to -have no effect. Wording implying that such cases have an effect on -reallocation guarantees was inadvertant.

- - - - - -
-

331. bad declaration of destructor for ios_base::failure

-

Section: 27.4.2.1.1 [ios::failure] Status: WP - Submitter: PremAnand M. Rao Date: 2001-08-23

-

View all other issues in [ios::failure].

-

View all issues with WP status.

-

Discussion:

-

-With the change in 17.4.4.8 [res.on.exception.handling] to state - "An implementation may strengthen the exception-specification for a - non-virtual function by removing listed exceptions." -(issue 119) -and the following declaration of ~failure() in ios_base::failure -

-
    namespace std {
-       class ios_base::failure : public exception {
-       public:
-           ...
-           virtual ~failure();
-           ...
-       };
-     }
-
-

the class failure cannot be implemented since in 18.6.1 [type.info] the destructor of class exception has an empty -exception specification:

-
    namespace std {
-       class exception {
-       public:
-         ...
-         virtual ~exception() throw();
-         ...
-       };
-     }
-
- - -

Proposed resolution:

-

Remove the declaration of ~failure().

- - -

Rationale:

-

The proposed resolution is consistent with the way that destructors -of other classes derived from exception are handled.

- - - - - - - -
-

333. does endl imply synchronization with the device?

-

Section: 27.6.2.8 [ostream.manip] Status: WP - Submitter: PremAnand M. Rao Date: 2001-08-27

-

View all issues with WP status.

-

Discussion:

-

A footnote in 27.6.2.8 [ostream.manip] states:

-

- [Footnote: The effect of executing cout << endl is to insert a - newline character in the output sequence controlled by cout, then - synchronize it with any external file with which it might be - associated. --- end foonote] -

- -

-Does the term "file" here refer to the external device? -This leads to some implementation ambiguity on systems with fully -buffered files where a newline does not cause a flush to the device. -

- -

-Choosing to sync with the device leads to significant performance -penalties for each call to endl, while not sync-ing leads to -errors under special circumstances. -

- -

-I could not find any other statement that explicitly defined -the behavior one way or the other. -

- - -

Proposed resolution:

-

Remove footnote 300 from section 27.6.2.8 [ostream.manip].

- - -

Rationale:

-

We already have normative text saying what endl does: it -inserts a newline character and calls flush. This footnote -is at best redundant, at worst (as this issue says) misleading, -because it appears to make promises about what flush -does.

- - - - - - - -
-

334. map::operator[] specification forces inefficient implementation

-

Section: 23.3.1.2 [map.access] Status: WP - Submitter: Andrea Griffini Date: 2001-09-02

-

View all other issues in [map.access].

-

View all issues with WP status.

-

Discussion:

-

-The current standard describes map::operator[] using a -code example. That code example is however quite -inefficient because it requires several useless copies -of both the passed key_type value and of default -constructed mapped_type instances. -My opinion is that was not meant by the comitee to -require all those temporary copies. -

- -

Currently map::operator[] behaviour is specified as:

-
  Returns:
-    (*((insert(make_pair(x, T()))).first)).second.
-
- -

-This specification however uses make_pair that is a -template function of which parameters in this case -will be deduced being of type const key_type& and -const T&. This will create a pair<key_type,T> that -isn't the correct type expected by map::insert so -another copy will be required using the template -conversion constructor available in pair to build -the required pair<const key_type,T> instance. -

- -

If we consider calling of key_type copy constructor -and mapped_type default constructor and copy -constructor as observable behaviour (as I think we -should) then the standard is in this place requiring -two copies of a key_type element plus a default -construction and two copy construction of a mapped_type -(supposing the addressed element is already present -in the map; otherwise at least another copy -construction for each type). -

- -

A simple (half) solution would be replacing the description with:

-
  Returns:
-    (*((insert(value_type(x, T()))).first)).second.
-
- -

This will remove the wrong typed pair construction that -requires one extra copy of both key and value.

- -

However still the using of map::insert requires temporary -objects while the operation, from a logical point of view, -doesn't require any.

- -

I think that a better solution would be leaving free an -implementer to use a different approach than map::insert -that, because of its interface, forces default constructed -temporaries and copies in this case. -The best solution in my opinion would be just requiring -map::operator[] to return a reference to the mapped_type -part of the contained element creating a default element -with the specified key if no such an element is already -present in the container. Also a logarithmic complexity -requirement should be specified for the operation. -

- -

-This would allow library implementers to write alternative -implementations not using map::insert and reaching optimal -performance in both cases of the addressed element being -present or absent from the map (no temporaries at all and -just the creation of a new pair inside the container if -the element isn't present). -Some implementer has already taken this option but I think -that the current wording of the standard rules that as -non-conforming. -

- - - -

Proposed resolution:

- -

-Replace 23.3.1.2 [map.access] paragraph 1 with -

-
-

--1- Effects: If there is no key equivalent to x in the map, inserts -value_type(x, T()) into the map. -

-

--2- Returns: A reference to the mapped_type corresponding to x in *this. -

-

--3- Complexity: logarithmic. -

-
- -

[This is the second option mentioned above. Howard provided -wording. We may also wish to have a blanket statement somewhere in -clause 17 saying that we do not intend the semantics of sample code -fragments to be interpreted as specifing exactly how many copies are -made. See issue 98 for a similar problem.]

- - - - -

Rationale:

-

-This is the second solution described above; as noted, it is -consistent with existing practice. -

- -

Note that we now need to specify the complexity explicitly, because -we are no longer defining operator[] in terms of -insert.

- - - - - -
-

335. minor issue with char_traits, table 37

-

Section: 21.1.1 [char.traits.require] Status: WP - Submitter: Andy Sawyer Date: 2001-09-06

-

View all issues with WP status.

-

Discussion:

-

-Table 37, in 21.1.1 [char.traits.require], descibes char_traits::assign -as: -

-
  X::assign(c,d)   assigns c = d.
-
- -

And para 1 says:

- -

- [...] c and d denote values of type CharT [...] -

- -

-Naturally, if c and d are values, then the assignment is -(effectively) meaningless. It's clearly intended that (in the case of -assign, at least), 'c' is intended to be a reference type. -

- -

I did a quick survey of the four implementations I happened to have -lying around, and sure enough they all have signatures:

-
    assign( charT&, const charT& );
-
- -

(or the equivalent). It's also described this way in Nico's book. -(Not to mention the synopses of char_traits<char> in 21.1.3.1 -and char_traits<wchar_t> in 21.1.3.2...) -

- - -

Proposed resolution:

-

Add the following to 21.1.1 para 1:

-

- r denotes an lvalue of CharT -

- -

and change the description of assign in the table to:

-
  X::assign(r,d)   assigns r = d
-
- - - - - -
-

336. Clause 17 lack of references to deprecated headers

-

Section: 17 [library] Status: WP - Submitter: Detlef Vollmann Date: 2001-09-05

-

View all other issues in [library].

-

View all issues with WP status.

-

Discussion:

-

From c++std-edit-873:

- -

17.4.1.2 [headers], Table 11. In this table, the header -<strstream> is missing.

- -

This shows a general problem: The whole clause 17 refers quite -often to clauses 18 through 27, but D.7 is also a part of the standard -library (though a deprecated one).

- - - -

Proposed resolution:

- -

To 17.4.1.2 [headers] Table 11, C++ Library Headers, add -"<strstream>".

- -

In the following places, change "clauses 17 through 27" to "clauses -17 through 27 and Annex D":

- -
    -
  • 1.2 [intro.refs] Normative references/1/footnote 1
  • -
  • 1.3 [intro.defs] Definitions/1
  • -
  • 7 [dcl.dcl] Library introduction/9
  • -
  • 17.3 [description] Method of description (Informative)/1
  • -
  • 17.3.2.1.3 [character.seq] Character sequences/1/bullet 2
  • -
  • 17.3.2.2 [functions.within.classes] Functions within classes/1
  • -
  • 17.3.2.3 [objects.within.classes] Private members/1/(2 places)
  • -
  • 17.4 [requirements] Library-wide requirements/1
  • -
  • 17.4.1.2 [headers] Headers/4
  • -
  • 17.4.3.4 [replacement.functions] Replacement functions/1
  • -
  • 17.4.4.3 [global.functions] Global or non-member functions/2
  • -
  • 17.4.4.6 [protection.within.classes] Protection within classes/1
  • -
- - - - - - - -
-

337. replace_copy_if's template parameter should be InputIterator

-

Section: 25.2.5 [alg.replace] Status: WP - Submitter: Detlef Vollmann Date: 2001-09-07

-

View all other issues in [alg.replace].

-

View all issues with WP status.

-

Discussion:

-

From c++std-edit-876:

- -

-In section 25.2.5 [alg.replace] before p4: The name of the first -parameter of template replace_copy_if should be "InputIterator" -instead of "Iterator". According to 17.3.2.1 [type.descriptions] p1 the -parameter name conveys real normative meaning. -

- - -

Proposed resolution:

-

Change Iterator to InputIterator.

- - - - - -
-

338. is whitespace allowed between `-' and a digit?

-

Section: 22.2 [locale.categories] Status: WP - Submitter: Martin Sebor Date: 2001-09-17

-

View other active issues in [locale.categories].

-

View all other issues in [locale.categories].

-

View all issues with WP status.

-

Discussion:

-

-From Stage 2 processing in 22.2.2.1.2 [facet.num.get.virtuals], p8 and 9 (the -original text or the text corrected by the proposed resolution of -issue 221) it seems clear that no whitespace is allowed -within a number, but 22.2.3.1 [locale.numpunct], p2, which gives the -format for integer and floating point values, says that whitespace is -optional between a plusminus and a sign. -

- -

-The text needs to be clarified to either consistently allow or -disallow whitespace between a plusminus and a sign. It might be -worthwhile to consider the fact that the C library stdio facility does -not permit whitespace embedded in numbers and neither does the C or -C++ core language (the syntax of integer-literals is given in 2.13.1 -[lex.icon], that of floating-point-literals in 2.13.3 [lex.fcon] of the -C++ standard). -

- - -

Proposed resolution:

-

Change the first part of 22.2.3.1 [locale.numpunct] paragraph 2 from:

-
-

-The syntax for number formats is as follows, where digit -represents the radix set specified by the fmtflags argument -value, whitespace is as determined by the facet -ctype<charT> (22.2.1.1), and thousands-sep and -decimal-point are the results of corresponding -numpunct<charT> members. Integer values have the -format: -

-
  integer   ::= [sign] units
-  sign      ::= plusminus [whitespace]
-  plusminus ::= '+' | '-'
-  units     ::= digits [thousands-sep units]
-  digits    ::= digit [digits]
-
-
-

to:

-
-

-The syntax for number formats is as follows, where digit -represents the radix set specified by the fmtflags argument -value, and thousands-sep and decimal-point are the -results of corresponding numpunct<charT> members. -Integer values have the format: -

-
  integer   ::= [sign] units
-  sign      ::= plusminus
-  plusminus ::= '+' | '-'
-  units     ::= digits [thousands-sep units]
-  digits    ::= digit [digits]
-
-
- - -

Rationale:

-

It's not clear whether the format described in 22.2.3.1 [locale.numpunct] paragraph 2 has any normative weight: nothing in the -standard says how, or whether, it's used. However, there's no reason -for it to differ gratuitously from the very specific description of -numeric processing in 22.2.2.1.2 [facet.num.get.virtuals]. The proposed -resolution removes all mention of "whitespace" from that format.

- - - - - -
-

339. definition of bitmask type restricted to clause 27

-

Section: 22.2.1 [category.ctype], 17.3.2.1.2 [bitmask.types] Status: WP - Submitter: Martin Sebor Date: 2001-09-17

-

View all other issues in [category.ctype].

-

View all issues with WP status.

-

Discussion:

-

The ctype_category::mask type is declared to be an enum in 22.2.1 -[category.ctype] with p1 then stating that it is a bitmask type, most -likely referring to the definition of bitmask type in 17.3.2.1.2 -[bitmask.types], p1. However, the said definition only applies to -clause 27, making the reference in 22.2.1 somewhat dubious. -

- - -

Proposed resolution:

-

Clarify 17.3.2.1.2, p1 by changing the current text from

-

- Several types defined in clause 27 are bitmask types. Each bitmask type - can be implemented as an enumerated type that overloads certain operators, - as an integer type, or as a bitset (23.3.5 [template.bitset]). -

-

to read

-

- Several types defined in clauses lib.language.support through - lib.input.output and Annex D are bitmask types. Each bitmask type can - be implemented as an enumerated type that overloads certain operators, - as an integer type, or as a bitset (lib.template.bitset). -

- -

-Additionally, change the definition in 22.2.1 to adopt the same -convention as in clause 27 by replacing the existing text with the -following (note, in particluar, the cross-reference to 17.3.2.1.2 in -22.2.1, p1): -

- -
-

22.2.1 The ctype category [lib.category.ctype]

-
namespace std {
-    class ctype_base {
-    public:
-        typedef T mask;
-
-        // numeric values are for exposition only.
-        static const mask space = 1 << 0;
-        static const mask print = 1 << 1;
-        static const mask cntrl = 1 << 2;
-        static const mask upper = 1 << 3;
-        static const mask lower = 1 << 4;
-        static const mask alpha = 1 << 5;
-        static const mask digit = 1 << 6;
-        static const mask punct = 1 << 7;
-        static const mask xdigit = 1 << 8;
-        static const mask alnum = alpha | digit;
-        static const mask graph = alnum | punct;
-    };
-}
-
- -

The type mask is a bitmask type (17.3.2.1.2 [bitmask.types]).

-
- -

[Curaçao: The LWG notes that T above should be bold-italics to be -consistent with the rest of the standard.]

- - - - - - - - - -
-

340. interpretation of has_facet<Facet>(loc)

-

Section: 22.1.1.1.1 [locale.category] Status: WP - Submitter: Martin Sebor Date: 2001-09-18

-

View all other issues in [locale.category].

-

View all issues with WP status.

-

Discussion:

-

-It's unclear whether 22.1.1.1.1, p3 says that -has_facet<Facet>(loc) returns true for any Facet -from Table 51 or whether it includes Table 52 as well: -

- -

-For any locale loc either constructed, or returned by -locale::classic(), and any facet Facet that is a member of a -standard category, has_facet<Facet>(loc) is true. Each -locale member function which takes a locale::category -argument operates on the corresponding set of facets. -

- -

-It seems that it comes down to which facets are considered to be members of a -standard category. Intuitively, I would classify all the facets in Table 52 as -members of their respective standard categories, but there are an unbounded set -of them... -

- -

-The paragraph implies that, for instance, has_facet<num_put<C, -OutputIterator> >(loc) must always return true. I don't think that's -possible. If it were, then use_facet<num_put<C, OutputIterator> ->(loc) would have to return a reference to a distinct object for each -valid specialization of num_put<C, OutputIteratory>, which is -clearly impossible. -

- -

-On the other hand, if none of the facets in Table 52 is a member of a standard -category then none of the locale member functions that operate on entire -categories of facets will work properly. -

- -

-It seems that what p3 should mention that it's required (permitted?) -to hold only for specializations of Facet from Table 52 on -C from the set { char, wchar_t }, and -InputIterator and OutputIterator from the set of -{ -{i,o}streambuf_iterator<{char,wchar_t}> -}. -

- - -

Proposed resolution:

-

In 22.1.1.1.1 [locale.category], paragraph 3, change -"that is a member of a standard category" to "shown in Table 51".

- - -

Rationale:

-

The facets in Table 52 are an unbounded set. Locales should not be -required to contain an infinite number of facets.

- -

It's not necessary to talk about which values of InputIterator and -OutputIterator must be supported. Table 51 already contains a -complete list of the ones we need.

- - - - - - -
-

341. Vector reallocation and swap

-

Section: 23.2.5.2 [vector.capacity] Status: WP - Submitter: Anthony Williams Date: 2001-09-27

-

View all other issues in [vector.capacity].

-

View all issues with WP status.

-

Discussion:

-

It is a common idiom to reduce the capacity of a vector by swapping it with -an empty one:

-
  std::vector<SomeType> vec;
-  // fill vec with data
-  std::vector<SomeType>().swap(vec);
-  // vec is now empty, with minimal capacity
-
- -

However, the wording of 23.2.5.2 [vector.capacity]paragraph 5 prevents -the capacity of a vector being reduced, following a call to -reserve(). This invalidates the idiom, as swap() is thus prevented -from reducing the capacity. The proposed wording for issue 329 does not affect this. Consequently, the example above -requires the temporary to be expanded to cater for the contents of -vec, and the contents be copied across. This is a linear-time -operation.

- -

However, the container requirements state that swap must have constant -complexity (23.1 [container.requirements] note to table 65).

- -

This is an important issue, as reallocation affects the validity of -references and iterators.

- -

If the wording of 23.2.4.2p5 is taken to be the desired intent, then -references and iterators remain valid after a call to swap, if they refer to -an element before the new end() of the vector into which they originally -pointed, in which case they refer to the element at the same index position. -Iterators and references that referred to an element whose index position -was beyond the new end of the vector are invalidated.

- -

If the note to table 65 is taken as the desired intent, then there are two -possibilities with regard to iterators and references:

- -
    -
  1. All Iterators and references into both vectors are invalidated.
  2. -
  3. Iterators and references into either vector remain valid, and remain -pointing to the same element. Consequently iterators and references that -referred to one vector now refer to the other, and vice-versa.
  4. -
- - -

Proposed resolution:

-

Add a new paragraph after 23.2.5.2 [vector.capacity] paragraph 5:

-
-
  void swap(vector<T,Allocator>& x);
-
-

Effects: Exchanges the contents and capacity() of *this -with that of x.

-

Complexity: Constant time.

-
- -

[This solves the problem reported for this issue. We may also -have a problem with a circular definition of swap() for other -containers.]

- - - - -

Rationale:

-

-swap should be constant time. The clear intent is that it should just -do pointer twiddling, and that it should exchange all properties of -the two vectors, including their reallocation guarantees. -

- - - - - -
-

345. type tm in <cwchar>

-

Section: 21.5 [c.strings] Status: WP - Submitter: Clark Nelson Date: 2001-10-19

-

View all other issues in [c.strings].

-

View all issues with WP status.

-

Discussion:

-

C99, and presumably amendment 1 to C90, specify that <wchar.h> -declares struct tm as an incomplete type. However, table 48 in 21.5 -[c.strings] does not mention the type tm as being declared in -<cwchar>. Is this omission intentional or accidental? -

- - -

Proposed resolution:

-

In section 21.5 [c.strings], add "tm" to table 48.

- - - - - -
-

346. Some iterator member functions should be const

-

Section: 24.1 [iterator.requirements] Status: WP - Submitter: Jeremy Siek Date: 2001-10-20

-

View other active issues in [iterator.requirements].

-

View all other issues in [iterator.requirements].

-

View all issues with WP status.

-

Discussion:

-

Iterator member functions and operators that do not change the state -of the iterator should be defined as const member functions or as -functions that take iterators either by const reference or by -value. The standard does not explicitly state which functions should -be const. Since this a fairly common mistake, the following changes -are suggested to make this explicit.

- -

The tables almost indicate constness properly through naming: r -for non-const and a,b for const iterators. The following changes -make this more explicit and also fix a couple problems.

- - -

Proposed resolution:

-

In 24.1 [iterator.requirements] Change the first section of p9 from -"In the following sections, a and b denote values of X..." to -"In the following sections, a and b denote values of type const X...".

- -

In Table 73, change

-
    a->m   U&         ...
-
- -

to

- -
    a->m   const U&   ...
-    r->m   U&         ...
-
- -

In Table 73 expression column, change

- -
    *a = t
-
- -

to

- -
    *r = t
-
- -

[Redmond: The container requirements should be reviewed to see if -the same problem appears there.]

- - - - - - - -
-

347. locale::category and bitmask requirements

-

Section: 22.1.1.1.1 [locale.category] Status: WP - Submitter: P.J. Plauger, Nathan Myers Date: 2001-10-23

-

View all other issues in [locale.category].

-

View all issues with WP status.

-

Discussion:

-

-In 22.1.1.1.1 [locale.category] paragraph 1, the category members -are described as bitmask elements. In fact, the bitmask requirements -in 17.3.2.1.2 [bitmask.types] don't seem quite right: none -and all are bitmask constants, not bitmask elements.

- -

In particular, the requirements for none interact poorly -with the requirement that the LC_* constants from the C library must -be recognizable as C++ locale category constants. LC_* values should -not be mixed with these values to make category values.

- -

We have two options for the proposed resolution. Informally: -option 1 removes the requirement that LC_* values be recognized as -category arguments. Option 2 changes the category type so that this -requirement is implementable, by allowing none to be some -value such as 0x1000 instead of 0.

- -

Nathan writes: "I believe my proposed resolution [Option 2] merely -re-expresses the status quo more clearly, without introducing any -changes beyond resolving the DR.

- - - -

Proposed resolution:

-

Replace the first two paragraphs of 22.1.1.1 [locale.types] with:

-
-
    typedef int category;
-
- -

Valid category values include the locale member bitmask -elements collate, ctype, monetary, -numeric, time, and messages, each of which -represents a single locale category. In addition, locale member -bitmask constant none is defined as zero and represents no -category. And locale member bitmask constant all is defined such that -the expression

-
    (collate | ctype | monetary | numeric | time | messages | all) == all
-
-

-is true, and represents the union of all categories. Further -the expression (X | Y), where X and Y each -represent a single category, represents the union of the two -categories. -

- -

-locale member functions expecting a category -argument require one of the category values defined above, or -the union of two or more such values. Such a category -argument identifies a set of locale categories. Each locale category, -in turn, identifies a set of locale facets, including at least those -shown in Table 51: -

-
-

[Curaçao: need input from locale experts.]

- - - - -

Rationale:

- -

The LWG considered, and rejected, an alternate proposal (described - as "Option 2" in the discussion). The main reason for rejecting it - was that library implementors were concerened about implementation - difficult, given that getting a C++ library to work smoothly with a - separately written C library is already a delicate business. Some - library implementers were also concerned about the issue of adding - extra locale categories.

- -
-

Option 2:
-Replace the first paragraph of 22.1.1.1 [locale.types] with:

-
-

-Valid category values include the enumerated values. In addition, the -result of applying commutative operators | and & to any two valid -values is valid, and results in the setwise union and intersection, -respectively, of the argument categories. The values all and -none are defined such that for any valid value cat, the -expressions (cat | all == all), (cat & all == cat), -(cat | none == cat) and (cat & none == none) are -true. For non-equal values cat1 and cat2 of the -remaining enumerated values, (cat1 & cat2 == none) is true. -For any valid categories cat1 and cat2, the result -of (cat1 & ~cat2) is valid, and equals the setwise union of -those categories found in cat1 but not found in cat2. -[Footnote: it is not required that all equal the setwise union -of the other enumerated values; implementations may add extra categories.] -

-
-
- - - - - -
-

349. Minor typographical error in ostream_iterator

-

Section: 24.5.2 [ostream.iterator] Status: WP - Submitter: Andy Sawyer Date: 2001-10-24

-

View all issues with WP status.

-

Discussion:

-

24.5.2 [lib.ostream.iterator] states:

-
    [...]
-
-    private:
-    // basic_ostream<charT,traits>* out_stream; exposition only
-    // const char* delim; exposition only
-
- -

Whilst it's clearly marked "exposition only", I suspect 'delim' -should be of type 'const charT*'.

- - -

Proposed resolution:

-

-In 24.5.2 [ostream.iterator], replace const char* delim with -const charT* delim. -

- - - - - -
-

352. missing fpos requirements

-

Section: 21.1.2 [char.traits.typedefs] Status: WP - Submitter: Martin Sebor Date: 2001-12-02

-

View all issues with WP status.

-

Discussion:

-

-(1) -There are no requirements on the stateT template parameter of -fpos listed in 27.4.3. The interface appears to require that -the type be at least Assignable and CopyConstructible (27.4.3.1, p1), -and I think also DefaultConstructible (to implement the operations in -Table 88). -

-

-21.1.2, p3, however, only requires that -char_traits<charT>::state_type meet the requirements of -CopyConstructible types. -

-

-(2) -Additionally, the stateT template argument has no -corresponding typedef in fpos which might make it difficult to use in -generic code. -

- - -

Proposed resolution:

-

-Modify 21.1.2, p4 from -

-

- Requires: state_type shall meet the requirements of - CopyConstructible types (20.1.3). -

-

- Requires: state_type shall meet the requirements of Assignable - (23.1, p4), CopyConstructible (20.1.3), and - DefaultConstructible (20.1.4) types. -

- - - -

Rationale:

-

The LWG feels this is two issues, as indicated above. The first is -a defect---std::basic_fstream is unimplementable without these -additional requirements---and the proposed resolution fixes it. The -second is questionable; who would use that typedef? The class -template fpos is used only in a very few places, all of which know the -state type already. Unless motivation is provided, the second should -be considered NAD.

- - - - - -
-

354. Associative container lower/upper bound requirements

-

Section: 23.1.2 [associative.reqmts] Status: WP - Submitter: Hans Aberg Date: 2001-12-17

-

View all other issues in [associative.reqmts].

-

View all issues with WP status.

-

Discussion:

-

-Discussions in the thread "Associative container lower/upper bound -requirements" on comp.std.c++ suggests that there is a defect in the -C++ standard, Table 69 of section 23.1.2, "Associative containers", -[lib.associative.reqmts]. It currently says:

- -
-

-a.find(k): returns an iterator pointing to an element with the key equivalent to -k, or a.end() if such an element is not found. -

- -

-a.lower_bound(k): returns an iterator pointing to the first element with -key not less than k. -

- -

-a.upper_bound(k): returns an iterator pointing to the first element with -key greater than k. -

-
- -

-We have "or a.end() if such an element is not found" for -find, but not for upper_bound or -lower_bound. As the text stands, one would be forced to -insert a new element into the container and return an iterator to that -in case the sought iterator does not exist, which does not seem to be -the intention (and not possible with the "const" versions). -

- - -

Proposed resolution:

- -

Change Table 69 of section 23.1.2 [associative.reqmts] indicated entries -to:

- -
-

-a.lower_bound(k): returns an iterator pointing to the first element with -key not less than k, or a.end() if such an element is not found. -

- -

-a.upper_bound(k): returns an iterator pointing to the first element with -key greater than k, or a.end() if such an element is not found. -

-
- -

[Curaçao: LWG reviewed PR.]

- - - - - - - - -
-

355. Operational semantics for a.back()

-

Section: 23.1.1 [sequence.reqmts] Status: WP - Submitter: Yaroslav Mironov Date: 2002-01-23

-

View all other issues in [sequence.reqmts].

-

View all issues with WP status.

-

Discussion:

- -

Table 68 "Optional Sequence Operations" in 23.1.1/12 -specifies operational semantics for "a.back()" as -"*--a.end()", which may be ill-formed [because calling -operator-- on a temporary (the return) of a built-in type is -ill-formed], provided a.end() returns a simple pointer rvalue -(this is almost always the case for std::vector::end(), for -example). Thus, the specification is not only incorrect, it -demonstrates a dangerous construct: "--a.end()" may -successfully compile and run as intended, but after changing the type -of the container or the mode of compilation it may produce -compile-time error.

- - - -

Proposed resolution:

-

Change the specification in table 68 "Optional Sequence -Operations" in 23.1.1/12 for "a.back()" from

- - -
*--a.end()
-
- -

to

- -
  { iterator tmp = a.end(); --tmp; return *tmp; }
-
- -

and the specification for "a.pop_back()" from

- -
a.erase(--a.end())
-
- -

to

- -
  { iterator tmp = a.end(); --tmp; a.erase(tmp); }
-
- -

[Curaçao: LWG changed PR from "{ X::iterator tmp = -a.end(); return *--tmp; }" to "*a.rbegin()", and from -"{ X::iterator tmp = a.end(); a.erase(--tmp); }" to -"a.erase(rbegin())".]

- - -

[There is a second possible defect; table 68 "Optional -Sequence Operations" in the "Operational Semantics" -column uses operations present only in the "Reversible -Container" requirements, yet there is no stated dependency -between these separate requirements tables. Ask in Santa Cruz if the -LWG would like a new issue opened.]

- - -

[Santa Cruz: the proposed resolution is even worse than what's in - the current standard: erase is undefined for reverse iterator. If - we're going to make the change, we need to define a temporary and - use operator--. Additionally, we don't know how prevalent this is: - do we need to make this change in more than one place? Martin has - volunteered to review the standard and see if this problem occurs - elsewhere.]

- - -

[Oxford: Matt provided new wording to address the concerns raised - in Santa Cruz. It does not appear that this problem appears - anywhere else in clauses 23 or 24.]

- - -

[Kona: In definition of operational semantics of back(), change -"*tmp" to "return *tmp;"]

- - - - - - - -
-

358. interpreting thousands_sep after a decimal_point

-

Section: 22.2.2.1.2 [facet.num.get.virtuals] Status: WP - Submitter: Martin Sebor Date: 2002-03-12

-

View other active issues in [facet.num.get.virtuals].

-

View all other issues in [facet.num.get.virtuals].

-

View all issues with WP status.

-

Discussion:

-

-I don't think thousands_sep is being treated correctly after -decimal_point has been seen. Since grouping applies only to the -integral part of the number, the first such occurrence should, IMO, -terminate Stage 2. (If it does not terminate it, then 22.2.2.1.2, p12 -and 22.2.3.1.2, p3 need to explain how thousands_sep is to be -interpreted in the fractional part of a number.) -

- -

-The easiest change I can think of that resolves this issue would be -something like below. -

- - -

Proposed resolution:

-

-Change the first sentence of 22.2.2.1.2, p9 from -

- -

- If discard is true then the position of the character is - remembered, but the character is otherwise ignored. If it is not - discarded, then a check is made to determine if c is allowed as - the next character of an input field of the conversion specifier - returned by stage 1. If so it is accumulated. -

- -

to

- -

- If discard is true, then if '.' has not yet been - accumulated, then the position of the character is remembered, but - the character is otherwise ignored. Otherwise, if '.' has - already been accumulated, the character is discarded and Stage 2 - terminates. ... -

- - - -

Rationale:

-

We believe this reflects the intent of the Standard. Thousands sep - characters after the decimal point are not useful in any locale. - Some formatting conventions do group digits that follow the decimal - point, but they usually introduce a different grouping character - instead of reusing the thousand sep character. If we want to add - support for such conventions, we need to do so explicitly.

- - - - - - -
-

359. num_put<>::do_put (..., bool) undocumented

-

Section: 22.2.2.2.1 [facet.num.put.members] Status: WP - Submitter: Martin Sebor Date: 2002-03-12

-

View all issues with WP status.

-

Discussion:

-

22.2.2.2.1, p1:

- -
    iter_type put (iter_type out, ios_base& str, char_type fill,
-                   bool val) const;
-    ...
-
-    1   Returns: do_put (out, str, fill, val).
-    
- -

AFAICS, the behavior of do_put (..., bool) is not documented anywhere, -however, 22.2.2.2.2, p23:

- -
-
iter_type put (iter_type out, ios_base& str, char_type fill,
-               bool val) const;
-
- - -

Effects: If (str.flags() & ios_base::boolalpha) == 0 then do - out = do_put(out, str, fill, (int)val) - Otherwise do

-
             string_type s =
-                 val ? use_facet<ctype<charT> >(loc).truename()
-                     : use_facet<ctype<charT> >(loc).falsename();
-
-

and then insert the characters of s into out. out.

-
- -

-This means that the bool overload of do_put() will never be called, -which contradicts the first paragraph. Perhaps the declaration -should read do_put(), and not put()? -

- -

-Note also that there is no Returns clause for this function, which -should probably be corrected, just as should the second occurrence -of "out." in the text. -

- -

-I think the least invasive change to fix it would be something like -the following: -

- - -

Proposed resolution:

-

In 22.2.2.2.2 [facet.num.put.virtuals], just above paragraph 1, remove - the bool overload.

- -

-In 22.2.2.2.2 [facet.num.put.virtuals], p23, make the following changes -

- -

- Replace put() with do_put() in the declaration - of the member function. -

- -

- Change the Effects clause to a Returns clause (to - avoid the requirement to call do_put(..., int) from - do_put (..., bool)) - like so: -

- -

- 23 Returns: If (str.flags() & - ios_base::boolalpha) == 0 then - do_put (out, str, fill, (long)val) - Otherwise the function obtains a string s as if by

-
             string_type s =
-                val ? use_facet<ctype<charT> >(loc).truename()
-                    : use_facet<ctype<charT> >(loc).falsename();
-
-

and then inserts each character c of s into out via - *out++ = c - and returns out.

-
- - - -

Rationale:

-This fixes a couple of obvious typos, and also fixes what appears to -be a requirement of gratuitous inefficiency. -

- - - - -
-

360. locale mandates inefficient implementation

-

Section: 22.1.1 [locale] Status: WP - Submitter: Martin Sebor Date: 2002-03-12

-

View all other issues in [locale].

-

View all issues with WP status.

-

Discussion:

-

-22.1.1, p7 (copied below) allows iostream formatters and extractors -to make assumptions about the values returned from facet members. -However, such assumptions are apparently not guaranteed to hold -in other cases (e.g., when the facet members are being called directly -rather than as a result of iostream calls, or between successive -calls to the same iostream functions with no interevening calls to -imbue(), or even when the facet member functions are called -from other member functions of other facets). This restriction -prevents locale from being implemented efficiently. -

- - -

Proposed resolution:

-

Change the first sentence in 22.1.1, p7 from

-

- In successive calls to a locale facet member function during - a call to an iostream inserter or extractor or a streambuf member - function, the returned result shall be identical. [Note: This - implies that such results may safely be reused without calling - the locale facet member function again, and that member functions - of iostream classes cannot safely call imbue() - themselves, except as specified elsewhere. --end note] -

- -

to

- -

- In successive calls to a locale facet member function on a facet - object installed in the same locale, the returned result shall be - identical. ... -

- - - -

Rationale:

-

This change is reasonable becuase it clarifies the intent of this - part of the standard.

- - - - - -
-

362. bind1st/bind2nd type safety

-

Section: D.8 [depr.lib.binders] Status: WP - Submitter: Andrew Demkin Date: 2002-04-26

-

View all other issues in [depr.lib.binders].

-

View all issues with WP status.

-

Discussion:

-

-The definition of bind1st() (D.8 [depr.lib.binders]) can result in -the construction of an unsafe binding between incompatible pointer -types. For example, given a function whose first parameter type is -'pointer to T', it's possible without error to bind an argument of -type 'pointer to U' when U does not derive from T: -

-
   foo(T*, int);
-
-   struct T {};
-   struct U {};
-
-   U u;
-
-   int* p;
-   int* q;
-
-   for_each(p, q, bind1st(ptr_fun(foo), &u));    // unsafe binding
-
- -

-The definition of bind1st() includes a functional-style conversion to -map its argument to the expected argument type of the bound function -(see below): -

-
  typename Operation::first_argument_type(x)
-
- -

A functional-style conversion (D.8 [depr.lib.binders]) is defined to -be -semantically equivalent to an explicit cast expression (D.8 -[depr.lib.binders]), which may (according to 5.4, paragraph 5) be -interpreted -as a reinterpret_cast, thus masking the error. -

- -

The problem and proposed change also apply to D.8 [depr.lib.binders].

- - -

Proposed resolution:

-

Add this sentence to the end of D.8 [depr.lib.binders]/1: - "Binders bind1st and bind2nd are deprecated in - favor of std::tr1::bind."

- -

(Notes to editor: (1) when and if tr1::bind is incorporated into - the standard, "std::tr1::bind" should be changed to "std::bind". (2) - 20.5.6 should probably be moved to Annex D.

- - -

Rationale:

-

There is no point in fixing bind1st and bind2nd. tr1::bind is a - superior solution. It solves this problem and others.

- - - - - -
-

363. Missing exception specification in 27.4.2.1.1

-

Section: 27.4.2.1.1 [ios::failure] Status: WP - Submitter: Walter Brown and Marc Paterno Date: 2002-05-20

-

View all other issues in [ios::failure].

-

View all issues with WP status.

-

Discussion:

-

-The destructor of ios_base::failure should have an empty throw -specification, because the destructor of its base class, exception, is -declared in this way. -

- - -

Proposed resolution:

-

Change the destructor to

-
  virtual ~failure() throw();
-
- - -

Rationale:

-

Fixes an obvious glitch. This is almost editorial.

- - - - - -
-

364. Inconsistent wording in 27.5.2.4.2

-

Section: 27.5.2.4.2 [streambuf.virt.buffer] Status: WP - Submitter: Walter Brown, Marc Paterno Date: 2002-05-10

-

View all other issues in [streambuf.virt.buffer].

-

View all issues with WP status.

-

Discussion:

-

-27.5.2.4.2 [streambuf.virt.buffer] paragraph 1 is inconsistent with the Effects -clause for seekoff. -

- - -

Proposed resolution:

-

-Make this paragraph, the Effects clause for setbuf, consistent in wording -with the Effects clause for seekoff in paragraph 3 by amending paragraph 1 -to indicate the purpose of setbuf: -

- -

Original text:

- -

-1 Effects: Performs an operation that is defined separately for each -class derived from basic_streambuf in this clause (27.7.1.3, 27.8.1.4). -

- -

Proposed text:

- -

-1 Effects: Influences stream buffering in a way that is defined separately -for each class derived from basic_streambuf in this clause -(27.7.1.3, 27.8.1.4). -

- - - -

Rationale:

-

The LWG doesn't believe there is any normative difference between - the existing wording and what's in the proposed resolution, but the - change may make the intent clearer.

- - - - - -
-

365. Lack of const-qualification in clause 27

-

Section: 27 [input.output] Status: WP - Submitter: Walter Brown, Marc Paterno Date: 2002-05-10

-

View all other issues in [input.output].

-

View all issues with WP status.

-

Discussion:

-

-Some stream and streambuf member functions are declared non-const, -even thought they appear only to report information rather than to -change an object's logical state. They should be declared const. See -document N1360 for details and rationale. -

- -

The list of member functions under discussion: in_avail, -showmanyc, tellg, tellp, is_open.

- -

Related issue: 73

- - - -

Proposed resolution:

-

In 27.8.1.5, 27.8.1.7, 27.8.1.8, 27.8.1.10, 27.8.1.11, and 27.8.1.13

-

Replace

-
  bool is_open();
-
-

with

-
  bool is_open() const;
-
- - -

Rationale:

-

Of the changes proposed in N1360, the only one that is safe is -changing the filestreams' is_open to const. The LWG believed that -this was NAD the first time it considered this issue (issue 73), but now thinks otherwise. The corresponding streambuf -member function, after all,is already const.

- -

The other proposed changes are less safe, because some streambuf -functions that appear merely to report a value do actually perform -mutating operations. It's not even clear that they should be -considered "logically const", because streambuf has two interfaces, a -public one and a protected one. These functions may, and often do, -change the state as exposed by the protected interface, even if the -state exposed by the public interface is unchanged.

- -

Note that implementers can make this change in a binary compatible -way by providing both overloads; this would be a conforming extension.

- - - - - - -
-

369. io stream objects and static ctors

-

Section: 27.3 [iostream.objects] Status: WP - Submitter: Ruslan Abdikeev Date: 2002-07-08

-

View all other issues in [iostream.objects].

-

View all issues with WP status.

-

Discussion:

-

-Is it safe to use standard iostream objects from constructors of -static objects? Are standard iostream objects constructed and are -their associations established at that time? -

- -

Surpisingly enough, Standard does NOT require that.

- -

-27.3/2 [lib.iostream.objects] guarantees that standard iostream -objects are constructed and their associations are established before -the body of main() begins execution. It also refers to ios_base::Init -class as the panacea for constructors of static objects. -

- -

-However, there's nothing in 27.3 [lib.iostream.objects], -in 27.4.2 [lib.ios.base], and in 27.4.2.1.6 [lib.ios::Init], -that would require implementations to allow access to standard -iostream objects from constructors of static objects. -

- -

Details:

- -

Core text refers to some magic object ios_base::Init, which will -be discussed below:

- -

- "The [standard iostream] objects are constructed, and their - associations are established at some time prior to or during - first time an object of class basic_ios<charT,traits>::Init - is constructed, and in any case before the body of main - begins execution." (27.3/2 [lib.iostream.objects]) -

- -

-The first non-normative footnote encourages implementations -to initialize standard iostream objects earlier than required. -

- -

However, the second non-normative footnote makes an explicit -and unsupported claim:

- -

- "Constructors and destructors for static objects can access these - [standard iostream] objects to read input from stdin or write output - to stdout or stderr." (27.3/2 footnote 265 [lib.iostream.objects]) -

- -

-The only bit of magic is related to that ios_base::Init class. AFAIK, -the rationale behind ios_base::Init was to bring an instance of this -class to each translation unit which #included <iostream> or -related header. Such an inclusion would support the claim of footnote -quoted above, because in order to use some standard iostream object it -is necessary to #include <iostream>. -

- -

-However, while Standard explicitly describes ios_base::Init as -an appropriate class for doing the trick, I failed to found a -mention of an _instance_ of ios_base::Init in Standard. -

- - -

Proposed resolution:

- -

Add to 27.3 [iostream.objects], p2, immediately before the last sentence -of the paragraph, the following two sentences:

- -

-If a translation unit includes <iostream>, or explicitly -constructs an ios_base::Init object, these stream objects shall -be constructed before dynamic initialization of non-local -objects defined later in that translation unit, and these stream -objects shall be destroyed after the destruction of dynamically -initialized non-local objects defined later in that translation unit. -

- -

[Lillehammer: Matt provided wording.]

- -

[Mont Tremblant: Matt provided revised wording.]

- - - -

Rationale:

-

-The original proposed resolution unconditionally required -implementations to define an ios_base::Init object of some -implementation-defined name in the header <iostream>. That's an -overspecification. First, defining the object may be unnecessary -and even detrimental to performance if an implementation can -guarantee that the 8 standard iostream objects will be initialized -before any other user-defined object in a program. Second, there -is no need to require implementations to document the name of the -object.

- -

-The new proposed resolution gives users guidance on what they need to -do to ensure that stream objects are constructed during startup.

- - - - - -
-

370. Minor error in basic_istream::get

-

Section: 27.6.1.3 [istream.unformatted] Status: WP - Submitter: Ray Lischner Date: 2002-07-15

-

View all other issues in [istream.unformatted].

-

View all issues with WP status.

-

Discussion:

-

Defect report for description of basic_istream::get (section -27.6.1.3 [istream.unformatted]), paragraph 15. The description for the -get function -with the following signature:

- -
  basic_istream<charT,traits>& get(basic_streambuf<char_type,traits>&
-  sb);
-
- -

is incorrect. It reads

- -

- Effects: Calls get(s,n,widen('\n')) -

- -

which I believe should be:

- -

- Effects: Calls get(sb,widen('\n')) -

- - -

Proposed resolution:

-

Change the Effects paragraph to:

-

- Effects: Calls get(sb,this->widen('\n')) -

- -

[Pre-Oxford: Minor correction from Howard: replaced 'widen' - with 'this->widen'.]

- - - - -

Rationale:

Fixes an obvious typo.

- - - - -
-

371. Stability of multiset and multimap member functions

-

Section: 23.1 [container.requirements] Status: WP - Submitter: Frank Compagner Date: 2002-07-20

-

View other active issues in [container.requirements].

-

View all other issues in [container.requirements].

-

View all issues with WP status.

-

Discussion:

-

-The requirements for multiset and multimap containers (23.1 -[lib.containers.requirements], 23.1.2 [lib.associative.reqmnts], -23.3.2 [lib.multimap] and 23.3.4 [lib.multiset]) make no mention of -the stability of the required (mutating) member functions. It appears -the standard allows these functions to reorder equivalent elements of -the container at will, yet the pervasive red-black tree implementation -appears to provide stable behaviour. -

- -

This is of most concern when considering the behaviour of erase(). -A stability requirement would guarantee the correct working of the -following 'idiom' that removes elements based on a certain predicate -function. -

- -
  multimap<int, int> m;
-  multimap<int, int>::iterator i = m.begin();
-  while (i != m.end()) {
-      if (pred(i))
-          m.erase (i++);
-      else
-          ++i;
-  }
-
- -

-Although clause 23.1.2/8 guarantees that i remains a valid iterator -througout this loop, absence of the stability requirement could -potentially result in elements being skipped. This would make -this code incorrect, and, furthermore, means that there is no way -of erasing these elements without iterating first over the entire -container, and second over the elements to be erased. This would -be unfortunate, and have a negative impact on both performance and -code simplicity. -

- -

-If the stability requirement is intended, it should be made explicit -(probably through an extra paragraph in clause 23.1.2). -

-

-If it turns out stability cannot be guaranteed, i'd argue that a -remark or footnote is called for (also somewhere in clause 23.1.2) to -warn against relying on stable behaviour (as demonstrated by the code -above). If most implementations will display stable behaviour, any -problems emerging on an implementation without stable behaviour will -be hard to track down by users. This would also make the need for an -erase_if() member function that much greater. -

- -

This issue is somewhat related to LWG issue 130.

- - - -

Proposed resolution:

- -

Add the following to the end of 23.1.2 [associative.reqmts] paragraph 4: -"For multiset and multimap, insertand erase - are stable: they preserve the relative ordering of equivalent - elements.

- -

[Lillehammer: Matt provided wording]

- -

[Joe Gottman points out that the provided wording does not address -multimap and multiset. N1780 also addresses this issue and suggests -wording.]

- - -

[Mont Tremblant: Changed set and map to multiset and multimap.]

- - - - -

Rationale:

-

The LWG agrees that this guarantee is necessary for common user - idioms to work, and that all existing implementations provide this - property. Note that this resolution guarantees stability for - multimap and multiset, not for all associative containers in - general.

- - - - - - -
-

373. Are basic_istream and basic_ostream to use (exceptions()&badbit) != 0 ?

-

Section: 27.6.1.2.1 [istream.formatted.reqmts], 27.6.2.6.1 [ostream.formatted.reqmts] Status: WP - Submitter: Keith Baker Date: 2002-07-23

-

View all other issues in [istream.formatted.reqmts].

-

View all issues with WP status.

-

Discussion:

- -

-In 27.6.1.2.1 [istream.formatted.reqmts] and 27.6.2.6.1 [ostream.formatted.reqmts] -(exception()&badbit) != 0 is used in testing for rethrow, yet -exception() is the constructor to class std::exception in 18.6.1 [type.info] that has no return type. Should member function -exceptions() found in 27.4.4 [ios] be used instead? -

- - - -

Proposed resolution:

-

-In 27.6.1.2.1 [istream.formatted.reqmts] and 27.6.2.6.1 [ostream.formatted.reqmts], change -"(exception()&badbit) != 0" to "(exceptions()&badbit) != 0". -

- - -

Rationale:

-

Fixes an obvious typo.

- - - - - -
-

375. basic_ios should be ios_base in 27.7.1.3

-

Section: 27.7.1.4 [stringbuf.virtuals] Status: WP - Submitter: Ray Lischner Date: 2002-08-14

-

View other active issues in [stringbuf.virtuals].

-

View all other issues in [stringbuf.virtuals].

-

View all issues with WP status.

-

Discussion:

-

-In Section 27.7.1.4 [stringbuf.virtuals]: Table 90, Table 91, and paragraph -14 all contain references to "basic_ios::" which should be -"ios_base::". -

- - -

Proposed resolution:

-

-Change all references to "basic_ios" in Table 90, Table 91, and -paragraph 14 to "ios_base". -

- - -

Rationale:

Fixes an obvious typo.

- - - - -
-

376. basic_streambuf semantics

-

Section: 27.7.1.4 [stringbuf.virtuals] Status: WP - Submitter: Ray Lischner Date: 2002-08-14

-

View other active issues in [stringbuf.virtuals].

-

View all other issues in [stringbuf.virtuals].

-

View all issues with WP status.

-

Discussion:

-

-In Section 27.7.1.4 [stringbuf.virtuals], Table 90, the implication is that -the four conditions should be mutually exclusive, but they are not. -The first two cases, as written, are subcases of the third.

- -

-As written, it is unclear what should be the result if cases 1 and 2 -are both true, but case 3 is false. -

- - - -

Proposed resolution:

- -

Rewrite these conditions as:

-
-

- (which & (ios_base::in|ios_base::out)) == ios_base::in -

- -

- (which & (ios_base::in|ios_base::out)) == ios_base::out -

- -

- (which & (ios_base::in|ios_base::out)) == -(ios_base::in|ios_base::out) - and way == either ios_base::beg or ios_base::end -

- -

Otherwise

-
- - - -

Rationale:

-

It's clear what we wanted to say, we just failed to say it. This - fixes it.

- - - - - -
-

379. nonsensical ctype::do_widen() requirement

-

Section: 22.2.1.1.2 [locale.ctype.virtuals] Status: WP - Submitter: Martin Sebor Date: 2002-09-06

-

View all other issues in [locale.ctype.virtuals].

-

View all issues with WP status.

-

Discussion:

-

-The last sentence in 22.2.1.1.2, p11 below doesn't seem to make sense. -

-
  charT do_widen (char c) const;
-
-  -11- Effects: Applies the simplest reasonable transformation from
-       a char value or sequence of char values to the corresponding
-       charT value or values. The only characters for which unique
-       transformations are required are those in the basic source
-       character set (2.2). For any named ctype category with a
-       ctype<charT> facet ctw and valid ctype_base::mask value
-       M (is(M, c) || !ctw.is(M, do_widen(c))) is true.
-
-

-Shouldn't the last sentence instead read -

-
       For any named ctype category with a ctype<char> facet ctc
-       and valid ctype_base::mask value M
-       (ctc.is(M, c) || !is(M, do_widen(c))) is true.
-
-

-I.e., if the narrow character c is not a member of a class of -characters then neither is the widened form of c. (To paraphrase -footnote 224.) -

- - -

Proposed resolution:

-

-Replace the last sentence of 22.2.1.1.2 [locale.ctype.virtuals], p11 with the -following text: -

-
       For any named ctype category with a ctype<char> facet ctc
-       and valid ctype_base::mask value M,
-       (ctc.is(M, c) || !is(M, do_widen(c))) is true.
-
- -

[Kona: Minor edit. Added a comma after the M for clarity.]

- - - - -

Rationale:

-

The LWG believes this is just a typo, and that this is the correct fix.

- - - - - -
-

380. typos in codecvt tables 53 and 54

-

Section: 22.2.1.5 [locale.codecvt.byname] Status: WP - Submitter: Martin Sebor Date: 2002-09-06

-

View all other issues in [locale.codecvt.byname].

-

View all issues with WP status.

-

Discussion:

-

-Tables 53 and 54 in 22.2.1.5 [locale.codecvt.byname] are both titled "convert -result values," when surely "do_in/do_out result values" must have -been intended for Table 53 and "do_unshift result values" for Table -54. -

-

-Table 54, row 3 says that the meaning of partial is "more characters -needed to be supplied to complete termination." The function is not -supplied any characters, it is given a buffer which it fills with -characters or, more precisely, destination elements (i.e., an escape -sequence). So partial means that space for more than (to_limit - to) -destination elements was needed to terminate a sequence given the -value of state. -

- - -

Proposed resolution:

-

-Change the title of Table 53 to "do_in/do_out result values" and -the title of Table 54 to "do_unshift result values." -

-

-Change the text in Table 54, row 3 (the partial row), under the -heading Meaning, to "space for more than (to_limit - to) destination -elements was needed to terminate a sequence given the value of state." -

- - - - -
-

381. detection of invalid mbstate_t in codecvt

-

Section: 22.2.1.5 [locale.codecvt.byname] Status: WP - Submitter: Martin Sebor Date: 2002-09-06

-

View all other issues in [locale.codecvt.byname].

-

View all issues with WP status.

-

Discussion:

-

-All but one codecvt member functions that take a state_type argument -list as one of their preconditions that the state_type argument have -a valid value. However, according to 22.2.1.5.2, p6, -codecvt::do_unshift() is the only codecvt member that is supposed to -return error if the state_type object is invalid. -

- -

-It seems to me that the treatment of state_type by all codecvt member -functions should be the same and the current requirements should be -changed. Since the detection of invalid state_type values may be -difficult in general or computationally expensive in some specific -cases, I propose the following: -

- - -

Proposed resolution:

-

-Add a new paragraph before 22.2.1.5.2, p5, and after the function -declaration below -

-
    result do_unshift(stateT& state,
-    externT* to, externT* to_limit, externT*& to_next) const;
-
-

-as follows: -

-
    Requires: (to <= to_end) well defined and true; state initialized,
-    if at the beginning of a sequence, or else equal to the result of
-    converting the preceding characters in the sequence.
-
-

-and change the text in Table 54, row 4, the error row, under -the heading Meaning, from -

-
    state has invalid value
-
-

-to -

-
    an unspecified error has occurred
-
- - -

Rationale:

-

The intent is that implementations should not be required to detect -invalid state values; such a requirement appears nowhere else. An -invalid state value is a precondition violation, i.e. undefined -behavior. Implementations that do choose to detect invalid state -values, or that choose to detect any other kind of error, may return -error as an indication.

- - - - - -
-

383. Bidirectional iterator assertion typo

-

Section: 24.1.4 [bidirectional.iterators] Status: WP - Submitter: ysapir (submitted via comp.std.c++) Date: 2002-10-17

-

View all other issues in [bidirectional.iterators].

-

View all issues with WP status.

-

Discussion:

-

-Following a discussion on the boost list regarding end iterators and -the possibility of performing operator--() on them, it seems to me -that there is a typo in the standard. This typo has nothing to do -with that discussion. -

- -

-I have checked this newsgroup, as well as attempted a search of the -Active/Defect/Closed Issues List on the site for the words "s is -derefer" so I believe this has not been proposed before. Furthermore, -the "Lists by Index" mentions only DR 299 on section -24.1.4, and DR 299 is not related to this issue. -

- -

-The standard makes the following assertion on bidirectional iterators, -in section 24.1.4 [lib.bidirectional.iterators], Table 75: -

- -
                         operational  assertion/note
-expression  return type   semantics    pre/post-condition
-
---r          X&                        pre: there exists s such
-                                       that r == ++s.
-                                       post: s is dereferenceable.
-                                       --(++r) == r.
-                                       --r == --s implies r == s.
-                                       &r == &--r.
-
- -

-(See http://aspn.activestate.com/ASPN/Mail/Message/boost/1395763.) -

- -

-In particular, "s is dereferenceable" seems to be in error. It seems -that the intention was to say "r is dereferenceable". -

- -

-If it were to say "r is dereferenceable" it would -make perfect sense. Since s must be dereferenceable prior to -operator++, then the natural result of operator-- (to undo operator++) -would be to make r dereferenceable. Furthermore, without other -assertions, and basing only on precondition and postconditions, we -could not otherwise know this. So it is also interesting information. -

- - - -

Proposed resolution:

-

-Change the guarantee to "postcondition: r is dereferenceable." -

- - -

Rationale:

Fixes an obvious typo

- - - - -
-

384. equal_range has unimplementable runtime complexity

-

Section: 25.3.3.3 [equal.range] Status: WP - Submitter: Hans Bos Date: 2002-10-18

-

View all other issues in [equal.range].

-

View all issues with WP status.

-

Discussion:

-

-Section 25.3.3.3 [equal.range] -states that at most 2 * log(last - first) + 1 -comparisons are allowed for equal_range. -

- -

It is not possible to implement equal_range with these constraints.

- -

In a range of one element as in:

-
    int x = 1;
-    equal_range(&x, &x + 1, 1)
-
- -

it is easy to see that at least 2 comparison operations are needed.

- -

For this case at most 2 * log(1) + 1 = 1 comparison is allowed.

- -

I have checked a few libraries and they all use the same (nonconforming) -algorithm for equal_range that has a complexity of

-
     2* log(distance(first, last)) + 2.
-
-

I guess this is the algorithm that the standard assumes for equal_range.

- -

-It is easy to see that 2 * log(distance) + 2 comparisons are enough -since equal range can be implemented with lower_bound and upper_bound -(both log(distance) + 1). -

- -

-I think it is better to require something like 2log(distance) + O(1) (or -even logarithmic as multiset::equal_range). -Then an implementation has more room to optimize for certain cases (e.g. -have log(distance) characteristics when at most match is found in the range -but 2log(distance) + 4 for the worst case). -

- - - -

Proposed resolution:

-

In 25.3.3.1 [lower.bound]/4, change log(last - first) + 1 -to log2(last - first) + O(1).

- -

In 25.3.3.2 [upper.bound]/4, change log(last - first) + 1 -to log2(last - first) + O(1).

- -

In 25.3.3.3 [equal.range]/4, change 2*log(last - first) + 1 -to 2*log2(last - first) + O(1).

- -

[Matt provided wording]

- - - -

Rationale:

-

The LWG considered just saying O(log n) for all three, but - decided that threw away too much valuable information. The fact - that lower_bound is twice as fast as equal_range is important. - However, it's better to allow an arbitrary additive constant than to - specify an exact count. An exact count would have to - involve floor or ceil. It would be too easy to - get this wrong, and don't provide any substantial value for users.

- - - - -
-

386. Reverse iterator's operator[] has impossible return type

-

Section: 24.4.1.3.11 [reverse.iter.op-=] Status: DR - Submitter: Matt Austern Date: 2002-10-23

-

View all issues with DR status.

-

Discussion:

-

In 24.4.1.3.11 [reverse.iter.op-=], reverse_iterator<>::operator[] -is specified as having a return type of reverse_iterator::reference, -which is the same as iterator_traits<Iterator>::reference. -(Where Iterator is the underlying iterator type.)

- -

The trouble is that Iterator's own operator[] doesn't - necessarily have a return type - of iterator_traits<Iterator>::reference. Its - return type is merely required to be convertible - to Iterator's value type. The return type specified for - reverse_iterator's operator[] would thus appear to be impossible.

- -

With the resolution of issue 299, the type of - a[n] will continue to be required (for random access - iterators) to be convertible to the value type, and also a[n] = - t will be a valid expression. Implementations of - reverse_iterator will likely need to return a proxy from - operator[] to meet these requirements. As mentioned in the - comment from Dave Abrahams, the simplest way to specify that - reverse_iterator meet this requirement to just mandate - it and leave the return type of operator[] unspecified.

- - - -

Proposed resolution:

- -

In 24.4.1.2 [reverse.iter.requirements] change:

- -
-
reference operator[](difference_type n) const;
-
-
- -

to:

- -
-
unspecified operator[](difference_type n) const; // see 24.1.5 [random.access.iterators]
-
-
- - - - -

[ -Comments from Dave Abrahams: IMO we should resolve 386 by just saying - that the return type of reverse_iterator's operator[] is - unspecified, allowing the random access iterator requirements to - impose an appropriate return type. If we accept 299's proposed - resolution (and I think we should), the return type will be - readable and writable, which is about as good as we can do. -]

- - - - - - -
-

389. Const overload of valarray::operator[] returns by value

-

Section: 26.5.2.3 [valarray.access] Status: WP - Submitter: Gabriel Dos Reis Date: 2002-11-08

-

View all other issues in [valarray.access].

-

View all issues with WP status.

-

Duplicate of: 77

-

Discussion:

-

Consider the following program:

-
    #include <iostream>
-    #include <ostream>
-    #include <vector>
-    #include <valarray>
-    #include <algorithm>
-    #include <iterator>
-    template<typename Array>
-    void print(const Array& a)
-    {
-    using namespace std;
-    typedef typename Array::value_type T;
-    copy(&a[0], &a[0] + a.size(),
-    ostream_iterator<T>(std::cout, " "));
-    }
-    template<typename T, unsigned N>
-    unsigned size(T(&)[N]) { return N; }
-    int main()
-    {
-    double array[] = { 0.89, 9.3, 7, 6.23 };
-    std::vector<double> v(array, array + size(array));
-    std::valarray<double> w(array, size(array));
-    print(v); // #1
-    std::cout << std::endl;
-    print(w); // #2
-    std::cout << std::endl;
-    }
-
- -

While the call numbered #1 succeeds, the call numbered #2 fails -because the const version of the member function -valarray<T>::operator[](size_t) returns a value instead of a -const-reference. That seems to be so for no apparent reason, no -benefit. Not only does that defeats users' expectation but it also -does hinder existing software (written either in C or Fortran) -integration within programs written in C++. There is no reason why -subscripting an expression of type valarray<T> that is const-qualified -should not return a const T&.

- - -

Proposed resolution:

-

In the class synopsis in 26.5.2 [template.valarray], and in -26.5.2.3 [valarray.access] just above paragraph 1, change

-
  T operator[](size_t const);
-
-

to

-
  const T& operator[](size_t const);
-
- -

[Kona: fixed a minor typo: put semicolon at the end of the line - wehre it belongs.]

- - - - -

Rationale:

-

Return by value seems to serve no purpose. Valaray was explicitly -designed to have a specified layout so that it could easily be -integrated with libraries in other languages, and return by value -defeats that purpose. It is believed that this change will have no -impact on allowable optimizations.

- - - - - -
-

391. non-member functions specified as const

-

Section: 22.1.3.2 [conversions] Status: WP - Submitter: James Kanze Date: 2002-12-10

-

View all issues with WP status.

-

Discussion:

-

-The specifications of toupper and tolower both specify the functions as -const, althought they are not member functions, and are not specified as -const in the header file synopsis in section 22.1 [locales]. -

- - -

Proposed resolution:

-

In 22.1.3.2 [conversions], remove const from the function - declarations of std::toupper and std::tolower

- - -

Rationale:

Fixes an obvious typo

- - - - -
-

395. inconsistencies in the definitions of rand() and random_shuffle()

-

Section: 26.7 [c.math] Status: WP - Submitter: James Kanze Date: 2003-01-03

-

View other active issues in [c.math].

-

View all other issues in [c.math].

-

View all issues with WP status.

-

Discussion:

-

-In 26.7 [c.math], the C++ standard refers to the C standard for the -definition of rand(); in the C standard, it is written that "The -implementation shall behave as if no library function calls the rand -function." -

- -

-In 25.2.12 [alg.random.shuffle], there is no specification as to -how the two parameter version of the function generates its random -value. I believe that all current implementations in fact call rand() -(in contradiction with the requirement avove); if an implementation does -not call rand(), there is the question of how whatever random generator -it does use is seeded. Something is missing. -

- - - -

Proposed resolution:

-

-In [lib.c.math], add a paragraph specifying that the C definition of -rand shal be modified to say that "Unless otherwise specified, the -implementation shall behave as if no library function calls the rand -function." -

- -

-In [lib.alg.random.shuffle], add a sentence to the effect that "In -the two argument form of the function, the underlying source of -random numbers is implementation defined. [Note: in particular, an -implementation is permitted to use rand.] -

- - -

Rationale:

-

The original proposed resolution proposed requiring the - two-argument from of random_shuffle to - use rand. We don't want to do that, because some existing - implementations already use something else: gcc - uses lrand48, for example. Using rand presents a - problem if the number of elements in the sequence is greater than - RAND_MAX.

- - - - - -
-

400. redundant type cast in lib.allocator.members

-

Section: 20.6.1.1 [allocator.members] Status: WP - Submitter: Markus Mauhart Date: 2003-02-27

-

View all other issues in [allocator.members].

-

View all issues with WP status.

-

Discussion:

-

-20.6.1.1 [allocator.members] allocator members, contains -the following 3 lines: -

- -
  12 Returns: new((void *) p) T( val)
-     void destroy(pointer p);
-  13 Returns: ((T*) p)->~T()
-
- -

-The type cast "(T*) p" in the last line is redundant cause -we know that std::allocator<T>::pointer is a typedef for T*. -

- - -

Proposed resolution:

-

-Replace "((T*) p)" with "p". -

- - -

Rationale:

Just a typo, this is really editorial.

- - - - -
-

401. incorrect type casts in table 32 in lib.allocator.requirements

-

Section: 20.1.2 [allocator.requirements] Status: WP - Submitter: Markus Mauhart Date: 2003-02-27

-

View other active issues in [allocator.requirements].

-

View all other issues in [allocator.requirements].

-

View all issues with WP status.

-

Discussion:

-

-I think that in par2 of [default.con.req] the last two -lines of table 32 contain two incorrect type casts. The lines are ... -

- -
  a.construct(p,t)   Effect: new((void*)p) T(t)
-  a.destroy(p)       Effect: ((T*)p)?->~T()
-
- -

-.... with the prerequisits coming from the preceding two paragraphs, especially -from table 31: -

- -
  alloc<T>             a     ;// an allocator for T
-  alloc<T>::pointer    p     ;// random access iterator
-                              // (may be different from T*)
-  alloc<T>::reference  r = *p;// T&
-  T const&             t     ;
-
- -

-For that two type casts ("(void*)p" and "(T*)p") to be well-formed -this would require then conversions to T* and void* for all -alloc<T>::pointer, so it would implicitely introduce extra -requirements for alloc<T>::pointer, additionally to the only -current requirement (being a random access iterator). -

- - -

Proposed resolution:

- -

-Accept proposed wording from -N2436 part 1. -

- -

-Note: Actually I would prefer to replace "((T*)p)?->dtor_name" with -"p?->dtor_name", but AFAICS this is not possible cause of an omission -in 13.5.6 [over.ref] (for which I have filed another DR on 29.11.2002). -

- -

[Kona: The LWG thinks this is somewhere on the border between - Open and NAD. The intend is clear: construct constructs an - object at the location p. It's reading too much into the - description to think that literally calling new is - required. Tweaking this description is low priority until we can do - a thorough review of allocators, and, in particular, allocators with - non-default pointer types.]

- - -

[ -Batavia: Proposed resolution changed to less code and more description. -]

- - -

[ -post Oxford: This would be rendered NAD Editorial by acceptance of -N2257. -]

- - -

[ -Kona (2007): The LWG adopted the proposed resolution of N2387 for this issue which -was subsequently split out into a separate paper N2436 for the purposes of voting. -The resolution in N2436 addresses this issue. The LWG voted to accelerate this -issue to Ready status to be voted into the WP at Kona. -]

- - - - - - - -
-

402. wrong new expression in [some_]allocator::construct

-

Section: 20.1.2 [allocator.requirements], 20.6.1.1 [allocator.members] Status: WP - Submitter: Markus Mauhart Date: 2003-02-27

-

View other active issues in [allocator.requirements].

-

View all other issues in [allocator.requirements].

-

View all issues with WP status.

-

Discussion:

-

-This applies to the new expression that is contained in both par12 of -20.6.1.1 [allocator.members] and in par2 (table 32) of [default.con.req]. -I think this new expression is wrong, involving unintended side -effects. -

- - -

20.6.1.1 [allocator.members] contains the following 3 lines:

- -
  11 Returns: the largest value N for which the call allocate(N,0) might succeed.
-     void construct(pointer p, const_reference val);
-  12 Returns: new((void *) p) T( val)
-
- - -

[default.con.req] in table 32 has the following line:

-
  a.construct(p,t)   Effect: new((void*)p) T(t)
-
- -

-.... with the prerequisits coming from the preceding two paragraphs, -especially from table 31: -

- -
  alloc<T>             a     ;// an allocator for T
-  alloc<T>::pointer    p     ;// random access iterator
-                              // (may be different from T*)
-  alloc<T>::reference  r = *p;// T&
-  T const&             t     ;
-
- -

-Cause of using "new" but not "::new", any existing "T::operator new" -function will hide the global placement new function. When there is no -"T::operator new" with adequate signature, -every_alloc<T>::construct(..) is ill-formed, and most -std::container<T,every_alloc<T>> use it; a workaround -would be adding placement new and delete functions with adequate -signature and semantic to class T, but class T might come from another -party. Maybe even worse is the case when T has placement new and -delete functions with adequate signature but with "unknown" semantic: -I dont like to speculate about it, but whoever implements -any_container<T,any_alloc> and wants to use construct(..) -probably must think about it. -

- - -

Proposed resolution:

-

-Replace "new" with "::new" in both cases. -

- - - - - - - -
-

403. basic_string::swap should not throw exceptions

-

Section: 21.3.6.8 [string::swap] Status: WP - Submitter: Beman Dawes Date: 2003-03-25

-

View all other issues in [string::swap].

-

View all issues with WP status.

-

Discussion:

- -

-std::basic_string, 21.3 [basic.string] paragraph 2 says that -basic_string "conforms to the requirements of a Sequence, as specified -in (23.1.1)." The sequence requirements specified in (23.1.1) to not -include any prohibition on swap members throwing exceptions. -

- -

-Section 23.1 [container.requirements] paragraph 10 does limit conditions under -which exceptions may be thrown, but applies only to "all container -types defined in this clause" and so excludes basic_string::swap -because it is defined elsewhere. -

- -

-Eric Niebler points out that 21.3 [basic.string] paragraph 5 explicitly -permits basic_string::swap to invalidates iterators, which is -disallowed by 23.1 [container.requirements] paragraph 10. Thus the standard would -be contradictory if it were read or extended to read as having -basic_string meet 23.1 [container.requirements] paragraph 10 requirements. -

- -

-Yet several LWG members have expressed the belief that the original -intent was that basic_string::swap should not throw exceptions as -specified by 23.1 [container.requirements] paragraph 10, and that the standard is -unclear on this issue. The complexity of basic_string::swap is -specified as "constant time", indicating the intent was to avoid -copying (which could cause a bad_alloc or other exception). An -important use of swap is to ensure that exceptions are not thrown in -exception-safe code. -

- -

-Note: There remains long standing concern over whether or not it is -possible to reasonably meet the 23.1 [container.requirements] paragraph 10 swap -requirements when allocators are unequal. The specification of -basic_string::swap exception requirements is in no way intended to -address, prejudice, or otherwise impact that concern. -

- - - - - - - -

Proposed resolution:

-

-In 21.3.6.8 [string::swap], add a throws clause: -

- -

-Throws: Shall not throw exceptions. -

- - - - - -
-

404. May a replacement allocation function be declared inline?

-

Section: 17.4.3.4 [replacement.functions], 18.5.1 [new.delete] Status: WP - Submitter: Matt Austern Date: 2003-04-24

-

View all issues with WP status.

-

Discussion:

-

-The eight basic dynamic memory allocation functions (single-object -and array versions of ::operator new and ::operator delete, in the -ordinary and nothrow forms) are replaceable. A C++ program may -provide an alternative definition for any of them, which will be used -in preference to the implementation's definition. -

- -

-Three different parts of the standard mention requirements on -replacement functions: 17.4.3.4 [replacement.functions], 18.5.1.1 [new.delete.single] -and 18.5.1.2 [new.delete.array], and 3.7.2 [basic.stc.auto]. -

- -

None of these three places say whether a replacement function may - be declared inline. 18.5.1.1 [new.delete.single] paragraph 2 specifies a - signature for the replacement function, but that's not enough: - the inline specifier is not part of a function's signature. - One might also reason from 7.1.2 [dcl.fct.spec] paragraph 2, which - requires that "an inline function shall be defined in every - translation unit in which it is used," but this may not be quite - specific enough either. We should either explicitly allow or - explicitly forbid inline replacement memory allocation - functions.

- - -

Proposed resolution:

-

-Add a new sentence to the end of 17.4.3.4 [replacement.functions] paragraph 3: -"The program's definitions shall not be specified as inline. -No diagnostic is required." -

- -

[Kona: added "no diagnostic is required"]

- - - - -

Rationale:

-

-The fact that inline isn't mentioned appears to have been -nothing more than an oversight. Existing implementations do not -permit inline functions as replacement memory allocation functions. -Providing this functionality would be difficult in some cases, and is -believed to be of limited value. -

- - - - - -
-

405. qsort and POD

-

Section: 25.4 [alg.c.library] Status: WP - Submitter: Ray Lischner Date: 2003-04-08

-

View all other issues in [alg.c.library].

-

View all issues with WP status.

-

Discussion:

-

-Section 25.4 [alg.c.library] describes bsearch and qsort, from the C -standard library. Paragraph 4 does not list any restrictions on qsort, -but it should limit the base parameter to point to POD. Presumably, -qsort sorts the array by copying bytes, which requires POD. -

- - -

Proposed resolution:

-

-In 25.4 [alg.c.library] paragraph 4, just after the declarations and -before the nonnormative note, add these words: "both of which have the -same behavior as the original declaration. The behavior is undefined -unless the objects in the array pointed to by base are of POD -type." -

- -

[Something along these lines is clearly necessary. Matt - provided wording.]

- - - - - - -
-

406. vector::insert(s) exception safety

-

Section: 23.2.5.4 [vector.modifiers] Status: DR - Submitter: Dave Abrahams Date: 2003-04-27

-

View all other issues in [vector.modifiers].

-

View all issues with DR status.

-

Discussion:

-

-There is a possible defect in the standard: the standard text was -never intended to prevent arbitrary ForwardIterators, whose operations -may throw exceptions, from being passed, and it also wasn't intended -to require a temporary buffer in the case where ForwardIterators were -passed (and I think most implementations don't use one). As is, the -standard appears to impose requirements that aren't met by any -existing implementation. -

- - -

Proposed resolution:

-

Replace 23.2.5.4 [vector.modifiers] paragraph 1 with:

-

- 1- Notes: Causes reallocation if the new size is greater than the - old capacity. If no reallocation happens, all the iterators and - references before the insertion point remain valid. If an exception - is thrown other than by the copy constructor or assignment operator - of T or by any InputIterator operation there are no effects. -

- -

[We probably need to say something similar for deque.]

- - - - - - - -
-

407. Can singular iterators be destroyed?

-

Section: 24.1 [iterator.requirements] Status: WP - Submitter: Nathan Myers Date: 2003-06-03

-

View other active issues in [iterator.requirements].

-

View all other issues in [iterator.requirements].

-

View all issues with WP status.

-

Discussion:

-

-Clause 24.1 [iterator.requirements], paragraph 5, says that the only expression -that is defined for a singular iterator is "an assignment of a -non-singular value to an iterator that holds a singular value". This -means that destroying a singular iterator (e.g. letting an automatic -variable go out of scope) is technically undefined behavior. This -seems overly strict, and probably unintentional. -

- - -

Proposed resolution:

-

-Change the sentence in question to "... the only exceptions are -destroying an iterator that holds a singular value, or the assignment -of a non-singular value to an iterator that holds a singular value." -

- - - - - -
-

409. Closing an fstream should clear error state

-

Section: 27.8.1.9 [ifstream.members], 27.8.1.13 [ofstream.members] Status: DR - Submitter: Nathan Myers Date: 2003-06-03

-

View all other issues in [ifstream.members].

-

View all issues with DR status.

-

Discussion:

-

-A strict reading of 27.8.1 [fstreams] shows that opening or -closing a basic_[io]fstream does not affect the error bits. This -means, for example, that if you read through a file up to EOF, and -then close the stream and reopen it at the beginning of the file, -the EOF bit in the stream's error state is still set. This is -counterintuitive. -

-

-The LWG considered this issue once before, as issue 22, -and put in a footnote to clarify that the strict reading was indeed -correct. We did that because we believed the standard was -unambiguous and consistent, and that we should not make architectural -changes in a TC. Now that we're working on a new revision of the -language, those considerations no longer apply. -

- - -

Proposed resolution:

- -

Change 27.8.1.9 [ifstream.members], para. 3 from:

- -

-Calls rdbuf()->open(s,mode|in). If that function returns a null -pointer, calls setstate(failbit) (which may throw ios_base::failure -[Footnote: (lib.iostate.flags)]. -

- -

to:

- -

Calls rdbuf()->open(s,mode|in). If that function -returns a null pointer, calls setstate(failbit) (which may throw -ios_base::failure [Footnote: (lib.iostate.flags)), else calls clear(). -

- -

Change 27.8.1.13 [ofstream.members], para. 3 from:

- -

Calls rdbuf()->open(s,mode|out). If that function -returns a null pointer, calls setstate(failbit) (which may throw -ios_base::failure [Footnote: (lib.iostate.flags)). -

- -

to:

- -

Calls rdbuf()->open(s,mode|out). If that function -returns a null pointer, calls setstate(failbit) (which may throw -ios_base::failure [Footnote: (lib.iostate.flags)), else calls clear(). -

- -

Change 27.8.1.17 [fstream.members], para. 3 from:

- -

Calls rdbuf()->open(s,mode), If that function returns -a null pointer, calls setstate(failbit), (which may throw -ios_base::failure). (lib.iostate.flags) ) -

- -

to:

- -

Calls rdbuf()->open(s,mode), If that function returns -a null pointer, calls setstate(failbit), (which may throw -ios_base::failure). (lib.iostate.flags) ), else calls clear(). -

- - - -

[Kona: the LWG agrees this is a good idea. Post-Kona: Bill -provided wording. He suggests having open, not close, clear the error -flags.]

- - -

[Post-Sydney: Howard provided a new proposed resolution. The - old one didn't make sense because it proposed to fix this at the - level of basic_filebuf, which doesn't have access to the stream's - error state. Howard's proposed resolution fixes this at the level - of the three fstream class template instead.]

- - - - - - - - -
-

410. Missing semantics for stack and queue comparison operators

-

Section: 23.2.3.1 [list.cons], 23.2.3.3 [list.modifiers] Status: WP - Submitter: Hans Bos Date: 2003-06-07

-

View all other issues in [list.cons].

-

View all issues with WP status.

-

Discussion:

-

-Sections 23.2.3.1 [list.cons] and 23.2.3.3 [list.modifiers] list -comparison operators (==, !=, <, <=, >, =>) for queue and -stack. Only the semantics for queue::operator== (23.2.3.1 [list.cons] par2) and queue::operator< (23.2.3.1 [list.cons] -par3) are defined. -

- - -

Proposed resolution:

- -

Add the following new paragraphs after 23.2.3.1 [list.cons] - paragraph 3:

- -
- -
  operator!=
-
-

Returns: x.c != y.c

- -
  operator>
-
-

Returns: x.c > y.c

- -
  operator<=
-
-

Returns: x.c <= y.c

- -
  operator>=
-
-

Returns: x.c >= y.c

- -
- -

Add the following paragraphs at the end of 23.2.3.3 [list.modifiers]:

- -
- -
  operator==
-
-

Returns: x.c == y.c

- -
  operator<
-
-

Returns: x.c < y.c

- -
  operator!=
-
-

Returns: x.c != y.c

- -
  operator>
-
-

Returns: x.c > y.c

- -
  operator<=
-
-

Returns: x.c <= y.c

- -
  operator>=
-
-

Returns: x.c >= y.c

- -
- - -

[Kona: Matt provided wording.]

- - - - -

Rationale:

-

There isn't any real doubt about what these operators are -supposed to do, but we ought to spell it out.

- - - - - -
-

411. Wrong names of set member functions

-

Section: 25.3.5 [alg.set.operations] Status: WP - Submitter: Daniel Frey Date: 2003-07-09

-

View all other issues in [alg.set.operations].

-

View all issues with WP status.

-

Discussion:

-

-25.3.5 [alg.set.operations] paragraph 1 reads: -"The semantics of the set operations are generalized to multisets in a -standard way by defining union() to contain the maximum number of -occurrences of every element, intersection() to contain the minimum, and -so on." -

- -

-This is wrong. The name of the functions are set_union() and -set_intersection(), not union() and intersection(). -

- - -

Proposed resolution:

-

Change that sentence to use the correct names.

- - - - - -
-

412. Typo in 27.4.4.3

-

Section: 27.4.4.3 [iostate.flags] Status: WP - Submitter: Martin Sebor Date: 2003-07-10

-

View all other issues in [iostate.flags].

-

View all issues with WP status.

-

Duplicate of: 429

-

Discussion:

-

-The Effects clause in 27.4.4.3 [iostate.flags] paragraph 5 says that the -function only throws if the respective bits are already set prior to -the function call. That's obviously not the intent. The typo ought to -be corrected and the text reworded as: "If (state & -exceptions()) == 0, returns. ..." -

- - -

Proposed resolution:

-

-In 27.4.4.3 [iostate.flags] paragraph 5, replace "If (rdstate() & -exceptions()) == 0" with "If ((state | (rdbuf() ? goodbit : badbit)) -& exceptions()) == 0". -

- -

[Kona: the original proposed resolution wasn't quite right. We - really do mean rdstate(); the ambiguity is that the wording in the - standard doesn't make it clear whether we mean rdstate() before - setting the new state, or rdsate() after setting it. We intend the - latter, of course. Post-Kona: Martin provided wording.]

- - - - - - - -
-

413. Proposed resolution to LDR#64 still wrong

-

Section: 27.6.1.2.3 [istream::extractors] Status: DR - Submitter: Bo Persson Date: 2003-07-13

-

View all other issues in [istream::extractors].

-

View all issues with DR status.

-

Discussion:

-

-The second sentence of the proposed resolution says: -

- -

-"If it inserted no characters because it caught an exception thrown -while extracting characters from sb and ..." -

- -

-However, we are not extracting from sb, but extracting from the -basic_istream (*this) and inserting into sb. I can't really tell if -"extracting" or "sb" is a typo. -

- -

[ -Sydney: Definitely a real issue. We are, indeed, extracting characters -from an istream and not from sb. The problem was there in the FDIS and -wasn't fixed by issue 64. Probably what was intended was -to have *this instead of sb. We're talking about the exception flag -state of a basic_istream object, and there's only one basic_istream -object in this discussion, so that would be a consistent -interpretation. (But we need to be careful: the exception policy of -this member function must be consistent with that of other -extractors.) PJP will provide wording. -]

- - - - -

Proposed resolution:

-

Change the sentence from:

- -

-If it inserted no characters because it caught an exception thrown -while extracting characters from sb and failbit is on in exceptions(), -then the caught exception is rethrown. -

- -

to:

- -

-If it inserted no characters because it caught an exception thrown -while extracting characters from *this and failbit is on in exceptions(), -then the caught exception is rethrown. -

- - - - - -
-

414. Which iterators are invalidated by v.erase()?

-

Section: 23.2.5.4 [vector.modifiers] Status: WP - Submitter: Matt Austern Date: 2003-08-19

-

View all other issues in [vector.modifiers].

-

View all issues with WP status.

-

Discussion:

-

-Consider the following code fragment: -

-
-
int A[8] = { 1,3,5,7,9,8,4,2 };
-std::vector<int> v(A, A+8);
-
-std::vector<int>::iterator i1 = v.begin() + 3;
-std::vector<int>::iterator i2 = v.begin() + 4;
-v.erase(i1);
-
-
- -

-Which iterators are invalidated by v.erase(i1): i1, i2, -both, or neither? -

- -

-On all existing implementations that I know of, the status of i1 and -i2 is the same: both of them will be iterators that point to some -elements of the vector (albeit not the same elements they did -before). You won't get a crash if you use them. Depending on -exactly what you mean by "invalidate", you might say that neither one -has been invalidated because they still point to something, -or you might say that both have been invalidated because in both -cases the elements they point to have been changed out from under the -iterator. -

- -

-The standard doesn't say either of those things. It says that erase -invalidates all iterators and references "after the point of the -erase". This doesn't include i1, since it's at the point of the -erase instead of after it. I can't think of any sensible definition -of invalidation by which one can say that i2 is invalidated but i1 -isn't. -

- -

-(This issue is important if you try to reason about iterator validity -based only on the guarantees in the standard, rather than reasoning -from typical implementation techniques. Strict debugging modes, -which some programmers find useful, do not use typical implementation -techniques.) -

- - -

Proposed resolution:

-

-In 23.2.5.4 [vector.modifiers] paragraph 3, change "Invalidates all the -iterators and references after the point of the erase" to -"Invalidates iterators and references at or after the point of the -erase". -

- - -

Rationale:

-

I believe this was essentially a typographical error, and that it - was taken for granted that erasing an element invalidates iterators - that point to it. The effects clause in question treats iterators - and references in parallel, and it would seem counterintuitive to - say that a reference to an erased value remains valid.

- - - - - -
-

415. behavior of std::ws

-

Section: 27.6.1.4 [istream.manip] Status: WP - Submitter: Martin Sebor Date: 2003-09-18

-

View all issues with WP status.

-

Discussion:

-

-According to 27.6.1.4, the ws() manipulator is not required to construct -the sentry object. The manipulator is also not a member function so the -text in 27.6.1, p1 through 4 that describes the exception policy for -istream member functions does not apply. That seems inconsistent with -the rest of extractors and all the other input functions (i.e., ws will -not cause a tied stream to be flushed before extraction, it doesn't check -the stream's exceptions or catch exceptions thrown during input, and it -doesn't affect the stream's gcount). -

- - -

Proposed resolution:

-

-Add to 27.6.1.4 [istream.manip], immediately before the first sentence -of paragraph 1, the following text: -

- -

- Behaves as an unformatted input function (as described in - 27.6.1.3, paragraph 1), except that it does not count the number - of characters extracted and does not affect the value returned by - subsequent calls to is.gcount(). After constructing a sentry - object... -

- -

[Post-Kona: Martin provided wording]

- - - - - - -
-

416. definitions of XXX_MIN and XXX_MAX macros in climits

-

Section: 18.2.2 [c.limits] Status: WP - Submitter: Martin Sebor Date: 2003-09-18

-

View all issues with WP status.

-

Discussion:

-

- -Given two overloads of the function foo(), one taking an argument of type -int and the other taking a long, which one will the call foo(LONG_MAX) -resolve to? The expected answer should be foo(long), but whether that -is true depends on the #defintion of the LONG_MAX macro, specifically -its type. This issue is about the fact that the type of these macros -is not actually required to be the same as the the type each respective -limit. -
- -Section 18.2.2 of the C++ Standard does not specify the exact types of -the XXX_MIN and XXX_MAX macros #defined in the <climits> and <limits.h> -headers such as INT_MAX and LONG_MAX and instead defers to the C standard. -
- -Section 5.2.4.2.1, p1 of the C standard specifies that "The values [of -these constants] shall be replaced by constant expressions suitable for use -in #if preprocessing directives. Moreover, except for CHAR_BIT and MB_LEN_MAX, -the following shall be replaced by expressions that have the same type as -would an expression that is an object of the corresponding type converted -according to the integer promotions." -
- -The "corresponding type converted according to the integer promotions" for -LONG_MAX is, according to 6.4.4.1, p5 of the C standard, the type of long -converted to the first of the following set of types that can represent it: -int, long int, long long int. So on an implementation where (sizeof(long) -== sizeof(int)) this type is actually int, while on an implementation where -(sizeof(long) > sizeof(int)) holds this type will be long. -
- -This is not an issue in C since the type of the macro cannot be detected -by any conforming C program, but it presents a portability problem in C++ -where the actual type is easily detectable by overload resolution. - -

-

[Kona: the LWG does not believe this is a defect. The C macro - definitions are what they are; we've got a better - mechanism, std::numeric_limits, that is specified more - precisely than the C limit macros. At most we should add a - nonnormative note recommending that users who care about the exact - types of limit quantities should use <limits> instead of - <climits>.]

- - - - -

Proposed resolution:

- -

-Change 18.2.2 [c.limits], paragraph 2: -

- -

--2- The contents are the same as the Standard C library header <limits.h>. -[Note: The types of the macros in <climits> are not guaranteed -to match the type to which they refer.--end note] -

- - - - - -
-

420. is std::FILE a complete type?

-

Section: 27.8.1 [fstreams] Status: WP - Submitter: Martin Sebor Date: 2003-09-18

-

View all other issues in [fstreams].

-

View all issues with WP status.

-

Discussion:

-

-7.19.1, p2, of C99 requires that the FILE type only be declared in -<stdio.h>. None of the (implementation-defined) members of the -struct is mentioned anywhere for obvious reasons. -

- -

-C++ says in 27.8.1, p2 that FILE is a type that's defined in <cstdio>. Is -it really the intent that FILE be a complete type or is an implementation -allowed to just declare it without providing a full definition? -

- - -

Proposed resolution:

-

In the first sentence of 27.8.1 [fstreams] paragraph 2, change - "defined" to "declared".

- - -

Rationale:

-

We don't want to impose any restrictions beyond what the C standard - already says. We don't want to make anything implementation defined, - because that imposes new requirements in implementations.

- - - - - -
-

422. explicit specializations of member functions of class templates

-

Section: 17.4.3.1 [reserved.names] Status: WP - Submitter: Martin Sebor Date: 2003-09-18

-

View all other issues in [reserved.names].

-

View all issues with WP status.

-

Discussion:

-

-It has been suggested that 17.4.3.1, p1 may or may not allow programs to -explicitly specialize members of standard templates on user-defined types. -The answer to the question might have an impact where library requirements -are given using the "as if" rule. I.e., if programs are allowed to specialize -member functions they will be able to detect an implementation's strict -conformance to Effects clauses that describe the behavior of the function -in terms of the other member function (the one explicitly specialized by -the program) by relying on the "as if" rule. -

- - -

Proposed resolution:

- -

- Add the following sentence to 17.4.3.1 [reserved.names], p1: -

- -

-It is undefined for a C++ program to add declarations or definitions to -namespace std or namespaces within namespace std unless otherwise specified. A -program may add template specializations for any standard library template to -namespace std. Such a specialization (complete or partial) of a standard library -template results in undefined behavior unless the declaration depends on a -user-defined type of external linkage and unless the specialization meets the -standard library requirements for the original template.168) -A program has undefined behavior if it declares -

-
    -
  • an explicit specialization of any member function of a standard - library class template, or
  • -
  • an explicit specialization of any member function template of a - standard library class or class template, or
  • -
  • an explicit or partial specialization of any member class - template of a standard library class or class template.
  • -
-

-A program may explicitly instantiate any templates in the standard library only -if the declaration depends on the name of a user-defined type of external -linkage and the instantiation meets the standard library requirements for the -original template. -

- -

[Kona: straw poll was 6-1 that user programs should not be - allowed to specialize individual member functions of standard - library class templates, and that doing so invokes undefined - behavior. Post-Kona: Martin provided wording.]

- - -

[Sydney: The LWG agrees that the standard shouldn't permit users -to specialize individual member functions unless they specialize the -whole class, but we're not sure these words say what we want them to; -they could be read as prohibiting the specialization of any standard -library class templates. We need to consult with CWG to make sure we -use the right wording.]

- - - - - - -
-

425. return value of std::get_temporary_buffer

-

Section: 20.6.3 [temporary.buffer] Status: WP - Submitter: Martin Sebor Date: 2003-09-18

-

View all issues with WP status.

-

Discussion:

-

-The standard is not clear about the requirements on the value returned from -a call to get_temporary_buffer(0). In particular, it fails to specify whether -the call should return a distinct pointer each time it is called (like -operator new), or whether the value is unspecified (as if returned by -malloc). The standard also fails to mention what the required behavior -is when the argument is less than 0. -

- - -

Proposed resolution:

-

Change 20.4.3 [meta.help] paragraph 2 from "...or a pair of 0 -values if no storage can be obtained" to "...or a pair of 0 values if -no storage can be obtained or if n <= 0."

-

[Kona: Matt provided wording]

- - - - - -
-

426. search_n(), fill_n(), and generate_n() with negative n

-

Section: 25.1.9 [alg.search], 25.2.6 [alg.fill], 25.2.7 [alg.generate] Status: WP - Submitter: Martin Sebor Date: 2003-09-18

-

View all other issues in [alg.search].

-

View all issues with WP status.

-

Discussion:

-

-The complexity requirements for these function templates are incorrect -(or don't even make sense) for negative n:

- -

25.1.9, p7 (search_n): -
-Complexity: At most (last1 - first1) * count applications -of the corresponding predicate.

- -

25.2.5, p3 (fill_n): -
-Complexity: Exactly last - first (or n) assignments.

- -

25.2.6, p3 (generate_n): -
-Complexity: Exactly last - first (or n) assignments.

- -

-In addition, the Requirements or the Effects clauses for the latter two -templates don't say anything about the behavior when n is negative. -

- - -

Proposed resolution:

-

Change 25.1.9, p7 to

- -

-Complexity: At most (last1 - first1) * count applications -of the corresponding predicate if count is positive, -or 0 otherwise. -

- -

Change 25.2.5, p2 to

-

-Effects: Assigns value through all the iterators in the range [first, -last), or [first, first + n) if n is positive, none otherwise. -

- -

Change 25.2.5, p3 to:

-

-Complexity: Exactly last - first (or n if n is positive, -or 0 otherwise) assignments. -

- -

-Change 25.2.6, p1 -to (notice the correction for the misspelled "through"): -

-

-Effects: Invokes the function object genand assigns the return -value of gen through all the iterators in the range [first, last), -or [first, first + n) if n is positive, or [first, first) -otherwise. -

- -

Change 25.2.6, p3 to:

-

-Complexity: Exactly last - first (or n if n is positive, -or 0 otherwise) assignments. -

- - -

Rationale:

-

Informally, we want to say that whenever we see a negative number - we treat it the same as if it were zero. We believe the above - changes do that (although they may not be the minimal way of saying - so). The LWG considered and rejected the alternative of saying that - negative numbers are undefined behavior.

- - - - - -
-

428. string::erase(iterator) validity

-

Section: 21.3.6.5 [string::erase] Status: WP - Submitter: Martin Sebor Date: 2003-09-18

-

View all other issues in [string::erase].

-

View all issues with WP status.

-

Discussion:

-

-23.1.1, p3 along with Table 67 specify as a prerequisite for a.erase(q) -that q must be a valid dereferenceable iterator into the sequence a. -

- -

-However, 21.3.5.5, p5 describing string::erase(p) only requires that -p be a valid iterator. -

- -

-This may be interepreted as a relaxation of the general requirement, -which is most likely not the intent. -

- - -

Proposed resolution:

-

Remove 21.3.6.5 [string::erase] paragraph 5.

- - -

Rationale:

-

The LWG considered two options: changing the string requirements to - match the general container requirements, or just removing the - erroneous string requirements altogether. The LWG chose the latter - option, on the grounds that duplicating text always risks the - possibility that it might be duplicated incorrectly.

- - - - - -
-

432. stringbuf::overflow() makes only one write position available

-

Section: 27.7.1.4 [stringbuf.virtuals] Status: WP - Submitter: Christian W Brock Date: 2003-09-24

-

View other active issues in [stringbuf.virtuals].

-

View all other issues in [stringbuf.virtuals].

-

View all issues with WP status.

-

Discussion:

-

27.7.1.3 par 8 says:

-

-Notes: The function can make a write position available only if - ( mode & ios_base::out) != 0. To make a write position - available, the function reallocates (or initially allocates) an - array object with a sufficient number of elements to hold the - current array object (if any), plus one additional write position. - If ( mode & ios_base::in) != 0, the function alters the read end - pointer egptr() to point just past the new write position (as - does the write end pointer epptr()). -

- -

-The sentences "plus one additional write position." and especially - "(as does the write end pointer epptr())" COULD by interpreted - (and is interpreted by at least my library vendor) as: -

- -

- post-condition: epptr() == pptr()+1 -

- -

-This WOULD force sputc() to call the virtual overflow() each time. -

- -

The proposed change also affects Defect Report 169.

- - - -

Proposed resolution:

-

27.7.1.1/2 Change:

- -

-2- Notes: The function allocates no array object. -

- -

-to: -

- -

-2- Postcondition: str() == "". -

- -

-27.7.1.1/3 Change: -

- -
-

--3- Effects: Constructs an object of class basic_stringbuf, -initializing the base class with basic_streambuf() -(lib.streambuf.cons), and initializing mode with which . Then copies -the content of str into the basic_stringbuf underlying character -sequence and initializes the input and output sequences according to -which. If which & ios_base::out is true, initializes the output -sequence with the underlying sequence. If which & ios_base::in is -true, initializes the input sequence with the underlying sequence. -

-
- -

to:

- -
-

--3- Effects: Constructs an object of class basic_stringbuf, -initializing the base class with basic_streambuf() -(lib.streambuf.cons), and initializing mode with which. Then copies -the content of str into the basic_stringbuf underlying character -sequence. If which & ios_base::out is true, initializes the output -sequence such that pbase() points to the first underlying character, -epptr() points one past the last underlying character, and if (which & -ios_base::ate) is true, pptr() is set equal to -epptr() else pptr() is set equal to pbase(). If which & ios_base::in -is true, initializes the input sequence such that eback() and gptr() -point to the first underlying character and egptr() points one past -the last underlying character. -

-
- -

27.7.1.2/1 Change:

- -
-

--1- Returns: A basic_string object whose content is equal to the -basic_stringbuf underlying character sequence. If the buffer is only -created in input mode, the underlying character sequence is equal to -the input sequence; otherwise, it is equal to the output sequence. In -case of an empty underlying character sequence, the function returns -basic_string<charT,traits,Allocator>(). -

-
- -

to:

- -
-

--1- Returns: A basic_string object whose content is equal to the -basic_stringbuf underlying character sequence. If the basic_stringbuf -was created only in input mode, the resultant basic_string contains -the character sequence in the range [eback(), egptr()). If the -basic_stringbuf was created with (which & ios_base::out) being true -then the resultant basic_string contains the character sequence in the -range [pbase(), high_mark) where high_mark represents the position one -past the highest initialized character in the buffer. Characters can -be initialized either through writing to the stream, or by -constructing the basic_stringbuf with a basic_string, or by calling -the str(basic_string) member function. In the case of calling the -str(basic_string) member function, all characters initialized prior to -the call are now considered uninitialized (except for those -characters re-initialized by the new basic_string). Otherwise the -basic_stringbuf has been created in neither input nor output mode and -a zero length basic_string is returned. -

-
- -

-27.7.1.2/2 Change: -

- -
-

--2- Effects: If the basic_stringbuf's underlying character sequence is -not empty, deallocates it. Then copies the content of s into the -basic_stringbuf underlying character sequence and initializes the -input and output sequences according to the mode stored when creating -the basic_stringbuf object. If (mode&ios_base::out) is true, then -initializes the output sequence with the underlying sequence. If -(mode&ios_base::in) is true, then initializes the input sequence with -the underlying sequence. -

-
- -

to:

- -
-

--2- Effects: Copies the content of s into the basic_stringbuf -underlying character sequence. If mode & ios_base::out is true, -initializes the output sequence such that pbase() points to the first -underlying character, epptr() points one past the last underlying -character, and if (mode & ios_base::ate) is true, -pptr() is set equal to epptr() else pptr() is set equal to pbase(). If -mode & ios_base::in is true, initializes the input sequence such that -eback() and gptr() point to the first underlying character and egptr() -points one past the last underlying character. -

-
- -

Remove 27.2.1.2/3. (Same rationale as issue 238: incorrect and unnecessary.)

- -

27.7.1.3/1 Change:

- -
-

-1- Returns: If the input sequence has a read position available, -returns traits::to_int_type(*gptr()). Otherwise, returns -traits::eof(). -

-
- -

to:

- -
-

-1- Returns: If the input sequence has a read position available, -returns traits::to_int_type(*gptr()). Otherwise, returns -traits::eof(). Any character in the underlying buffer which has been -initialized is considered to be part of the input sequence. -

-
- -

27.7.1.3/9 Change:

- -
-

--9- Notes: The function can make a write position available only if ( -mode & ios_base::out) != 0. To make a write position available, the -function reallocates (or initially allocates) an array object with a -sufficient number of elements to hold the current array object (if -any), plus one additional write position. If ( mode & ios_base::in) != -0, the function alters the read end pointer egptr() to point just past -the new write position (as does the write end pointer epptr()). -

-
- -

to:

- -
-

--9- The function can make a write position available only if ( mode & -ios_base::out) != 0. To make a write position available, the function -reallocates (or initially allocates) an array object with a sufficient -number of elements to hold the current array object (if any), plus one -additional write position. If ( mode & ios_base::in) != 0, the -function alters the read end pointer egptr() to point just past the -new write position. -

-
- -

27.7.1.3/12 Change:

- -
-

--12- _ If (newoff + off) < 0, or (xend - xbeg) < (newoff + off), the -positioning operation fails. Otherwise, the function assigns xbeg + -newoff + off to the next pointer xnext . -

-
- -

to:

- -
-

--12- _ If (newoff + off) < 0, or if (newoff + off) refers to an -uninitialized character (as defined in 27.7.1.3 [stringbuf.members] -paragraph 1), the positioning operation fails. Otherwise, the function -assigns xbeg + newoff + off to the next pointer xnext . -

-
- -

[post-Kona: Howard provided wording. At Kona the LWG agreed that - something along these lines was a good idea, but the original - proposed resolution didn't say enough about the effect of various - member functions on the underlying character sequences.]

- - - - -

Rationale:

-

The current basic_stringbuf description is over-constrained in such -a way as to prohibit vendors from making this the high-performance -in-memory stream it was meant to be. The fundamental problem is that -the pointers: eback(), gptr(), egptr(), pbase(), pptr(), epptr() are -observable from a derived client, and the current description -restricts the range [pbase(), epptr()) from being grown geometrically. -This change allows, but does not require, geometric growth of this -range.

- -

Backwards compatibility issues: These changes will break code that -derives from basic_stringbuf, observes epptr(), and depends upon -[pbase(), epptr()) growing by one character on each call to overflow() -(i.e. test suites). Otherwise there are no backwards compatibility -issues.

- -

27.7.1.1/2: The non-normative note is non-binding, and if it were -binding, would be over specification. The recommended change focuses -on the important observable fact.

- -

27.7.1.1/3: This change does two things: 1. It describes exactly -what must happen in terms of the sequences. The terms "input -sequence" and "output sequence" are not well defined. 2. It -introduces a common extension: open with app or ate mode. I concur -with issue 238 that paragraph 4 is both wrong and unnecessary.

- -

27.7.1.2/1: This change is the crux of the efficiency issue. The -resultant basic_string is not dependent upon epptr(), and thus -implementors are free to grow the underlying buffer geometrically -during overflow() *and* place epptr() at the end of that buffer.

- -

27.7.1.2/2: Made consistent with the proposed 27.7.1.1/3.

- -

27.7.1.3/1: Clarifies that characters written to the stream beyond -the initially specified string are available for reading in an i/o -basic_streambuf.

- -

27.7.1.3/9: Made normative by removing "Notes:", and removed the -trailing parenthetical comment concerning epptr().

- -

27.7.1.3/12: Restricting the positioning to [xbeg, xend) is no -longer allowable since [pbase(), epptr()) may now contain -uninitialized characters. Positioning is only allowable over the -initialized range.

- - - - - -
-

434. bitset::to_string() hard to use

-

Section: 23.3.5.2 [bitset.members] Status: DR - Submitter: Martin Sebor Date: 2003-10-15

-

View all other issues in [bitset.members].

-

View all issues with DR status.

-

Discussion:

-

-It has been pointed out a number of times that the bitset to_string() member -function template is tedious to use since callers must explicitly specify the -entire template argument list (3 arguments). At least two implementations -provide a number of overloads of this template to make it easier to use. -

- - - -

Proposed resolution:

-

In order to allow callers to specify no template arguments at all, just the -first one (charT), or the first 2 (charT and traits), in addition to all -three template arguments, add the following three overloads to both the -interface (declarations only) of the class template bitset as well as to -section 23.3.5.2, immediately after p34, the Returns clause of the existing -to_string() member function template:

- -
    template <class charT, class traits>
-    basic_string<charT, traits, allocator<charT> >
-    to_string () const;
-
-    -34.1- Returns: to_string<charT, traits, allocator<charT> >().
-
-    template <class charT>
-    basic_string<charT, char_traits<charT>, allocator<charT> >
-    to_string () const;
-
-    -34.2- Returns: to_string<charT, char_traits<charT>, allocator<charT> >().
-
-    basic_string<char, char_traits<char>, allocator<char> >
-    to_string () const;
-
-    -34.3- Returns: to_string<char, char_traits<char>, allocator<char> >().
-
- -

[Kona: the LWG agrees that this is an improvement over the - status quo. Dietmar thought about an alternative using a proxy - object but now believes that the proposed resolution above is the - right choice. -]

- - - - - - - - -
-

435. bug in DR 25

-

Section: 21.3.8.9 [string.io] Status: WP - Submitter: Martin Sebor Date: 2003-10-15

-

View all other issues in [string.io].

-

View all issues with WP status.

-

Discussion:

- -

-It has been pointed out that the proposed resolution in DR 25 may not be -quite up to snuff:
-http://gcc.gnu.org/ml/libstdc++/2003-09/msg00147.html -http://anubis.dkuug.dk/jtc1/sc22/wg21/docs/lwg-defects.html#25
-

- -

-It looks like Petur is right. The complete corrected text is copied below. -I think we may have have been confused by the reference to 22.2.2.2.2 and -the subsequent description of `n' which actually talks about the second -argument to sputn(), not about the number of fill characters to pad with. -

- -

-So the question is: was the original text correct? If the intent was to -follow classic iostreams then it most likely wasn't, since setting width() -to less than the length of the string doesn't truncate it on output. This -is also the behavior of most implementations (except for SGI's standard -iostreams where the operator does truncate). -

- - - -

Proposed resolution:

-

Change the text in 21.3.7.9, p4 from

-

- If bool(k) is true, inserts characters as if by calling - os.rdbuf()->sputn(str.data(), n), padding as described in stage 3 - of lib.facet.num.put.virtuals, where n is the larger of os.width() - and str.size(); -

-

to

-

- If bool(k) is true, determines padding as described in - lib.facet.num.put.virtuals, and then inserts the resulting - sequence of characters seq as if by calling - os.rdbuf()->sputn(seq, n), where n is the larger of - os.width() and str.size(); -

- -

[Kona: it appears that neither the original wording, DR25, nor the - proposed resolution, is quite what we want. We want to say that - the string will be output, padded to os.width() if necessary. We - don't want to duplicate the padding rules in clause 22, because - they're complicated, but we need to be careful because they weren't - quite written with quite this case in mind. We need to say what - the character sequence is, and then defer to clause 22. Post-Kona: - Benjamin provided wording.]

- - - - - - - -
-

436. are cv-qualified facet types valid facets?

-

Section: 22.1.1.1.2 [locale.facet] Status: WP - Submitter: Martin Sebor Date: 2003-10-15

-

View all issues with WP status.

-

Discussion:

-

-Is "const std::ctype<char>" a valid template argument to has_facet, use_facet, -and the locale template ctor? And if so, does it designate the same Facet as -the non-const "std::ctype<char>?" What about "volatile std::ctype<char>?" -Different implementations behave differently: some fail to compile, others -accept such types but behave inconsistently. -

- - -

Proposed resolution:

-

Change 22.1.1.1.2, p1 to read:

- -

Template parameters in this clause which are required to be facets -are those named Facet in declarations. A program that passes a type -that is not a facet, or a type that refers to volatile-qualified -facet, as an (explicit or deduced) template parameter to a locale -function expecting a facet, is ill-formed. A const-qualified facet is -a valid template argument to any locale function that expects a Facet -template parameter.

- -

[Kona: changed the last sentence from a footnote to normative -text.]

- - - - - - -
-

438. Ambiguity in the "do the right thing" clause

-

Section: 23.1.1 [sequence.reqmts] Status: DR - Submitter: Howard Hinnant Date: 2003-10-20

-

View all other issues in [sequence.reqmts].

-

View all issues with DR status.

-

Discussion:

- -

Section 23.1.1 [sequence.reqmts], paragraphs 9-11, fixed up the problem -noticed with statements like:

-
vector<int> v(10, 1);
-
- -

The intent of the above statement was to construct with:

-
vector(size_type, const value_type&);
-
- -

but early implementations failed to compile as they bound to:

-
template <class InputIterator>
-vector(InputIterator f, InputIterator l);
-
-

instead.

- -

Paragraphs 9-11 say that if InputIterator is an integral type, then the -member template constructor will have the same effect as:

-
vector<static_cast<size_type>(f), static_cast<value_type>(l));
-
-

(and similarly for the other member template functions of sequences).

- -

There is also a note that describes one implementation technique:

-

- One way that sequence implementors can satisfy this requirement is to - specialize the member template for every integral type. -

- -

This might look something like:

-
-
template <class T>
-struct vector
-{
-     typedef unsigned size_type;
-
-     explicit vector(size_type) {}
-     vector(size_type, const T&) {}
-
-     template <class I>
-     vector(I, I);
-
-     // ...
-};
-
-template <class T>
-template <class I>
-vector<T>::vector(I, I) { ... }
-
-template <>
-template <>
-vector<int>::vector(int, int) { ... }
-
-template <>
-template <>
-vector<int>::vector(unsigned, unsigned) { ... }
-
-//  ...
-
-
- -

Label this solution 'A'.

- -

The standard also says:

-

- Less cumbersome implementation techniques also exist. -

-

-A popular technique is to not specialize as above, but instead catch -every call with the member template, detect the type of InputIterator, -and then redirect to the correct logic. Something like: -

-
-
template <class T>
-template <class I>
-vector<T>::vector(I f, I l)
-{
-     choose_init(f, l, int2type<is_integral<I>::value>());
-}
-
-template <class T>
-template <class I>
-vector<T>::choose_init(I f, I l, int2type<false>)
-{
-    // construct with iterators
-}
-
-template <class T>
-template <class I>
-vector<T>::choose_init(I f, I l, int2type<true>)
-{
-    size_type sz = static_cast<size_type>(f);
-    value_type v = static_cast<value_type>(l);
-    // construct with sz,v
-}
-
-
- -

Label this solution 'B'.

- -

Both of these solutions solve the case the standard specifically -mentions:

-
vector<int> v(10, 1);  // ok, vector size 10, initialized to 1
-
- -

-However, (and here is the problem), the two solutions have different -behavior in some cases where the value_type of the sequence is not an -integral type. For example consider: -

-
     pair<char, char>                     p('a', 'b');
-     vector<vector<pair<char, char> > >   d('a', 'b');
-
-

-The second line of this snippet is likely an error. Solution A catches -the error and refuses to compile. The reason is that there is no -specialization of the member template constructor that looks like: -

-
template <>
-template <>
-vector<vector<pair<char, char> > >::vector(char, char) { ... }
-
- -

-So the expression binds to the unspecialized member template -constructor, and then fails (compile time) because char is not an -InputIterator. -

- -

-Solution B compiles the above example though. 'a' is casted to an -unsigned integral type and used to size the outer vector. 'b' is -static casted to the inner vector using it's explicit constructor: -

- -
explicit vector(size_type n);
-
- -

-and so you end up with a static_cast<size_type>('a') by -static_cast<size_type>('b') matrix. -

- -

-It is certainly possible that this is what the coder intended. But the -explicit qualifier on the inner vector has been thwarted at any rate. -

- -

-The standard is not clear whether the expression: -

- -
     vector<vector<pair<char, char> > >   d('a', 'b');
-
- -

-(and similar expressions) are: -

- -
    -
  1. undefined behavior.
  2. -
  3. illegal and must be rejected.
  4. -
  5. legal and must be accepted.
  6. -
- -

My preference is listed in the order presented.

- -

There are still other techniques for implementing the requirements of -paragraphs 9-11, namely the "restricted template technique" (e.g. -enable_if). This technique is the most compact and easy way of coding -the requirements, and has the behavior of #2 (rejects the above -expression). -

- -

-Choosing 1 would allow all implementation techniques I'm aware of. -Choosing 2 would allow only solution 'A' and the enable_if technique. -Choosing 3 would allow only solution 'B'. -

- -

-Possible wording for a future standard if we wanted to actively reject -the expression above would be to change "static_cast" in paragraphs -9-11 to "implicit_cast" where that is defined by: -

- -
-
template <class T, class U>
-inline
-T implicit_cast(const U& u)
-{
-     return u;
-}
-
-
- - - -

Proposed resolution:

- -

Replace 23.1.1 [sequence.reqmts] paragraphs 9 - 11 with:

- -

For every sequence defined in this clause and in clause lib.strings:

- -
    -
  • -

    If the constructor

    -
           template <class InputIterator>
    -       X(InputIterator f, InputIterator l,
    -         const allocator_type& a = allocator_type())
    -       
    -

    is called with a type InputIterator that does not qualify as - an input iterator, then the constructor will behave as if the - overloaded constructor:

    -
           X(size_type, const value_type& = value_type(),
    -         const allocator_type& = allocator_type())
    -       
    -

    were called instead, with the arguments static_cast<size_type>(f), l and a, respectively.

    -
  • - -
  • -

    If the member functions of the forms:

    -
           template <class InputIterator>          //  such as  insert()
    -       rt fx1(iterator p, InputIterator f, InputIterator l);
    -
    -       template <class InputIterator>          //  such as  append(), assign()
    -       rt fx2(InputIterator f, InputIterator l);
    -
    -       template <class InputIterator>          //  such as  replace()
    -       rt fx3(iterator i1, iterator i2, InputIterator f, InputIterator l);
    -       
    -

    are called with a type InputIterator that does not qualify as - an input iterator, then these functions will behave as if the - overloaded member functions:

    -
           rt fx1(iterator, size_type, const value_type&);
    -
    -       rt fx2(size_type, const value_type&);
    -
    -       rt fx3(iterator, iterator, size_type, const value_type&);
    -       
    -

    were called instead, with the same arguments.

    -
  • -
- -

In the previous paragraph the alternative binding will fail if f -is not implicitly convertible to X::size_type or if l is not implicitly -convertible to X::value_type.

- -

-The extent to which an implementation determines that a type cannot be -an input iterator is unspecified, except that as a minimum integral -types shall not qualify as input iterators. -

- - - -

[ -Kona: agreed that the current standard requires v('a', 'b') -to be accepted, and also agreed that this is surprising behavior. The -LWG considered several options, including something like -implicit_cast, which doesn't appear to be quite what we want. We -considered Howards three options: allow acceptance or rejection, -require rejection as a compile time error, and require acceptance. By -straw poll (1-6-1), we chose to require a compile time error. -Post-Kona: Howard provided wording. -]

- - -

[ -Sydney: The LWG agreed with this general direction, but there was some -discomfort with the wording in the original proposed resolution. -Howard submitted new wording, and we will review this again in -Redmond. -]

- - -

[Redmond: one very small change in wording: the first argument - is cast to size_t. This fixes the problem of something like - vector<vector<int> >(5, 5), where int is not - implicitly convertible to the value type.]

- - - - -

Rationale:

-

The proposed resolution fixes:

- -
  vector<int> v(10, 1);
-
- -

-since as integral types 10 and 1 must be disqualified as input -iterators and therefore the (size,value) constructor is called (as -if).

- -

The proposed resolution breaks:

- -
  vector<vector<T> > v(10, 1);
-
- -

-because the integral type 1 is not *implicitly* convertible to -vector<T>. The wording above requires a diagnostic.

- -

-The proposed resolution leaves the behavior of the following code -unspecified. -

- -
  struct A
-  {
-    operator int () const {return 10;}
-  };
-
-  struct B
-  {
-    B(A) {}
-  };
-
-  vector<B> v(A(), A());
-
- -

-The implementation may or may not detect that A is not an input -iterator and employee the (size,value) constructor. Note though that -in the above example if the B(A) constructor is qualified explicit, -then the implementation must reject the constructor as A is no longer -implicitly convertible to B. -

- - - - - -
-

441. Is fpos::state const?

-

Section: 27.4.3 [fpos] Status: WP - Submitter: Vincent Leloup Date: 2003-11-17

-

View all other issues in [fpos].

-

View all issues with WP status.

-

Discussion:

-

-In section 27.4.3.1 [fpos.members] fpos<stateT>::state() is declared -non const, but in section 27.4.3 [fpos] it is declared const. -

- - -

Proposed resolution:

-

-In section 27.4.3.1 [fpos.members], change the declaration of -fpos<stateT>::state() to const. -

- - - - - -
-

442. sentry::operator bool() inconsistent signature

-

Section: 27.6.2.4 [ostream::sentry] Status: WP - Submitter: Vincent Leloup Date: 2003-11-18

-

View other active issues in [ostream::sentry].

-

View all other issues in [ostream::sentry].

-

View all issues with WP status.

-

Discussion:

-

-In section 27.6.2.4 [ostream::sentry] paragraph 4, in description part -basic_ostream<charT, traits>::sentry::operator bool() is declared -as non const, but in section 27.6.2.3, in synopsis it is declared -const. -

- - -

Proposed resolution:

-

-In section 27.6.2.4 [ostream::sentry] paragraph 4, change the declaration -of sentry::operator bool() to const. -

- - - - - -
-

443. filebuf::close() inconsistent use of EOF

-

Section: 27.8.1.4 [filebuf.members] Status: WP - Submitter: Vincent Leloup Date: 2003-11-20

-

View other active issues in [filebuf.members].

-

View all other issues in [filebuf.members].

-

View all issues with WP status.

-

Discussion:

-

-In section 27.8.1.4 [filebuf.members] par6, in effects description of -basic_filebuf<charT, traits>::close(), overflow(EOF) is used twice; -should be overflow(traits::eof()). -

- - -

Proposed resolution:

-

-Change overflow(EOF) to overflow(traits::eof()). -

- - - - - -
-

444. Bad use of casts in fstream

-

Section: 27.8.1 [fstreams] Status: DR - Submitter: Vincent Leloup Date: 2003-11-20

-

View all other issues in [fstreams].

-

View all issues with DR status.

-

Discussion:

-

27.8.1.9 [ifstream.members] p1, 27.8.1.13 [ofstream.members] p1, -27.8.1.17 [fstream.members] p1 seems have same problem as exposed in -LWG issue -252. -

- - -

Proposed resolution:

- -

[Sydney: Genuine defect. 27.8.1.13 needs a cast to cast away - constness. The other two places are stylistic: we could change the - C-style casts to const_cast. Post-Sydney: Howard provided wording. -]

- - -

Change 27.8.1.7/1 from:

-

- Returns: (basic_filebuf<charT,traits>*)&sb. -

- -

to:

-

- Returns: const_cast<basic_filebuf<charT,traits>*>(&sb). -

- -

Change 27.8.1.10/1 from:

-

- Returns: (basic_filebuf<charT,traits>*)&sb. -

- -

to:

-

- Returns: const_cast<basic_filebuf<charT,traits>*>(&sb). -

- -

Change 27.8.1.13/1 from:

-

- Returns: &sb. -

- -

to:

-

- Returns: const_cast<basic_filebuf<charT,traits>*>(&sb). -

- - - - - - - - -
-

445. iterator_traits::reference unspecified for some iterator categories

-

Section: 24.3.1 [iterator.traits] Status: DR - Submitter: Dave Abrahams Date: 2003-12-09

-

View all issues with DR status.

-

Discussion:

-

-The standard places no restrictions at all on the reference type -of input, output, or forward iterators (for forward iterators it -only specifies that *x must be value_type& and doesn't mention -the reference type). Bidirectional iterators' reference type is -restricted only by implication, since the base iterator's -reference type is used as the return type of reverse_iterator's -operator*, which must be T& in order to be a conforming forward -iterator. -

- -

-Here's what I think we ought to be able to expect from an input -or forward iterator's reference type R, where a is an iterator -and V is its value_type -

- -
    -
  • - *a is convertible to R -
  • - -
  • - R is convertible to V -
  • - -
  • - static_cast<V>(static_cast<R>(*a)) is equivalent to - static_cast<V>(*a) -
  • -
- -

A mutable forward iterator ought to satisfy, for x of type V:

-
      { R r = *a; r = x; } is equivalent to *a = x;
-  
- -

-I think these requirements capture existing container iterators -(including vector<bool>'s), but render istream_iterator invalid; -its reference type would have to be changed to a constant -reference. -

- - -

-(Jeremy Siek) During the discussion in Sydney, it was felt that a -simpler long term solution for this was needed. The solution proposed -was to require reference to be the same type as *a -and pointer to be the same type as a->. Most -iterators in the Standard Library already meet this requirement. Some -iterators are output iterators, and do not need to meet the -requirement, and others are only specified through the general -iterator requirements (which will change with this resolution). The -sole case where there is an explicit definition of the reference type -that will need to change is istreambuf_iterator which returns -charT from operator* but has a reference type of -charT&. We propose changing the reference type of -istreambuf_iterator to charT. -

- -

The other option for resolving the issue with pointer, - mentioned in the note below, is to remove pointer - altogether. I prefer placing requirements on pointer to - removing it for two reasons. First, pointer will become - useful for implementing iterator adaptors and in particular, - reverse_iterator will become more well defined. Second, - removing pointer is a rather drastic and publicly-visible - action to take.

- -

The proposed resolution technically enlarges the requirements for -iterators, which means there are existing iterators (such as -istreambuf_iterator, and potentially some programmer-defined -iterators) that will no longer meet the requirements. Will this break -existing code? The scenario in which it would is if an algorithm -implementation (say in the Standard Library) is changed to rely on -iterator_traits::reference, and then is used with one of the -iterators that do not have an appropriately defined -iterator_traits::reference. -

- - -

The proposed resolution makes one other subtle change. Previously, -it was required that output iterators have a difference_type -and value_type of void, which means that a forward -iterator could not be an output iterator. This is clearly a mistake, -so I've changed the wording to say that those types may be -void. -

- - - -

Proposed resolution:

- -

In 24.3.1 [iterator.traits], after:

- -

-be defined as the iterator's difference type, value type and iterator -category, respectively. -

- -

add

- -

-In addition, the types

-
iterator_traits<Iterator>::reference
-iterator_traits<Iterator>::pointer
-
-

must be defined as the iterator's reference and pointer types, that -is, the same type as the type of *a and a->, -respectively.

-
- -

In 24.3.1 [iterator.traits], change:

- -

-In the case of an output iterator, the types

-
iterator_traits<Iterator>::difference_type
-iterator_traits<Iterator>::value_type
-
-

are both defined as void.

-
- -

to:

-

-In the case of an output iterator, the types

-
iterator_traits<Iterator>::difference_type
-iterator_traits<Iterator>::value_type
-iterator_traits<Iterator>::reference
-iterator_traits<Iterator>::pointer
-
-

may be defined as void.

-
- -

In 24.5.3 [istreambuf.iterator], change:

-
-
typename traits::off_type, charT*, charT&>
-
-
-

to:

-
-
typename traits::off_type, charT*, charT>
-
-
- -

[ -Redmond: there was concern in Sydney that this might not be the only place -where things were underspecified and needed to be changed. Jeremy -reviewed iterators in the standard and confirmed that nothing else -needed to be changed. -]

- - - - - - - - - -
-

448. Random Access Iterators over abstract classes

-

Section: 24.1.5 [random.access.iterators] Status: WP - Submitter: Dave Abrahams Date: 2004-01-07

-

View all other issues in [random.access.iterators].

-

View all issues with WP status.

-

Discussion:

-

-Table 76, the random access iterator requirement table, says that the -return type of a[n] must be "convertible to T". When an iterator's -value_type T is an abstract class, nothing is convertible to T. -Surely this isn't an intended restriction? -

- - -

Proposed resolution:

-

-Change the return type to "convertible to T const&". -

- - - - - -
-

449. Library Issue 306 Goes Too Far

-

Section: 18.1 [support.types] Status: WP - Submitter: Pete Becker Date: 2004-01-15

-

View all other issues in [support.types].

-

View all issues with WP status.

-

Discussion:

-

Original text:

-

-The macro offsetof accepts a restricted set of type arguments in this -International Standard. type shall be a POD structure or a POD union -(clause 9). The result of applying the offsetof macro to a field that -is a static data member or a function member is undefined." -

- -

Revised text:

-

-"If type is not a POD structure or a POD union the results are undefined." -

- -

-Looks to me like the revised text should have replaced only the second -sentence. It doesn't make sense standing alone. -

- - - -

Proposed resolution:

-

Change 18.1, paragraph 5, to:

- -

-The macro offsetof accepts a restricted set of type arguments in this -International Standard. If type is not a POD structure or a POD union -the results are undefined. The result of applying the offsetof macro -to a field that is a static data member or a function member is -undefined." -

- - - - - -
-

453. basic_stringbuf::seekoff need not always fail for an empty stream

-

Section: 27.7.1.4 [stringbuf.virtuals] Status: WP - Submitter: Bill Plauger Date: 2004-01-30

-

View other active issues in [stringbuf.virtuals].

-

View all other issues in [stringbuf.virtuals].

-

View all issues with WP status.

-

Discussion:

-
  pos_type basic_stringbuf::seekoff(off_type, ios_base::seekdir,
-                                    ios_base::openmode);
-
-

-is obliged to fail if nothing has been inserted into the stream. This -is unnecessary and undesirable. It should be permissible to seek to -an effective offset of zero.

- -

[ - Sydney: Agreed that this is an annoying problem: seeking to zero should be - legal. Bill will provide wording. -]

- - - - -

Proposed resolution:

-

Change the sentence from:

-

-For a sequence to be positioned, if its next pointer (either -gptr() or pptr()) is a null pointer, the positioning operation -fails. -

- -

to:

- -

-For a sequence to be positioned, if its next pointer (either -gptr() or pptr()) is a null pointer and the new offset newoff -is nonzero, the positioning operation fails. -

- - - - - -
-

455. cerr::tie() and wcerr::tie() are overspecified

-

Section: 27.3 [iostream.objects] Status: DR - Submitter: Bill Plauger Date: 2004-01-30

-

View all other issues in [iostream.objects].

-

View all issues with DR status.

-

Discussion:

-

-Both cerr::tie() and wcerr::tie() are obliged to be null at program -startup. This is overspecification and overkill. It is both traditional -and useful to tie cerr to cout, to ensure that standard output is drained -whenever an error message is written. This behavior should at least be -permitted if not required. Same for wcerr::tie(). -

- - -

Proposed resolution:

- -

Add to the description of cerr:

-

-After the object cerr is initialized, cerr.tie() returns &cout. -Its state is otherwise the same as required for basic_ios<char>::init -(lib.basic.ios.cons). -

- -

Add to the description of wcerr:

- -

-After the object wcerr is initialized, wcerr.tie() returns &wcout. -Its state is otherwise the same as required for basic_ios<wchar_t>::init -(lib.basic.ios.cons). -

- -

[Sydney: straw poll (3-1): we should require, not just - permit, cout and cerr to be tied on startup. Pre-Redmond: Bill will - provide wording.]

- - - - - - -
-

456. Traditional C header files are overspecified

-

Section: 17.4.1.2 [headers] Status: WP - Submitter: Bill Plauger Date: 2004-01-30

-

View all other issues in [headers].

-

View all issues with WP status.

-

Discussion:

- -

The C++ Standard effectively requires that the traditional C headers -(of the form <xxx.h>) be defined in terms of the newer C++ -headers (of the form <cxxx>). Clauses 17.4.1.2/4 and D.5 combine -to require that:

- -
    -
  • Including the header <cxxx> declares a C name in namespace std.
  • - -
  • Including the header <xxx.h> declares a C name in namespace std - (effectively by including <cxxx>), then imports it into the global - namespace with an individual using declaration.
  • -
- -

-The rules were left in this form despited repeated and heated objections -from several compiler vendors. The C headers are often beyond the direct -control of C++ implementors. In some organizations, it's all they can do -to get a few #ifdef __cplusplus tests added. Third-party library vendors -can perhaps wrap the C headers. But neither of these approaches supports -the drastic restructuring required by the C++ Standard. As a result, it is -still widespread practice to ignore this conformance requirement, nearly -seven years after the committee last debated this topic. Instead, what is -often implemented is: -

- -
    -
  • Including the header <xxx.h> declares a C name in the - global namespace.
  • - -
  • Including the header <cxxx> declares a C name in the - global namespace (effectively by including <xxx.h>), then - imports it into namespace std with an individual using declaration.
  • -
- -

-The practical benefit for implementors with the second approach is that -they can use existing C library headers, as they are pretty much obliged -to do. The practical cost for programmers facing a mix of implementations -is that they have to assume weaker rules:

- -
    -
  • If you want to assuredly declare a C name in the global - namespace, include <xxx.h>. You may or may not also get the - declaration in namespace std.
  • - -
  • If you want to assuredly declare a C name in namespace std, - include <cxxx>. You may or may not also get the declaration in - the global namespace.
  • -
- -

-There also exists the possibility of subtle differences due to -Koenig lookup, but there are so few non-builtin types defined in the C -headers that I've yet to see an example of any real problems in this -area. -

- -

-It is worth observing that the rate at which programmers fall afoul of -these differences has remained small, at least as measured by newsgroup -postings and our own bug reports. (By an overwhelming margin, the -commonest problem is still that programmers include <string> and can't -understand why the typename string isn't defined -- this a decade after -the committee invented namespace std, nominally for the benefit of all -programmers.) -

- -

-We should accept the fact that we made a serious mistake and rectify it, -however belatedly, by explicitly allowing either of the two schemes for -declaring C names in headers. -

- -

[Sydney: This issue has been debated many times, and will - certainly have to be discussed in full committee before any action - can be taken. However, the preliminary sentiment of the LWG was in - favor of the change. (6 yes, 0 no, 2 abstain) Robert Klarer - suggests that we might also want to undeprecate the - C-style .h headers.]

- - - - -

Proposed resolution:

-

-Add to 17.4.1.2 [headers], para. 4: -

- -

-Except as noted in clauses 18 through 27 and Annex D, the contents of each -header cname shall be the same as that of the corresponding header -name.h, as specified in ISO/IEC 9899:1990 Programming Languages C (Clause -7), or ISO/IEC:1990 Programming Languages-C AMENDMENT 1: C Integrity, (Clause -7), as appropriate, as if by inclusion. In the C++ Standard Library, however, -the declarations and definitions (except for names which are defined -as macros in C) are within namespace scope (3.3.5) of the namespace std. -It is unspecified whether these names are first declared within the global -namespace scope and are then injected into namespace std by explicit -using-declarations (7.3.3 [namespace.udecl]). -

- -

-Change D.5 [depr.c.headers], para. 2-3: -

- -
-

--2- Every C header, each of which has a name of the form name.h, behaves -as if each name placed in the Standard library namespace by the corresponding -cname header is also placed within the global -namespace scope. of the namespace std and is followed -by an explicit using-declaration (7.3.3 [namespace.udecl]). -It is unspecified whether these names are first declared or defined within -namespace scope (3.3.5 [basic.scope.namespace]) of the namespace -std and are then injected into the global namespace scope by explicit -using-declarations (7.3.3 [namespace.udecl]). -

-

--3- [Example: The header <cstdlib> assuredly -provides its declarations and definitions within the namespace std. -It may also provide these names within the global namespace. The -header <stdlib.h> makes these available also in -assuredly provides the same declarations and definitions within the -global namespace, much as in the C Standard. It may also provide these -names within the namespace std. -- end example] -

-
- - - - - -
-

457. bitset constructor: incorrect number of initialized bits

-

Section: 23.3.5.1 [bitset.cons] Status: DR - Submitter: Dag Henriksson Date: 2004-01-30

-

View all other issues in [bitset.cons].

-

View all issues with DR status.

-

Discussion:

-

-The constructor from unsigned long says it initializes "the first M -bit positions to the corresponding bit values in val. M is the smaller -of N and the value CHAR_BIT * sizeof(unsigned long)." -

- -

-Object-representation vs. value-representation strikes again. CHAR_BIT * -sizeof (unsigned long) does not give us the number of bits an unsigned long -uses to hold the value. Thus, the first M bit position above is not -guaranteed to have any corresponding bit values in val. -

- - -

Proposed resolution:

-

In 23.3.5.1 [bitset.cons] paragraph 2, change "M is the smaller of - N and the value CHAR_BIT * sizeof (unsigned long). (249)" to - "M is the smaller of N and the number of bits in - the value representation (section 3.9 [basic.types]) of unsigned - long." -

- - - - - -
-

460. Default modes missing from basic_fstream member specifications

-

Section: 27.8.1 [fstreams] Status: DR - Submitter: Ben Hutchings Date: 2004-04-01

-

View all other issues in [fstreams].

-

View all issues with DR status.

-

Discussion:

-

-The second parameters of the non-default constructor and of the open -member function for basic_fstream, named "mode", are optional -according to the class declaration in 27.8.1.11 [lib.fstream]. The -specifications of these members in 27.8.1.12 [lib.fstream.cons] and -27.8.1.13 lib.fstream.members] disagree with this, though the -constructor declaration has the "explicit" function-specifier implying -that it is intended to be callable with one argument. -

- - -

Proposed resolution:

-

In 27.8.1.15 [fstream.cons], change

-
  explicit basic_fstream(const char* s, ios_base::openmode mode); 
-
-

to

-
  explicit basic_fstream(const char* s,
-                         ios_base::openmode mode = ios_base::in|ios_base::out);
-
-

In 27.8.1.17 [fstream.members], change

-
  void open(const char*s, ios_base::openmode mode); 
-
-

to

-
  void open(const char*s,
-            ios_base::openmode mode = ios_base::in|ios_base::out);
-
- - - - - -
-

461. time_get hard or impossible to implement

-

Section: 22.2.5.1.2 [locale.time.get.virtuals] Status: WP - Submitter: Bill Plauger Date: 2004-03-23

-

View all issues with WP status.

-

Discussion:

-

-Template time_get currently contains difficult, if not impossible, -requirements for do_date_order, do_get_time, and do_get_date. All require -the implementation to scan a field generated by the %x or %X conversion -specifier in strftime. Yes, do_date_order can always return no_order, but -that doesn't help the other functions. The problem is that %x can be -nearly anything, and it can vary widely with locales. It's horribly -onerous to have to parse "third sunday after Michaelmas in the year of -our Lord two thousand and three," but that's what we currently ask of -do_get_date. More practically, it leads some people to think that if -%x produces 10.2.04, we should know to look for dots as separators. Still -not easy. -

- -

-Note that this is the opposite effect from the intent stated in the -footnote earlier in this subclause: -

- -

-"In other words, user confirmation is required for reliable parsing of -user-entered dates and times, but machine-generated formats can be -parsed reliably. This allows parsers to be aggressive about interpreting -user variations on standard formats." -

- -

-We should give both implementers and users an easier and more reliable -alternative: provide a (short) list of alternative delimiters and say -what the default date order is for no_order. For backward compatibility, -and maximum latitude, we can permit an implementation to parse whatever -%x or %X generates, but we shouldn't require it. -

- - -

Proposed resolution:

- -

In the description:

-
iter_type do_get_time(iter_type s, iter_type end, ios_base& str,
-        ios_base::iostate& err, tm* t) const;
-
- -

-2 Effects: Reads characters starting at suntil it has extracted those -struct tm members, and remaining format characters, used by -time_put<>::put to produce the format specified by 'X', or until it -encounters an error or end of sequence. -

- -

change: 'X'

- -

to: "%H:%M:%S"

- - -

Change

-
iter_type do_get_date(iter_type s, iter_type end, ios_base& str,
-        ios_base::iostate& err, tm* t) const;
-
-4 Effects: Reads characters starting at s until it has extracted those
-struct tm members, and remaining format characters, used by
-time_put<>::put to produce the format specified by 'x', or until it
-encounters an error.
-
- -

to

-
iter_type do_get_date(iter_type s, iter_type end, ios_base& str,
-        ios_base::iostate& err, tm* t) const;
-
- -

-4 Effects: Reads characters starting at s until it has extracted those -struct tm members, and remaining format characters, used by -time_put<>::put to produce one of the following formats, or until it -encounters an error. The format depends on the value returned by -date_order() as follows: -

- -
        date_order()  format
-
-        no_order      "%m/%d/%y"
-        dmy           "%d/%m/%y"
-        mdy           "%m/%d/%y"
-        ymd           "%y/%m/%d"
-        ydm           "%y/%d/%m"
-
-

-An implementation may also accept additional implementation-defined formats. -

- -

[Redmond: agreed that this is a real problem. The solution is - probably to match C99's parsing rules. Bill provided wording. -]

- - - - - - - -
-

464. Suggestion for new member functions in standard containers

-

Section: 23.2.5 [vector], 23.3.1 [map] Status: WP - Submitter: Thorsten Ottosen Date: 2004-05-12

-

View all other issues in [vector].

-

View all issues with WP status.

-

Discussion:

- -

To add slightly more convenience to vector<T> and map<Key,T> we should consider to add

-
    -
  1. add vector<T>::data() member (const and non-const version) -semantics: if( empty() ) return 0; else return buffer_;
  2. -
  3. add map<Key,T>::at( const Key& k ) member (const and non-const version) -semantics: iterator i = find( k ); if( i != end() ) return *i; else throw range_error();
  4. -
- -

Rationale:

- -
    -
  • To obtain a pointer to the vector's buffer, one must use either -operator[]() (which can give undefined behavior for empty vectors) or -at() (which will then throw if the vector is empty).
  • -
  • tr1::array<T,sz> already has a data() member
  • -
  • e cannot use operator[]() when T is not DefaultDonstructible
  • -
  • Neither when the map is const.
  • -
  • when we want to make sure we don't add an element accidently
  • -
  • when it should be considered an error if a key is not in the map
  • -
- - - -

Proposed resolution:

-

In 23.2.5 [vector], add the following to the vector - synopsis after "element access" and before "modifiers":

-
  // [lib.vector.data] data access
-  pointer       data();
-  const_pointer data() const;
-
- -

Add a new subsection of 23.2.5 [vector]:

-
-

23.2.4.x vector data access

-
   pointer       data();
-   const_pointer data() const;
-
-

Returns: A pointer such that [data(), data() + size()) is a valid - range. For a non-empty vector, data() == &front().

-

Complexity: Constant time.

-

Throws: Nothing.

-
- -

In 23.3.1 [map], add the following to the map -synopsis immediately after the line for operator[]:

-
  T&       at(const key_type& x);
-  const T& at(const key_type& x) const;
-
- -

Add the following to 23.3.1.2 [map.access]:

-
-
  T&       at(const key_type& x);
-  const T& at(const key_type& x) const;
-
- -

Returns: A reference to the element whose key is equivalent - to x, if such an element is present in the map.

-

Throws: out_of_range if no such element is present.

- -
- - - -

Rationale:

-

Neither of these additions provides any new functionality but the - LWG agreed that they are convenient, especially for novices. The - exception type chosen for at, std::out_of_range, - was chosen to match vector::at.

- - - - - -
-

465. Contents of <ciso646>

-

Section: 17.4.1.2 [headers] Status: WP - Submitter: Steve Clamage Date: 2004-06-03

-

View all other issues in [headers].

-

View all issues with WP status.

-

Discussion:

-

C header <iso646.h> defines macros for some operators, such as -not_eq for !=.

- -

Section 17.4.1.2 [headers] "Headers" says that except as noted in -clauses 18 through 27, the <cname> C++ header contents are the same -as the C header <name.h>. In particular, table 12 lists -<ciso646> as a C++ header.

- -

I don't find any other mention of <ciso646>, or any mention of -<iso646.h>, in clauses 17 thorough 27. That implies that the -contents of <ciso646> are the same as C header <iso646.h>.

- -

Annex C (informative, not normative) in [diff.header.iso646.h] C.2.2.2 -"Header <iso646.h>" says that the alternative tokens are not -defined as macros in <ciso646>, but does not mention the contents -of <iso646.h>.

- -

I don't find any normative text to support C.2.2.2.

- - - -

Proposed resolution:

-

Add to section 17.4.1.2 Headers [lib.headers] a new paragraph after - paragraph 6 (the one about functions must be functions):

- -
-

Identifiers that are keywords or operators in C++ shall not be defined -as macros in C++ standard library headers. -[Footnote:In particular, including the standard header <iso646.h> -or <ciso646> has no effect.

-
- -

[post-Redmond: Steve provided wording.]

- - - - - - - -
-

467. char_traits::lt(), compare(), and memcmp()

-

Section: 21.1.3.1 [char.traits.specializations.char] Status: WP - Submitter: Martin Sebor Date: 2004-06-28

-

View all issues with WP status.

-

Discussion:

- -

-Table 37 describes the requirements on Traits::compare() in terms of -those on Traits::lt(). 21.1.3.1, p6 requires char_traits<char>::lt() -to yield the same result as operator<(char, char). -

- -

-Most, if not all, implementations of char_traits<char>::compare() -call memcmp() for efficiency. However, the C standard requires both -memcmp() and strcmp() to interpret characters under comparison as -unsigned, regardless of the signedness of char. As a result, all -these char_traits implementations fail to meet the requirement -imposed by Table 37 on compare() when char is signed. -

- - -

Read email thread starting with c++std-lib-13499 for more.

- - -

Proposed resolution:

- - -

Change 21.1.3.1, p6 from

-

- The two-argument members assign, eq, and lt are defined identically - to the built-in operators =, ==, and < respectively. -

-

to

-

- The two-argument member assign is defined identically to - the built-in operator =. The two - argument members eq and lt are defined identically to - the built-in operators == and < for type unsigned char. -

- -

[Redmond: The LWG agreed with this general direction, but we - also need to change eq to be consistent with this change. - Post-Redmond: Martin provided wording.]

- - - - - - -
-

468. unexpected consequences of ios_base::operator void*()

-

Section: 27.4.4.3 [iostate.flags] Status: WP - Submitter: Martin Sebor Date: 2004-06-28

-

View all other issues in [iostate.flags].

-

View all issues with WP status.

-

Discussion:

- -

The program below is required to compile but when run it typically -produces unexpected results due to the user-defined conversion from -std::cout or any object derived from basic_ios to void*. -

- -
    #include <cassert>
-    #include <iostream>
-
-    int main ()
-    {
-        assert (std::cin.tie () == std::cout);
-        // calls std::cout.ios::operator void*()
-    }
-
- - -

Proposed resolution:

- -

-Replace std::basic_ios<charT, traits>::operator void*() with another -conversion operator to some unspecified type that is guaranteed not -to be convertible to any other type except for bool (a pointer-to-member -might be one such suitable type). In addition, make it clear that the -pointer type need not be a pointer to a complete type and when non-null, -the value need not be valid. -

- -

Specifically, change in [lib.ios] the signature of

-
    operator void*() const;
-
-

to

-
    operator unspecified-bool-type() const;
-
-

and change [lib.iostate.flags], p1 from

-
    operator void*() const;
-
-

to

-
operator unspecified-bool-type() const;
-
-     -1- Returns: if fail() then a value that will evaluate false in a
-      boolean context; otherwise a value that will evaluate true in a
-      boolean context. The value type returned shall not be
-      convertible to int.
-
-     -2- [Note: This conversion can be used in contexts where a bool
-      is expected (e.g., an if condition); however, implicit
-      conversions (e.g., to int) that can occur with bool are not
-      allowed, eliminating some sources of user error. One possible
-      implementation choice for this type is pointer-to-member.  - end
-      note]
-
- -

[Redmond: 5-4 straw poll in favor of doing this.]

- -

[Lillehammer: Doug provided revised wording for - "unspecified-bool-type".]

- - - - - - - - -
-

469. vector<bool> ill-formed relational operators

-

Section: 23.2.5 [vector] Status: DR - Submitter: Martin Sebor Date: 2004-06-28

-

View all other issues in [vector].

-

View all issues with DR status.

-

Discussion:

- -

-The overloads of relational operators for vector<bool> specified -in [lib.vector.bool] are redundant (they are semantically identical -to those provided for the vector primary template) and may even be -diagnosed as ill-formed (refer to Daveed Vandevoorde's explanation -in c++std-lib-13647). -

- - - -

Proposed resolution:

-

-Remove all overloads of overloads of relational operators for -vector<bool> from [lib.vector.bool]. -

- - - - -
-

474. confusing Footnote 297

-

Section: 27.6.2.6.4 [ostream.inserters.character] Status: WP - Submitter: Martin Sebor Date: 2004-07-01

-

View all other issues in [ostream.inserters.character].

-

View all issues with WP status.

-

Discussion:

- -

-I think Footnote 297 is confused. The paragraph it applies to seems -quite clear in that widen() is only called if the object is not a char -stream (i.e., not basic_ostream<char>), so it's irrelevant what the -value of widen(c) is otherwise. -

- - -

Proposed resolution:

-

-I propose to strike the Footnote. -

- - - - -
-

475. May the function object passed to for_each modify the elements of the iterated sequence?

-

Section: 25.1.1 [alg.foreach] Status: WP - Submitter: Stephan T. Lavavej, Jaakko Jarvi Date: 2004-07-09

-

View all other issues in [alg.foreach].

-

View all issues with WP status.

-

Discussion:

-

-It is not clear whether the function object passed to for_each is allowed to -modify the elements of the sequence being iterated over. -

- -

-for_each is classified without explanation in [lib.alg.nonmodifying], "25.1 -Non-modifying sequence operations". 'Non-modifying sequence operation' is -never defined. -

- -

-25(5) says: "If an algorithm's Effects section says that a value pointed to -by any iterator passed as an argument is modified, then that algorithm has -an additional type requirement: The type of that argument shall satisfy the -requirements of a mutable iterator (24.1)." -

- -

for_each's Effects section does not mention whether arguments can be -modified:

- -

- "Effects: Applies f to the result of dereferencing every iterator in the - range [first, last), starting from first and proceeding to last - 1." -

- -

-Every other algorithm in [lib.alg.nonmodifying] is "really" non-modifying in -the sense that neither the algorithms themselves nor the function objects -passed to the algorithms may modify the sequences or elements in any way. -This DR affects only for_each. -

- -

-We suspect that for_each's classification in "non-modifying sequence -operations" means that the algorithm itself does not inherently modify the -sequence or the elements in the sequence, but that the function object -passed to it may modify the elements it operates on. -

- -

-The original STL document by Stepanov and Lee explicitly prohibited the -function object from modifying its argument. -The "obvious" implementation of for_each found in several standard library -implementations, however, does not impose this restriction. -As a result, we suspect that the use of for_each with function objects that modify -their arguments is wide-spread. -If the restriction was reinstated, all such code would become non-conforming. -Further, none of the other algorithms in the Standard -could serve the purpose of for_each (transform does not guarantee the order in -which its function object is called). -

- -

-We suggest that the standard be clarified to explicitly allow the function object -passed to for_each modify its argument.

- - - -

Proposed resolution:

-

Add a nonnormative note to the Effects in 25.1.1 [alg.foreach]: If -the type of 'first' satisfies the requirements of a mutable iterator, -'f' may apply nonconstant functions through the dereferenced iterators -passed to it. -

- - - -

Rationale:

-

The LWG believes that nothing in the standard prohibits function - objects that modify the sequence elements. The problem is that - for_each is in a secion entitled "nonmutating algorithms", and the - title may be confusing. A nonnormative note should clarify that.

- - - - - -
-

478. Should forward iterator requirements table have a line for r->m?

-

Section: 24.1.3 [forward.iterators] Status: WP - Submitter: Dave Abrahams Date: 2004-07-11

-

View all other issues in [forward.iterators].

-

View all issues with WP status.

-

Duplicate of: 477

-

Discussion:

-

-The Forward Iterator requirements table contains the following: -

-
 expression  return type         operational  precondition
-                                  semantics
-  ==========  ==================  ===========  ==========================
-  a->m        U& if X is mutable, (*a).m       pre: (*a).m is well-defined.
-              otherwise const U&
-
-  r->m        U&                  (*r).m       pre: (*r).m is well-defined.
-
- -

The second line may be unnecessary. Paragraph 11 of - [lib.iterator.requirements] says: -

- -

- In the following sections, a and b denote values of type const X, n - denotes a value of the difference type Distance, u, tmp, and m - denote identifiers, r denotes a value of X&, t denotes a value of - value type T, o denotes a value of some type that is writable to - the output iterator. -

- -

-Because operators can be overloaded on an iterator's const-ness, the -current requirements allow iterators to make many of the operations -specified using the identifiers a and b invalid for non-const -iterators.

- -

Related issue: 477

- - -

Proposed resolution:

- -

Remove the "r->m" line from the Forward Iterator requirements -table. Change

-

- "const X" -

- -

to

- -

- "X or const X" -

- -

in paragraph 11 of [lib.iterator.requirements].

- - - - -

Rationale:

-

-This is a defect because it constrains an lvalue to returning a modifiable lvalue. -

- - - - - -
-

488. rotate throws away useful information

-

Section: 25.2.11 [alg.rotate] Status: WP - Submitter: Howard Hinnant Date: 2004-11-22

-

View all issues with WP status.

-

Discussion:

-

-rotate takes 3 iterators: first, middle and last which point into a -sequence, and rearranges the sequence such that the subrange [middle, -last) is now at the beginning of the sequence and the subrange [first, -middle) follows. The return type is void. -

- -

-In many use cases of rotate, the client needs to know where the -subrange [first, middle) starts after the rotate is performed. This -might look like: -

-
  rotate(first, middle, last);
-  Iterator i = advance(first, distance(middle, last));
-
- -

-Unless the iterators are random access, the computation to find the -start of the subrange [first, middle) has linear complexity. However, -it is not difficult for rotate to return this information with -negligible additional computation expense. So the client could code: -

-
  Iterator i = rotate(first, middle, last);
-
- -

-and the resulting program becomes significantly more efficient. -

- -

-While the backwards compatibility hit with this change is not zero, it -is very small (similar to that of lwg 130), and there is -a significant benefit to the change. -

- - - -

Proposed resolution:

-

In 25 [algorithms] p2, change:

- -
  template<class ForwardIterator>
-    void ForwardIterator rotate(ForwardIterator first, ForwardIterator middle,
-                ForwardIterator last);
-
- -

In 25.2.11 [alg.rotate], change:

- -
  template<class ForwardIterator>
-    void ForwardIterator rotate(ForwardIterator first, ForwardIterator middle,
-                ForwardIterator last);
-
- -

In 25.2.11 [alg.rotate] insert a new paragraph after p1:

- -
-

Returns: first + (last - middle).

-
- -

[ -The LWG agrees with this idea, but has one quibble: we want to make -sure not to give the impression that the function "advance" is -actually called, just that the nth iterator is returned. (Calling -advance is observable behavior, since users can specialize it for -their own iterators.) Howard will provide wording. -]

- - -

[Howard provided wording for mid-meeting-mailing Jun. 2005.]

- - -

[ -Toronto: moved to Ready. -]

- - - - - - - -
-

495. Clause 22 template parameter requirements

-

Section: 22 [localization] Status: WP - Submitter: Beman Dawes Date: 2005-01-10

-

View all other issues in [localization].

-

View all issues with WP status.

-

Discussion:

-

It appears that there are no requirements specified for many of the -template parameters in clause 22. It looks like this issue has never -come up, except perhaps for Facet.

- -

Clause 22 isn't even listed in 17.3.2.1 [lib.type.descriptions], -either, which is the wording that allows requirements on template -parameters to be identified by name.

- -

So one issue is that 17.3.2.1 [lib.type.descriptions] Should be -changed to cover clause 22. A better change, which will cover us in -the future, would be to say that it applies to all the library -clauses. Then if a template gets added to any library clause we are -covered.

- -

charT, InputIterator, and other names with requirements defined -elsewhere are fine, assuming the 17.3.2.1 [lib.type.descriptions] fix. -But there are a few template arguments names which I don't think have -requirements given elsewhere:

- -
    -
  • internT and externT. The fix is to add wording saying that internT -and externT must meet the same requirements as template arguments -named charT.
  • - -
  • stateT. I'm not sure about this one. There already is some wording, -but it seems a bit vague.
  • - -
  • Intl. [lib.locale.moneypunct.byname] The fix for this one is to -rename "Intl" to "International". The name is important because other -text identifies the requirements for the name International but not -for Intl.
  • -
- -

Proposed resolution:

-

Change 17.3.2.1 [type.descriptions], paragraph 1, from:

-

-The Requirements subclauses may describe names that are used to -specify constraints on template arguments.153) These names are used in -clauses 20, 23, 25, and 26 to describe the types that may be supplied -as arguments by a C++ program when instantiating template components -from the library. -

-

to:

-

-The Requirements subclauses may describe names that are used to -specify constraints on template arguments.153) These names are used in -library clauses to describe the types that may be supplied as -arguments by a C++ program when instantiating template components from -the library. -

- -

In the front matter of class 22, locales, add:

-

-Template parameter types internT and externT shall meet the -requirements of charT (described in 21 [strings]). -

- - -

Rationale:

-

- Again, a blanket clause isn't blanket enough. Also, we've got a - couple of names that we don't have blanket requirement statements - for. The only issue is what to do about stateT. This wording is - thin, but probably adequate.

- - - - - -
-

496. Illegal use of "T" in vector<bool>

-

Section: 23.2.5 [vector] Status: WP - Submitter: richard@ex-parrot.com Date: 2005-02-10

-

View all other issues in [vector].

-

View all issues with WP status.

-

Discussion:

-

-In the synopsis of the std::vector<bool> specialisation in 23.2.5 [vector], -the non-template assign() function has the signature

- -
  void assign( size_type n, const T& t );
-
- -

The type, T, is not defined in this context.

- - -

Proposed resolution:

-

Replace "T" with "value_type".

- - - - - -
-

497. meaning of numeric_limits::traps for floating point types

-

Section: 18.2.1.2 [numeric.limits.members] Status: WP - Submitter: Martin Sebor Date: 2005-03-02

-

View all other issues in [numeric.limits.members].

-

View all issues with WP status.

-

Discussion:

- -

18.2.1.2, p59 says this much about the traps member of numeric_limits:

- -
-

static const bool traps;
--59- true if trapping is implemented for the type.204) -
-Footnote 204: Required by LIA-1. -

-
- -

It's not clear what is meant by "is implemented" here.

- -

-In the context of floating point numbers it seems reasonable to expect -to be able to use traps to determine whether a program can "safely" use -infinity(), quiet_NaN(), etc., in arithmetic expressions, that is -without causing a trap (i.e., on UNIX without having to worry about -getting a signal). When traps is true, I would expect any of the -operations in section 7 of IEEE 754 to cause a trap (and my program -to get a SIGFPE). So, for example, on Alpha, I would expect traps -to be true by default (unless I compiled my program with the -ieee -option), false by default on most other popular architectures, -including IA64, MIPS, PA-RISC, PPC, SPARC, and x86 which require -traps to be explicitly enabled by the program. -

- -

-Another possible interpretation of p59 is that traps should be true -on any implementation that supports traps regardless of whether they -are enabled by default or not. I don't think such an interpretation -makes the traps member very useful, even though that is how traps is -implemented on several platforms. It is also the only way to implement -traps on platforms that allow programs to enable and disable trapping -at runtime. -

- - -

Proposed resolution:

-

Change p59 to read:

-

True if, at program startup, there exists a value of the type that - would cause an arithmetic operation using that value to trap.

- - -

Rationale:

-

- Real issue, since trapping can be turned on and off. Unclear what a - static query can say about a dynamic issue. The real advice we should - give users is to use cfenv for these sorts of queries. But this new - proposed resolution is at least consistent and slightly better than - nothing.

- - - - - -
-

505. Result_type in random distribution requirements

-

Section: 26.4.1 [rand.req], TR1 5.1.1 [tr.rand.req] Status: WP - Submitter: Walter Brown Date: 2005-07-03

-

View all other issues in [rand.req].

-

View all issues with WP status.

-

Discussion:

-

-Table 17: Random distribution requirements -

-

-Row 1 requires that each random distribution provide a nested type "input_type"; -this type denotes the type of the values that the distribution consumes. -

-

-Inspection of all distributions in [tr.rand.dist] reveals that each distribution -provides a second typedef ("result_type") that denotes the type of the values the -distribution produces when called. -

- - -

Proposed resolution:

-

-It seems to me that this is also a requirement -for all distributions and should therefore be indicated as such via a new second -row to this table 17: -

- - -
X::result_typeT---compile-time
- -

[ -Berlin: Voted to WP. N1932 adopts the proposed resolution: see Table 5 row 1. -]

- - - - - - - -
-

507. Missing requirement for variate_generator::operator()

-

Section: 26.4 [rand], TR1 5.1.3 [tr.rand.var] Status: WP - Submitter: Walter Brown Date: 2005-07-03

-

View all other issues in [rand].

-

View all issues with WP status.

-

Discussion:

-

-Paragraph 11 of [tr.rand.var] equires that the member template -

-
template<class T> result_type operator() (T value);
-
-

-return -

-
distribution()(e, value)
-
-

-However, not all distributions have an operator() with a corresponding signature. -

- -

[ -Berlin: As a working group we voted in favor of N1932 which makes this moot: -variate_generator has been eliminated. Then in full committee we voted to give -this issue WP status (mistakenly). -]

- - - - -

Proposed resolution:

-

-We therefore recommend that we insert the following precondition before paragraph 11: -

-

-Precondition: distribution().operator()(e,value) is well-formed. -

- - - - - -
-

508. Bad parameters for ranlux64_base_01

-

Section: 26.4.5 [rand.predef], TR1 5.1.5 [tr.rand.predef] Status: WP - Submitter: Walter Brown Date: 2005-07-03

-

View all issues with WP status.

-

Discussion:

-

-The fifth of these engines with predefined parameters, ranlux64_base_01, -appears to have an unintentional error for which there is a simple correction. -The two pre-defined subtract_with_carry_01 engines are given as: -

-
typedef subtract_with_carry_01<float,  24, 10, 24> ranlux_base_01;
-typedef subtract_with_carry_01<double, 48, 10, 24> ranlux64_base_01;
-
-

-We demonstrate below that ranlux64_base_01 fails to meet the intent of the -random number generation proposal, but that the simple correction to -

-
typedef subtract_with_carry_01<double, 48,  5, 12> ranlux64_base_01;
-
-

-does meet the intent of defining well-known good parameterizations. -

-

-The ranlux64_base_01 engine as presented fails to meet the intent for -predefined engines, stated in proposal N1398 (section E): -

-

-In order to make good random numbers available to a large number of library -users, this proposal not only defines generic random-number engines, but also -provides a number of predefined well-known good parameterizations for those. -

-

-The predefined ranlux_base_01 engine has been proven [1,2,3] to have a very -long period and so meets this criterion. This property makes it suitable for -use in the excellent discard_block engines defined subsequently. The proof -of long period relies on the fact (proven in [1]) that 2**(w*r) - 2**(w*s) -+ 1 is prime (w, r, and s are template parameters to subtract_with_carry_01, -as defined in [tr.rand.eng.sub1]). -

-

-The ranlux64_base_01 engine as presented in [tr.rand.predef] uses w=48, r=24, s=10. -For these numbers, the combination 2**(w*r)-2**(w*s)+1 is non-prime (though -explicit factorization would be a challenge). In consequence, while it is -certainly possible for some seeding states that this engine would have a very -long period, it is not at all "well-known" that this is the case. The intent -in the N1398 proposal involved the base of the ranlux64 engine, which finds heavy -use in the physics community. This is isomorphic to the predefined ranlux_base_01, -but exploits the ability of double variables to hold (at least) 48 bits of mantissa, -to deliver 48 random bits at a time rather than 24. -

- - -

Proposed resolution:

-

-To achieve this intended behavior, the correct template parameteriztion would be: -

-
typedef subtract_with_carry_01<double, 48, 5, 12> ranlux64_base_01;
-
-

-The sequence of mantissa bits delivered by this is isomorphic (treating each -double as having the bits of two floats) to that delivered by ranlux_base_01. -

-

-References: -

-
    -
  1. F. James, Comput. Phys. Commun. 60(1990) 329
  2. -
  3. G. Marsaglia and A. Zaman, Ann. Appl. Prob 1(1991) 462
  4. -
  5. M. Luscher, Comput. Phys. Commun. 79(1994) 100-110
  6. -
- -

[ -Berlin: Voted to WP. N1932 adopts the proposed resolution in 26.3.5, -just above paragraph 5. -]

- - - - - - - -
-

519. Data() undocumented

-

Section: 23.2.1 [array], TR1 6.2.2 [tr.array.array] Status: WP - Submitter: Pete Becker Date: 2005-07-03

-

View other active issues in [array].

-

View all other issues in [array].

-

View all issues with WP status.

-

Discussion:

-

-array<>::data() is present in the class synopsis, but not documented. -

- - -

Proposed resolution:

-

-Add a new section, after 6.2.2.3: -

-
T*       data()
-const T* data() const;
-
-

-Returns: elems. -

-

-Change 6.2.2.4/2 to: -

-

-In the case where N == 0, begin() == end(). The return value -of data() is unspecified. -

- - - - - -
-

520. Result_of and pointers to data members

-

Section: 20.5.11.1 [func.bind], TR1 3.6 [tr.func.bind] Status: WP - Submitter: Pete Becker Date: 2005-07-03

-

View all issues with WP status.

-

Discussion:

-

-In the original proposal for binders, the return type of bind() when -called with a pointer to member data as it's callable object was -defined to be mem_fn(ptr); when Peter Dimov and I unified the -descriptions of the TR1 function objects we hoisted the descriptions -of return types into the INVOKE pseudo-function and into result_of. -Unfortunately, we left pointer to member data out of result_of, so -bind doesn't have any specified behavior when called with a pointer -to member data. -

- - -

Proposed resolution:

-

[ -Pete and Peter will provide wording. -]

- - -

-In 20.5.4 [lib.func.ret] ([tr.func.ret]) p3 add the following bullet after bullet 2: -

-
    -
  1. If F is a member data pointer type R T::*, type -shall be cv R& when T1 is cv U1&, -R otherwise.
  2. -
- -

[ -Peter provided wording. -]

- - - - - - - -
-

521. Garbled requirements for argument_type in reference_wrapper

-

Section: 20.5.5 [refwrap], TR1 2.1.2 [tr.util.refwrp.refwrp] Status: WP - Submitter: Pete Becker Date: 2005-07-03

-

View all issues with WP status.

-

Discussion:

-

-2.1.2/3, second bullet item currently says that reference_wrapper<T> is -derived from unary_function<T, R> if T is: -

-

-a pointer to member function type with cv-qualifier cv and no arguments; -the type T1 is cv T* and R is the return type of the pointer to member function; -

-

-The type of T1 can't be cv T*, 'cause that's a pointer to a pointer to member -function. It should be a pointer to the class that T is a pointer to member of. -Like this: -

-

-a pointer to a member function R T0::f() cv (where cv represents the member -function's cv-qualifiers); the type T1 is cv T0* -

-

-Similarly, bullet item 2 in 2.1.2/4 should be: -

-

-a pointer to a member function R T0::f(T2) cv (where cv represents the member -function's cv-qualifiers); the type T1 is cv T0* -

- - -

Proposed resolution:

- -

-Change bullet item 2 in 2.1.2/3: -

- -
-
    -
  • -a pointer to member function type with cv-qualifier cv and no arguments; -the type T1 is cv T* and R is the return -type of the pointer to member function R T0::f() cv -(where cv represents the member function's cv-qualifiers); -the type T1 is cv T0* -
  • -
-
- -

-Change bullet item 2 in 2.1.2/4: -

- -
-
    -
  • -a pointer to member function with cv-qualifier cv and taking one argument -of type T2; the type T1 is cv T* and -R is the return type of the pointer to member function -R T0::f(T2) cv (where cv represents the member -function's cv-qualifiers); the type T1 is cv T0* -
  • -
-
- - - - - - -
-

524. regex named character classes and case-insensitivity don't mix

-

Section: 28 [re] Status: WP - Submitter: Eric Niebler Date: 2005-07-01

-

View all other issues in [re].

-

View all issues with WP status.

-

Discussion:

-

-This defect is also being discussed on the Boost developers list. The -full discussion can be found here: -http://lists.boost.org/boost/2005/07/29546.php -

-

--- Begin original message -- -

-

-Also, I may have found another issue, closely related to the one under -discussion. It regards case-insensitive matching of named character -classes. The regex_traits<> provides two functions for working with -named char classes: lookup_classname and isctype. To match a char class -such as [[:alpha:]], you pass "alpha" to lookup_classname and get a -bitmask. Later, you pass a char and the bitmask to isctype and get a -bool yes/no answer. -

-

-But how does case-insensitivity work in this scenario? Suppose we're -doing a case-insensitive match on [[:lower:]]. It should behave as if it -were [[:lower:][:upper:]], right? But there doesn't seem to be enough -smarts in the regex_traits interface to do this. -

-

-Imagine I write a traits class which recognizes [[:fubar:]], and the -"fubar" char class happens to be case-sensitive. How is the regex engine -to know that? And how should it do a case-insensitive match of a -character against the [[:fubar:]] char class? John, can you confirm this -is a legitimate problem? -

-

-I see two options: -

-

-1) Add a bool icase parameter to lookup_classname. Then, -lookup_classname( "upper", true ) will know to return lower|upper -instead of just upper. -

-

-2) Add a isctype_nocase function -

-

-I prefer (1) because the extra computation happens at the time the -pattern is compiled rather than when it is executed. -

-

--- End original message -- -

- -

-For what it's worth, John has also expressed his preference for option -(1) above. -

- - -

Proposed resolution:

-

-Adopt the proposed resolution in -N2409. -

- - -

[ -Kona (2007): The LWG adopted the proposed resolution of N2409 for this issue. -The LWG voted to accelerate this issue to Ready status to be voted into the WP at Kona. -]

- - - - - -
-

530. Must elements of a string be contiguous?

-

Section: 21.3 [basic.string] Status: WP - Submitter: Matt Austern Date: 2005-11-15

-

View other active issues in [basic.string].

-

View all other issues in [basic.string].

-

View all issues with WP status.

-

Discussion:

-

Issue 69, which was incorporated into C++03, mandated - that the elements of a vector must be stored in contiguous memory. - Should the same also apply to basic_string?

- -

We almost require contiguity already. Clause 23.3.4 [multiset] - defines operator[] as data()[pos]. What's missing - is a similar guarantee if we access the string's elements via the - iterator interface.

- -

Given the existence of data(), and the definition of - operator[] and at in terms of data, - I don't believe it's possible to write a useful and standard- - conforming basic_string that isn't contiguous. I'm not - aware of any non-contiguous implementation. We should just require - it. -

- - -

Proposed resolution:

-

Add the following text to the end of 21.3 [basic.string], -paragraph 2.

- -
-

The characters in a string are stored contiguously, meaning that if - s is a basic_string<charT, Allocator>, then - it obeys the identity - &*(s.begin() + n) == &*s.begin() + n - for all 0 <= n < s.size(). -

-
- - -

Rationale:

-

-Not standardizing this existing practice does not give implementors more -freedom. We thought it might a decade ago. But the vendors have spoken -both with their implementations, and with their voice at the LWG -meetings. The implementations are going to be contiguous no matter what -the standard says. So the standard might as well give string clients -more design choices. -

- - - - - -
-

531. array forms of unformatted input functions

-

Section: 27.6.1.3 [istream.unformatted] Status: WP - Submitter: Martin Sebor Date: 2005-11-23

-

View all other issues in [istream.unformatted].

-

View all issues with WP status.

-

Discussion:

-

-The array forms of unformatted input functions don't seem to have well-defined -semantics for zero-element arrays in a couple of cases. The affected ones -(istream::get() and istream::getline()) are supposed to -terminate when (n - 1) characters are stored, which obviously can -never be true when (n == 0) holds to start with. See -c++std-lib-16071. -

- - -

Proposed resolution:

-

-I suggest changing 27.6.1.3, p7 (istream::get()), bullet 1 to read: -

-
    -
  • - (n < 1) is true or (n - 1) characters - are stored; -
  • -
-

-Change 27.6.1.3, p9: -

- -

-If the function stores no characters, it calls setstate(failbit) (which -may throw ios_base::failure (27.4.4.3)). In any case, if (n -> 0) is true it then stores a null character into the next -successive location of the array. -

- -

- -and similarly p17 (istream::getline()), bullet 3 to: - -

-
    -
  • - (n < 1) is true or (n - 1) characters - are stored (in which case the function calls - setstate(failbit)). -
  • -
- -

- -In addition, to clarify that istream::getline() must not store the -terminating NUL character unless the the array has non-zero size, Robert -Klarer suggests in c++std-lib-16082 to change 27.6.1.3, p20 to read: - -

-

- -In any case, provided (n > 0) is true, it then stores a null character -(using charT()) into the next successive location of the array. - -

- -

[ -post-Redmond: Pete noticed that the current resolution for get requires -writing to out of bounds memory when n == 0. Martin provided fix. -]

- - - - - - - -
-

533. typo in 2.2.3.10/1

-

Section: 20.6.6.2.11 [util.smartptr.getdeleter], TR1 2.2.3.10 [tr.util.smartptr.getdeleter] Status: DR - Submitter: Paolo Carlini Date: 2005-11-09

-

View all other issues in [util.smartptr.getdeleter].

-

View all issues with DR status.

-

Discussion:

-

-I'm seeing something that looks like a typo. The Return of get_deleter -says: -

-

-If *this owns a deleter d... -

-

-but get_deleter is a free function! -

- - -

Proposed resolution:

-

-Therefore, I think should be: -

-

-If *this p owns a deleter d... -

- - - - - -
-

534. Missing basic_string members

-

Section: 21.3 [basic.string] Status: WP - Submitter: Alisdair Meredith Date: 2005-11-16

-

View other active issues in [basic.string].

-

View all other issues in [basic.string].

-

View all issues with WP status.

-

Discussion:

-

-OK, we all know std::basic_string is bloated and already has way too -many members. However, I propose it is missing 3 useful members that -are often expected by users believing it is a close approximation of the -container concept. All 3 are listed in table 71 as 'optional' -

- -

-i/ pop_back. -

- -

-This is the one I feel most strongly about, as I only just discovered it -was missing as we are switching to a more conforming standard library -<g> -

- -

-I find it particularly inconsistent to support push_back, but not -pop_back. -

- -

-ii/ back. -

- -

-There are certainly cases where I want to examine the last character of -a string before deciding to append, or to trim trailing path separators -from directory names etc. *rbegin() somehow feels inelegant. -

- -

-iii/ front -

- -

-This one I don't feel strongly about, but if I can get the first two, -this one feels that it should be added as a 'me too' for consistency. -

- -

-I believe this would be similarly useful to the data() member recently -added to vector, or at() member added to the maps. -

- - -

Proposed resolution:

-

-Add the following members to definition of class template basic_string, 21.3p7 -

-
void pop_back ()
-
-const charT & front() const
-charT & front()
-
-const charT & back() const
-charT & back()
-
-

-Add the following paragraphs to basic_string description -

- -

-21.3.4p5 -

-
-
const charT & front() const
-charT & front()
-
-

-Precondition: !empty() -

-

-Effects: Equivalent to operator[](0). -

-
- -

-21.3.4p6 -

-
-
const charT & back() const
-charT & back()
-
-

-Precondition: !empty() -

-

-Effects: Equivalent to operator[]( size() - 1). -

-
- -

-21.3.5.5p10 -

-
-
void pop_back ()
-
-

-Precondition: !empty() -

-

-Effects: Equivalent to erase( size() - 1, 1 ). -

-
- -

-Update Table 71: (optional sequence operations) -Add basic_string to the list of containers for the following operations. -

-
a.front()
-a.back()
-a.push_back()
-a.pop_back()
-a[n]
-
- -

[ -Berlin: Has support. Alisdair provided wording. -]

- - - - - - -
-

535. std::string::swap specification poorly worded

-

Section: 21.3.6.8 [string::swap] Status: WP - Submitter: Beman Dawes Date: 2005-12-14

-

View all other issues in [string::swap].

-

View all issues with WP status.

-

Discussion:

-

-std::string::swap currently says for effects and postcondition: -

- -
-

-Effects: Swaps the contents of the two strings. -

- -

-Postcondition: *this contains the characters that were in s, -s contains the characters that were in *this. -

-
- -

-Specifying both Effects and Postcondition seems redundant, and the postcondition -needs to be made stronger. Users would be unhappy if the characters were not in -the same order after the swap. -

- - -

Proposed resolution:

-
-

-Effects: Swaps the contents of the two strings. -

- -

-Postcondition: *this contains the same sequence of -characters that were was in s, -s contains the same sequence of characters that -were was in *this. -

-
- - - - - -
-

537. Typos in the signatures in 27.6.1.3/42-43 and 27.6.2.4

-

Section: 27.6.1.3 [istream.unformatted] Status: WP - Submitter: Paolo Carlini Date: 2006-02-12

-

View all other issues in [istream.unformatted].

-

View all issues with WP status.

-

Discussion:

-

-In the most recent working draft, I'm still seeing: -

- -
seekg(off_type& off, ios_base::seekdir dir)
-
- -

-and -

- -
seekp(pos_type& pos)
-
-seekp(off_type& off, ios_base::seekdir dir)
-
- -

-that is, by reference off and pos arguments. -

- - -

Proposed resolution:

-

-After 27.6.1.3p42 change: -

- -
basic_istream<charT,traits>& seekg(off_type& off, ios_base::seekdir dir);
-
- -

-After 27.6.2.4p1 change: -

- -
basic_ostream<charT,traits>& seekp(pos_type& pos);
-
- -

-After 27.6.2.4p3 change: -

- -
basic_ostream<charT,traits>& seekp(off_type& off, ios_base::seekdir dir);
-
- - - - - -
-

538. 241 again: Does unique_copy() require CopyConstructible and Assignable?

-

Section: 25.2.9 [alg.unique] Status: WP - Submitter: Howard Hinnant Date: 2006-02-09

-

View all other issues in [alg.unique].

-

View all issues with WP status.

-

Discussion:

-

-I believe I botched the resolution of - -241 "Does unique_copy() require CopyConstructible and Assignable?" which now -has WP status. -

- -

-This talks about unique_copy requirements and currently reads: -

- -

--5- Requires: The ranges [first, last) and -[result, result+(last-first)) -shall not overlap. The expression *result = *first shall -be valid. If neither InputIterator nor OutputIterator meets the -requirements of forward iterator then the value type of InputIterator -must be CopyConstructible (20.1.3). Otherwise CopyConstructible is not required. -

- -

-The problem (which Paolo discovered) is that when the iterators are at their -most restrictive (InputIterator, OutputIterator), then we want -InputIterator::value_type to be both CopyConstructible and -CopyAssignable (for the most efficient implementation). However this -proposed resolution only makes it clear that it is CopyConstructible, -and that one can assign from *first to *result. -This latter requirement does not necessarily imply that you can: -

- -
*first = *first;
-
- - -

Proposed resolution:

-

--5- Requires: The ranges [first, last) and -[result, result+(last-first)) -shall not overlap. The expression *result = *first -shall -be valid. If neither InputIterator nor OutputIterator meets the -requirements of forward iterator then the value type -value_type of InputIterator -must be CopyConstructible (20.1.3) and Assignable. -Otherwise CopyConstructible is not required. -

- - - - - -
-

540. shared_ptr<void>::operator*()

-

Section: 20.6.6.2.5 [util.smartptr.shared.obs], TR1 2.2.3.5 [tr.util.smartptr.shared.obs] Status: WP - Submitter: Martin Sebor Date: 2005-10-15

-

View all other issues in [util.smartptr.shared.obs].

-

View all issues with WP status.

-

Discussion:

-

-I'm trying to reconcile the note in tr.util.smartptr.shared.obs, p6 -that talks about the operator*() member function of shared_ptr: -

- -

- Notes: When T is void, attempting to instantiate this member function - renders the program ill-formed. [Note: Instantiating shared_ptr<void> - does not necessarily result in instantiating this member function. - --end note] -

- -

-with the requirement in temp.inst, p1: -

- -

- The implicit instantiation of a class template specialization causes - the implicit instantiation of the declarations, but not of the - definitions... -

- -

-I assume that what the note is really trying to say is that -"instantiating shared_ptr<void> *must not* result in instantiating -this member function." That is, that this function must not be -declared a member of shared_ptr<void>. Is my interpretation -correct? -

- - -

Proposed resolution:

-

-Change 2.2.3.5p6 -

- -

--6- Notes: When T is void, attempting to instantiate -this member function renders the program ill-formed. [Note: -Instantiating shared_ptr<void> does not necessarily result in -instantiating this member function. --end note] it is -unspecified whether this member function is declared or not, and if so, what its -return type is, except that the declaration (although not necessarily the -definition) of the function shall be well-formed. -

- - - - - - -
-

541. shared_ptr template assignment and void

-

Section: 20.6.6.2 [util.smartptr.shared], TR1 2.2.3 [tr.util.smartptr.shared] Status: WP - Submitter: Martin Sebor Date: 2005-10-16

-

View other active issues in [util.smartptr.shared].

-

View all other issues in [util.smartptr.shared].

-

View all issues with WP status.

-

Discussion:

-

-Is the void specialization of the template assignment operator taking -a shared_ptr<void> as an argument supposed be well-formed? -

-

-I.e., is this snippet well-formed: -

-
shared_ptr<void> p;
-p.operator=<void>(p);
-
- -

-Gcc complains about auto_ptr<void>::operator*() returning a reference -to void. I suspect it's because shared_ptr has two template assignment -operators, one of which takes auto_ptr, and the auto_ptr template gets -implicitly instantiated in the process of overload resolution. -

- -

-The only way I see around it is to do the same trick with auto_ptr<void> -operator*() as with the same operator in shared_ptr<void>. -

- -

-PS Strangely enough, the EDG front end doesn't mind the code, even -though in a small test case (below) I can reproduce the error with -it as well. -

- -
template <class T>
-struct A { T& operator*() { return *(T*)0; } };
-
-template <class T>
-struct B {
-    void operator= (const B&) { }
-    template <class U>
-    void operator= (const B<U>&) { }
-    template <class U>
-    void operator= (const A<U>&) { }
-};
-
-int main ()
-{
-    B<void> b;
-    b.operator=<void>(b);
-}
-
- - -

Proposed resolution:

-

-In [lib.memory] change: -

-
template<class X> class auto_ptr;
-template<> class auto_ptr<void>;
-
- -

-In [lib.auto.ptr]/2 add the following before the last closing brace: -

- -
template<> class auto_ptr<void>
-{
-public:
-    typedef void element_type;
-};
-
- - - - - - -
-

542. shared_ptr observers

-

Section: 20.6.6.2.5 [util.smartptr.shared.obs], TR1 2.2.3.5 [tr.util.smartptr.shared.obs] Status: WP - Submitter: Martin Sebor Date: 2005-10-18

-

View all other issues in [util.smartptr.shared.obs].

-

View all issues with WP status.

-

Discussion:

-

-Peter Dimov wrote: -To: C++ libraries mailing list -Message c++std-lib-15614 -[...] -The intent is for both use_count() and unique() to work in a threaded environment. -They are intrinsically prone to race conditions, but they never return garbage. -

- -

-This is a crucial piece of information that I really wish were -captured in the text. Having this in a non-normative note would -have made everything crystal clear to me and probably stopped -me from ever starting this discussion :) Instead, the sentence -in p12 "use only for debugging and testing purposes, not for -production code" very strongly suggests that implementations -can and even are encouraged to return garbage (when threads -are involved) for performance reasons. -

-

-How about adding an informative note along these lines: -

-

- Note: Implementations are encouraged to provide well-defined - behavior for use_count() and unique() even in the presence of - multiple threads. -

-

-I don't necessarily insist on the exact wording, just that we -capture the intent. -

- - -

Proposed resolution:

-

-Change 20.6.6.2.5 [util.smartptr.shared.obs] p12: -

-

-[Note: use_count() is not necessarily efficient. Use only for -debugging and testing purposes, not for production code. --end note] -

- -

-Change 20.6.6.3.5 [util.smartptr.weak.obs] p3: -

-

-[Note: use_count() is not necessarily efficient. Use only for -debugging and testing purposes, not for production code. --end note] -

- - - - - -
-

543. valarray slice default constructor

-

Section: 26.5.4 [class.slice] Status: WP - Submitter: Howard Hinnant Date: 2005-11-03

-

View all issues with WP status.

-

Discussion:

-

-If one explicitly constructs a slice or glice with the default -constructor, does the standard require this slice to have any usable -state? It says "creates a slice which specifies no elements", which -could be interpreted two ways: -

-
    -
  1. There are no elements to which the slice refers (i.e. undefined).
  2. -
  3. The slice specifies an array with no elements in it (i.e. defined).
  4. -
-

-Here is a bit of code to illustrate: -

-
#include <iostream>
-#include <valarray>
-
-int main()
-{
-    std::valarray<int> v(10);
-    std::valarray<int> v2 = v[std::slice()];
-    std::cout << "v[slice()].size() = " << v2.size() << '\n';
-}
-
- -

-Is the behavior undefined? Or should the output be: -

- -
v[slice()].size() = 0
-
- -

-There is a similar question and wording for gslice at 26.3.6.1p1. -

- - -

Proposed resolution:

- -

[Martin suggests removing the second sentence in 26.5.4.1 [cons.slice] as well.]

- - -

-Change 26.5.4.1 [cons.slice]: -

- -

-1 - The default constructor for slice creates a slice -which specifies no elements. The default constructor is equivalent to -slice(0, 0, 0). A default constructor is provided only to permit -the declaration of arrays of slices. The constructor with arguments for a slice -takes a start, length, and stride parameter. -

- -

-Change 26.5.6.1 [gslice.cons]: -

- -

-1 - The default constructor creates a gslice which specifies no -elements. The default constructor is equivalent to gslice(0, -valarray<size_t>(), valarray<size_t>()). The constructor -with arguments builds a gslice based on a specification of start, -lengths, and strides, as explained in the previous section. -

- - - - - - -
-

545. When is a deleter deleted?

-

Section: 20.6.6.2.11 [util.smartptr.getdeleter], TR1 2.2.3.2 [tr.util.smartptr.shared.dest] Status: WP - Submitter: Matt Austern Date: 2006-01-10

-

View all other issues in [util.smartptr.getdeleter].

-

View all issues with WP status.

-

Discussion:

-

-The description of ~shared_ptr doesn't say when the shared_ptr's deleter, if -any, is destroyed. In principle there are two possibilities: it is destroyed -unconditionally whenever ~shared_ptr is executed (which, from an implementation -standpoint, means that the deleter is copied whenever the shared_ptr is copied), -or it is destroyed immediately after the owned pointer is destroyed (which, from -an implementation standpoint, means that the deleter object is shared between -instances). We should say which it is. -

- - -

Proposed resolution:

-

-Add after the first sentence of 20.6.6.2.11 [util.smartptr.getdeleter]/1: -

-
-

-The returned pointer remains valid as long as there exists a shared_ptr instance -that owns d. -

-

-[Note: it is unspecified whether the pointer remains valid longer than that. -This can happen if the implementation doesn't destroy the deleter until all -weak_ptr instances in the ownership group are destroyed. -- end note] -

-
- - - - - -
-

551. <ccomplex>

-

Section: 26.3.11 [cmplxh], TR1 8.3 [tr.c99.cmplxh] Status: WP - Submitter: Howard Hinnant Date: 2006-01-23

-

View all issues with WP status.

-

Discussion:

-

-Previously xxx.h was parsable by C++. But in the case of C99's <complex.h> -it isn't. Otherwise we could model it just like <string.h>, <cstring>, <string>: -

- -
    -
  • <string> : C++ API in namespace std
  • -
  • <cstring> : C API in namespace std
  • -
  • <string.h> : C API in global namespace
  • -
- -

-In the case of C's complex, the C API won't compile in C++. So we have: -

- -
    -
  • <complex> : C++ API in namespace std
  • -
  • <ccomplex> : ?
  • -
  • <complex.h> : ?
  • -
- -

-The ? can't refer to the C API. TR1 currently says: -

- -
    -
  • <complex> : C++ API in namespace std
  • -
  • <ccomplex> : C++ API in namespace std
  • -
  • <complex.h> : C++ API in global namespace
  • -
- - - -

Proposed resolution:

-

-Change 26.3.11 [cmplxh]: -

- -
-

-The header behaves as if it includes the header -<ccomplex>., and provides sufficient using -declarations to declare in the global namespace all function and type names -declared or defined in the neader <complex>. -[Note: <complex.h> does not promote any interface -into the global namespace as there is no C interface to promote. --end -note] -

-
- - - - - - -
-

552. random_shuffle and its generator

-

Section: 25.2.12 [alg.random.shuffle] Status: WP - Submitter: Martin Sebor Date: 2006-01-25

-

View all issues with WP status.

-

Discussion:

-

-...is specified to shuffle its range by calling swap but not how -(or even that) it's supposed to use the RandomNumberGenerator -argument passed to it. -

-

-Shouldn't we require that the generator object actually be used -by the algorithm to obtain a series of random numbers and specify -how many times its operator() should be invoked by the algorithm? -

- -

-See N2391 and -N2423 -for some further discussion. -

- - - -

Proposed resolution:

-

-Adopt the proposed resolution in -N2423. -

- - -

[ -Kona (2007): The LWG adopted the proposed resolution of N2423 for this issue. -The LWG voted to accelerate this issue to Ready status to be voted into the WP at Kona. -]

- - - - - -
-

559. numeric_limits<const T>

-

Section: 18.2.1 [limits] Status: WP - Submitter: Martin Sebor Date: 2006-02-19

-

View all other issues in [limits].

-

View all issues with WP status.

-

Discussion:

-

- -18.2.1 [limits], p2 requires implementations to provide specializations of the -numeric_limits template for each scalar type. While this -could be interepreted to include cv-qualified forms of such types such -an interepretation is not reflected in the synopsis of the -<limits> header. - -

-

- -The absence of specializations of the template on cv-qualified forms -of fundamental types makes numeric_limits difficult to -use in generic code where the constness (or volatility) of a type is -not always immediately apparent. In such contexts, the primary -template ends up being instantiated instead of the provided -specialization, typically yielding unexpected behavior. - -

-

- -Require that specializations of numeric_limits on -cv-qualified fundamental types have the same semantics as those on the -unqualifed forms of the same types. - -

- - -

Proposed resolution:

-

- -Add to the synopsis of the <limits> header, -immediately below the declaration of the primary template, the -following: -

- -
-template <class T> class numeric_limits<const T>;
-template <class T> class numeric_limits<volatile T>;
-template <class T> class numeric_limits<const volatile T>;
-
-
- -

- -Add a new paragraph to the end of 18.2.1.1 [numeric.limits], with the following -text: - -

-

- --new-para- The value of each member of a numeric_limits -specialization on a cv-qualified T is equal to the value of the same -member of numeric_limits<T>. - -

- -

[ -Portland: Martin will clarify that user-defined types get cv-specializations -automatically. -]

- - - - - - - -
-

566. array forms of unformatted input function undefined for zero-element arrays

-

Section: 27.6.1.3 [istream.unformatted] Status: WP - Submitter: Martin Sebor Date: 2006-02-23

-

View all other issues in [istream.unformatted].

-

View all issues with WP status.

-

Discussion:

-

- -The array forms of unformatted input functions don't have well-defined -semantics for zero-element arrays in a couple of cases. The affected -ones (istream::get() and getline()) are supposed to -terminate when (n - 1) characters are stored, which obviously -can never be true when (n == 0) to start with. - -

- - -

Proposed resolution:

-

- -I propose the following changes (references are relative to the -Working Draft (document N1804). - -

-

- -Change 27.6.1.3, p8 (istream::get()), bullet 1 as follows: - -

-
-

- -if (n < 1) is true or (n - 1) -characters are stored; - -

-
-

- -Similarly, change 27.6.1.3, p18 (istream::getline()), bullet -3 as follows: - -

-
-

- -(n < 1) is true or (n - 1) characters -are stored (in which case the function calls -setstate(failbit)). - -

-
-

- -Finally, change p21 as follows: - -

-
-

- -In any case, provided (n > 0) is true, it then -stores a null character (using charT()) into the next successive -location of the array. - -

-
- - - - - -
-

575. the specification of ~shared_ptr is MT-unfriendly, makes implementation assumptions

-

Section: 20.6.6.2.2 [util.smartptr.shared.dest], TR1 2.2.3.2 [tr.util.smartptr.shared.dest] Status: WP - Submitter: Peter Dimov Date: 2006-04-23

-

View all issues with WP status.

-

Discussion:

-

-[tr.util.smartptr.shared.dest] says in its second bullet: -

- -

-"If *this shares ownership with another shared_ptr instance (use_count() > 1), -decrements that instance's use count." -

- -

-The problem with this formulation is that it presupposes the existence of an -"use count" variable that can be decremented and that is part of the state of a -shared_ptr instance (because of the "that instance's use count".) -

- -

-This is contrary to the spirit of the rest of the specification that carefully -avoids to require an use count variable. Instead, use_count() is specified to -return a value, a number of instances. -

- -

-In multithreaded code, the usual implicit assumption is that a shared variable -should not be accessed by more than one thread without explicit synchronization, -and by introducing the concept of an "use count" variable, the current wording -implies that two shared_ptr instances that share ownership cannot be destroyed -simultaneously. -

- -

-In addition, if we allow the interpretation that an use count variable is part -of shared_ptr's state, this would lead to other undesirable consequences WRT -multiple threads. For example, -

- -
p1 = p2;
-
- -

-would now visibly modify the state of p2, a "write" operation, requiring a lock. -

- - -

Proposed resolution:

-

-Change the first two bullets of [lib.util.smartptr.shared.dest]/1 to: -

- -
-
    -
  • If *this is empty or shares ownership with another -shared_ptr instance (use_count() > 1), there are no side effects.
  • -
  • If *this shares ownership with another shared_ptr instance -(use_count() > 1), decrements that instance's use count.
  • -
-
- -

-Add the following paragraph after [lib.util.smartptr.shared.dest]/1: -

- -

-[Note: since the destruction of *this decreases the number of instances in -*this's ownership group by one, all shared_ptr instances that share ownership -with *this will report an use_count() that is one lower than its previous value -after *this is destroyed. --end note] -

- - - - - -
-

576. find_first_of is overconstrained

-

Section: 25.1.4 [alg.find.first.of] Status: WP - Submitter: Doug Gregor Date: 2006-04-25

-

View all other issues in [alg.find.first.of].

-

View all issues with WP status.

-

Discussion:

-

-In 25.1.4 Find First [lib.alg.find.first], the two iterator type parameters to -find_first_of are specified to require Forward Iterators, as follows: -

- -
template<class ForwardIterator1, class ForwardIterator2>
-  ForwardIterator1
-  find_first_of(ForwardIterator1 first1, ForwardIterator1 last1,
-                        ForwardIterator2 first2, ForwardIterator2 last2);
-template<class ForwardIterator1, class ForwardIterator2,
-                  class BinaryPredicate>
-ForwardIterator1
-  find_first_of(ForwardIterator1 first1, ForwardIterator1 last1,
-                         ForwardIterator2 first2, ForwardIterator2 last2,
-                        BinaryPredicate pred);
-
- -

-However, ForwardIterator1 need not actually be a Forward Iterator; an Input -Iterator suffices, because we do not need the multi-pass property of the Forward -Iterator or a true reference. -

- - -

Proposed resolution:

-

-Change the declarations of find_first_of to: -

- -
template<class ForwardIterator1InputIterator1, class ForwardIterator2>
-  ForwardIterator1InputIterator1
-  find_first_of(ForwardIterator1InputIterator1 first1, ForwardIterator1InputIterator1 last1,
-                        ForwardIterator2 first2, ForwardIterator2 last2);
-template<class ForwardIterator1InputIterator1, class ForwardIterator2,
-                  class BinaryPredicate>
-ForwardIterator1InputIterator1
-  find_first_of(ForwardIterator1InputIterator1 first1, ForwardIterator1InputIterator1 last1,
-                         ForwardIterator2 first2, ForwardIterator2 last2,
-                        BinaryPredicate pred);
-
- - - - - - -
-

577. upper_bound(first, last, ...) cannot return last

-

Section: 25.3.3.2 [upper.bound] Status: WP - Submitter: Seungbeom Kim Date: 2006-05-03

-

View all issues with WP status.

-

Discussion:

-

-ISO/IEC 14882:2003 says: -

- -
-

-25.3.3.2 upper_bound -

-

-Returns: The furthermost iterator i in the range -[first, last) such that -for any iterator j in the range [first, i) the following corresponding -conditions hold: !(value < *j) or comp(value, *j) == false. -

-
- -

-From the description above, upper_bound cannot return last, since it's -not in the interval [first, last). This seems to be a typo, because if -value is greater than or equal to any other values in the range, or if -the range is empty, returning last seems to be the intended behaviour. -The corresponding interval for lower_bound is also [first, last]. -

- - -

Proposed resolution:

-

-Change [lib.upper.bound]: -

- -
-

-Returns: The furthermost iterator i in the range -[first, last)] such that -for any iterator j in the range [first, i) the following corresponding -conditions hold: !(value < *j) or comp(value, *j) == false. -

-
- - - - - - -
-

578. purpose of hint to allocator::allocate()

-

Section: 20.6.1.1 [allocator.members] Status: WP - Submitter: Martin Sebor Date: 2006-05-17

-

View all other issues in [allocator.members].

-

View all issues with WP status.

-

Discussion:

-

- -The description of the allocator member function -allocate() requires that the hint argument be -either 0 or a value previously returned from allocate(). -Footnote 227 further suggests that containers may pass the address of -an adjacent element as this argument. - -

-

- -I believe that either the footnote is wrong or the normative -requirement that the argument be a value previously returned from a -call to allocate() is wrong. The latter is supported by -the resolution to issue 20-004 proposed in c++std-lib-3736 by Nathan -Myers. In addition, the hint is an ordinary void* and not the -pointer type returned by allocate(), with -the two types potentially being incompatible and the requirement -impossible to satisfy. - -

-

- -See also c++std-lib-14323 for some more context on where this came up -(again). - -

- - -

Proposed resolution:

-

- -Remove the requirement in 20.6.1.1, p4 that the hint be a value -previously returned from allocate(). Specifically, change -the paragraph as follows: - -

-

-Requires: hint either 0 or previously obtained from member -allocate and not yet passed to member deallocate. -The value hint may be used by an implementation to help improve performance -223). [Note: The value hint may be used by an -implementation to help improve performance. -- end note] -

-

-[Footnote: 223)In a container member function, the address of an -adjacent element is often a good choice to pass for this argument. -

- - - - -
-

586. string inserter not a formatted function

-

Section: 21.3.8.9 [string.io] Status: WP - Submitter: Martin Sebor Date: 2006-06-22

-

View all other issues in [string.io].

-

View all issues with WP status.

-

Discussion:

-

- -Section and paragraph numbers in this paper are relative to the -working draft document number N2009 from 4/21/2006. - -

- -

- -The basic_string extractor in 21.3.7.9, p1 is clearly -required to behave as a formatted input function, as is the -std::getline() overload for string described in p7. - -

-

- -However, the basic_string inserter described in p5 of the -same section has no such requirement. This has implications on how the -operator responds to exceptions thrown from xsputn() -(formatted output functions are required to set badbit -and swallow the exception unless badbit is also set in -exceptions(); the string inserter doesn't have any such -requirement). - -

-

- -I don't see anything in the spec for the string inserter that would -justify requiring it to treat exceptions differently from all other -similar operators. (If it did, I think it should be made this explicit -by saying that the operator "does not behave as a formatted output -function" as has been made customary by the adoption of the resolution -of issue 60). - -

- - -

Proposed resolution:

-

- -I propose to change the Effects clause in 21.3.7.9, p5, as follows: - -

-
-

- -Effects: Begins by constructing a sentry object k as if k -were constructed by typename basic_ostream<charT, -traits>::sentry k (os). If bool(k) is -true, Behaves as a formatted output function -(27.6.2.5.1). After constructing a sentry object, if -this object returns true when converted to a value of -type bool, determines padding as described in -22.2.2.2.2, then inserts the resulting sequence of characters -seq as if by calling os.rdbuf()->sputn(seq , -n), where n is the larger of -os.width() and str.size(); then calls -os.width(0). If the call to sputn fails, calls -os.setstate(ios_base::failbit). - -

-
-

- -This proposed resilution assumes the resolution of issue 394 (i.e., -that all formatted output functions are required to set -ios_base::badbit in response to any kind of streambuf -failure), and implicitly assumes that a return value of -sputn(seq, n) other than n -indicates a failure. - -

- - - - -
-

589. Requirements on iterators of member template functions of containers

-

Section: 23.1 [container.requirements] Status: WP - Submitter: Peter Dimov Date: 2006-08-02

-

View other active issues in [container.requirements].

-

View all other issues in [container.requirements].

-

View all issues with WP status.

-

Duplicate of: 536

-

Discussion:

-

-There appears to be no requirements on the InputIterators used in sequences in 23.1.1 in -terms of their value_type, and the requirements in 23.1.2 appear to be overly strict -(requires InputIterator::value_type be the same type as the container's value_type). -

- - -

Proposed resolution:

-

-Change 23.1.1 p3: -

- -

-In Tables 82 and 83, X denotes a sequence class, a denotes a -value of X, i and j denote iterators satisfying input -iterator requirements and refer to elements implicitly -convertible to value_type, [i, j) denotes a valid -range, n denotes a value of X::size_type, p denotes a -valid iterator to a, q denotes a valid dereferenceable -iterator to a, [q1, q2) denotes a valid range in a, -and t denotes a value of X::value_type. -

- -

-Change 23.1.2 p7: -

- -

-In Table 84, X is an associative container class, a is a value -of X, a_uniq is a value of X when X supports -unique keys, and a_eq is a value of X when X supports -multiple keys, i and j satisfy input iterator requirements and -refer to elements of implicitly convertible to -value_type, [i, j) is a valid range, p is a valid -iterator to a, q is a valid dereferenceable iterator to -a, [q1, q2) is a valid range in a, t is a -value of X::value_type, k is a value of X::key_type -and c is a value of type X::key_compare. -

- - - -

Rationale:

-

-Concepts will probably come in and rewrite this section anyway. But just in case it is -easy to fix this up as a safety net and as a clear statement of intent. -

- - - - - -
-

593. __STDC_CONSTANT_MACROS

-

Section: 18.3 [cstdint], TR1 8.22 [tr.c99.cstdint] Status: WP - Submitter: Walter Brown Date: 2006-08-28

-

View all other issues in [cstdint].

-

View all issues with WP status.

-

Discussion:

-

-Clause 18.3 of the current Working Paper (N2009) deals with the new C++ headers -<cstdint> and <stdint.h>. These are of course based on the C99 header -<stdint.h>, and were part of TR1. -

- -

-Per 18.3.1/1, these headers define a number of macros and function macros. -While the WP does not mention __STDC_CONSTANT_MACROS in this context, C99 -footnotes do mention __STDC_CONSTANT_MACROS. Further, 18.3.1/2 states that "The -header defines all ... macros the same as C99 subclause 7.18." -

- -

-Therefore, if I wish to have the above-referenced macros and function macros -defined, must I #define __STDC_CONSTANT_MACROS before I #include <cstdint>, or -does the C++ header define these macros/function macros unconditionally? -

- - -

Proposed resolution:

-

-To put this issue to rest for C++0X, I propose the following addition to -18.3.1/2 of the Working Paper N2009: -

- -

-[Note: The macros defined by <cstdint> are provided unconditionally: in -particular, the symbols __STDC_LIMIT_MACROS and __STDC_CONSTANT_MACROS -(mentioned in C99 footnotes 219, 220, and 222) play no role in C++. --end note] -

- - - - - -
-

598. Decimal: Conversion to integral should truncate, not round.

-

Section: TRDecimal 3.2 [trdec.types.types] Status: TRDec - Submitter: Daniel Krugler Date: 2006-05-28

-

View other active issues in [trdec.types.types].

-

View all other issues in [trdec.types.types].

-

View all issues with TRDec status.

-

Discussion:

- -

-In a private email, Daniel writes: -

-
-

-I would like to -ask, what where the reason for the decision to -define the semantics of the integral conversion of the decimal types, namely -

-
"operator long long() const;
-
-     Returns: Returns the result of the 
-conversion of *this to the type long long, as if 
-performed by the expression llrounddXX(*this)."
-
-

-where XX stands for either 32, 64, or 128, -corresponding to the proper decimal type. The -exact meaning of llrounddXX is not given in that -paper, so I compared it to the corresponding -definition given in C99, 2nd edition (ISO 9899), which says in 7.12.9.7 p. 2: -

-

-"The lround and llround functions round their -argument to the nearest integer value, -rounding halfway cases away from zero, regardless -of the current rounding direction. [..]" -

-

-Now considering the fact that integral conversion -of the usual floating-point types ("4.9 -Floating-integral conversions") has truncation -semantic I wonder why this conversion behaviour -has not been transferred for the decimal types. -

-
-

-Robert comments: -

-

-Also, there is a further error in the Returns: clause for converting decimal::decimal128 to long long. It currently calls llroundd64, not llroundd128. -

- - - -

Proposed resolution:

-

-Change the Returns: clause in 3.2.2.4 to: -

-

-Returns: Returns the result of the conversion of *this to the type long long, as if performed by the expression llroundd32(*this) while the decimal rounding direction mode [3.5.2] FE_DEC_TOWARD_ZERO is in effect. -

-

-Change the Returns: clause in 3.2.3.4 to: -

-

-Returns: Returns the result of the conversion of *this to the type long long, as if performed by the expression llroundd64(*this) while the decimal rounding direction mode [3.5.2] FE_DEC_TOWARD_ZERO is in effect. -

-

-Change the Returns: clause in 3.2.4.4 to: -

-

-Returns: Returns the result of the conversion of *this to the type long long, as if performed by the expression llroundd64(*this) llroundd128(*this) while the decimal rounding direction mode [3.5.2] FE_DEC_TOWARD_ZERO is in effect. -

- - - - - - -
-

599. Decimal: Say "octets" instead of "bytes."

-

Section: TRDecimal 3.1 [trdec.types.encodings] Status: TRDec - Submitter: Daniel Krugler Date: 2006-05-28

-

View all issues with TRDec status.

-

Discussion:

-

-Daniel writes in a private email: -

- -
-

-- 3.1 'Decimal type encodings' says in its note: -

-
"this implies that 
-sizeof(std::decimal::decimal32) == 4, 
-sizeof(std::decimal::decimal64) == 8, and 
-sizeof(std::decimal::decimal128) == 16."
-
-

-This is a wrong assertion, because the definition -of 'byte' in 1.7 'The C+ + memory model' of ISO -14882 (2nd edition) does not specify that a byte -must be necessarily 8 bits large, which would be -necessary to compare with the specified bit sizes -of the types decimal32, decimal64, and decimal128. -

-
- - -

Proposed resolution:

-

-Change 3.1 as follows: -

-
-

-The three decimal encoding formats defined in IEEE-754R correspond to the three decimal floating types as follows: -

-
    -
  • -decimal32 is a decimal32 number, which is encoded in four consecutive bytes octets (32 bits) -
  • -
  • -decimal64 is a decimal64 number, which is encoded in eight consecutive bytes octets (64 bits) - -
  • -
  • -decimal128 is a decimal128 number, which is encoded in 16 consecutive bytes octets (128 bits) -
  • -
-

-[Note: this implies that sizeof(std::decimal::decimal32) == 4, sizeof(std::decimal::decimal64) == 8, and sizeof(std::decimal::decimal128) == 16. --end note] -

-
- - - - -
-

600. Decimal: Wrong parameters for wcstod* functions

-

Section: TRDecimal 3.9 [trdec.types.cwchar] Status: TRDec - Submitter: Daniel Krugler Date: 2006-05-28

-

View all issues with TRDec status.

-

Discussion:

-

-Daniel writes: -

-

-- 3.9.1 'Additions to <cwchar>' provides wrong -signatures to the wcstod32, wcstod64, and -wcstod128 functions ([the parameters have type pointer-to-] char instead of wchar_t). -

- - -

Proposed resolution:

-

-Change "3.9.1 Additions to <cwchar> synopsis" to: -

-
       namespace std {
-       namespace decimal {
-         // 3.9.2 wcstod functions:
-         decimal32  wcstod32  (const char wchar_t * nptr, char wchar_t ** endptr);
-         decimal64  wcstod64  (const char wchar_t * nptr, char wchar_t ** endptr);
-         decimal128 wcstod128 (const char wchar_t * nptr, char wchar_t ** endptr);
-       }
-       }
-
- - - - -
-

601. Decimal: numeric_limits typos

-

Section: TRDecimal 3.3 [trdec.types.limits] Status: TRDec - Submitter: Daniel Krugler Date: 2006-05-28

-

View all issues with TRDec status.

-

Discussion:

-

-Daniel writes in a private email: -

- -
-

-- 3.3 'Additions to header <limits>' contains two -errors in the specialisation of numeric_limits<decimal::decimal128>: -

-
    -
  1. The static member max() returns DEC128_MIN, this should be DEC128_MAX.
  2. -
  3. The static member digits is assigned to 384, -this should be 34 (Probably mixed up with the -max. exponent for decimal::decimal64).
  4. -
-
- - -

Proposed resolution:

-

-In "3.3 Additions to header <limits>" change numeric_limits<decimal::decimal128> as follows: -

-
        template<> class numeric_limits<decimal::decimal128> {
-          public:
-            static const bool is_specialized = true;
-
-            static decimal::decimal128 min() throw() { return DEC128_MIN; }
-            static decimal::decimal128 max() throw() { return DEC128_MIN; DEC128_MAX; }
-
-            static const int digits       = 384 34;
-            /* ... */
-
- - - - -
-

602. Decimal: "generic floating type" not defined.

-

Section: TRDecimal 3 [trdec.types] Status: TRDec - Submitter: Daniel Krugler Date: 2006-05-28

-

View all other issues in [trdec.types].

-

View all issues with TRDec status.

-

Discussion:

-

-The document uses the term "generic floating types," but defines it nowhere. -

- - -

Proposed resolution:

-

-Change the first paragraph of "3 Decimal floating-point types" as follows: -

-

-This Technical Report introduces three decimal floating-point types, named -decimal32, decimal64, and decimal128. The set of values of type decimal32 is a -subset of the set of values of type decimal64; the set of values of the type -decimal64 is a subset of the set of values of the type decimal128. Support for -decimal128 is optional. These types supplement the Standard C++ types -float, double, and long double, which are -collectively described as the basic floating types. -

- - - - -
-

603. Decimal: Trivially simplifying decimal classes.

-

Section: TRDecimal 3 [trdec.types] Status: TRDec - Submitter: Martin Sebor Date: 2006-05-28

-

View all other issues in [trdec.types].

-

View all issues with TRDec status.

-

Discussion:

-

In c++std-lib-17198, Martin writes:

- -

-Each of the three classes proposed in the paper (decimal32, decimal64, -and decimal128) explicitly declares and specifies the semantics of its -copy constructor, copy assignment operator, and destructor. Since the -semantics of all three functions are identical to the trivial versions -implicitly generated by the compiler in the absence of any declarations -it is safe to drop them from the spec. This change would make the -proposed classes consistent with other similar classes already in the -standard (e.g., std::complex). -

- - -

Proposed resolution:

-

-Change "3.2.2 Class decimal32" as follows: -

-
      namespace std {
-      namespace decimal {
-        class decimal32 {
-          public:
-            // 3.2.2.1 construct/copy/destroy:
-            decimal32();
-            decimal32(const decimal32 & d32);
-            decimal32 & operator=(const decimal32 & d32);
-            ~decimal32();
-            /* ... */
-
-

-Change "3.2.2.1 construct/copy/destroy" as follows: -

-
        decimal32();
-
-    Effects: Constructs an object of type decimal32 with the value 0;
-
-        decimal32(const decimal32 & d32);
-        decimal32 & operator=(const decimal32 & d32);
-
-    Effects: Copies an object of type decimal32.
-
-        ~decimal32();
-
-    Effects: Destroys an object of type decimal32.
-
-
-

-Change "3.2.3 Class decimal64" as follows: -

-
      namespace std {
-      namespace decimal {
-        class decimal64 {
-          public:
-            // 3.2.3.1 construct/copy/destroy:
-            decimal64();
-            decimal64(const decimal64 & d64);
-            decimal64 & operator=(const decimal64 & d64);
-            ~decimal64();
-            /* ... */
-
-

-Change "3.2.3.1 construct/copy/destroy" as follows: -

-
        decimal64();
-
-    Effects: Constructs an object of type decimal64 with the value 0;
-
-        decimal64(const decimal64 & d64);
-        decimal64 & operator=(const decimal64 & d64);
-
-    Effects: Copies an object of type decimal64.
-
-        ~decimal64();
-
-    Effects: Destroys an object of type decimal64.
-
-
-

-Change "3.2.4 Class decimal128" as follows: -

-
      namespace std {
-      namespace decimal {
-        class decimal128 {
-          public:
-            // 3.2.4.1 construct/copy/destroy:
-            decimal128();
-            decimal128(const decimal128 & d128);
-            decimal128 & operator=(const decimal128 & d128);
-            ~decimal128();
-            /* ... */
-
-

-Change "3.2.4.1 construct/copy/destroy" as follows: -

-
        decimal128();
-
-    Effects: Constructs an object of type decimal128 with the value 0;
-
-        decimal128(const decimal128 & d128);
-        decimal128 & operator=(const decimal128 & d128);
-
-    Effects: Copies an object of type decimal128.
-
-        ~decimal128();
-
-    Effects: Destroys an object of type decimal128.
-
-
- - - - -
-

604. Decimal: Storing a reference to a facet unsafe.

-

Section: TRDecimal 3 [trdec.types] Status: TRDec - Submitter: Martin Sebor Date: 2006-05-28

-

View all other issues in [trdec.types].

-

View all issues with TRDec status.

-

Discussion:

-

-In c++std-lib-17197, Martin writes: -

-

-The extended_num_get and extended_num_put facets are designed -to store a reference to a num_get or num_put facet which the -extended facets delegate the parsing and formatting of types -other than decimal. One form of the extended facet's ctor (the -default ctor and the size_t overload) obtains the reference -from the global C++ locale while the other form takes this -reference as an argument. -

-

-The problem with storing a reference to a facet in another -object (as opposed to storing the locale object in which the -facet is installed) is that doing so bypasses the reference -counting mechanism designed to prevent a facet that is still -being referenced (i.e., one that is still installed in some -locale) from being destroyed when another locale that contains -it is destroyed. Separating a facet reference from the locale -it comes from van make it cumbersome (and in some cases might -even make it impossible) for programs to prevent invalidating -the reference. (The danger of this design is highlighted in -the paper.) -

-

-This problem could be easily avoided by having the extended -facets store a copy of the locale from which they would extract -the base facet either at construction time or when needed. To -make it possible, the forms of ctors of the extended facets that -take a reference to the base facet would need to be changed to -take a locale argument instead. -

- - -

Proposed resolution:

-

-1. Change the extended_num_get synopsis in 3.10.2 as follows: -

-
            extended_num_get(const std::num_get<charT, InputIterator> std::locale & b, size_t refs = 0);
-
-            /* ... */
-
-            // const std::num_get<charT, InputIterator> & base;        exposition only
-            // std::locale baseloc;                                    exposition only
-
-

-2. Change the description of the above constructor in 3.10.2.1: -

-
            extended_num_get(const std::num_get<charT, InputIterator> std::locale & b, size_t refs = 0);
-
-
-
-

-Effects: Constructs an extended_num_get facet as if by: -

-
       extended_num_get(const std::num_get<charT, InputIterator> std::locale & b, size_t refs = 0)
-                : facet(refs), baseloc(b)
-                { /* ... */ }
-
-
-

-Notes: Care must be taken by the implementation to ensure that the lifetime of the facet referenced by base exceeds that of the resulting extended_num_get facet. -

-
-

-3. Change the Returns: clause for do_get(iter_type, iter_type, ios_base &, ios_base::iostate &, bool &) const, et al to -

-

-Returns: base std::use_facet<std::num_get<charT, InputIterator> >(baseloc).get(in, end, str, err, val). -

-

-4. Change the extended_num_put synopsis in 3.10.3 as follows: -

-
            extended_num_put(const std::num_put<charT, OutputIterator> std::locale & b, size_t refs = 0);
-
-            /* ... */
-
-            // const std::num_put<charT, OutputIterator> & base;       exposition only
-            // std::locale baseloc;                                    exposition only
-
-

-5. Change the description of the above constructor in 3.10.3.1: -

-
            extended_num_put(const std::num_put<charT, OutputIterator> std::locale & b, size_t refs = 0);
-
-
-

-Effects: Constructs an extended_num_put facet as if by: -

-
       extended_num_put(const std::num_put<charT, OutputIterator> std::locale & b, size_t refs = 0)
-                : facet(refs), baseloc(b)
-                { /* ... */ }
-
-
-

-Notes: Care must be taken by the implementation to ensure that the lifetime of the facet referenced by base exceeds that of the resulting extended_num_put facet. -

-
-

-6. Change the Returns: clause for do_put(iter_type, ios_base &, char_type, bool &) const, et al to -

-

-Returns: base std::use_facet<std::num_put<charT, OutputIterator> >(baseloc).put(s, f, fill, val). -

- -

[ -Redmond: We would prefer to rename "extended" to "decimal". -]

- - - - - - -
-

605. Decimal: <decfloat.h> doesn't live here anymore.

-

Section: TRDecimal 3.4 [trdec.types.cdecfloat] Status: TRDec - Submitter: Robert Klarer Date: 2006-10-17

-

View all issues with TRDec status.

-

Discussion:

-

-In Berlin, WG14 decided to drop the <decfloat.h> header. The -contents of that header have been moved into <float.h>. For the -sake of C compatibility, we should make corresponding changes. -

- - -

Proposed resolution:

-

-1. Change the heading of subclause 3.4, "Headers <cdecfloat> and <decfloat.h>" to "Additions to headers <cfloat> and <float.h>." -

-

-2. Change the text of subclause 3.4 as follows: -

-
-

-The standard C++ headers <cfloat> and <float.h> define characteristics of the floating-point types float, double, and long double. Their contents remain unchanged by this Technical Report. -

-

-Headers <cdecfloat> and <decfloat.h> define characteristics of the decimal floating-point types decimal32, decimal64, and decimal128. As well, <decfloat.h> defines the convenience typedefs _Decimal32, _Decimal64, and _Decimal128, for compatibilty with the C programming language. -

-

-The header <cfloat> is described in [tr.c99.cfloat]. The header <float.h> -is described in [tr.c99.floath]. These headers are extended by this -Technical Report to define characteristics of the decimal -floating-point types decimal32, decimal64, and decimal128. As well, <float.h> is extended to define the convenience typedefs _Decimal32, _Decimal64, and _Decimal128 for compatibility with the C programming language. -

-
-

-3. Change the heading of subclause 3.4.1, "Header <cdecfloat> synopsis" to "Additions to header <cfloat> synopsis." -

-

-4. Change the heading of subclause 3.4.2, "Header <decfloat.h> synopsis" to "Additions to header <float.h> synopsis." -

-

-5. Change the contents of 3.4.2 as follows: -

-
      #include <cdecfloat>
-
-      // C-compatibility convenience typedefs:
-
-      typedef std::decimal::decimal32  _Decimal32;
-      typedef std::decimal::decimal64  _Decimal64;
-      typedef std::decimal::decimal128 _Decimal128;
-
- - - - - -
-

607. Concern about short seed vectors

-

Section: 26.4.7.1 [rand.util.seedseq] Status: Pending WP - Submitter: Charles Karney Date: 2006-10-26

-

View all other issues in [rand.util.seedseq].

-

View all issues with Pending WP status.

-

Discussion:

-

-Short seed vectors of 32-bit quantities all result in different states. However -this is not true of seed vectors of 16-bit (or smaller) quantities. For example -these two seeds -

- -
unsigned short seed = {1, 2, 3};
-unsigned short seed = {1, 2, 3, 0};
-
- -

-both pack to -

- -
unsigned seed = {0x20001, 0x3};
-
- -

-yielding the same state. -

- -

-See N2391 and -N2423 -for some further discussion. -

- - -

Proposed resolution:

-

-Adopt the proposed resolution in -N2423. -

- - -

[ -Kona (2007): The LWG adopted the proposed resolution of N2423 for this issue. -The LWG voted to accelerate this issue to Ready status to be voted into the WP at Kona. -]

- - - - - -
-

608. Unclear seed_seq construction details

-

Section: 26.4.7.1 [rand.util.seedseq] Status: Pending WP - Submitter: Charles Karney Date: 2006-10-26

-

View all other issues in [rand.util.seedseq].

-

View all issues with Pending WP status.

-

Discussion:

-

-In 26.4.7.1 [rand.util.seedseq] /6, the order of packing the inputs into b and the -treatment of signed quantities is unclear. Better to spell it out. -

- -

-See N2391 and -N2423 -for some further discussion. -

- - -

Proposed resolution:

-

-Adopt the proposed resolution in -N2423. -

- - -

[ -Kona (2007): The LWG adopted the proposed resolution of N2423 for this issue. -The LWG voted to accelerate this issue to Ready status to be voted into the WP at Kona. -]

- - - - - -
-

609. missing static const

-

Section: 26.4.4.2 [rand.adapt.ibits], TR1 5.1 [tr.rand] Status: WP - Submitter: Walter E. Brown Date: 2006-11-02

-

View all issues with WP status.

-

Discussion:

-

-In preparing N2111, an error on my part resulted in the omission of the -following line from the template synopsis in the cited section: -

- -
static const size_t word_size = w;
-
- -

-(This same constant is found, for example, in 26.4.3.3 [rand.eng.sub].) -

- - -

Proposed resolution:

-

-Add the above declaration as the first line after the comment in [rand.adapt.ibits] p4: -

- -
// engine characteristics
-static const size_t word_size = w;
-
- -

-and accept my apologies for the oversight. -

- - - - - -
-

610. Suggested non-normative note for C++0x

-

Section: 20.5.15.2.1 [func.wrap.func.con], TR1 3.7.2.1 [tr.func.wrap.func.con] Status: WP - Submitter: Scott Meyers Date: 2006-11-02

-

View all issues with WP status.

-

Discussion:

-

-My suggestion is that implementers of both tr1::function and its -official C++0x successor be explicitly encouraged (but not required) to -optimize for the cases mentioned above, i.e., function pointers and -small function objects. They could do this by using a small internal -buffer akin to the buffer used by implementations of the small string -optimization. (That would make this the small functor optimization -- -SFO :-}) The form of this encouragement could be a note in the standard -akin to footnote 214 of the current standard. -

- -

-Dave Abrahams notes: -

- -

-"shall not throw exceptions" should really be "nothing," both to be more -grammatical and to be consistent with existing wording in the standard. -

- -

-Doug Gregor comments: I think this is a good idea. Currently, implementations of -tr1::function are required to have non-throwing constructors and assignment -operators when the target function object is a function pointer or a -reference_wrapper. The common case, however, is for a tr1::function to store -either an empty function object or a member pointer + an object pointer. -

-

-The function implementation in the upcoming Boost 1.34.0 uses the -"SFO", so that the function objects for typical bind expressions like -

-
bind(&X::f, this, _1, _2, _3)
-
- -

-do not require heap allocation when stored in a boost::function. I -believe Dinkumware's implementation also performs this optimization. -

- - - -

Proposed resolution:

-

-Revise 20.5.14.2.1 p6 [func.wrap.func.con] to add a note as follows: -

- -
-

-Throws: shall not throw exceptions if f's target is a function -pointer or a function object passed via reference_wrapper. Otherwise, -may throw bad_alloc or any exception thrown by the copy constructor of -the stored function object. -

-

-Note: Implementations are encouraged to avoid the use of dynamically -allocated memory for "small" function objects, e.g., where f's target -is an object holding only a pointer or reference to an object and a member -function pointer (a "bound member function"). -

-
- - - - - -
-

611. Standard library templates and incomplete types

-

Section: 17.4.3.6 [res.on.functions] Status: WP - Submitter: Nicola Musatti Date: 2006-11-13

-

View all issues with WP status.

-

Discussion:

-

-In the latest available draft standard -(N2134) -§ 17.4.3.6 [res.on.functions] states: -

- -
-

--1- In certain cases (replacement functions, handler functions, operations on -types used to instantiate standard library template components), the C++ -Standard Library depends on components supplied by a C++ program. If these -components do not meet their requirements, the Standard places no requirements -on the implementation. -

- -

--2- In particular, the effects are undefined in the following cases: -

-

-[...] -

-
    -
  • if an incomplete type (3.9) is used as a template argument when -instantiating a template component.
  • -
-
- -

-This is contradicted by § 20.6.6.2/2 [util.smartptr.shared] which -states: -

- -
-

-[...] -

- -

-The template parameter T of shared_ptr may be an incomplete type. -

-
- - -

Proposed resolution:

-

-Modify the last bullet of § 17.4.3.6/2 [res.on.functions] to allow for -exceptions: -

- -
-
    -
  • if an incomplete type (3.9) is used as a template argument when -instantiating a template component, unless specifically allowed for the -component.
  • -
-
- - - - - - -
-

613. max_digits10 missing from numeric_limits

-

Section: 18.2.1.5 [numeric.special] Status: WP - Submitter: Bo Persson Date: 2006-11-20

-

View all other issues in [numeric.special].

-

View all issues with WP status.

-

Discussion:

-

-Section 18.2.1.5 [numeric.special] starts out by saying that "All members shall be provided -for all specializations." -

-

-Then it goes on to show specializations for float and bool, where one member -is missing (max_digits10). -

- -

-Maarten Kronenburg adds: -

- -

-I agree, just adding the comment that the exact number of decimal digits -is digits * ln(radix) / ln(10), where probably this real number is -rounded downward for digits10, and rounded upward for max_digits10 -(when radix=10, then digits10=max_digits10). -Why not add this exact definition also to the standard, so the user -knows what these numbers exactly mean. -

- -

-Howard adds: -

- -

-For reference, here are the correct formulas from -N1822: -

- -
digits10 = floor((digits-1) * log10(2))
-max_digits10 = ceil((1 + digits) * log10(2))
-
- -

-We are also missing a statement regarding for what specializations this member has meaning. -

- - - -

Proposed resolution:

-

-Change and add after 18.2.1.2 [numeric.limits.members], p11: -

- -
-
static const int max_digits10;
-
-

--11- Number of base 10 digits required to ensure that values which -differ by only one epsilon are always differentiated. -

-

--12- Meaningful for all floating point types. -

-
-
- -

-Change 18.2.1.5 [numeric.special], p2: -

- -
template<> class numeric_limits<float> { 
-public: 
-  static const bool is_specialized = true; 
-  ...
-  static const int digits10 = 6;
-  static const int max_digits10 = 9;
-  ...
-
- -

-Change 18.2.1.5 [numeric.special], p3: -

- -
template<> class numeric_limits<bool> { 
-public: 
-  static const bool is_specialized = true; 
-  ...
-  static const int digits10 = 0;
-  static const int max_digits10 = 0;
-  ...
-
- - - - - - - -
-

616. missing 'typename' in ctype_byname

-

Section: 22.2.1.2 [locale.ctype.byname] Status: WP - Submitter: Bo Persson Date: 2006-12-16

-

View all other issues in [locale.ctype.byname].

-

View all issues with WP status.

-

Discussion:

-

-Section 22.2.1.2 defines the ctype_byname class template. It contains the -line -

- -
typedef ctype<charT>::mask   mask;
-
- - - -

Proposed resolution:

-

-as this is a dependent type, it should obviously be -

- -
typedef typename ctype<charT>::mask   mask;
-
- - - - - -
-

619. Longjmp wording problem

-

Section: 18.8 [support.runtime] Status: WP - Submitter: Lawrence Crowl Date: 2007-01-12

-

View all issues with WP status.

-

Discussion:

-

-The wording for longjmp is confusing. -

-

-18.8 [support.runtime] -4- Other runtime support -

-

-The function signature longjmp(jmp_buf jbuf, int val) has more restricted -behavior in this International Standard. If any automatic objects would -be destroyed by a thrown exception transferring control to another -(destination) point in the program, then a call to longjmp(jbuf, val) that -the throw point that transfers control to the same (destination) point has -undefined behavior. -

-

-Someone at Google thinks that should say "then a call to longjmp(jbuf, val) -*at* the throw point that transfers control". -

-

-Bill Gibbons thinks it should say something like "If any automatic objects -would be destroyed by an exception thrown at the point of the longjmp and -caught only at the point of the setjmp, the behavior is undefined." -

- - -

Proposed resolution:

-

-In general, accept Bill Gibbons' recommendation, -but add "call" to indicate that the undefined behavior -comes from the dynamic call, not from its presence in the code. -In 18.8 [support.runtime] paragraph 4, change -

- -

-The function signature longjmp(jmp_buf jbuf, int val) has more -restricted behavior in this International Standard. If any automatic -objects would be destroyed by a thrown exception transferring control to another -(destination) point in the program, then a call to longjmp(jbuf, val) -that the throw point that transfers control to the same (destination) point has -undefined behavior. A setjmp/longjmp call pair has -undefined behavior if replacing the setjmp and longjmp by -catch and throw would destroy any automatic objects. -

- - - - - -
-

628. Inconsistent definition of basic_regex constructor

-

Section: 28.8 [re.regex] Status: WP - Submitter: Bo Persson Date: 2007-01-23

-

View all other issues in [re.regex].

-

View all issues with WP status.

-

Discussion:

-

-Section 28.8 [re.regex] lists a constructor -

- -
template<class InputIterator>
-basic_regex(InputIterator first, InputIterator last,
-                       flag_type f = regex_constants::ECMAScript);
-
- -

-However, in section 28.8.2 [re.regex.construct], this constructor takes a -pair of ForwardIterator. -

- - -

Proposed resolution:

-

-Change 28.8.2 [re.regex.construct]: -

- -
template <class ForwardIterator InputIterator>
-  basic_regex(ForwardIterator InputIterator first, ForwardIterator InputIterator last, 
-              flag_type f = regex_constants::ECMAScript);
-
- - - - - - -
-

634. allocator.address() doesn't work for types overloading operator&

-

Section: 20.6.1.1 [allocator.members] Status: WP - Submitter: Howard Hinnant Date: 2007-02-07

-

View all other issues in [allocator.members].

-

View all issues with WP status.

-

Duplicate of: 350

-

Discussion:

- -

-20.6.1.1 [allocator.members] says: -

-
-
pointer address(reference x) const;
-
-

--1- Returns: &x. -

-
-
- -

-20.6.1.1 [allocator.members] defines CopyConstructible which currently not -only defines the semantics of copy construction, but also restricts what an overloaded -operator& may do. I believe proposals are in the works (such as concepts -and rvalue reference) to decouple these two requirements. Indeed it is not evident -that we should disallow overloading operator& to return something other -than the address of *this. -

- -

-An example of when you want to overload operator& to return something -other than the object's address is proxy references such as vector<bool> -(or its replacement, currently code-named bit_vector). Taking the address of -such a proxy reference should logically yield a proxy pointer, which when dereferenced, -yields a copy of the original proxy reference again. -

- -

-On the other hand, some code truly needs the address of an object, and not a proxy -(typically for determining the identity of an object compared to a reference object). -boost has long recognized this dilemma and solved it with -boost::addressof. -It appears to me that this would be useful functionality for the default allocator. Adopting -this definition for allocator::address would free the standard of requiring -anything special from types which overload operator&. Issue 580 -is expected to make use of allocator::address mandatory for containers. -

- - - -

Proposed resolution:

-

-Change 20.6.1.1 [allocator.members]: -

- -
-
pointer address(reference x) const;
-
-

--1- Returns: &x. The actual address of object referenced by x, -even in the presence of an overloaded operator&. -

-
- -
const_pointer address(address(const_reference x) const;
-
-

--2- Returns: &x. The actual address of object referenced by x, -even in the presence of an overloaded operator&. -

-
-
- -

[ -post Oxford: This would be rendered NAD Editorial by acceptance of -N2257. -]

- - -

[ -Kona (2007): The LWG adopted the proposed resolution of N2387 for this issue which -was subsequently split out into a separate paper N2436 for the purposes of voting. -The resolution in N2436 addresses this issue. The LWG voted to accelerate this -issue to Ready status to be voted into the WP at Kona. -]

- - - - - - - -
-

640. 27.6.2.5.2 does not handle (unsigned) long long

-

Section: 27.6.2.6.2 [ostream.inserters.arithmetic] Status: WP - Submitter: Daniel Krügler Date: 2007-02-17

-

View all other issues in [ostream.inserters.arithmetic].

-

View all issues with WP status.

-

Discussion:

-

-The arithmetic inserters are described in 27.6.2.6.2 [ostream.inserters.arithmetic]. -Although the section starts with a listing of the inserters including -the new ones: -

- -
operator<<(long long val );
-operator<<(unsigned long long val );
-
- -

-the text in paragraph 1, which describes the corresponding effects -of the inserters, depending on the actual type of val, does not -handle the types long long and unsigned long long. -

- -

[ -Alisdair: In addition to the (unsigned) long long problem, that whole paragraph -misses any reference to extended integral types supplied by the -implementation - one of the additions by core a couple of working papers -back. -]

- - - - -

Proposed resolution:

-

-In 27.6.2.6.2 [ostream.inserters.arithmetic]/1 change the third sentence -

- -
-When val is of type bool, long, unsigned -long, long long, unsigned long long, double, -long double, or const void*, the formatting conversion -occurs as if it performed the following code fragment: -
- - - - - -
-

643. Impossible "as if" clauses

-

Section: 27.8.1.1 [filebuf], 22.2.2.2.2 [facet.num.put.virtuals] Status: WP - Submitter: Daniel Krügler Date: 2007-02-20

-

View all issues with WP status.

-

Discussion:

-

-The current standard 14882:2003(E) as well as N2134 have the -following -defects: -

- -

-27.8.1.1 [filebuf]/5 says: -

- -
-

-In order to support file I/O and multibyte/wide character conversion, conversions are performed using members of a -facet, referred to as a_codecvt in following sections, obtained "as if" by -

-
codecvt<charT,char,typename traits::state_type> a_codecvt =
-  use_facet<codecvt<charT,char,typename traits::state_type> >(getloc());
-
-
- -

-use_facet returns a const facet reference and no facet is -copyconstructible, so the codecvt construction should fail to compile. -

- -

-A similar issue arises in 22.2.2.2.2 [facet.num.put.virtuals]/15 for num_punct. -

- - -

Proposed resolution:

-

-In 27.8.1.1 [filebuf]/5 change the "as if" code -

- -
const codecvt<charT,char,typename traits::state_type>& a_codecvt =
-  use_facet<codecvt<charT,char,typename traits::state_type> >(getloc());
-
- -

-In 22.2.2.2.2 [facet.num.put.virtuals]/15 (This is para 5 in N2134) change -

- -
-

-A local variable punct is initialized via -

-
const numpunct<charT>& punct = use_facet< numpunct<charT> >(str.getloc() );
-
-
- -

-(Please note also the additional provided trailing semicolon) -

- - - - - - -
-

644. Possible typos in 'function' description

-

Section: X [func.wrap.func.undef] Status: Pending WP - Submitter: Bo Persson Date: 2007-02-25

-

View all issues with Pending WP status.

-

Discussion:

-

-X [func.wrap.func.undef] -

-

-The note in paragraph 2 refers to 'undefined void operators', while the -section declares a pair of operators returning bool. -

- - -

Proposed resolution:

-

-Change 20.5.15.2 [func.wrap.func] -

- -
...
-private:
-   // X [func.wrap.func.undef], undefined operators:
-   template<class Function2> bool void operator==(const function<Function2>&);
-   template<class Function2> bool void operator!=(const function<Function2>&);
-};
-
- -

-Change X [func.wrap.func.undef] -

- -
template<class Function2> bool void operator==(const function<Function2>&);
-template<class Function2> bool void operator!=(const function<Function2>&);
-
- - - - - -
-

646. const incorrect match_result members

-

Section: 28.10.4 [re.results.form] Status: WP - Submitter: Daniel Krügler Date: 2007-02-26

-

View all issues with WP status.

-

Discussion:

-

-28.10.4 [re.results.form] (root and para 3) in N2134 defines the two function template -members format as non-const functions, although they are declared -as const in 28.10 [re.results]/3. -

- - -

Proposed resolution:

-

-Add the missing const specifier to both format overloads described -in section 28.10.4 [re.results.form]. -

- - - - - -
-

650. regex_token_iterator and const correctness

-

Section: 28.12.2 [re.tokiter] Status: WP - Submitter: Daniel Krügler Date: 2007-03-05

-

View all other issues in [re.tokiter].

-

View all issues with WP status.

-

Discussion:

-

-Both the class definition of regex_token_iterator (28.12.2 -[re.tokiter]/6) and the latter member specifications (28.12.2.2 -[re.tokiter.comp]/1+2) declare both comparison operators as -non-const functions. Furtheron, both dereference operators are -unexpectedly also declared as non-const in 28.12.2 [re.tokiter]/6 -as well as in (28.12.2.3 [re.tokiter.deref]/1+2). -

- - -

Proposed resolution:

-

-1) In (28.12.2 [re.tokiter]/6) change the current declarations -

- -
bool operator==(const regex_token_iterator&) const;
-bool operator!=(const regex_token_iterator&) const;
-const value_type& operator*() const;
-const value_type* operator->() const;
-
- -

-2) In 28.12.2.2 [re.tokiter.comp] change the following declarations -

- -
bool operator==(const regex_token_iterator& right) const;
-bool operator!=(const regex_token_iterator& right) const;
-
- -

-3) In 28.12.2.3 [re.tokiter.deref] change the following declarations -

- -
const value_type& operator*() const;
-const value_type* operator->() const;
-
- - -

[ -Kona (2007): The LWG adopted the proposed resolution of N2409 for this issue (which -is to adopt the proposed wording in this issue). -The LWG voted to accelerate this issue to Ready status to be voted into the WP at Kona. -]

- - - - - -
-

651. Missing preconditions for regex_token_iterator c'tors

-

Section: 28.12.2.1 [re.tokiter.cnstr] Status: WP - Submitter: Daniel Krügler Date: 2007-03-05

-

View all other issues in [re.tokiter.cnstr].

-

View all issues with WP status.

-

Discussion:

-

-The text provided in 28.12.2.1 [re.tokiter.cnstr]/2+3 describes -the effects of the three non-default constructors of class -template regex_token_iterator but is does not clarify which values -are legal values for submatch/submatches. This becomes -an issue, if one takes 28.12.2 [re.tokiter]/9 into account, which explains -the notion of a "current match" by saying: -

- -

-The current match is (*position).prefix() if subs[N] -== -1, or (*position)[subs[N]] for any other value of -subs[N]. -

- -

-It's not clear to me, whether other negative values except -1 -are legal arguments or not - it seems they are not. -

- - -

Proposed resolution:

-

-Add the following precondition paragraph just before the current -28.12.2.1 [re.tokiter.cnstr]/2: -

- -

-Requires: Each of the initialization values of subs must be >= -1. -

- - -

[ -Kona (2007): The LWG adopted the proposed resolution of N2409 for this issue (which -is to adopt the proposed wording in this issue). -The LWG voted to accelerate this issue to Ready status to be voted into the WP at Kona. -]

- - - - - -
-

652. regex_iterator and const correctness

-

Section: 28.12.1 [re.regiter] Status: WP - Submitter: Daniel Krügler Date: 2007-03-05

-

View all issues with WP status.

-

Discussion:

-

Both the class definition of regex_iterator (28.12.1 [re.regiter]/1) -and the latter member specification (28.12.1.2 [re.regiter.comp]/1+2) -declare both comparison operators as -non-const functions. Furtheron, both dereference operators are -unexpectedly also declared as non-const in 28.12.1 [re.regiter]/1 -as well as in (28.12.1.3 [re.regiter.deref]/1+2). -

- - -

Proposed resolution:

-

-1) In (28.12.1 [re.regiter]/1) change the current declarations -

- -
bool operator==(const regex_iterator&) const;
-bool operator!=(const regex_iterator&) const;
-const value_type& operator*() const;
-const value_type* operator->() const;
-
- -

-2) In 28.12.1.3 [re.regiter.deref] change the following declarations -

- -
const value_type& operator*() const;
-const value_type* operator->() const;
-
- -

-3) In 28.12.1.2 [re.regiter.comp] change the following declarations -

- -
bool operator==(const regex_iterator& right) const;
-bool operator!=(const regex_iterator& right) const;
-
- - -

[ -Kona (2007): The LWG adopted the proposed resolution of N2409 for this issue (which -is to adopt the proposed wording in this issue). -The LWG voted to accelerate this issue to Ready status to be voted into the WP at Kona. -]

- - - - - -
-

654. Missing IO roundtrip for random number engines

-

Section: 26.4.1.3 [rand.req.eng] Status: Pending WP - Submitter: Daniel Krügler Date: 2007-03-08

-

View all other issues in [rand.req.eng].

-

View all issues with Pending WP status.

-

Discussion:

-

-Table 98 and para 5 in 26.4.1.3 [rand.req.eng] specify -the IO insertion and extraction semantic of random -number engines. It can be shown, v.i., that the specification -of the extractor cannot guarantee to fulfill the requirement -from para 5: -

- -

-If a textual representation written via os << x was -subsequently read via is >> v, then x == v provided that -there have been no intervening invocations of x or of v. -

- -

-The problem is, that the extraction process described in -table 98 misses to specify that it will initially set the -if.fmtflags to ios_base::dec, see table 104: -

- -

-dec: converts integer input or generates integer output -in decimal base -

- -

-Proof: The following small program demonstrates the violation -of requirements (exception safety not fulfilled): -

- -
#include <cassert>
-#include <ostream>
-#include <iostream>
-#include <iomanip>
-#include <sstream>
-
-class RanNumEngine {
-  int state;
-public:
-  RanNumEngine() : state(42) {}
-
-  bool operator==(RanNumEngine other) const {
-	  return state == other.state;
-  }
-
-  template <typename Ch, typename Tr>
-  friend std::basic_ostream<Ch, Tr>& operator<<(std::basic_ostream<Ch, Tr>& os, RanNumEngine engine) {
-	Ch old = os.fill(os.widen(' ')); // Sets space character
-	std::ios_base::fmtflags f = os.flags();
-	os << std::dec << std::left << engine.state; // Adds ios_base::dec|ios_base::left
-	os.fill(old); // Undo
-	os.flags(f);
-	return os;
-  }
-
-  template <typename Ch, typename Tr>
-  friend std::basic_istream<Ch, Tr>& operator>>(std::basic_istream<Ch, Tr>& is, RanNumEngine& engine) {
-       // Uncomment only for the fix.
-
-	//std::ios_base::fmtflags f = is.flags();
-	//is >> std::dec;
-	is >> engine.state;
-	//is.flags(f);
-	return is;
-  }
-};
-
-int main() {
-	std::stringstream s;
-	s << std::setfill('#'); // No problem
-        s << std::oct; // Yikes!
-        // Here starts para 5 requirements:
-	RanNumEngine x;
-	s << x;
-	RanNumEngine v;
-	s >> v;
-	assert(x == v); // Fails: 42 == 34
-}
-
- -

-A second, minor issue seems to be, that the insertion -description from table 98 unnecessarily requires the -addition of ios_base::fixed (which only influences floating-point -numbers). Its not entirely clear to me whether the proposed -standard does require that the state of random number engines -is stored in integral types or not, but I have the impression -that this is the indent, see e.g. p. 3 -

- -

-The specification of each random number engine defines the -size of its state in multiples of the size of its result_type. -

- -

-If other types than integrals are supported, then I wonder why -no requirements are specified for the precision of the stream. -

- -

-See N2391 and -N2423 -for some further discussion. -

- - -

Proposed resolution:

-

-Adopt the proposed resolution in -N2423. -

- - -

[ -Kona (2007): The LWG adopted the proposed resolution of N2423 for this issue. -The LWG voted to accelerate this issue to Ready status to be voted into the WP at Kona. -]

- - - - - -
-

655. Signature of generate_canonical not useful

-

Section: 26.4.7.2 [rand.util.canonical] Status: Pending WP - Submitter: Daniel Krügler Date: 2007-03-08

-

View all other issues in [rand.util.canonical].

-

View all issues with Pending WP status.

-

Discussion:

-

-In 26.4.2 [rand.synopsis] we have the declaration -

- -
template<class RealType, class UniformRandomNumberGenerator,
-  size_t bits>
-result_type generate_canonical(UniformRandomNumberGenerator& g);
-
- -

-Besides the "result_type" issue (already recognized by Bo Persson -at Sun, 11 Feb 2007 05:26:47 GMT in this group) it's clear, that -the template parameter order is not reasonably choosen: Obviously -one always needs to specify all three parameters, although usually -only two are required, namely the result type RealType and the -wanted bits, because UniformRandomNumberGenerator can usually -be deduced. -

- -

-See N2391 and -N2423 -for some further discussion. -

- - -

Proposed resolution:

-

-Adopt the proposed resolution in -N2423. -

- - -

[ -Kona (2007): The LWG adopted the proposed resolution of N2423 for this issue. -The LWG voted to accelerate this issue to Ready status to be voted into the WP at Kona. -]

- - - - - -
-

660. Missing Bitwise Operations

-

Section: 20.5 [function.objects] Status: WP - Submitter: Beman Dawes Date: 2007-04-02

-

View all other issues in [function.objects].

-

View all issues with WP status.

-

Discussion:

-

Section 20.5 [function.objects] provides function -objects for some unary and binary -operations, but others are missing. In a LWG reflector discussion, beginning -with c++std-lib-18078, pros and cons of adding some of the missing operations -were discussed. Bjarne Stroustrup commented "Why standardize what isn't used? -Yes, I see the chicken and egg problems here, but it would be nice to see a -couple of genuine uses before making additions."

-

A number of libraries, including Rogue Wave, GNU, Adobe ASL, and Boost, have -already added these functions, either publicly or for internal use. For example, -Doug Gregor commented: "Boost will also add ... (|, &, ^) in 1.35.0, because we -need those function -objects to represent various parallel -collective operations (reductions, prefix reductions, etc.) in the new Message -Passing Interface (MPI) library."

-

Because the bitwise operators have the strongest use cases, the proposed -resolution is limited to them.

- - -

Proposed resolution:

-

To 20.5 [function.objects], Function objects, paragraph 2, add to the header -<functional> synopsis:

-
-
template <class T> struct bit_and;
-template <class T> struct bit_or;
-template <class T> struct bit_xor;
-
-

At a location in clause 20 to be determined by the Project Editor, add:

-
-

The library provides basic function object classes for all of the bitwise - operators in the language ([expr.bit.and], [expr.or], [exp.xor]).

-
template <class T> struct bit_and : binary_function<T,T,T> {
-  T operator()(const T& x , const T& y ) const;
-};
-
-

operator() returns x & y .

-
-
template <class T> struct bit_or : binary_function<T,T,T> {
-  T operator()(const T& x , const T& y ) const;
-};
-
-

operator() returns x | y .

-
-
template <class T> struct bit_xor : binary_function<T,T,T> {
-  T operator()(const T& x , const T& y ) const;
-};
-
-

operator() returns x ^ y .

-
-
- - - - - -
-

677. Weaknesses in seed_seq::randomize [rand.util.seedseq]

-

Section: 26.4.7.1 [rand.util.seedseq] Status: Pending WP - Submitter: Charles Karney Date: 2007-05-15

-

View all other issues in [rand.util.seedseq].

-

View all issues with Pending WP status.

-

Discussion:

-

-seed_seq::randomize provides a mechanism for initializing random number -engines which ideally would yield "distant" states when given "close" -seeds. The algorithm for seed_seq::randomize given in the current -Working Draft for C++, -N2284 -(2007-05-08), has 3 weaknesses -

- -
    -
  1. -

    Collisions in state. Because of the way the state is initialized, - seeds of different lengths may result in the same state. The - current version of seed_seq has the following properties:

    -
      -
    • For a given s <= n, each of the 2^(32s) seed vectors results in a - distinct state.
    • -
    -

    - The proposed algorithm (below) has the considerably stronger - properties:

    -
      -
    • All of the (2^(32n)-1)/(2^32-1) seed vectors of lengths s < n - result in distinct states. -
    • -
    • All of the 2^(32n) seed vectors of length s == n result in - distinct states. -
    • -
    -
  2. -
  3. -

    Poor mixing of v's entropy into the state. Consider v.size() == n - and hold v[n/2] thru v[n-1] fixed while varying v[0] thru v[n/2-1], - a total of 2^(16n) possibilities. Because of the simple recursion - used in seed_seq, begin[n/2] thru begin[n-1] can take on only 2^64 - possible states.

    - -

    The proposed algorithm uses a more complex recursion which results - in much better mixing.

    -
  4. -
  5. seed_seq::randomize is undefined for v.size() == 0. The proposed - algorithm remedies this. -
  6. -
-

-The current algorithm for seed_seq::randomize is adapted by me from the -initialization procedure for the Mersenne Twister by Makoto Matsumoto -and Takuji Nishimura. The weakness (2) given above was communicated to -me by Matsumoto last year. -

-

-The proposed replacement for seed_seq::randomize is due to Mutsuo Saito, -a student of Matsumoto, and is given in the implementation of the -SIMD-oriented Fast Mersenne Twister random number generator SFMT. -http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/SFMT/index.html -http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/SFMT/SFMT-src-1.2.tar.gz -

-

-See -Mutsuo Saito, -An Application of Finite Field: Design and Implementation of 128-bit -Instruction-Based Fast Pseudorandom Number Generator, -Master's Thesis, Dept. of Math., Hiroshima University (Feb. 2007) -http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/SFMT/M062821.pdf -

-

-One change has been made here, namely to treat the case of small n -(setting t = (n-1)/2 for n < 7). -

-

-Since seed_seq was introduced relatively recently there is little cost -in making this incompatible improvement to it. -

- -

-See N2391 and -N2423 -for some further discussion. -

- - -

Proposed resolution:

-

-Adopt the proposed resolution in -N2423. -

- - -

[ -Kona (2007): The LWG adopted the proposed resolution of N2423 for this issue. -The LWG voted to accelerate this issue to Ready status to be voted into the WP at Kona. -]

- - - - - -
-

678. Changes for [rand.req.eng]

-

Section: 26.4.1.3 [rand.req.eng] Status: WP - Submitter: Charles Karney Date: 2007-05-15

-

View all other issues in [rand.req.eng].

-

View all issues with WP status.

-

Discussion:

-

-Section 26.4.1.3 [rand.req.eng] Random number engine requirements: -

- -

-This change follows naturally from the proposed change to -seed_seq::randomize in 677. -

- -

-In table 104 the description of X(q) contains a special treatment of -the case q.size() == 0. This is undesirable for 4 reasons: -

- -
    -
  1. It replicates the functionality provided by X().
  2. -
  3. It leads to the possibility of a collision in the state provided - by some other X(q) with q.size() > 0.
  4. -
  5. It is inconsistent with the description of the X(q) in -paragraphs 26.4.3.1 [rand.eng.lcong] p5, 26.4.3.2 [rand.eng.mers] p8, and 26.4.3.3 [rand.eng.sub] p10 where -there is no special treatment of q.size() == 0.
  6. -
  7. The proposed replacement for seed_seq::randomize given above - allows for the case q.size() == 0.
  8. -
- -

-See N2391 and -N2423 -for some further discussion. -

- - -

Proposed resolution:

-

-Adopt the proposed resolution in -N2423. -

- - -

[ -Kona (2007): The LWG adopted the proposed resolution of N2423 for this issue. -The LWG voted to accelerate this issue to Ready status to be voted into the WP at Kona. -]

- - - - - -
-

681. Operator functions impossible to compare are defined in [re.submatch.op]

-

Section: 28.9.2 [re.submatch.op] Status: WP - Submitter: Nozomu Katoo Date: 2007-05-27

-

View all issues with WP status.

-

Discussion:

-

-In 28.9.2 [re.submatch.op] of N2284, -operator functions numbered 31-42 seem impossible to compare.  E.g.: -

- -
-
-template <class BiIter>
-    bool operator==(typename iterator_traits<BiIter>::value_type const& lhs,
-                    const sub_match<BiIter>& rhs);
-
-
-

--31- Returns: lhs == rhs.str(). -

-
-
- -

-When char* is used as BiIter, iterator_traits<BiIter>::value_type would be -char, so that lhs == rhs.str() ends up comparing a char value and an object -of std::basic_string<char>.  However, the behaviour of comparison between -these two types is not defined in 21.3.8 [string.nonmembers] of N2284. - This applies when wchar_t* is used as BiIter. -

- - -

Proposed resolution:

-

-Adopt the proposed resolution in -N2409. -

- - -

[ -Kona (2007): The LWG adopted the proposed resolution of N2409 for this issue. -The LWG voted to accelerate this issue to Ready status to be voted into the WP at Kona. -]

- - - - - -
-

682. basic_regex ctor takes InputIterator or ForwardIterator?

-

Section: 28.8.2 [re.regex.construct] Status: Pending WP - Submitter: Eric Niebler Date: 2007-06-03

-

View all issues with Pending WP status.

-

Discussion:

-

-Looking at N2284, 28.8 [re.regex], p3 basic_regex class template synopsis shows this -constructor: -

-
template <class InputIterator>
-     basic_regex(InputIterator first, InputIterator last, 
-                 flag_type f = regex_constants::ECMAScript);
-
- -

-In 28.8.2 [re.regex.construct], p15, the constructor appears with this signature: -

- -
template <class ForwardIterator>
-     basic_regex(ForwardIterator first, ForwardIterator last, 
-                 flag_type f = regex_constants::ECMAScript);
-
- -

-ForwardIterator is probably correct, so the synopsis is wrong. -

- -

[ -John adds: -]

- - -
-

-I think either could be implemented?  Although an input iterator would -probably require an internal copy of the string being made. -

-

-I have no strong feelings either way, although I think my original intent -was InputIterator. -

-
- - -

Proposed resolution:

-

-Adopt the proposed resolution in -N2409. -

- - -

[ -Kona (2007): The LWG adopted the proposed resolution of N2409 for this issue. -The LWG voted to accelerate this issue to Ready status to be voted into the WP at Kona. -]

- - - - - -
-

699. N2111 changes min/max

-

Section: 26.4 [rand] Status: WP - Submitter: P.J. Plauger Date: 2007-07-01

-

View all other issues in [rand].

-

View all issues with WP status.

-

Discussion:

-

-N2111 -changes min/max in several places in random from member -functions to static data members. I believe this introduces -a needless backward compatibility problem between C++0X and -TR1. I'd like us to find new names for the static data members, -or perhaps change min/max to constexprs in C++0X. -

- -

-See N2391 and -N2423 -for some further discussion. -

- - -

Proposed resolution:

-

-Adopt the proposed resolution in -N2423. -

- - -

[ -Kona (2007): The LWG adopted the proposed resolution of N2423 for this issue. -The LWG voted to accelerate this issue to Ready status to be voted into the WP at Kona. -]

- - - - - -
-

712. seed_seq::size no longer useful

-

Section: 26.4.7.1 [rand.util.seedseq] Status: WP - Submitter: Marc Paterno Date: 2007-08-25

-

View all other issues in [rand.util.seedseq].

-

View all issues with WP status.

-

Discussion:

-

-One of the motivations for incorporating seed_seq::size() -was to simplify the wording -in other parts of 26.4 [rand]. -As a side effect of resolving related issues, -all such references -to seed_seq::size() will have been excised. -More importantly, -the present specification is contradictory, -as "The number of 32-bit units the object can deliver" -is not the same as "the result of v.size()." -

- -

-See N2391 and -N2423 -for some further discussion. -

- - -

Proposed resolution:

-

-Adopt the proposed resolution in -N2423. -

- - -

[ -Kona (2007): The LWG adopted the proposed resolution of N2423 for this issue. -The LWG voted to accelerate this issue to Ready status to be voted into the WP at Kona. -]

- - - - - - - \ No newline at end of file diff --git a/libstdc++-v3/docs/html/ext/mt_allocator.html b/libstdc++-v3/docs/html/ext/mt_allocator.html deleted file mode 100644 index b53e7e6200e..00000000000 --- a/libstdc++-v3/docs/html/ext/mt_allocator.html +++ /dev/null @@ -1,560 +0,0 @@ - - - - - - - - - - A fixed-size, multi-thread optimized allocator - - - - - - - -

A fixed-size, multi-thread optimized allocator

- -

- The latest version of this document is always available at - - http://gcc.gnu.org/onlinedocs/libstdc++/ext/mt_allocator.html. -

- -

- To the libstdc++ homepage. -

- - -
-

- Introduction -

- -

The mt allocator [hereinafter referred to simply as "the -allocator"] is a fixed size (power of two) allocator that was -initially developed specifically to suit the needs of multi threaded -applications [hereinafter referred to as an MT application]. Over time -the allocator has evolved and been improved in many ways, in -particular it now also does a good job in single threaded applications -[hereinafter referred to as a ST application]. (Note: In this -document, when referring to single threaded applications this also -includes applications that are compiled with gcc without thread -support enabled. This is accomplished using ifdef's on -__GTHREADS). This allocator is tunable, very flexible, and capable of -high-performance. -

- -

-The aim of this document is to describe - from an application point of -view - the "inner workings" of the allocator. -

- -

- Design Overview -

- -

There are three general components to the allocator: a datum -describing the characteristics of the memory pool, a policy class -containing this pool that links instantiation types to common or -individual pools, and a class inheriting from the policy class that is -the actual allocator. -

- -

The datum describing pools characteristics is -

-
-  template<bool _Thread>
-    class __pool
-
-

This class is parametrized on thread support, and is explicitly -specialized for both multiple threads (with bool==true) -and single threads (via bool==false.) It is possible to -use a custom pool datum instead of the default class that is provided. -

- -

There are two distinct policy classes, each of which can be used -with either type of underlying pool datum. -

- -
-  template<bool _Thread>
-    struct __common_pool_policy
-
-  template<typename _Tp, bool _Thread>
-    struct __per_type_pool_policy
-
- -

The first policy, __common_pool_policy, implements a -common pool. This means that allocators that are instantiated with -different types, say char and long will both -use the same pool. This is the default policy. -

- -

The second policy, __per_type_pool_policy, implements -a separate pool for each instantiating type. Thus, char -and long will use separate pools. This allows per-type -tuning, for instance. -

- -

Putting this all together, the actual allocator class is -

-
-  template<typename _Tp, typename _Poolp = __default_policy>
-    class __mt_alloc : public __mt_alloc_base<_Tp>,  _Poolp
-
-

This class has the interface required for standard library allocator -classes, namely member functions allocate and -deallocate, plus others. -

- -

- Tunable parameters -

- -

Certain allocation parameters can be modified, or tuned. There -exists a nested struct __pool_base::_Tune that contains all -these parameters, which include settings for -

-
    -
  • Alignment
  • -
  • Maximum bytes before calling ::operator new directly
  • -
  • Minimum bytes
  • -
  • Size of underlying global allocations
  • -
  • Maximum number of supported threads
  • -
  • Migration of deallocations to the global free list
  • -
  • Shunt for global new and delete
  • -
-

Adjusting parameters for a given instance of an allocator can only -happen before any allocations take place, when the allocator itself is -initialized. For instance: -

-
-#include <ext/mt_allocator.h>
-
-struct pod
-{
-  int i;
-  int j;
-};
-
-int main()
-{
-  typedef pod value_type;
-  typedef __gnu_cxx::__mt_alloc<value_type> allocator_type;
-  typedef __gnu_cxx::__pool_base::_Tune tune_type;
-
-  tune_type t_default;
-  tune_type t_opt(16, 5120, 32, 5120, 20, 10, false);
-  tune_type t_single(16, 5120, 32, 5120, 1, 10, false);
-
-  tune_type t;
-  t = allocator_type::_M_get_options();  
-  allocator_type::_M_set_options(t_opt);
-  t = allocator_type::_M_get_options();  
-
-  allocator_type a;
-  allocator_type::pointer p1 = a.allocate(128);
-  allocator_type::pointer p2 = a.allocate(5128);
-
-  a.deallocate(p1, 128);
-  a.deallocate(p2, 5128);
-
-  return 0;
-}
-
- -

- Initialization -

- -

-The static variables (pointers to freelists, tuning parameters etc) -are initialized as above, or are set to the global defaults. -

- -

-The very first allocate() call will always call the -_S_initialize_once() function. In order to make sure that this -function is called exactly once we make use of a __gthread_once call -in MT applications and check a static bool (_S_init) in ST -applications. -

- -

-The _S_initialize() function: -- If the GLIBCXX_FORCE_NEW environment variable is set, it sets the bool - _S_force_new to true and then returns. This will cause subsequent calls to - allocate() to return memory directly from a new() call, and deallocate will - only do a delete() call. -

- -

-- If the GLIBCXX_FORCE_NEW environment variable is not set, both ST and MT - applications will: - - Calculate the number of bins needed. A bin is a specific power of two size - of bytes. I.e., by default the allocator will deal with requests of up to - 128 bytes (or whatever the value of _S_max_bytes is when _S_init() is - called). This means that there will be bins of the following sizes - (in bytes): 1, 2, 4, 8, 16, 32, 64, 128. - - - Create the _S_binmap array. All requests are rounded up to the next - "large enough" bin. I.e., a request for 29 bytes will cause a block from - the "32 byte bin" to be returned to the application. The purpose of - _S_binmap is to speed up the process of finding out which bin to use. - I.e., the value of _S_binmap[ 29 ] is initialized to 5 (bin 5 = 32 bytes). -

-

- - Create the _S_bin array. This array consists of bin_records. There will be - as many bin_records in this array as the number of bins that we calculated - earlier. I.e., if _S_max_bytes = 128 there will be 8 entries. - Each bin_record is then initialized: - - bin_record->first = An array of pointers to block_records. There will be - as many block_records pointers as there are maximum number of threads - (in a ST application there is only 1 thread, in a MT application there - are _S_max_threads). - This holds the pointer to the first free block for each thread in this - bin. I.e., if we would like to know where the first free block of size 32 - for thread number 3 is we would look this up by: _S_bin[ 5 ].first[ 3 ] - - The above created block_record pointers members are now initialized to - their initial values. I.e. _S_bin[ n ].first[ n ] = NULL; -

- -

-- Additionally a MT application will: - - Create a list of free thread id's. The pointer to the first entry - is stored in _S_thread_freelist_first. The reason for this approach is - that the __gthread_self() call will not return a value that corresponds to - the maximum number of threads allowed but rather a process id number or - something else. So what we do is that we create a list of thread_records. - This list is _S_max_threads long and each entry holds a size_t thread_id - which is initialized to 1, 2, 3, 4, 5 and so on up to _S_max_threads. - Each time a thread calls allocate() or deallocate() we call - _S_get_thread_id() which looks at the value of _S_thread_key which is a - thread local storage pointer. If this is NULL we know that this is a newly - created thread and we pop the first entry from this list and saves the - pointer to this record in the _S_thread_key variable. The next time - we will get the pointer to the thread_record back and we use the - thread_record->thread_id as identification. I.e., the first thread that - calls allocate will get the first record in this list and thus be thread - number 1 and will then find the pointer to its first free 32 byte block - in _S_bin[ 5 ].first[ 1 ] - When we create the _S_thread_key we also define a destructor - (_S_thread_key_destr) which means that when the thread dies, this - thread_record is returned to the front of this list and the thread id - can then be reused if a new thread is created. - This list is protected by a mutex (_S_thread_freelist_mutex) which is only - locked when records are removed/added to the list. -

-

- - Initialize the free and used counters of each bin_record: - - bin_record->free = An array of size_t. This keeps track of the number - of blocks on a specific thread's freelist in each bin. I.e., if a thread - has 12 32-byte blocks on it's freelists and allocates one of these, this - counter would be decreased to 11. - - - bin_record->used = An array of size_t. This keeps track of the number - of blocks currently in use of this size by this thread. I.e., if a thread - has made 678 requests (and no deallocations...) of 32-byte blocks this - counter will read 678. - - The above created arrays are now initialized with their initial values. - I.e. _S_bin[ n ].free[ n ] = 0; -

-

- - Initialize the mutex of each bin_record: The bin_record->mutex - is used to protect the global freelist. This concept of a global - freelist is explained in more detail in the section "A multi - threaded example", but basically this mutex is locked whenever a - block of memory is retrieved or returned to the global freelist - for this specific bin. This only occurs when a number of blocks - are grabbed from the global list to a thread specific list or when - a thread decides to return some blocks to the global freelist. -

- -

Notes about deallocation. This allocator does not explicitly -release memory. Because of this, memory debugging programs like -valgrind or purify may notice leaks: sorry about this -inconvenience. Operating systems will reclaim allocated memory at -program termination anyway. If sidestepping this kind of noise is -desired, there are three options: use an allocator, like -new_allocator that releases memory while debugging, use -GLIBCXX_FORCE_NEW to bypass the allocator's internal pools, or use a -custom pool datum that releases resources on destruction.

- -

On systems with the function __cxa_atexit, the -allocator can be forced to free all memory allocated before program -termination with the member function -__pool_type::_M_destroy. However, because this member -function relies on the precise and exactly-conforming ordering of -static destructors, including those of a static local -__pool object, it should not be used, ever, on systems -that don't have the necessary underlying support. In addition, in -practice, forcing deallocation can be tricky, as it requires the -__pool object to be fully-constructed before the object -that uses it is fully constructed. For most (but not all) STL -containers, this works, as an instance of the allocator is constructed -as part of a container's constructor. However, this assumption is -implementation-specific, and subject to change. For an example of a -pool that frees memory, see the following - - example. -

- -

- A single threaded example (and a primer for the multi threaded example!) -

- -

-Let's start by describing how the data on a freelist is laid out in memory. -This is the first two blocks in freelist for thread id 3 in bin 3 (8 bytes): -

-
-+----------------+
-| next* ---------|--+  (_S_bin[ 3 ].first[ 3 ] points here)
-|                |  |
-|                |  |
-|                |  |
-+----------------+  |
-| thread_id = 3  |  |
-|                |  |
-|                |  |
-|                |  |
-+----------------+  |
-| DATA           |  |  (A pointer to here is what is returned to the
-|                |  |   the application when needed)
-|                |  |
-|                |  |
-|                |  |
-|                |  |
-|                |  |
-|                |  |
-+----------------+  |
-+----------------+  |
-| next*          |<-+  (If next == NULL it's the last one on the list)
-|                |
-|                |
-|                |
-+----------------+
-| thread_id = 3  |
-|                |
-|                |
-|                |
-+----------------+
-| DATA           |
-|                |
-|                |
-|                |
-|                |
-|                |
-|                |
-|                |
-+----------------+
-
- -

-With this in mind we simplify things a bit for a while and say that there is -only one thread (a ST application). In this case all operations are made to -what is referred to as the global pool - thread id 0 (No thread may be -assigned this id since they span from 1 to _S_max_threads in a MT application). -

-

-When the application requests memory (calling allocate()) we first look at the -requested size and if this is > _S_max_bytes we call new() directly and return. -

-

-If the requested size is within limits we start by finding out from which -bin we should serve this request by looking in _S_binmap. -

-

-A quick look at _S_bin[ bin ].first[ 0 ] tells us if there are any blocks of -this size on the freelist (0). If this is not NULL - fine, just remove the -block that _S_bin[ bin ].first[ 0 ] points to from the list, -update _S_bin[ bin ].first[ 0 ] and return a pointer to that blocks data. -

-

-If the freelist is empty (the pointer is NULL) we must get memory from the -system and build us a freelist within this memory. All requests for new memory -is made in chunks of _S_chunk_size. Knowing the size of a block_record and -the bytes that this bin stores we then calculate how many blocks we can create -within this chunk, build the list, remove the first block, update the pointer -(_S_bin[ bin ].first[ 0 ]) and return a pointer to that blocks data. -

- -

-Deallocation is equally simple; the pointer is casted back to a block_record -pointer, lookup which bin to use based on the size, add the block to the front -of the global freelist and update the pointer as needed -(_S_bin[ bin ].first[ 0 ]). -

- -

-The decision to add deallocated blocks to the front of the freelist was made -after a set of performance measurements that showed that this is roughly 10% -faster than maintaining a set of "last pointers" as well. -

- -

- A multi threaded example -

- -

-In the ST example we never used the thread_id variable present in each block. -Let's start by explaining the purpose of this in a MT application. -

- -

-The concept of "ownership" was introduced since many MT applications -allocate and deallocate memory to shared containers from different -threads (such as a cache shared amongst all threads). This introduces -a problem if the allocator only returns memory to the current threads -freelist (I.e., there might be one thread doing all the allocation and -thus obtaining ever more memory from the system and another thread -that is getting a longer and longer freelist - this will in the end -consume all available memory). -

- -

-Each time a block is moved from the global list (where ownership is -irrelevant), to a threads freelist (or when a new freelist is built -from a chunk directly onto a threads freelist or when a deallocation -occurs on a block which was not allocated by the same thread id as the -one doing the deallocation) the thread id is set to the current one. -

- -

-What's the use? Well, when a deallocation occurs we can now look at -the thread id and find out if it was allocated by another thread id -and decrease the used counter of that thread instead, thus keeping the -free and used counters correct. And keeping the free and used counters -corrects is very important since the relationship between these two -variables decides if memory should be returned to the global pool or -not when a deallocation occurs. -

- -

-When the application requests memory (calling allocate()) we first -look at the requested size and if this is > _S_max_bytes we call new() -directly and return. -

- -

-If the requested size is within limits we start by finding out from which -bin we should serve this request by looking in _S_binmap. -

- -

-A call to _S_get_thread_id() returns the thread id for the calling thread -(and if no value has been set in _S_thread_key, a new id is assigned and -returned). -

- -

-A quick look at _S_bin[ bin ].first[ thread_id ] tells us if there are -any blocks of this size on the current threads freelist. If this is -not NULL - fine, just remove the block that _S_bin[ bin ].first[ -thread_id ] points to from the list, update _S_bin[ bin ].first[ -thread_id ], update the free and used counters and return a pointer to -that blocks data. -

- -

-If the freelist is empty (the pointer is NULL) we start by looking at -the global freelist (0). If there are blocks available on the global -freelist we lock this bins mutex and move up to block_count (the -number of blocks of this bins size that will fit into a _S_chunk_size) -or until end of list - whatever comes first - to the current threads -freelist and at the same time change the thread_id ownership and -update the counters and pointers. When the bins mutex has been -unlocked, we remove the block that _S_bin[ bin ].first[ thread_id ] -points to from the list, update _S_bin[ bin ].first[ thread_id ], -update the free and used counters, and return a pointer to that blocks -data. -

- -

-The reason that the number of blocks moved to the current threads -freelist is limited to block_count is to minimize the chance that a -subsequent deallocate() call will return the excess blocks to the -global freelist (based on the _S_freelist_headroom calculation, see -below). -

- -

-However if there isn't any memory on the global pool we need to get -memory from the system - this is done in exactly the same way as in a -single threaded application with one major difference; the list built -in the newly allocated memory (of _S_chunk_size size) is added to the -current threads freelist instead of to the global. -

- -

-The basic process of a deallocation call is simple: always add the -block to the front of the current threads freelist and update the -counters and pointers (as described earlier with the specific check of -ownership that causes the used counter of the thread that originally -allocated the block to be decreased instead of the current threads -counter). -

- -

-And here comes the free and used counters to service. Each time a -deallocation() call is made, the length of the current threads -freelist is compared to the amount memory in use by this thread. -

- -

-Let's go back to the example of an application that has one thread -that does all the allocations and one that deallocates. Both these -threads use say 516 32-byte blocks that was allocated during thread -creation for example. Their used counters will both say 516 at this -point. The allocation thread now grabs 1000 32-byte blocks and puts -them in a shared container. The used counter for this thread is now -1516. -

- -

-The deallocation thread now deallocates 500 of these blocks. For each -deallocation made the used counter of the allocating thread is -decreased and the freelist of the deallocation thread gets longer and -longer. But the calculation made in deallocate() will limit the length -of the freelist in the deallocation thread to _S_freelist_headroom % -of it's used counter. In this case, when the freelist (given that the -_S_freelist_headroom is at it's default value of 10%) exceeds 52 -(516/10) blocks will be returned to the global pool where the -allocating thread may pick them up and reuse them. -

- -

-In order to reduce lock contention (since this requires this bins -mutex to be locked) this operation is also made in chunks of blocks -(just like when chunks of blocks are moved from the global freelist to -a threads freelist mentioned above). The "formula" used can probably -be improved to further reduce the risk of blocks being "bounced back -and forth" between freelists. -

- -
-

Return to the top of the page or - to the libstdc++ homepage. -

- - - - -
-

-See license.html for copying conditions. -Comments and suggestions are welcome, and may be sent to -the libstdc++ mailing list. -

- - - - diff --git a/libstdc++-v3/docs/html/ext/parallel_mode.html b/libstdc++-v3/docs/html/ext/parallel_mode.html deleted file mode 100644 index 7ca8dbe937c..00000000000 --- a/libstdc++-v3/docs/html/ext/parallel_mode.html +++ /dev/null @@ -1,593 +0,0 @@ - - - - - - - - - - The libstdc++ parallel mode - - - - - -

The libstdc++ parallel mode

- -

- The latest version of this document is always available at - - http://gcc.gnu.org/onlinedocs/libstdc++/parallel_mode.html. -

- -

- To the libstdc++ homepage. -

- - -
-

The libstdc++ parallel mode is an experimental parallel -implementation of many algorithms the C++ Standard Library. -

- -

-Several of the standard algorithms, for instance -std::sort, are made parallel using OpenMP -annotations. These parallel mode constructs and can be invoked by -explicit source declaration or by compiling existing sources with a -specific compiler flag. -

- -

The libstdc++ parallel mode

- -

The libstdc++ parallel mode performs parallelization of algorithms, -function objects, classes, and functions in the C++ Standard.

- -

Using the libstdc++ parallel mode

- -

To use the libstdc++ parallel mode, compile your application with - the compiler flag -D_GLIBCXX_PARALLEL -fopenmp. This - will link in libgomp, the GNU OpenMP implementation, - whose presence is mandatory. In addition, hardware capable of atomic - operations is mandatory. Actually activating these atomic - operations may require explicit compiler flags on some targets - (like sparc and x86), such as -march=i686, - -march=native or -mcpu=v9. -

- -

Note that the _GLIBCXX_PARALLEL define may change the - sizes and behavior of standard class templates such as - std::search, and therefore one can only link code - compiled with parallel mode and code compiled without parallel mode - if no instantiation of a container is passed between the two - translation units. Parallel mode functionality has distinct linkage, - and cannot be confused with normal mode symbols.

- - -

The following library components in the include -<numeric> are included in the parallel mode:

-
    -
  • std::accumulate
  • -
  • std::adjacent_difference
  • -
  • std::inner_product
  • -
  • std::partial_sum
  • -
- -

The following library components in the include -<algorithm> are included in the parallel mode:

-
    -
  • std::adjacent_find
  • -
  • std::count
  • -
  • std::count_if
  • -
  • std::equal
  • -
  • std::find
  • -
  • std::find_if
  • -
  • std::find_first_of
  • -
  • std::for_each
  • -
  • std::generate
  • -
  • std::generate_n
  • -
  • std::lexicographical_compare
  • -
  • std::mismatch
  • -
  • std::search
  • -
  • std::search_n
  • -
  • std::transform
  • -
  • std::replace
  • -
  • std::replace_if
  • -
  • std::max_element
  • -
  • std::merge
  • -
  • std::min_element
  • -
  • std::nth_element
  • -
  • std::partial_sort
  • -
  • std::partition
  • -
  • std::random_shuffle
  • -
  • std::set_union
  • -
  • std::set_intersection
  • -
  • std::set_symmetric_difference
  • -
  • std::set_difference
  • -
  • std::sort
  • -
  • std::stable_sort
  • -
  • std::unique_copy
  • -
- -

The following library components in the includes -<set> and <map> are included in the parallel mode:

-
    -
  • std::(multi_)map/set<T>::(multi_)map/set(Iterator begin, Iterator end) (bulk construction)
  • -
  • std::(multi_)map/set<T>::insert(Iterator begin, Iterator end) (bulk insertion)
  • -
- - -

Using the parallel algorithms without parallel mode

- -

When it is not feasible to recompile your entire application, or - only specific algorithms need to be parallel-aware, individual - parallel algorithms can be made available explicitly. These - parallel algorithms are functionally equivalent to the standard - drop-in algorithms used in parallel mode, but they are available in - a separate namespace as GNU extensions and may be used in programs - compiled with either release mode or with parallel mode. The - following table provides the names and headers of the parallel - algorithms: -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
AlgorithmHeaderParallel algorithmParallel header
std::accumulate<numeric>__gnu_parallel::accumulate<parallel/numeric>
std::adjacent_difference<numeric>__gnu_parallel::adjacent_difference<parallel/numeric>
std::inner_product<numeric>__gnu_parallel::inner_product<parallel/numeric>
std::partial_sum<numeric>__gnu_parallel::partial_sum<parallel/numeric>
std::adjacent_find<algorithm>__gnu_parallel::adjacent_find<parallel/algorithm>
std::count<algorithm>__gnu_parallel::count<parallel/algorithm>
std::count_if<algorithm>__gnu_parallel::count_if<parallel/algorithm>
std::equal<algorithm>__gnu_parallel::equal<parallel/algorithm>
std::find<algorithm>__gnu_parallel::find<parallel/algorithm>
std::find_if<algorithm>__gnu_parallel::find_if<parallel/algorithm>
std::find_first_of<algorithm>__gnu_parallel::find_first_of<parallel/algorithm>
std::for_each<algorithm>__gnu_parallel::for_each<parallel/algorithm>
std::generate<algorithm>__gnu_parallel::generate<parallel/algorithm>
std::generate_n<algorithm>__gnu_parallel::generate_n<parallel/algorithm>
std::lexicographical_compare<algorithm>__gnu_parallel::lexicographical_compare<parallel/algorithm>
std::mismatch<algorithm>__gnu_parallel::mismatch<parallel/algorithm>
std::search<algorithm>__gnu_parallel::search<parallel/algorithm>
std::search_n<algorithm>__gnu_parallel::search_n<parallel/algorithm>
std::transform<algorithm>__gnu_parallel::transform<parallel/algorithm>
std::replace<algorithm>__gnu_parallel::replace<parallel/algorithm>
std::replace_if<algorithm>__gnu_parallel::replace_if<parallel/algorithm>
std::max_element<algorithm>__gnu_parallel::max_element<parallel/algorithm>
std::merge<algorithm>__gnu_parallel::merge<parallel/algorithm>
std::min_element<algorithm>__gnu_parallel::min_element<parallel/algorithm>
std::nth_element<algorithm>__gnu_parallel::nth_element<parallel/algorithm>
std::partial_sort<algorithm>__gnu_parallel::partial_sort<parallel/algorithm>
std::partition<algorithm>__gnu_parallel::partition<parallel/algorithm>
std::random_shuffle<algorithm>__gnu_parallel::random_shuffle<parallel/algorithm>
std::set_union<algorithm>__gnu_parallel::set_union<parallel/algorithm>
std::set_intersection<algorithm>__gnu_parallel::set_intersection<parallel/algorithm>
std::set_symmetric_difference<algorithm>__gnu_parallel::set_symmetric_difference<parallel/algorithm>
std::set_difference<algorithm>__gnu_parallel::set_difference<parallel/algorithm>
std::sort<algorithm>__gnu_parallel::sort<parallel/algorithm>
std::stable_sort<algorithm>__gnu_parallel::stable_sort<parallel/algorithm>
std::unique_copy<algorithm>__gnu_parallel::unique_copy<parallel/algorithm>
- - -

Parallel mode semantics

- -

The parallel mode STL algorithms are currently not exception-safe, -i. e. user-defined functors must not throw exceptions. -

- -

Since the current GCC OpenMP implementation does not support -OpenMP parallel regions in concurrent threads, -it is not possible to call parallel STL algorithm in -concurrent threads, either. -It might work with other compilers, though.

- - -

Configuration and Tuning

- -

Some algorithm variants can be enabled/disabled/selected at compile-time. -See -<compiletime_settings.h> and -See -<features.h> for details. -

- -

-To specify the number of threads to be used for an algorithm, -use omp_set_num_threads. -To force a function to execute sequentially, -even though parallelism is switched on in general, -add __gnu_parallel::sequential_tag() -to the end of the argument list. -

- -

-Parallelism always incurs some overhead. Thus, it is not -helpful to parallelize operations on very small sets of data. -There are measures to avoid parallelizing stuff that is not worth it. -For each algorithm, a minimum problem size can be stated, -usually using the variable -__gnu_parallel::Settings::[algorithm]_minimal_n. -Please see -<settings.h> for details.

- - - -

Interface basics and general design

- -

All parallel algorithms are intended to have signatures that are -equivalent to the ISO C++ algorithms replaced. For instance, the -std::adjacent_find function is declared as: -

-
-namespace std
-{
-  template<typename _FIter>
-    _FIter
-    adjacent_find(_FIter, _FIter);
-}
-
- -

-Which means that there should be something equivalent for the parallel -version. Indeed, this is the case: -

- -
-namespace std
-{
-  namespace __parallel
-  {
-    template<typename _FIter>
-      _FIter
-      adjacent_find(_FIter, _FIter);
-
-    ...
-  }
-}
-
- -

But.... why the elipses? -

- -

The elipses in the example above represent additional overloads -required for the parallel version of the function. These additional -overloads are used to dispatch calls from the ISO C++ function -signature to the appropriate parallel function (or sequential -function, if no parallel functions are deemed worthy), based on either -compile-time or run-time conditions. -

- -

Compile-time conditions are referred to as "embarrassingly -parallel," and are denoted with the appropriate dispatch object, ie -one of __gnu_parallel::sequential_tag, -__gnu_parallel::parallel_tag, -__gnu_parallel::balanced_tag, -__gnu_parallel::unbalanced_tag, -__gnu_parallel::omp_loop_tag, or -__gnu_parallel::omp_loop_static_tag. -

- -

Run-time conditions depend on the hardware being used, the number -of threads available, etc., and are denoted by the use of the enum -__gnu_parallel::parallelism. Values of this enum include -__gnu_parallel::sequential, -__gnu_parallel::parallel_unbalanced, -__gnu_parallel::parallel_balanced, -__gnu_parallel::parallel_omp_loop, -__gnu_parallel::parallel_omp_loop_static, or -__gnu_parallel::parallel_taskqueue. -

- -

Putting all this together, the general view of overloads for the -parallel algorithms look like this: -

-
    -
  • ISO C++ signature
  • -
  • ISO C++ signature + sequential_tag argument
  • -
  • ISO C++ signature + parallelism argument
  • -
- -

Please note that the implementation may use additional functions -(designated with the _switch suffix) to dispatch from the -ISO C++ signature to the correct parallel version. Also, some of the -algorithms do not have support for run-time conditions, so the last -overload is therefore missing. -

- - -

Relevant namespaces

- -

One namespace contain versions of code that are explicitly sequential: -__gnu_serial. -

- -

Two namespaces contain the parallel mode: -std::__parallel and __gnu_parallel. -

- -

Parallel implementations of standard components, including -template helpers to select parallelism, are defined in namespace -std::__parallel. For instance, std::transform from -<algorithm> has a parallel counterpart in -std::__parallel::transform from -<parallel/algorithm>. In addition, these parallel -implementations are injected into namespace -__gnu_parallel with using declarations. -

- -

Support and general infrastructure is in namespace -__gnu_parallel. -

- -

More information, and an organized index of types and functions -related to the parallel mode on a per-namespace basis, can be found in -the generated source documentation. -

- -

Testing

- -

Both the normal conformance and regression tests and the -supplemental performance tests work.

- -

To run the conformance and regression tests with the parallel mode -active,

-make check-parallel - -

The log and summary files for conformance testing are in the -testsuite/parallel directory.

- -

To run the performance tests with the parallel mode active,

-make check-performance-parallel - -

The result file for performance testing are in the -testsuite directory, in the file -libstdc++_performance.sum. In addition, the policy-based -containers have their own visualizations, which have additional -software dependencies than the usual bare-boned text file, and can be -generated by using the make doc-performance rule in the -testsuite's Makefile.

- -

Return to the top of the page or - to the libstdc++ homepage. -

- - -

References / Further Reading

- -

-Johannes Singler, Peter Sanders, Felix Putze. The Multi-Core Standard Template Library. Euro-Par 2007: Parallel Processing. (LNCS 4641) -

- -

-Leonor Frias, Johannes Singler: Parallelization of Bulk Operations for STL Dictionaries. Workshop on Highly Parallel Processing on a Chip (HPPC) 2007. (LNCS) -

- - - -
-

-See license.html for copying conditions. -Comments and suggestions are welcome, and may be sent to -the libstdc++ mailing list. -

- - - - diff --git a/libstdc++-v3/docs/html/ext/pb_ds/PythonPoweredSmall.gif b/libstdc++-v3/docs/html/ext/pb_ds/PythonPoweredSmall.gif deleted file mode 100644 index 268980706ab..00000000000 Binary files a/libstdc++-v3/docs/html/ext/pb_ds/PythonPoweredSmall.gif and /dev/null differ diff --git a/libstdc++-v3/docs/html/ext/pb_ds/acks.html b/libstdc++-v3/docs/html/ext/pb_ds/acks.html deleted file mode 100644 index 6612a4a8184..00000000000 --- a/libstdc++-v3/docs/html/ext/pb_ds/acks.html +++ /dev/null @@ -1,65 +0,0 @@ - - - - - - - Acknowledgments - - - - -
-

Acknowledgments

- -
    -
  1. This library was partially written at IBM's Haifa Research - Labs.
  2. - -
  3. The library is based heavily on policy-based design and - uses many useful techniques from [alexandrescu01modern].
  4. - -
  5. Two ideas are borrowed from the SGI-STL implementation - [sgi_stl]: - -
      -
    1. The prime-based resize policies use a list of primes - taken from the SGI-STL implementation.
    2. - -
    3. The red-black trees contain both a root node and a - header node (containing metadata), connected in a way - that forward and reverse iteration can be performed - efficiently.
    4. -
    -
  6. - -
  7. Some test utilities borrow ideas from [boost_timer].
  8. - -
  9. We would like to thank Scott Meyers for useful comments - (without attributing to him any flaws in the design or - implementation of the library).
  10. - -
  11. Much of the documentation is [Python Powered] (especially through PyChart, Beautiful - Soup, and kjbuckets) - and uses [HTML tidy]. The CSS-driven menus are - slightly modified from Brothercake - (hopefully without introducing errors).
  12. -
-
- - diff --git a/libstdc++-v3/docs/html/ext/pb_ds/assoc_container_tag_cd.png b/libstdc++-v3/docs/html/ext/pb_ds/assoc_container_tag_cd.png deleted file mode 100644 index 16cc6da870d..00000000000 Binary files a/libstdc++-v3/docs/html/ext/pb_ds/assoc_container_tag_cd.png and /dev/null differ diff --git a/libstdc++-v3/docs/html/ext/pb_ds/assoc_container_tag_cd.svg b/libstdc++-v3/docs/html/ext/pb_ds/assoc_container_tag_cd.svg deleted file mode 100644 index 02be6241647..00000000000 --- a/libstdc++-v3/docs/html/ext/pb_ds/assoc_container_tag_cd.svg +++ /dev/null @@ -1,491 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - Benjamin Kosnik - - - - - - - - - - - - basic_hash_table_tag - basic_tree_tag - - - tree_tag - trie_tag - - associative_container_tag - - - - - cc_hash_table_tag - gp_hash_table_tag - - - - - list_update_tag - - rb_tree_tag - splay_tree_tag - - - - pat_trie_tag - - ov_tree_tag - - diff --git a/libstdc++-v3/docs/html/ext/pb_ds/assoc_container_traits.html b/libstdc++-v3/docs/html/ext/pb_ds/assoc_container_traits.html deleted file mode 100644 index 245b81c9409..00000000000 --- a/libstdc++-v3/docs/html/ext/pb_ds/assoc_container_traits.html +++ /dev/null @@ -1,170 +0,0 @@ - - - - - - - container_traits Interface - - - - -
-

container_traits Interface

- -

Traits of an associative-container based on its underlying - data structure.

- -

Defined in: tag_and_trait.hpp

- -

Template Parameters

- - - - - - - - - - - - - - - - - -
ParameterDescriptionDefault Value
-
-class Cntnr
-
-
-

Container type.

-
-
- -

Public Types and - Constants

- -

Container Attributes

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
TypeDefinitionDescription
-
-invalidation_guarantee
-
-
-
-Invalidation guarantee.
-
-
-

Invalidation-guarantee type.

- -

This is either basic_invalidation_guarantee, - point_invalidation_guarantee, or - range_invalidation_guarantee

-
-
-order_preserving
-
-
-
-True only if Cntnr objects guarantee storing  keys by order.
-
-
-

Order-preserving indicator.

-
-
-erase_can_throw
-
-
-
-True only if erasing a key can throw.
-
-
-

Erase-throw indicator.

-
-
-reverse_iteration
-
-
-
-True only reverse iterators are supported.
-
-
-

Reverse iteration indicator.

-
-
-split_join_can_throw
-
-
-
-True only if split or join operations can throw.
-
-
-

Split-join throw indicator.

-
-
- - diff --git a/libstdc++-v3/docs/html/ext/pb_ds/assoc_design.html b/libstdc++-v3/docs/html/ext/pb_ds/assoc_design.html deleted file mode 100644 index 6c501e26bbd..00000000000 --- a/libstdc++-v3/docs/html/ext/pb_ds/assoc_design.html +++ /dev/null @@ -1,46 +0,0 @@ - - - - - - - Associative Containers - - - - -
-

Associative-Container Design

- -
    -
  1. Data-Structure Genericity
  2. - -
  3. Genericity discusses generic manipulation of - containers based on different underlying - data structures.
  4. - -
  5. Genericity discusses generic manipulation of - containers with different mapping semantics.
  6. - -
  7. Tree-Based - Containers describes the design and policies of - tree-based containers.
  8. - -
  9. Trie-Based - Containers describes the design and policies of - trie-based containers.
  10. - -
  11. Hash-Based - Containers describes the design and policies of - hash-based containers.
  12. - -
  13. List-Based - Containers describes the design and policies of - list-based containers with update policies.
  14. -
-
- - diff --git a/libstdc++-v3/docs/html/ext/pb_ds/assoc_examples.html b/libstdc++-v3/docs/html/ext/pb_ds/assoc_examples.html deleted file mode 100644 index 6c166987fcb..00000000000 --- a/libstdc++-v3/docs/html/ext/pb_ds/assoc_examples.html +++ /dev/null @@ -1,174 +0,0 @@ - - - - - - - Examples - - - - -
-

Associative-Container Examples

- -

Basic Use

- -
    -
  1. basic_map.cc - Basic use of "maps".
  2. - -
  3. basic_set.cc - Basic use of "sets".
  4. - -
  5. erase_if.cc - Conditionally erasing values from a container object.
  6. -
- -

Generics

- -
    -
  1. assoc_container_traits.cc - Using container_traits to query - about underlying data structure behavior.
  2. - -
  3. hash_find_neg.cc - A non-compiling example showing wrong use of finding keys in - hash-based containers.
  4. -
- -

Hash-Based - Containers

- - -

Resize - Related

- - -
    -
  1. hash_initial_size.cc - Setting the initial size of a hash-based container - object.
  2. - -
  3. hash_resize_neg.cc - A non-compiling example showing how not to resize a - hash-based container object.
  4. - -
  5. hash_resize.cc - Resizing the size of a hash-based container object.
  6. - -
  7. hash_illegal_resize.cc - Showing an illegal resize of a hash-based container - object.
  8. - -
  9. hash_load_set_change.cc - Changing the load factors of a hash-based container - object.
  10. -
- -

Hash-Function - Related

- - -
    -
  1. hash_mod.cc - Using a modulo range-hashing function for the case of an - unknown skewed key distribution.
  2. - -
  3. shift_mask.cc - Writing a range-hashing functor for the case of a known - skewed key distribution.
  4. - -
  5. store_hash.cc - Storing the hash value along with each key.
  6. - -
  7. ranged_hash.cc - Writing a ranged-hash functor.
  8. -
- -

Tree-Like Containers (Trees and - Tries)

- - -

Node-Invariants

- - -
    -
  1. tree_order_statistics.cc - Using trees for order statistics.
  2. - -
  3. tree_intervals.cc - Augmenting trees to support operations on line - intervals.
  4. -
- -

Split and - Join

- - -
    -
  1. tree_join.cc - Joining two tree-based container objects.
  2. - -
  3. trie_split.cc - Splitting a PATRICIA trie container object.
  4. - -
  5. tree_order_statistics_join.cc - Order statistics while joining two tree-based container - objects.
  6. -
- -

Trie-Based - Containers

- - -
    -
  1. trie_dna.cc - Using a PATRICIA trie for DNA strings.
  2. - -
  3. trie_prefix_search.cc - Using a PATRICIA trie for finding all entries whose key - matches a given prefix.
  4. -
- -

"Multimaps" and - "Multisets".

-
    -
  1. basic_multimap.cc - Basic use of "multimaps".
  2. - -
  3. basic_multiset.cc - Basic use of "multisets".
  4. -
-
- - diff --git a/libstdc++-v3/docs/html/ext/pb_ds/assoc_performance_tests.html b/libstdc++-v3/docs/html/ext/pb_ds/assoc_performance_tests.html deleted file mode 100644 index 642f8480953..00000000000 --- a/libstdc++-v3/docs/html/ext/pb_ds/assoc_performance_tests.html +++ /dev/null @@ -1,345 +0,0 @@ - - - - - -Associative-Container Performance Tests - - - -
-

Associative-Container - Performance Tests

-

Settings

-

This section describes performance tests and their results. - In the following, g++, msvc++, and local (the build used for generating this - documentation) stand for three different builds:

-
-
-

g++

-
    -
  • CPU speed - cpu MHz : 2660.644
  • -
  • Memory - MemTotal: 484412 kB
  • -
  • Platform - - Linux-2.6.12-9-386-i686-with-debian-testing-unstable
  • -
  • Compiler - g++ (GCC) 4.0.2 20050808 (prerelease) - (Ubuntu 4.0.1-4ubuntu9) Copyright (C) 2005 Free Software - Foundation, Inc. This is free software; see the source - for copying conditions. There is NO warranty; not even - for MERCHANTABILITY or FITNESS FOR A PARTICULAR - PURPOSE.
  • -
-
-
-
-
-
-

msvc++

-
    -
  • CPU speed - cpu MHz : 2660.554
  • -
  • Memory - MemTotal: 484412 kB
  • -
  • Platform - Windows XP Pro
  • -
  • Compiler - Microsoft (R) 32-bit C/C++ Optimizing - Compiler Version 13.10.3077 for 80x86 Copyright (C) - Microsoft Corporation 1984-2002. All rights - reserved.
  • -
-
-
-
-

local

    -
  • CPU speed - cpu MHz : 2250.000
  • -
  • Memory - MemTotal: 2076248 kB
  • -
  • Platform - Linux-2.6.16-1.2133_FC5-i686-with-redhat-5-Bordeaux
  • -
  • Compiler - g++ (GCC) 4.1.1 20060525 (Red Hat 4.1.1-1) -Copyright (C) 2006 Free Software Foundation, Inc. -This is free software; see the source for copying conditions. There is NO -warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. -
  • -
-
-

Tests

-

Hash-Based - Containers

-
    -
  1. Hash-Based - Text find Find Timing Test
  2. -
  3. Hash-Based - Random-Integer find Find Timing Test
  4. -
  5. Hash-Based - Random-Integer Subscript Find Timing Test
  6. -
  7. Hash-Based - Random-Integer Subscript Insert Timing Test
  8. -
  9. Hash-Based - Skewed-Distribution Random-Integer find Find Timing - Test
  10. -
  11. Hash-Based Erase - Memory Use Test
  12. -
-

Tree-Like-Based Containers

-
    -
  1. Tree-Based - and Trie-Based Text Insert Timing Test
  2. -
  3. Tree-Based - and Trie-Based Text find Find Timing Test
  4. -
  5. Tree-Based - Locality-of-Reference Text find Find Timing - Test
  6. -
  7. Tree-Based - Random-Integer find Find Timing Test
  8. -
  9. Tree Split and - Join Timing Test
  10. -
  11. Tree - Order-Statistics Timing Test
  12. -
-

Multimaps

-
    -
  1. "Multimap" - Text Find Timing Test with Small Average Secondary-Key - to Primary-Key Ratio
  2. -
  3. "Multimap" - Text Find Timing Test with Large Average Secondary-Key - to Primary-Key Ratio
  4. -
  5. "Multimap" - Text Insert Timing Test with Small Average - Secondary-Key to Primary-Key Ratio
  6. -
  7. "Multimap" - Text Insert Timing Test with Large Average - Secondary-Key to Primary-Key Ratio
  8. -
  9. "Multimap" - Text Insert Memory-Use Test with Small Average - Secondary-Key to Primary-Key Ratio
  10. -
  11. "Multimap" - Text Insert Memory-Use Test with Large Average - Secondary-Key to Primary-Key Ratio
  12. -
-

Observations

-

Underlying Data-Structure Families

-

In general, hash-based containers (see Design::Associative - Containers::Hash-Based Containers) have better timing - performance than containers based on different underlying-data - structures. The main reason to choose a tree-based (see - Design::Associative - Containers::Tree-Based Containers) or trie-based container - (see Design::Associative - Containers::Trie-Based Containers) is if a byproduct of the - tree-like structure is required: either order-preservation, or - the ability to utilize node invariants (see Design::Associative - Containers::Tree-Based Containers::Node Invariants and - Design::Associative - Containers::Trie-Based Containers::Node Invariants). If - memory-use is the major factor, an ordered-vector tree (see - Design::Associative - Containers::Tree-Based Containers) gives optimal results - (albeit with high modificiation costs), and a list-based - container (see Design::Associative - Containers::List-Based Containers) gives reasonable - results.

-

Hash-Based - Container Types

-

Hash-based containers are typically either collision - chaining or probing (see Design::Associative - Containers::Hash-Based Containers). Collision-chaining - containers are more flexible internally, and so offer better - timing performance. Probing containers, if used for simple - value-types, manage memory more efficiently (they perform far - fewer allocation-related calls). In general, therefore, a - collision-chaining table should be used. A probing container, - conversely, might be used efficiently for operations such as - eliminating duplicates in a sequence, or counting the number of - occurrences within a sequence. Probing containers might be more - useful also in multithreaded applications where each thread - manipulates a hash-based container: in the STL, allocators have - class-wise semantics (see [meyers96more] - Item 10); a - probing container might incur less contention in this case.

-

Hash-Based Containers' Policies

-

In hash-based containers, the range-hashing scheme (see - Design::Associative - Containers::Hash-Based Containers::Hash Policies) seems to - affect performance more than other considerations. In most - settings, a mask-based scheme works well (or can be made to - work well). If the key-distribution can be estimated a-priori, - a simple hash function can produce nearly uniform hash-value - distribution. In many other cases (e.g., text hashing, - floating-point hashing), the hash function is powerful enough - to generate hash values with good uniformity properties - [knuth98sorting]; - a modulo-based scheme, taking into account all bits of the hash - value, appears to overlap the hash function in its effort.

-

The range-hashing scheme determines many of the other - policies (see Design::Hash-Based - Containers::Policy Interaction). A mask-based scheme works - well with an exponential-size policy (see Design::Associative - Containers::Hash-Based Containers::Resize Policies) ; for - probing-based containers, it goes well with a linear-probe - function (see Design::Associative - Containers::Hash-Based Containers::Hash Policies).

-

An orthogonal consideration is the trigger policy (see - Design::Associative - Containers::Hash-Based Containers::Resize Policies). This - presents difficult tradeoffs. E.g., different load - factors in a load-check trigger policy yield a - space/amortized-cost tradeoff.

-

Tree-Like-Based Container - Types

-

In general, there are several families of tree-based - underlying data structures: balanced node-based trees - (e.g., red-black or AVL trees), high-probability - balanced node-based trees (e.g., random treaps or - skip-lists), competitive node-based trees (e.g., splay - trees), vector-based "trees", and tries. (Additionally, there - are disk-residing or network-residing trees, such as B-Trees - and their numerous variants. An interface for this would have - to deal with the execution model and ACID guarantees; this is - out of the scope of this library.) Following are some - observations on their application to different settings.

-

Of the balanced node-based trees, this library includes a - red-black tree (see Design::Associative - Containers::Tree-Based Containers), as does STL (in - practice). This type of tree is the "workhorse" of tree-based - containers: it offers both reasonable modification and - reasonable lookup time. Unfortunately, this data structure - stores a huge amount of metadata. Each node must contain, - besides a value, three pointers and a boolean. This type might - be avoided if space is at a premium [austern00noset].

-

High-probability balanced node-based trees suffer the - drawbacks of deterministic balanced trees. Although they are - fascinating data structures, preliminary tests with them showed - their performance was worse than red-black trees. The library - does not contain any such trees, therefore.

-

Competitive node-based trees have two drawbacks. They are - usually somewhat unbalanced, and they perform a large number of - comparisons. Balanced trees perform one comparison per each - node they encounter on a search path; a splay tree performs two - comparisons. If the keys are complex objects, e.g., - std::string, this can increase the running time. - Conversely, such trees do well when there is much locality of - reference. It is difficult to determine in which case to prefer - such trees over balanced trees. This library includes a splay - tree (see Design::Associative - Containers::Tree-Based Containers).

-

Ordered-vector trees (see Design::Associative - Containers::Tree-Based Containers) use very little space - [austern00noset]. - They do not have any other advantages (at least in this - implementation).

-

Large-fan-out PATRICIA tries (see Design::Associative - Containers::Trie-Based Containers) have excellent lookup - performance, but they do so through maintaining, for each node, - a miniature "hash-table". Their space efficiency is low, and - their modification performance is bad. These tries might be - used for semi-static settings, where order preservation is - important. Alternatively, red-black trees cross-referenced with - hash tables can be used. [okasaki98mereable] - discusses small-fan-out PATRICIA tries for integers, but the - cited results seem to indicate that the amortized cost of - maintaining such trees is higher than that of balanced trees. - Moderate-fan-out trees might be useful for sequences where each - element has a limited number of choices, e.g., DNA - strings (see Examples::Associative - Containers::Trie-Based Containers).

-

Mapping-Semantics - Considerations

-

Different mapping semantics were discussed in Motivation::Associative - Containers::Alternative to Multiple Equivalent Keys and - Tutorial::Associative - Containers::Associative Containers Others than Maps. We - will focus here on the case where a keys can be composed into - primary keys and secondary keys. (In the case where some keys - are completely identical, it is trivial that one should use an - associative container mapping values to size types.) In this - case there are (at least) five possibilities:

-
    -
  1. Use an associative container that allows equivalent-key - values (such as std::multimap)
  2. -
  3. Use a unique-key value associative container that maps - each primary key to some complex associative container of - secondary keys, say a tree-based or hash-based container (see - Design::Associative - Containers::Tree-Based Containers and Design::Associative - Containers::Hash-Based Containers)
  4. -
  5. Use a unique-key value associative container that maps - each primary key to some simple associative container of - secondary keys, say a list-based container (see Design::Associative - Containers::List-Based Containers)
  6. -
  7. Use a unique-key value associative container that maps - each primary key to some non-associative container - (e.g., std::vector)
  8. -
  9. Use a unique-key value associative container that takes - into account both primary and secondary keys.
  10. -
-

We do not think there is a simple answer for this (excluding - option 1, which we think should be avoided in all cases).

-

If the expected ratio of secondary keys to primary keys is - small, then 3 and 4 seem reasonable. Both types of secondary - containers are relatively lightweight (in terms of memory use - and construction time), and so creating an entire container - object for each primary key is not too expensive. Option 4 - might be preferable to option 3 if changing the secondary key - of some primary key is frequent - one cannot modify an - associative container's key, and the only possibility, - therefore, is erasing the secondary key and inserting another - one instead; a non-associative container, conversely, can - support in-place modification. The actual cost of erasing a - secondary key and inserting another one depends also on the - allocator used for secondary associative-containers (The tests - above used the standard allocator, but in practice one might - choose to use, e.g., [boost_pool]). Option 2 is - definitely an overkill in this case. Option 1 loses out either - immediately (when there is one secondary key per primary key) - or almost immediately after that. Option 5 has the same - drawbacks as option 2, but it has the additional drawback that - finding all values whose primary key is equivalent to some key, - might be linear in the total number of values stored (for - example, if using a hash-based container).

-

If the expected ratio of secondary keys to primary keys is - large, then the answer is more complicated. It depends on the - distribution of secondary keys to primary keys, the - distribution of accesses according to primary keys, and the - types of operations most frequent.

-

To be more precise, assume there are m primary keys, - primary key i is mapped to ni - secondary keys, and each primary key is mapped, on average, to - n secondary keys (i.e., - E(ni) = n).

-

Suppose one wants to find a specific pair of primary and - secondary keys. Using 1 with a tree based container - (std::multimap), the expected cost is - E(Θ(log(m) + ni)) = Θ(log(m) + - n); using 1 with a hash-based container - (std::tr1::unordered_multimap), the expected cost is - Θ(n). Using 2 with a primary hash-based container - and secondary hash-based containers, the expected cost is - O(1); using 2 with a primary tree-based container and - secondary tree-based containers, the expected cost is (using - the Jensen inequality [motwani95random]) - E(O(log(m) + log(ni)) = O(log(m)) + - E(O(log(ni)) = O(log(m)) + O(log(n)), - assuming that primary keys are accessed equiprobably. 3 and 4 - are similar to 1, but with lower constants. Using 5 with a - hash-based container, the expected cost is O(1); using 5 - with a tree based container, the cost is - E(Θ(log(mn))) = Θ(log(m) + - log(n)).

-

Suppose one needs the values whose primary key matches some - given key. Using 1 with a hash-based container, the expected - cost is Θ(n), but the values will not be ordered - by secondary keys (which may or may not be required); using 1 - with a tree-based container, the expected cost is - Θ(log(m) + n), but with high constants; again the - values will not be ordered by secondary keys. 2, 3, and 4 are - similar to 1, but typically with lower constants (and, - additionally, if one uses a tree-based container for secondary - keys, they will be ordered). Using 5 with a hash-based - container, the cost is Θ(mn).

-

Suppose one wants to assign to a primary key all secondary - keys assigned to a different primary key. Using 1 with a - hash-based container, the expected cost is Θ(n), - but with very high constants; using 1 with a tree-based - container, the cost is Θ(nlog(mn)). Using 2, 3, - and 4, the expected cost is Θ(n), but typically - with far lower costs than 1. 5 is similar to 1.

-
- - diff --git a/libstdc++-v3/docs/html/ext/pb_ds/assoc_regression_tests.html b/libstdc++-v3/docs/html/ext/pb_ds/assoc_regression_tests.html deleted file mode 100644 index 178aadf985f..00000000000 --- a/libstdc++-v3/docs/html/ext/pb_ds/assoc_regression_tests.html +++ /dev/null @@ -1,96 +0,0 @@ - - - - - - - Associative-Container Regression Tests - - - - -
-

Associative-Container Regression Tests

- -

Description

- -

The library contains a single comprehensive regression test. - For a given container type in pb_ds, the test creates - an object of the container type and an object of the - corresponding STL type (e.g., std::set). It - then performs a random sequence of methods with random - arguments (e.g., inserts, erases, and so forth) on both - objects. At each operation, the test checks the return value of - the method, and optionally both compares pb_ds's - object with the STL's object as well as performing other - consistency checks on pb_ds's object (e.g., - order preservation, when applicable, or node invariants, when - applicable).

- -

Additionally, the test integrally checks exception safety - and resource leaks. This is done as follows. A special - allocator type, written for the purpose of the test, both - randomly throws an exceptions when allocations are performed, - and tracks allocations and de-allocations. The exceptions thrown - at allocations simulate memory-allocation failures; the - tracking mechanism checks for memory-related bugs (e.g., - resource leaks and multiple de-allocations). Both - pb_ds's containers and the containers' value-types are - configured to use this allocator.

- -

Due to compiler constraints, the test is split into the - several sources, each checking only some containers.

- -

Tests

- -

"Set" - Tests

- -

The following check all "set" types:

- -
    -
  1. hash_no_data_map_rand.cc - checks all hash-based "set" types.
  2. - -
  3. list_update_no_data_map_rand.cc - checks all list-based "set" types.
  4. - -
  5. tree_no_data_map_rand.cc - checks all tree-based "set" types.
  6. - -
  7. trie_no_data_map_rand.cc - checks all PATRICIA-trie-based "set" types.
  8. -
- -

"Map" - Tests

- -

The following check all "map" types:

- -
    -
  1. hash_data_map_rand.cc - checks all hash-based "map" types.
  2. - -
  3. list_update_data_map_rand.cc - checks all list-based "map" types.
  4. - -
  5. tree_data_map_rand.cc - checks all tree-based "map" types.
  6. - -
  7. trie_data_map_rand.cc - checks all PATRICIA-trie-based "map" types.
  8. -
-
- - diff --git a/libstdc++-v3/docs/html/ext/pb_ds/assoc_tests.html b/libstdc++-v3/docs/html/ext/pb_ds/assoc_tests.html deleted file mode 100644 index 6e4474945d3..00000000000 --- a/libstdc++-v3/docs/html/ext/pb_ds/assoc_tests.html +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - Associative-Container Tests - - - - -
-

Associative-Container Tests

- -

Associative-Container - Regression Tests describes the regression tests; Associative-Container - Performance Tests describes the performance tests.

-
- - diff --git a/libstdc++-v3/docs/html/ext/pb_ds/associative_container_tag.html b/libstdc++-v3/docs/html/ext/pb_ds/associative_container_tag.html deleted file mode 100644 index 5c44efe231c..00000000000 --- a/libstdc++-v3/docs/html/ext/pb_ds/associative_container_tag.html +++ /dev/null @@ -1,47 +0,0 @@ - - - - - - - associative_container_tag Interface - - - - -
-

associative_container_tag Interface

- -

Basic associative-container data structure tag.

- -

Defined in: tag_and_trait.hpp

- -

Base Classes

- - - - - - - - - - - - - -
ClassDerivation Type
-
-container_tag
-
-
-

public

-
-
- - diff --git a/libstdc++-v3/docs/html/ext/pb_ds/balls_and_bins.png b/libstdc++-v3/docs/html/ext/pb_ds/balls_and_bins.png deleted file mode 100644 index 529c3ae41bc..00000000000 Binary files a/libstdc++-v3/docs/html/ext/pb_ds/balls_and_bins.png and /dev/null differ diff --git a/libstdc++-v3/docs/html/ext/pb_ds/basic_hash_table.html b/libstdc++-v3/docs/html/ext/pb_ds/basic_hash_table.html deleted file mode 100644 index a6c569c2bb1..00000000000 --- a/libstdc++-v3/docs/html/ext/pb_ds/basic_hash_table.html +++ /dev/null @@ -1,436 +0,0 @@ - - - - - - - basic_hash_table Interface - - - - -
-

basic_hash_table Interface

- -

An abstract basic hash-based associative container.

- -

Defined in: assoc_container.hpp

- -

Template Parameters

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ParameterDescriptionDefault Value
-
-typename Key
-
-
-

Key type.

-
-
-
-typename Mapped
-
-
-

Mapped type.

-
-
-
-class Hash_Fn
-
-
-

Hash functor.

-
-
-
-class Eq_Fn
-
-
-

Equivalence functor.

-
-
-
-class Resize_Policy
-
-
-

Resize policy.

-
-
-
-bool Store_Hash
-
-
-

Indicates whether the hash value will be stored along - with each key.

-
-
-
-class Tag
-
-
-

Mapped-structure tag.

-
-
-
-class Allocator
-
-
-

Allocator type.

-
-
- -

Base Classes

- - - - - - - - - - - - - - - - - - - -
ClassDerivation Type
-
-Resize_Policy
-
-
-

public

-
-
-container_base
-
-
-

public

-
- -

Public Types and - Constants

- -

Policy Definitions

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
TypeDefinitionDescription
-
-hash_fn
-
-
-
-Hash_Fn
-
-
-

Hash functor type.

-
-
-eq_fn
-
-
-
-Eq_Fn
-
-
-

Equivalence functor type.

-
-
-resize_policy
-
-
-
-Resize_Policy
-
-
-

Resize policy type.

-
-
-store_hash
-
-
-
-Store_Hash
-
-
-

Indicates whether a hash value is stored with each - entry.

-
- -

Public Methods

- -

Constructors, Destructor, and - Related

- - - - - - - - - - - - - -
MethodDescription
-
-virtual 
-  ~basic_hash_table
-  ()
-
-
-

Destructor.

-
- -

Policy Access Methods

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
MethodDescription
-
-hash_fn &
-  get_hash_fn
-  ()
-
-
-

Access to the hash_fn object.

-
-
-const hash_fn &
-  get_hash_fn
-  () const
-
-
-

Const access to the hash_fn object.

-
-
-eq_fn &
-  get_eq_fn
-  ()
-
-
-

Access to the eq_fn - object.

-
-
-const eq_fn &
-  get_eq_fn
-  () const
-
-
-

Const access to the eq_fn object.

-
-
-resize_policy &
-  get_resize_policy
-  ()
-
-
-

Access to the resize_policy - object.

-
-
-const resize_policy &
-  get_resize_policy
-  () const
-
-
-

Const access to the resize_policy - object.

-
- -

Private Methods

- -

Resize Methods

- - - - - - - - - - - - - -
MethodDescription
-
-virtual void 
-  do_resize
-  (size_type new_size)
-
-
-

Resizes the container object to new_size.

-
-
- - diff --git a/libstdc++-v3/docs/html/ext/pb_ds/basic_hash_tag.html b/libstdc++-v3/docs/html/ext/pb_ds/basic_hash_tag.html deleted file mode 100644 index 8110c0dfc4f..00000000000 --- a/libstdc++-v3/docs/html/ext/pb_ds/basic_hash_tag.html +++ /dev/null @@ -1,47 +0,0 @@ - - - - - - - basic_hash_tag Interface - - - - -
-

basic_hash_tag Interface

- -

Basic hash data structure tag.

- -

Defined in: tag_and_trait.hpp

- -

Base Classes

- - - - - - - - - - - - - -
ClassDerivation Type
-
-associative_container_tag
-
-
-

public

-
-
- - diff --git a/libstdc++-v3/docs/html/ext/pb_ds/basic_invalidation_guarantee.html b/libstdc++-v3/docs/html/ext/pb_ds/basic_invalidation_guarantee.html deleted file mode 100644 index c4c242bbded..00000000000 --- a/libstdc++-v3/docs/html/ext/pb_ds/basic_invalidation_guarantee.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - basic_invalidation_guarantee Interface - - - - -
-

basic_invalidation_guarantee Interface

- -

Signifies a basic invalidation guarantee that any iterator, - pointer, or reference to a container object's mapped value type - is valid as long as the container is not modified.

- -

Defined in: tag_and_trait.hpp

-
- - diff --git a/libstdc++-v3/docs/html/ext/pb_ds/basic_tree.html b/libstdc++-v3/docs/html/ext/pb_ds/basic_tree.html deleted file mode 100644 index f66d7a9f7a6..00000000000 --- a/libstdc++-v3/docs/html/ext/pb_ds/basic_tree.html +++ /dev/null @@ -1,660 +0,0 @@ - - - - - - - basic_tree Interface - - - - -
-

basic_tree Interface

- -

An abstract basic tree-like-based associative container.

- -

Defined in: assoc_container.hpp

- -

Template Parameters

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ParameterDescriptionDefault Value
-
-typename Key
-
-
-

Key type.

-
-
-
-typename Mapped
-
-
-

Mapped type.

-
-
-
-class Tag
-
-
-

Mapped-structure tag.

-
-
-
-class Node_Update
-
-
-

Node updater.

- -

Restores node-invariants when invalidated.

-
-
-
-class Policy_Tl
-
-
-

Policy typelist.

- -

Contains subclasses' policies.

-
-
-
-class Allocator
-
-
-

Allocator type.

-
-
- -

Base Classes

- - - - - - - - - - - - - - - - - - - -
ClassDerivation Type
-
-Node_Update
-
-
-

public

-
-
-container_base
-
-
-

public

-
- -

Public Types and - Constants

- -

Key-Type Definitions

- - - - - - - - - - - - - - - - - -
TypeDefinitionDescription
-
-const_key_reference
-
-
-
-typename container_base::const_key_reference
-
-
-

Const key reference type.

-
- -

Policy Definitions

- - - - - - - - - - - - - - - - - -
TypeDefinitionDescription
-
-node_update
-
-
-
-Node_Update
-
-
-

Node updater type.

-
- -

Iterator Definitions

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
TypeDefinitionDescription
-
-const_iterator
-
-
-
-typename container_base::const_iterator
-
-
-

Const range-type iterator.

-
-
-iterator
-
-
-
-typename container_base::iterator
-
-
-

Range-type iterator.

-
-
-const_reverse_iterator
-
-
-
-Const reverse range-type iterator.
-
-
-

Const reverse range-type iterator.

-
-
-reverse_iterator
-
-
-
-Reverse range-type iterator.
-If Mapped is null_mapped_type, then this is synonymous to const_reverse_iterator -
-
-

Reverse range-type iterator.

-
- -

Public Methods

- -

Constructors, Destructor, and - Related

- - - - - - - - - - - - - -
MethodDescription
-
-virtual 
-  ~basic_tree
-  ()
-
-
-

Destructor.

-
- -

Policy Access Methods

- - - - - - - - - - - - - - - - - - - -
MethodDescription
-
-node_update &
-  get_node_update
-  ()
-
-
-

Access to the node_update - object.

-
-
-const node_update &
-  get_node_update
-  () const
-
-
-

Const access to the node_update - object.

-
- -

Find Methods

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
MethodDescription
-
-iterator
-  lower_bound
-  (const_key_reference r_key)
-
-
-

Returns an iterator corresponding - to the entry whose key is the smallest one at least as - large as r_key.

-
-
-const_iterator
-  lower_bound
-  (const_key_reference r_key) const
-
-
-

Returns a const iterator corresponding - to the entry whose key is the smallest one at least as - large as r_key.

-
-
-iterator
-  upper_bound
-  (const_key_reference r_key)
-
-
-

Returns an iterator corresponding - to the entry whose key is the smallest one larger than - r_key.

-
-
-const_iterator
-  upper_bound
-  (const_key_reference r_key) const
-
-
-

Returns a const_iterator - corresponding to the entry whose key is the smallest one - larger than r_key.

-
- -

Erase Methods

- - - - - - - - - - - - - - - - - - - -
MethodDescription
-
-iterator
-  erase
-  (iterator it)
-
-
-

Erases the value_type corresponding to the iterator it. Returns the iterator corresponding - to the next value_type.

-
-
-reverse_iterator
-  erase
-  (reverse_iterator it)
-
-
-

Erases the value_type corresponding to the reverse_iterator - it. Returns the reverse_iterator - corresponding to the previous value_type.

-
- -

Iteration Methods

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
MethodDescription
-
-reverse_iterator
-  rbegin
-  ()
-
-
-

Returns a reverse_iterator - corresponding to the last value_type in the - container.

-
-
-const_reverse_iterator
-  rbegin
-  () const
-
-
-

Returns a const_reverse_iterator - corresponding to the last value_type in the - container.

-
-
-reverse_iterator
-  rend
-  ()
-
-
-

Returns a reverse_iterator - corresponding to the just-before-first value_type in the - container.

-
-
-const_reverse_iterator
-  rend
-  () const
-
-
-

Returns a const_reverse_iterator - corresponding to the just-before-first value_type in the - container.

-
- -

Split and join - Methods

- - - - - - - - - - - - - - - - - - - -
MethodDescription
-
-void 
-  join
-  (basic_tree &other)
-
-
-

Joins two trees. When this function returns, - other will be - empty.

- -

When calling this method, other's keys must be all larger or - all smaller than this object's keys, and other's policies must be - equivalent to this object's policies.

-
-
-void
-  split
-  (const_key_reference r_key, 
-    basic_tree &other)
-
-
-

Splits into two trees. When this function returns, - other will contain - only keys larger than r_key.

- -

When calling this method, other's policies must be - equivalent to this object's policies.

-
-
- - diff --git a/libstdc++-v3/docs/html/ext/pb_ds/basic_tree_assoc_container_const_node_iterator.html b/libstdc++-v3/docs/html/ext/pb_ds/basic_tree_assoc_container_const_node_iterator.html deleted file mode 100644 index 5647f551e95..00000000000 --- a/libstdc++-v3/docs/html/ext/pb_ds/basic_tree_assoc_container_const_node_iterator.html +++ /dev/null @@ -1,383 +0,0 @@ - - - - - - - tree::const_node_iterator - Interface - - - - -
-

tree::const_node_iterator - Interface

- -

Const node iterator.

- -

This is an &qout;iterator to an iterator&qout; - it - iterates over nodes, and de-referencing it returns one of the - tree's iterators

- -

Public Types and - Constants

- -

Iterator Definitions

- - - - - - - - - - - - - - - - - - - - - - - - - -
TypeDefinitionDescription
-
-iterator_category
-
-
-
-trivial_iterator_tag
-
-
-

Category.

- -

This tag identifies that the iterator has none of the - STL's iterators' movement abilities.

-
-
-difference_type
-
-
-
-void
-
-
-

Difference type.

-
- -

Value-Type Definitions

- -

Note that a node iterator's value type is actually a tree - iterator.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
TypeDefinitionDescription
-
-value_type
-
-
-
-container_base::const_iterator
-
-
-

Iterator's value type.

-
-
-reference
-
-
-
-container_base::const_iterator
-
-
-

Iterator's reference type.

-
-
-const_reference
-
-
-
-container_base::const_iterator
-
-
-

Iterator's const reference type.

-
- -

Metadata Definitions

- -

These are only defined if - basic_tree::Node_Update - is not null_tree_node_update

- - - - - - - - - - - - - - - - - - - - - - - - - -
TypeDefinitionDescription
-
-metadata_type
-
-
-
-typename basic_tree::Node_Update::metadata_type
-
-
-

Metadata type.

-
-
-const_metadata_reference
-
-
-
-typename Allocator::template rebind<
-    metadata_type>::other::const_reference
-
-
-

Const metadata reference type.

-
- -

Public Methods

- -

Constructors, Destructor, and - Related

- - - - - - - - - - - - - -
MethodDescription
-
-inline 
-  const_node_iterator
-  ()
-
-
-

Default constructor.

-
- -

Access Methods

- - - - - - - - - - - - - -
MethodDescription
-
-inline const_reference
-  operator*
-  () const
-
-
-

Access.

-
- -

Metadata Access Methods

- -

These are only defined if - basic_tree::Node_Update - is not null_tree_node_update

- - - - - - - - - - - - - -
MethodDescription
-
-inline const_metadata_reference
-  get_metadata
-  () const
-
-
-

Metadata access.

-
- -

Movement Methods

- - - - - - - - - - - - - - - - - - - -
MethodDescription
-
-inline const_node_iterator
-  get_l_child
-  () const
-
-
-

Returns the const node iterator associated with the - left node.

-
-
-inline const_node_iterator
-  get_r_child
-  () const
-
-
-

Returns the const node iterator associated with the - right node.

-
- -

Comparison Methods

- - - - - - - - - - - - - - - - - - - -
MethodDescription
-
-inline bool
-  operator==
-  (const const_node_iterator &other) const
-
-
-

Compares to a different iterator object.

-
-
-inline bool
-  operator!=
-  (const const_node_iterator &other) const
-
-
-

Compares (negatively) to a different iterator - object.

-
-
- - diff --git a/libstdc++-v3/docs/html/ext/pb_ds/basic_tree_tag.html b/libstdc++-v3/docs/html/ext/pb_ds/basic_tree_tag.html deleted file mode 100644 index c35ecad4a2d..00000000000 --- a/libstdc++-v3/docs/html/ext/pb_ds/basic_tree_tag.html +++ /dev/null @@ -1,47 +0,0 @@ - - - - - - - basic_tree_tag Interface - - - - -
-

basic_tree_tag Interface

- -

Basic tree-like data structure tag.

- -

Defined in: tag_and_trait.hpp

- -

Base Classes

- - - - - - - - - - - - - -
ClassDerivation Type
-
-associative_container_tag
-
-
-

public

-
-
- - diff --git a/libstdc++-v3/docs/html/ext/pb_ds/binary_heap_tag.html b/libstdc++-v3/docs/html/ext/pb_ds/binary_heap_tag.html deleted file mode 100644 index 47f42477be3..00000000000 --- a/libstdc++-v3/docs/html/ext/pb_ds/binary_heap_tag.html +++ /dev/null @@ -1,47 +0,0 @@ - - - - - - - binary_heap_tag Interface - - - - -
-

binary_heap_tag Interface

- -

Binary-heap (array-based) data structure tag.

- -

Defined in: tag_and_trait.hpp

- -

Base Classes

- - - - - - - - - - - - - -
ClassDerivation Type
-
-priority_queue_tag
-
-
-

public

-
-
- - diff --git a/libstdc++-v3/docs/html/ext/pb_ds/binary_priority_queue_random_int_push_timing_test_gcc.png b/libstdc++-v3/docs/html/ext/pb_ds/binary_priority_queue_random_int_push_timing_test_gcc.png deleted file mode 100644 index 07f0953a661..00000000000 Binary files a/libstdc++-v3/docs/html/ext/pb_ds/binary_priority_queue_random_int_push_timing_test_gcc.png and /dev/null differ diff --git a/libstdc++-v3/docs/html/ext/pb_ds/binary_priority_queue_random_int_push_timing_test_local.png b/libstdc++-v3/docs/html/ext/pb_ds/binary_priority_queue_random_int_push_timing_test_local.png deleted file mode 100644 index 76e02f134f0..00000000000 Binary files a/libstdc++-v3/docs/html/ext/pb_ds/binary_priority_queue_random_int_push_timing_test_local.png and /dev/null differ diff --git a/libstdc++-v3/docs/html/ext/pb_ds/binary_priority_queue_random_int_push_timing_test_msvc.png b/libstdc++-v3/docs/html/ext/pb_ds/binary_priority_queue_random_int_push_timing_test_msvc.png deleted file mode 100644 index b8a3b237124..00000000000 Binary files a/libstdc++-v3/docs/html/ext/pb_ds/binary_priority_queue_random_int_push_timing_test_msvc.png and /dev/null differ diff --git a/libstdc++-v3/docs/html/ext/pb_ds/binomial_heap_tag.html b/libstdc++-v3/docs/html/ext/pb_ds/binomial_heap_tag.html deleted file mode 100644 index 6b5e849e42b..00000000000 --- a/libstdc++-v3/docs/html/ext/pb_ds/binomial_heap_tag.html +++ /dev/null @@ -1,47 +0,0 @@ - - - - - - - binomial_heap_tag Interface - - - - -
-

binomial_heap_tag Interface

- -

Binomial-heap data structure tag.

- -

Defined in: tag_and_trait.hpp

- -

Base Classes

- - - - - - - - - - - - - -
ClassDerivation Type
-
-priority_queue_tag
-
-
-

public

-
-
- - diff --git a/libstdc++-v3/docs/html/ext/pb_ds/cc_hash_max_collision_check_resize_trigger.html b/libstdc++-v3/docs/html/ext/pb_ds/cc_hash_max_collision_check_resize_trigger.html deleted file mode 100644 index e07c51e3a64..00000000000 --- a/libstdc++-v3/docs/html/ext/pb_ds/cc_hash_max_collision_check_resize_trigger.html +++ /dev/null @@ -1,532 +0,0 @@ - - - - - - - cc_hash_max_collision_check_resize_trigger - Interface - - - - -
-

cc_hash_max_collision_check_resize_trigger - Interface

- -

A resize trigger policy based on collision checks. It keeps - the simulated load factor lower than some given load - factor.

- -

Defined in: hash_policy.hpp

- -

Template Parameters

- - - - - - - - - - - - - - - - - - - - - - - - - -
ParameterDescriptionDefault Value
-
-bool External_Load_Access 
-
-
-

Specifies whether the load factor can be accessed - externally. The two options have different trade-offs in - terms of flexibility, genericity, and encapsulation.

-
false
-
-typename Size_Type 
-
-
-

Size type.

-
size_t
- -

Public Types and - Constants

- -

General Definitions

- - - - - - - - - - - - - - - - - - - - - - - - - -
TypeDefinitionDescription
-
-size_type
-
-
-
-Size_Type
-
-
-

Size type.

-
-
-external_load_access
-
-
-
-External_Load_Access
-
-
-

Indicates whether loads can be accessed externally

-
- -

Public Methods

- -

Constructors, Destructor, and - Related

- - - - - - - - - - - - - - - - - - - -
MethodDescription
-
-  cc_hash_max_collision_check_resize_trigger
-  (float load = 0.5)
-
-
-

Default constructor, or constructor taking - load, a load factor - which it will attempt to maintain.

-
-
-void
-  swap
-  (cc_hash_max_collision_check_resize_trigger &other)
-
-
-

Swaps content.

-
- -

Load Access Methods

- -

These methods are only available if the external access - parameter is set.

- - - - - - - - - - - - - - - - - - - -
MethodDescription
-
-inline float
-  get_load
-  () const
-
-
-

Returns the current load.

- -

Calling this method will not compile when External_Load_Access - == false.

-
-
-void 
-  set_load
-  (float load)
-
-
-

Sets the load; does - not resize the container.

- -

It is the responsibility of the user to pass an - appropriate load to this - function. Calling this method will not compile when - External_Load_Access - == false.

-
- -

Protected Methods

- -

Insert Search - Notifications.

- -

Notifications called during an insert operation.

- - - - - - - - - - - - - - - - - - - - - - - - - -
MethodDescription
-
-inline void
-  notify_insert_search_start
-  ()
-
-
-

Notifies a search started.

-
-
-inline void
-  notify_insert_search_collision
-  ()
-
-
-

Notifies a search encountered a collision.

-
-
-inline void
-  notify_insert_search_end
-  ()
-
-
-

Notifies a search ended.

-
- -

Find Search - Notifications.

- -

Notifications called during a find operation.

- - - - - - - - - - - - - - - - - - - - - - - - - -
MethodDescription
-
-inline void
-  notify_find_search_start
-  ()
-
-
-

Notifies a search started.

-
-
-inline void
-  notify_find_search_collision
-  ()
-
-
-

Notifies a search encountered a collision.

-
-
-inline void
-  notify_find_search_end
-  ()
-
-
-

Notifies a search ended.

-
- -

Erase Search - Notifications.

- -

Notifications called during an insert operation.

- - - - - - - - - - - - - - - - - - - - - - - - - -
MethodDescription
-
-inline void
-  notify_erase_search_start
-  ()
-
-
-

Notifies a search started.

-
-
-inline void
-  notify_erase_search_collision
-  ()
-
-
-

Notifies a search encountered a collision.

-
-
-inline void
-  notify_erase_search_end
-  ()
-
-
-

Notifies a search ended.

-
- -

Content Change - Notifications

- -

Notifications called when the content of the table changes - in a way that can affect the resize policy.

- - - - - - - - - - - - - - - - - - - - - - - - - -
MethodDescription
-
-inline void
-  notify_inserted
-  (size_type num_entries)
-
-
-

Notifies an element was inserted.

-
-
-inline void
-  notify_erased
-  (size_type num_entries)
-
-
-

Notifies an element was erased.

-
-
-void 
-  notify_cleared
-  ()
-
-
-

Notifies the table was cleared.

-
- -

Size Change - Notifications

- -

Notifications called when the table changes size.

- - - - - - - - - - - - - - - - - - - -
MethodDescription
-
-void
-  notify_resized
-  (size_type new_size)
-
-
-

Notifies the table was resized as a result of this - object's signifying that a resize is needed.

-
-
-void
-  notify_externally_resized
-  (size_type new_size)
-
-
-

Notifies the table was resized externally.

-
- -

Queries

- -

Called to query whether/how to resize.

- - - - - - - - - - - - - - - - - - - -
MethodDescription
-
-inline bool 
-  is_resize_needed
-  () const
-
-
-

Queries whether a resize is needed.

-
-
-inline bool
-  is_grow_needed
-  (size_type size, size_type num_entries) const
-
-
-

Queries whether a grow is needed.

- -

This method is called only if this object indicated is - needed.

-
-
- - diff --git a/libstdc++-v3/docs/html/ext/pb_ds/cc_hash_random_int_find_timing_test_gcc.png b/libstdc++-v3/docs/html/ext/pb_ds/cc_hash_random_int_find_timing_test_gcc.png deleted file mode 100644 index 85b9eca4ff6..00000000000 Binary files a/libstdc++-v3/docs/html/ext/pb_ds/cc_hash_random_int_find_timing_test_gcc.png and /dev/null differ diff --git a/libstdc++-v3/docs/html/ext/pb_ds/cc_hash_random_int_find_timing_test_local.png b/libstdc++-v3/docs/html/ext/pb_ds/cc_hash_random_int_find_timing_test_local.png deleted file mode 100644 index 4f578c65b1e..00000000000 Binary files a/libstdc++-v3/docs/html/ext/pb_ds/cc_hash_random_int_find_timing_test_local.png and /dev/null differ diff --git a/libstdc++-v3/docs/html/ext/pb_ds/cc_hash_random_int_find_timing_test_msvc.png b/libstdc++-v3/docs/html/ext/pb_ds/cc_hash_random_int_find_timing_test_msvc.png deleted file mode 100644 index d1234aa11d8..00000000000 Binary files a/libstdc++-v3/docs/html/ext/pb_ds/cc_hash_random_int_find_timing_test_msvc.png and /dev/null differ diff --git a/libstdc++-v3/docs/html/ext/pb_ds/cc_hash_random_int_subscript_timing_test_find_gcc.png b/libstdc++-v3/docs/html/ext/pb_ds/cc_hash_random_int_subscript_timing_test_find_gcc.png deleted file mode 100644 index 1db2cc0c6a8..00000000000 Binary files a/libstdc++-v3/docs/html/ext/pb_ds/cc_hash_random_int_subscript_timing_test_find_gcc.png and /dev/null differ diff --git a/libstdc++-v3/docs/html/ext/pb_ds/cc_hash_random_int_subscript_timing_test_find_local.png b/libstdc++-v3/docs/html/ext/pb_ds/cc_hash_random_int_subscript_timing_test_find_local.png deleted file mode 100644 index ca4db96f457..00000000000 Binary files a/libstdc++-v3/docs/html/ext/pb_ds/cc_hash_random_int_subscript_timing_test_find_local.png and /dev/null differ diff --git a/libstdc++-v3/docs/html/ext/pb_ds/cc_hash_random_int_subscript_timing_test_find_msvc.png b/libstdc++-v3/docs/html/ext/pb_ds/cc_hash_random_int_subscript_timing_test_find_msvc.png deleted file mode 100644 index 0b51d9432a9..00000000000 Binary files a/libstdc++-v3/docs/html/ext/pb_ds/cc_hash_random_int_subscript_timing_test_find_msvc.png and /dev/null differ diff --git a/libstdc++-v3/docs/html/ext/pb_ds/cc_hash_random_int_subscript_timing_test_insert_gcc.png b/libstdc++-v3/docs/html/ext/pb_ds/cc_hash_random_int_subscript_timing_test_insert_gcc.png deleted file mode 100644 index 6e494038125..00000000000 Binary files a/libstdc++-v3/docs/html/ext/pb_ds/cc_hash_random_int_subscript_timing_test_insert_gcc.png and /dev/null differ diff --git a/libstdc++-v3/docs/html/ext/pb_ds/cc_hash_random_int_subscript_timing_test_insert_local.png b/libstdc++-v3/docs/html/ext/pb_ds/cc_hash_random_int_subscript_timing_test_insert_local.png deleted file mode 100644 index 48fcf76c048..00000000000 Binary files a/libstdc++-v3/docs/html/ext/pb_ds/cc_hash_random_int_subscript_timing_test_insert_local.png and /dev/null differ diff --git a/libstdc++-v3/docs/html/ext/pb_ds/cc_hash_random_int_subscript_timing_test_insert_msvc.png b/libstdc++-v3/docs/html/ext/pb_ds/cc_hash_random_int_subscript_timing_test_insert_msvc.png deleted file mode 100644 index 39c96ad8daf..00000000000 Binary files a/libstdc++-v3/docs/html/ext/pb_ds/cc_hash_random_int_subscript_timing_test_insert_msvc.png and /dev/null differ diff --git a/libstdc++-v3/docs/html/ext/pb_ds/cc_hash_table.html b/libstdc++-v3/docs/html/ext/pb_ds/cc_hash_table.html deleted file mode 100644 index fec6bec1b51..00000000000 --- a/libstdc++-v3/docs/html/ext/pb_ds/cc_hash_table.html +++ /dev/null @@ -1,724 +0,0 @@ - - - - - - - cc_hash_table Interface - - - - -
-

cc_hash_table Interface

- -

A concrete collision-chaining hash-based associative - container.

- -

Defined in: assoc_container.hpp

- -

Template Parameters

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ParameterDescriptionDefault Value
-
-typename Key
-
-
-

Key type.

-
-
-
-typename Mapped
-
-
-

Mapped type.

-
-
-
-class Hash_Fn 
-
-
-

Hash functor.

-
-
-__gnu_cxx::hash<Key>
-
if using gcc; -
-stdext::hash_value<Key>
-
if using Visual C++ .net -
-
-class Eq_Fn 
-
-
-

Equivalence functor.

-
-
-std::equal_to<Key>
-
-
-
-class Comb_Hash_Fn 
-
-
-

Combining hash functor.

- -

If Hash_Fn is - not null_hash_fn, then this is the - ranged-hash functor; otherwise, this is the range-hashing - functor.

- -

(See Design::Hash-Based - Containers::Hash Policies.)

-
-
-direct_mask_range_hashing
-
-
-
-class Resize_Policy 
-
-
-

Resize policy.

-
- If Comb_Hash_Fn - is direct_mask_range_hashing, - then -
-hash_standard_resize_policy<
-  hash_exponential_size_policy<
-    typename Comb_Hash_Fn::size_type>,
-  hash_load_check_resize_trigger<
-    typename Comb_Hash_Fn::size_type>,
-  false,
-  typename Comb_Hash_Fn::size_type>
-
otherwise, -
-hash_standard_resize_policy<
-  hash_exponential_size_policy<
-    typename Comb_Hash_Fn::size_type>,
-  hash_load_check_resize_trigger<
-    typename Comb_Hash_Fn::size_type>,
-  false,
-  typename Comb_Hash_Fn::size_type>
-
-
-
-bool Store_Hash 
-
-
-

Indicates whether the hash value will be stored along - with each key.

- -

If hash_fn is null_hash_fn, then the container - will not compile if this value is - true

-
-
-false
-
-
-
-class Allocator 
-
-
-

Allocator type.

-
-
-std::allocator<char>
-
-
- -

Base Classes

- - - - - - - - - - - - - -
ClassDerivation Type
-
-basic_hash_table
-
-
-

public

-
- -

Public Types and - Constants

- -

Policy Definitions

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
TypeDefinitionDescription
-
-hash_fn
-
-
-
-Hash_Fn
-
-
-

Hash functor type.

-
-
-eq_fn
-
-
-
-Eq_Fn
-
-
-

Equivalence functor type.

-
-
-resize_policy
-
-
-
-Resize_Policy
-
-
-

Resize policy type.

-
-
-comb_hash_fn
-
-
-
-Comb_Hash_Fn
-
-
-

Combining hash functor type.

-
- -

Public Methods

- -

Constructors, Destructor, and - Related

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
MethodDescription
-
-  cc_hash_table
-  ()
-
-
-

Default constructor.

-
-
-  cc_hash_table
-  (const hash_fn &r_hash_fn)
-
-
-

Constructor taking some policy objects. r_hash_fn will be copied by the - Hash_Fn object of - the container object.

-
-
-  cc_hash_table
-  (const hash_fn &r_hash_fn, 
-    const eq_fn &r_eq_fn)
-
-
-

Constructor taking some policy objects. r_hash_fn will be copied by the - hash_fn object of - the container object, and r_eq_fn will be copied by the - eq_fn object of the - container object.

-
-
-  cc_hash_table
-  (const hash_fn &r_hash_fn, 
-    const eq_fn &r_eq_fn, 
-    const comb_hash_fn &r_comb_hash_fn)
-
-
-

Constructor taking some policy objects. r_hash_fn will be copied by the - hash_fn object of - the container object, r_eq_fn will be copied by the - eq_fn object of the - container object, and r_comb_hash_fn will be copied by the - comb_hash_fn - object of the container object.

-
-
-  cc_hash_table
-  (const hash_fn &r_hash_fn, 
-    const eq_fn &r_eq_fn, 
-    const comb_hash_fn &r_comb_hash_fn, 
-    const resize_policy &r_resize_policy)
-
-
-

Constructor taking some policy objects. r_hash_fn will be copied by the - hash_fn object of - the container object, r_eq_fn will be copied by the - eq_fn object of the - container object, r_comb_hash_fn will be copied by the - comb_hash_fn - object of the container object, and r_resize_policy will be copied by - the resize_policy - object of the container object.

-
-
-template<
-    class It>
-  cc_hash_table
-  (It first_it, 
-    It last_it)
-
-
-

Constructor taking iterators to a range of - value_types. The value_types between first_it and last_it will be inserted into the - container object.

-
-
-template<
-    class It>
-  cc_hash_table
-  (It first_it, 
-    It last_it,
-    const hash_fn &r_hash_fn)
-
-
-

Constructor taking iterators to a range of value_types - and some policy objects. The value_types between - first_it and - last_it will be inserted - into the container object.

-
-
-template<
-    class It>
-  cc_hash_table
-  (It first_it, 
-    It last_it,
-    const hash_fn &r_hash_fn, 
-    const eq_fn &r_eq_fn)
-
-
-

Constructor taking iterators to a range of value_types - and some policy objects The value_types between - first_it and - last_it will be inserted - into the container object. r_hash_fn will be copied by the - hash_fn object of - the container object, and r_eq_fn will be copied by the - eq_fn object of the - container object.

-
-
-template<
-    class It>
-  cc_hash_table
-  (It first_it, 
-    It last_it,
-    const hash_fn &r_hash_fn, 
-    const eq_fn &r_eq_fn, 
-    const comb_hash_fn &r_comb_hash_fn)
-
-
-

Constructor taking iterators to a range of value_types - and some policy objects The value_types between - first_it and - last_it will be inserted - into the container object. r_hash_fn will be copied by the - hash_fn object of - the container object, r_eq_fn will be copied by the - eq_fn object of the - container object, and r_comb_hash_fn will be copied by the - comb_hash_fn - object of the container object.

-
-
-template<
-    class It>
-  cc_hash_table
-  (It first_it, 
-    It last_it,
-    const hash_fn &r_hash_fn, 
-    const eq_fn &r_eq_fn, 
-    const comb_hash_fn &r_comb_hash_fn, 
-    const resize_policy &r_resize_policy)
-
-
-

Constructor taking iterators to a range of value_types - and some policy objects The value_types between - first_it and - last_it will be inserted - into the container object. r_hash_fn will be copied by the - hash_fn object of - the container object, r_eq_fn will be copied by the - eq_fn object of the - container object, r_comb_hash_fn will be copied by the - comb_hash_fn - object of the container object, and r_resize_policy will be copied by - the resize_policy - object of the container object.

-
-
-  cc_hash_table
-  (const cc_hash_table &other)
-
-
-

Copy constructor.

-
-
-virtual 
-  ~cc_hash_table
-  ()
-
-
-

Destructor.

-
-
-cc_hash_table &
-  operator=
-  (const cc_hash_table &other)
-
-
-

Assignment operator.

-
-
-void
-  swap
-  (cc_hash_table &other)
-
-
-

Swaps content.

-
- -

Policy Access Methods

- - - - - - - - - - - - - - - - - - - -
MethodDescription
-
-comb_hash_fn &
-  get_comb_hash_fn
-  ()
-
-
-

Access to the comb_hash_fn - object.

-
-
-const comb_hash_fn &
-  get_comb_hash_fn
-  () const
-
-
-

Const access to the comb_hash_fn - object.

-
-
- - diff --git a/libstdc++-v3/docs/html/ext/pb_ds/cc_hash_tag.html b/libstdc++-v3/docs/html/ext/pb_ds/cc_hash_tag.html deleted file mode 100644 index fb6f5935830..00000000000 --- a/libstdc++-v3/docs/html/ext/pb_ds/cc_hash_tag.html +++ /dev/null @@ -1,47 +0,0 @@ - - - - - - - cc_hash_tag Interface - - - - -
-

cc_hash_tag Interface

- -

Collision-chaining hash data structure tag.

- -

Defined in: tag_and_trait.hpp

- -

Base Classes

- - - - - - - - - - - - - -
ClassDerivation Type
-
-basic_hash_tag
-
-
-

public

-
-
- - diff --git a/libstdc++-v3/docs/html/ext/pb_ds/ccgp_hash_random_int_subscript_timing_test_insert_gcc.png b/libstdc++-v3/docs/html/ext/pb_ds/ccgp_hash_random_int_subscript_timing_test_insert_gcc.png deleted file mode 100644 index fde6b41bf94..00000000000 Binary files a/libstdc++-v3/docs/html/ext/pb_ds/ccgp_hash_random_int_subscript_timing_test_insert_gcc.png and /dev/null differ diff --git a/libstdc++-v3/docs/html/ext/pb_ds/ccgp_hash_random_int_subscript_timing_test_insert_local.png b/libstdc++-v3/docs/html/ext/pb_ds/ccgp_hash_random_int_subscript_timing_test_insert_local.png deleted file mode 100644 index 2449e1de324..00000000000 Binary files a/libstdc++-v3/docs/html/ext/pb_ds/ccgp_hash_random_int_subscript_timing_test_insert_local.png and /dev/null differ diff --git a/libstdc++-v3/docs/html/ext/pb_ds/ccgp_hash_random_int_subscript_timing_test_insert_msvc.png b/libstdc++-v3/docs/html/ext/pb_ds/ccgp_hash_random_int_subscript_timing_test_insert_msvc.png deleted file mode 100644 index 11dca77fcfe..00000000000 Binary files a/libstdc++-v3/docs/html/ext/pb_ds/ccgp_hash_random_int_subscript_timing_test_insert_msvc.png and /dev/null differ diff --git a/libstdc++-v3/docs/html/ext/pb_ds/checked_by_tidy.gif b/libstdc++-v3/docs/html/ext/pb_ds/checked_by_tidy.gif deleted file mode 100644 index 47c2c4859c5..00000000000 Binary files a/libstdc++-v3/docs/html/ext/pb_ds/checked_by_tidy.gif and /dev/null differ diff --git a/libstdc++-v3/docs/html/ext/pb_ds/concepts.html b/libstdc++-v3/docs/html/ext/pb_ds/concepts.html deleted file mode 100644 index 9f6c2246254..00000000000 --- a/libstdc++-v3/docs/html/ext/pb_ds/concepts.html +++ /dev/null @@ -1,118 +0,0 @@ - - - - - - - Concepts - - - - -
-

Concepts

- -

Point and Range Methods and - Iterators

- -

A point-type iterator is an iterator that refers to a - specific element, e.g. as returned through an - associative-container's find method; a range-type - iterator is an iterator that is used to go over a sequence of - elements, e.g., as returned by a container's - find method. A point-type method is a method that - returns a point-type iterator; a range-type method is a method - that returns a range-type iterator.

- -

For most containers, these types are synonymous; for - self-organizing containers, such as hash-based containers or - priority queues, these are inherently different (in any - implementation, including that of the STL), but in - pb_ds this is made explicit - they are distinct - types.

- - -

Invalidation Guarantees

- -

If one manipulates a container object, then iterators - previously obtained from it can be invalidated. In some cases a - previously-obtained iterator cannot be de-referenced; in other - cases, the iterator's next or previous element might have - changed unpredictably. This corresponds exactly to the question - whether a point-type or range-type iterator (see previous - concept) is valid or not. In pb_ds one can query a - container (in compile time) what are its invalidation - guarantees.

- -

Primary and Secondary Keys - and Associative Containers

- -

In pb_ds there are no associative containers which - allow multiple values with equivalent keys (such as the STL's - std::multimap, for example). Instead, one maps the - unique part of a key - the primary key, into an - associative-container of the (originally) non-unique parts of - the key - the secondary key. A primary associative-container is - an associative container of primary keys; a secondary - associative-container is an associative container of secondary - keys.

- - -

Null Policy Classes

- -

Associative containers are typically parametrized by - various policies. For example, a hash-based associative - container is parametrized by a hash-functor, transforming each - key into an non-negative numerical type. Each such value is - then further mapped into a position within the table. The - mapping of a key into a position within the table is therefore - a two-step process.

- -

In some cases, instantiations are redundant. For - example, when the keys are integers, it is possible to use a - redundant hash policy, which transforms each key into - its value.

- -

In some other cases, these policies are irrelevant. - For example, a hash-based associative container might transform - keys into positions within a table by a different method than - the two-step method described above. In such a case, the hash - functor is simply irrelevant.

- -

pb_ds uses special pre-defined "null policies" - classes for these cases. Some null policies in pb_ds - are:

- -
    -
  1. null_mapped_type
  2. - -
  3. null_tree_node_update
  4. - -
  5. null_trie_node_update
  6. - -
  7. null_hash_fn
  8. - -
  9. null_probe_fn
  10. -
- -

A "set" in pb_ds, for example, is an associative - container with its Data_Parameter instantiated by - null_mapped_type. - Design::Tree-Based - Containers::Node Invariants explains another case where a - null policy is needed.

-
- - diff --git a/libstdc++-v3/docs/html/ext/pb_ds/contact.html b/libstdc++-v3/docs/html/ext/pb_ds/contact.html deleted file mode 100644 index 3d506c975c7..00000000000 --- a/libstdc++-v3/docs/html/ext/pb_ds/contact.html +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - Contact - - - - -
-

Contact

- -

For anything relevant, please write to pbassoc@gmail.com

-
- - diff --git a/libstdc++-v3/docs/html/ext/pb_ds/container_base.html b/libstdc++-v3/docs/html/ext/pb_ds/container_base.html deleted file mode 100644 index a0741307e0f..00000000000 --- a/libstdc++-v3/docs/html/ext/pb_ds/container_base.html +++ /dev/null @@ -1,1063 +0,0 @@ - - - - - - - container_base Interface - - - - -
-

container_base Interface

- -

An abstract basic associative container.

- -

Defined in: assoc_container.hpp

- -

Template Parameters

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ParameterDescriptionDefault Value
-
-typename Key
-
-
-

Key type.

-
-
-
-typename Mapped
-
-
-

Mapped type.

-
-
-
-class Tag
-
-
-

Data structure tag.

-
-
-
-class Policy_Tl
-
-
-

Policy typelist.

- -

Contains subclasses' policies.

-
-
-
-class Allocator
-
-
-

Allocator type.

-
-
- -

Public Types and - Constants

- -

General Container - Definitions

- - - - - - - - - - - - - - - - - - - - - - - - - -
TypeDefinitionDescription
-
-size_type
-
-
-
-typename Allocator::size_type
-
-
-

Size type.

-
-
-difference_type
-
-
-
-typename Allocator::difference_type
-
-
-

Difference type.

-
- -

Categories

- - - - - - - - - - - - - - - - - -
TypeDefinitionDescription
-
-container_category
-
-
-
-Tag
-
-
-

The underlying mapped-structure tag of the - container.

- -

This is one of:

- -
    -
  1. cc_hash_tag
  2. - -
  3. gp_hash_tag
  4. - -
  5. rb_tree_tag
  6. - -
  7. ov_tree_tag
  8. - -
  9. splay_tree_tag
  10. - -
  11. pat_trie_tag
  12. - -
  13. list_update_tag
  14. -
-
- -

Policy Definitions

- - - - - - - - - - - - - - - - - -
TypeDefinitionDescription
-
-allocator
-
-
-
-Allocator
-
-
-

Allocator - type.

-
- -

Key-Type Definitions

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
TypeDefinitionDescription
-
-key_type
-
-
-
-typename allocator::template rebind<
-    Key>::other::value_type
-
-
-

Key type.

-
-
-key_reference
-
-
-
-typename allocator::template rebind<
-    key_type>::other::reference
-
-
-

Key reference - type.

-
-
-const_key_reference
-
-
-
-typename allocator::template rebind<
-    key_type>::other::const_reference
-
-
-

Const key reference type.

-
-
-key_pointer
-
-
-
-typename allocator::template rebind<
-    key_type>::other::pointer
-
-
-

Key pointer type.

-
-
-const_key_pointer
-
-
-
-typename allocator::template rebind<
-    key_type>::other::const_pointer
-
-
-

Const key pointer type.

-
- -

Mapped-Type Definitions

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
TypeDefinitionDescription
-
-mapped_type
-
-
-
-Mapped
-
-
-

Mapped type.

-
-
-mapped_reference
-
-
-
-typename allocator::template rebind<
-    mapped_type>::other::reference
-
-
-

Mapped reference - type.

-
-
-const_mapped_reference
-
-
-
-typename allocator::template rebind<
-    mapped_type>::other::const_reference
-
-
-

Const mapped reference type.

-
-
-mapped_pointer
-
-
-
-typename allocator::template rebind<
-    mapped_type>::other::pointer
-
-
-

Mapped pointer - type.

-
-
-const_mapped_pointer
-
-
-
-typename allocator::template rebind<
-    mapped_type>::other::const_pointer
-
-
-

Const mapped pointer type.

-
- -

Value-Type Definitions

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
TypeDefinitionDescription
-
-value_type
-
-
-
-
-If Mapped is null_mapped_type, then Key
-Otherwise, Mapped -
-
-

Value type.

-
-
-reference
-
-
-
-typename allocator::template rebind<
-    value_type>::other::reference
-
-
-

Value reference type.

-
-
-const_reference
-
-
-
-typename allocator::template rebind<
-    value_type>::other::const_reference
-
-
-

Const value reference type.

-
-
-pointer
-
-
-
-typename allocator::template rebind<
-    value_type>::other::pointer
-
-
-

Value pointer type.

-
-
-const_pointer
-
-
-
-typename allocator::template rebind<
-    value_type>::other::const_pointer
-
-
-

Const Value pointer type.

-
- -

Iterator Definitions

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
TypeDefinitionDescription
-
-const_point_iterator
-
-
-
-Const point-type iterator.
-
-
-

Const point-type iterator.

-
-
-point_iterator
-
-
-
-
-Point-type iterator.
-If Mapped is null_mapped_type, then this is synonymous to const_point_iterator -
-
-

Point-type iterator.

-
-
-const_iterator
-
-
-
-Const range-type iterator.
-
-
-

Const range-type iterator.

-
-
-iterator
-
-
-
-
-Range-type iterator.
-If Mapped is null_mapped_type, then this is synonymous to const_iterator -
-
-

Range-type iterator.

-
- -

Public Methods

- -

Constructors, Destructor, and - Related

- - - - - - - - - - - - - -
MethodDescription
-
-virtual 
-  ~container_base
-  ()
-
-
-

Destructor.

-
- -

Information Methods

- - - - - - - - - - - - - - - - - - - - - - - - - -
MethodDescription
-
-inline size_type
-  size
-  () const
-
-
-

Returns the number of distinct value_type objects - the container object is storing.

-
-
-inline size_type
-  max_size
-  () const
-
-
-

Returns an upper bound on the number of distinct - value_type - objects this container can store.

-
-
-inline bool
-  empty
-  () const
-
-
-

Returns whether the container object is not storing - any value_type - objects.

-
- -

Insert Methods

- - - - - - - - - - - - - - - - - - - -
MethodDescription
-
-std::pair<point_iterator, bool>
-  insert
-  (const_reference r_val)
-
-
-

Inserts a value_type object. If - no value_type - with r_val's key was in - the container object, inserts and returns (point_iterator - object associated with r_val, true); - otherwise just returns (point_iterator - object associated with r_val's key, - false).

-
-
-mapped_reference
-  operator[]
-  (const_key_reference r_key)
-
-
-

Subscript operator.

-
- -

Find Methods

- - - - - - - - - - - - - - - - - - - -
MethodDescription
-
-point_iterator 
-  find
-  (const_key_reference r_key)
-
-
-

Returns the point_iterator - corresponding to the value_type with - r_key as its key, or the - point_iterator - corresponding to the just-after-last entry if no such - value_type.

-
-
-const_point_iterator 
-  find
-  (const_key_reference r_key) const
-
-
-

Returns the const_point_iterator - corresponding to the value_type with - r_key as its key, or the - const_point_iterator - corresponding to the just-after-last entry if no such - value_type.

-
- -

Erase Methods

- - - - - - - - - - - - - - - - - - - - - - - - - -
MethodDescription
-
-bool
-  erase
-  (const_key_reference r_key)
-
-
-

Erases the value_type associated - with r_key. returns - false iff r_key was not contained.

-
-
-template<
-  class Pred>
-size_type 
-  erase_if
-  (Pred prd)
-
-
-

Erases any value_type satisfying - the predicate prd (this - is transactional, either all matching value_types are - erased, or, if an exception is thrown (for types whose - erase can throw an exception) none); returns the number - of value_types - erased.

-
-
-void 
-  clear
-  ()
-
-
-

Clears the container object.

-
- -

Iteration Methods

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
MethodDescription
-
-iterator
-  begin
-  ()
-
-
-

Returns an iterator corresponding - to the first value_type in the - container.

-
-
-const_iterator
-  begin
-  () const
-
-
-

Returns a const_iterator - corresponding to the first value_type in the - container.

-
-
-iterator
-  end
-  ()
-
-
-

Returns an iterator corresponding - to the just-after-last value_type in the - container.

-
-
-const_iterator
-  end
-  () const
-
-
-

Returns a const_iterator - corresponding to the just-after-last value_type in the - container.

-
-
- - diff --git a/libstdc++-v3/docs/html/ext/pb_ds/container_cd.png b/libstdc++-v3/docs/html/ext/pb_ds/container_cd.png deleted file mode 100644 index 52553278cac..00000000000 Binary files a/libstdc++-v3/docs/html/ext/pb_ds/container_cd.png and /dev/null differ diff --git a/libstdc++-v3/docs/html/ext/pb_ds/container_cd.svg b/libstdc++-v3/docs/html/ext/pb_ds/container_cd.svg deleted file mode 100644 index 3b5a9818967..00000000000 --- a/libstdc++-v3/docs/html/ext/pb_ds/container_cd.svg +++ /dev/null @@ -1,418 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - Benjamin Kosnik - - - - - - - - - - list_update - basic_hash_table - basic_tree - - - - - tree - trie - cc_hash_table - gp_hash_table - - container_base - - - - - - - - diff --git a/libstdc++-v3/docs/html/ext/pb_ds/container_tag.html b/libstdc++-v3/docs/html/ext/pb_ds/container_tag.html deleted file mode 100644 index b9f05319dc2..00000000000 --- a/libstdc++-v3/docs/html/ext/pb_ds/container_tag.html +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - container _tag Interface - - - - -
-

container _tag Interface

- -

Basic data structure tag.

- -

Defined in: tag_and_trait.hpp

-
- - diff --git a/libstdc++-v3/docs/html/ext/pb_ds/counter_lu_policy.html b/libstdc++-v3/docs/html/ext/pb_ds/counter_lu_policy.html deleted file mode 100644 index 142cca19570..00000000000 --- a/libstdc++-v3/docs/html/ext/pb_ds/counter_lu_policy.html +++ /dev/null @@ -1,259 +0,0 @@ - - - - - - - counter_lu_policy Interface - - - - -
-

counter_lu_policy Interface

- -

A list-update policy that moves elements to the front of the - list based on the counter algorithm.

- -

Defined in: list_update_policy.hpp

- -

Template Parameters

- - - - - - - - - - - - - - - - - - - - - - - - - -
ParameterDescriptionDefault Value
-
-size_t Max_Count 
-
-
-

Maximum count.

- -

When some element is accessed this number of times, it - will be moved to the front of the list.

-
5
-
-class Allocator 
-
-
-

Allocator type.

- -

This is used only for definitions, e.g., the size - type.

-
-
-std::allocator<char>
-
-
- -

Public Types and - Constants

- -

Policy Definitions

- - - - - - - - - - - - - - - - - - - - - - - - - -
TypeDefinitionDescription
-
-allocator
-
-
-
-Allocator
-
-
-

Allocator - type.

-
-
-max_count
-
-
-
-Max_Count
-}
-
-
-

Maximum count.

-
- -

General Definitions

- - - - - - - - - - - - - - - - - -
TypeDefinitionDescription
-
-size_type
-
-
-
-typename allocator::size_type
-
-
-

Size type.

-
- -

Metadata-Type - Definitions

- - - - - - - - - - - - - - - - - - - - - - - - - -
TypeDefinitionDescription
-
-metadata_type
-
-
-
-Some class containing a counter.
-
-
-

Metadata on which this functor operates.

-
-
-metadata_reference
-
-
-
-typename Allocator::template rebind<
-    metadata_type>::other::reference
-
-
-

Reference to metadata on which this functor - operates.

-
- -

Public Methods

- -

Metadata Methods

- - - - - - - - - - - - - - - - - - - -
MethodDescription
-
-metadata_type
-  operator()
-  () const
-
-
-

Creates a metadata object.

-
-
-bool 
-  operator()
-  (metadata_reference r_metadata) const
-
-
-

Decides whether a metadata object should be moved to - the front of the list.

-
-
- - diff --git a/libstdc++-v3/docs/html/ext/pb_ds/design.html b/libstdc++-v3/docs/html/ext/pb_ds/design.html deleted file mode 100644 index e83bd4dd20a..00000000000 --- a/libstdc++-v3/docs/html/ext/pb_ds/design.html +++ /dev/null @@ -1,96 +0,0 @@ - - - - - - - Design - - - - -
-

Design

- -

The pb_ds namespace contains:

- -
    -
  1. Exception classes (see Interface::Exceptions::Common)
  2. - -
  3. Invalidation-guarantee tags (see Design::Invalidation Guarantees - and Interface::Data-Structure Tags - and Traits::Invalidation-Guarantee Tags).
  4. - -
  5. Associative Containers (see Design::Associative - Containers::Tree-Based Containers, Design::Associative - Containers::Trie-Based Containers, Design::Associative - Containers::Hash-Based Containers, and Design::Associative - Containers::List-Based Containers, and Interface::Containers::Associative - Containers).
  6. - -
  7. Associative Container tags and traits - (see Design::Associative - Containers::Data-Structure Genericity, Interface::Data-Structure Tags - and Traits::Data-Structure Tags::Associative-Containers, - and Interface::Data-Structure Tags and - Traits::Data-Structure - Traits::Associative-Containers).
  8. - -
  9. Associative Container policies (see - Design::Associative - Containers::Tree-Based Containers, Design::Associative - Containers::Trie-Based Containers, Design::Associative - Containers::Hash-Based Containers, and Design::Associative - Containers::List-Based Containers, and Interface::Container - Policy Classes).
  10. - - -
  11. Mapped types for setting the mapping semantics of - associative containers (see Tutorial::Associative - Containers::Associative Containers Others than Maps and - Interface::Mapped-Type - Policies).
  12. - - -
  13. Priority Queues (see Design::Priority - Queues and Interface::Containers::Priority - Queues).
  14. - -
  15. Priority Queue tags and traits - (see Design::Priority - Queues::Traits, Interface::Data-Structure Tags and - Traits::Data-Structure Tags::Priority Queues, and - Interface::Data-Structure - Tags and Traits::Data-Structure Traits::Priority - Queues).
  16. -
- - -

Associative-Container Design - describes associative-container design.

- -

Priority-Queue Design describes - priority-queue design.

-
- - diff --git a/libstdc++-v3/docs/html/ext/pb_ds/different_underlying_dss.png b/libstdc++-v3/docs/html/ext/pb_ds/different_underlying_dss.png deleted file mode 100644 index adee1263600..00000000000 Binary files a/libstdc++-v3/docs/html/ext/pb_ds/different_underlying_dss.png and /dev/null differ diff --git a/libstdc++-v3/docs/html/ext/pb_ds/direct_mask_range_hashing.html b/libstdc++-v3/docs/html/ext/pb_ds/direct_mask_range_hashing.html deleted file mode 100644 index 1a7d39b70c2..00000000000 --- a/libstdc++-v3/docs/html/ext/pb_ds/direct_mask_range_hashing.html +++ /dev/null @@ -1,167 +0,0 @@ - - - - - - - direct_mask_range_hashing Interface - - - - -
-

direct_mask_range_hashing Interface

- -

A mask range-hashing class (uses a bit-mask).

- -

Defined in: hash_policy.hpp

- -

Template Parameters

- - - - - - - - - - - - - - - - - -
ParameterDescriptionDefault Value
-
-typename Size_Type 
-
-
-

Size type.

-
size_t
- -

Public Types and - Constants

- -

General Definitions

- - - - - - - - - - - - - - - - - -
TypeDefinitionDescription
-
-size_type
-
-
-
-Size_Type
-
-
-

Size type.

-
- -

Public Methods

- -

Constructors, Destructor, and - Related

- - - - - - - - - - - - - -
MethodDescription
-
-void
-  swap
-  (direct_mask_range_hashing &other)
-
-
-

Swaps content.

-
- -

Protected Methods

- -

Notification Methods

- - - - - - - - - - - - - -
MethodDescription
-
-void 
-  notify_resized
-  (size_type size)
-
-
-

Notifies the policy object that the container's size - has changed to size.

-
- -

Operators.

- - - - - - - - - - - - - -
MethodDescription
-
-inline size_type
-  operator()
-  (size_type hash) const
-
-
-

Transforms the hash value hash into a ranged-hash value (using - a bit-mask).

-
-
- - diff --git a/libstdc++-v3/docs/html/ext/pb_ds/direct_mod_range_hashing.html b/libstdc++-v3/docs/html/ext/pb_ds/direct_mod_range_hashing.html deleted file mode 100644 index 33c99338ad1..00000000000 --- a/libstdc++-v3/docs/html/ext/pb_ds/direct_mod_range_hashing.html +++ /dev/null @@ -1,144 +0,0 @@ - - - - - - - direct_mod_range_hashing Interface - - - - -
-

direct_mod_range_hashing Interface

- -

A mod range-hashing class (uses the modulo function).

- -

Defined in: hash_policy.hpp

- -

Template Parameters

- - - - - - - - - - - - - - - - - -
ParameterDescriptionDefault Value
-
-typename Size_Type 
-
-
-

Size type.

-
size_t
- -

Public Types and - Constants

- -

General Definitions

- - - - - - - - - - - - - - - - - -
TypeDefinitionDescription
-
-size_type
-
-
-
-Size_Type
-
-
-

Size type.

-
- -

Public Methods

- -

Constructors, Destructor, and - Related

- - - - - - - - - - - - - -
MethodDescription
-
-void
-  swap
-  (direct_mod_range_hashing &other)
-
-
-

Swaps content.

-
- -

Protected Methods

- -

Notification Methods

- -

Operators.

- - - - - - - - - - - - - -
MethodDescription
-
-inline size_type
-  operator()
-  (size_type hash) const
-
-
-

Transforms the hash value hash into a ranged-hash value (using - a modulo operation).

-
-
- - diff --git a/libstdc++-v3/docs/html/ext/pb_ds/disclaimer.html b/libstdc++-v3/docs/html/ext/pb_ds/disclaimer.html deleted file mode 100644 index 681af4edf72..00000000000 --- a/libstdc++-v3/docs/html/ext/pb_ds/disclaimer.html +++ /dev/null @@ -1,34 +0,0 @@ - - - - - - - What, me worry? - - - - -
-

Disclaimer and Copyright

- -

Revised 16 February, 2004

© Copyright Ami Tavory and - Vladimir Dreizin, IBM-HRL, 2004, and Benjamin Kosnik, Red Hat, - 2004. - -

Permission to use, copy, modify, sell, and distribute this - software is hereby granted without fee, provided that the above - copyright notice appears in all copies, and that both that - copyright notice and this permission notice appear in - supporting documentation.

- -

None of the above authors, nor IBM Haifa Research - Laboratories, Red Hat, or both, make any representation about - the suitability of this software for any purpose. It is - provided "as is" without express or implied warranty.

-
- - diff --git a/libstdc++-v3/docs/html/ext/pb_ds/ds_gen.html b/libstdc++-v3/docs/html/ext/pb_ds/ds_gen.html deleted file mode 100644 index ec99c4d5f7e..00000000000 --- a/libstdc++-v3/docs/html/ext/pb_ds/ds_gen.html +++ /dev/null @@ -1,344 +0,0 @@ - - - - - - - Data-Structure Genericity - - - - -
-

Data-Structure Genericity

- -

The Basic Problem

- -

The design attempts to address the following problem. When - writing a function manipulating a generic container object, - what is the behavior of the object? E.g., suppose one - writes

-
-template<typename Cntnr>
-void
-some_op_sequence(Cntnr &r_container)
-{
-    ...
-}
-
then one needs to address the following questions in the body -of some_op_sequence: - -
    -
  1. Which types and methods does Cntnr support? - Containers based on hash tables can be queries for the - hash-functor type and object; this is meaningless for - tree-based containers. Containers based on trees can be - split, joined, or can erase iterators and return the - following iterator; this cannot be done by hash-based - containers.
  2. - -
  3. What are the guarantees of Cntnr? A container - based on a probing hash-table invalidates all iterators when - it is modified; this is not the case for containers based on - node-based trees. Containers based on a node-based tree can - be split or joined without exceptions; this is not the case - for containers based on vector-based trees.
  4. - -
  5. How does the container maintain its elements? Tree-based - and Trie-based containers store elements by key order; - others, typically, do not. A container based on a splay trees - or lists with update policies "cache" "frequently accessed" - elements; containers based on most other underlying - data structures do not.
  6. -
- -

The remainder of this section deals with these issues.

- -

Container - Hierarchy

- -

Figure Container class hierarchy shows the - container hierarchy.

- -
-
- -
Container class hierarchy.
- -
    -
  1. container_base is an - abstract base class for associative containers.
  2. - -
  3. Tree-Like-Based Associative-Containers: - -
      -
    1. basic_tree - is an abstract base class for tree-like-based - associative-containers
    2. - -
    3. tree - is a concrete base class for tree-based - associative-containers
    4. - -
    5. trie - is a concrete base class trie-based - associative-containers
    6. -
    -
  4. - -
  5. Hash-Based Associative-Containers: - -
      -
    1. basic_hash_table - is an abstract base class for hash-based - associative-containers
    2. - -
    3. cc_hash_table - is a concrete collision-chaining hash-based - associative-containers
    4. - -
    5. gp_hash_table - is a concrete (general) probing hash-based - associative-containers
    6. -
    -
  6. - -
  7. List-Based Associative-Containers: - -
      -
    1. list_update - - list-based update-policy associative container
    2. -
    -
  8. -
- -

The hierarchy is composed naturally so that commonality is - captured by base classes. Thus operator[] is - defined container_base, since - all containers support it. Conversely split is defined - in basic_tree, - since only tree-like containers support it. Data-Structure Tags and Traits discusses how - to query which types and methods each container supports.

- -

Data-Structure Tags and - Traits

- -

Tags and traits are very useful for manipulating generic - types. For example, if It is an iterator class, then - typename It::iterator_category or - typename - std::iterator_traits<It>::iterator_category will - yield its category, and typename - std::iterator_traits<It>::value_type will yield its - value type.

- -

pb_ds contains a tag hierarchy corresponding to the - hierarchy in Figure Class hierarchy. The tag - hierarchy is shown in Figure Data-structure tag class hierarchy.

- -
no image
- -
Data-structure tag class hierarchy.
- -

container_base - publicly defines container_category as one of the classes in - Figure Data-structure tag class - hierarchy. Given any container Cntnr, the tag of - the underlying data structure can be found via - typename Cntnr::container_category.

- -

Additionally, a traits mechanism can be used to query a - container type for its attributes. Given any container - Cntnr, then __gnu_pbds::container_traits<Cntnr> - is a traits class identifying the properties of the - container.

- -

To find if a container can throw when a key is erased (which - is true for vector-based trees, for example), one can - use

container_traits<Cntnr>::erase_can_throw, - for example. - -

Some of the definitions in container_traits are - dependent on other definitions. E.g., if container_traits<Cntnr>::order_preserving - is true (which is the case for containers based - on trees and tries), then the container can be split or joined; - in this case, container_traits<Cntnr>::split_join_can_throw - indicates whether splits or joins can throw exceptions (which - is true for vector-based trees); otherwise container_traits<Cntnr>::split_join_can_throw - will yield a compilation error. (This is somewhat similar to a - compile-time version of the COM model [mscom]).

- -

Point-Type and - Range-Type Methods and Iterators

- -

Iterators in - Unordered Container Types

- -

pb_ds differentiates between two types of methods - and iterators: point-type methods and iterators, and range-type - methods and iterators (see Motivation::Associative - Containers::Differentiating between Iterator Types and - Tutorial::Associative - Containers::Point-Type and Range-Type Methods and - Iterators). Each associative container's interface includes - the methods:

-
-const_point_iterator
-find(const_key_reference r_key) const;                
-
-point_iterator
-find(const_key_reference r_key);         
-    
-std::pair<point_iterator,bool>
-insert(const_reference r_val);
-
- -

The relationship between these iterator types varies between - container types. Figure Point-type and range-type iterators-A - shows the most general invariant between point-type and - range-type iterators: iterator, e.g., can - always be converted to point_iterator. Figure Point-type and range-type iterators-B - shows invariants for order-preserving containers: point-type - iterators are synonymous with range-type iterators. - Orthogonally, Figure Point-type - and range-type iterators-C shows invariants for "set" - containers: iterators are synonymous with const iterators.

- -
-
- -
Point-type and range-type iterators.
- -

Note that point-type iterators in self-organizing containers - (e.g., hash-based associative containers) lack movement - operators, such as operator++ - in fact, this - is the reason why pb_ds differentiates from the STL's - design on this point.

- -

Typically, one can determine an iterator's movement - capabilities in the STL using - std::iterator_traits<It>iterator_category, which - is a struct indicating the iterator's movement - capabilities. Unfortunately, none of the STL's predefined - categories reflect a pointer's not having any movement - capabilities whatsoever. Consequently, pb_ds adds a - type trivial_iterator_tag - (whose name is taken from a concept in [sgi_stl]), which is the category - of iterators with no movement capabilities. All other STL tags, - such as forward_iterator_tag retain their common - use.

- -

Invalidation - Guarantees

- -

Motivation::Associative - Containers::Differentiating between Iterator - Types::Invalidation Guarantees posed a problem. Given three - different types of associative containers, a modifying - operation (in that example, erase) invalidated - iterators in three different ways: the iterator of one - container remained completely valid - it could be de-referenced - and incremented; the iterator of a different container could - not even be de-referenced; the iterator of the third container - could be de-referenced, but its "next" iterator changed - unpredictably.

- -

Distinguishing between find and range types allows - fine-grained invalidation guarantees, because these questions - correspond exactly to the question of whether point-type - iterators and range-type iterators are valid. Invalidation guarantees class - hierarchy shows tags corresponding to different types of - invalidation guarantees.

- -
no image
- -
Invalidation guarantees class hierarchy.
- -
    -
  1. basic_invalidation_guarantee - corresponds to a basic guarantee that a point-type iterator, - a found pointer, or a found reference, remains valid as long - as the container object is not modified.
  2. - -
  3. point_invalidation_guarantee - corresponds to a guarantee that a point-type iterator, a - found pointer, or a found reference, remains valid even if - the container object is modified.
  4. - -
  5. range_invalidation_guarantee - corresponds to a guarantee that a range-type iterator remains - valid even if the container object is modified.
  6. -
- -

As shown in Tutorial::Associative - Containers::Point-Type and Range-Type Methods and - Iterators, to find the invalidation guarantee of a - container, one can use

-
-typename container_traits<Cntnr>::invalidation_guarantee
-
- -

which is one of the classes in Figure Invalidation guarantees class - hierarchy.

- -

Note that this hierarchy corresponds to the logic it - represents: if a container has range-invalidation guarantees, - then it must also have find invalidation guarantees; - correspondingly, its invalidation guarantee (in this case - range_invalidation_guarantee) - can be cast to its base class (in this case point_invalidation_guarantee). - This means that this this hierarchy can be used easily using - standard metaprogramming techniques, by specializing on the - type of invalidation_guarantee.

- -

(These types of problems were addressed, in a more general - setting, in [meyers96more] - Item 2. In - our opinion, an invalidation-guarantee hierarchy would solve - these problems in all container types - not just associative - containers.)

-
- - diff --git a/libstdc++-v3/docs/html/ext/pb_ds/embedded_lists_1.png b/libstdc++-v3/docs/html/ext/pb_ds/embedded_lists_1.png deleted file mode 100644 index 9470a65b568..00000000000 Binary files a/libstdc++-v3/docs/html/ext/pb_ds/embedded_lists_1.png and /dev/null differ diff --git a/libstdc++-v3/docs/html/ext/pb_ds/embedded_lists_2.png b/libstdc++-v3/docs/html/ext/pb_ds/embedded_lists_2.png deleted file mode 100644 index d2ac91c1ab0..00000000000 Binary files a/libstdc++-v3/docs/html/ext/pb_ds/embedded_lists_2.png and /dev/null differ diff --git a/libstdc++-v3/docs/html/ext/pb_ds/embedded_lists_3.png b/libstdc++-v3/docs/html/ext/pb_ds/embedded_lists_3.png deleted file mode 100644 index 08ecb0ffe16..00000000000 Binary files a/libstdc++-v3/docs/html/ext/pb_ds/embedded_lists_3.png and /dev/null differ diff --git a/libstdc++-v3/docs/html/ext/pb_ds/examples.html b/libstdc++-v3/docs/html/ext/pb_ds/examples.html deleted file mode 100644 index 03c7a391003..00000000000 --- a/libstdc++-v3/docs/html/ext/pb_ds/examples.html +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - Examples - - - - -
-

Examples

- -

Associative-Container - Examples shows examples for associative containers; - Priority-Queue Examples shows - examples for priority queues.

-
- - diff --git a/libstdc++-v3/docs/html/ext/pb_ds/exceptions.html b/libstdc++-v3/docs/html/ext/pb_ds/exceptions.html deleted file mode 100644 index 3b50c27aa04..00000000000 --- a/libstdc++-v3/docs/html/ext/pb_ds/exceptions.html +++ /dev/null @@ -1,46 +0,0 @@ - - - - - - -container_error Interface - - - - -
-

container_error Interface

- -

Base class for associative-container exceptions.

- -

Defined in: exception.hpp

- -

Base Classes

- - - - - - - - - - - - - -
ClassDerivation Type
-
-std::logic_error
-
-
-

public

-
-
- - diff --git a/libstdc++-v3/docs/html/ext/pb_ds/gp_hash_random_int_find_timing_test_gcc.png b/libstdc++-v3/docs/html/ext/pb_ds/gp_hash_random_int_find_timing_test_gcc.png deleted file mode 100644 index d86299b7e3e..00000000000 Binary files a/libstdc++-v3/docs/html/ext/pb_ds/gp_hash_random_int_find_timing_test_gcc.png and /dev/null differ diff --git a/libstdc++-v3/docs/html/ext/pb_ds/gp_hash_random_int_find_timing_test_local.png b/libstdc++-v3/docs/html/ext/pb_ds/gp_hash_random_int_find_timing_test_local.png deleted file mode 100644 index 1b31b7f27ca..00000000000 Binary files a/libstdc++-v3/docs/html/ext/pb_ds/gp_hash_random_int_find_timing_test_local.png and /dev/null differ diff --git a/libstdc++-v3/docs/html/ext/pb_ds/gp_hash_random_int_find_timing_test_msvc.png b/libstdc++-v3/docs/html/ext/pb_ds/gp_hash_random_int_find_timing_test_msvc.png deleted file mode 100644 index b7082f28605..00000000000 Binary files a/libstdc++-v3/docs/html/ext/pb_ds/gp_hash_random_int_find_timing_test_msvc.png and /dev/null differ diff --git a/libstdc++-v3/docs/html/ext/pb_ds/gp_hash_random_int_subscript_timing_test_find_gcc.png b/libstdc++-v3/docs/html/ext/pb_ds/gp_hash_random_int_subscript_timing_test_find_gcc.png deleted file mode 100644 index b9fbe00deff..00000000000 Binary files a/libstdc++-v3/docs/html/ext/pb_ds/gp_hash_random_int_subscript_timing_test_find_gcc.png and /dev/null differ diff --git a/libstdc++-v3/docs/html/ext/pb_ds/gp_hash_random_int_subscript_timing_test_find_local.png b/libstdc++-v3/docs/html/ext/pb_ds/gp_hash_random_int_subscript_timing_test_find_local.png deleted file mode 100644 index c693ed3869b..00000000000 Binary files a/libstdc++-v3/docs/html/ext/pb_ds/gp_hash_random_int_subscript_timing_test_find_local.png and /dev/null differ diff --git a/libstdc++-v3/docs/html/ext/pb_ds/gp_hash_random_int_subscript_timing_test_find_msvc.png b/libstdc++-v3/docs/html/ext/pb_ds/gp_hash_random_int_subscript_timing_test_find_msvc.png deleted file mode 100644 index 248ff6b8872..00000000000 Binary files a/libstdc++-v3/docs/html/ext/pb_ds/gp_hash_random_int_subscript_timing_test_find_msvc.png and /dev/null differ diff --git a/libstdc++-v3/docs/html/ext/pb_ds/gp_hash_random_int_subscript_timing_test_insert_gcc.png b/libstdc++-v3/docs/html/ext/pb_ds/gp_hash_random_int_subscript_timing_test_insert_gcc.png deleted file mode 100644 index ac4f838fe26..00000000000 Binary files a/libstdc++-v3/docs/html/ext/pb_ds/gp_hash_random_int_subscript_timing_test_insert_gcc.png and /dev/null differ diff --git a/libstdc++-v3/docs/html/ext/pb_ds/gp_hash_random_int_subscript_timing_test_insert_local.png b/libstdc++-v3/docs/html/ext/pb_ds/gp_hash_random_int_subscript_timing_test_insert_local.png deleted file mode 100644 index 9fa08a0c2c3..00000000000 Binary files a/libstdc++-v3/docs/html/ext/pb_ds/gp_hash_random_int_subscript_timing_test_insert_local.png and /dev/null differ diff --git a/libstdc++-v3/docs/html/ext/pb_ds/gp_hash_random_int_subscript_timing_test_insert_msvc.png b/libstdc++-v3/docs/html/ext/pb_ds/gp_hash_random_int_subscript_timing_test_insert_msvc.png deleted file mode 100644 index 5f1d740b817..00000000000 Binary files a/libstdc++-v3/docs/html/ext/pb_ds/gp_hash_random_int_subscript_timing_test_insert_msvc.png and /dev/null differ diff --git a/libstdc++-v3/docs/html/ext/pb_ds/gp_hash_table.html b/libstdc++-v3/docs/html/ext/pb_ds/gp_hash_table.html deleted file mode 100644 index 446359b4a89..00000000000 --- a/libstdc++-v3/docs/html/ext/pb_ds/gp_hash_table.html +++ /dev/null @@ -1,891 +0,0 @@ - - - - - - - gp_hash_table Interface - - - - -
-

gp_hash_table Interface

- -

A concrete general-probing hash-based associative - container.

- -

Defined in: assoc_container.hpp

- -

Template Parameters

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ParameterDescriptionDefault Value
-
-typename Key
-
-
-

Key type.

-
-
-
-typename Mapped
-
-
-

Mapped type.

-
-
-
-class Hash_Fn 
-
-
-

Hash functor.

-
-
-__gnu_cxx::hash<Key>
-
if using gcc; -
-stdext::hash_value<Key>
-
if using Visual C++ .net -
-
-class Eq_Fn 
-
-
-

Equivalence functor.

-
-
-std::equal_to<Key>
-
-
-
-class Comb_Probe_Fn 
-
-
-

Combining probe functor.

- -

If Hash_Fn is - null_hash_fn, and Probe_Fn is null_probe_fn, then this is the - ranged-probe functor; otherwise, this is the - range-hashing functor.

- -

(See Design::Hash-Based - Containers::Hash Policies.)

-
direct_mask_range_hashing
-
-class Probe_Fn 
-
-
-

Probe functor.

-
- If Comb_Probe_Fn - is direct_mask_range_hashing, then -
-linear_probe_fn<
-  typename Comb_Probe_Fn::size_type>
-
otherwise, -
-quadratic_probe_fn<
-  typename Comb_Probe_Fn::size_type>
-
-
-
-class Resize_Policy 
-
-
-

Resize policy.

-
- If Comb_Probe_Fn - is direct_mask_range_hashing, - then -
-hash_standard_resize_policy<
-  hash_exponential_size_policy<
-    typename Comb_Probe_Fn::size_type>,
-  hash_load_check_resize_trigger<
-    typename Comb_Probe_Fn::size_type>,
-  false,
-  typename Comb_Probe_Fn::size_type>
-
otherwise, -
-hash_standard_resize_policy<
-  hash_exponential_size_policy<
-    typename Comb_Probe_Fn::size_type>,
-  hash_load_check_resize_trigger<
-    typename Comb_Probe_Fn::size_type>,
-  false,
-  typename Comb_Probe_Fn::size_type>
-
-
-
-bool Store_Hash 
-
-
-

Indicates whether the hash value will be stored along - with each key.

- -

If hash_fn is null_hash_fn, then the container - will not compile if this value is - true

-
-
-false
-
-
-
-class Allocator 
-
-
-

Allocator type.

-
-
-std::allocator<char>
-
-
- -

Base Classes

- - - - - - - - - - - - - -
ClassDerivation Type
-
-basic_hash_table
-
-
-

public

-
- -

Public Types and - Constants

- -

Policy Definitions

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
TypeDefinitionDescription
-
-hash_fn
-
-
-
-Hash_Fn
-
-
-

Hash functor type.

-
-
-eq_fn
-
-
-
-Eq_Fn
-
-
-

Equivalence functor type.

-
-
-comb_probe_fn
-
-
-
-Comb_Probe_Fn
-
-
-

Combining probe functor type.

-
-
-probe_fn
-
-
-
-Probe_Fn
-
-
-

Probe functor type.

-
-
-resize_policy
-
-
-
-Resize_Policy
-
-
-

Resize policy type.

-
- -

Public Methods

- -

Constructors, Destructor, and - Related

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
MethodDescription
-
-  gp_hash_table
-  ()
-
-
-

Default constructor.

-
-
-  gp_hash_table
-  (const hash_fn &r_hash_fn)
-
-
-

Constructor taking some policy objects. r_hash_fn will be copied by the - hash_fn object of - the container object.

-
-
-  gp_hash_table
-  (const hash_fn &r_hash_fn, 
-    const eq_fn &r_eq_fn)
-
-
-

Constructor taking some policy objects. r_hash_fn will be copied by the - hash_fn object of - the container object, and r_eq_fn will be copied by the - eq_fn object of the - container object.

-
-
-  gp_hash_table
-  (const hash_fn &r_hash_fn, 
-    const eq_fn &r_eq_fn, 
-    const comb_probe_fn &r_comb_probe_fn)
-
-
-

Constructor taking some policy objects. r_hash_fn will be copied by the - hash_fn object of - the container object, r_eq_fn will be copied by the - eq_fn object of the - container object, and r_comb_probe_fn will be copied by - the comb_probe_fn - object of the container object.

-
-
-  gp_hash_table
-  (const hash_fn &r_hash_fn, 
-    const eq_fn &r_eq_fn, 
-    const comb_probe_fn &r_comb_probe_fn,
-    const probe_fn &r_probe_fn)
-
-
-

Constructor taking some policy objects. r_hash_fn will be copied by the - hash_fn object of - the container object, r_eq_fn will be copied by the - eq_fn object of the - container object, r_comb_probe_fn will be copied by - the comb_probe_fn - object of the container object, and r_probe_fn will be copied by the - probe_fn object - of the container object.

-
-
-  gp_hash_table
-  (const hash_fn &r_hash_fn, 
-    const eq_fn &r_eq_fn, 
-    const comb_probe_fn &r_comb_probe_fn, 
-    const probe_fn &r_probe_fn,
-    const resize_policy &r_resize_policy)
-
-
-

Constructor taking some policy objects. r_hash_fn will be copied by the - hash_fn object of - the container object, r_eq_fn will be copied by the - eq_fn object of the - container object, r_comb_probe_fn will be copied by - the comb_probe_fn - object of the container object, r_probe_fn will be copied by the - probe_fn object - of the container object, and r_resize_policy will be copied by - the Resize_Policy - object of the container object.

-
-
-template<
-    class It>
-  gp_hash_table
-  (It first_it, 
-    It last_it)
-
-
-

Constructor taking iterators to a range of - value_types. The value_types between first_it and last_it will be inserted into the - container object.

-
-
-template<
-    class It>
-  gp_hash_table
-  (It first_it, 
-    It last_it,
-    const hash_fn &r_hash_fn)
-
-
-

Constructor taking iterators to a range of value_types - and some policy objects. The value_types between - first_it and - last_it will be inserted - into the container object. r_hash_fn will be copied by the - hash_fn object of - the container object.

-
-
-template<
-    class It>
-  gp_hash_table
-  (It first_it, 
-    It last_it,
-    const hash_fn &r_hash_fn, 
-    const eq_fn &r_eq_fn)
-
-
-

Constructor taking iterators to a range of value_types - and some policy objects. The value_types between - first_it and - last_it will be inserted - into the container object. r_hash_fn will be copied by the - hash_fn object of - the container object, and r_eq_fn will be copied by the - eq_fn object of the - container object.

-
-
-template<
-    class It>
-  gp_hash_table
-  (It first_it, 
-    It last_it,
-    const hash_fn &r_hash_fn, 
-    const eq_fn &r_eq_fn, 
-    const comb_probe_fn &r_comb_probe_fn)
-
-
-

Constructor taking iterators to a range of value_types - and some policy objects. The value_types between - first_it and - last_it will be inserted - into the container object. r_hash_fn will be copied by the - hash_fn object of - the container object, r_eq_fn will be copied by the - eq_fn object of the - container object, and r_comb_probe_fn will be copied by - the comb_probe_fn - object of the container object.

-
-
-template<
-    class It>
-  gp_hash_table
-  (It first_it, 
-    It last_it,
-    const hash_fn &r_hash_fn, 
-    const eq_fn &r_eq_fn, 
-    const comb_probe_fn &r_comb_probe_fn,
-    const probe_fn &r_probe_fn)
-
-
-

Constructor taking iterators to a range of value_types - and some policy objects. The value_types between - first_it and - last_it will be inserted - into the container object. r_hash_fn will be copied by the - hash_fn object of - the container object, r_eq_fn will be copied by the - eq_fn object of the - container object, r_comb_probe_fn will be copied by - the comb_probe_fn - object of the container object, and r_probe_fn will be copied by the - probe_fn object - of the container object.

-
-
-template<
-    class It>
-  gp_hash_table
-  (It first_it, 
-    It last_it,
-    const hash_fn &r_hash_fn, 
-    const eq_fn &r_eq_fn, 
-    const comb_probe_fn &r_comb_probe_fn, 
-    const probe_fn &r_probe_fn,      
-    const resize_policy &r_resize_policy)
-
-
-

Constructor taking iterators to a range of value_types - and some policy objects. The value_types between - first_it and - last_it will be inserted - into the container object. r_hash_fn will be copied by the - hash_fn object of - the container object, r_eq_fn will be copied by the - eq_fn object of the - container object, r_comb_probe_fn will be copied by - the comb_probe_fn - object of the container object, r_probe_fn will be copied by the - probe_fn object - of the container object, and r_resize_policy will be copied by - the resize_policy - object of the container object.

-
-
-  gp_hash_table
-  (const gp_hash_table &other)
-
-
-

Copy constructor.

-
-
-virtual 
-  ~gp_hash_table
-  ()
-
-
-

Destructor.

-
-
-gp_hash_table &
-  operator=
-  (const gp_hash_table &other)
-
-
-

Assignment operator.

-
-
-void
-  swap
-  (gp_hash_table &other)
-
-
-

Swaps content.

-
- -

Policy Access Methods

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
MethodDescription
-
-comb_probe_fn &
-  get_comb_probe_fn
-  ()
-
-
-

Access to the comb_probe_fn - object.

-
-
-const comb_probe_fn &
-  get_comb_probe_fn
-  () const
-
-
-

Const access to the comb_probe_fn - object.

-
-
-probe_fn &
-  get_probe_fn
-  ()
-
-
-

Access to the probe_fn object.

-
-
-const probe_fn &
-  get_probe_fn
-  () const
-
-
-

Const access to the probe_fn object.

-
-
- - diff --git a/libstdc++-v3/docs/html/ext/pb_ds/gp_hash_tag.html b/libstdc++-v3/docs/html/ext/pb_ds/gp_hash_tag.html deleted file mode 100644 index 720984fff2f..00000000000 --- a/libstdc++-v3/docs/html/ext/pb_ds/gp_hash_tag.html +++ /dev/null @@ -1,47 +0,0 @@ - - - - - - - gp_hash_tag Interface - - - - -
-

gp_hash_tag Interface

- -

General-probing hash data structure tag.

- -

Defined in: tag_and_trait.hpp

- -

Base Classes

- - - - - - - - - - - - - -
ClassDerivation Type
-
-basic_hash_tag
-
-
-

public

-
-
- - diff --git a/libstdc++-v3/docs/html/ext/pb_ds/hash_based_containers.html b/libstdc++-v3/docs/html/ext/pb_ds/hash_based_containers.html deleted file mode 100644 index 21d092a76ef..00000000000 --- a/libstdc++-v3/docs/html/ext/pb_ds/hash_based_containers.html +++ /dev/null @@ -1,835 +0,0 @@ - - - - - - - Hash-Based Containers - - - - -
-

Hash Table Design

- -

Overview

- -

The collision-chaining hash-based container has the - following declaration.

-
-template<
-    typename Key,
-    typename Mapped,
-    typename Hash_Fn = std::hash<Key>,
-    typename Eq_Fn = std::equal_to<Key>,
-    typename Comb_Hash_Fn = direct_mask_range_hashing<>
-    typename Resize_Policy = default explained below.
-     bool Store_Hash = false,
-     typename Allocator = std::allocator<char> >
-class cc_hash_table;
-
- -

The parameters have the following meaning:

- -
    -
  1. Key is the key type.
  2. - -
  3. Mapped is the mapped-policy, and is explained in - Tutorial::Associative - Containers::Associative Containers Others than Maps.
  4. - -
  5. Hash_Fn is a key hashing functor.
  6. - -
  7. Eq_Fn is a key equivalence functor.
  8. - -
  9. Comb_Hash_Fn is a range-hashing_functor; - it describes how to translate hash values into positions - within the table. This is described in Hash Policies.
  10. - -
  11. Resize_Policy describes how a container object - should change its internal size. This is described in - Resize Policies.
  12. - -
  13. Store_Hash indicates whether the hash value - should be stored with each entry. This is described in - Policy Interaction.
  14. - -
  15. Allocator is an allocator - type.
  16. -
- -

The probing hash-based container has the following - declaration.

-
-template<
-    typename Key,
-    typename Mapped,
-    typename Hash_Fn = std::hash<Key>,
-    typename Eq_Fn = std::equal_to<Key>,
-    typename Comb_Probe_Fn = direct_mask_range_hashing<>
-    typename Probe_Fn = default explained below.
-    typename Resize_Policy = default explained below.
-    bool Store_Hash = false,
-    typename Allocator =  std::allocator<char> >
-class gp_hash_table;
-
- -

The parameters are identical to those of the - collision-chaining container, except for the following.

- -
    -
  1. Comb_Probe_Fn describes how to transform a probe - sequence into a sequence of positions within the table.
  2. - -
  3. Probe_Fn describes a probe sequence policy.
  4. -
- -

Some of the default template values depend on the values of - other parameters, and are explained in Policy Interaction.

- -

Hash - Policies

- -

General - Terms

- -

Following is an explanation of some functions which hashing - involves. Figure Hash functions, - ranged-hash functions, and range-hashing functions) - illustrates the discussion.

- -
-
- -
Hash functions, ranged-hash functions, and - range-hashing functions.
- -

Let U be a domain (e.g., the integers, or the - strings of 3 characters). A hash-table algorithm needs to map - elements of U "uniformly" into the range [0,..., m - - 1] (where m is a non-negative integral value, and - is, in general, time varying). I.e., the algorithm needs - a ranged-hash function

- -

f : U × Z+ → Z+ - ,

- -

such that for any u in U ,

- -

0 ≤ f(u, m) ≤ m - 1 ,

- -

and which has "good uniformity" properties [knuth98sorting]. One - common solution is to use the composition of the hash - function

- -

h : U → Z+ ,

- -

which maps elements of U into the non-negative - integrals, and

- -

g : Z+ × Z+ → - Z+,

- -

which maps a non-negative hash value, and a non-negative - range upper-bound into a non-negative integral in the range - between 0 (inclusive) and the range upper bound (exclusive), - i.e., for any r in Z+,

- -

0 ≤ g(r, m) ≤ m - 1 .

- -

The resulting ranged-hash function, is

- -

f(u , m) = - g(h(u), m) (1) .

- -

From the above, it is obvious that given g and - h, f can always be composed (however the converse - is not true). The STL's hash-based containers allow specifying - a hash function, and use a hard-wired range-hashing function; - the ranged-hash function is implicitly composed.

- -

The above describes the case where a key is to be mapped - into a single position within a hash table, e.g., - in a collision-chaining table. In other cases, a key is to be - mapped into a sequence of positions within a table, - e.g., in a probing table. Similar terms apply in this - case: the table requires a ranged probe function, - mapping a key into a sequence of positions withing the table. - This is typically achieved by composing a hash function - mapping the key into a non-negative integral type, a - probe function transforming the hash value into a - sequence of hash values, and a range-hashing function - transforming the sequence of hash values into a sequence of - positions.

- -

Range-Hashing Functions

- -

Some common choices for range-hashing functions are the - division, multiplication, and middle-square methods [knuth98sorting], defined - as

- -

g(r, m) = - r mod m (2) ,

- -

g(r, m) = ⌈ u/v ( a r mod v ) ⌉ ,

- -

and

- -

g(r, m) = ⌈ u/v ( r2 mod v ) ⌉ - ,

- -

respectively, for some positive integrals u and - v (typically powers of 2), and some a. Each of - these range-hashing functions works best for some different - setting.

- -

The division method (2) is a - very common choice. However, even this single method can be - implemented in two very different ways. It is possible to - implement (2) using the low - level % (modulo) operation (for any m), or the - low level & (bit-mask) operation (for the case where - m is a power of 2), i.e.,

- -

g(r, m) = r % m (3) ,

- -

and

- -

g(r, m) = r & m - 1, (m = - 2k) for some k) (4),

- -

respectively.

- -

The % (modulo) implementation (3) has the advantage that for - m a prime far from a power of 2, g(r, m) is - affected by all the bits of r (minimizing the chance of - collision). It has the disadvantage of using the costly modulo - operation. This method is hard-wired into SGI's implementation - [sgi_stl].

- -

The & (bit-mask) implementation (4) has the advantage of - relying on the fast bit-wise and operation. It has the - disadvantage that for g(r, m) is affected only by the - low order bits of r. This method is hard-wired into - Dinkumware's implementation [dinkumware_stl].

- -

Ranged-Hash - Functions

- -

In cases it is beneficial to allow the - client to directly specify a ranged-hash hash function. It is - true, that the writer of the ranged-hash function cannot rely - on the values of m having specific numerical properties - suitable for hashing (in the sense used in [knuth98sorting]), since - the values of m are determined by a resize policy with - possibly orthogonal considerations.

- -

There are two cases where a ranged-hash function can be - superior. The firs is when using perfect hashing [knuth98sorting]; the - second is when the values of m can be used to estimate - the "general" number of distinct values required. This is - described in the following.

- -

Let

- -

s = [ s0,..., st - 1]

- -

be a string of t characters, each of which is from - domain S. Consider the following ranged-hash - function:

- -

f1(s, m) = ∑ i = - 0t - 1 si ai mod - m (5) ,

- -

where a is some non-negative integral value. This is - the standard string-hashing function used in SGI's - implementation (with a = 5) [sgi_stl]. Its advantage is that - it takes into account all of the characters of the string.

- -

Now assume that s is the string representation of a - of a long DNA sequence (and so S = {'A', 'C', 'G', - 'T'}). In this case, scanning the entire string might be - prohibitively expensive. A possible alternative might be to use - only the first k characters of the string, where

- -

|S|k ≥ m ,

- -

i.e., using the hash function

- -

f2(s, m) = ∑ i - = 0k - 1 si ai mod - m , (6)

- -

requiring scanning over only

- -

k = log4( m )

- -

characters.

- -

Other more elaborate hash-functions might scan k - characters starting at a random position (determined at each - resize), or scanning k random positions (determined at - each resize), i.e., using

- -

f3(s, m) = ∑ i = - r0r0 + k - 1 si - ai mod m ,

- -

or

- -

f4(s, m) = ∑ i = 0k - - 1 sri ari mod - m ,

- -

respectively, for r0,..., rk-1 - each in the (inclusive) range [0,...,t-1].

- -

It should be noted that the above functions cannot be - decomposed as (1) .

- -

Implementation

- -

This sub-subsection describes the implementation of the - above in pb_ds. It first explains range-hashing - functions in collision-chaining tables, then ranged-hash - functions in collision-chaining tables, then probing-based - tables, and, finally, lists the relevant classes in - pb_ds.

- -

Range-Hashing and Ranged-Hashes in Collision-Chaining - Tables

- -

cc_hash_table is - parametrized by Hash_Fn and Comb_Hash_Fn, a - hash functor and a combining hash functor, respectively.

- -

In general, Comb_Hash_Fn is considered a - range-hashing functor. cc_hash_table - synthesizes a ranged-hash function from Hash_Fn and - Comb_Hash_Fn (see (1) - above). Figure Insert - hash sequence diagram shows an insert sequence - diagram for this case. The user inserts an element (point A), - the container transforms the key into a non-negative integral - using the hash functor (points B and C), and transforms the - result into a position using the combining functor (points D - and E).

- -
no image
- -
Insert hash sequence diagram.
- -

If cc_hash_table's - hash-functor, Hash_Fn is instantiated by null_hash_fn (see Interface::Concepts::Null - Policy Classes), then Comb_Hash_Fn is taken to be - a ranged-hash function. Figure Insert hash sequence diagram - with a null hash policy shows an insert sequence - diagram. The user inserts an element (point A), the container - transforms the key into a position using the combining functor - (points B and C).

- -
-
- -
Insert hash sequence diagram with a null hash - policy.
- -

Probing Tables

- -

gp_hash_table is - parametrized by Hash_Fn, Probe_Fn, and - Comb_Probe_Fn. As before, if Hash_Fn and - Probe_Fn are, respectively, null_hash_fn and null_probe_fn, then - Comb_Probe_Fn is a ranged-probe functor. Otherwise, - Hash_Fn is a hash functor, Probe_Fn is a - functor for offsets from a hash value, and - Comb_Probe_Fn transforms a probe sequence into a - sequence of positions within the table.

- -

Pre-Defined Policies

- -

pb_ds contains some pre-defined classes - implementing range-hashing and probing functions:

- -
    -
  1. direct_mask_range_hashing - and direct_mod_range_hashing - are range-hashing functions based on a bit-mask and a modulo - operation, respectively.
  2. - -
  3. linear_probe_fn, and - quadratic_probe_fn are - a linear probe and a quadratic probe function, - respectively.
  4. -
Figure Hash policy class - diagram shows a class diagram. - -
-
- -
Hash policy class diagram.
- -

Resize - Policies

- -

General Terms

- -

Hash-tables, as opposed to trees, do not naturally grow or - shrink. It is necessary to specify policies to determine how - and when a hash table should change its size. Usually, resize - policies can be decomposed into orthogonal policies:

- -
    -
  1. A size policy indicating how a hash table - should grow (e.g., it should multiply by powers of - 2).
  2. - -
  3. A trigger policy indicating when a hash - table should grow (e.g., a load factor is - exceeded).
  4. -
- -

Size - Policies

- -

Size policies determine how a hash table changes size. These - policies are simple, and there are relatively few sensible - options. An exponential-size policy (with the initial size and - growth factors both powers of 2) works well with a mask-based - range-hashing function (see Range-Hashing Policies), and is the - hard-wired policy used by Dinkumware [dinkumware_stl]. A - prime-list based policy works well with a modulo-prime range - hashing function (see Range-Hashing - Policies), and is the hard-wired policy used by SGI's - implementation [sgi_stl].

- -

Trigger - Policies

- -

Trigger policies determine when a hash table changes size. - Following is a description of two policies: load-check - policies, and collision-check policies.

- -

Load-check policies are straightforward. The user specifies - two factors, αmin and - αmax, and the hash table maintains the - invariant that

- -

αmin ≤ (number of - stored elements) / (hash-table size) ≤ - αmax (1) .

- -

Collision-check policies work in the opposite direction of - load-check policies. They focus on keeping the number of - collisions moderate and hoping that the size of the table will - not grow very large, instead of keeping a moderate load-factor - and hoping that the number of collisions will be small. A - maximal collision-check policy resizes when the longest - probe-sequence grows too large.

- -

Consider Figure Balls and - bins. Let the size of the hash table be denoted by - m, the length of a probe sequence be denoted by - k, and some load factor be denoted by α. We would - like to calculate the minimal length of k, such that if - there were α m elements in the hash table, a probe - sequence of length k would be found with probability at - most 1/m.

- -
-
- -
Balls and bins.
- -

Denote the probability that a probe sequence of length - k appears in bin i by pi, the - length of the probe sequence of bin i by - li, and assume uniform distribution. Then

- -

p1 = (3)

- -

P(l1 ≥ k) =

- -

P(l1 ≥ α ( 1 + k / α - 1 - ) ≤ (a)

- -

e ^ ( - ( α ( k / α - 1 )2 ) /2 - ) ,

- -

where (a) follows from the Chernoff bound [motwani95random]. To - calculate the probability that some bin contains a probe - sequence greater than k, we note that the - li are negatively-dependent [dubhashi98neg]. Let - I(.) denote the indicator function. Then

- -

P( existsi - li ≥ k ) = (3)

- -

P ( ∑ i = 1m - I(li ≥ k) ≥ 1 ) =

- -

P ( ∑ i = 1m I ( - li ≥ k ) ≥ m p1 ( 1 + 1 / (m - p1) - 1 ) ) ≤ (a)

- -

e ^ ( ( - m p1 ( 1 / (m p1) - - 1 ) 2 ) / 2 ) ,

- -

where (a) follows from the fact that the Chernoff bound can - be applied to negatively-dependent variables [dubhashi98neg]. Inserting - (2) into (3), and equating with - 1/m, we obtain

- -

k ~ √ ( 2 α ln 2 m ln(m) ) - ) .

- -

Implementation

- -

This sub-subsection describes the implementation of the - above in pb_ds. It first describes resize policies and - their decomposition into trigger and size policies, then - describes pre-defined classes, and finally discusses controlled - access the policies' internals.

- -

Resize Policies and Their Decomposition

- -

Each hash-based container is parametrized by a - Resize_Policy parameter; the container derives - publicly from Resize_Policy. For - example:

-
-cc_hash_table<
-    typename Key,
-    typename Mapped,
-    ...
-    typename Resize_Policy
-    ...> :
-        public Resize_Policy
-
- -

As a container object is modified, it continuously notifies - its Resize_Policy base of internal changes - (e.g., collisions encountered and elements being - inserted). It queries its Resize_Policy base whether - it needs to be resized, and if so, to what size.

- -

Figure Insert - resize sequence diagram shows a (possible) sequence diagram - of an insert operation. The user inserts an element; the hash - table notifies its resize policy that a search has started - (point A); in this case, a single collision is encountered - - the table notifies its resize policy of this (point B); the - container finally notifies its resize policy that the search - has ended (point C); it then queries its resize policy whether - a resize is needed, and if so, what is the new size (points D - to G); following the resize, it notifies the policy that a - resize has completed (point H); finally, the element is - inserted, and the policy notified (point I).

- -
-
- -
Insert resize sequence diagram.
- -

In practice, a resize policy can be usually orthogonally - decomposed to a size policy and a trigger policy. Consequently, - the library contains a single class for instantiating a resize - policy: hash_standard_resize_policy - is parametrized by Size_Policy and - Trigger_Policy, derives publicly from - both, and acts as a standard delegate [gamma95designpatterns] - to these policies.

- -

Figures Standard - resize policy trigger sequence diagram and Standard resize policy size - sequence diagram show sequence diagrams illustrating the - interaction between the standard resize policy and its trigger - and size policies, respectively.

- -
-
- -
Standard resize policy trigger sequence - diagram.
- -
-
- -
Standard resize policy size sequence - diagram.
- -

Pre-Defined Policies

- -

The library includes the following - instantiations of size and trigger policies:

- -
    -
  1. hash_load_check_resize_trigger - implements a load check trigger policy.
  2. - -
  3. cc_hash_max_collision_check_resize_trigger - implements a collision check trigger policy.
  4. - -
  5. hash_exponential_size_policy - implements an exponential-size policy (which should be used - with mask range hashing).
  6. - -
  7. hash_prime_size_policy - implementing a size policy based on a sequence of primes - [sgi_stl] (which should - be used with mod range hashing
  8. -
- -

Figure Resize policy class - diagram gives an overall picture of the resize-related - classes. basic_hash_table - is parametrized by Resize_Policy, which it subclasses - publicly. This class is currently instantiated only by hash_standard_resize_policy. - hash_standard_resize_policy - itself is parametrized by Trigger_Policy and - Size_Policy. Currently, Trigger_Policy is - instantiated by hash_load_check_resize_trigger, - or cc_hash_max_collision_check_resize_trigger; - Size_Policy is instantiated by hash_exponential_size_policy, - or hash_prime_size_policy.

- -
-
- -
Resize policy class diagram.
- -

Controlled Access to Policies' Internals

- -

There are cases where (controlled) access to resize - policies' internals is beneficial. E.g., it is sometimes - useful to query a hash-table for the table's actual size (as - opposed to its size() - the number of values it - currently holds); it is sometimes useful to set a table's - initial size, externally resize it, or change load factors.

- -

Clearly, supporting such methods both decreases the - encapsulation of hash-based containers, and increases the - diversity between different associative-containers' interfaces. - Conversely, omitting such methods can decrease containers' - flexibility.

- -

In order to avoid, to the extent possible, the above - conflict, the hash-based containers themselves do not address - any of these questions; this is deferred to the resize policies, - which are easier to change or replace. Thus, for example, - neither cc_hash_table nor - gp_hash_table - contain methods for querying the actual size of the table; this - is deferred to hash_standard_resize_policy.

- -

Furthermore, the policies themselves are parametrized by - template arguments that determine the methods they support - ([alexandrescu01modern] - shows techniques for doing so). hash_standard_resize_policy - is parametrized by External_Size_Access that - determines whether it supports methods for querying the actual - size of the table or resizing it. hash_load_check_resize_trigger - is parametrized by External_Load_Access that - determines whether it supports methods for querying or - modifying the loads. cc_hash_max_collision_check_resize_trigger - is parametrized by External_Load_Access that - determines whether it supports methods for querying the - load.

- -

Some operations, for example, resizing a container at - run time, or changing the load factors of a load-check trigger - policy, require the container itself to resize. As mentioned - above, the hash-based containers themselves do not contain - these types of methods, only their resize policies. - Consequently, there must be some mechanism for a resize policy - to manipulate the hash-based container. As the hash-based - container is a subclass of the resize policy, this is done - through virtual methods. Each hash-based container has a - private virtual method:

-
-virtual void
-    do_resize
-    (size_type new_size);
-
- -

which resizes the container. Implementations of - Resize_Policy can export public methods for resizing - the container externally; these methods internally call - do_resize to resize the table.

- -

Policy - Interaction

- -

Hash-tables are unfortunately especially susceptible to - choice of policies. One of the more complicated aspects of this - is that poor combinations of good policies can form a poor - container. Following are some considerations.

- -

Probe Policies, Size - Policies, and Trigger Policies

- -

Some combinations do not work well for probing containers. - For example, combining a quadratic probe policy with an - exponential size policy can yield a poor container: when an - element is inserted, a trigger policy might decide that there - is no need to resize, as the table still contains unused - entries; the probe sequence, however, might never reach any of - the unused entries.

- -

Unfortunately, pb_ds cannot detect such problems at - compilation (they are halting reducible). It therefore defines - an exception class insert_error to throw an - exception in this case.

- -

Hash Policies and Trigger - Policies

- -

Some trigger policies are especially susceptible to poor - hash functions. Suppose, as an extreme case, that the hash - function transforms each key to the same hash value. After some - inserts, a collision detecting policy will always indicate that - the container needs to grow.

- -

The library, therefore, by design, limits each operation to - one resize. For each insert, for example, it queries - only once whether a resize is needed.

- -

Equivalence Functors, Storing - Hash Values, and Hash Functions

- -

cc_hash_table and - gp_hash_table are - parametrized by an equivalence functor and by a - Store_Hash parameter. If the latter parameter is - true, then the container stores with each entry - a hash value, and uses this value in case of collisions to - determine whether to apply a hash value. This can lower the - cost of collision for some types, but increase the cost of - collisions for other types.

- -

If a ranged-hash function or ranged probe function is - directly supplied, however, then it makes no sense to store the - hash value with each entry. pb_ds's container will - fail at compilation, by design, if this is attempted.

- -

Size Policies and - Load-Check Trigger Policies

- -

Assume a size policy issues an increasing sequence of sizes - a, a q, a q1, a q2, ... For - example, an exponential size policy might issue the sequence of - sizes 8, 16, 32, 64, ...

- -

If a load-check trigger policy is used, with loads - αmin and αmax, - respectively, then it is a good idea to have:

- -
    -
  1. αmax ~ 1 / q
  2. - -
  3. αmin < 1 / (2 q)
  4. -
- -

This will ensure that the amortized hash cost of each - modifying operation is at most approximately 3.

- -

αmin ~ αmax is, in - any case, a bad choice, and αmin > - αmax is horrendous.

-
- - diff --git a/libstdc++-v3/docs/html/ext/pb_ds/hash_exponential_size_policy.html b/libstdc++-v3/docs/html/ext/pb_ds/hash_exponential_size_policy.html deleted file mode 100644 index 059fa48d7f5..00000000000 --- a/libstdc++-v3/docs/html/ext/pb_ds/hash_exponential_size_policy.html +++ /dev/null @@ -1,183 +0,0 @@ - - - - - - - hash_exponential_size_policy Interface - - - - -
-

hash_exponential_size_policy Interface

- -

A size policy whose sequence of sizes form an exponential - sequence (typically powers of 2)

- -

Defined in: hash_policy.hpp

- -

Template Parameters

- - - - - - - - - - - - - - - - - -
ParameterDescriptionDefault Value
-
-typename Size_Type 
-
-
-

Size type.

-
size_t
- -

Public Types and - Constants

- -

General Definitions

- - - - - - - - - - - - - - - - - -
TypeDefinitionDescription
-
-size_type
-
-
-
-Size_Type
-
-
-

Size type.

-
- -

Public Methods

- -

Constructors, Destructor, and - Related

- - - - - - - - - - - - - - - - - - - -
MethodDescription
-
-  hash_exponential_size_policy
-  (size_type start_size = 8, 
-    size_type grow_factor = 2)
-
-
-

Default constructor, or constructor taking a - start_size, or - constructor taking a start size and grow_factor. The policy will use the - sequence of sizes start_size, start_size * grow_factor, start_size * grow_factor^2, ...

-
-
-void 
-  swap
-  (hash_exponential_size_policy &other)
-
-
-

Swaps content.

-
- -

Protected Methods

- -

Size methods

- - - - - - - - - - - - - - - - - - - -
MethodDescription
-
-size_type
-  get_nearest_larger_size
-  (size_type size) const
-
-
-

Given a size size, - returns a size that is larger.

-
-
-size_type
-  get_nearest_smaller_size
-  (size_type size) const
-
-
-

Given a size size, - returns a size that is smaller.

-
-
- - diff --git a/libstdc++-v3/docs/html/ext/pb_ds/hash_load_check_resize_trigger.html b/libstdc++-v3/docs/html/ext/pb_ds/hash_load_check_resize_trigger.html deleted file mode 100644 index 0013e0127c0..00000000000 --- a/libstdc++-v3/docs/html/ext/pb_ds/hash_load_check_resize_trigger.html +++ /dev/null @@ -1,583 +0,0 @@ - - - - - - - hash_load_check_resize_trigger Interface - - - - -
-

hash_load_check_resize_trigger Interface

- -

A resize trigger policy based on a load check. It keeps the - load factor between some load factors load_min and - load_max.

- -

Defined in: hash_policy.hpp

- -

Template Parameters

- - - - - - - - - - - - - - - - - - - - - - - - - -
ParameterDescriptionDefault Value
-
-bool External_Load_Access 
-
-
-

Specifies whether the load factor can be accessed - externally. The two options have different trade-offs in - terms of flexibility, genericity, and encapsulation.

-
false
-
-typename Size_Type 
-
-
-

Size type.

-
size_t
- -

Public Types and - Constants

- -

General Definitions

- - - - - - - - - - - - - - - - - - - - - - - - - -
TypeDefinitionDescription
-
-size_type
-
-
-
-Size_Type
-
-
-

Size type.

-
-
-external_load_access
-
-
-
-External_Load_Access
-
-
-

Indicates whether loads can be accessed externally

-
- -

Public Methods

- -

Constructors, Destructor, and - Related

- - - - - - - - - - - - - - - - - - - - - - - - - -
MethodDescription
-
-  hash_load_check_resize_trigger
-  (float load_min = 0.125, 
-    float load_max = 0.5)
-
-
-

Default constructor, or constructor taking - load_min and - load_max load factors - between which this policy will keep the actual load.

- -

It is the responsibility of the user to ensure that - load_min is smaller than - load_max.

-
-
-void
-  swap
-  (hash_load_check_resize_trigger &other)
-
-
-

Swaps content.

-
-
-  virtual
-    ~hash_load_check_resize_trigger
-    ()
-
-
-

Destructor.

-
- -

Load Access Methods

- -

These methods are only available if the external access - parameter is set.

- - - - - - - - - - - - - - - - - - - -
MethodDescription
-
-inline std::pair<float, float>
-  get_loads
-  () const
-
-
-

Returns a pair of the minimal and maximal loads, - respectively.

- -

Calling this method will not compile when External_Load_Access - == false.

-
-
-void 
-  set_loads
-  (std::pair<float, float> load_pair)
-
-
-

Sets the loads through a pair of the minimal and - maximal loads, respectively.

- -

Calling this method resizes the container, and might - throw an exception. It is the responsibility of the user - to pass appropriate loads to this function. Calling this - method will not compile when External_Load_Access - == false.

-
- -

Protected Methods

- -

Insert Search - Notifications.

- -

Notifications called during an insert operation.

- - - - - - - - - - - - - - - - - - - - - - - - - -
MethodDescription
-
-inline void
-  notify_insert_search_start
-  ()
-
-
-

Notifies a search started.

-
-
-inline void
-  notify_insert_search_collision
-  ()
-
-
-

Notifies a search encountered a collision.

-
-
-inline void
-  notify_insert_search_end
-  ()
-
-
-

Notifies a search ended.

-
- -

Find Search - Notifications.

- -

Notifications called during a find operation.

- - - - - - - - - - - - - - - - - - - - - - - - - -
MethodDescription
-
-inline void
-  notify_find_search_start
-  ()
-
-
-

Notifies a search started.

-
-
-inline void
-  notify_find_search_collision
-  ()
-
-
-

Notifies a search encountered a collision.

-
-
-inline void
-  notify_find_search_end
-  ()
-
-
-

Notifies a search ended.

-
- -

Erase Search - Notifications.

- -

Notifications called during an insert operation.

- - - - - - - - - - - - - - - - - - - - - - - - - -
MethodDescription
-
-inline void
-  notify_erase_search_start
-  ()
-
-
-

Notifies a search started.

-
-
-inline void
-  notify_erase_search_collision
-  ()
-
-
-

Notifies a search encountered a collision.

-
-
-inline void
-  notify_erase_search_end
-  ()
-
-
-

Notifies a search ended.

-
- -

Content Change - Notifications.

- -

Notifications called when the content of the table changes - in a way that can affect the resize policy.

- - - - - - - - - - - - - - - - - - - - - - - - - -
MethodDescription
-
-inline void
-  notify_inserted
-  (size_type num_entries)
-
-
-

Notifies an element was inserted. the total number of - entries in the table is num_entries.

-
-
-inline void
-  notify_erased
-  (size_type num_entries)
-
-
-

Notifies an element was erased.

-
-
-void 
-  notify_cleared
-  ()
-
-
-

Notifies the table was cleared.

-
- -

Size Change - Notifications.

- -

Notifications called when the table changes size.

- - - - - - - - - - - - - - - - - - - -
MethodDescription
-
-void
-  notify_resized
-  (size_type new_size)
-
-
-

Notifies the table was resized as a result of this - object's signifying that a resize is needed.

-
-
-void
-  notify_externally_resized
-  (size_type new_size)
-
-
-

Notifies the table was resized externally.

-
- -

Queries

- -

Called to query whether/how to resize.

- - - - - - - - - - - - - - - - - - - -
MethodDescription
-
-inline bool 
-  is_resize_needed
-  () const
-
-
-

Queries whether a resize is needed.

-
-
-inline bool
-  is_grow_needed
-  (size_type size, 
-    size_type num_entries) const
-
-
-

Queries whether a grow is needed.

- -

This method is called only if this object indicated - resize is needed. The actual size of the table is size, and the number of entries in - it is num_entries.

-
- -

Private Methods

- -

Overrides

- - - - - - - - - - - - - -
MethodDescription
-
-virtual void
-  do_resize
-  (size_type new_size)
-
-
-

Resizes to new_size.

-
-
- - diff --git a/libstdc++-v3/docs/html/ext/pb_ds/hash_policy_cd.png b/libstdc++-v3/docs/html/ext/pb_ds/hash_policy_cd.png deleted file mode 100644 index f3122a112fc..00000000000 Binary files a/libstdc++-v3/docs/html/ext/pb_ds/hash_policy_cd.png and /dev/null differ diff --git a/libstdc++-v3/docs/html/ext/pb_ds/hash_prime_size_policy.html b/libstdc++-v3/docs/html/ext/pb_ds/hash_prime_size_policy.html deleted file mode 100644 index cf67dabe078..00000000000 --- a/libstdc++-v3/docs/html/ext/pb_ds/hash_prime_size_policy.html +++ /dev/null @@ -1,149 +0,0 @@ - - - - - - - hash_prime_size_policy Interface - - - - -
-

hash_prime_size_policy Interface

- -

A size policy whose sequence of sizes form a - nearly-exponential sequence of primes.

- -

Defined in: hash_policy.hpp

- -

Public Types and - Constants

- -

General Definitions

- - - - - - - - - - - - - - - - - -
TypeDefinitionDescription
-
-size_type
-
-
-
-size_t
-
-
-

Size type.

-
- -

Public Methods

- -

Constructors, Destructor, and - Related

- - - - - - - - - - - - - - - - - - - -
MethodDescription
-
-  hash_prime_size_policy
-  (size_type start_size = 8)
-
-
-

Default constructor, or constructor taking a - start_size The policy - will use the sequence of sizes approximately start_size, start_size * 2, start_size * 2^2, ...

-
-
-inline void
-  swap
-  (hash_prime_size_policy &other)
-
-
-

Swaps content.

-
- -

Protected Methods

- -

Size methods

- - - - - - - - - - - - - - - - - - - -
MethodDescription
-
-size_type
-  get_nearest_larger_size
-  (size_type size) const
-
-
-

Given a size size, - returns a size that is larger.

-
-
-size_type
-  get_nearest_smaller_size
-  (size_type size) const
-
-
-

Given a size size, - returns a size that is smaller.

-
-
- - diff --git a/libstdc++-v3/docs/html/ext/pb_ds/hash_random_int_erase_mem_usage_test.html b/libstdc++-v3/docs/html/ext/pb_ds/hash_random_int_erase_mem_usage_test.html deleted file mode 100644 index 073c84c2bba..00000000000 --- a/libstdc++-v3/docs/html/ext/pb_ds/hash_random_int_erase_mem_usage_test.html +++ /dev/null @@ -1,173 +0,0 @@ - - - - - -Tree Text Locality of Reference Timing Test - - - -
-

Hash-Based Erase Memory-Use Test

-

Description

-

This test inserts a number of uniform i.i.d. integer keys - into a container, then erases all keys except one. It measures - the final size of the container.

-

(The test was executed with hash_random_int_erase_mem_usage.cc - 2000 2000 2100)

-

Purpose

-

The test checks how containers adjust internally as their - logical size decreases (see Motivation::Associative - Containers::Slightly Different Methods::Methods Related to - Erase).

-

Results

-

Figures NHG, NHM and - NHL show the results for the native and - collision-chaining types in g++, msvc++ and - local, - respectively.

-
-
-
-
-
no image
NHG: Native, collision-chaing, and probing, hash random int erase test - g++

In the above figure, the names in the legends have the following meaning:

-
    -
  1. -n_hash_set_ncah- -std::tr1::unordered_set with cache_hash_code = false
  2. -
  3. -gp_hash_mask_linp_exp_nea_lc_1div8_1div2_nsth_set- -gp_hash_table - with Comb_Hash_Fn = direct_mask_range_hashing -, Resize_Policy = hash_standard_resize_policy - with Size_Policy = hash_exponential_size_policy -, and Trigger_Policy = hash_load_check_resize_trigger - with αmin = 1/8 and αmax = 1/2, and Probe_Fn = linear_probe_fn -
  4. -
  5. -cc_hash_mod_prime_nea_lc_1div8_1div1_nsth_set- -cc_hash_table -with Comb_Hash_Fn = direct_mod_range_hashing -, and Resize_Policy = hash_standard_resize_policy - with Size_Policy = hash_prime_size_policy -, and Trigger_Policy = hash_load_check_resize_trigger - with αmin = 1/8 and αmax = 1/1
  6. -
  7. -cc_hash_mask_exp_nea_lc_1div8_1div2_nsth_set- -cc_hash_table -with Comb_Hash_Fn = direct_mask_range_hashing -, and Resize_Policy = hash_standard_resize_policy - with Size_Policy = hash_exponential_size_policy -, and Trigger_Policy = hash_load_check_resize_trigger - with αmin = 1/8 and αmax = 1/2
  8. -
-
-
-
-
-
-
-
-
-
-
no image
NHM: Native, collision-chaing, and probing, hash random int erase test - msvc++

In the above figure, the names in the legends have the following meaning:

-
    -
  1. -n_hash_set_ncah- -stdext::hash_set
  2. -
  3. -gp_hash_mask_linp_exp_nea_lc_1div8_1div2_nsth_set- -gp_hash_table - with Comb_Hash_Fn = direct_mask_range_hashing -, Resize_Policy = hash_standard_resize_policy - with Size_Policy = hash_exponential_size_policy -, and Trigger_Policy = hash_load_check_resize_trigger - with αmin = 1/8 and αmax = 1/2, and Probe_Fn = linear_probe_fn -
  4. -
  5. -cc_hash_mod_prime_nea_lc_1div8_1div1_nsth_set- -cc_hash_table -with Comb_Hash_Fn = direct_mod_range_hashing -, and Resize_Policy = hash_standard_resize_policy - with Size_Policy = hash_prime_size_policy -, and Trigger_Policy = hash_load_check_resize_trigger - with αmin = 1/8 and αmax = 1/1
  6. -
  7. -cc_hash_mask_exp_nea_lc_1div8_1div2_nsth_set- -cc_hash_table -with Comb_Hash_Fn = direct_mask_range_hashing -, and Resize_Policy = hash_standard_resize_policy - with Size_Policy = hash_exponential_size_policy -, and Trigger_Policy = hash_load_check_resize_trigger - with αmin = 1/8 and αmax = 1/2
  8. -
-
-
-
-
-
-
-
-
-
-
no image
NHM: Native, collision-chaing, and probing, hash random int erase test - msvc++

In the above figure, the names in the legends have the following meaning:

-
    -
  1. -n_hash_set_ncah- -stdext::hash_set
  2. -
  3. -gp_hash_mask_linp_exp_nea_lc_1div8_1div2_nsth_set- -gp_hash_table - with Comb_Hash_Fn = direct_mask_range_hashing -, Resize_Policy = hash_standard_resize_policy - with Size_Policy = hash_exponential_size_policy -, and Trigger_Policy = hash_load_check_resize_trigger - with αmin = 1/8 and αmax = 1/2, and Probe_Fn = linear_probe_fn -
  4. -
  5. -cc_hash_mod_prime_nea_lc_1div8_1div1_nsth_set- -cc_hash_table -with Comb_Hash_Fn = direct_mod_range_hashing -, and Resize_Policy = hash_standard_resize_policy - with Size_Policy = hash_prime_size_policy -, and Trigger_Policy = hash_load_check_resize_trigger - with αmin = 1/8 and αmax = 1/1
  6. -
  7. -cc_hash_mask_exp_nea_lc_1div8_1div2_nsth_set- -cc_hash_table -with Comb_Hash_Fn = direct_mask_range_hashing -, and Resize_Policy = hash_standard_resize_policy - with Size_Policy = hash_exponential_size_policy -, and Trigger_Policy = hash_load_check_resize_trigger - with αmin = 1/8 and αmax = 1/2
  8. -
-
-
-
-
-
-
-
-
-
-
no image
NHL: Native, collision-chaing, and probing, hash random int erase test - local
-
-
-
-
-

Observations

-

STL hash-based containers act very differently than trees in - this respect. When erasing numerous keys from an STL - associative-container, the resulting memory user varies greatly - depending on whether the container is tree-based or hash-based. - As noted in Motivation::Choice of - Methods , this is a fundamental consequence of the STL's - associative containers' interface, it is not due to a specific - implementation.

-

(See Priority Queue - Text pop Memory Use Test for a similar phenomenon - regarding priority queues.)

-
- - diff --git a/libstdc++-v3/docs/html/ext/pb_ds/hash_random_int_erase_mem_usage_test_gcc.png b/libstdc++-v3/docs/html/ext/pb_ds/hash_random_int_erase_mem_usage_test_gcc.png deleted file mode 100644 index c552506a755..00000000000 Binary files a/libstdc++-v3/docs/html/ext/pb_ds/hash_random_int_erase_mem_usage_test_gcc.png and /dev/null differ diff --git a/libstdc++-v3/docs/html/ext/pb_ds/hash_random_int_erase_mem_usage_test_local.png b/libstdc++-v3/docs/html/ext/pb_ds/hash_random_int_erase_mem_usage_test_local.png deleted file mode 100644 index dbd3ee9d3c0..00000000000 Binary files a/libstdc++-v3/docs/html/ext/pb_ds/hash_random_int_erase_mem_usage_test_local.png and /dev/null differ diff --git a/libstdc++-v3/docs/html/ext/pb_ds/hash_random_int_erase_mem_usage_test_msvc.png b/libstdc++-v3/docs/html/ext/pb_ds/hash_random_int_erase_mem_usage_test_msvc.png deleted file mode 100644 index 8c23d46da39..00000000000 Binary files a/libstdc++-v3/docs/html/ext/pb_ds/hash_random_int_erase_mem_usage_test_msvc.png and /dev/null differ diff --git a/libstdc++-v3/docs/html/ext/pb_ds/hash_random_int_find_find_timing_test.html b/libstdc++-v3/docs/html/ext/pb_ds/hash_random_int_find_find_timing_test.html deleted file mode 100644 index 7e7f2084b08..00000000000 --- a/libstdc++-v3/docs/html/ext/pb_ds/hash_random_int_find_find_timing_test.html +++ /dev/null @@ -1,247 +0,0 @@ - - - - - -Hash Random Int Find Timing Test - - - -
-

Hash-Based Random-Integer find Find Timing - Test

-

Description

-

This test inserts a number of values with uniform i.i.d. - integer keys into a container, then performs a series of finds - using find. It measures the average time - forfind as a function of the number of values - inserted.

-

(The test was executed with random_int_find_timing_test - 200 200 2100)

-

Purpose

-

The test checks the effect of different underlying - hash-tables (see Design::Associative - Containers::Associative Containers::Hash-Based Containers), - range-hashing functions, and trigger policies (see Design::Associative - Containers::Hash-Based Containers::Hash Policies and - Design::Associative - Containers::Hash-Based Containers::Resize Policies).

-

Results

-

Figures NCCG, NCCM, - and NCCL show the results for the native - and collision-chaining types in g++, MSVC++, and - local, - respectively; Figures NGPG, NGPM, and NGPL show the results - for the native and probing types in g++, MSVC++, and - local - respectively.

-
-
-
-
-
no image
NCCG: Native and collision-chaining hash random int find timing test using find - g++

In the above figure, the names in the legends have the following meaning:

-
    -
  1. -n_hash_map_ncah- -std::tr1::unordered_map with cache_hash_code = false
  2. -
  3. -cc_hash_mod_prime_nea_lc_1div8_1div1_nsth_map- -cc_hash_table -with Comb_Hash_Fn = direct_mod_range_hashing -, and Resize_Policy = hash_standard_resize_policy - with Size_Policy = hash_prime_size_policy -, and Trigger_Policy = hash_load_check_resize_trigger - with αmin = 1/8 and αmax = 1/1
  4. -
  5. -cc_hash_mod_prime_nea_lc_1div8_1div2_nsth_map- -cc_hash_table -with Comb_Hash_Fn = direct_mod_range_hashing -, and Resize_Policy = hash_standard_resize_policy - with Size_Policy = hash_prime_size_policy -, and Trigger_Policy = hash_load_check_resize_trigger - with αmin = 1/8 and αmax = 1/2
  6. -
  7. -cc_hash_mask_exp_nea_lc_1div8_1div1_nsth_map- -cc_hash_table -with Comb_Hash_Fn = direct_mask_range_hashing -, and Resize_Policy = hash_standard_resize_policy - with Size_Policy = hash_exponential_size_policy -, and Trigger_Policy = hash_load_check_resize_trigger - with αmin = 1/8 and αmax = 1/1
  8. -
  9. -cc_hash_mask_exp_nea_lc_1div8_1div2_nsth_map- -cc_hash_table -with Comb_Hash_Fn = direct_mask_range_hashing -, and Resize_Policy = hash_standard_resize_policy - with Size_Policy = hash_exponential_size_policy -, and Trigger_Policy = hash_load_check_resize_trigger - with αmin = 1/8 and αmax = 1/2
  10. -
-
-
-
-
-
-
-
-
-
-
no image
NCCM: Native and collision-chaining hash random int find timing test using find - msvc++

In the above figure, the names in the legends have the following meaning:

-
    -
  1. -cc_hash_mod_prime_nea_lc_1div8_1div1_nsth_map- -cc_hash_table -with Comb_Hash_Fn = direct_mod_range_hashing -, and Resize_Policy = hash_standard_resize_policy - with Size_Policy = hash_prime_size_policy -, and Trigger_Policy = hash_load_check_resize_trigger - with αmin = 1/8 and αmax = 1/1
  2. -
  3. -cc_hash_mod_prime_nea_lc_1div8_1div2_nsth_map- -cc_hash_table -with Comb_Hash_Fn = direct_mod_range_hashing -, and Resize_Policy = hash_standard_resize_policy - with Size_Policy = hash_prime_size_policy -, and Trigger_Policy = hash_load_check_resize_trigger - with αmin = 1/8 and αmax = 1/2
  4. -
  5. -n_hash_map_ncah- -stdext::hash_map
  6. -
  7. -cc_hash_mask_exp_nea_lc_1div8_1div1_nsth_map- -cc_hash_table -with Comb_Hash_Fn = direct_mask_range_hashing -, and Resize_Policy = hash_standard_resize_policy - with Size_Policy = hash_exponential_size_policy -, and Trigger_Policy = hash_load_check_resize_trigger - with αmin = 1/8 and αmax = 1/1
  8. -
  9. -cc_hash_mask_exp_nea_lc_1div8_1div2_nsth_map- -cc_hash_table -with Comb_Hash_Fn = direct_mask_range_hashing -, and Resize_Policy = hash_standard_resize_policy - with Size_Policy = hash_exponential_size_policy -, and Trigger_Policy = hash_load_check_resize_trigger - with αmin = 1/8 and αmax = 1/2
  10. -
-
-
-
-
-
-
-
-
-
-
no image
NCCL: Native and collision-chaining hash random int find timing test using find - local
-
-
-
-
-
-
-
-
-
no image
NGPG: Native and collision-chaining hash random int find timing test using find - g++

In the above figure, the names in the legends have the following meaning:

-
    -
  1. -gp_hash_mod_quadp_prime_nea_lc_1div8_1div2_nsth_map- -gp_hash_table - with Comb_Hash_Fn = direct_mod_range_hashing -, Resize_Policy = hash_standard_resize_policy - with Size_Policy = hash_prime_size_policy -, and Trigger_Policy = hash_load_check_resize_trigger - with αmin = 1/8 and αmax = 1/2, and Probe_Fn = quadratic_probe_fn -
  2. -
  3. -n_hash_map_ncah- -std::tr1::unordered_map with cache_hash_code = false
  4. -
  5. -gp_hash_mask_linp_exp_nea_lc_1div8_1div2_nsth_map- -gp_hash_table - with Comb_Hash_Fn = direct_mask_range_hashing -, Resize_Policy = hash_standard_resize_policy - with Size_Policy = hash_exponential_size_policy -, and Trigger_Policy = hash_load_check_resize_trigger - with αmin = 1/8 and αmax = 1/2, and Probe_Fn = linear_probe_fn -
  6. -
-
-
-
-
-
-
-
-
-
-
no image
NGPM: Native and collision-chaining hash random int find timing test using find - msvc++

In the above figure, the names in the legends have the following meaning:

-
    -
  1. -gp_hash_mod_quadp_prime_nea_lc_1div8_1div2_nsth_map- -gp_hash_table - with Comb_Hash_Fn = direct_mod_range_hashing -, Resize_Policy = hash_standard_resize_policy - with Size_Policy = hash_prime_size_policy -, and Trigger_Policy = hash_load_check_resize_trigger - with αmin = 1/8 and αmax = 1/2, and Probe_Fn = quadratic_probe_fn -
  2. -
  3. -n_hash_map_ncah- -stdext::hash_map
  4. -
  5. -gp_hash_mask_linp_exp_nea_lc_1div8_1div2_nsth_map- -gp_hash_table - with Comb_Hash_Fn = direct_mask_range_hashing -, Resize_Policy = hash_standard_resize_policy - with Size_Policy = hash_exponential_size_policy -, and Trigger_Policy = hash_load_check_resize_trigger - with αmin = 1/8 and αmax = 1/2, and Probe_Fn = linear_probe_fn -
  6. -
-
-
-
-
-
-
-
-
-
-
no image
NGPL: Native and collision-chaining hash random int find timing test using find - local
-
-
-
-
-

Observations

-

In this setting, the choice of underlying hash-table (see - Design::Associative - Containers::Hash-Based Containers ) affects performance - most, then the range-hashing scheme (See Design::Associative - Containers::Hash-Based Containers::Hash Policies ), and, - only finally, other policies.

-

When comparing Figures NCCG and NCCM to NGPG and NGPM , respectively, it is apparent that the - probing containers are less efficient than the - collision-chaining containers (both - std::tr1::unordered_map and stdext::hash_map - use collision-chaining) in this case.

-

( Hash-Based - Random-Integer Subscript Insert Timing Test shows a - different case, where the situation is reversed; Observations::Hash-Based - Container Types discusses some further considerations.)

-

Within each type of hash-table, the range-hashing scheme - affects performance more than other policies; Hash-Based - Text find Find Timing Test::Observations discusses - this. In Figures NCCG , NCCM , NGPG , and NGPM , it should be noted that - std::tr1::unordered_map and stdext::hash_map - are hard-wired currently to mod-based and mask-based schemes, - respectively.

-

Observations::Hash-Based - Container Types summarizes some observations on hash-based - containers; Observations::Hash-Based - Containers' Policies summarizes some observations on - hash-based containers' policies.

-
- - diff --git a/libstdc++-v3/docs/html/ext/pb_ds/hash_random_int_subscript_find_timing_test.html b/libstdc++-v3/docs/html/ext/pb_ds/hash_random_int_subscript_find_timing_test.html deleted file mode 100644 index adee8f0b1bd..00000000000 --- a/libstdc++-v3/docs/html/ext/pb_ds/hash_random_int_subscript_find_timing_test.html +++ /dev/null @@ -1,220 +0,0 @@ - - - - - -Hash Random Int Subscript Find Timing Test - - - -
-

Hash-Based Random-Integer operator[] - FindTiming Test

-

Description

-

This test inserts a number of values with uniform i.i.d. - integer keys into a container, then performs a series of finds - using operator[]. It measures the average time - for operator[] as a function of the number of - values inserted.

-

(The test was executed with hash_random_int_subscript_find_timing_test - 200 200 2100)

-

Purpose

-

The test checks the effect of different underlying - hash-tables (see Design::Hash-Based Containers - ), range-hashing functions, and trigger policies (see Design::Hash-Based - Containers::Hash Policies and Design::Hash-Based - Containers::Resize Policies ).

-

Results

-

Figures NCCG, NCCM, - and NCCL show the results for the native - and collision-chaining types in g++, MSVC++, and - local, - respectively; Figures NGPG, NGPM, and NGPL show the results - for the native and probing types in g++, MSVC++, and - local, - respectively.

-
-
-
-
-
no image
NCCG: Native and collision-chaining hash random int find timing test using operator[] - g++

In the above figure, the names in the legends have the following meaning:

-
    -
  1. -n_hash_map_ncah- -std::tr1::unordered_map with cache_hash_code = false
  2. -
  3. -cc_hash_mod_prime_nea_lc_1div8_1div1_nsth_map- -cc_hash_table -with Comb_Hash_Fn = direct_mod_range_hashing -, and Resize_Policy = hash_standard_resize_policy - with Size_Policy = hash_prime_size_policy -, and Trigger_Policy = hash_load_check_resize_trigger - with αmin = 1/8 and αmax = 1/1
  4. -
  5. -cc_hash_mod_prime_nea_lc_1div8_1div2_nsth_map- -cc_hash_table -with Comb_Hash_Fn = direct_mod_range_hashing -, and Resize_Policy = hash_standard_resize_policy - with Size_Policy = hash_prime_size_policy -, and Trigger_Policy = hash_load_check_resize_trigger - with αmin = 1/8 and αmax = 1/2
  6. -
  7. -cc_hash_mask_exp_nea_lc_1div8_1div1_nsth_map- -cc_hash_table -with Comb_Hash_Fn = direct_mask_range_hashing -, and Resize_Policy = hash_standard_resize_policy - with Size_Policy = hash_exponential_size_policy -, and Trigger_Policy = hash_load_check_resize_trigger - with αmin = 1/8 and αmax = 1/1
  8. -
  9. -cc_hash_mask_exp_nea_lc_1div8_1div2_nsth_map- -cc_hash_table -with Comb_Hash_Fn = direct_mask_range_hashing -, and Resize_Policy = hash_standard_resize_policy - with Size_Policy = hash_exponential_size_policy -, and Trigger_Policy = hash_load_check_resize_trigger - with αmin = 1/8 and αmax = 1/2
  10. -
-
-
-
-
-
-
-
-
-
-
no image
NCCM: Native and collision-chaining hash random int find timing test using operator[] - msvc++

In the above figure, the names in the legends have the following meaning:

-
    -
  1. -cc_hash_mod_prime_nea_lc_1div8_1div1_nsth_map- -cc_hash_table -with Comb_Hash_Fn = direct_mod_range_hashing -, and Resize_Policy = hash_standard_resize_policy - with Size_Policy = hash_prime_size_policy -, and Trigger_Policy = hash_load_check_resize_trigger - with αmin = 1/8 and αmax = 1/1
  2. -
  3. -cc_hash_mod_prime_nea_lc_1div8_1div2_nsth_map- -cc_hash_table -with Comb_Hash_Fn = direct_mod_range_hashing -, and Resize_Policy = hash_standard_resize_policy - with Size_Policy = hash_prime_size_policy -, and Trigger_Policy = hash_load_check_resize_trigger - with αmin = 1/8 and αmax = 1/2
  4. -
  5. -n_hash_map_ncah- -stdext::hash_map
  6. -
  7. -cc_hash_mask_exp_nea_lc_1div8_1div1_nsth_map- -cc_hash_table -with Comb_Hash_Fn = direct_mask_range_hashing -, and Resize_Policy = hash_standard_resize_policy - with Size_Policy = hash_exponential_size_policy -, and Trigger_Policy = hash_load_check_resize_trigger - with αmin = 1/8 and αmax = 1/1
  8. -
  9. -cc_hash_mask_exp_nea_lc_1div8_1div2_nsth_map- -cc_hash_table -with Comb_Hash_Fn = direct_mask_range_hashing -, and Resize_Policy = hash_standard_resize_policy - with Size_Policy = hash_exponential_size_policy -, and Trigger_Policy = hash_load_check_resize_trigger - with αmin = 1/8 and αmax = 1/2
  10. -
-
-
-
-
-
-
-
-
-
-
no image
NCCL: Native and collision-chaining hash random int find timing test using operator[] - local
-
-
-
-
-
-
-
-
-
no image
NGPG: Native and probing hash random int find timing test using operator[] - g++

In the above figure, the names in the legends have the following meaning:

-
    -
  1. -n_hash_map_ncah- -std::tr1::unordered_map with cache_hash_code = false
  2. -
  3. -gp_hash_mod_quadp_prime_nea_lc_1div8_1div2_nsth_map- -gp_hash_table - with Comb_Hash_Fn = direct_mod_range_hashing -, Resize_Policy = hash_standard_resize_policy - with Size_Policy = hash_prime_size_policy -, and Trigger_Policy = hash_load_check_resize_trigger - with αmin = 1/8 and αmax = 1/2, and Probe_Fn = quadratic_probe_fn -
  4. -
  5. -gp_hash_mask_linp_exp_nea_lc_1div8_1div2_nsth_map- -gp_hash_table - with Comb_Hash_Fn = direct_mask_range_hashing -, Resize_Policy = hash_standard_resize_policy - with Size_Policy = hash_exponential_size_policy -, and Trigger_Policy = hash_load_check_resize_trigger - with αmin = 1/8 and αmax = 1/2, and Probe_Fn = linear_probe_fn -
  6. -
-
-
-
-
-
-
-
-
-
-
no image
NGPM: Native and probing hash random int find timing test using operator[] - msvc++

In the above figure, the names in the legends have the following meaning:

-
    -
  1. -gp_hash_mod_quadp_prime_nea_lc_1div8_1div2_nsth_map- -gp_hash_table - with Comb_Hash_Fn = direct_mod_range_hashing -, Resize_Policy = hash_standard_resize_policy - with Size_Policy = hash_prime_size_policy -, and Trigger_Policy = hash_load_check_resize_trigger - with αmin = 1/8 and αmax = 1/2, and Probe_Fn = quadratic_probe_fn -
  2. -
  3. -n_hash_map_ncah- -stdext::hash_map
  4. -
  5. -gp_hash_mask_linp_exp_nea_lc_1div8_1div2_nsth_map- -gp_hash_table - with Comb_Hash_Fn = direct_mask_range_hashing -, Resize_Policy = hash_standard_resize_policy - with Size_Policy = hash_exponential_size_policy -, and Trigger_Policy = hash_load_check_resize_trigger - with αmin = 1/8 and αmax = 1/2, and Probe_Fn = linear_probe_fn -
  6. -
-
-
-
-
-
-
-
-
-
-
no image
NGPL: Native and probing hash random int find timing test using operator[] - local
-
-
-
-
-

Observations

-

This test shows similar results to Hash-Based - Random-Integer find Find Timing Test .

-
- - diff --git a/libstdc++-v3/docs/html/ext/pb_ds/hash_random_int_subscript_insert_timing_test.html b/libstdc++-v3/docs/html/ext/pb_ds/hash_random_int_subscript_insert_timing_test.html deleted file mode 100644 index 37a8644a496..00000000000 --- a/libstdc++-v3/docs/html/ext/pb_ds/hash_random_int_subscript_insert_timing_test.html +++ /dev/null @@ -1,365 +0,0 @@ - - - - - -Hash Random Int Subscript Insert Timing Test - - - -
-

Hash-Based Random-Integer operator[] Insert - Timing Test

-

Description

-

This test inserts a number of values with uniform i.i.d. - integer keys into a container, using - operator[]. It measures the average time for - operator[] as a function of the number of - values inserted.

-

(The test was executed with hash_random_int_subscript_insert_timing_test - 200 200 2100)

-

Purpose

-

The test primarily checks the effect of different underlying - hash-tables (see Design::Associative - Containers::Associative Containers::Hash-Based - Containers).

-

Results

-

Figures NCCG, NCCM, - and NCCL show the results for the native - and collision-chaining types in g++, MSVC++, and - local, - respectively; Figures NGPG, NGPM, and NGPL show the results - for the native and probing types in g++, msvc++, and - local - respectively; Figures CCGPG, CCGPM, and CCGPL compare the - results for the collision-chaining and probing types of - pb_ds only, in g++, MSVC++, and - local - respectively.

-
-
-
-
-
no image
NCCG: Native and collision-chaining hash random int insert timing test using operator - g++

In the above figure, the names in the legends have the following meaning:

-
    -
  1. -cc_hash_mod_prime_nea_lc_1div8_1div2_nsth_map- -cc_hash_table -with Comb_Hash_Fn = direct_mod_range_hashing -, and Resize_Policy = hash_standard_resize_policy - with Size_Policy = hash_prime_size_policy -, and Trigger_Policy = hash_load_check_resize_trigger - with αmin = 1/8 and αmax = 1/2
  2. -
  3. -n_hash_map_ncah- -std::tr1::unordered_map with cache_hash_code = false
  4. -
  5. -cc_hash_mask_exp_nea_lc_1div8_1div2_nsth_map- -cc_hash_table -with Comb_Hash_Fn = direct_mask_range_hashing -, and Resize_Policy = hash_standard_resize_policy - with Size_Policy = hash_exponential_size_policy -, and Trigger_Policy = hash_load_check_resize_trigger - with αmin = 1/8 and αmax = 1/2
  6. -
  7. -cc_hash_mod_prime_nea_lc_1div8_1div1_nsth_map- -cc_hash_table -with Comb_Hash_Fn = direct_mod_range_hashing -, and Resize_Policy = hash_standard_resize_policy - with Size_Policy = hash_prime_size_policy -, and Trigger_Policy = hash_load_check_resize_trigger - with αmin = 1/8 and αmax = 1/1
  8. -
  9. -cc_hash_mask_exp_nea_lc_1div8_1div1_nsth_map- -cc_hash_table -with Comb_Hash_Fn = direct_mask_range_hashing -, and Resize_Policy = hash_standard_resize_policy - with Size_Policy = hash_exponential_size_policy -, and Trigger_Policy = hash_load_check_resize_trigger - with αmin = 1/8 and αmax = 1/1
  10. -
-
-
-
-
-
-
-
-
-
-
no image
NCCM: Native and collision-chaining hash random int insert timing test using operator - msvc++

In the above figure, the names in the legends have the following meaning:

-
    -
  1. -n_hash_map_ncah- -stdext::hash_map
  2. -
  3. -cc_hash_mod_prime_nea_lc_1div8_1div2_nsth_map- -cc_hash_table -with Comb_Hash_Fn = direct_mod_range_hashing -, and Resize_Policy = hash_standard_resize_policy - with Size_Policy = hash_prime_size_policy -, and Trigger_Policy = hash_load_check_resize_trigger - with αmin = 1/8 and αmax = 1/2
  4. -
  5. -cc_hash_mod_prime_nea_lc_1div8_1div1_nsth_map- -cc_hash_table -with Comb_Hash_Fn = direct_mod_range_hashing -, and Resize_Policy = hash_standard_resize_policy - with Size_Policy = hash_prime_size_policy -, and Trigger_Policy = hash_load_check_resize_trigger - with αmin = 1/8 and αmax = 1/1
  6. -
  7. -cc_hash_mask_exp_nea_lc_1div8_1div2_nsth_map- -cc_hash_table -with Comb_Hash_Fn = direct_mask_range_hashing -, and Resize_Policy = hash_standard_resize_policy - with Size_Policy = hash_exponential_size_policy -, and Trigger_Policy = hash_load_check_resize_trigger - with αmin = 1/8 and αmax = 1/2
  8. -
  9. -cc_hash_mask_exp_nea_lc_1div8_1div1_nsth_map- -cc_hash_table -with Comb_Hash_Fn = direct_mask_range_hashing -, and Resize_Policy = hash_standard_resize_policy - with Size_Policy = hash_exponential_size_policy -, and Trigger_Policy = hash_load_check_resize_trigger - with αmin = 1/8 and αmax = 1/1
  10. -
-
-
-
-
-
-
-
-
-
-
no image
NCCL: Native and collision-chaining hash random int insert timing test using operator - local
-
-
-
-
-
-
-
-
-
no image
NGPG: Native and probing hash random int insert timing test using operator - g++

In the above figure, the names in the legends have the following meaning:

-
    -
  1. -gp_hash_mod_quadp_prime_nea_lc_1div8_1div2_nsth_map- -gp_hash_table - with Comb_Hash_Fn = direct_mod_range_hashing -, Resize_Policy = hash_standard_resize_policy - with Size_Policy = hash_prime_size_policy -, and Trigger_Policy = hash_load_check_resize_trigger - with αmin = 1/8 and αmax = 1/2, and Probe_Fn = quadratic_probe_fn -
  2. -
  3. -n_hash_map_ncah- -std::tr1::unordered_map with cache_hash_code = false
  4. -
  5. -gp_hash_mask_linp_exp_nea_lc_1div8_1div2_nsth_map- -gp_hash_table - with Comb_Hash_Fn = direct_mask_range_hashing -, Resize_Policy = hash_standard_resize_policy - with Size_Policy = hash_exponential_size_policy -, and Trigger_Policy = hash_load_check_resize_trigger - with αmin = 1/8 and αmax = 1/2, and Probe_Fn = linear_probe_fn -
  6. -
-
-
-
-
-
-
-
-
-
-
no image
NGPM: Native and probing hash random int insert timing test using operator - msvc++

In the above figure, the names in the legends have the following meaning:

-
    -
  1. -n_hash_map_ncah- -stdext::hash_map
  2. -
  3. -gp_hash_mod_quadp_prime_nea_lc_1div8_1div2_nsth_map- -gp_hash_table - with Comb_Hash_Fn = direct_mod_range_hashing -, Resize_Policy = hash_standard_resize_policy - with Size_Policy = hash_prime_size_policy -, and Trigger_Policy = hash_load_check_resize_trigger - with αmin = 1/8 and αmax = 1/2, and Probe_Fn = quadratic_probe_fn -
  4. -
  5. -gp_hash_mask_linp_exp_nea_lc_1div8_1div2_nsth_map- -gp_hash_table - with Comb_Hash_Fn = direct_mask_range_hashing -, Resize_Policy = hash_standard_resize_policy - with Size_Policy = hash_exponential_size_policy -, and Trigger_Policy = hash_load_check_resize_trigger - with αmin = 1/8 and αmax = 1/2, and Probe_Fn = linear_probe_fn -
  6. -
-
-
-
-
-
-
-
-
-
-
no image
NGPL: Native and probing hash random int insert timing test using operator - local
-
-
-
-
-
-
-
-
-
no image
CCGPG: Collision-chaining and probing hash random int insert timing test using operator - g++

In the above figure, the names in the legends have the following meaning:

-
    -
  1. -gp_hash_mod_quadp_prime_nea_lc_1div8_1div2_nsth_map- -gp_hash_table - with Comb_Hash_Fn = direct_mod_range_hashing -, Resize_Policy = hash_standard_resize_policy - with Size_Policy = hash_prime_size_policy -, and Trigger_Policy = hash_load_check_resize_trigger - with αmin = 1/8 and αmax = 1/2, and Probe_Fn = quadratic_probe_fn -
  2. -
  3. -cc_hash_mod_prime_nea_lc_1div8_1div2_nsth_map- -cc_hash_table -with Comb_Hash_Fn = direct_mod_range_hashing -, and Resize_Policy = hash_standard_resize_policy - with Size_Policy = hash_prime_size_policy -, and Trigger_Policy = hash_load_check_resize_trigger - with αmin = 1/8 and αmax = 1/2
  4. -
  5. -cc_hash_mask_exp_nea_lc_1div8_1div2_nsth_map- -cc_hash_table -with Comb_Hash_Fn = direct_mask_range_hashing -, and Resize_Policy = hash_standard_resize_policy - with Size_Policy = hash_exponential_size_policy -, and Trigger_Policy = hash_load_check_resize_trigger - with αmin = 1/8 and αmax = 1/2
  6. -
  7. -gp_hash_mask_linp_exp_nea_lc_1div8_1div2_nsth_map- -gp_hash_table - with Comb_Hash_Fn = direct_mask_range_hashing -, Resize_Policy = hash_standard_resize_policy - with Size_Policy = hash_exponential_size_policy -, and Trigger_Policy = hash_load_check_resize_trigger - with αmin = 1/8 and αmax = 1/2, and Probe_Fn = linear_probe_fn -
  8. -
-
-
-
-
-
-
-
-
-
-
no image
CCGPM: Collision-chaining and probing hash random int insert timing test using operator - msvc++

In the above figure, the names in the legends have the following meaning:

-
    -
  1. -cc_hash_mod_prime_nea_lc_1div8_1div2_nsth_map- -cc_hash_table -with Comb_Hash_Fn = direct_mod_range_hashing -, and Resize_Policy = hash_standard_resize_policy - with Size_Policy = hash_prime_size_policy -, and Trigger_Policy = hash_load_check_resize_trigger - with αmin = 1/8 and αmax = 1/2
  2. -
  3. -cc_hash_mask_exp_nea_lc_1div8_1div2_nsth_map- -cc_hash_table -with Comb_Hash_Fn = direct_mask_range_hashing -, and Resize_Policy = hash_standard_resize_policy - with Size_Policy = hash_exponential_size_policy -, and Trigger_Policy = hash_load_check_resize_trigger - with αmin = 1/8 and αmax = 1/2
  4. -
  5. -gp_hash_mod_quadp_prime_nea_lc_1div8_1div2_nsth_map- -gp_hash_table - with Comb_Hash_Fn = direct_mod_range_hashing -, Resize_Policy = hash_standard_resize_policy - with Size_Policy = hash_prime_size_policy -, and Trigger_Policy = hash_load_check_resize_trigger - with αmin = 1/8 and αmax = 1/2, and Probe_Fn = quadratic_probe_fn -
  6. -
  7. -gp_hash_mask_linp_exp_nea_lc_1div8_1div2_nsth_map- -gp_hash_table - with Comb_Hash_Fn = direct_mask_range_hashing -, Resize_Policy = hash_standard_resize_policy - with Size_Policy = hash_exponential_size_policy -, and Trigger_Policy = hash_load_check_resize_trigger - with αmin = 1/8 and αmax = 1/2, and Probe_Fn = linear_probe_fn -
  8. -
-
-
-
-
-
-
-
-
-
-
no image
CCGPL: Collision-chaining and probing hash random int insert timing test using operator - local
-
-
-
-
-

Observations

-

In this setting, as in Hash-Based Text - find Find Timing Test and Hash-Based - Random-Integer find Find Timing Test , the choice - of underlying hash-table underlying hash-table (see Design::Associative - Containers::Hash-Based Containers ) affects performance - most, then the range-hashing scheme (See Design::Associative - Containers::Hash-Based Containers::Hash Policies ), and, - only finally, other policies.

-

There are some differences, however:

-
    -
  1. In this setting, probing tables function sometimes more - efficiently than collision-chaining tables (see Figures - CCGPG and CCGPM ). - This is explained shortly.
  2. -
  3. The performance graphs have a "saw-tooth" shape. The - average insert time rises and falls. As values are inserted - into the container, the load factor grows larger. Eventually, - a resize occurs. The reallocations and rehashing are - relatively expensive. After this, the load factor is smaller - than before.
  4. -
-

Collision-chaining containers use indirection for greater - flexibility; probing containers store values contiguously, in - an array (see Figure Motivation::Different - underlying data structures A and B, respectively). It - follows that for simple data types, probing containers access - their allocator less frequently than collision-chaining - containers, (although they still have less efficient probing - sequences). This explains why some probing containers fare - better than collision-chaining containers in this case.

-

Within each type of hash-table, the range-hashing scheme - affects performance more than other policies. This is similar - to the situation in Hash-Based Text - find Find Timing Test and Hash-Based - Random-Integer find Find Timing Test. - Unsurprisingly, however, containers with lower -alphamax perform worse in this case, - since more re-hashes are performed.

-

Observations::Hash-Based - Container Types summarizes some observations on hash-based - containers; Observations::Hash-Based - Containers' Policies summarizes some observations on - hash-based containers' policies.

-
- - diff --git a/libstdc++-v3/docs/html/ext/pb_ds/hash_range_hashing_seq_diagram.png b/libstdc++-v3/docs/html/ext/pb_ds/hash_range_hashing_seq_diagram.png deleted file mode 100644 index 5c37407dda6..00000000000 Binary files a/libstdc++-v3/docs/html/ext/pb_ds/hash_range_hashing_seq_diagram.png and /dev/null differ diff --git a/libstdc++-v3/docs/html/ext/pb_ds/hash_range_hashing_seq_diagram2.png b/libstdc++-v3/docs/html/ext/pb_ds/hash_range_hashing_seq_diagram2.png deleted file mode 100644 index 87763caacc7..00000000000 Binary files a/libstdc++-v3/docs/html/ext/pb_ds/hash_range_hashing_seq_diagram2.png and /dev/null differ diff --git a/libstdc++-v3/docs/html/ext/pb_ds/hash_ranged_hash_range_hashing_fns.png b/libstdc++-v3/docs/html/ext/pb_ds/hash_ranged_hash_range_hashing_fns.png deleted file mode 100644 index 5e0d7f4037b..00000000000 Binary files a/libstdc++-v3/docs/html/ext/pb_ds/hash_ranged_hash_range_hashing_fns.png and /dev/null differ diff --git a/libstdc++-v3/docs/html/ext/pb_ds/hash_standard_resize_policy.html b/libstdc++-v3/docs/html/ext/pb_ds/hash_standard_resize_policy.html deleted file mode 100644 index 70d6086d503..00000000000 --- a/libstdc++-v3/docs/html/ext/pb_ds/hash_standard_resize_policy.html +++ /dev/null @@ -1,795 +0,0 @@ - - - - - - - hash_standard_resize_policy Interface - - - - -
-

hash_standard_resize_policy Interface

- -

A resize policy which delegates operations to size and - trigger policies.

- -

Defined in: hash_policy.hpp

- -

Template Parameters

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ParameterDescriptionDefault Value
-
-class Size_Policy 
-
-
-

Size policy type.

-
hash_exponential_size_policy
-
-class Trigger_Policy 
-
-
-

Trigger policy type.

-
hash_load_check_resize_trigger
-
-bool External_Size_Access 
-
-
-

Indicates whether physical sizes can be accessed - externally.

-
false
-
-typename Size_Type 
-
-
-

Size type.

-
size_t
- -

Base Classes

- - - - - - - - - - - - - - - - - - - -
ClassDerivation Type
-
-Size_Policy
-
-
-

public

-
-
-Trigger_Policy
-
-
-

public

-
- -

Public Types and - Constants

- -

General Definitions

- - - - - - - - - - - - - - - - - -
TypeDefinitionDescription
-
-size_type
-
-
-
-Size_Type
-
-
-

Size type.

-
- -

Policy Definitions

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
TypeDefinitionDescription
-
-trigger_policy
-
-
-
-Trigger_Policy
-
-
-

Trigger policy type.

-
-
-size_policy
-
-
-
-Size_Policy
-
-
-

Size policy type.

-
-
-external_size_access
-
-
-
-External_Size_Access
-
-
-

Indicates whether sizes can be accessed - externally.

-
- -

Public Methods

- -

Constructors, Destructor, and - Related

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
MethodDescription
-
-  hash_standard_resize_policy
-  ()
-
-
-

Default constructor.

-
-
-  hash_standard_resize_policy
-  (const Size_Policy &r_size_policy)
-
-
-

constructor taking some policies r_size_policy will be copied by the - Size_Policy - object of this object.

-
-
-  hash_standard_resize_policy
-  (const Size_Policy &r_size_policy,
-    const Trigger_Policy &r_trigger_policy)
-
-
-

constructor taking some policies. r_size_policy will be copied by the - Size_Policy - object of this object. r_trigger_policy will be copied by - the Trigger_Policy - object of this object.

-
-
-virtual 
-  ~hash_standard_resize_policy
-  ()
-
-
-

Destructor.

-
-
-inline void 
-  swap
-  (hash_standard_resize_policy &other)
-
-
-

Swaps content.

-
- -

Policy Access Methods

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
MethodDescription
-
-Size_Policy &
-  get_size_policy
-  ()
-
-
-

Access to the Size_Policy object - used.

-
-
-const Size_Policy &
-  get_size_policy
-  () const
-
-
-

Const access to the Size_Policy object - used.

-
-
-Trigger_Policy &
-  get_trigger_policy
-  ()
-
-
-

Access to the Trigger_Policy - object used.

-
-
-const Trigger_Policy &
-  get_trigger_policy
-  () const
-
-
-

Access to the Trigger_Policy - object used.

-
- -

Size Access Methods

- -

These methods are available only if the external size - parameter indicates that external size access is allowed.

- - - - - - - - - - - - - - - - - - - -
MethodDescription
-
-inline size_type 
-  get_actual_size
-  () const
-
-
-

Returns the actual size of the container.

- -

This method returns the number of entries (used and - unused) in the container. It is different from the - container's size method, which returns the number of used - entries. Calling this method will not compile when - External_Size_Access - == false.

-
-
-void 
-  resize
-  (size_type suggested_new_size)
-
-
-

Resizes the container to suggested_new_size, a suggested size - (the actual size will be determined by the Size_Policy - object).

- -

Calling this method will not compile when External_Size_Access - == false.

-
- -

Protected Methods

- -

Insert Search - Notifications.

- -

Notifications called during an insert operation.

- - - - - - - - - - - - - - - - - - - - - - - - - -
MethodDescription
-
-inline void
-  notify_insert_search_start
-  ()
-
-
-

Notifies a search started.

-
-
-inline void
-  notify_insert_search_collision
-  ()
-
-
-

Notifies a search encountered a collision.

-
-
-inline void
-  notify_insert_search_end
-  ()
-
-
-

Notifies a search ended.

-
- -

Find Search - Notifications.

- -

Notifications called during a find operation.

- - - - - - - - - - - - - - - - - - - - - - - - - -
MethodDescription
-
-inline void
-  notify_find_search_start
-  ()
-
-
-

Notifies a search started.

-
-
-inline void
-  notify_find_search_collision
-  ()
-
-
-

Notifies a search encountered a collision.

-
-
-inline void
-  notify_find_search_end
-  ()
-
-
-

Notifies a search ended.

-
- -

Erase Search - Notifications.

- -

Notifications called during an insert operation.

- - - - - - - - - - - - - - - - - - - - - - - - - -
MethodDescription
-
-inline void
-  notify_erase_search_start
-  ()
-
-
-

Notifies a search started.

-
-
-inline void
-  notify_erase_search_collision
-  ()
-
-
-

Notifies a search encountered a collision.

-
-
-inline void
-  notify_erase_search_end
-  ()
-
-
-

Notifies a search ended.

-
- -

Content Change - Notifications

- -

Notifications called when the content of the table changes - in a way that can affect the resize policy.

- - - - - - - - - - - - - - - - - - - - - - - - - -
MethodDescription
-
-inline void
-  notify_inserted
-  (size_type num_e)
-
-
-

Notifies an element was inserted.

-
-
-inline void
-  notify_erased
-  (size_type num_e)
-
-
-

Notifies an element was erased.

-
-
-void 
-  notify_cleared
-  ()
-
-
-

Notifies the table was cleared.

-
- -

Size Change - Notifications

- -

Notifications called when the table changes size.

- - - - - - - - - - - - - -
MethodDescription
-
-void
-  notify_resized
-  (size_type new_size)
-
-
-

Notifies the table was resized to new_size.

-
- -

Queries

- -

Called to query whether/how to resize.

- - - - - - - - - - - - - - - - - - - -
MethodDescription
-
-inline bool
-  is_resize_needed
-  () const
-
-
-

Queries whether a resize is needed.

-
-
-size_type
-  get_new_size
-  (size_type size, 
-    size_type num_used_e) const
-
-
-

Queries what the new size should be, when the container - is resized naturally. The current size of the container - is size, and the number - of used entries within the container is num_used_e.

-
- -

Private Methods

- -

Overrides

- - - - - - - - - - - - - -
MethodDescription
-
-virtual void
-  do_resize
-  (size_type new_size)
-
-
-

Resizes to new_size.

-
-
- - diff --git a/libstdc++-v3/docs/html/ext/pb_ds/hash_text_find_find_timing_test.html b/libstdc++-v3/docs/html/ext/pb_ds/hash_text_find_find_timing_test.html deleted file mode 100644 index fafa245a93f..00000000000 --- a/libstdc++-v3/docs/html/ext/pb_ds/hash_text_find_find_timing_test.html +++ /dev/null @@ -1,164 +0,0 @@ - - - - - -Hash Text Find Timing Test - - - -
-

Hash-Based Text find Find Timing Test

-

Description

-

This test inserts a number of values with keys from an - arbitrary text ([ wickland96thirty ]) into - a container, then performs a series of finds using - find . It measures the average time for find - as a function of the number of values inserted.

-

(The test was executed with text_find_timing_test - thirty_years_among_the_dead_preproc.txt 200 200 2100)

-

Purpose

-

The test checks the effect of different range-hashing - functions, trigger policies, and cache-hashing policies (see - Design::Associative - Containers::Associative Containers::Hash-Based Containers::Hash - Policies and Design::Associative - Containers::Hash-Based Containers::Resize Policies ).

-

Results

-

Figures NCCG, NCCM - and NCCL show the results for the native - and collision-chaining types in g++, msvc++, and - local, - respetively.

-
-
-
-
-
no image
NCCG: Native and collision-chaining hash text find timing test using find - g++

In the above figure, the names in the legends have the following meaning:

-
    -
  1. -n_hash_map_ncah- -std::tr1::unordered_map with cache_hash_code = false
  2. -
  3. -cc_hash_mod_prime_nea_lc_1div8_1div1_nsth_map- -cc_hash_table -with Comb_Hash_Fn = direct_mod_range_hashing -, and Resize_Policy = hash_standard_resize_policy - with Size_Policy = hash_prime_size_policy -, and Trigger_Policy = hash_load_check_resize_trigger - with αmin = 1/8 and αmax = 1/1
  4. -
  5. -cc_hash_mask_exp_nea_lc_1div8_1div2_sth_map- -cc_hash_table -with Comb_Hash_Fn = direct_mask_range_hashing -, and Resize_Policy = hash_standard_resize_policy - with Size_Policy = hash_exponential_size_policy -, and Trigger_Policy = hash_load_check_resize_trigger - with αmin = 1/8 and αmax = 1/2
  6. -
  7. -cc_hash_mask_exp_nea_lc_1div8_1div1_nsth_map- -cc_hash_table -with Comb_Hash_Fn = direct_mask_range_hashing -, and Resize_Policy = hash_standard_resize_policy - with Size_Policy = hash_exponential_size_policy -, and Trigger_Policy = hash_load_check_resize_trigger - with αmin = 1/8 and αmax = 1/1
  8. -
  9. -cc_hash_mask_exp_nea_lc_1div8_1div2_nsth_map- -cc_hash_table -with Comb_Hash_Fn = direct_mask_range_hashing -, and Resize_Policy = hash_standard_resize_policy - with Size_Policy = hash_exponential_size_policy -, and Trigger_Policy = hash_load_check_resize_trigger - with αmin = 1/8 and αmax = 1/2
  10. -
-
-
-
-
-
-
-
-
-
-
no image
NCCM: Native and collision-chaining hash text find timing test using find - msvc++

In the above figure, the names in the legends have the following meaning:

-
    -
  1. -n_hash_map_ncah- -stdext::hash_map
  2. -
  3. -cc_hash_mod_prime_nea_lc_1div8_1div1_nsth_map- -cc_hash_table -with Comb_Hash_Fn = direct_mod_range_hashing -, and Resize_Policy = hash_standard_resize_policy - with Size_Policy = hash_prime_size_policy -, and Trigger_Policy = hash_load_check_resize_trigger - with αmin = 1/8 and αmax = 1/1
  4. -
  5. -cc_hash_mask_exp_nea_lc_1div8_1div1_nsth_map- -cc_hash_table -with Comb_Hash_Fn = direct_mask_range_hashing -, and Resize_Policy = hash_standard_resize_policy - with Size_Policy = hash_exponential_size_policy -, and Trigger_Policy = hash_load_check_resize_trigger - with αmin = 1/8 and αmax = 1/1
  6. -
  7. -cc_hash_mask_exp_nea_lc_1div8_1div2_nsth_map- -cc_hash_table -with Comb_Hash_Fn = direct_mask_range_hashing -, and Resize_Policy = hash_standard_resize_policy - with Size_Policy = hash_exponential_size_policy -, and Trigger_Policy = hash_load_check_resize_trigger - with αmin = 1/8 and αmax = 1/2
  8. -
  9. -cc_hash_mask_exp_nea_lc_1div8_1div2_sth_map- -cc_hash_table -with Comb_Hash_Fn = direct_mask_range_hashing -, and Resize_Policy = hash_standard_resize_policy - with Size_Policy = hash_exponential_size_policy -, and Trigger_Policy = hash_load_check_resize_trigger - with αmin = 1/8 and αmax = 1/2
  10. -
-
-
-
-
-
-
-
-
-
-
no image
NCCL: Native and collision-chaining hash text find timing test using find - local
-
-
-
-
-

Observations

-

In this setting, the range-hashing scheme (See Design::Associative - Containers::Hash-Based Containers::Hash Policies ) affects - performance more than other policies. As Figure NCCG shows, containers using mod-based - range-hashing (including the native hash-based container, which - is currently hard-wired to this scheme) have lower performance - than those using mask-based range-hashing. A modulo-based - range-hashing scheme's main benefit is that it takes into - account all hash-value bits. Standard string hash-functions are - designed to create hash values that are nearly-uniform as is [ - knuth98sorting - ].

-

Trigger policies (see Design::Associative - Containers::Hash-Based Containers::Resize Policies ), - i.e. the load-checks constants, affect performance to a - lesser extent.

-

Perhaps surprisingly, storing the hash value alongside each - entry affects performance only marginally, at least in - pb_ds 's implementation. (Unfortunately, it was not - possible to run the tests with std::tr1::unordered_map - 's cache_hash_code = true , as it appeared to - malfuntion.)

-

Observations::Hash-Based - Containers' Policies summarizes some observations on - hash-based containers' policies.

-
- - diff --git a/libstdc++-v3/docs/html/ext/pb_ds/hash_zlob_random_int_find_find_timing_test.html b/libstdc++-v3/docs/html/ext/pb_ds/hash_zlob_random_int_find_find_timing_test.html deleted file mode 100644 index f7156b1b7a6..00000000000 --- a/libstdc++-v3/docs/html/ext/pb_ds/hash_zlob_random_int_find_find_timing_test.html +++ /dev/null @@ -1,163 +0,0 @@ - - - - - -Hash Skewed Distribution Memory Use Test - - - -
-

Hash-Based Skewed-Distribution Random-Integer find - Find Timing Test

-

Description

-

This test inserts a number of values with a markedly - non-uniform i.i.d. integer keys into a container, then performs - a series of finds using find . It measures the average - time for find as a function of the number of values in - the containers. The keys are generated as follows. First, a - uniform integer is created; it is then shifted left 8 bits.

-

(The test was executed with hash_zlob_random_int_find_timing_test - 200 200 2100)

-

Purpose

-

The test checks the effect of different range-hashing - functions and trigger policies (see Design::Associative - Containers::Hash-Based Containers::Hash Policies and - Design::Associative - Containers::Hash-Based Containers::Resize Policies).

-

Results

-

Figures NHG, NHM, and - NHL show the results for various hash-based - associative-containers in g++, MSVC++, and - local, - respectively.

-
-
-
-
-
no image
NHG: Skewed-distribution random int find timing test using find - g++

In the above figure, the names in the legends have the following meaning:

-
    -
  1. -cc_hash_mask_exp_nea_lc_1div8_1div1_nsth_map- -cc_hash_table -with Comb_Hash_Fn = direct_mask_range_hashing -, and Resize_Policy = hash_standard_resize_policy - with Size_Policy = hash_exponential_size_policy -, and Trigger_Policy = hash_load_check_resize_trigger - with αmin = 1/8 and αmax = 1/1
  2. -
  3. -gp_hash_mod_quadp_prime_nea_lc_1div8_1div2_nsth_map- -gp_hash_table - with Comb_Hash_Fn = direct_mod_range_hashing -, Resize_Policy = hash_standard_resize_policy - with Size_Policy = hash_prime_size_policy -, and Trigger_Policy = hash_load_check_resize_trigger - with αmin = 1/8 and αmax = 1/2, and Probe_Fn = quadratic_probe_fn -
  4. -
  5. -n_hash_map_ncah- -std::tr1::unordered_map with cache_hash_code = false
  6. -
  7. -cc_hash_mod_prime_nea_lc_1div8_1div1_nsth_map- -cc_hash_table -with Comb_Hash_Fn = direct_mod_range_hashing -, and Resize_Policy = hash_standard_resize_policy - with Size_Policy = hash_prime_size_policy -, and Trigger_Policy = hash_load_check_resize_trigger - with αmin = 1/8 and αmax = 1/1
  8. -
-
-
-
-
-
-
-
-
-
-
no image
NHM: Skewed-distribution random int find timing test using find - msvc++

In the above figure, the names in the legends have the following meaning:

-
    -
  1. -n_hash_map_ncah- -stdext::hash_map
  2. -
  3. -cc_hash_mask_exp_nea_lc_1div8_1div1_nsth_map- -cc_hash_table -with Comb_Hash_Fn = direct_mask_range_hashing -, and Resize_Policy = hash_standard_resize_policy - with Size_Policy = hash_exponential_size_policy -, and Trigger_Policy = hash_load_check_resize_trigger - with αmin = 1/8 and αmax = 1/1
  4. -
  5. -gp_hash_mod_quadp_prime_nea_lc_1div8_1div2_nsth_map- -gp_hash_table - with Comb_Hash_Fn = direct_mod_range_hashing -, Resize_Policy = hash_standard_resize_policy - with Size_Policy = hash_prime_size_policy -, and Trigger_Policy = hash_load_check_resize_trigger - with αmin = 1/8 and αmax = 1/2, and Probe_Fn = quadratic_probe_fn -
  6. -
  7. -cc_hash_mod_prime_nea_lc_1div8_1div1_nsth_map- -cc_hash_table -with Comb_Hash_Fn = direct_mod_range_hashing -, and Resize_Policy = hash_standard_resize_policy - with Size_Policy = hash_prime_size_policy -, and Trigger_Policy = hash_load_check_resize_trigger - with αmin = 1/8 and αmax = 1/1
  8. -
-
-
-
-
-
-
-
-
-
-
no image
NHL: Skewed-distribution random int find timing test using find - local
-
-
-
-
-

Observations

-

In this setting, the keys' distribution is so skewed that - the unerlying hash-table type affects performance marginally. - (This is in contrast with Hash-Based Text - find Find Timing Test , Hash-Based - Random-Integer find Find Timing Test , Hash-Based - Random-Integer Subscript Find Timing Test and Hash-Based - Random-Integer Subscript Insert Timing Test .)

-

The range-hashing scheme affects performance dramatically. A - mask-based range-hashing scheme effectively maps all values - into the same bucket. Access degenerates into a search within - an unordered linked-list. In Figures NHG and - NHM , it should be noted that - std::tr1::unordered_map and stdext::hash_map - are hard-wired currently to mod-based and mask-based schemes, - respectively.

-

When observing the settings of this test, it is apparent - that the keys' distribution is far from natural. One might ask - if the test is not contrived to show that, in some cases, - mod-based range hashing does better than mask-based range - hashing. This is, in fact just the case. We did not encounter a - more natural case in which mod-based range hashing is better. - In our opnion, real-life key distributions are handled better - with an appropriate hash function and a mask-based - range-hashing function. (shift_mask.cc - shows an example of handling this a-priori known skewed - distribution with a mask-based range-hashing function). If hash - performance is bad, a Χ2 test can be used - to check how to transform it into a more uniform - distribution.

-

For this reason, pb_ds's default range-hashing - function is mask-based.

-

Observations::Hash-Based - Container Types summarizes some observations on hash-based - containers; Observations::Hash-Based - Containers' Policies summarizes some observations on - hash-based containers' policies.

-
- - diff --git a/libstdc++-v3/docs/html/ext/pb_ds/hash_zlob_random_int_find_timing_test_gcc.png b/libstdc++-v3/docs/html/ext/pb_ds/hash_zlob_random_int_find_timing_test_gcc.png deleted file mode 100644 index 8d170db1a2a..00000000000 Binary files a/libstdc++-v3/docs/html/ext/pb_ds/hash_zlob_random_int_find_timing_test_gcc.png and /dev/null differ diff --git a/libstdc++-v3/docs/html/ext/pb_ds/hash_zlob_random_int_find_timing_test_local.png b/libstdc++-v3/docs/html/ext/pb_ds/hash_zlob_random_int_find_timing_test_local.png deleted file mode 100644 index 0be2f00fa63..00000000000 Binary files a/libstdc++-v3/docs/html/ext/pb_ds/hash_zlob_random_int_find_timing_test_local.png and /dev/null differ diff --git a/libstdc++-v3/docs/html/ext/pb_ds/hash_zlob_random_int_find_timing_test_msvc.png b/libstdc++-v3/docs/html/ext/pb_ds/hash_zlob_random_int_find_timing_test_msvc.png deleted file mode 100644 index 874e7a780e6..00000000000 Binary files a/libstdc++-v3/docs/html/ext/pb_ds/hash_zlob_random_int_find_timing_test_msvc.png and /dev/null differ diff --git a/libstdc++-v3/docs/html/ext/pb_ds/index.html b/libstdc++-v3/docs/html/ext/pb_ds/index.html deleted file mode 100644 index 4c73c2e915a..00000000000 --- a/libstdc++-v3/docs/html/ext/pb_ds/index.html +++ /dev/null @@ -1,146 +0,0 @@ - - - - - - - Policy-Based Data Structures - - - - -
-

Policy-Based Data Structures

- -
Ami Tavory and Vladimir Dreizin, IBM Haifa Research - Laboratories, and Benjamin Kosnik, Red Hat
- -
pbassoc@gmail.com
- -

This is a library of policy-based elementary - data structures: associative containers and priority queues. It - is designed for high-performance, flexibility, semantic safety, - and conformance to the corresponding containers in std - and std::tr1 (except for some points where it differs by - design).

- -

The documentation is organized as follows:

- -
    -
  1. - Introductory - -
      -
    1. Introduction
    2. - -
    3. Motivation
    4. - -
    5. Usage - Prerequisites
    6. -
    -
  2. - -
  3. - Interface - -
      -
    1. Short Tutorial
    2. - -
    3. Concepts
    4. - -
    5. Specifics
    6. -
    -
  4. - -
  5. - Design - -
      -
    1. - Associative Containers - -
        -
      1. Data-Structure - Genericity and Interface
      2. - -
      3. Tree-Based - Containers
      4. - -
      5. Trie-Based - Containers
      6. - -
      7. Hash-Based - Containers
      8. - -
      9. List-Based - Containers
      10. -
      -
    2. - -
    3. Priority Queues
    4. -
    -
  6. - -
  7. - Examples - -
      -
    1. Associative - Containers
    2. - -
    3. Priority Queues
    4. -
    -
  8. - -
  9. - Tests - -
      -
    1. - Associative Containers - -
        -
      1. Regression - Tests
      2. - -
      3. Performance - Tests
      4. -
      -
    2. - -
    3. - Priority Queues - -
        -
      1. Regression - Tests
      2. - -
      3. Performance - Tests
      4. -
      -
    4. -
    -
  10. - -
  11. - Misc. - -
      -
    1. Acknowledgments
    2. - -
    3. Contact
    4. - -
    5. Disclaimer and - Copyright
    6. - -
    7. References
    8. -
    -
  12. -
-
- - diff --git a/libstdc++-v3/docs/html/ext/pb_ds/insert_error.html b/libstdc++-v3/docs/html/ext/pb_ds/insert_error.html deleted file mode 100644 index f67160fe582..00000000000 --- a/libstdc++-v3/docs/html/ext/pb_ds/insert_error.html +++ /dev/null @@ -1,53 +0,0 @@ - - - - - - -insert_error Interface - - - - -
-

insert_error Interface

- -

An entry cannot be inserted into a container object for logical -reasons (not, e.g., if memory is unavailable, in which case the -allocator's exception will be thrown).

- -

This exception may be thrown, e.g., when a probe sequence in - a probing hash table does not encounter any free positions, - even though free positions are available.

- -

Defined in: exception.hpp

- -

Base Classes

- - - - - - - - - - - - - -
ClassDerivation Type
-
-insert_error
-
-
-

public

-
-
- - diff --git a/libstdc++-v3/docs/html/ext/pb_ds/insert_resize_sequence_diagram1.png b/libstdc++-v3/docs/html/ext/pb_ds/insert_resize_sequence_diagram1.png deleted file mode 100644 index f64764ec931..00000000000 Binary files a/libstdc++-v3/docs/html/ext/pb_ds/insert_resize_sequence_diagram1.png and /dev/null differ diff --git a/libstdc++-v3/docs/html/ext/pb_ds/insert_resize_sequence_diagram2.png b/libstdc++-v3/docs/html/ext/pb_ds/insert_resize_sequence_diagram2.png deleted file mode 100644 index e4645973eeb..00000000000 Binary files a/libstdc++-v3/docs/html/ext/pb_ds/insert_resize_sequence_diagram2.png and /dev/null differ diff --git a/libstdc++-v3/docs/html/ext/pb_ds/insert_resize_sequence_diagram3.png b/libstdc++-v3/docs/html/ext/pb_ds/insert_resize_sequence_diagram3.png deleted file mode 100644 index 5535c5fe603..00000000000 Binary files a/libstdc++-v3/docs/html/ext/pb_ds/insert_resize_sequence_diagram3.png and /dev/null differ diff --git a/libstdc++-v3/docs/html/ext/pb_ds/interface.html b/libstdc++-v3/docs/html/ext/pb_ds/interface.html deleted file mode 100644 index a48a8bbadde..00000000000 --- a/libstdc++-v3/docs/html/ext/pb_ds/interface.html +++ /dev/null @@ -1,446 +0,0 @@ - - - - - - -Interface - - - - -
-

Interface Specifics

- -

Following are the library's interface specifics. Short Tutorial is a short tutorial, and - Concepts describes some - concepts.

-
- -

Namespace

- -

All code is enclosed in namespace pb_ds. Nested within - this is namespace detail, which contains the parts of this - library that are considered implementation details.

-
- -

Containers

- -

Associative Containers

- -
    -
  1. container_base - - abstract base class for associative containers.
  2. - -
  3. Hash-based: - -
      -
    1. basic_hash_table - - abstract base class for hash-based - containers
    2. - -
    3. cc_hash_table - - concrete collision-chaining hash-based - containers
    4. - -
    5. gp_hash_table - - concrete (general) probing hash-based - containers
    6. -
    -
  4. - -
  5. Tree-based: - -
      -
    1. basic_tree - - abstract base class for tree and trie based - containers
    2. - -
    3. tree - - concrete base class for tree-based - containers
    4. - -
    5. trie - - concrete base class for trie-based - containers
    6. -
    -
  6. - -
  7. List-based: - -
      -
    1. list_update - - singly-linked list with update-policy container
    2. -
    -
  8. -
- -

Priority - Queues

- -
    -
  1. priority_queue - - priority queue
  2. -
-
- -

Container Tags and - Traits

- -

Container Tags

- -

Common

- -
    -
  1. container_tag - - base class for data structure tags
  2. -
- -

Associative-Containers

- -
    -
  1. associative_container_tag - - base class for associative-container data structure tags
  2. - -
  3. basic_hash_tag - - base class for hash-based structure tags
  4. - -
  5. cc_hash_tag - - collision-chaining hash structure tag
  6. - -
  7. gp_hash_tag - - (general) probing hash structure tag
  8. - -
  9. basic_tree_tag - - base class for tree-like structure tags
  10. - -
  11. tree_tag - - base class for tree structure tags
  12. - -
  13. rb_tree_tag - - red-black tree structure tag/li>
  14. - -
  15. splay_tree_tag - - splay tree structure tag
  16. - -
  17. ov_tree_tag - - ordered-vector tree structure tag
  18. - -
  19. trie_tag - - trie structure tag
  20. - -
  21. pat_trie_tag - - PATRICIA trie structure tag
  22. - -
  23. list_update_tag - list - (with updates) structure tag
  24. -
- -

Priority-Queues

- -
    -
  1. priority_queue_tag - base - class for priority-queue data structure tags
  2. - -
  3. pairing_heap_tag - - pairing-heap structure tag.
  4. - -
  5. binomial_heap_tag - - binomial-heap structure tag
  6. - -
  7. rc_binomial_heap_tag - - redundant-counter binomial-heap (i.e., a heap where - binomial trees form a sequence that is similar to a - de-amortized bit-addition algorithm) structure tag
  8. - -
  9. binary_heap_tag - - binary heap (based on an array or an array of nodes) - structure tag
  10. - -
  11. thin_heap_tag - thin - heap (an alternative [kt99fat_heaps] to - Fibonacci heap) data structure tag.
  12. -
- -

Invalidation-Guarantee - Tags

- -
    -
  1. basic_invalidation_guarantee - - weakest invalidation guarantee
  2. - -
  3. point_invalidation_guarantee - - stronger invalidation guarantee
  4. - -
  5. range_invalidation_guarantee - - strongest invalidation guarantee
  6. -
- -

Container - Traits

- -
    -
  1. container_traits - - traits for determining underlying data structure - properties
  2. -
-
- -

Container Policy Classes

- -

Hash Policies

- -

Hash and Probe Policies

- -
    -
  1. Hash Functions: - -
      -
    1. null_hash_fn - - type indicating one-step range-hashing
    2. -
    -
  2. - -
  3. Range-Hashing Functions: - -
      -
    1. Sample - range-hashing function - interface required of a - range-hashing functor
    2. - -
    3. direct_mask_range_hashing - - (bit) mask-based range hashing functor
    4. - -
    5. direct_mod_range_hashing - - modulo-based range hashing functor
    6. -
    -
  4. - -
  5. Probe Functions: - -
      -
    1. Sample probe - function - interface required of a probe functor
    2. - -
    3. null_probe_fn - type - indicating one-step ranged-probe
    4. - -
    5. linear_probe_fn - - linear-probe functor
    6. - -
    7. quadratic_probe_fn- - quadratic-probe functor
    8. -
    -
  6. - -
  7. Ranged-Hash Functions: - -
      -
    1. Sample - ranged-hash function - interface required of a - ranged-hash functor
    2. -
    -
  8. - -
  9. Ranged-Probe Functions: - -
      -
    1. Sample - ranged-probe function - interface required of a - ranged-probe functor
    2. -
    -
  10. -
- -

Resize Policies

-
    -
  1. Resize Policies: - -
      -
    1. Sample resize - policy - interface required of a resize policy
    2. - -
    3. hash_standard_resize_policy - - standard resize policy
    4. -
    -
  2. - -
  3. Size Policies: - -
      -
    1. Sample size - policy - interface required of a size policy
    2. - -
    3. hash_exponential_size_policy - - exponential size policy (typically used with (bit) mask - range-hashing)
    4. - -
    5. hash_prime_size_policy - - prime size policy (typically used with modulo - range-hashing)
    6. -
    -
  4. - -
  5. Trigger Policies: - -
      -
    1. Sample trigger - policy - interface required of a trigger policy
    2. - -
    3. hash_load_check_resize_trigger - - trigger policy based on load checks
    4. - -
    5. cc_hash_max_collision_check_resize_trigger - - trigger policy based on collision checks
    6. -
    -
  6. -
- -

Tree Policies

- -

Tree Node-Update Policies

- - -
    -
  1. Sample node -updater policy - interface required of a tree -node-updating functor
  2. - -
  3. null_tree_node_update -- null policy indicating no updates are required
  4. - -
  5. tree_order_statistics_node_update -- updater enabling order statistics queries
  6. -
- -

Trie Policies

- - -

Trie Element-Access Traits

- -
    -
  1. Sample - element-access traits - interface required of - element-access traits
  2. - -
  3. string_trie_e_access_traits - - String element-access traits
  4. -
- -

Trie Node-Update Policies

- - -
    -
  1. Sample node -updater policy - interface required of a trie node -updater
  2. - -
  3. null_trie_node_update -- null policy indicating no updates are required
  4. - -
  5. trie_prefix_search_node_update -- updater enabling prefix searches
  6. - -
  7. trie_order_statistics_node_update -- updater enabling order statistics queries
  8. -
- -

List Policies

- -

List Update Policies

- - -
    -
  1. Sample list update - policy - interface required of a list update policy
  2. - -
  3. move_to_front_lu_policy - - move-to-front update algorithm
  4. - -
  5. counter_lu_policy - - counter update algorithm
  6. -
- -

Mapped-Type Policies

- - -
    -
  1. null_mapped_type - data - policy indicating that a container is a "set"
  2. -
-
- -

Exceptions

- - -
    -
  1. container_error - - base class for all policy-based data structure errors
  2. - -
  3. insert_error
  4. - -
  5. join_error
  6. - -
  7. resize_error
  8. -
- -
- - diff --git a/libstdc++-v3/docs/html/ext/pb_ds/introduction.html b/libstdc++-v3/docs/html/ext/pb_ds/introduction.html deleted file mode 100644 index b3ccbd76aee..00000000000 --- a/libstdc++-v3/docs/html/ext/pb_ds/introduction.html +++ /dev/null @@ -1,120 +0,0 @@ - - - - - - - Introduction - - - - -
-

Introduction

- -

This section describes what problems the library attempts to - solve. Motivation describes the - reasons we think it solves these problems better than similar - libraries.

- -

Associative Containers

- -
    -
  1. Associative containers depend on their policies to a very - large extent. Implicitly hard-wiring policies can hamper their - performance and limit their functionality. An efficient - hash-based container, for example, requires policies for - testing key equivalence, hashing keys, translating hash - values into positions within the hash table, and determining - when and how to resize the table internally. A tree-based - container can efficiently support order statistics, - i.e., the ability to query what is the order of each - key within the sequence of keys in the container, but only if - the container is supplied with a policy to internally update - meta-data. There are many other such examples.

  2. - -
  3. Ideally, all associative containers would share the same - interface. Unfortunately, underlying data structures and - mapping semantics differentiate between different containers. - For example, suppose one writes a generic function - manipulating an associative container Cntnr: -
    -template<typename Cntnr>
    -  void
    -  some_op_sequence(Cntnr& r_cnt)
    -  {
    -    ...
    -  }
    -
    - -then what can one assume about Cntnr? The answer -varies according to its underlying data structure. If the -underlying data structure of Cntnr is based on a tree or -trie, then the order of elements is well defined; otherwise, it is -not, in general. If the underlying data structure of Cntnr -is based on a collision-chaining hash table, then modifying -r_Cntnr will not invalidate its iterators' order; if the -underlying data structure is a probing hash table, then this is not -the case. If the underlying data structure is based on a tree or -trie, then r_cnt can efficiently be split; otherwise, it -cannot, in general. If the underlying data structure is a red-black -tree, then splitting r_cnt is exception-free; if it is an -ordered-vector tree, exceptions can be thrown. -

  4. -
- -

Priority Queues

- -

Priority queues are useful when one needs to efficiently - access a minimum (or maximum) value as the set of values - changes.

- -
    -
  1. Most useful data structures for priority queues have a - relatively simple structure, as they are geared toward - relatively simple requirements. Unfortunately, these structures - do not support access to an arbitrary value, which turns out to - be necessary in many algorithms. Say, decreasing an arbitrary - value in a graph algorithm. Therefore, some extra mechanism is - necessary and must be invented for accessing arbitrary - values. There are at least two alternatives: embedding an - associative container in a priority queue, or allowing - cross-referencing through iterators. The first solution adds - significant overhead; the second solution requires a precise - definition of iterator invalidation. Which is the next - point...

  2. - -
  3. Priority queues, like hash-based containers, store values in - an order that is meaningless and undefined externally. For - example, a push operation can internally reorganize the - values. Because of this characteristic, describing a priority - queues' iterator is difficult: on one hand, the values to which - iterators point can remain valid, but on the other, the logical - order of iterators can change unpredictably.

  4. - -
  5. Roughly speaking, any element that is both inserted to a - priority queue (e.g., through push) and removed - from it (e.g., through pop), incurs a - logarithmic overhead (in the amortized sense). Different - underlying data structures place the actual cost differently: - some are optimized for amortized complexity, whereas others - guarantee that specific operations only have a constant - cost. One underlying data structure might be chosen if modifying - a value is frequent (Dijkstra's shortest-path algorithm), - whereas a different one might be chosen - otherwise. Unfortunately, an array-based binary heap - an - underlying data structure that optimizes (in the amortized - sense) push and pop operations, differs from - the others in terms of its invalidation guarantees. Other design - decisions also impact the cost and placement of the overhead, at - the expense of more difference in the the kinds of operations - that the underlying data structure can support. These - differences pose a challenge when creating a uniform interface - for priority queues.

  6. -
-
- - diff --git a/libstdc++-v3/docs/html/ext/pb_ds/invalidation_guarantee_cd.png b/libstdc++-v3/docs/html/ext/pb_ds/invalidation_guarantee_cd.png deleted file mode 100644 index 1f9d1243c6a..00000000000 Binary files a/libstdc++-v3/docs/html/ext/pb_ds/invalidation_guarantee_cd.png and /dev/null differ diff --git a/libstdc++-v3/docs/html/ext/pb_ds/invalidation_guarantee_erase.png b/libstdc++-v3/docs/html/ext/pb_ds/invalidation_guarantee_erase.png deleted file mode 100644 index 940a27f7142..00000000000 Binary files a/libstdc++-v3/docs/html/ext/pb_ds/invalidation_guarantee_erase.png and /dev/null differ diff --git a/libstdc++-v3/docs/html/ext/pb_ds/join_error.html b/libstdc++-v3/docs/html/ext/pb_ds/join_error.html deleted file mode 100644 index 3441e1fb20b..00000000000 --- a/libstdc++-v3/docs/html/ext/pb_ds/join_error.html +++ /dev/null @@ -1,48 +0,0 @@ - - - - - - -join_error Interface - - - - -
-

join_error Interface

- -

A join cannot be performed logical reasons (i.e., the ranges of the - two container objects - being joined - overlaps.

- -

Defined in: exception.hpp

- -

Base Classes

- - - - - - - - - - - - - -
ClassDerivation Type
-
join_error
-
-
-

public

-
-
- - diff --git a/libstdc++-v3/docs/html/ext/pb_ds/linear_probe_fn.html b/libstdc++-v3/docs/html/ext/pb_ds/linear_probe_fn.html deleted file mode 100644 index 2141c2657ce..00000000000 --- a/libstdc++-v3/docs/html/ext/pb_ds/linear_probe_fn.html +++ /dev/null @@ -1,140 +0,0 @@ - - - - - - - linear_probe_fn Interface - - - - -
-

linear_probe_fn Interface

- -

A probe sequence policy using fixed increments.

- -

Defined in: hash_policy.hpp

- -

Template Parameters

- - - - - - - - - - - - - - - - - -
ParameterDescriptionDefault Value
-
-typename Size_Type 
-
-
-

Size type.

-
size_t
- -

Public Types and - Constants

- -

General Definitions

- - - - - - - - - - - - - - - - - -
TypeDefinitionDescription
-
-size_type
-
-
-
-Size_Type
-
-
-

Size type.

-
- -

Public Methods

- -

Constructors, Destructor, and - Related

- - - - - - - - - - - - - -
MethodDescription
-
-void
-  swap
-  (linear_probe_fn &other)
-
-
-

Swaps content.

-
- -

Protected Methods

- -

Offset Methods

- - - - - - - - - - - - - -
MethodDescription
-
-inline size_type
-  operator()
-  (size_type i) const
-
-
-

Returns the i-th - offset from the hash value.

-
-
- - diff --git a/libstdc++-v3/docs/html/ext/pb_ds/list_update.html b/libstdc++-v3/docs/html/ext/pb_ds/list_update.html deleted file mode 100644 index 93785acfd9c..00000000000 --- a/libstdc++-v3/docs/html/ext/pb_ds/list_update.html +++ /dev/null @@ -1,316 +0,0 @@ - - - - - - - list_update Interface - - - - -
-

list_update Interface

- -

A list-update based associative container.

- -

Defined in: assoc_container.hpp

- -

Template Parameters

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ParameterDescriptionDefault Value
-
-typename Key
-
-
-

Key type.

-
-
-
-typename Mapped
-
-
-

Mapped type.

-
-
-
-class Eq_Fn 
-
-
-

Equivalence functor.

-
-
-std::equal_to<Key>
-
-
-
-class Update_Policy 
-
-
-

Update policy (determines when an element will be - moved to the front of the list.

-
move_to_front_lu_policy
-
-class Allocator 
-
-
-

Allocator type.

-
-
-std::allocator<char>
-
-
- -

Base Classes

- - - - - - - - - - - - - -
ClassDerivation Type
-
-container_base
-
-
-

public

-
- -

Public Types and - Constants

- -

Policy definitions.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
TypeDefinitionDescription
-
-eq_fn
-
-
-
-Eq_Fn
-
-
-

Equivalence functor type.

-
-
-update_policy
-
-
-
-Update_Policy
-
-
-

List update policy type.

-
-
-allocator
-
-
-
-Allocator
-
-
-

Allocator - type.

-
- -

Public Methods

- -

Constructors, Destructor, and - Related

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
MethodDescription
-
-  list_update
-  ()
-
-
-

Default constructor.

-
-
-template<
-    class It>
-  list_update
-  (It first_it, 
-    It last_it)
-
-
-

Constructor taking iterators to a range of - value_types. The value_types between first_it and last_it will be inserted into the - container object.

-
-
-  list_update
-  (const list_update &other)
-
-
-

Copy constructor.

-
-
-virtual 
-  ~list_update
-  ()
-
-
-

Destructor.

-
-
-list_update &
-  operator=
-  (const list_update &other)
-
-
-

Assignment operator.

-
-
-void
-  swap
-  (list_update &other)
-
-
-

Swaps content.

-
-
- - diff --git a/libstdc++-v3/docs/html/ext/pb_ds/list_update_tag.html b/libstdc++-v3/docs/html/ext/pb_ds/list_update_tag.html deleted file mode 100644 index a35dc8cdab8..00000000000 --- a/libstdc++-v3/docs/html/ext/pb_ds/list_update_tag.html +++ /dev/null @@ -1,47 +0,0 @@ - - - - - - - list_update_tag Interface - - - - -
-

list_update_tag Interface

- -

List-update data structure tag.

- -

Defined in: tag_and_trait.hpp

- -

Base Classes

- - - - - - - - - - - - - -
ClassDerivation Type
-
-associative_container_tag
-
-
-

public

-
-
- - diff --git a/libstdc++-v3/docs/html/ext/pb_ds/lu.png b/libstdc++-v3/docs/html/ext/pb_ds/lu.png deleted file mode 100644 index 7c96dcaf665..00000000000 Binary files a/libstdc++-v3/docs/html/ext/pb_ds/lu.png and /dev/null differ diff --git a/libstdc++-v3/docs/html/ext/pb_ds/lu_based_containers.html b/libstdc++-v3/docs/html/ext/pb_ds/lu_based_containers.html deleted file mode 100644 index c8693437d9e..00000000000 --- a/libstdc++-v3/docs/html/ext/pb_ds/lu_based_containers.html +++ /dev/null @@ -1,229 +0,0 @@ - - - - - - - List-Based Containers - - - - -
-

List-Update Design

- -

Overview

- -

The list-based container has the following declaration:

-
-template<
-    typename Key,
-    typename Mapped,
-    typename Eq_Fn = std::equal_to<Key>,
-    typename Update_Policy = move_to_front_lu_policy<>,
-    typename Allocator = std::allocator<char> >
-class list_update;
-
- -

The parameters have the following meaning:

- -
    -
  1. Key is the key type.
  2. - -
  3. Mapped is the mapped-policy, and is explained in - Tutorial::Associative - Containers::Associative Containers Others than Maps.
  4. - -
  5. Eq_Fn is a key equivalence functor.
  6. - -
  7. Update_Policy is a policy updating positions in - the list based on access patterns. It is described in the - following subsection.
  8. - -
  9. Allocator is an allocator - type.
  10. -
- -

A list-based associative container is a container that - stores elements in a linked-list. It does not order the - elements by any particular order related to the keys. - List-based containers are primarily useful for creating - "multimaps" (see Motivation::Associative - Containers::Avoiding Multiple Keys and Tutorial::Associative - Containers::Associative Containers Others than Maps). In - fact, list-based containers are designed in pb_ds - expressly for this purpose. This is explained further in - Use for "Multimaps".

- -

List-based containers might also be useful for some rare - cases, where a key is encapsulated to the extent that only - key-equivalence can be tested. Hash-based containers need to - know how to transform a key into a size type, and tree-based - containers need to know if some key is larger than another. - List-based associative containers, conversely, only need to - know if two keys are equivalent.

- -

Since a list-based associative container does not order - elements by keys, is it possible to order the list in some - useful manner? Remarkably, many on-line competitive [motwani95random] - algorithms exist for reordering lists to reflect access - prediction [andrew04mtf].

- -

List - Updates

- -

General Terms

- -

Figure A simple list shows a - simple list of integer keys. If we search for the integer 6, we - are paying an overhead: the link with key 6 is only the fifth - link; if it were the first link, it could be accessed - faster.

- -
no image
- -
A simple list.
- -

List-update algorithms reorder lists as elements are - accessed. They try to determine, by the access history, which - keys to move to the front of the list. Some of these algorithms - require adding some metadata alongside each entry.

- -

For example, Figure The counter algorithm - -A shows the counter algorithm. Each node contains both a key - and a count metadata (shown in bold). When an element is - accessed (e.g. 6) its count is incremented, as shown in - Figure The counter algorithm -B. If the count - reaches some predetermined value, say 10, as shown in Figure - The counter algorithm -C, the count is set to - 0 and the node is moved to the front of the list, as in Figure - The counter algorithm -D.

- -
-
- -
The counter algorithm.
- -

Implementation

- -

pb_ds allows instantiating lists with policies - implementing any algorithm moving nodes to the front of the - list (policies implementing algorithms interchanging nodes are - unsupported).

- -

Associative containers based on lists are parametrized by a - Update_Policy parameter. This parameter defines the - type of metadata each node contains, how to create the - metadata, and how to decide, using this metadata, whether to - move a node to the front of the list. A list-based associative - container object derives (publicly) from its update policy. - Figure A list and its update - policy shows the scheme, as well as some predefined - policies (which are explained below).

- -
-
- -
A list and its update policy.
- -

An instantiation of Update_Policy must define - internally update_metadata as the metadata it - requires. Internally, each node of the list contains, besides - the usual key and data, an instance of typename - Update_Policy::update_metadata.

- -

An instantiation of Update_Policy must define - internally two operators:

-
-update_metadata
-operator()();
-
-bool
-operator()(update_metadata &);
-
- -

The first is called by the container object, when creating a - new node, to create the node's metadata. The second is called - by the container object, when a node is accessed (e.g., - when a find operation's key is equivalent to the key of the - node), to determine whether to move the node to the front of - the list.

- -

The library contains two predefined implementations of - list-update policies [andrew04mtf]. The first is - counter_lu_policy, which - implements the counter algorithm described above. The second is - move_to_front_lu_policy, - which unconditionally move an accessed element to the front of - the list. The latter type is very useful in pb_ds, - since there is no need to associate metadata with each element - (this is explained further in Use for - "Multimaps").

- -

Use for "Multimaps"

- -

In pb_ds, there are no equivalents for the STL's - multimaps and multisets; instead one uses an associative - container mapping primary keys to secondary keys (see Motivation::Associative - Containers::Alternative to Multiple Equivalent Keys and - Tutorial::Associative - Containers::Associative Containers Others than Maps).

- -

List-based containers are especially useful as associative - containers for secondary keys. In fact, they are implemented - here expressly for this purpose.

- -

To begin with, these containers use very little per-entry - structure memory overhead, since they can be implemented as - singly-linked lists. (Arrays use even lower per-entry memory - overhead, but they are less flexible in moving around entries, - and have weaker invalidation guarantees).

- -

More importantly, though, list-based containers use very - little per-container memory overhead. The memory overhead of an - empty list-based container is practically that of a pointer. - This is important for when they are used as secondary - associative-containers in situations where the average ratio of - secondary keys to primary keys is low (or even 1).

- -

In order to reduce the per-container memory overhead as much - as possible, they are implemented as closely as possible to - singly-linked lists.

- -
    -
  1. List-based containers do not store internally the number - of values that they hold. This means that their size - method has linear complexity (just like std::list). - Note that finding the number of equivalent-key values in an - STL multimap also has linear complexity (because it must be - done, e.g., via std::distance of the - multimap's equal_range method), but usually with - higher constants.
  2. - -
  3. Most associative-container objects each hold a policy - object (e.g., a hash-based container object holds a - hash functor). List-based containers, conversely, only have - class-wide policy objects.
  4. -
- -

See also Associative-Container - Performance Tests::Observations::Mapping-Semantics - Considerations.

-
- - diff --git a/libstdc++-v3/docs/html/ext/pb_ds/misc.html b/libstdc++-v3/docs/html/ext/pb_ds/misc.html deleted file mode 100644 index 01029e13454..00000000000 --- a/libstdc++-v3/docs/html/ext/pb_ds/misc.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - Misc. - - - - -
-

Misc.

- -

Acks - contains acknowledgments; Contact - contains contact information;Disclaimer and Copyright is a standard - disclaimer, and References - contains references.

-
- - diff --git a/libstdc++-v3/docs/html/ext/pb_ds/motivation.html b/libstdc++-v3/docs/html/ext/pb_ds/motivation.html deleted file mode 100644 index 420fc645103..00000000000 --- a/libstdc++-v3/docs/html/ext/pb_ds/motivation.html +++ /dev/null @@ -1,993 +0,0 @@ - - - - - - - Motivation - - - - -
-

Motivation

- -

Many fine associative-container libraries were already - written, most notably, the STL's associative containers. Why - then write another library? This section shows some possible - advantages of this library, when considering the challenges in - Introduction. Many of these - points stem from the fact that the STL introduced - associative-containers in a two-step process (first - standardizing tree-based containers, only then adding - hash-based containers, which are fundamentally different), did - not standardize priority queues as containers, and (in our - opinion) overloads the iterator concept.

- -

Associative Containers

- -

More - Configuration Choices

- -

Associative containers require a relatively large number of - policies to function efficiently in various settings. In some - cases this is needed for making their common operations more - efficient, and in other cases this allows them to support a - larger set of operations

- -
    -
  1. Hash-based containers, for example, support look-up and - insertion methods (e.g., find and - insert). In order to locate elements quickly, they - are supplied a hash functor, which instruct how to transform - a key object into some size type; e.g., a hash functor - might transform "hello" into 1123002298. A - hash table, though, requires transforming each key object - into some size-type type in some specific domain; - e.g., a hash table with a 128-long table might - transform "hello" into position 63. The policy by - which the hash value is transformed into a position within - the table can dramatically affect performance (see Design::Associative - Containers::Hash-Based Containers::Hash Policies). - Hash-based containers also do not resize naturally (as - opposed to tree-based containers, for example). The - appropriate resize policy is unfortunately intertwined with - the policy that transforms hash value into a position within - the table (see Design::Associative - Containers::Hash-Based Containers::Resize Policies). - -

    Associative-Container - Performance Tests::Hash-Based Containers quantifies - some of these points.

    -
  2. - -
  3. Tree-based containers, for example, also support look-up - and insertion methods, and are primarily useful when - maintaining order between elements is important. In some - cases, though, one can utilize their balancing algorithms for - completely different purposes. - -

    Figure Metadata for - order-statistics and interval intersections-A, for - example, shows a tree whose each node contains two entries: - a floating-point key, and some size-type metadata - (in bold beneath it) that is the number of nodes in the - sub-tree. (E.g., the root has key 0.99, and has 5 - nodes (including itself) in its sub-tree.) A container based - on this data structure can obviously answer efficiently - whether 0.3 is in the container object, but it can also - answer what is the order of 0.3 among all those in the - container object [clrs2001] (see Associative Container - Examples::Tree-Like-Based Containers (Trees and - Tries)).

    - -

    As another example, Figure Metadata for order-statistics and - interval intersections-B shows a tree whose each node - contains two entries: a half-open geometric line interval, - and a number metadata (in bold beneath it) that is - the largest endpoint of all intervals in its sub-tree. - (E.g., the root describes the interval [20, - 36), and the largest endpoint in its sub-tree is 99.) A - container based on this data structure can obviously answer - efficiently whether [3, 41) is in the container - object, but it can also answer efficiently whether the - container object has intervals that intersect [3, - 41) (see Associative Container - Examples::Tree-Like-Based Containers (Trees and - Tries)). These types of queries are very useful in - geometric algorithms and lease-management algorithms.

    - -

    It is important to note, however, that as the trees are - modified, their internal structure changes. To maintain - these invariants, one must supply some policy that is aware - of these changes (see Design::Associative - Containers::Tree-Based Containers::Node Invariants); - without this, it would be better to use a linked list (in - itself very efficient for these purposes).

    - -

    Associative-Container - Performance Tests::Tree-Like-Based Containers - quantifies some of these points.

    -
  4. -
- -
-
- -
Metadata for order-statistics and interval - intersections.
- -

More - Data Structures and Traits

- -

The STL contains associative containers based on red-black - trees and collision-chaining hash tables. These are obviously - very useful, but they are not ideal for all types of - settings.

- -

Figure Different underlying - data structures shows different underlying data structures - (the ones currently supported in pb_ds). A shows a - collision-chaining hash-table, B shows a probing hash-table, C - shows a red-black tree, D shows a splay tree, E shows a tree - based on an ordered vector(implicit in the order of the - elements), F shows a PATRICIA trie, and G shows a list-based - container with update policies.

- -

Each of these data structures has some performance benefits, - in terms of speed, size or both (see Associative-Container - Performance Tests and Associative-Container - Performance Tests::Observations::Underlying Data-Structure - Families). For now, though, note that e.g., - vector-based trees and probing hash tables manipulate memory - more efficiently than red-black trees and collision-chaining - hash tables, and that list-based associative containers are - very useful for constructing "multimaps" (see Alternative to Multiple Equivalent - Keys, Associative Container - Performance Tests::Multimaps, and Associative Container - Performance Tests::Observations::Mapping-Semantics - Considerations).

- -
no image
- -
Different underlying data structures.
- -

Now consider a function manipulating a generic associative - container, e.g.,

-
-template<
-    class Cntnr>
-int 
-    some_op_sequence
-    (Cntnr &r_cnt)
-{
-    ...
-}
-
- -

Ideally, the underlying data structure of Cntnr - would not affect what can be done with r_cnt. - Unfortunately, this is not the case.

- -

For example, if Cntnr is std::map, then - the function can use std::for_each(r_cnt.find(foo), - r_cnt.find(bar), foobar) in order to apply foobar - to all elements between foo and bar. If - Cntnr is a hash-based container, then this call's - results are undefined.

- -

Also, if Cntnr is tree-based, the type and object - of the comparison functor can be accessed. If Cntnr is - hash based, these queries are nonsensical.

- -

There are various other differences based on the container's - underlying data structure. For one, they can be constructed by, - and queried for, different policies. Furthermore:

- -
    -
  1. Containers based on C, D, E and F store elements in a - meaningful order; the others store elements in a meaningless - (and probably time-varying) order. By implication, only - containers based on C, D, E and F can support erase - operations taking an iterator and returning an iterator to - the following element without performance loss (see Slightly Different Methods::Methods - Related to Erase).
  2. - -
  3. Containers based on C, D, E, and F can be split and - joined efficiently, while the others cannot. Containers based - on C and D, furthermore, can guarantee that this is - exception-free; containers based on E cannot guarantee - this.
  4. - -
  5. Containers based on all but E can guarantee that erasing - an element is exception free; containers based on E cannot - guarantee this. Containers based on all but B and E can - guarantee that modifying an object of their type does not - invalidate iterators or references to their elements, while - containers based on B and E cannot. Containers based on C, D, - and E can furthermore make a stronger guarantee, namely that - modifying an object of their type does not affect the order - of iterators.
  6. -
- -

A unified tag and traits system (as used for the STL's - iterators, for example) can ease generic manipulation of - associative containers based on different underlying - data structures (see Tutorial::Associative - Containers::Determining Containers' Attributes and Design::Associative - Containers::Data-Structure Genericity::Data-Structure Tags and - Traits).

- -

Differentiating - between Iterator Types

- -

Iterators are centric to the STL's design, because of the - container/algorithm/iterator decomposition that allows an - algorithm to operate on a range through iterators of some - sequence (e.g., one originating from a container). - Iterators, then, are useful because they allow going over a - sequence. The STL also uses iterators for accessing a - specific element - e.g., when an associative - container returns one through find. The STL, however, - consistently uses the same types of iterators for both - purposes: going over a range, and accessing a specific found - element. Before the introduction of hash-based containers to - the STL, this made sense (with the exception of priority - queues, which are discussed in Priority - Queues).

- -

Using the STL's associative containers together with - non-order-preserving associative containers (and also because - of priority-queues container), there is a possible need for - different types of iterators for self-organizing containers - - the iterator concept seems overloaded to mean two different - things (in some cases). The following subsections explain this; - Tutorial::Associative - Containers::Point-Type and Range-Type Methods explains an - alternative design which does not complicate the use of - order-preserving containers, but is better for unordered - containers; Design::Associative - Containers::Data-Structure Genericity::Point-Type and - Range-Type Methods explains the design further.

- -

Using Point-Type Iterators for - Range-Type Operations

- -

Suppose cntnr is some associative container, and - say c is an object of type cntnr. Then what - will be the outcome of

-
-std::for_each(c.find(1), c.find(5), foo);
-
- -

If cntnr is a tree-based container object, then an - in-order walk will apply foo to the relevant elements, - e.g., as in Figure Range - iteration in different data structures -A. If c is - a hash-based container, then the order of elements between any - two elements is undefined (and probably time-varying); there is - no guarantee that the elements traversed will coincide with the - logical elements between 1 and 5, e.g., as in - Figure Range iteration in different - data structures-B.

- -
no image
- -
Range iteration in different - data structures.
- -

In our opinion, this problem is not caused just because - red-black trees are order preserving while collision-chaining - hash tables are (generally) not - it is more fundamental. Most - of the STL's containers order sequences in a well-defined - manner that is determined by their interface: calling - insert on a tree-based container modifies its sequence - in a predictable way, as does calling push_back on a - list or a vector. Conversely, collision-chaining hash tables, - probing hash tables, priority queues, and list-based containers - (which are very useful for "multimaps") are self-organizing - data structures; the effect of each operation modifies their - sequences in a manner that is (practically) determined by their - implementation.

- -

Consequently, applying an algorithm to a sequence obtained - from most containers may or may not make sense, but - applying it to a sub-sequence of a self-organizing container - does not.

- -

The Cost of Enabling Range - Capabilities to Point-Type Iterators

- -

Suppose c is some collision-chaining hash-based - container object, and one calls c.find(3). Then what - composes the returned iterator?

- -

Figure Point-type - iterators in hash tables-A shows the simplest (and most - efficient) implementation of a collision-chaining hash table. - The little box marked point_iterator shows an object - that contains a pointer to the element's node. Note that this - "iterator" has no way to move to the next element (i.e., - it cannot support operator++). Conversely, the - little box marked iterator stores both a pointer to - the element, as well as some other information (e.g., - the bucket number of the element). the second iterator, then, - is "heavier" than the first one- it requires more time and - space. If we were to use a different container to - cross-reference into this hash-table using these iterators - it - would take much more space. As noted in Using Point-Type Iterators for - Range-Type Operations, nothing much can be done by - incrementing these iterators, so why is this extra information - needed?

- -

Alternatively, one might create a collision-chaining - hash-table where the lists might be linked, forming a - monolithic total-element list, as in Figure Point-type iterators in hash - tables-B (this seems similar to the Dinkumware design - [dinkumware_stl]). - Here the iterators are as light as can be, but the hash-table's - operations are more complicated.

- -
no image
- -
Point-type iterators in hash tables.
- -

It should be noted that containers based on - collision-chaining hash-tables are not the only ones with this - type of behavior; many other self-organizing data structures - display it as well.

- -

Invalidation - Guarantees

- -

Consider the following snippet:

-
-it = c.find(3);
-
-c.erase(5);
-
- -

Following the call to erase, what is the validity - of it: can it be de-referenced? can it be - incremented?

- -

The answer depends on the underlying data structure of the - container. Figure Effect of erase in different - underlying data structures shows three cases: A1 and A2 - show a red-black tree; B1 and B2 show a probing hash-table; C1 - and C2 show a collision-chaining hash table.

- -
no image
- -
Effect of erase in different underlying - data structures.
- -
    -
  1. Erasing 5 from A1 yields A2. Clearly, an iterator to 3 - can be de-referenced and incremented. The sequence of - iterators changed, but in a way that is well-defined by the - interface.
  2. - -
  3. Erasing 5 from B1 yields B2. Clearly, an iterator to 3 is - not valid at all - it cannot be de-referenced or incremented; - the order of iterators changed in a way that is (practically) - determined by the implementation and not by the - interface.
  4. - -
  5. Erasing 5 from C1 yields C2. Here the situation is more - complicated. On the one hand, there is no problem in - de-referencing it. On the other hand, the order of - iterators changed in a way that is (practically) determined - by the implementation and not by the - interface.
  6. -
- -

So in classic STL, it is not always possible to express - whether it is valid or not. This is true also for - insert, e.g.. Again, the iterator concept seems - overloaded.

- -

Slightly - Different Methods

- -

[meyers02both] - points out that a class's methods should comprise only - operations which depend on the class's internal structure; - other operations are best designed as external functions. - Possibly, therefore, the STL's associative containers lack some - useful methods, and provide some other methods which would be - better left out (e.g., [sgi_stl] ).

- -

Methods - Related to Erase

- -
    -
  1. Order-preserving STL associative containers provide the - method -
    -iterator 
    -    erase
    -    (iterator it)
    -
    which takes an iterator, erases the corresponding element, -and returns an iterator to the following element. Also hash-based -STL associative containers provide this method. This seemingly -increases genericity between associative containers, since, - e.g., it is possible to use -
    -typename C::iterator it = c.begin();
    -typename C::iterator e_it = c.end();
    -
    -while(it != e_it)
    -    it = pred(*it)? c.erase(it) : ++it;
    -
    in order to erase from a container object - c all element which match a predicate pred. - However, in a different sense this actually - decreases genericity: an integral implication of - this method is that tree-based associative containers' - memory use is linear in the total number of elements they - store, while hash-based containers' memory use is unbounded - in the total number of elements they store. Assume a - hash-based container is allowed to decrease its size when - an element is erased. Then the elements might be rehashed, - which means that there is no "next" element - it is simply - undefined. Consequently, it is possible to infer from the - fact that STL hash-based containers provide this method - that they cannot downsize when elements are erased - (Performance - Tests::Hash-Based Container Tests quantifies this.) As - a consequence, different code is needed to manipulate - different containers, assuming that memory should be - conserved. pb_ds's non-order preserving - associative containers omit this method. -
  2. - -
  3. All of pb_ds's associative containers include a - conditional-erase method -
    -template<
    -    class Pred>
    -size_type
    -    erase_if
    -    (Pred pred)
    -
    which erases all elements matching a predicate. This is -probably the only way to ensure linear-time multiple-item erase -which can actually downsize a container. -
  4. - -
  5. STL associative containers provide methods for - multiple-item erase of the form -
    -size_type
    -    erase
    -    (It b, 
    -        It e)
    -
    erasing a range of elements given by a pair of iterators. For -tree-based or trie-based containers, this can implemented more -efficiently as a (small) sequence of split and join operations. For -other, unordered, containers, this method isn't much better than an -external loop. Moreover, if c is a hash-based container, -then, e.g., c.erase(c.find(2), c.find(5)) is almost -certain to do something different than erasing all elements whose -keys are between 2 and 5, and is likely to produce other undefined -behavior. -
  6. -
- -

Methods Related to Split and - Join

- -

It is well-known that tree-based and trie-based container - objects can be efficiently split or joined [clrs2001]. Externally splitting - or joining trees is super-linear, and, furthermore, can throw - exceptions. Split and join methods, consequently, seem good - choices for tree-based container methods, especially, since as - noted just before, they are efficient replacements for erasing - sub-sequences. Performance - Tests::Tree-Like-Based Container Tests quantifies this.

- -

Methods Related to Insert

- -

STL associative containers provide methods of the form

-
-template<
-    class It>
-size_type
-    insert
-    (It b,
-        It e);
-
for inserting a range of elements given by a pair of -iterators. At best, this can be implemented as an external loop, -or, even more efficiently, as a join operation (for the case of -tree-based or trie-based containers). Moreover, these methods seem -similar to constructors taking a range given by a pair of -iterators; the constructors, however, are transactional, whereas -the insert methods are not; this is possibly confusing. - -

Functions Related to - Comparison

- -

Associative containers are parametrized by policies - allowing to test key equivalence; e.g. a hash-based - container can do this through its equivalence functor, and a - tree-based container can do this through its comparison - functor. In addition, some STL associative containers have - global function operators, e.g., - operator== and operator<=, - that allow comparing entire associative containers.

- -

In our opinion, these functions are better left out. To - begin with, they do not significantly improve over an external - loop. More importantly, however, they are possibly misleading - - operator==, for example, usually checks for - equivalence, or interchangeability, but the associative - container cannot check for values' equivalence, only keys' - equivalence; also, are two containers considered equivalent if - they store the same values in different order? this is an - arbitrary decision.

- -

Alternative to Multiple Equivalent - Keys

- -

Maps (or sets) allow mapping (or storing) unique-key values. - The STL, however, also supplies associative containers which - map (or store) multiple values with equivalent keys: - std::multimap, std::multiset, - std::tr1::unordered_multimap, and - unordered_multiset. We first discuss how these might - be used, then why we think it is best to avoid them.

- -

Suppose one builds a simple bank-account application that - records for each client (identified by an std::string) - and account-id (marked by an unsigned long) - - the balance in the account (described by a - float). Suppose further that ordering this - information is not useful, so a hash-based container is - preferable to a tree based container. Then one can use

-
-std::tr1::unordered_map<std::pair<std::string, unsigned long>, float, ...>
-
which hashes every combination of client and -account-id. This might work well, except for the fact that it -is now impossible to efficiently list all of the accounts of a -specific client (this would practically require iterating over all -entries). Instead, one can use -
-std::tr1::unordered_multimap<std::pair<std::string, unsigned long>, float, ...>
-
which hashes every client, and decides equivalence -based on client only. This will ensure that all accounts -belonging to a specific user are stored consecutively. - -

Also, suppose one wants an integers' priority queue - (i.e., a container that supports push, - pop, and top operations, the last of which - returns the largest int) that also supports - operations such as find and lower_bound. A - reasonable solution is to build an adapter over - std::set<int>. In this adapter, - e.g., push will just call the tree-based - associative container's insert method; pop - will call its end method, and use it to return the - preceding element (which must be the largest). Then this might - work well, except that the container object cannot hold - multiple instances of the same integer (push(4), - e.g., will be a no-op if 4 is already in the - container object). If multiple keys are necessary, then one - might build the adapter over an - std::multiset<int>.

- -

STL non-unique-mapping containers, then, are - useful when (1) a key can be decomposed in to a primary key and - a secondary key, (2) a key is needed multiple times, or (3) any - combination of (1) and (2).

- -

Figure Non-unique mapping - containers in the STL's design shows how the STL's design - works internally; in this figure nodes shaded equally represent - equivalent-key values. Equivalent keys are stored consecutively - using the properties of the underlying data structure: binary - search trees (Figure Non-unique - mapping containers in the STL's design-A) store - equivalent-key values consecutively (in the sense of an - in-order walk) naturally; collision-chaining hash tables - (Figure Non-unique mapping - containers in the STL's design-B) store equivalent-key - values in the same bucket, the bucket can be arranged so that - equivalent-key values are consecutive.

- -
-
- -
Non-unique mapping containers in the STL's - design.
- -

Put differently, STL non-unique mapping - associative-containers are associative containers that map - primary keys to linked lists that are embedded into the - container. Figure Effect of - embedded lists in STL multimaps shows again the two - containers from Figure Non-unique - mapping containers in the STL's design, this time with the - embedded linked lists of the grayed nodes marked - explicitly.

- -
-
- -
Effect of embedded lists in STL multimaps.
- -

These embedded linked lists have several disadvantages.

- -
    -
  1. The underlying data structure embeds the linked lists - according to its own consideration, which means that the - search path for a value might include several different - equivalent-key values. For example, the search path for the - the black node in either of Figures Non-unique mapping containers in the - STL's design A or B, includes more than a single gray - node.
  2. - -
  3. The links of the linked lists are the underlying - data structures' nodes, which typically are quite structured. - E.g., in the case of tree-based containers (Figure - Effect of embedded lists in STL - multimaps-B), each "link" is actually a node with three - pointers (one to a parent and two to children), and a - relatively-complicated iteration algorithm. The linked lists, - therefore, can take up quite a lot of memory, and iterating - over all values equal to a given key (e.g., through - the return value of the STL's equal_range) can be - expensive.
  4. - -
  5. The primary key is stored multiply; this uses more - memory.
  6. - -
  7. Finally, the interface of this design excludes several - useful underlying data structures. E.g., of all the - unordered self-organizing data structures, practically only - collision-chaining hash tables can (efficiently) guarantee - that equivalent-key values are stored consecutively.
  8. -
- -

The above reasons hold even when the ratio of secondary keys - to primary keys (or average number of identical keys) is small, - but when it is large, there are more severe problems:

- -
    -
  1. The underlying data structures order the links inside - each embedded linked-lists according to their internal - considerations, which effectively means that each of the - links is unordered. Irrespective of the underlying - data structure, searching for a specific value can degrade to - linear complexity.
  2. - -
  3. Similarly to the above point, it is impossible to apply - to the secondary keys considerations that apply to primary - keys. For example, it is not possible to maintain secondary - keys by sorted order.
  4. - -
  5. While the interface "understands" that all equivalent-key - values constitute a distinct list (e.g., through - equal_range), the underlying data structure - typically does not. This means, e.g., that operations - such as erasing from a tree-based container all values whose - keys are equivalent to a a given key can be super-linear in - the size of the tree; this is also true also for several - other operations that target a specific list.
  6. -
- -

In pb_ds, therefore, all associative containers map - (or store) unique-key values. One can (1) map primary keys to - secondary associative-containers (i.e., containers of - secondary keys) or non-associative containers (2) map identical - keys to a size-type representing the number of times they - occur, or (3) any combination of (1) and (2). Instead of - allowing multiple equivalent-key values, pb_ds - supplies associative containers based on underlying - data structures that are suitable as secondary - associative-containers (see Associative-Container - Performance Tests::Observations::Mapping-Semantics - Considerations).

- -

Figures Non-unique mapping - containers in pb_ds A and B show the equivalent - structures in pb_ds's design, to those in Figures - Non-unique mapping containers in - the STL's design A and B, respectively. Each shaded box - represents some size-type or secondary - associative-container.

- -
-
- -
Non-unique mapping containers in the - pb_ds.
- -

In the first example above, then, one would use an - associative container mapping each user to an associative - container which maps each application id to a start time (see - basic_multimap.cc); - in the second example, one would use an associative container - mapping each int to some size-type indicating - the number of times it logically occurs (see basic_multiset.cc).

- -

Associative-Container - Performance Tests::Multimaps quantifies some of these - points, and Associative-Container - Performance Tests::Observations::Mapping-Semantics - Considerations shows some simple calculations.

- -

Associative-Container - Examples::Multimaps shows some simple examples of using - "multimaps".

- -

Design::Associative - Containers::List-Based Containers discusses types of - containers especially suited as secondary - associative-containers.

- -

Priority Queues

- -

Slightly Different - Methods

- -

Priority queues are containers that allow efficiently - inserting values and accessing the maximal value (in the sense - of the container's comparison functor); i.e., their - interface supports push and pop. The STL's - priority queues indeed support these methods, but they support - little else. For algorithmic and software-engineering purposes, - other methods are needed:

- -
    -
  1. Many graph algorithms [clrs2001] require increasing a - value in a priority queue (again, in the sense of the - container's comparison functor), or joining two - priority-queue objects.
  2. - -
  3. It is sometimes necessary to erase an arbitrary value in - a priority queue. For example, consider the select - function for monitoring file descriptors: -
    -int 
    -    select
    -    (int nfds,             
    -        fd_set *readfds,                
    -        fd_set *writefds,
    -        fd_set *errorfds, 
    -        struct timeval *timeout);
    -
    then, as the select manual page [select_man] states: - -

    The nfds argument specifies the range of file - descriptors to be tested. The select() function tests file - descriptors in the range of 0 to nfds-1.

    - -

    It stands to reason, therefore, that we might wish to - maintain a minimal value for nfds, and priority - queues immediately come to mind. Note, though, that when a - socket is closed, the minimal file description might - change; in the absence of an efficient means to erase an - arbitrary value from a priority queue, we might as well - avoid its use altogether.

    - -

    Priority-Queue - Examples::Cross-Referencing shows examples for these - types of operations.

    -
  4. - -
  5. STL containers typically support iterators. It is - somewhat unusual for std::priority_queue to omit - them (see, e.g., [meyers01stl]). One might - ask why do priority queues need to support iterators, since - they are self-organizing containers with a different purpose - than abstracting sequences. There are several reasons: - -
      -
    1. Iterators (even in self-organizing containers) are - useful for many purposes, e.g., cross-referencing - containers, serialization, and debugging code that uses - these containers.
    2. - -
    3. The STL's hash-based containers support iterators, - even though they too are self-organizing containers with - a different purpose than abstracting sequences.
    4. - -
    5. In STL-like containers, it is natural to specify the - interface of operations for modifying a value or erasing - a value (discussed previously) in terms of a iterators. - This is discussed further in Design::Priority - Queues::Iterators. It should be noted that the STL's - containers also use iterators for accessing and - manipulating a specific value. E.g., in hash-based - containers, one checks the existence of a key by - comparing the iterator returned by find to the - iterator returned by end, and not by comparing a - pointer returned by find to NULL.
    6. -
    -
  6. -
- -

Performance - Tests::Priority Queues quantifies some of these points.

- -

More Data - Structures and Traits

- -

There are three main implementations of priority queues: the - first employs a binary heap, typically one which uses a - sequence; the second uses a tree (or forest of trees), which is - typically less structured than an associative container's tree; - the third simply uses an associative container. These are - shown, respectively, in Figures Underlying Priority-Queue - Data-Structures A1 and A2, B, and C.

- -
no image
- -
Underlying Priority-Queue Data-Structures.
- -

No single implementation can completely replace any of the - others. Some have better push and pop - amortized performance, some have better bounded (worst case) - response time than others, some optimize a single method at the - expense of others, etc.. In general the "best" - implementation is dictated by the problem (see Performance - Tests::Priority Queues::Observations).

- -

As with associative containers (see Associative Containers::Traits for - Underlying Data-Structures), the more implementations - co-exist, the more necessary a traits mechanism is for handling - generic containers safely and efficiently. This is especially - important for priority queues, since the invalidation - guarantees of one of the most useful data structures - binary - heaps - is markedly different than those of most of the - others.

- -

Design::Priority - Queues::Traits discusses this further.

- -

Binary Heap - Implementation

- -

Binary heaps are one of the most useful underlying - data structures for priority queues. They are very efficient in - terms of memory (since they don't require per-value structure - metadata), and have the best amortized push and - pop performance for primitive types (e.g., - ints).

- -

The STL's priority_queue implements this data - structure as an adapter over a sequence, typically - std::vector or std::deque, which correspond - to Figures Underlying - Priority-Queue Data-Structures A1 and A2, respectively.

- -

This is indeed an elegant example of the adapter concept and - the algorithm/container/iterator decomposition (see [nelson96stlpql]). There are - possibly reasons, however, why a binary-heap priority queue - would be better implemented as a container instead of a - sequence adapter:

- -
    -
  1. std::priority_queue cannot erase values from its - adapted sequence (irrespective of the sequence type). This - means that the memory use of an std::priority_queue - object is always proportional to the maximal number of values - it ever contained, and not to the number of values that it - currently contains (see Priority Queue - Text pop Memory Use Test); this implementation - of binary heaps acts very differently than other underlying - data structures (e.g., pairing heaps).
  2. - -
  3. Some combinations of adapted sequences and value types - are very inefficient or just don't make sense. If one uses - std::priority_queue<std::vector<std::string> - > >, for example, then not only will each - operation perform a logarithmic number of - std::string assignments, but, furthermore, any - operation (including pop) can render the container - useless due to exceptions. Conversely, if one uses - std::priority_queue<std::deque<int> > - >, then each operation uses incurs a logarithmic - number of indirect accesses (through pointers) unnecessarily. - It might be better to let the container make a conservative - deduction whether to use the structure in Figures Underlying Priority-Queue - Data-Structures A1 or A2.
  4. - -
  5. There does not seem to be a systematic way to determine - what exactly can be done with the priority queue. - -
      -
    1. If p is a priority queue adapting an - std::vector, then it is possible to iterate over - all values by using &p.top() and - &p.top() + p.size(), but this will not work - if p is adapting an std::deque; in any - case, one cannot use p.begin() and - p.end(). If a different sequence is adapted, it - is even more difficult to determine what can be - done.
    2. - -
    3. If p is a priority queue adapting an - std::deque, then the reference return by - p.top() will remain valid until it is popped, - but if p adapts an std::vector, the - next push will invalidate it. If a different - sequence is adapted, it is even more difficult to - determine what can be done.
    4. -
    -
  6. - -
  7. Sequence-based binary heaps can still implement - linear-time erase and modify operations. - This means that if one needs, e.g., to erase a small - (say logarithmic) number of values, then one might still - choose this underlying data structure. Using - std::priority_queue, however, this will generally - change the order of growth of the entire sequence of - operations.
  8. -
-
- - diff --git a/libstdc++-v3/docs/html/ext/pb_ds/move_to_front_lu_policy.html b/libstdc++-v3/docs/html/ext/pb_ds/move_to_front_lu_policy.html deleted file mode 100644 index 35190924e1e..00000000000 --- a/libstdc++-v3/docs/html/ext/pb_ds/move_to_front_lu_policy.html +++ /dev/null @@ -1,194 +0,0 @@ - - - - - - - move_to_front_lu_policy Interface - - - - -
-

move_to_front_lu_policy Interface

- -

A list-update policy that unconditionally moves elements to - the front of the list.

- -

Defined in: list_update_policy.hpp

- -

Template Parameters

- - - - - - - - - - - - - - - - - -
ParameterDescriptionDefault Value
-
-class Allocator 
-
-
-

Allocator type.

- -

This is used only for definitions, e.g., the size - type.

-
-
-std::allocator<char>
-
-
- -

Public Types and - Constants

- -

Policy Definitions

- - - - - - - - - - - - - - - - - -
TypeDefinitionDescription
-
-allocator
-
-
-
-Allocator
-
-
-

Allocator - type.

-
- -

Metadata-Type - Definitions

- - - - - - - - - - - - - - - - - - - - - - - - - -
TypeDefinitionDescription
-
-metadata_type
-
-
-
-null_lu_metadata
-
-
-

Metadata on which this functor operates.

- -

In this case, none.

-
-
-metadata_reference
-
-
-
-typename Allocator::template rebind<  
-    metadata_type>::other::reference
-
-
-

Reference to metadata on which this functor - operates.

-
- -

Public Methods

- -

Metadata Methods

- - - - - - - - - - - - - - - - - - - -
MethodDescription
-
-metadata_type
-  operator()
-  () const
-
-
-

Creates a metadata object.

-
-
-inline bool 
-  operator()
-  (metadata_reference r_metadata) const
-
-
-

Decides whether a metadata object should be moved to - the front of the list.

-
-
- - diff --git a/libstdc++-v3/docs/html/ext/pb_ds/multimap_text_find_timing_test_large.html b/libstdc++-v3/docs/html/ext/pb_ds/multimap_text_find_timing_test_large.html deleted file mode 100644 index c24acdcf248..00000000000 --- a/libstdc++-v3/docs/html/ext/pb_ds/multimap_text_find_timing_test_large.html +++ /dev/null @@ -1,215 +0,0 @@ - - - - - -"Multimap" Text Find Timing Test with Large Average - Secondary-Key to Primary-Key Ratio - - - -
-

"Multimap" Text Find Timing Test with Large Average - Secondary-Key to Primary-Key Ratio

-

Description

-

This test inserts a number of pairs into a container. The - first item of each pair is a string from an arbitrary text - [wickland96thirty], and - the second is a uniform i.i.d.integer. The container is a - "multimap" - it considers the first member of each pair as a - primary key, and the second member of each pair as a secondary - key (see Motivation::Associative - Containers::Alternative to Multiple Equivalent Keys). There - are 100 distinct primary keys, and the ratio of secondary keys - to primary keys ranges to about 20.

-

The test measures the average find-time as a function of the - number of values inserted. For pb_ds's containers, it - finds the secondary key from a container obtained from finding - a primary key. For the native multimaps, it searches a range - obtained using std::equal_range on a primary key.

-

(The test was executed with multimap_text_find_timing_test - thirty_years_among_the_dead_preproc.txt 100 3 4 4)

-

Purpose

-

The test checks the find-time scalability of different - "multimap" designs (see Motivation::Associative - Containers::Mapping Semantics).

-

Results

-

Figures NTG, NTM, and - NTL show the results for "multimaps" which - use a tree-based container for primary keys, in g++, msvc++, and - local, - respectively; Figures NHG, NHM, and NHL show the results for - "multimaps" which use a hash-based container for primary keys, - in g++, - msvc++, - and local, - respectively.

-
-
-
-
-
no image
NTG: Native and primary tree-based multimap types find timing test - g++

In the above figure, the names in the legends have the following meaning:

-
    -
  1. -n_mmap- -std::multimap
  2. -
  3. -rb_tree_mmap_lu_mtf_set- -tree - with Tag = rb_tree_tag -, and Node_Update = null_tree_node_update -, mapping each key to list_update - with Update_Policy = move_to_front_lu_policy -
  4. -
  5. -rb_tree_mmap_cc_hash_mask_exp_nea_lc_1div8_1div2_nsth_set- -tree - with Tag = rb_tree_tag -, and Node_Update = null_tree_node_update -, mapping each key to cc_hash_table -with Comb_Hash_Fn = direct_mask_range_hashing -, and Resize_Policy = hash_standard_resize_policy - with Size_Policy = hash_exponential_size_policy -, and Trigger_Policy = hash_load_check_resize_trigger - with αmin = 1/8 and αmax = 1/2
  6. -
-
-
-
-
-
-
-
-
-
-
no image
NTM: Native and primary tree-based multimap types find timing test - msvc++

In the above figure, the names in the legends have the following meaning:

-
    -
  1. -n_mmap- -std::multimap
  2. -
  3. -rb_tree_mmap_lu_mtf_set- -tree - with Tag = rb_tree_tag -, and Node_Update = null_tree_node_update -, mapping each key to list_update - with Update_Policy = move_to_front_lu_policy -
  4. -
  5. -rb_tree_mmap_cc_hash_mask_exp_nea_lc_1div8_1div2_nsth_set- -tree - with Tag = rb_tree_tag -, and Node_Update = null_tree_node_update -, mapping each key to cc_hash_table -with Comb_Hash_Fn = direct_mask_range_hashing -, and Resize_Policy = hash_standard_resize_policy - with Size_Policy = hash_exponential_size_policy -, and Trigger_Policy = hash_load_check_resize_trigger - with αmin = 1/8 and αmax = 1/2
  6. -
-
-
-
-
-
-
-
-
-
-
no image
NTL: Native and primary tree-based multimap types find timing test - local
-
-
-
-
-
-
-
-
-
no image
NHG: Native and primary hash-based multimap types find timing test - g++

In the above figure, the names in the legends have the following meaning:

-
    -
  1. -n_hash_mmap- -__gnucxx::hash_multimap
  2. -
  3. -cc_hash_mask_exp_nea_lc_1div8_1div2_nsth_mmap_lu_mtf_set- -cc_hash_table -with Comb_Hash_Fn = direct_mask_range_hashing -, and Resize_Policy = hash_standard_resize_policy - with Size_Policy = hash_exponential_size_policy -, and Trigger_Policy = hash_load_check_resize_trigger - with αmin = 1/8 and αmax = 1/2, mapping each key to list_update - with Update_Policy = move_to_front_lu_policy -
  4. -
  5. -cc_hash_mask_exp_nea_lc_1div8_1div2_nsth_mmap_cc_hash_mask_exp_nea_lc_1div8_1div2_nsth_set- -cc_hash_table -with Comb_Hash_Fn = direct_mask_range_hashing -, and Resize_Policy = hash_standard_resize_policy - with Size_Policy = hash_exponential_size_policy -, and Trigger_Policy = hash_load_check_resize_trigger - with αmin = 1/8 and αmax = 1/2, mapping each key to cc_hash_table -with Comb_Hash_Fn = direct_mask_range_hashing -, and Resize_Policy = hash_standard_resize_policy - with Size_Policy = hash_exponential_size_policy -, and Trigger_Policy = hash_load_check_resize_trigger - with αmin = 1/8 and αmax = 1/2
  6. -
-
-
-
-
-
-
-
-
-
-
no image
NHM: Native and primary hash-based multimap types find timing test - msvc++

In the above figure, the names in the legends have the following meaning:

-
    -
  1. -n_hash_mmap- -stdext::hash_multimap
  2. -
  3. -cc_hash_mask_exp_nea_lc_1div8_1div2_nsth_mmap_lu_mtf_set- -cc_hash_table -with Comb_Hash_Fn = direct_mask_range_hashing -, and Resize_Policy = hash_standard_resize_policy - with Size_Policy = hash_exponential_size_policy -, and Trigger_Policy = hash_load_check_resize_trigger - with αmin = 1/8 and αmax = 1/2, mapping each key to list_update - with Update_Policy = move_to_front_lu_policy -
  4. -
  5. -cc_hash_mask_exp_nea_lc_1div8_1div2_nsth_mmap_cc_hash_mask_exp_nea_lc_1div8_1div2_nsth_set- -cc_hash_table -with Comb_Hash_Fn = direct_mask_range_hashing -, and Resize_Policy = hash_standard_resize_policy - with Size_Policy = hash_exponential_size_policy -, and Trigger_Policy = hash_load_check_resize_trigger - with αmin = 1/8 and αmax = 1/2, mapping each key to cc_hash_table -with Comb_Hash_Fn = direct_mask_range_hashing -, and Resize_Policy = hash_standard_resize_policy - with Size_Policy = hash_exponential_size_policy -, and Trigger_Policy = hash_load_check_resize_trigger - with αmin = 1/8 and αmax = 1/2
  6. -
-
-
-
-
-
-
-
-
-
-
no image
NHL: Native and primary hash-based multimap types find timing test - local
-
-
-
-
-

Observations

-

See Observations::Mapping-Semantics - Considerations.

-
- - diff --git a/libstdc++-v3/docs/html/ext/pb_ds/multimap_text_find_timing_test_large_s2p_hash_gcc.png b/libstdc++-v3/docs/html/ext/pb_ds/multimap_text_find_timing_test_large_s2p_hash_gcc.png deleted file mode 100644 index 03a62f52b04..00000000000 Binary files a/libstdc++-v3/docs/html/ext/pb_ds/multimap_text_find_timing_test_large_s2p_hash_gcc.png and /dev/null differ diff --git a/libstdc++-v3/docs/html/ext/pb_ds/multimap_text_find_timing_test_large_s2p_hash_local.png b/libstdc++-v3/docs/html/ext/pb_ds/multimap_text_find_timing_test_large_s2p_hash_local.png deleted file mode 100644 index 32a61cac9bd..00000000000 Binary files a/libstdc++-v3/docs/html/ext/pb_ds/multimap_text_find_timing_test_large_s2p_hash_local.png and /dev/null differ diff --git a/libstdc++-v3/docs/html/ext/pb_ds/multimap_text_find_timing_test_large_s2p_hash_msvc.png b/libstdc++-v3/docs/html/ext/pb_ds/multimap_text_find_timing_test_large_s2p_hash_msvc.png deleted file mode 100644 index 4462d289afd..00000000000 Binary files a/libstdc++-v3/docs/html/ext/pb_ds/multimap_text_find_timing_test_large_s2p_hash_msvc.png and /dev/null differ diff --git a/libstdc++-v3/docs/html/ext/pb_ds/multimap_text_find_timing_test_large_s2p_tree_gcc.png b/libstdc++-v3/docs/html/ext/pb_ds/multimap_text_find_timing_test_large_s2p_tree_gcc.png deleted file mode 100644 index 89e464481fd..00000000000 Binary files a/libstdc++-v3/docs/html/ext/pb_ds/multimap_text_find_timing_test_large_s2p_tree_gcc.png and /dev/null differ diff --git a/libstdc++-v3/docs/html/ext/pb_ds/multimap_text_find_timing_test_large_s2p_tree_local.png b/libstdc++-v3/docs/html/ext/pb_ds/multimap_text_find_timing_test_large_s2p_tree_local.png deleted file mode 100644 index 10b3980edab..00000000000 Binary files a/libstdc++-v3/docs/html/ext/pb_ds/multimap_text_find_timing_test_large_s2p_tree_local.png and /dev/null differ diff --git a/libstdc++-v3/docs/html/ext/pb_ds/multimap_text_find_timing_test_large_s2p_tree_msvc.png b/libstdc++-v3/docs/html/ext/pb_ds/multimap_text_find_timing_test_large_s2p_tree_msvc.png deleted file mode 100644 index 20320953e0d..00000000000 Binary files a/libstdc++-v3/docs/html/ext/pb_ds/multimap_text_find_timing_test_large_s2p_tree_msvc.png and /dev/null differ diff --git a/libstdc++-v3/docs/html/ext/pb_ds/multimap_text_find_timing_test_small.html b/libstdc++-v3/docs/html/ext/pb_ds/multimap_text_find_timing_test_small.html deleted file mode 100644 index 5c0b57706d5..00000000000 --- a/libstdc++-v3/docs/html/ext/pb_ds/multimap_text_find_timing_test_small.html +++ /dev/null @@ -1,215 +0,0 @@ - - - - - -"Multimap" Text Find Timing Test with Small Average - Secondary-Key to Primary-Key Ratio - - - -
-

"Multimap" Text Find Timing Test with Small Average - Secondary-Key to Primary-Key Ratio

-

Description

-

This test inserts a number of pairs into a container. The - first item of each pair is a string from an arbitrary text - [wickland96thirty], and - the second is a uniform i.i.d.integer. The container is a - "multimap" - it considers the first member of each pair as a - primary key, and the second member of each pair as a secondary - key (see Motivation::Associative - Containers::Alternative to Multiple Equivalent Keys). There - are 400 distinct primary keys, and the ratio of secondary keys - to primary keys ranges from 1 to 5.

-

The test measures the average find-time as a function of the - number of values inserted. For pb_ds's containers, it - finds the secondary key from a container obtained from finding - a primary key. For the native multimaps, it searches a range - obtained using std::equal_range on a primary key.

-

(The test was executed with multimap_text_find_timing_test - thirty_years_among_the_dead_preproc.txt 400 1 1 6)

-

Purpose

-

The test checks the find-time scalability of different - "multimap" designs (see Motivation::Associative - Containers::Mapping Semantics).

-

Results

-

Figures NTG, NTM, and - NTL show the results for "multimaps" which - use a tree-based container for primary keys, in g++, msvc++, and - local, - respectively; Figures NHG, NHM, and NHL show the results for - "multimaps" which use a hash-based container for primary keys, - in g++, - msvc++, - and local, - respectively.

-
-
-
-
-
no image
NTG: NHG Native and primary tree-based multimap types find timing test - g++

In the above figure, the names in the legends have the following meaning:

-
    -
  1. -n_mmap- -std::multimap
  2. -
  3. -rb_tree_mmap_lu_mtf_set- -tree - with Tag = rb_tree_tag -, and Node_Update = null_tree_node_update -, mapping each key to list_update - with Update_Policy = move_to_front_lu_policy -
  4. -
  5. -rb_tree_mmap_cc_hash_mask_exp_nea_lc_1div8_1div2_nsth_set- -tree - with Tag = rb_tree_tag -, and Node_Update = null_tree_node_update -, mapping each key to cc_hash_table -with Comb_Hash_Fn = direct_mask_range_hashing -, and Resize_Policy = hash_standard_resize_policy - with Size_Policy = hash_exponential_size_policy -, and Trigger_Policy = hash_load_check_resize_trigger - with αmin = 1/8 and αmax = 1/2
  6. -
-
-
-
-
-
-
-
-
-
-
no image
NTM: NHM Native and primary tree-based multimap types find timing test - msvc++

In the above figure, the names in the legends have the following meaning:

-
    -
  1. -n_mmap- -std::multimap
  2. -
  3. -rb_tree_mmap_lu_mtf_set- -tree - with Tag = rb_tree_tag -, and Node_Update = null_tree_node_update -, mapping each key to list_update - with Update_Policy = move_to_front_lu_policy -
  4. -
  5. -rb_tree_mmap_cc_hash_mask_exp_nea_lc_1div8_1div2_nsth_set- -tree - with Tag = rb_tree_tag -, and Node_Update = null_tree_node_update -, mapping each key to cc_hash_table -with Comb_Hash_Fn = direct_mask_range_hashing -, and Resize_Policy = hash_standard_resize_policy - with Size_Policy = hash_exponential_size_policy -, and Trigger_Policy = hash_load_check_resize_trigger - with αmin = 1/8 and αmax = 1/2
  6. -
-
-
-
-
-
-
-
-
-
-
no image
NTL: Native and primary tree-based multimap types find timing test - local
-
-
-
-
-
-
-
-
-
no image
NHG: Native and primary hash-based multimap types find timing test - g++

In the above figure, the names in the legends have the following meaning:

-
    -
  1. -n_hash_mmap- -__gnucxx::hash_multimap
  2. -
  3. -cc_hash_mask_exp_nea_lc_1div8_1div2_nsth_mmap_lu_mtf_set- -cc_hash_table -with Comb_Hash_Fn = direct_mask_range_hashing -, and Resize_Policy = hash_standard_resize_policy - with Size_Policy = hash_exponential_size_policy -, and Trigger_Policy = hash_load_check_resize_trigger - with αmin = 1/8 and αmax = 1/2, mapping each key to list_update - with Update_Policy = move_to_front_lu_policy -
  4. -
  5. -cc_hash_mask_exp_nea_lc_1div8_1div2_nsth_mmap_cc_hash_mask_exp_nea_lc_1div8_1div2_nsth_set- -cc_hash_table -with Comb_Hash_Fn = direct_mask_range_hashing -, and Resize_Policy = hash_standard_resize_policy - with Size_Policy = hash_exponential_size_policy -, and Trigger_Policy = hash_load_check_resize_trigger - with αmin = 1/8 and αmax = 1/2, mapping each key to cc_hash_table -with Comb_Hash_Fn = direct_mask_range_hashing -, and Resize_Policy = hash_standard_resize_policy - with Size_Policy = hash_exponential_size_policy -, and Trigger_Policy = hash_load_check_resize_trigger - with αmin = 1/8 and αmax = 1/2
  6. -
-
-
-
-
-
-
-
-
-
-
no image
NHM: Native and primary hash-based multimap types find timing test - msvc++

In the above figure, the names in the legends have the following meaning:

-
    -
  1. -n_hash_mmap- -stdext::hash_multimap
  2. -
  3. -cc_hash_mask_exp_nea_lc_1div8_1div2_nsth_mmap_lu_mtf_set- -cc_hash_table -with Comb_Hash_Fn = direct_mask_range_hashing -, and Resize_Policy = hash_standard_resize_policy - with Size_Policy = hash_exponential_size_policy -, and Trigger_Policy = hash_load_check_resize_trigger - with αmin = 1/8 and αmax = 1/2, mapping each key to list_update - with Update_Policy = move_to_front_lu_policy -
  4. -
  5. -cc_hash_mask_exp_nea_lc_1div8_1div2_nsth_mmap_cc_hash_mask_exp_nea_lc_1div8_1div2_nsth_set- -cc_hash_table -with Comb_Hash_Fn = direct_mask_range_hashing -, and Resize_Policy = hash_standard_resize_policy - with Size_Policy = hash_exponential_size_policy -, and Trigger_Policy = hash_load_check_resize_trigger - with αmin = 1/8 and αmax = 1/2, mapping each key to cc_hash_table -with Comb_Hash_Fn = direct_mask_range_hashing -, and Resize_Policy = hash_standard_resize_policy - with Size_Policy = hash_exponential_size_policy -, and Trigger_Policy = hash_load_check_resize_trigger - with αmin = 1/8 and αmax = 1/2
  6. -
-
-
-
-
-
-
-
-
-
-
no image
NHL: Native and primary hash-based multimap types find timing test - local
-
-
-
-
-

Observations

-

See Observations::Mapping-Semantics - Considerations.

-
- - diff --git a/libstdc++-v3/docs/html/ext/pb_ds/multimap_text_find_timing_test_small_s2p_hash_gcc.png b/libstdc++-v3/docs/html/ext/pb_ds/multimap_text_find_timing_test_small_s2p_hash_gcc.png deleted file mode 100644 index 60e850937a9..00000000000 Binary files a/libstdc++-v3/docs/html/ext/pb_ds/multimap_text_find_timing_test_small_s2p_hash_gcc.png and /dev/null differ diff --git a/libstdc++-v3/docs/html/ext/pb_ds/multimap_text_find_timing_test_small_s2p_hash_local.png b/libstdc++-v3/docs/html/ext/pb_ds/multimap_text_find_timing_test_small_s2p_hash_local.png deleted file mode 100644 index a8fa261177b..00000000000 Binary files a/libstdc++-v3/docs/html/ext/pb_ds/multimap_text_find_timing_test_small_s2p_hash_local.png and /dev/null differ diff --git a/libstdc++-v3/docs/html/ext/pb_ds/multimap_text_find_timing_test_small_s2p_hash_msvc.png b/libstdc++-v3/docs/html/ext/pb_ds/multimap_text_find_timing_test_small_s2p_hash_msvc.png deleted file mode 100644 index 11aa9e07b6a..00000000000 Binary files a/libstdc++-v3/docs/html/ext/pb_ds/multimap_text_find_timing_test_small_s2p_hash_msvc.png and /dev/null differ diff --git a/libstdc++-v3/docs/html/ext/pb_ds/multimap_text_find_timing_test_small_s2p_tree_gcc.png b/libstdc++-v3/docs/html/ext/pb_ds/multimap_text_find_timing_test_small_s2p_tree_gcc.png deleted file mode 100644 index f54369b15b4..00000000000 Binary files a/libstdc++-v3/docs/html/ext/pb_ds/multimap_text_find_timing_test_small_s2p_tree_gcc.png and /dev/null differ diff --git a/libstdc++-v3/docs/html/ext/pb_ds/multimap_text_find_timing_test_small_s2p_tree_local.png b/libstdc++-v3/docs/html/ext/pb_ds/multimap_text_find_timing_test_small_s2p_tree_local.png deleted file mode 100644 index b3d10612f79..00000000000 Binary files a/libstdc++-v3/docs/html/ext/pb_ds/multimap_text_find_timing_test_small_s2p_tree_local.png and /dev/null differ diff --git a/libstdc++-v3/docs/html/ext/pb_ds/multimap_text_find_timing_test_small_s2p_tree_msvc.png b/libstdc++-v3/docs/html/ext/pb_ds/multimap_text_find_timing_test_small_s2p_tree_msvc.png deleted file mode 100644 index 035fd9389b6..00000000000 Binary files a/libstdc++-v3/docs/html/ext/pb_ds/multimap_text_find_timing_test_small_s2p_tree_msvc.png and /dev/null differ diff --git a/libstdc++-v3/docs/html/ext/pb_ds/multimap_text_insert_mem_usage_test_large.html b/libstdc++-v3/docs/html/ext/pb_ds/multimap_text_insert_mem_usage_test_large.html deleted file mode 100644 index c4b1df5c301..00000000000 --- a/libstdc++-v3/docs/html/ext/pb_ds/multimap_text_insert_mem_usage_test_large.html +++ /dev/null @@ -1,210 +0,0 @@ - - - - - -Hash-List "Multimap" Text Memory Use Test with Large - Average Secondary-Key to Primary-Key Ratio - - - -
-

"Multimap" Text Memory Use Test with Large Average - Secondary-Key to Primary-Key Ratio

-

Description

-

This test inserts a number of pairs into a container. The - first item of each pair is a string from an arbitrary text - [wickland96thirty], and - the second is a uniform i.i.d.integer. The container is a - "multimap" - it considers the first member of each pair as a - primary key, and the second member of each pair as a secondary - key (see Motivation::Associative - Containers::Alternative to Multiple Equivalent Keys). There - are 100 distinct primary keys. The test measures the memory use - as a function of the number of values inserted.

-

(The test was executed with multimap_text_insert_mem_usage_test - thirty_years_among_the_dead_preproc.txt 100 200 2100 100)

-

Purpose

-

The test checks the memory scalability of different - "multimap" designs (see Motivation::Associative - Containers::Mapping Semantics).

-

Results

-

Figures NTG, NTM, and - NTL show the results for "multimaps" which - use a tree-based container for primary keys, in g++, msvc++, and - local, - respectively; Figures NHG, NHM, and NHL show the results for - "multimaps" which use a hash-based container for primary keys, - in g++, - msvc++, - and local, - respectively.

-
-
-
-
-
no image
NTG: NHG Native and primary tree-based multimap types mem usage test - g++

In the above figure, the names in the legends have the following meaning:

-
    -
  1. -rb_tree_mmap_cc_hash_mask_exp_nea_lc_1div8_1div2_nsth_set- -tree - with Tag = rb_tree_tag -, and Node_Update = null_tree_node_update -, mapping each key to cc_hash_table -with Comb_Hash_Fn = direct_mask_range_hashing -, and Resize_Policy = hash_standard_resize_policy - with Size_Policy = hash_exponential_size_policy -, and Trigger_Policy = hash_load_check_resize_trigger - with αmin = 1/8 and αmax = 1/2
  2. -
  3. -n_mmap- -std::multimap
  4. -
  5. -rb_tree_mmap_lu_mtf_set- -tree - with Tag = rb_tree_tag -, and Node_Update = null_tree_node_update -, mapping each key to list_update - with Update_Policy = move_to_front_lu_policy -
  6. -
-
-
-
-
-
-
-
-
-
-
no image
NTM: NHM Native and primary tree-based multimap types mem usage test - msvc++

In the above figure, the names in the legends have the following meaning:

-
    -
  1. -n_mmap- -std::multimap
  2. -
  3. -rb_tree_mmap_cc_hash_mask_exp_nea_lc_1div8_1div2_nsth_set- -tree - with Tag = rb_tree_tag -, and Node_Update = null_tree_node_update -, mapping each key to cc_hash_table -with Comb_Hash_Fn = direct_mask_range_hashing -, and Resize_Policy = hash_standard_resize_policy - with Size_Policy = hash_exponential_size_policy -, and Trigger_Policy = hash_load_check_resize_trigger - with αmin = 1/8 and αmax = 1/2
  4. -
  5. -rb_tree_mmap_lu_mtf_set- -tree - with Tag = rb_tree_tag -, and Node_Update = null_tree_node_update -, mapping each key to list_update - with Update_Policy = move_to_front_lu_policy -
  6. -
-
-
-
-
-
-
-
-
-
-
no image
NTL: Native and primary tree-based multimap types mem usage test - local
-
-
-
-
-
-
-
-
-
no image
NHG: Native and primary hash-based multimap types mem usage test - g++

In the above figure, the names in the legends have the following meaning:

-
    -
  1. -cc_hash_mask_exp_nea_lc_1div8_1div2_nsth_mmap_cc_hash_mask_exp_nea_lc_1div8_1div2_nsth_set- -cc_hash_table -with Comb_Hash_Fn = direct_mask_range_hashing -, and Resize_Policy = hash_standard_resize_policy - with Size_Policy = hash_exponential_size_policy -, and Trigger_Policy = hash_load_check_resize_trigger - with αmin = 1/8 and αmax = 1/2, mapping each key to cc_hash_table -with Comb_Hash_Fn = direct_mask_range_hashing -, and Resize_Policy = hash_standard_resize_policy - with Size_Policy = hash_exponential_size_policy -, and Trigger_Policy = hash_load_check_resize_trigger - with αmin = 1/8 and αmax = 1/2
  2. -
  3. -n_hash_mmap- -__gnucxx::hash_multimap
  4. -
  5. -cc_hash_mask_exp_nea_lc_1div8_1div2_nsth_mmap_lu_mtf_set- -cc_hash_table -with Comb_Hash_Fn = direct_mask_range_hashing -, and Resize_Policy = hash_standard_resize_policy - with Size_Policy = hash_exponential_size_policy -, and Trigger_Policy = hash_load_check_resize_trigger - with αmin = 1/8 and αmax = 1/2, mapping each key to list_update - with Update_Policy = move_to_front_lu_policy -
  6. -
-
-
-
-
-
-
-
-
-
-
no image
NHM: Native and primary hash-based multimap types mem usage test - msvc++

In the above figure, the names in the legends have the following meaning:

-
    -
  1. -n_hash_mmap- -stdext::hash_multimap
  2. -
  3. -cc_hash_mask_exp_nea_lc_1div8_1div2_nsth_mmap_cc_hash_mask_exp_nea_lc_1div8_1div2_nsth_set- -cc_hash_table -with Comb_Hash_Fn = direct_mask_range_hashing -, and Resize_Policy = hash_standard_resize_policy - with Size_Policy = hash_exponential_size_policy -, and Trigger_Policy = hash_load_check_resize_trigger - with αmin = 1/8 and αmax = 1/2, mapping each key to cc_hash_table -with Comb_Hash_Fn = direct_mask_range_hashing -, and Resize_Policy = hash_standard_resize_policy - with Size_Policy = hash_exponential_size_policy -, and Trigger_Policy = hash_load_check_resize_trigger - with αmin = 1/8 and αmax = 1/2
  4. -
  5. -cc_hash_mask_exp_nea_lc_1div8_1div2_nsth_mmap_lu_mtf_set- -cc_hash_table -with Comb_Hash_Fn = direct_mask_range_hashing -, and Resize_Policy = hash_standard_resize_policy - with Size_Policy = hash_exponential_size_policy -, and Trigger_Policy = hash_load_check_resize_trigger - with αmin = 1/8 and αmax = 1/2, mapping each key to list_update - with Update_Policy = move_to_front_lu_policy -
  6. -
-
-
-
-
-
-
-
-
-
-
no image
NHL: Native and primary hash-based multimap types mem usage test - local
-
-
-
-
-

Observations

-

See Observations::Mapping-Semantics - Considerations.

-
- - diff --git a/libstdc++-v3/docs/html/ext/pb_ds/multimap_text_insert_mem_usage_test_large_s2p_hash_gcc.png b/libstdc++-v3/docs/html/ext/pb_ds/multimap_text_insert_mem_usage_test_large_s2p_hash_gcc.png deleted file mode 100644 index 51a3f8d61c1..00000000000 Binary files a/libstdc++-v3/docs/html/ext/pb_ds/multimap_text_insert_mem_usage_test_large_s2p_hash_gcc.png and /dev/null differ diff --git a/libstdc++-v3/docs/html/ext/pb_ds/multimap_text_insert_mem_usage_test_large_s2p_hash_local.png b/libstdc++-v3/docs/html/ext/pb_ds/multimap_text_insert_mem_usage_test_large_s2p_hash_local.png deleted file mode 100644 index 8af7100c6e7..00000000000 Binary files a/libstdc++-v3/docs/html/ext/pb_ds/multimap_text_insert_mem_usage_test_large_s2p_hash_local.png and /dev/null differ diff --git a/libstdc++-v3/docs/html/ext/pb_ds/multimap_text_insert_mem_usage_test_large_s2p_hash_msvc.png b/libstdc++-v3/docs/html/ext/pb_ds/multimap_text_insert_mem_usage_test_large_s2p_hash_msvc.png deleted file mode 100644 index 3a938c0bb0f..00000000000 Binary files a/libstdc++-v3/docs/html/ext/pb_ds/multimap_text_insert_mem_usage_test_large_s2p_hash_msvc.png and /dev/null differ diff --git a/libstdc++-v3/docs/html/ext/pb_ds/multimap_text_insert_mem_usage_test_large_s2p_tree_gcc.png b/libstdc++-v3/docs/html/ext/pb_ds/multimap_text_insert_mem_usage_test_large_s2p_tree_gcc.png deleted file mode 100644 index a992d8f7cfb..00000000000 Binary files a/libstdc++-v3/docs/html/ext/pb_ds/multimap_text_insert_mem_usage_test_large_s2p_tree_gcc.png and /dev/null differ diff --git a/libstdc++-v3/docs/html/ext/pb_ds/multimap_text_insert_mem_usage_test_large_s2p_tree_local.png b/libstdc++-v3/docs/html/ext/pb_ds/multimap_text_insert_mem_usage_test_large_s2p_tree_local.png deleted file mode 100644 index 63c0c8db797..00000000000 Binary files a/libstdc++-v3/docs/html/ext/pb_ds/multimap_text_insert_mem_usage_test_large_s2p_tree_local.png and /dev/null differ diff --git a/libstdc++-v3/docs/html/ext/pb_ds/multimap_text_insert_mem_usage_test_large_s2p_tree_msvc.png b/libstdc++-v3/docs/html/ext/pb_ds/multimap_text_insert_mem_usage_test_large_s2p_tree_msvc.png deleted file mode 100644 index 26841bd1073..00000000000 Binary files a/libstdc++-v3/docs/html/ext/pb_ds/multimap_text_insert_mem_usage_test_large_s2p_tree_msvc.png and /dev/null differ diff --git a/libstdc++-v3/docs/html/ext/pb_ds/multimap_text_insert_mem_usage_test_small.html b/libstdc++-v3/docs/html/ext/pb_ds/multimap_text_insert_mem_usage_test_small.html deleted file mode 100644 index 7b710f309eb..00000000000 --- a/libstdc++-v3/docs/html/ext/pb_ds/multimap_text_insert_mem_usage_test_small.html +++ /dev/null @@ -1,212 +0,0 @@ - - - - - -Hash-List "Multimap" Text Memory Use Test with Small - Average Secondary-Key to Primary-Key Ratio - - - -
-

"Multimap" Text Memory Use Test with Small Average - Secondary-Key to Primary-Key Ratio

-

Description

-

This test inserts a number of pairs into a container. The - first item of each pair is a string from an arbitrary text - [wickland96thirty], and - the second is a uniform i.i.d.integer. The container is a - "multimap" - it considers the first member of each pair as a - primary key, and the second member of each pair as a secondary - key (see Motivation::Associative - Containers::Alternative to Multiple Equivalent Keys). There - are 100 distinct primary keys, and the ratio of secondary keys - to primary keys ranges to about 20.

-

The test measures the memory use as a function of the number - of values inserted.

-

(The test was executed with multimap_text_insert_mem_usage_test - thirty_years_among_the_dead_preproc.txt 100 3 4 4)

-

Purpose

-

The test checks the memory scalability of different - "multimap" designs (see Motivation::Associative - Containers::Mapping Semantics).

-

Results

-

Figures NTG, NTM, and - NTL show the results for "multimaps" which - use a tree-based container for primary keys, in g++, msvc++, and - local, - respectively; Figures NHG, NHM, and NHL show the results for - "multimaps" which use a hash-based container for primary keys, - in g++, - msvc++, - and local, - respectively.

-
-
-
-
-
no image
NTG: Native and primary tree-based multimap types mem usage test - g++

In the above figure, the names in the legends have the following meaning:

-
    -
  1. -rb_tree_mmap_cc_hash_mask_exp_nea_lc_1div8_1div2_nsth_set- -tree - with Tag = rb_tree_tag -, and Node_Update = null_tree_node_update -, mapping each key to cc_hash_table -with Comb_Hash_Fn = direct_mask_range_hashing -, and Resize_Policy = hash_standard_resize_policy - with Size_Policy = hash_exponential_size_policy -, and Trigger_Policy = hash_load_check_resize_trigger - with αmin = 1/8 and αmax = 1/2
  2. -
  3. -n_mmap- -std::multimap
  4. -
  5. -rb_tree_mmap_lu_mtf_set- -tree - with Tag = rb_tree_tag -, and Node_Update = null_tree_node_update -, mapping each key to list_update - with Update_Policy = move_to_front_lu_policy -
  6. -
-
-
-
-
-
-
-
-
-
-
no image
NTM: NHM Native and primary tree-based multimap types mem usage test - msvc++

In the above figure, the names in the legends have the following meaning:

-
    -
  1. -rb_tree_mmap_cc_hash_mask_exp_nea_lc_1div8_1div2_nsth_set- -tree - with Tag = rb_tree_tag -, and Node_Update = null_tree_node_update -, mapping each key to cc_hash_table -with Comb_Hash_Fn = direct_mask_range_hashing -, and Resize_Policy = hash_standard_resize_policy - with Size_Policy = hash_exponential_size_policy -, and Trigger_Policy = hash_load_check_resize_trigger - with αmin = 1/8 and αmax = 1/2
  2. -
  3. -n_mmap- -std::multimap
  4. -
  5. -rb_tree_mmap_lu_mtf_set- -tree - with Tag = rb_tree_tag -, and Node_Update = null_tree_node_update -, mapping each key to list_update - with Update_Policy = move_to_front_lu_policy -
  6. -
-
-
-
-
-
-
-
-
-
-
no image
NTL: Native and primary tree-based multimap types mem usage test - local
-
-
-
-
-
-
-
-
-
no image
NHG: Native and primary hash-based multimap types mem usage test - g++

In the above figure, the names in the legends have the following meaning:

-
    -
  1. -cc_hash_mask_exp_nea_lc_1div8_1div2_nsth_mmap_cc_hash_mask_exp_nea_lc_1div8_1div2_nsth_set- -cc_hash_table -with Comb_Hash_Fn = direct_mask_range_hashing -, and Resize_Policy = hash_standard_resize_policy - with Size_Policy = hash_exponential_size_policy -, and Trigger_Policy = hash_load_check_resize_trigger - with αmin = 1/8 and αmax = 1/2, mapping each key to cc_hash_table -with Comb_Hash_Fn = direct_mask_range_hashing -, and Resize_Policy = hash_standard_resize_policy - with Size_Policy = hash_exponential_size_policy -, and Trigger_Policy = hash_load_check_resize_trigger - with αmin = 1/8 and αmax = 1/2
  2. -
  3. -n_hash_mmap- -__gnucxx::hash_multimap
  4. -
  5. -cc_hash_mask_exp_nea_lc_1div8_1div2_nsth_mmap_lu_mtf_set- -cc_hash_table -with Comb_Hash_Fn = direct_mask_range_hashing -, and Resize_Policy = hash_standard_resize_policy - with Size_Policy = hash_exponential_size_policy -, and Trigger_Policy = hash_load_check_resize_trigger - with αmin = 1/8 and αmax = 1/2, mapping each key to list_update - with Update_Policy = move_to_front_lu_policy -
  6. -
-
-
-
-
-
-
-
-
-
-
no image
NHM: Native and primary hash-based multimap types mem usage test - msvc++

In the above figure, the names in the legends have the following meaning:

-
    -
  1. -cc_hash_mask_exp_nea_lc_1div8_1div2_nsth_mmap_cc_hash_mask_exp_nea_lc_1div8_1div2_nsth_set- -cc_hash_table -with Comb_Hash_Fn = direct_mask_range_hashing -, and Resize_Policy = hash_standard_resize_policy - with Size_Policy = hash_exponential_size_policy -, and Trigger_Policy = hash_load_check_resize_trigger - with αmin = 1/8 and αmax = 1/2, mapping each key to cc_hash_table -with Comb_Hash_Fn = direct_mask_range_hashing -, and Resize_Policy = hash_standard_resize_policy - with Size_Policy = hash_exponential_size_policy -, and Trigger_Policy = hash_load_check_resize_trigger - with αmin = 1/8 and αmax = 1/2
  2. -
  3. -n_hash_mmap- -stdext::hash_multimap
  4. -
  5. -cc_hash_mask_exp_nea_lc_1div8_1div2_nsth_mmap_lu_mtf_set- -cc_hash_table -with Comb_Hash_Fn = direct_mask_range_hashing -, and Resize_Policy = hash_standard_resize_policy - with Size_Policy = hash_exponential_size_policy -, and Trigger_Policy = hash_load_check_resize_trigger - with αmin = 1/8 and αmax = 1/2, mapping each key to list_update - with Update_Policy = move_to_front_lu_policy -
  6. -
-
-
-
-
-
-
-
-
-
-
no image
NHL: Native and primary hash-based multimap types mem usage test - local
-
-
-
-
-

Observations

-

See Observations::Mapping-Semantics - Considerations.

-
- - diff --git a/libstdc++-v3/docs/html/ext/pb_ds/multimap_text_insert_mem_usage_test_small_s2p_hash_gcc.png b/libstdc++-v3/docs/html/ext/pb_ds/multimap_text_insert_mem_usage_test_small_s2p_hash_gcc.png deleted file mode 100644 index d3eba9da47e..00000000000 Binary files a/libstdc++-v3/docs/html/ext/pb_ds/multimap_text_insert_mem_usage_test_small_s2p_hash_gcc.png and /dev/null differ diff --git a/libstdc++-v3/docs/html/ext/pb_ds/multimap_text_insert_mem_usage_test_small_s2p_hash_local.png b/libstdc++-v3/docs/html/ext/pb_ds/multimap_text_insert_mem_usage_test_small_s2p_hash_local.png deleted file mode 100644 index 589dccdefa9..00000000000 Binary files a/libstdc++-v3/docs/html/ext/pb_ds/multimap_text_insert_mem_usage_test_small_s2p_hash_local.png and /dev/null differ diff --git a/libstdc++-v3/docs/html/ext/pb_ds/multimap_text_insert_mem_usage_test_small_s2p_hash_msvc.png b/libstdc++-v3/docs/html/ext/pb_ds/multimap_text_insert_mem_usage_test_small_s2p_hash_msvc.png deleted file mode 100644 index 1828896ee5f..00000000000 Binary files a/libstdc++-v3/docs/html/ext/pb_ds/multimap_text_insert_mem_usage_test_small_s2p_hash_msvc.png and /dev/null differ diff --git a/libstdc++-v3/docs/html/ext/pb_ds/multimap_text_insert_mem_usage_test_small_s2p_tree_gcc.png b/libstdc++-v3/docs/html/ext/pb_ds/multimap_text_insert_mem_usage_test_small_s2p_tree_gcc.png deleted file mode 100644 index 9334bc35bc7..00000000000 Binary files a/libstdc++-v3/docs/html/ext/pb_ds/multimap_text_insert_mem_usage_test_small_s2p_tree_gcc.png and /dev/null differ diff --git a/libstdc++-v3/docs/html/ext/pb_ds/multimap_text_insert_mem_usage_test_small_s2p_tree_local.png b/libstdc++-v3/docs/html/ext/pb_ds/multimap_text_insert_mem_usage_test_small_s2p_tree_local.png deleted file mode 100644 index d7322f287a8..00000000000 Binary files a/libstdc++-v3/docs/html/ext/pb_ds/multimap_text_insert_mem_usage_test_small_s2p_tree_local.png and /dev/null differ diff --git a/libstdc++-v3/docs/html/ext/pb_ds/multimap_text_insert_mem_usage_test_small_s2p_tree_msvc.png b/libstdc++-v3/docs/html/ext/pb_ds/multimap_text_insert_mem_usage_test_small_s2p_tree_msvc.png deleted file mode 100644 index 2f20e57e555..00000000000 Binary files a/libstdc++-v3/docs/html/ext/pb_ds/multimap_text_insert_mem_usage_test_small_s2p_tree_msvc.png and /dev/null differ diff --git a/libstdc++-v3/docs/html/ext/pb_ds/multimap_text_insert_timing_test_large.html b/libstdc++-v3/docs/html/ext/pb_ds/multimap_text_insert_timing_test_large.html deleted file mode 100644 index ecdf2a49708..00000000000 --- a/libstdc++-v3/docs/html/ext/pb_ds/multimap_text_insert_timing_test_large.html +++ /dev/null @@ -1,212 +0,0 @@ - - - - - -"Multimap" Text Insert Timing Test with Large Average - Secondary-Key to Primary-Key Ratio - - - -
-

"Multimap" Text Insert Timing Test with Large Average - Secondary-Key to Primary-Key Ratio

-

Description

-

This test inserts a number of pairs into a container. The - first item of each pair is a string from an arbitrary text - [wickland96thirty], and - the second is a uniform i.i.d.integer. The container is a - "multimap" - it considers the first member of each pair as a - primary key, and the second member of each pair as a secondary - key (see Motivation::Associative - Containers::Alternative to Multiple Equivalent Keys). There - are 100 distinct primary keys, and the ratio of secondary keys - to primary keys ranges to about 20.

-

The test measures the memory use as a function of the number - of values inserted.

-

(The test was executed with multimap_text_insert_mem_usage_test - thirty_years_among_the_dead_preproc.txt 400 1 6 6)

-

Purpose

-

The test checks the insert-time scalability of different - "multimap" designs (see Motivation::Associative - Containers::Mapping Semantics).

-

Results

-

Figures NTG, NTM, and - NTL show the results for "multimaps" which - use a tree-based container for primary keys, in g++, msvc++, and - local, - respectively; Figures NHG, NHM, and NHL show the results for - "multimaps" which use a hash-based container for primary keys, - in g++, - msvc++, - and local, - respectively.

-
-
-
-
-
no image
NTG: Native and primary tree-based multimap types insert timing test - g++

In the above figure, the names in the legends have the following meaning:

-
    -
  1. -n_mmap- -std::multimap
  2. -
  3. -rb_tree_mmap_cc_hash_mask_exp_nea_lc_1div8_1div2_nsth_set- -tree - with Tag = rb_tree_tag -, and Node_Update = null_tree_node_update -, mapping each key to cc_hash_table -with Comb_Hash_Fn = direct_mask_range_hashing -, and Resize_Policy = hash_standard_resize_policy - with Size_Policy = hash_exponential_size_policy -, and Trigger_Policy = hash_load_check_resize_trigger - with αmin = 1/8 and αmax = 1/2
  4. -
  5. -rb_tree_mmap_lu_mtf_set- -tree - with Tag = rb_tree_tag -, and Node_Update = null_tree_node_update -, mapping each key to list_update - with Update_Policy = move_to_front_lu_policy -
  6. -
-
-
-
-
-
-
-
-
-
-
no image
NTM: NHM Native and primary tree-based multimap types insert timing test - msvc++

In the above figure, the names in the legends have the following meaning:

-
    -
  1. -rb_tree_mmap_cc_hash_mask_exp_nea_lc_1div8_1div2_nsth_set- -tree - with Tag = rb_tree_tag -, and Node_Update = null_tree_node_update -, mapping each key to cc_hash_table -with Comb_Hash_Fn = direct_mask_range_hashing -, and Resize_Policy = hash_standard_resize_policy - with Size_Policy = hash_exponential_size_policy -, and Trigger_Policy = hash_load_check_resize_trigger - with αmin = 1/8 and αmax = 1/2
  2. -
  3. -n_mmap- -std::multimap
  4. -
  5. -rb_tree_mmap_lu_mtf_set- -tree - with Tag = rb_tree_tag -, and Node_Update = null_tree_node_update -, mapping each key to list_update - with Update_Policy = move_to_front_lu_policy -
  6. -
-
-
-
-
-
-
-
-
-
-
no image
NTL: Native and primary tree-based multimap types insert timing test - local
-
-
-
-
-
-
-
-
-
no image
NHG: Native and primary hash-based multimap types insert timing test - g++

In the above figure, the names in the legends have the following meaning:

-
    -
  1. -n_hash_mmap- -__gnucxx::hash_multimap
  2. -
  3. -cc_hash_mask_exp_nea_lc_1div8_1div2_nsth_mmap_cc_hash_mask_exp_nea_lc_1div8_1div2_nsth_set- -cc_hash_table -with Comb_Hash_Fn = direct_mask_range_hashing -, and Resize_Policy = hash_standard_resize_policy - with Size_Policy = hash_exponential_size_policy -, and Trigger_Policy = hash_load_check_resize_trigger - with αmin = 1/8 and αmax = 1/2, mapping each key to cc_hash_table -with Comb_Hash_Fn = direct_mask_range_hashing -, and Resize_Policy = hash_standard_resize_policy - with Size_Policy = hash_exponential_size_policy -, and Trigger_Policy = hash_load_check_resize_trigger - with αmin = 1/8 and αmax = 1/2
  4. -
  5. -cc_hash_mask_exp_nea_lc_1div8_1div2_nsth_mmap_lu_mtf_set- -cc_hash_table -with Comb_Hash_Fn = direct_mask_range_hashing -, and Resize_Policy = hash_standard_resize_policy - with Size_Policy = hash_exponential_size_policy -, and Trigger_Policy = hash_load_check_resize_trigger - with αmin = 1/8 and αmax = 1/2, mapping each key to list_update - with Update_Policy = move_to_front_lu_policy -
  6. -
-
-
-
-
-
-
-
-
-
-
no image
NHM: Native and primary hash-based multimap types insert timing test - msvc++

In the above figure, the names in the legends have the following meaning:

-
    -
  1. -n_hash_mmap- -stdext::hash_multimap
  2. -
  3. -cc_hash_mask_exp_nea_lc_1div8_1div2_nsth_mmap_cc_hash_mask_exp_nea_lc_1div8_1div2_nsth_set- -cc_hash_table -with Comb_Hash_Fn = direct_mask_range_hashing -, and Resize_Policy = hash_standard_resize_policy - with Size_Policy = hash_exponential_size_policy -, and Trigger_Policy = hash_load_check_resize_trigger - with αmin = 1/8 and αmax = 1/2, mapping each key to cc_hash_table -with Comb_Hash_Fn = direct_mask_range_hashing -, and Resize_Policy = hash_standard_resize_policy - with Size_Policy = hash_exponential_size_policy -, and Trigger_Policy = hash_load_check_resize_trigger - with αmin = 1/8 and αmax = 1/2
  4. -
  5. -cc_hash_mask_exp_nea_lc_1div8_1div2_nsth_mmap_lu_mtf_set- -cc_hash_table -with Comb_Hash_Fn = direct_mask_range_hashing -, and Resize_Policy = hash_standard_resize_policy - with Size_Policy = hash_exponential_size_policy -, and Trigger_Policy = hash_load_check_resize_trigger - with αmin = 1/8 and αmax = 1/2, mapping each key to list_update - with Update_Policy = move_to_front_lu_policy -
  6. -
-
-
-
-
-
-
-
-
-
-
no image
NHL: Native and primary hash-based multimap types insert timing test - local
-
-
-
-
-

Observations

-

See Observations::Mapping-Semantics - Considerations.

-
- - diff --git a/libstdc++-v3/docs/html/ext/pb_ds/multimap_text_insert_timing_test_large_s2p_hash_gcc.png b/libstdc++-v3/docs/html/ext/pb_ds/multimap_text_insert_timing_test_large_s2p_hash_gcc.png deleted file mode 100644 index 55b0bf46732..00000000000 Binary files a/libstdc++-v3/docs/html/ext/pb_ds/multimap_text_insert_timing_test_large_s2p_hash_gcc.png and /dev/null differ diff --git a/libstdc++-v3/docs/html/ext/pb_ds/multimap_text_insert_timing_test_large_s2p_hash_local.png b/libstdc++-v3/docs/html/ext/pb_ds/multimap_text_insert_timing_test_large_s2p_hash_local.png deleted file mode 100644 index 5f89460087a..00000000000 Binary files a/libstdc++-v3/docs/html/ext/pb_ds/multimap_text_insert_timing_test_large_s2p_hash_local.png and /dev/null differ diff --git a/libstdc++-v3/docs/html/ext/pb_ds/multimap_text_insert_timing_test_large_s2p_hash_msvc.png b/libstdc++-v3/docs/html/ext/pb_ds/multimap_text_insert_timing_test_large_s2p_hash_msvc.png deleted file mode 100644 index 02f5d0b20ae..00000000000 Binary files a/libstdc++-v3/docs/html/ext/pb_ds/multimap_text_insert_timing_test_large_s2p_hash_msvc.png and /dev/null differ diff --git a/libstdc++-v3/docs/html/ext/pb_ds/multimap_text_insert_timing_test_large_s2p_tree_gcc.png b/libstdc++-v3/docs/html/ext/pb_ds/multimap_text_insert_timing_test_large_s2p_tree_gcc.png deleted file mode 100644 index 83366eb3756..00000000000 Binary files a/libstdc++-v3/docs/html/ext/pb_ds/multimap_text_insert_timing_test_large_s2p_tree_gcc.png and /dev/null differ diff --git a/libstdc++-v3/docs/html/ext/pb_ds/multimap_text_insert_timing_test_large_s2p_tree_local.png b/libstdc++-v3/docs/html/ext/pb_ds/multimap_text_insert_timing_test_large_s2p_tree_local.png deleted file mode 100644 index 2b496b48d78..00000000000 Binary files a/libstdc++-v3/docs/html/ext/pb_ds/multimap_text_insert_timing_test_large_s2p_tree_local.png and /dev/null differ diff --git a/libstdc++-v3/docs/html/ext/pb_ds/multimap_text_insert_timing_test_large_s2p_tree_msvc.png b/libstdc++-v3/docs/html/ext/pb_ds/multimap_text_insert_timing_test_large_s2p_tree_msvc.png deleted file mode 100644 index 47196bff7f2..00000000000 Binary files a/libstdc++-v3/docs/html/ext/pb_ds/multimap_text_insert_timing_test_large_s2p_tree_msvc.png and /dev/null differ diff --git a/libstdc++-v3/docs/html/ext/pb_ds/multimap_text_insert_timing_test_small.html b/libstdc++-v3/docs/html/ext/pb_ds/multimap_text_insert_timing_test_small.html deleted file mode 100644 index ae0bd0bb36b..00000000000 --- a/libstdc++-v3/docs/html/ext/pb_ds/multimap_text_insert_timing_test_small.html +++ /dev/null @@ -1,217 +0,0 @@ - - - - - -"Multimap" Text Insert Timing Test with Small Average - Secondary-Key to Primary-Key Ratio - - - -
-

"Multimap" Text Insert Timing Test with Small Average - Secondary-Key to Primary-Key Ratio

-

Description

-

This test inserts a number of pairs into a container. The - first item of each pair is a string from an arbitrary text - [wickland96thirty], and - the second is a uniform i.i.d.integer. The container is a - "multimap" - it considers the first member of each pair as a - primary key, and the second member of each pair as a secondary - key (see Motivation::Associative - Containers::Alternative to Multiple Equivalent Keys). There - are 400 distinct primary keys, and the ratio of secondary keys - to primary keys ranges from 1 to 5.

-

The test measures the average insert-time as a function of - the number of values inserted. For pb_ds's containers, - it inserts a primary key into the primary associative - container, then a secondary key into the secondary associative - container. For the native multimaps, it obtains a range using - std::equal_range, and inserts a value only if it was - not contained already.

-

(The test was executed with multimap_text_insert_timing_test - thirty_years_among_the_dead_preproc.txt 400 1 1 6)

-

Purpose

-

The test checks the insert-time scalability of different - "multimap" designs (see Motivation::Associative - Containers::Alternative to Multiple Equivalent Keys).

-

Results

-

Figures NTG, NTM, and - NTL show the results for "multimaps" which - use a tree-based container for primary keys, in g++, msvc++, and - local, - respectively; Figures NHG, NHM, and NHL show the results for - "multimaps" which use a hash-based container for primary keys, - in g++, - msvc++, - and local, - respectively.

-
-
-
-
-
no image
NTG: Native and primary tree-based multimap types insert timing test - g++

In the above figure, the names in the legends have the following meaning:

-
    -
  1. -n_mmap- -std::multimap
  2. -
  3. -rb_tree_mmap_cc_hash_mask_exp_nea_lc_1div8_1div2_nsth_set- -tree - with Tag = rb_tree_tag -, and Node_Update = null_tree_node_update -, mapping each key to cc_hash_table -with Comb_Hash_Fn = direct_mask_range_hashing -, and Resize_Policy = hash_standard_resize_policy - with Size_Policy = hash_exponential_size_policy -, and Trigger_Policy = hash_load_check_resize_trigger - with αmin = 1/8 and αmax = 1/2
  4. -
  5. -rb_tree_mmap_lu_mtf_set- -tree - with Tag = rb_tree_tag -, and Node_Update = null_tree_node_update -, mapping each key to list_update - with Update_Policy = move_to_front_lu_policy -
  6. -
-
-
-
-
-
-
-
-
-
-
no image
NTM: NHM Native and primary tree-based multimap types insert timing test - msvc++

In the above figure, the names in the legends have the following meaning:

-
    -
  1. -rb_tree_mmap_cc_hash_mask_exp_nea_lc_1div8_1div2_nsth_set- -tree - with Tag = rb_tree_tag -, and Node_Update = null_tree_node_update -, mapping each key to cc_hash_table -with Comb_Hash_Fn = direct_mask_range_hashing -, and Resize_Policy = hash_standard_resize_policy - with Size_Policy = hash_exponential_size_policy -, and Trigger_Policy = hash_load_check_resize_trigger - with αmin = 1/8 and αmax = 1/2
  2. -
  3. -n_mmap- -std::multimap
  4. -
  5. -rb_tree_mmap_lu_mtf_set- -tree - with Tag = rb_tree_tag -, and Node_Update = null_tree_node_update -, mapping each key to list_update - with Update_Policy = move_to_front_lu_policy -
  6. -
-
-
-
-
-
-
-
-
-
-
no image
NTL: Native and primary tree-based multimap types insert timing test - local
-
-
-
-
-
-
-
-
-
no image
NHG: Native and primary hash-based multimap types insert timing test - g++

In the above figure, the names in the legends have the following meaning:

-
    -
  1. -n_hash_mmap- -__gnucxx::hash_multimap
  2. -
  3. -cc_hash_mask_exp_nea_lc_1div8_1div2_nsth_mmap_cc_hash_mask_exp_nea_lc_1div8_1div2_nsth_set- -cc_hash_table -with Comb_Hash_Fn = direct_mask_range_hashing -, and Resize_Policy = hash_standard_resize_policy - with Size_Policy = hash_exponential_size_policy -, and Trigger_Policy = hash_load_check_resize_trigger - with αmin = 1/8 and αmax = 1/2, mapping each key to cc_hash_table -with Comb_Hash_Fn = direct_mask_range_hashing -, and Resize_Policy = hash_standard_resize_policy - with Size_Policy = hash_exponential_size_policy -, and Trigger_Policy = hash_load_check_resize_trigger - with αmin = 1/8 and αmax = 1/2
  4. -
  5. -cc_hash_mask_exp_nea_lc_1div8_1div2_nsth_mmap_lu_mtf_set- -cc_hash_table -with Comb_Hash_Fn = direct_mask_range_hashing -, and Resize_Policy = hash_standard_resize_policy - with Size_Policy = hash_exponential_size_policy -, and Trigger_Policy = hash_load_check_resize_trigger - with αmin = 1/8 and αmax = 1/2, mapping each key to list_update - with Update_Policy = move_to_front_lu_policy -
  6. -
-
-
-
-
-
-
-
-
-
-
no image
NHM: Native and primary hash-based multimap types insert timing test - msvc++

In the above figure, the names in the legends have the following meaning:

-
    -
  1. -cc_hash_mask_exp_nea_lc_1div8_1div2_nsth_mmap_cc_hash_mask_exp_nea_lc_1div8_1div2_nsth_set- -cc_hash_table -with Comb_Hash_Fn = direct_mask_range_hashing -, and Resize_Policy = hash_standard_resize_policy - with Size_Policy = hash_exponential_size_policy -, and Trigger_Policy = hash_load_check_resize_trigger - with αmin = 1/8 and αmax = 1/2, mapping each key to cc_hash_table -with Comb_Hash_Fn = direct_mask_range_hashing -, and Resize_Policy = hash_standard_resize_policy - with Size_Policy = hash_exponential_size_policy -, and Trigger_Policy = hash_load_check_resize_trigger - with αmin = 1/8 and αmax = 1/2
  2. -
  3. -n_hash_mmap- -stdext::hash_multimap
  4. -
  5. -cc_hash_mask_exp_nea_lc_1div8_1div2_nsth_mmap_lu_mtf_set- -cc_hash_table -with Comb_Hash_Fn = direct_mask_range_hashing -, and Resize_Policy = hash_standard_resize_policy - with Size_Policy = hash_exponential_size_policy -, and Trigger_Policy = hash_load_check_resize_trigger - with αmin = 1/8 and αmax = 1/2, mapping each key to list_update - with Update_Policy = move_to_front_lu_policy -
  6. -
-
-
-
-
-
-
-
-
-
-
no image
NHL: Native and primary hash-based multimap types insert timing test - local
-
-
-
-
-

Observations

-

See Observations::Mapping-Semantics - Considerations.

-
- - diff --git a/libstdc++-v3/docs/html/ext/pb_ds/multimap_text_insert_timing_test_small_s2p_hash_gcc.png b/libstdc++-v3/docs/html/ext/pb_ds/multimap_text_insert_timing_test_small_s2p_hash_gcc.png deleted file mode 100644 index 3c2d87ecfac..00000000000 Binary files a/libstdc++-v3/docs/html/ext/pb_ds/multimap_text_insert_timing_test_small_s2p_hash_gcc.png and /dev/null differ diff --git a/libstdc++-v3/docs/html/ext/pb_ds/multimap_text_insert_timing_test_small_s2p_hash_local.png b/libstdc++-v3/docs/html/ext/pb_ds/multimap_text_insert_timing_test_small_s2p_hash_local.png deleted file mode 100644 index 4af78faa524..00000000000 Binary files a/libstdc++-v3/docs/html/ext/pb_ds/multimap_text_insert_timing_test_small_s2p_hash_local.png and /dev/null differ diff --git a/libstdc++-v3/docs/html/ext/pb_ds/multimap_text_insert_timing_test_small_s2p_hash_msvc.png b/libstdc++-v3/docs/html/ext/pb_ds/multimap_text_insert_timing_test_small_s2p_hash_msvc.png deleted file mode 100644 index 81d5839044e..00000000000 Binary files a/libstdc++-v3/docs/html/ext/pb_ds/multimap_text_insert_timing_test_small_s2p_hash_msvc.png and /dev/null differ diff --git a/libstdc++-v3/docs/html/ext/pb_ds/multimap_text_insert_timing_test_small_s2p_tree_gcc.png b/libstdc++-v3/docs/html/ext/pb_ds/multimap_text_insert_timing_test_small_s2p_tree_gcc.png deleted file mode 100644 index 368f07350c2..00000000000 Binary files a/libstdc++-v3/docs/html/ext/pb_ds/multimap_text_insert_timing_test_small_s2p_tree_gcc.png and /dev/null differ diff --git a/libstdc++-v3/docs/html/ext/pb_ds/multimap_text_insert_timing_test_small_s2p_tree_local.png b/libstdc++-v3/docs/html/ext/pb_ds/multimap_text_insert_timing_test_small_s2p_tree_local.png deleted file mode 100644 index 40b5b2c4327..00000000000 Binary files a/libstdc++-v3/docs/html/ext/pb_ds/multimap_text_insert_timing_test_small_s2p_tree_local.png and /dev/null differ diff --git a/libstdc++-v3/docs/html/ext/pb_ds/multimap_text_insert_timing_test_small_s2p_tree_msvc.png b/libstdc++-v3/docs/html/ext/pb_ds/multimap_text_insert_timing_test_small_s2p_tree_msvc.png deleted file mode 100644 index 99f2d690fa5..00000000000 Binary files a/libstdc++-v3/docs/html/ext/pb_ds/multimap_text_insert_timing_test_small_s2p_tree_msvc.png and /dev/null differ diff --git a/libstdc++-v3/docs/html/ext/pb_ds/node_invariant_invalidations.png b/libstdc++-v3/docs/html/ext/pb_ds/node_invariant_invalidations.png deleted file mode 100644 index bbd91842ba8..00000000000 Binary files a/libstdc++-v3/docs/html/ext/pb_ds/node_invariant_invalidations.png and /dev/null differ diff --git a/libstdc++-v3/docs/html/ext/pb_ds/node_invariants.png b/libstdc++-v3/docs/html/ext/pb_ds/node_invariants.png deleted file mode 100644 index b375f5168d7..00000000000 Binary files a/libstdc++-v3/docs/html/ext/pb_ds/node_invariants.png and /dev/null differ diff --git a/libstdc++-v3/docs/html/ext/pb_ds/null_hash_fn.html b/libstdc++-v3/docs/html/ext/pb_ds/null_hash_fn.html deleted file mode 100644 index 5d952245975..00000000000 --- a/libstdc++-v3/docs/html/ext/pb_ds/null_hash_fn.html +++ /dev/null @@ -1,32 +0,0 @@ - - - - - - - null_hash_fn Interface - - - - -
-

null_hash_fn Interface

- -

A "null" hash function, indicating that the combining hash - function is actually a ranged hash function.

- -

Interface::Concepts::Null - Policy Classes explains the concept of a null policy. See - also Design::Hash-Based - Containers::Hash Policies.

- -

Defined in: hash_policy.hpp

-
- - diff --git a/libstdc++-v3/docs/html/ext/pb_ds/null_lu_metadata.html b/libstdc++-v3/docs/html/ext/pb_ds/null_lu_metadata.html deleted file mode 100644 index 1cbf9cc347d..00000000000 --- a/libstdc++-v3/docs/html/ext/pb_ds/null_lu_metadata.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - null_lu_metadata Interface - - - - -
-

null_lu_metadata Interface

- -

A null type that means that each link in a list-based - container does not actually need metadata.

- -

Defined in: list_update_policy.hpp

-
- - diff --git a/libstdc++-v3/docs/html/ext/pb_ds/null_mapped_type.html b/libstdc++-v3/docs/html/ext/pb_ds/null_mapped_type.html deleted file mode 100644 index 5be7359e09f..00000000000 --- a/libstdc++-v3/docs/html/ext/pb_ds/null_mapped_type.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - null_mapped_type Interface - - - - -
-

null_mapped_type Interface

- -

A mapped-policy indicating that an associative container is - a "set"

- -

Defined in: tag_and_trait.hpp

-
- - diff --git a/libstdc++-v3/docs/html/ext/pb_ds/null_probe_fn.html b/libstdc++-v3/docs/html/ext/pb_ds/null_probe_fn.html deleted file mode 100644 index af9379b8cf3..00000000000 --- a/libstdc++-v3/docs/html/ext/pb_ds/null_probe_fn.html +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - - null_probe_fn Interface - - - - -
-

null_probe_fn Interface

- -

A "null" probe function, indicating that the combining probe - function is actually a ranged probe function.

- -

Interface::Concepts::Null - Policy Classes explains the concept of a null policy.

- -

Defined in: hash_policy.hpp

-
- - diff --git a/libstdc++-v3/docs/html/ext/pb_ds/null_tree_node_update.html b/libstdc++-v3/docs/html/ext/pb_ds/null_tree_node_update.html deleted file mode 100644 index 98960ed9bf9..00000000000 --- a/libstdc++-v3/docs/html/ext/pb_ds/null_tree_node_update.html +++ /dev/null @@ -1,101 +0,0 @@ - - - - - - - null_tree_node_update Interface - - - - -
-

null_tree_node_update Interface

- -

A "null" node updater, indicating that no node updates are - required.

- -

Interface::Concepts::Null - Policy Classes explains the concept of a null policy.

- -

Defined in: tree_policy.hpp

- -

Template Parameters

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ParameterDescriptionDefault Value
-
-class Const_Node_Iterator
-
-
-

Const node iterator type.

-
-
-
-class Node_Iterator
-
-
-

Node iterator type.

-
-
-
-class Cmp_Fn
-
-
-

Comparison functor.

-
-
-
-class Allocator
-
-
-

Allocator type.

-
-
-
- - diff --git a/libstdc++-v3/docs/html/ext/pb_ds/null_trie_node_update.html b/libstdc++-v3/docs/html/ext/pb_ds/null_trie_node_update.html deleted file mode 100644 index c6c0844bc60..00000000000 --- a/libstdc++-v3/docs/html/ext/pb_ds/null_trie_node_update.html +++ /dev/null @@ -1,102 +0,0 @@ - - - - - - - null_trie_node_update Interface - - - - -
-

null_trie_node_update Interface

- -

A "null" node updater, indicating that no node updates are - required.

- -

Interface::Concepts::Null - Policy Classes explains the concept of a null policy.

- -

Defined in: trie_policy.hpp

- -

Template Parameters

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ParameterDescriptionDefault Value
-
-class Const_Node_Iterator
-
-
-

Const node iterator type.

-
-
-
-class Node_Iterator
-
-
-

Node iterator type.

-
-
-
-class E_Access_Traits
-
-
-

Comparison functor.

-
-
-
-class Allocator
-
-
-

Allocator type.

-
-
-
- - diff --git a/libstdc++-v3/docs/html/ext/pb_ds/ov_tree_tag.html b/libstdc++-v3/docs/html/ext/pb_ds/ov_tree_tag.html deleted file mode 100644 index 8da2d50d015..00000000000 --- a/libstdc++-v3/docs/html/ext/pb_ds/ov_tree_tag.html +++ /dev/null @@ -1,47 +0,0 @@ - - - - - - - ov_tree_tag Interface - - - - -
-

ov_tree_tag Interface

- -

Ordered-vector tree data structure tag.

- -

Defined in: tag_and_trait.hpp

- -

Base Classes

- - - - - - - - - - - - - -
ClassDerivation Type
-
-tree_tag
-
-
-

public

-
-
- - diff --git a/libstdc++-v3/docs/html/ext/pb_ds/pairing_heap_tag.html b/libstdc++-v3/docs/html/ext/pb_ds/pairing_heap_tag.html deleted file mode 100644 index 756e886b6e6..00000000000 --- a/libstdc++-v3/docs/html/ext/pb_ds/pairing_heap_tag.html +++ /dev/null @@ -1,47 +0,0 @@ - - - - - - - pairing_heap_tag Interface - - - - -
-

pairing_heap_tag Interface

- -

Pairing-heap data structure tag.

- -

Defined in: tag_and_trait.hpp

- -

Base Classes

- - - - - - - - - - - - - -
ClassDerivation Type
-
-priority_queue_tag
-
-
-

public

-
-
- - diff --git a/libstdc++-v3/docs/html/ext/pb_ds/pairing_priority_queue_text_push_pop_timing_test_gcc.png b/libstdc++-v3/docs/html/ext/pb_ds/pairing_priority_queue_text_push_pop_timing_test_gcc.png deleted file mode 100644 index 4168787ecad..00000000000 Binary files a/libstdc++-v3/docs/html/ext/pb_ds/pairing_priority_queue_text_push_pop_timing_test_gcc.png and /dev/null differ diff --git a/libstdc++-v3/docs/html/ext/pb_ds/pairing_priority_queue_text_push_pop_timing_test_local.png b/libstdc++-v3/docs/html/ext/pb_ds/pairing_priority_queue_text_push_pop_timing_test_local.png deleted file mode 100644 index 97ca4e9daad..00000000000 Binary files a/libstdc++-v3/docs/html/ext/pb_ds/pairing_priority_queue_text_push_pop_timing_test_local.png and /dev/null differ diff --git a/libstdc++-v3/docs/html/ext/pb_ds/pairing_priority_queue_text_push_pop_timing_test_msvc.png b/libstdc++-v3/docs/html/ext/pb_ds/pairing_priority_queue_text_push_pop_timing_test_msvc.png deleted file mode 100644 index 42b707965ff..00000000000 Binary files a/libstdc++-v3/docs/html/ext/pb_ds/pairing_priority_queue_text_push_pop_timing_test_msvc.png and /dev/null differ diff --git a/libstdc++-v3/docs/html/ext/pb_ds/pairing_priority_queue_text_push_timing_test_gcc.png b/libstdc++-v3/docs/html/ext/pb_ds/pairing_priority_queue_text_push_timing_test_gcc.png deleted file mode 100644 index 9a7ce6c361f..00000000000 Binary files a/libstdc++-v3/docs/html/ext/pb_ds/pairing_priority_queue_text_push_timing_test_gcc.png and /dev/null differ diff --git a/libstdc++-v3/docs/html/ext/pb_ds/pairing_priority_queue_text_push_timing_test_local.png b/libstdc++-v3/docs/html/ext/pb_ds/pairing_priority_queue_text_push_timing_test_local.png deleted file mode 100644 index cedcb4cf4b2..00000000000 Binary files a/libstdc++-v3/docs/html/ext/pb_ds/pairing_priority_queue_text_push_timing_test_local.png and /dev/null differ diff --git a/libstdc++-v3/docs/html/ext/pb_ds/pairing_priority_queue_text_push_timing_test_msvc.png b/libstdc++-v3/docs/html/ext/pb_ds/pairing_priority_queue_text_push_timing_test_msvc.png deleted file mode 100644 index d5488efcf48..00000000000 Binary files a/libstdc++-v3/docs/html/ext/pb_ds/pairing_priority_queue_text_push_timing_test_msvc.png and /dev/null differ diff --git a/libstdc++-v3/docs/html/ext/pb_ds/pat_trie.png b/libstdc++-v3/docs/html/ext/pb_ds/pat_trie.png deleted file mode 100644 index e7129a1a67b..00000000000 Binary files a/libstdc++-v3/docs/html/ext/pb_ds/pat_trie.png and /dev/null differ diff --git a/libstdc++-v3/docs/html/ext/pb_ds/pat_trie_tag.html b/libstdc++-v3/docs/html/ext/pb_ds/pat_trie_tag.html deleted file mode 100644 index 459546df778..00000000000 --- a/libstdc++-v3/docs/html/ext/pb_ds/pat_trie_tag.html +++ /dev/null @@ -1,47 +0,0 @@ - - - - - - - pat_trie_tag Interface - - - - -
-

pat_trie_tag Interface

- -

PATRICIA trie data structure tag.

- -

Defined in: tag_and_trait.hpp

- -

Base Classes

- - - - - - - - - - - - - -
ClassDerivation Type
-
-tree_tag
-
-
-

public

-
-
- - diff --git a/libstdc++-v3/docs/html/ext/pb_ds/point_invalidation_guarantee.html b/libstdc++-v3/docs/html/ext/pb_ds/point_invalidation_guarantee.html deleted file mode 100644 index ba2eee6dfc4..00000000000 --- a/libstdc++-v3/docs/html/ext/pb_ds/point_invalidation_guarantee.html +++ /dev/null @@ -1,51 +0,0 @@ - - - - - - - point_invalidation_guarantee Interface - - - - -
-

point_invalidation_guarantee Interface

- -

Signifies an invalidation guarantee that includes all those - of its base, and additionally, that any point-type iterator, - pointer, or reference to a container object's mapped value type - is valid as long as its corresponding entry has not be erased, - regardless of modifications to the container object.

- -

Defined in: tag_and_trait.hpp

- -

Base Classes

- - - - - - - - - - - - - -
ClassDerivation Type
-
-basic_invalidation_guarantee
-
-
-

public

-
-
- - diff --git a/libstdc++-v3/docs/html/ext/pb_ds/point_iterators_cd.png b/libstdc++-v3/docs/html/ext/pb_ds/point_iterators_cd.png deleted file mode 100644 index 25a69fc6e8b..00000000000 Binary files a/libstdc++-v3/docs/html/ext/pb_ds/point_iterators_cd.png and /dev/null differ diff --git a/libstdc++-v3/docs/html/ext/pb_ds/point_iterators_range_ops_1.png b/libstdc++-v3/docs/html/ext/pb_ds/point_iterators_range_ops_1.png deleted file mode 100644 index c5bc8e5d6c0..00000000000 Binary files a/libstdc++-v3/docs/html/ext/pb_ds/point_iterators_range_ops_1.png and /dev/null differ diff --git a/libstdc++-v3/docs/html/ext/pb_ds/point_iterators_range_ops_2.png b/libstdc++-v3/docs/html/ext/pb_ds/point_iterators_range_ops_2.png deleted file mode 100644 index c3f94ee93bc..00000000000 Binary files a/libstdc++-v3/docs/html/ext/pb_ds/point_iterators_range_ops_2.png and /dev/null differ diff --git a/libstdc++-v3/docs/html/ext/pb_ds/pq_container_traits.html b/libstdc++-v3/docs/html/ext/pb_ds/pq_container_traits.html deleted file mode 100644 index 2ff5ed7c644..00000000000 --- a/libstdc++-v3/docs/html/ext/pb_ds/pq_container_traits.html +++ /dev/null @@ -1,132 +0,0 @@ - - - - - - - container_traits Interface - - - - -
-

container_traits Interface

- -

Traits of a priority-queue container based on its underlying - data structure.

- -

Defined in: tag_and_trait.hpp

- -

Template Parameters

- - - - - - - - - - - - - - - - - -
ParameterDescriptionDefault Value
-
-class Cntnr
-
-
-

Container type.

-
-
- -

Public Types and - Constants

- -

Container Attributes

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
TypeDefinitionDescription
-
-container_category
-
-
-
-Underlying data structure.
-
-
-

Data structure category.

-
-
-invalidation_guarantee
-
-
-
-Invalidation guarantee.
-
-
-

Invalidation-guarantee type.

- -

This is either basic_invalidation_guarantee, - point_invalidation_guarantee, or - range_invalidation_guarantee

-
-
-split_join_can_throw
-
-
-
-True only if split or join operations can throw.
-
-
-

Split-join throw indicator.

-
-
- - diff --git a/libstdc++-v3/docs/html/ext/pb_ds/pq_design.html b/libstdc++-v3/docs/html/ext/pb_ds/pq_design.html deleted file mode 100644 index 95956004527..00000000000 --- a/libstdc++-v3/docs/html/ext/pb_ds/pq_design.html +++ /dev/null @@ -1,381 +0,0 @@ - - - - - - - Priority-Queues - - - - -
-

Priority-Queue Design

- -

Overview

- -

The priority-queue container has the following - declaration:

-
-template<
-    typename Value_Type,
-    typename Cmp_Fn = std::less<Value_Type>,
-    typename Tag = pairing_heap_tag,
-    typename Allocator = std::allocator<char> >
-class priority_queue;
-
- -

The parameters have the following meaning:

- -
    -
  1. Value_Type is the value type.
  2. - -
  3. Cmp_Fn is a value comparison functor
  4. - -
  5. Tag specifies which underlying data structure - to use.
  6. - -
  7. Allocator is an allocator - type.
  8. -
- -

The Tag parameter specifies which underlying - data structure to use. Instantiating it by pairing_heap_tag, - binary_heap_tag, - binomial_heap_tag, - rc_binomial_heap_tag, - or thin_heap_tag, - specifies, respectively, an underlying pairing heap [fredman86pairing], - binary heap [clrs2001], - binomial heap [clrs2001], a binomial heap with - a redundant binary counter [maverik_lowerbounds], - or a thin heap [kt99fat_heas]. These are - explained further in Implementations.

- -

As mentioned in Tutorial::Priority Queues, - __gnu_pbds::priority_queue - shares most of the same interface with std::priority_queue. - E.g. if q is a priority queue of type - Q, then q.top() will return the "largest" - value in the container (according to typename - Q::cmp_fn). __gnu_pbds::priority_queue - has a larger (and very slightly different) interface than - std::priority_queue, however, since typically - push and pop are deemed insufficient for - manipulating priority-queues.

- -

Different settings require different priority-queue - implementations which are described in Implementations; Traits - discusses ways to differentiate between the different traits of - different implementations.

- -

Iterators

- -

There are many different underlying-data structures for - implementing priority queues. Unfortunately, most such - structures are oriented towards making push and - top efficient, and consequently don't allow efficient - access of other elements: for instance, they cannot support an efficient - find method. In the use case where it - is important to both access and "do something with" an - arbitrary value, one would be out of luck. For example, many graph algorithms require - modifying a value (typically increasing it in the sense of the - priority queue's comparison functor).

- -

In order to access and manipulate an arbitrary value in a - priority queue, one needs to reference the internals of the - priority queue from some form of an associative container - - this is unavoidable. Of course, in order to maintain the - encapsulation of the priority queue, this needs to be done in a - way that minimizes exposure to implementation internals.

- -

In pb_ds the priority queue's insert - method returns an iterator, which if valid can be used for subsequent modify and - erase operations. This both preserves the priority - queue's encapsulation, and allows accessing arbitrary values (since the - returned iterators from the push operation can be - stored in some form of associative container).

- -

Priority queues' iterators present a problem regarding their - invalidation guarantees. One assumes that calling - operator++ on an iterator will associate it - with the "next" value. Priority-queues are - self-organizing: each operation changes what the "next" value - means. Consequently, it does not make sense that push - will return an iterator that can be incremented - this can have - no possible use. Also, as in the case of hash-based containers, - it is awkward to define if a subsequent push operation - invalidates a prior returned iterator: it invalidates it in the - sense that its "next" value is not related to what it - previously considered to be its "next" value. However, it might not - invalidate it, in the sense that it can be - de-referenced and used for modify and erase - operations.

- -

Similarly to the case of the other unordered associative - containers, pb_ds uses a distinction between - point-type and range type iterators. A priority queue's iterator can always be - converted to a point_iterator, and a - const_iterator can always be converted to a - const_point_iterator.

- -

The following snippet demonstrates manipulating an arbitrary - value:

-
-// A priority queue of integers.
-priority_queue<int> p;
-
-// Insert some values into the priority queue.
-priority_queue<int>::point_iterator it = p.push(0);
-
-p.push(1);
-p.push(2);
-
-// Now modify a value.
-p.modify(it, 3);
-
-assert(p.top() == 3);
-
- -

(Priority Queue - Examples::Cross-Referencing shows a more detailed - example.)

- -

It should be noted that an alternative design could embed an - associative container in a priority queue. Could, but most probably should not. To begin with, it should be noted that one - could always encapsulate a priority queue and an associative - container mapping values to priority queue iterators with no - performance loss. One cannot, however, "un-encapsulate" a - priority queue embedding an associative container, which might - lead to performance loss. Assume, that one needs to - associate each value with some data unrelated to priority - queues. Then using pb_ds's design, one could use an - associative container mapping each value to a pair consisting - of this data and a priority queue's iterator. Using the - embedded method would need to use two associative - containers. Similar problems might arise in cases where a value - can reside simultaneously in many priority queues.

- -

Implementations

- -

There are three main implementations of priority queues: the - first employs a binary heap, typically one which uses a - sequence; the second uses a tree (or forest of trees), which is - typically less structured than an associative container's tree; - the third simply uses an associative container. These are - shown, respectively, in Figures Underlying Priority-Queue - Data-Structures A1 and A2, Figure Underlying Priority-Queue - Data-Structures B, and Figures Underlying Priority-Queue - Data-Structures C.

- -
no image
- -
Underlying Priority-Queue Data-Structures.
- -

Roughly speaking, any value that is both pushed and popped - from a priority queue must incur a logarithmic expense (in the - amortized sense). Any priority queue implementation that would - avoid this, would violate known bounds on comparison-based - sorting (see, e.g., [clrs2001] and brodal96priority]).

- -

Most implementations do - not differ in the asymptotic amortized complexity of - push and pop operations, but they differ in - the constants involved, in the complexity of other operations - (e.g., modify), and in the worst-case - complexity of single operations. In general, the more - "structured" an implementation (i.e., the more internal - invariants it possesses) - the higher its amortized complexity - of push and pop operations.

- -

pb_ds implements different algorithms using a - single class: priority_queue. - Instantiating the Tag template parameter, "selects" - the implementation:

- -
    -
  1. Instantiating Tag = binary_heap_tag creates - a binary heap of the form in Figures Underlying Priority-Queue - Data-Structures A1 or A2. The former is internally - selected by priority_queue - if Value_Type is instantiated by a primitive type - (e.g., an int); the latter is - internally selected for all other types (e.g., - std::string). This implementations is relatively - unstructured, and so has good push and pop - performance; it is the "best-in-kind" for primitive - types, e.g., ints. Conversely, it has - high worst-case performance, and can support only linear-time - modify and erase operations; this is - explained further in Traits.
  2. - -
  3. Instantiating Tag = pairing_heap_tag - creates a pairing heap of the form in Figure Underlying Priority-Queue - Data-Structures B. This implementations too is relatively - unstructured, and so has good push and pop - performance; it is the "best-in-kind" for non-primitive - types, e.g., std:strings. It also has very - good worst-case push and join performance - (O(1)), but has high worst-case pop - complexity.
  4. - -
  5. Instantiating Tag = binomial_heap_tag - creates a binomial heap of the form in Figure Underlying Priority-Queue - Data-Structures B. This implementations is more - structured than a pairing heap, and so has worse - push and pop performance. Conversely, it - has sub-linear worst-case bounds for pop, - e.g., and so it might be preferred in cases where - responsiveness is important.
  6. - -
  7. Instantiating Tag = rc_binomial_heap_tag - creates a binomial heap of the form in Figure Underlying Priority-Queue - Data-Structures B, accompanied by a redundant counter - which governs the trees. This implementations is therefore - more structured than a binomial heap, and so has worse - push and pop performance. Conversely, it - guarantees O(1) push complexity, and so it - might be preferred in cases where the responsiveness of a - binomial heap is insufficient.
  8. - -
  9. Instantiating Tag = thin_heap_tag creates a - thin heap of the form in Figure Underlying Priority-Queue - Data-Structures B. This implementations too is more - structured than a pairing heap, and so has worse - push and pop performance. Conversely, it - has better worst-case and identical amortized complexities - than a Fibonacci heap, and so might be more appropriate for - some graph algorithms.
  10. -
- -

Priority-Queue - Performance Tests shows some results for the above, and - discusses these points further.

- -

Of course, one can use any order-preserving associative - container as a priority queue, as in Figure Underlying Priority-Queue - Data-Structures C, possibly by creating an adapter class - over the associative container (much as - std::priority_queue can adapt std::vector). - This has the advantage that no cross-referencing is necessary - at all; the priority queue itself is an associative container. - Most associative containers are too structured to compete with - priority queues in terms of push and pop - performance.

- -

Traits

- -

It would be nice if all priority queues could - share exactly the same behavior regardless of implementation. Sadly, this is not possible. Just one for instance is in join operations: joining - two binary heaps might throw an exception (not corrupt - any of the heaps on which it operates), but joining two pairing - heaps is exception free.

- -

Tags and traits are very useful for manipulating generic - types. __gnu_pbds::priority_queue - publicly defines container_category as one of the tags - discussed in Implementations. Given any - container Cntnr, the tag of the underlying - data structure can be found via typename - Cntnr::container_category; this is one of the types shown in - Figure Data-structure tag class - hierarchy.

- -
-
- -
Data-structure tag class hierarchy.
- -

Additionally, a traits mechanism can be used to query a - container type for its attributes. Given any container - Cntnr, then __gnu_pbds::container_traits<Cntnr> - is a traits class identifying the properties of the - container.

- -

To find if a container might throw if two of its objects are - joined, one can use container_traits<Cntnr>::split_join_can_throw, - for example.

- -

Different priority-queue implementations have different invalidation guarantees. This is - especially important, since as explained in Iterators, there is no way to access an arbitrary - value of priority queues except for iterators. Similarly to - associative containers, one can use - container_traits<Cntnr>::invalidation_guarantee - to get the invalidation guarantee type of a priority queue.

- -

It is easy to understand from Figure Underlying Priority-Queue - Data-Structures, what container_traits<Cntnr>::invalidation_guarantee - will be for different implementations. All implementations of - type Underlying - Priority-Queue Data-Structures B have point_invalidation_guarantee: - the container can freely internally reorganize the nodes - - range-type iterators are invalidated, but point-type iterators - are always valid. Implementations of type Underlying Priority-Queue - Data-Structures A1 and A2 have basic_invalidation_guarantee: - the container can freely internally reallocate the array - both - point-type and range-type iterators might be invalidated.

- -

This has major implications, and constitutes a good reason to avoid - using binary heaps. A binary heap can perform modify - or erase efficiently given a valid point-type - iterator. However, inn order to supply it with a valid point-type - iterator, one needs to iterate (linearly) over all - values, then supply the relevant iterator (recall that a - range-type iterator can always be converted to a point-type - iterator). This means that if the number of modify or - erase operations is non-negligible (say - super-logarithmic in the total sequence of operations) - binary - heaps will perform badly.

-
-
-
-
- - diff --git a/libstdc++-v3/docs/html/ext/pb_ds/pq_different_underlying_dss.png b/libstdc++-v3/docs/html/ext/pb_ds/pq_different_underlying_dss.png deleted file mode 100644 index 9d84791fc0d..00000000000 Binary files a/libstdc++-v3/docs/html/ext/pb_ds/pq_different_underlying_dss.png and /dev/null differ diff --git a/libstdc++-v3/docs/html/ext/pb_ds/pq_examples.html b/libstdc++-v3/docs/html/ext/pb_ds/pq_examples.html deleted file mode 100644 index ee8e9305486..00000000000 --- a/libstdc++-v3/docs/html/ext/pb_ds/pq_examples.html +++ /dev/null @@ -1,60 +0,0 @@ - - - - - - - Examples - - - - -
-

Priority-Queue Examples

- -

Basic Use

- -
    -
  1. basic_priority_queue.cc - Basic use of priority queues.
  2. - -
  3. priority_queue_split_join.cc - Splitting and joining priority queues.
  4. - -
  5. priority_queue_erase_if.cc - Conditionally erasing values from a container object.
  6. -
- -

Generics

- -
    -
  1. priority_queue_container_traits.cc - Using container_traits - to query about underlying data structure behavior.
  2. -
- -

Cross Referencing

- - -
    -
  1. priority_queue_xref.cc - Cross referencing an associative container and a priority - queue.
  2. - -
  3. priority_queue_dijkstra.cc - Cross referencing a vector and a priority queue using a - very simple version of Dijkstra's shortest path - algorithm.
  4. -
-
- - diff --git a/libstdc++-v3/docs/html/ext/pb_ds/pq_performance_tests.html b/libstdc++-v3/docs/html/ext/pb_ds/pq_performance_tests.html deleted file mode 100644 index 3a6b2691208..00000000000 --- a/libstdc++-v3/docs/html/ext/pb_ds/pq_performance_tests.html +++ /dev/null @@ -1,332 +0,0 @@ - - - - - -Priority-Queue Performance Tests - - - -
-

Priority-Queue Performance Tests

-

Settings

-

This section describes performance tests and their results. - In the following, g++, msvc++, and local (the build used for generating this - documentation) stand for three different builds:

-
-
-

g++

-
    -
  • CPU speed - cpu MHz : 2660.644
  • -
  • Memory - MemTotal: 484412 kB
  • -
  • Platform - - Linux-2.6.12-9-386-i686-with-debian-testing-unstable
  • -
  • Compiler - g++ (GCC) 4.0.2 20050808 (prerelease) - (Ubuntu 4.0.1-4ubuntu9) Copyright (C) 2005 Free Software - Foundation, Inc. This is free software; see the source - for copying conditions. There is NO warranty; not even - for MERCHANTABILITY or FITNESS FOR A PARTICULAR - PURPOSE.
  • -
-
-
-
-
-
-

msvc++

-
    -
  • CPU speed - cpu MHz : 2660.554
  • -
  • Memory - MemTotal: 484412 kB
  • -
  • Platform - Windows XP Pro
  • -
  • Compiler - Microsoft (R) 32-bit C/C++ Optimizing - Compiler Version 13.10.3077 for 80x86 Copyright (C) - Microsoft Corporation 1984-2002. All rights - reserved.
  • -
-
-
-
-

local

    -
  • CPU speed - cpu MHz : 2250.000
  • -
  • Memory - MemTotal: 2076248 kB
  • -
  • Platform - Linux-2.6.16-1.2133_FC5-i686-with-redhat-5-Bordeaux
  • -
  • Compiler - g++ (GCC) 4.1.1 20060525 (Red Hat 4.1.1-1) -Copyright (C) 2006 Free Software Foundation, Inc. -This is free software; see the source for copying conditions. There is NO -warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. -
  • -
-
-

Tests

-
    -
  1. Priority Queue - Text push Timing Test
  2. -
  3. Priority - Queue Text push and pop Timing - Test
  4. -
  5. Priority - Queue Random Integer push Timing Test
  6. -
  7. Priority - Queue Random Integer push and pop Timing - Test
  8. -
  9. Priority Queue - Text pop Memory Use Test
  10. -
  11. Priority Queue - Text join Timing Test
  12. -
  13. Priority - Queue Text modify Timing Test - I
  14. -
  15. Priority - Queue Text modify Timing Test - II
  16. -
-

Observations

-

Underlying Data Structures - Complexity

-

The following table shows the complexities of the different - underlying data structures in terms of orders of growth. It is - interesting to note that this table implies something about the - constants of the operations as well (see Amortized push - and pop operations).

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
pushpopmodifyerasejoin
-

std::priority_queue

-
-

Θ(n) worst

-

Θ(log(n)) amortized

-
-

Θ(log(n)) Worst

-
-

Theta;(n log(n)) Worst

-

[std note 1]

-
-

Θ(n log(n))

-

[std note 2]

-
-

Θ(n log(n))

-

[std note 1]

-
-

priority_queue

-

with Tag =

-

pairing_heap_tag

-
-

O(1)

-
-

Θ(n) worst

-

Θ(log(n)) amortized

-
-

Θ(n) worst

-

Θ(log(n)) amortized

-
-

Θ(n) worst

-

Θ(log(n)) amortized

-
-

O(1)

-
-

priority_queue

-

with Tag =

-

binary_heap_tag

-
-

Θ(n) worst

-

Θ(log(n)) amortized

-
-

Θ(n) worst

-

Θ(log(n)) amortized

-
-

Θ(n)

-
-

Θ(n)

-
-

Θ(n)

-
-

priority_queue

-

with Tag =

-

binomial_heap_tag

-
-

Θ(log(n)) worst

-

O(1) amortized

-
-

Θ(log(n))

-
-

Θ(log(n))

-
-

Θ(log(n))

-
-

Θ(log(n))

-
-

priority_queue

-

with Tag =

-

rc_binomial_heap_tag

-
-

O(1)

-
-

Θ(log(n))

-
-

Θ(log(n))

-
-

Θ(log(n))

-
-

Θ(log(n))

-
-

priority_queue

-

with Tag =

-

thin_heap_tag

-
-

O(1)

-
-

Θ(n) worst

-

Θ(log(n)) amortized

-
-

Θ(log(n)) worst

-

O(1) amortized,

or - -

Θ(log(n)) amortized

-

[thin_heap_note]

-
-

Θ(n) worst

-

Θ(log(n)) amortized

-
-

Θ(n)

-
-

[std note 1] This - is not a property of the algorithm, but rather due to the fact - that the STL's priority queue implementation does not support - iterators (and consequently the ability to access a specific - value inside it). If the priority queue is adapting an - std::vector, then it is still possible to reduce this - to Θ(n) by adapting over the STL's adapter and - using the fact that top returns a reference to the - first value; if, however, it is adapting an - std::deque, then this is impossible.

-

[std note 2] As - with [std note 1], this is not a - property of the algorithm, but rather the STL's implementation. - Again, if the priority queue is adapting an - std::vector then it is possible to reduce this to - Θ(n), but with a very high constant (one must call - std::make_heap which is an expensive linear - operation); if the priority queue is adapting an - std::dequeu, then this is impossible.

-

[thin_heap_note] A thin heap has - &Theta(log(n)) worst case modify time - always, but the amortized time depends on the nature of the - operation: I) if the operation increases the key (in the sense - of the priority queue's comparison functor), then the amortized - time is O(1), but if II) it decreases it, then the - amortized time is the same as the worst case time. Note that - for most algorithms, I) is important and II) is not.

-

Amortized push - and pop operations

-

In many cases, a priority queue is needed primarily for - sequences of push and pop operations. All of - the underlying data structures have the same amortized - logarithmic complexity, but they differ in terms of - constants.

-

The table above shows that the different data structures are - "constrained" in some respects. In general, if a data structure - has lower worst-case complexity than another, then it will - perform slower in the amortized sense. Thus, for example a - redundant-counter binomial heap (priority_queue with - Tag = rc_binomial_heap_tag) - has lower worst-case push performance than a binomial - heap (priority_queue - with Tag = binomial_heap_tag), - and so its amortized push performance is slower in - terms of constants.

-

As the table shows, the "least constrained" underlying - data structures are binary heaps and pairing heaps. - Consequently, it is not surprising that they perform best in - terms of amortized constants.

-
    -
  1. Pairing heaps seem to perform best for non-primitive - types (e.g., std::strings), as shown by - Priority - Queue Text push Timing Test and Priority - Queue Text push and pop Timing - Test
  2. -
  3. binary heaps seem to perform best for primitive types - (e.g., ints), as shown by Priority - Queue Random Integer push Timing Test and - Priority - Queue Random Integer push and pop Timing - Test.
  4. -
-

Graph Algorithms

-

In some graph algorithms, a decrease-key operation is - required [clrs2001]; - this operation is identical to modify if a value is - increased (in the sense of the priority queue's comparison - functor). The table above and Priority Queue - Text modify Timing Test - I show that a thin heap - (priority_queue with - Tag = thin_heap_tag) - outperforms a pairing heap (priority_queue with - Tag =Tag = pairing_heap_tag), - but the rest of the tests show otherwise.

-

This makes it difficult to decide which implementation to - use in this case. Dijkstra's shortest-path algorithm, for - example, requires Θ(n) push and - pop operations (in the number of vertices), but - O(n2) modify operations, which can - be in practice Θ(n) as well. It is difficult to - find an a-priori characterization of graphs in which the - actual number of modify operations will dwarf - the number of push and pop operations.

-
- - diff --git a/libstdc++-v3/docs/html/ext/pb_ds/pq_regression_tests.html b/libstdc++-v3/docs/html/ext/pb_ds/pq_regression_tests.html deleted file mode 100644 index 1e894ca6edb..00000000000 --- a/libstdc++-v3/docs/html/ext/pb_ds/pq_regression_tests.html +++ /dev/null @@ -1,52 +0,0 @@ - - - - - - - Priority-Queue Regression Tests - - - - -
-

Priority-Queue Regression Tests

- -

Description

- -

The library contains a single comprehensive regression test. - For a given container type in pb_ds, the test creates - an object of the container type and an object of the - corresponding STL type (i.e., - std::priority_queue). It then performs a random - sequence of methods with random arguments (e.g., pushes, - pops, and so forth) on both objects. At each operation, the - test checks the return value of the method, and optionally both - compares pb_ds's object with the STL's object as well - as performing other consistency checks on pb_ds's - object (e.g., that the size returned by the - size method corresponds to the distance between its - begin and end iterators).

- -

Additionally, the test integrally checks exception safety - and resource leaks. This is done as follows. A special - allocator type, written for the purpose of the test, both - randomly throws an exceptions when allocations are performed, - and tracks allocations and de-allocations. The exceptions thrown - at allocations simulate memory-allocation failures; the - tracking mechanism checks for memory-related bugs (e.g., - resource leaks and multiple de-allocations). Both - pb_ds's containers and the containers' value-types are - configured to use this allocator.

- -

Tests

- -

priority_queue_rand.cc - checks all priority queue types.

-
- - diff --git a/libstdc++-v3/docs/html/ext/pb_ds/pq_tests.html b/libstdc++-v3/docs/html/ext/pb_ds/pq_tests.html deleted file mode 100644 index de8cb447c71..00000000000 --- a/libstdc++-v3/docs/html/ext/pb_ds/pq_tests.html +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - Priority-Queue Tests - - - - -
-

Priority-Queue Tests

- -

Priority-Queue Regression - Tests describes the regression tests; Priority-Queue Performance - Tests describes the performance tests.

-
- - diff --git a/libstdc++-v3/docs/html/ext/pb_ds/prerequisites.html b/libstdc++-v3/docs/html/ext/pb_ds/prerequisites.html deleted file mode 100644 index 7c888849918..00000000000 --- a/libstdc++-v3/docs/html/ext/pb_ds/prerequisites.html +++ /dev/null @@ -1,46 +0,0 @@ - - - - - - - Prerequisites - - - - -
-

Usage Prerequisites

- -

pb_ds has been successfully tested with the - following compilers:

- -
    -
  1. g++ 3.3.1, 3.4.4, 4.0, 4.1, and what will be 4.2
  2. - -
  3. Intel icpc 8.1 and 9
  4. - -
  5. Visual C++ .Net 2005
  6. -
- -

The library contains only header files, and does not require - any other libraries except the STL. All classes are defined in - namespace pb_ds. The library internally uses - macros beginning with PB_DS (e.g., for header - guards), but #undefs anything it - #defines (except for header guards). Compiling - the library in an environment where macros beginning in - PB_DS are defined, may yield unpredictable results in - compilation, execution, or both.

- -

Further dependencies are necessary to create the visual output - for the performance tests. To create these graphs, two additional - packages will be needed: pychart and Beautiful - Soup. Both are freely available. -

-
- - diff --git a/libstdc++-v3/docs/html/ext/pb_ds/priority_queue.html b/libstdc++-v3/docs/html/ext/pb_ds/priority_queue.html deleted file mode 100644 index 169953f6d59..00000000000 --- a/libstdc++-v3/docs/html/ext/pb_ds/priority_queue.html +++ /dev/null @@ -1,995 +0,0 @@ - - - - - - - priority_queue Interface - - - - -
-

priority_queue Interface

- -

Basic priority queue.

- -

Defined in: priority_queue.hpp

- -

Template Parameters

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ParameterDescriptionDefault Value
-
-typename Value_Type
-
-
-

Value type.

-
-
-
-class Cmp_Fn 
-
-
-

Comparison functor.

-
-
-std::less<Value_Type>
-
-
-
-class Tag 
-
-
-

Data-structure tag.

-
pairing_heap_tag
-
-class Allocator 
-
-
-

Allocator type.

-
-
-std::allocator<char>
-
-
- -

Public Types and - Constants

- -

General Container - Definitions

- - - - - - - - - - - - - - - - - - - - - - - - - -
TypeDefinitionDescription
-
-size_type
-
-
-
-typename Allocator::size_type
-
-
-

Size type.

-
-
-difference_type
-
-
-
-typename Allocator::difference_type
-
-
-

Difference type.

-
- -

Categories

- - - - - - - - - - - - - - - - - -
TypeDefinitionDescription
-
-container_category
-
-
-
-Tag
-
-
-

The underlying mapped-structure tag of the - container.

- -

This is one of:

- -
    -
  1. binary_heap_tag
  2. - -
  3. binomial_heap_tag
  4. - -
  5. rc_binomial_heap_tag
  6. - -
  7. pairing_heap_tag
  8. - -
  9. thin_heap_tag
  10. -
-
- -

Policy Definitions

- - - - - - - - - - - - - - - - - - - - - - - - - -
TypeDefinitionDescription
-
-cmp_fn
-
-
-
-Cmp_Fn
-
-
-

Comparison functor type.

-
-
-allocator
-
-
-
-Allocator
-
-
-

Allocator - type.

-
- -

Value-Type Definitions

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
TypeDefinitionDescription
-
-value_type
-
-
-
-Value_Type
-
-
-

Value type.

-
-
-reference
-
-
-
-typename allocator::template rebind<
-    value_type>::other::reference
-
-
-

Value reference type.

-
-
-const_reference
-
-
-
-typename allocator::template rebind<
-    value_type>::other::const_reference
-
-
-

Const value reference type.

-
-
-pointer
-
-
-
-typename allocator::template rebind<
-    value_type>::other::pointer
-
-
-

Value pointer type.

-
-
-const_pointer
-
-
-
-typename allocator::template rebind<
-    value_type>::other::const_pointer
-
-
-

Const Value pointer type.

-
- -

Iterator Definitions

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
TypeDefinitionDescription
-
-const_point_iterator
-
-
-
-Const point-type iterator.
-
-
-

Const point-type iterator.

-
-
-point_iterator
-
-
-
-Point-type iterator.
-
-
-

Point-type iterator.

-
-
-const_iterator
-
-
-
-Const range-type iterator.
-
-
-

Const range-type iterator.

-
-
-iterator
-
-
-
-Range-type iterator.
-
-
-

Range-type iterator.

-
- -

Public Methods

- -

Constructors, Destructor, and - Related

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
MethodDescription
-
-  priority_queue
-  ()
-
-
-

Default constructor.

-
-
-  priority_queue
-  (const cmp_fn &r_cmp_fn)
-
-
-

Constructor taking some policy objects. r_cmp_fn will be copied by the - Cmp_Fn object of the - container object.

-
-
-template<
-    class It>
-  priority_queue
-  (It first_it, 
-    It last_it)
-
-
-

Constructor taking iterators to a range of value_types. The - value_types - between first_it and - last_it will be inserted - into the container object.

-
-
-template<
-    class It>
-  priority_queue
-  (It first_it, 
-    It last_it,
-    const cmp_fn &r_cmp_fn)
-
-
-

Constructor taking iterators to a range of value_types and some - policy objects The value_types between - first_it and - last_it will be inserted - into the container object. r_cmp_fn will be copied by the - cmp_fn object of the - container object.

-
-
-  priority_queue
-  (const priority_queue &other)
-
-
-

Copy constructor.

-
-
-virtual 
-  ~priority_queue
-  ()
-
-
-

Destructor.

-
-
-priority_queue &
-  operator=
-  (const priority_queue &other)
-
-
-

Assignment operator.

-
-
-void
-  swap
-  (priority_queue &other)
-
-
-

Swaps content.

-
- -

Information Methods

- - - - - - - - - - - - - - - - - - - - - - - - - -
MethodDescription
-
-inline size_type
-  size
-  () const
-
-
-

Returns the number of distinct value_type objects - the container object is storing.

-
-
-inline size_type
-  max_size
-  () const
-
-
-

Returns an upper bound on the number of distinct - value_type - objects this container can store.

-
-
-inline bool
-  empty
-  () const
-
-
-

Returns whether the container object is not storing - any value_type - objects.

-
- -

Insert Methods

- - - - - - - - - - - - - -
MethodDescription
-
-inline point_iterator
-  push
-  (const_reference r_val)
-
-
-

Inserts a value_type object. - returns a point_iterator - object associated with the new pushed r_val.

-
- -

Find Methods

- - - - - - - - - - - - - -
MethodDescription
-
-inline const_reference 
-  top
-  () const
-
-
-

Returns the const_reference - of the largest value_type in the - container object, i.e., a value_type v_max for - which any other value_type v in the - container object will satisfy !cmp_fn()(v_max, v).

-
- -

Modify Methods

- - - - - - - - - - - - - -
MethodDescription
-
-inline void
-  modify
-  (point_iterator it,
-    const_reference r_new_val)
-
-
-

Modifies the value_type associated - with the point_iterator - it into r_new_val.

- -

To use this method, value_type must be - assignable.

-
- -

Erase Methods

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
MethodDescription
-
-inline void
-  pop
-  ()
-
-
-

Pops the largest value_type.

- -

If the container object is empty, results are - undefined.

-
-
-inline void
-  erase
-  (point_iterator it)
-
-
-

Erases the value_type associated - with the point_iterator - it.

-
-
-template<
-  class Pred>
-inline size_type 
-  erase_if
-  (Pred prd)
-
-
-

Erases any value_type satisfying - the predicate prd; - returns the number of value_types - erased.

-
-
-void 
-  clear
-  ()
-
-
-

Clears the container object.

-
- -

Split and join - Methods

- - - - - - - - - - - - - - - - - - - -
MethodDescription
-
-void 
-  join
-  (priority_queue &other)
-
-
-

Joins two container objects. When this function - returns, other will be - empty.

- -

When calling this method, other's policies must be - equivalent to this object's policies.

-
-
-template<
-  class Pred>
-inline void
-  split
-  (Pred prd,
-    priority_queue &other)
-
-
-

Splits into two container objects. When this function - returns, other will be - contain only values v for which prd(v) is true.

- -

When calling this method, other's policies must be - equivalent to this object's policies.

-
- -

Iteration Methods

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
MethodDescription
-
-inline iterator
-  begin
-  ()
-
-
-

Returns an iterator corresponding - to the first value_type in the - container.

-
-
-inline const_iterator
-  begin
-  () const
-
-
-

Returns a const_iterator - corresponding to the first value_type in the - container.

-
-
-inline iterator
-  end
-  ()
-
-
-

Returns an iterator corresponding - to the just-after-last value_type in the - container.

-
-
-inline const_iterator
-  end
-  () const
-
-
-

Returns a const_iterator - corresponding to the just-after-last value_type in the - container.

-
-
- - diff --git a/libstdc++-v3/docs/html/ext/pb_ds/priority_queue_random_int_push_pop_timing_test.html b/libstdc++-v3/docs/html/ext/pb_ds/priority_queue_random_int_push_pop_timing_test.html deleted file mode 100644 index e9aec9ceb04..00000000000 --- a/libstdc++-v3/docs/html/ext/pb_ds/priority_queue_random_int_push_pop_timing_test.html +++ /dev/null @@ -1,161 +0,0 @@ - - - - - -Priority Queue Random Int Push Pop Timing Test - - - -
-

Priority Queue Random Integer push and - pop Timing Test

-

Description

-

This test inserts a number of values with i.i.d. integer - keys into a container using push , then removes them - using pop . It measures the average time for - push and pop as a function of the number of - values.

-

(The test was executed with -priority_queue_random_int_push_pop_timing_test - thirty_years_among_the_dead_preproc.txt 200 200 2100)

-

Purpose

-

The test checks the effect of different underlying - data structures (see Design::Priority - Queues::Implementations).

-

Results

-

Figures NPG, NPM, and - NPL shows the results for the native - priority queues and pb_ds 's priority queues in - g++, - msvc++, and - local, - respectively.

-
-
-
-
-
no image
NPG: Native and pb ds priority queue push pop timing test - g++

In the above figure, the names in the legends have the following meaning:

-
    -
  1. -thin_heap- -priority_queue - with Tag = thin_heap_tag -
  2. -
  3. -rc_binomial_heap- -priority_queue - with Tag = rc_binomial_heap_tag -
  4. -
  5. -binomial_heap- -priority_queue - with Tag = binomial_heap_tag -
  6. -
  7. -pairing_heap- -priority_queue - with Tag = pairing_heap_tag -
  8. -
  9. -n_pq_deque- -std::priority_queue adapting std::deque
  10. -
  11. -n_pq_vector- -std::priority_queue adapting std::vector
  12. -
  13. -binary_heap- -priority_queue - with Tag = binary_heap_tag -
  14. -
-
-
-
-
-
-
-
-
-
-
no image
NPM: Native and pb ds priority queue push pop timing test - msvc++

In the above figure, the names in the legends have the following meaning:

-
    -
  1. -thin_heap- -priority_queue - with Tag = thin_heap_tag -
  2. -
  3. -rc_binomial_heap- -priority_queue - with Tag = rc_binomial_heap_tag -
  4. -
  5. -binomial_heap- -priority_queue - with Tag = binomial_heap_tag -
  6. -
  7. -pairing_heap- -priority_queue - with Tag = pairing_heap_tag -
  8. -
  9. -n_pq_deque- -std::priority_queue adapting std::deque
  10. -
  11. -n_pq_vector- -std::priority_queue adapting std::vector
  12. -
  13. -binary_heap- -priority_queue - with Tag = binary_heap_tag -
  14. -
-
-
-
-
-
-
-
-
-
-
no image
NPL: Native and pb ds priority queue push pop timing test - local
-
-
-
-
-

Observations

-

Binary heaps are the most suited for sequences of - push and pop operations of primitive types - (e.g. ints). This is explained in - Priority - Queue Random Int push Timing Test . (See Priority Queue - Text push Timing Test for the case of primitive - types.)

-

At first glance it seems that the STL's vector-based - priority queue is approximately on par with pb_ds's - corresponding priority queue. There are two differences - however:

-
    -
  1. The STL's priority queue does not downsize the underlying - vector (or deque) as the priority queue becomes smaller - (see Priority Queue - Text pop Memory Use Test). It is therefore - gaining some speed at the expense of space.
  2. -
  3. From Priority - Queue Random Integer push and pop Timing - Test, it seems that the STL's priority queue is slower in - terms of pus operations. Since the number of - pop operations is at most that of push - operations, the test here is the "best" for the STL's - priority queue.
  4. -
-

Priority-Queue - Performance Tests::Observations discusses this further and - summarizes.

-
- - diff --git a/libstdc++-v3/docs/html/ext/pb_ds/priority_queue_random_int_push_pop_timing_test_gcc.png b/libstdc++-v3/docs/html/ext/pb_ds/priority_queue_random_int_push_pop_timing_test_gcc.png deleted file mode 100644 index 68f5e2b6bdb..00000000000 Binary files a/libstdc++-v3/docs/html/ext/pb_ds/priority_queue_random_int_push_pop_timing_test_gcc.png and /dev/null differ diff --git a/libstdc++-v3/docs/html/ext/pb_ds/priority_queue_random_int_push_pop_timing_test_local.png b/libstdc++-v3/docs/html/ext/pb_ds/priority_queue_random_int_push_pop_timing_test_local.png deleted file mode 100644 index 51f8211f1d4..00000000000 Binary files a/libstdc++-v3/docs/html/ext/pb_ds/priority_queue_random_int_push_pop_timing_test_local.png and /dev/null differ diff --git a/libstdc++-v3/docs/html/ext/pb_ds/priority_queue_random_int_push_pop_timing_test_msvc.png b/libstdc++-v3/docs/html/ext/pb_ds/priority_queue_random_int_push_pop_timing_test_msvc.png deleted file mode 100644 index 4fc191c8b1c..00000000000 Binary files a/libstdc++-v3/docs/html/ext/pb_ds/priority_queue_random_int_push_pop_timing_test_msvc.png and /dev/null differ diff --git a/libstdc++-v3/docs/html/ext/pb_ds/priority_queue_random_int_push_timing_test.html b/libstdc++-v3/docs/html/ext/pb_ds/priority_queue_random_int_push_timing_test.html deleted file mode 100644 index 65323029bac..00000000000 --- a/libstdc++-v3/docs/html/ext/pb_ds/priority_queue_random_int_push_timing_test.html +++ /dev/null @@ -1,200 +0,0 @@ - - - - - -Priority Queue Random Int Push Timing Test - - - -
-

Priority Queue Random Integer push Timing - Test

-

Description

-

This test inserts a number of values with i.i.d integer keys - into a container using push . It measures the average - time for push as a function of the number of - values.

-

(The test was executed with - priority_queue_random_intpush_timing_test - thirty_years_among_the_dead_preproc.txt 200 200 2100)

-

Purpose

-

The test checks the effect of different underlying - data structures (see Design::Priority - Queues::Implementations).

-

Results

-

Figures NPG, NPM, and - NPL show the results for the native priority - queues and pb_ds 's priority queues in g++, msvc++, and - local, - respectively; Figures NBPG, NBPM, and NBPL shows the - results for the binary-heap based native priority queues and - pb_ds 's priority queues in g++, msvc++, and - local, - respectively

-
-
-
-
-
no image
NPG: Native and pb ds priority queue push timing test - g++

In the above figure, the names in the legends have the following meaning:

-
    -
  1. -rc_binomial_heap- -priority_queue - with Tag = rc_binomial_heap_tag -
  2. -
  3. -binomial_heap- -priority_queue - with Tag = binomial_heap_tag -
  4. -
  5. -n_pq_deque- -std::priority_queue adapting std::deque
  6. -
  7. -pairing_heap- -priority_queue - with Tag = pairing_heap_tag -
  8. -
  9. -thin_heap- -priority_queue - with Tag = thin_heap_tag -
  10. -
  11. -n_pq_vector- -std::priority_queue adapting std::vector
  12. -
  13. -binary_heap- -priority_queue - with Tag = binary_heap_tag -
  14. -
-
-
-
-
-
-
-
-
-
-
no image
NPM: Native and pb ds priority queue push timing test - msvc++

In the above figure, the names in the legends have the following meaning:

-
    -
  1. -rc_binomial_heap- -priority_queue - with Tag = rc_binomial_heap_tag -
  2. -
  3. -binomial_heap- -priority_queue - with Tag = binomial_heap_tag -
  4. -
  5. -pairing_heap- -priority_queue - with Tag = pairing_heap_tag -
  6. -
  7. -thin_heap- -priority_queue - with Tag = thin_heap_tag -
  8. -
  9. -n_pq_deque- -std::priority_queue adapting std::deque
  10. -
  11. -n_pq_vector- -std::priority_queue adapting std::vector
  12. -
  13. -binary_heap- -priority_queue - with Tag = binary_heap_tag -
  14. -
-
-
-
-
-
-
-
-
-
-
no image
NPL: Native and pb ds priority queue push timing test - local
-
-
-
-
-
-
-
-
-
no image
NBPG: Native and pb ds binary priority queue push timing test - g++

In the above figure, the names in the legends have the following meaning:

-
    -
  1. -n_pq_deque- -std::priority_queue adapting std::deque
  2. -
  3. -n_pq_vector- -std::priority_queue adapting std::vector
  4. -
  5. -binary_heap- -priority_queue - with Tag = binary_heap_tag -
  6. -
-
-
-
-
-
-
-
-
-
-
no image
NBPM: Native and pb ds binary priority queue push timing test - msvc++

In the above figure, the names in the legends have the following meaning:

-
    -
  1. -n_pq_deque- -std::priority_queue adapting std::deque
  2. -
  3. -n_pq_vector- -std::priority_queue adapting std::vector
  4. -
  5. -binary_heap- -priority_queue - with Tag = binary_heap_tag -
  6. -
-
-
-
-
-
-
-
-
-
-
no image
NBPL: Native and pb ds binary priority queue push timing test - local
-
-
-
-
-

Observations

-

Binary heaps are the most suited for sequences of - push and pop operations of primitive types - (e.g. ints). They are less constrained - than any other type, and since it is very efficient to store - such types in arrays, they outperform even pairing heaps. (See - Priority - Queue Text push Timing Test for the case of - non-primitive types.)

-

Priority-Queue - Performance Tests::Observations discusses this further and - summarizes.

-
- - diff --git a/libstdc++-v3/docs/html/ext/pb_ds/priority_queue_random_int_push_timing_test_gcc.png b/libstdc++-v3/docs/html/ext/pb_ds/priority_queue_random_int_push_timing_test_gcc.png deleted file mode 100644 index ee8c9b7d9a9..00000000000 Binary files a/libstdc++-v3/docs/html/ext/pb_ds/priority_queue_random_int_push_timing_test_gcc.png and /dev/null differ diff --git a/libstdc++-v3/docs/html/ext/pb_ds/priority_queue_random_int_push_timing_test_local.png b/libstdc++-v3/docs/html/ext/pb_ds/priority_queue_random_int_push_timing_test_local.png deleted file mode 100644 index dead185fa4f..00000000000 Binary files a/libstdc++-v3/docs/html/ext/pb_ds/priority_queue_random_int_push_timing_test_local.png and /dev/null differ diff --git a/libstdc++-v3/docs/html/ext/pb_ds/priority_queue_random_int_push_timing_test_msvc.png b/libstdc++-v3/docs/html/ext/pb_ds/priority_queue_random_int_push_timing_test_msvc.png deleted file mode 100644 index 0a1a8eaefbc..00000000000 Binary files a/libstdc++-v3/docs/html/ext/pb_ds/priority_queue_random_int_push_timing_test_msvc.png and /dev/null differ diff --git a/libstdc++-v3/docs/html/ext/pb_ds/priority_queue_tag.html b/libstdc++-v3/docs/html/ext/pb_ds/priority_queue_tag.html deleted file mode 100644 index 4bad6ee6e82..00000000000 --- a/libstdc++-v3/docs/html/ext/pb_ds/priority_queue_tag.html +++ /dev/null @@ -1,47 +0,0 @@ - - - - - - - priority_queue_tag Interface - - - - -
-

priority_queue_tag Interface

- -

Basic priority-queue data structure tag.

- -

Defined in: tag_and_trait.hpp

- -

Base Classes

- - - - - - - - - - - - - -
ClassDerivation Type
-
-container_tag
-
-
-

public

-
-
- - diff --git a/libstdc++-v3/docs/html/ext/pb_ds/priority_queue_tag_cd.png b/libstdc++-v3/docs/html/ext/pb_ds/priority_queue_tag_cd.png deleted file mode 100644 index ed8d875f0f8..00000000000 Binary files a/libstdc++-v3/docs/html/ext/pb_ds/priority_queue_tag_cd.png and /dev/null differ diff --git a/libstdc++-v3/docs/html/ext/pb_ds/priority_queue_tag_cd.svg b/libstdc++-v3/docs/html/ext/pb_ds/priority_queue_tag_cd.svg deleted file mode 100644 index be007aecb8d..00000000000 --- a/libstdc++-v3/docs/html/ext/pb_ds/priority_queue_tag_cd.svg +++ /dev/null @@ -1,368 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - Benjamin Kosnik - - - - - - - - - pairing_heap_tag - bionomial_heap_tag - - priority_queue_tag - - - rc_binomial_heap_tag - - binary_heap_tag - - - thin_heap_tag - - - - diff --git a/libstdc++-v3/docs/html/ext/pb_ds/priority_queue_text_join_timing_test.html b/libstdc++-v3/docs/html/ext/pb_ds/priority_queue_text_join_timing_test.html deleted file mode 100644 index 4710ea96bcf..00000000000 --- a/libstdc++-v3/docs/html/ext/pb_ds/priority_queue_text_join_timing_test.html +++ /dev/null @@ -1,141 +0,0 @@ - - - - - -Priority Queue Text Join Timing Test - - - -
-

Priority Queue Text join Timing Test

-

Description

-

This test inserts a number of values with keys from an - arbitrary text ([ wickland96thirty ]) into - two containers, then merges the containers. It uses - join for pb_ds's priority queues; for the - STL's priority queues, it successively pops values from one - container and pushes them into the other. The test measures the - average time as a function of the number of values.

-

(The test was executed with priority_queue_text_join_timing_test - thirty_years_among_the_dead_preproc.txt 200 200 2100)

-

Purpose

-

The test checks the effect of different underlying - data structures (see Design::Priority - Queues::Implementations).

-

Results

-

Figures NPG, NPM, and - NPL show the results for the native priority - queues and pb_ds 's priority queues in g++, msvc, and local, - respectively.

-
-
-
-
-
no image
NPG: Native tree and pb ds priority queue push timing test - g++

In the above figure, the names in the legends have the following meaning:

-
    -
  1. -n_pq_deque- -std::priority_queue adapting std::deque
  2. -
  3. -n_pq_vector- -std::priority_queue adapting std::vector
  4. -
  5. -binary_heap- -priority_queue - with Tag = binary_heap_tag -
  6. -
  7. -thin_heap- -priority_queue - with Tag = thin_heap_tag -
  8. -
  9. -rc_binomial_heap- -priority_queue - with Tag = rc_binomial_heap_tag -
  10. -
  11. -pairing_heap- -priority_queue - with Tag = pairing_heap_tag -
  12. -
  13. -binomial_heap- -priority_queue - with Tag = binomial_heap_tag -
  14. -
-
-
-
-
-
-
-
-
-
-
no image
NPM: Native tree and pb ds priority queue push timing test - msvc++

In the above figure, the names in the legends have the following meaning:

-
    -
  1. -n_pq_deque- -std::priority_queue adapting std::deque
  2. -
  3. -n_pq_vector- -std::priority_queue adapting std::vector
  4. -
  5. -binary_heap- -priority_queue - with Tag = binary_heap_tag -
  6. -
  7. -thin_heap- -priority_queue - with Tag = thin_heap_tag -
  8. -
  9. -rc_binomial_heap- -priority_queue - with Tag = rc_binomial_heap_tag -
  10. -
  11. -pairing_heap- -priority_queue - with Tag = pairing_heap_tag -
  12. -
  13. -binomial_heap- -priority_queue - with Tag = binomial_heap_tag -
  14. -
-
-
-
-
-
-
-
-
-
-
no image
NPL: Native tree and pb ds priority queue push timing test - local
-
-
-
-
-

Observations

-

In this test the node-based heaps perform join in - either logarithmic or constant time. The binary heap requires - linear time, since the well-known heapify algorithm [clrs2001] is linear.

-

It would be possible to apply the heapify algorithm to the - STL containers, if they would support iteration (which they - don't). Barring iterators, it is still somehow possible to - perform linear-time merge on a std::vector-based STL - priority queue, using top() and size() (since - they are enough to expose the underlying array), but this is - impossible for a std::deque-based STL priority queue. - Without heapify, the cost is super-linear.

-
- - diff --git a/libstdc++-v3/docs/html/ext/pb_ds/priority_queue_text_join_timing_test_gcc.png b/libstdc++-v3/docs/html/ext/pb_ds/priority_queue_text_join_timing_test_gcc.png deleted file mode 100644 index a48bb358605..00000000000 Binary files a/libstdc++-v3/docs/html/ext/pb_ds/priority_queue_text_join_timing_test_gcc.png and /dev/null differ diff --git a/libstdc++-v3/docs/html/ext/pb_ds/priority_queue_text_join_timing_test_local.png b/libstdc++-v3/docs/html/ext/pb_ds/priority_queue_text_join_timing_test_local.png deleted file mode 100644 index 1701b4d8a61..00000000000 Binary files a/libstdc++-v3/docs/html/ext/pb_ds/priority_queue_text_join_timing_test_local.png and /dev/null differ diff --git a/libstdc++-v3/docs/html/ext/pb_ds/priority_queue_text_join_timing_test_msvc.png b/libstdc++-v3/docs/html/ext/pb_ds/priority_queue_text_join_timing_test_msvc.png deleted file mode 100644 index 0575b99c0c3..00000000000 Binary files a/libstdc++-v3/docs/html/ext/pb_ds/priority_queue_text_join_timing_test_msvc.png and /dev/null differ diff --git a/libstdc++-v3/docs/html/ext/pb_ds/priority_queue_text_modify_down_timing_test.html b/libstdc++-v3/docs/html/ext/pb_ds/priority_queue_text_modify_down_timing_test.html deleted file mode 100644 index 6935957207c..00000000000 --- a/libstdc++-v3/docs/html/ext/pb_ds/priority_queue_text_modify_down_timing_test.html +++ /dev/null @@ -1,204 +0,0 @@ - - - - - -Priority Queue Text Modify (Down) Timing Test - - - -
-

Priority Queue Text modify Timing Test - II

-

Description

-

This test inserts a number of values with keys from an - arbitrary text ([ wickland96thirty ]) into - into a container then modifies each one "down" (i.e., it - makes it smaller). It uses modify for pb_ds's - priority queues; for the STL's priority queues, it pops values - from a container until it reaches the value that should be - modified, then pushes values back in. It measures the average - time for modify as a function of the number of - values.

-

(The test was executed with priority_queue_text_modify_down_timing_test - thirty_years_among_the_dead_preproc.txt 200 200 2100 f)

-

Purpose

-

The main purpose of this test is to contrast Priority Queue - Text modify Timing Test - I.

-

Results

-

Figures NPG, NPM, and - NPL show the results for the native priority - queues and pb_ds 's priority queues in g++, msvc++, and - local, - respectively; Figures NRTG, NRTM, and NRTL show the results - for the pairing heap and thin heaps in g++, msvc++, and - local, - respectively,

-
-
-
-
-
no image
NPG: Native and pb ds priority queue modify timing test - g++

In the above figure, the names in the legends have the following meaning:

-
    -
  1. -n_pq_deque- -std::priority_queue adapting std::deque
  2. -
  3. -n_pq_vector- -std::priority_queue adapting std::vector
  4. -
  5. -binary_heap- -priority_queue - with Tag = binary_heap_tag -
  6. -
  7. -thin_heap- -priority_queue - with Tag = thin_heap_tag -
  8. -
  9. -rc_binomial_heap- -priority_queue - with Tag = rc_binomial_heap_tag -
  10. -
  11. -binomial_heap- -priority_queue - with Tag = binomial_heap_tag -
  12. -
  13. -pairing_heap- -priority_queue - with Tag = pairing_heap_tag -
  14. -
-
-
-
-
-
-
-
-
-
-
no image
NPM: Native and pb ds priority queue modify timing test - msvc++

In the above figure, the names in the legends have the following meaning:

-
    -
  1. -n_pq_deque- -std::priority_queue adapting std::deque
  2. -
  3. -n_pq_vector- -std::priority_queue adapting std::vector
  4. -
  5. -binary_heap- -priority_queue - with Tag = binary_heap_tag -
  6. -
  7. -thin_heap- -priority_queue - with Tag = thin_heap_tag -
  8. -
  9. -rc_binomial_heap- -priority_queue - with Tag = rc_binomial_heap_tag -
  10. -
  11. -binomial_heap- -priority_queue - with Tag = binomial_heap_tag -
  12. -
  13. -pairing_heap- -priority_queue - with Tag = pairing_heap_tag -
  14. -
-
-
-
-
-
-
-
-
-
-
no image
NPL: Native and pb ds priority queue modify timing test - local
-
-
-
-
-
-
-
-
-
no image
NRTG: Pairing and thin priority queue modify timing test - g++

In the above figure, the names in the legends have the following meaning:

-
    -
  1. -thin_heap- -priority_queue - with Tag = thin_heap_tag -
  2. -
  3. -pairing_heap- -priority_queue - with Tag = pairing_heap_tag -
  4. -
-
-
-
-
-
-
-
-
-
-
no image
NRTM: Pairing and thin priority queue modify timing test - msvc++

In the above figure, the names in the legends have the following meaning:

-
    -
  1. -thin_heap- -priority_queue - with Tag = thin_heap_tag -
  2. -
  3. -pairing_heap- -priority_queue - with Tag = pairing_heap_tag -
  4. -
-
-
-
-
-
-
-
-
-
-
no image
NRTL: Pairing and thin priority queue modify timing test - local
-
-
-
-
-

Observations

-

Most points in these results are similar to Priority Queue - Text modify Timing Test - I.

-

It is interesting to note, however, that as opposed to that - test, a thin heap (priority_queue with - Tag = thin_heap_tag) is - outperformed by a pairing heap (priority_queue with - Tag = pairing_heap_tag). - In this case, both heaps essentially perform an erase - operation followed by a push operation. As the other - tests show, a pairing heap is usually far more efficient than a - thin heap, so this is not surprising.

-

Most algorithms that involve priority queues increase values - (in the sense of the priority queue's comparison functor), and - so Priority Queue - Text modify Timing Test - I is more interesting - than this test.

-
- - diff --git a/libstdc++-v3/docs/html/ext/pb_ds/priority_queue_text_modify_down_timing_test_gcc.png b/libstdc++-v3/docs/html/ext/pb_ds/priority_queue_text_modify_down_timing_test_gcc.png deleted file mode 100644 index 74cbc652369..00000000000 Binary files a/libstdc++-v3/docs/html/ext/pb_ds/priority_queue_text_modify_down_timing_test_gcc.png and /dev/null differ diff --git a/libstdc++-v3/docs/html/ext/pb_ds/priority_queue_text_modify_down_timing_test_local.png b/libstdc++-v3/docs/html/ext/pb_ds/priority_queue_text_modify_down_timing_test_local.png deleted file mode 100644 index 2fa9c798804..00000000000 Binary files a/libstdc++-v3/docs/html/ext/pb_ds/priority_queue_text_modify_down_timing_test_local.png and /dev/null differ diff --git a/libstdc++-v3/docs/html/ext/pb_ds/priority_queue_text_modify_down_timing_test_msvc.png b/libstdc++-v3/docs/html/ext/pb_ds/priority_queue_text_modify_down_timing_test_msvc.png deleted file mode 100644 index 20b66373667..00000000000 Binary files a/libstdc++-v3/docs/html/ext/pb_ds/priority_queue_text_modify_down_timing_test_msvc.png and /dev/null differ diff --git a/libstdc++-v3/docs/html/ext/pb_ds/priority_queue_text_modify_down_timing_test_pairing_thin_gcc.png b/libstdc++-v3/docs/html/ext/pb_ds/priority_queue_text_modify_down_timing_test_pairing_thin_gcc.png deleted file mode 100644 index ca901831eff..00000000000 Binary files a/libstdc++-v3/docs/html/ext/pb_ds/priority_queue_text_modify_down_timing_test_pairing_thin_gcc.png and /dev/null differ diff --git a/libstdc++-v3/docs/html/ext/pb_ds/priority_queue_text_modify_down_timing_test_pairing_thin_local.png b/libstdc++-v3/docs/html/ext/pb_ds/priority_queue_text_modify_down_timing_test_pairing_thin_local.png deleted file mode 100644 index 977d167186c..00000000000 Binary files a/libstdc++-v3/docs/html/ext/pb_ds/priority_queue_text_modify_down_timing_test_pairing_thin_local.png and /dev/null differ diff --git a/libstdc++-v3/docs/html/ext/pb_ds/priority_queue_text_modify_down_timing_test_pairing_thin_msvc.png b/libstdc++-v3/docs/html/ext/pb_ds/priority_queue_text_modify_down_timing_test_pairing_thin_msvc.png deleted file mode 100644 index bf68bf99292..00000000000 Binary files a/libstdc++-v3/docs/html/ext/pb_ds/priority_queue_text_modify_down_timing_test_pairing_thin_msvc.png and /dev/null differ diff --git a/libstdc++-v3/docs/html/ext/pb_ds/priority_queue_text_modify_up_timing_test.html b/libstdc++-v3/docs/html/ext/pb_ds/priority_queue_text_modify_up_timing_test.html deleted file mode 100644 index 3db4639baa6..00000000000 --- a/libstdc++-v3/docs/html/ext/pb_ds/priority_queue_text_modify_up_timing_test.html +++ /dev/null @@ -1,222 +0,0 @@ - - - - - -Priority Queue Text Modify (Up) Timing Test - - - -
-

Priority Queue Text modify Timing Test - I

-

Description

-

This test inserts a number of values with keys from an - arbitrary text ([ wickland96thirty ]) into - into a container then modifies each one "up" (i.e., it - makes it larger). It uses modify for pb_ds's - priority queues; for the STL's priority queues, it pops values - from a container until it reaches the value that should be - modified, then pushes values back in. It measures the average - time for modify as a function of the number of - values.

-

(The test was executed with priority_queue_text_modify_up_timing_test - thirty_years_among_the_dead_preproc.txt 200 200 2100 t)

-

Purpose

-

The test checks the effect of different underlying - data structures (see Design::Priority - Queues::Implementations) for graph algorithms settings. - Note that making an arbitrary value larger (in the sense of the - priority queue's comparison functor) corresponds to - decrease-key in standard graph algorithms [clrs2001].

-

Results

-

Figures NPG, NPM, and - NPL show the results for the native priority - queues and pb_ds 's priority queues in g++, msvc++, and - local, - respectively; Figures NRTG, NRTM, and NRTL show the results - for the pairing heap and thin heaps in g++, msvc++, and - local, - respectively,

-
-
-
-
-
no image
NPG: Native and pb ds priority queue modify timing test - g++

In the above figure, the names in the legends have the following meaning:

-
    -
  1. -n_pq_deque- -std::priority_queue adapting std::deque
  2. -
  3. -n_pq_vector- -std::priority_queue adapting std::vector
  4. -
  5. -binary_heap- -priority_queue - with Tag = binary_heap_tag -
  6. -
  7. -rc_binomial_heap- -priority_queue - with Tag = rc_binomial_heap_tag -
  8. -
  9. -pairing_heap- -priority_queue - with Tag = pairing_heap_tag -
  10. -
  11. -binomial_heap- -priority_queue - with Tag = binomial_heap_tag -
  12. -
  13. -thin_heap- -priority_queue - with Tag = thin_heap_tag -
  14. -
-
-
-
-
-
-
-
-
-
-
no image
NPM: Native and pb ds priority queue modify timing test - msvc++

In the above figure, the names in the legends have the following meaning:

-
    -
  1. -n_pq_deque- -std::priority_queue adapting std::deque
  2. -
  3. -n_pq_vector- -std::priority_queue adapting std::vector
  4. -
  5. -binary_heap- -priority_queue - with Tag = binary_heap_tag -
  6. -
  7. -rc_binomial_heap- -priority_queue - with Tag = rc_binomial_heap_tag -
  8. -
  9. -pairing_heap- -priority_queue - with Tag = pairing_heap_tag -
  10. -
  11. -binomial_heap- -priority_queue - with Tag = binomial_heap_tag -
  12. -
  13. -thin_heap- -priority_queue - with Tag = thin_heap_tag -
  14. -
-
-
-
-
-
-
-
-
-
-
no image
NPL: Native and pb ds priority queue modify timing test - local
-
-
-
-
-
-
-
-
-
no image
NRTG: Pairing and thin priority queue modify timing test - g++

In the above figure, the names in the legends have the following meaning:

-
    -
  1. -pairing_heap- -priority_queue - with Tag = pairing_heap_tag -
  2. -
  3. -thin_heap- -priority_queue - with Tag = thin_heap_tag -
  4. -
-
-
-
-
-
-
-
-
-
-
no image
NRTM: Pairing and thin priority queue modify timing test - msvc++

In the above figure, the names in the legends have the following meaning:

-
    -
  1. -pairing_heap- -priority_queue - with Tag = pairing_heap_tag -
  2. -
  3. -thin_heap- -priority_queue - with Tag = thin_heap_tag -
  4. -
-
-
-
-
-
-
-
-
-
-
no image
NRTL: Pairing and thin priority queue modify timing test - local
-
-
-
-
-

Observations

-

As noted above, increasing an arbitrary value (in the sense - of the priority queue's comparison functor) is very common in - graph-related algorithms. In this case, a thin heap (priority_queue with - Tag = thin_heap_tag) - outperforms a pairing heap (priority_queue with - Tag = pairing_heap_tag). - Conversely, Priority Queue Text - push Timing Test, Priority Queue - Text push and pop Timing Test, Priority - Queue Random Integer push Timing Test, and - Priority - Queue Random Integer push and pop Timing - Test show that the situation is reversed for other - operations. It is not clear when to prefer one of these two - different types.

-

In this test pb_ds's binary heaps effectively - perform modify in linear time. As explained in Priority Queue Design::Traits, - given a valid point-type iterator, a binary heap can perform - modify logarithmically. The problem is that binary - heaps invalidate their find iterators with each modifying - operation, and so the only way to obtain a valid point-type - iterator is to iterate using a range-type iterator until - finding the appropriate value, then use the range-type iterator - for the modify operation.

-

The explanation for the STL's priority queues' performance - is similar to that in Priority Queue Text - join Timing Test.

-

Priority-Queue - Performance Tests::Observations discusses this further and - summarizes.

-
- - diff --git a/libstdc++-v3/docs/html/ext/pb_ds/priority_queue_text_modify_up_timing_test_gcc.png b/libstdc++-v3/docs/html/ext/pb_ds/priority_queue_text_modify_up_timing_test_gcc.png deleted file mode 100644 index d9dedc20cf4..00000000000 Binary files a/libstdc++-v3/docs/html/ext/pb_ds/priority_queue_text_modify_up_timing_test_gcc.png and /dev/null differ diff --git a/libstdc++-v3/docs/html/ext/pb_ds/priority_queue_text_modify_up_timing_test_local.png b/libstdc++-v3/docs/html/ext/pb_ds/priority_queue_text_modify_up_timing_test_local.png deleted file mode 100644 index 31575b452d3..00000000000 Binary files a/libstdc++-v3/docs/html/ext/pb_ds/priority_queue_text_modify_up_timing_test_local.png and /dev/null differ diff --git a/libstdc++-v3/docs/html/ext/pb_ds/priority_queue_text_modify_up_timing_test_msvc.png b/libstdc++-v3/docs/html/ext/pb_ds/priority_queue_text_modify_up_timing_test_msvc.png deleted file mode 100644 index 4005547c812..00000000000 Binary files a/libstdc++-v3/docs/html/ext/pb_ds/priority_queue_text_modify_up_timing_test_msvc.png and /dev/null differ diff --git a/libstdc++-v3/docs/html/ext/pb_ds/priority_queue_text_modify_up_timing_test_pairing_thin_gcc.png b/libstdc++-v3/docs/html/ext/pb_ds/priority_queue_text_modify_up_timing_test_pairing_thin_gcc.png deleted file mode 100644 index 1aa5aba94bf..00000000000 Binary files a/libstdc++-v3/docs/html/ext/pb_ds/priority_queue_text_modify_up_timing_test_pairing_thin_gcc.png and /dev/null differ diff --git a/libstdc++-v3/docs/html/ext/pb_ds/priority_queue_text_modify_up_timing_test_pairing_thin_local.png b/libstdc++-v3/docs/html/ext/pb_ds/priority_queue_text_modify_up_timing_test_pairing_thin_local.png deleted file mode 100644 index b878dde665c..00000000000 Binary files a/libstdc++-v3/docs/html/ext/pb_ds/priority_queue_text_modify_up_timing_test_pairing_thin_local.png and /dev/null differ diff --git a/libstdc++-v3/docs/html/ext/pb_ds/priority_queue_text_modify_up_timing_test_pairing_thin_msvc.png b/libstdc++-v3/docs/html/ext/pb_ds/priority_queue_text_modify_up_timing_test_pairing_thin_msvc.png deleted file mode 100644 index 740594384cb..00000000000 Binary files a/libstdc++-v3/docs/html/ext/pb_ds/priority_queue_text_modify_up_timing_test_pairing_thin_msvc.png and /dev/null differ diff --git a/libstdc++-v3/docs/html/ext/pb_ds/priority_queue_text_pop_mem_usage_test.html b/libstdc++-v3/docs/html/ext/pb_ds/priority_queue_text_pop_mem_usage_test.html deleted file mode 100644 index 8b5388e1770..00000000000 --- a/libstdc++-v3/docs/html/ext/pb_ds/priority_queue_text_pop_mem_usage_test.html +++ /dev/null @@ -1,143 +0,0 @@ - - - - - -Priority Queue Text Pop Memory Use Test - - - -
-

Priority Queue Text pop Memory Use Test

-

Description

-

This test inserts a number of values with keys from an - arbitrary text ([ wickland96thirty ]) into - a container, then pops them until only one is left in the - container. It measures the memory use as a function of the - number of values pushed to the container.

-

(The test was executed with priority_queue_text_pop_mem_usage_test - thirty_years_among_the_dead_preproc.txt 200 200 2100)

-

Purpose

-

The test checks the effect of different underlying - data structures (see Design::Priority - Queues::Implementations).

-

Results

-

Figures NPG, NPM, and - NPL show the results for the native priority - queues and pb_ds 's priority queues in g++, msvc++, and - local, - respectively.

-
-
-
-
-
no image
NPG: Native and pb ds priority queue pop memory-use test - g++

In the above figure, the names in the legends have the following meaning:

-
    -
  1. -n_pq_vector- -std::priority_queue adapting std::vector
  2. -
  3. -n_pq_deque- -std::priority_queue adapting std::deque
  4. -
  5. -binary_heap- -priority_queue - with Tag = binary_heap_tag -
  6. -
  7. -thin_heap- -priority_queue - with Tag = thin_heap_tag -
  8. -
  9. -binomial_heap- -priority_queue - with Tag = binomial_heap_tag -
  10. -
  11. -rc_binomial_heap- -priority_queue - with Tag = rc_binomial_heap_tag -
  12. -
  13. -pairing_heap- -priority_queue - with Tag = pairing_heap_tag -
  14. -
-
-
-
-
-
-
-
-
-
-
no image
NPM: Native and pb ds priority queue pop memory-use test - msvc++

In the above figure, the names in the legends have the following meaning:

-
    -
  1. -n_pq_vector- -std::priority_queue adapting std::vector
  2. -
  3. -n_pq_deque- -std::priority_queue adapting std::deque
  4. -
  5. -binary_heap- -priority_queue - with Tag = binary_heap_tag -
  6. -
  7. -thin_heap- -priority_queue - with Tag = thin_heap_tag -
  8. -
  9. -binomial_heap- -priority_queue - with Tag = binomial_heap_tag -
  10. -
  11. -rc_binomial_heap- -priority_queue - with Tag = rc_binomial_heap_tag -
  12. -
  13. -pairing_heap- -priority_queue - with Tag = pairing_heap_tag -
  14. -
-
-
-
-
-
-
-
-
-
-
no image
NPL: Native and pb ds priority queue pop memory-use test - local
-
-
-
-
-

Observations

-

The priority queue implementations (excluding the STL's) use - memory proportionally to the number of values they hold: - node-based implementations (e.g., a pairing heap) do so - naturally; pb_ds's binary heap de-allocates memory when - a certain lower threshold is exceeded.

-

Note from Priority Queue - Text push and pop Timing Test and - Priority - Queue Random Integer push and pop Timing - Test that this does not impede performance compared to the - STL's priority queues.

-

(See Hash-Based Erase - Memory Use Test for a similar phenomenon regarding priority - queues.)

-
- - diff --git a/libstdc++-v3/docs/html/ext/pb_ds/priority_queue_text_pop_mem_usage_test_gcc.png b/libstdc++-v3/docs/html/ext/pb_ds/priority_queue_text_pop_mem_usage_test_gcc.png deleted file mode 100644 index 2c1918d0623..00000000000 Binary files a/libstdc++-v3/docs/html/ext/pb_ds/priority_queue_text_pop_mem_usage_test_gcc.png and /dev/null differ diff --git a/libstdc++-v3/docs/html/ext/pb_ds/priority_queue_text_pop_mem_usage_test_local.png b/libstdc++-v3/docs/html/ext/pb_ds/priority_queue_text_pop_mem_usage_test_local.png deleted file mode 100644 index c1413fc93d6..00000000000 Binary files a/libstdc++-v3/docs/html/ext/pb_ds/priority_queue_text_pop_mem_usage_test_local.png and /dev/null differ diff --git a/libstdc++-v3/docs/html/ext/pb_ds/priority_queue_text_pop_mem_usage_test_msvc.png b/libstdc++-v3/docs/html/ext/pb_ds/priority_queue_text_pop_mem_usage_test_msvc.png deleted file mode 100644 index 9717f498b7a..00000000000 Binary files a/libstdc++-v3/docs/html/ext/pb_ds/priority_queue_text_pop_mem_usage_test_msvc.png and /dev/null differ diff --git a/libstdc++-v3/docs/html/ext/pb_ds/priority_queue_text_push_pop_timing_test.html b/libstdc++-v3/docs/html/ext/pb_ds/priority_queue_text_push_pop_timing_test.html deleted file mode 100644 index 02fe32183a4..00000000000 --- a/libstdc++-v3/docs/html/ext/pb_ds/priority_queue_text_push_pop_timing_test.html +++ /dev/null @@ -1,209 +0,0 @@ - - - - - -Priority Queue Text Push Pop Timing Test - - - -
-

Priority Queue Text push and pop Timing - Test

-

Description

-

This test inserts a number of values with keys from an - arbitrary text ([ wickland96thirty ]) into - a container using push , then removes them using - pop . It measures the average time for push - as a function of the number of values.

-

(The test was executed with - priority_queue_text_push_pop_timing_test - thirty_years_among_the_dead_preproc.txt 200 200 2100)

-

Purpose

-

The test checks the effect of different underlying - data structures (see Design::Priority - Queues::Implementations).

-

Results

-

Figures NPG, NPM, and - NPL show the results for the native priority - queues and pb_ds 's priority queues in g++, msvc++, and - local, - respectively; Figures NBRG, NBRM, and NBRL show the results - for the native priority queues and pb_ds's pairing - queues in g++, msvc++, and - local, - respectively.

-
-
-
-
-
no image
NPG: Native tree and pb ds priority queue push and pop timing test - g++

In the above figure, the names in the legends have the following meaning:

-
    -
  1. -n_pq_vector- -std::priority_queue adapting std::vector
  2. -
  3. -n_pq_deque- -std::priority_queue adapting std::deque
  4. -
  5. -thin_heap- -priority_queue - with Tag = thin_heap_tag -
  6. -
  7. -rc_binomial_heap- -priority_queue - with Tag = rc_binomial_heap_tag -
  8. -
  9. -binomial_heap- -priority_queue - with Tag = binomial_heap_tag -
  10. -
  11. -binary_heap- -priority_queue - with Tag = binary_heap_tag -
  12. -
  13. -pairing_heap- -priority_queue - with Tag = pairing_heap_tag -
  14. -
-
-
-
-
-
-
-
-
-
-
no image
NPM: Native tree and pb ds priority queue push and pop timing test - msvc++

In the above figure, the names in the legends have the following meaning:

-
    -
  1. -n_pq_deque- -std::priority_queue adapting std::deque
  2. -
  3. -n_pq_vector- -std::priority_queue adapting std::vector
  4. -
  5. -thin_heap- -priority_queue - with Tag = thin_heap_tag -
  6. -
  7. -rc_binomial_heap- -priority_queue - with Tag = rc_binomial_heap_tag -
  8. -
  9. -binomial_heap- -priority_queue - with Tag = binomial_heap_tag -
  10. -
  11. -pairing_heap- -priority_queue - with Tag = pairing_heap_tag -
  12. -
  13. -binary_heap- -priority_queue - with Tag = binary_heap_tag -
  14. -
-
-
-
-
-
-
-
-
-
-
no image
NPL: Native tree and pb ds priority queue push and pop timing test - local
-
-
-
-
-
-
-
-
-
no image
NBRG: Native tree and pb ds pairing priority queue push and pop timing test - g++

In the above figure, the names in the legends have the following meaning:

-
    -
  1. -n_pq_vector- -std::priority_queue adapting std::vector
  2. -
  3. -n_pq_deque- -std::priority_queue adapting std::deque
  4. -
  5. -pairing_heap- -priority_queue - with Tag = pairing_heap_tag -
  6. -
-
-
-
-
-
-
-
-
-
-
no image
NBRM: Native tree and pb ds pairing priority queue push and pop timing test - msvc++

In the above figure, the names in the legends have the following meaning:

-
    -
  1. -n_pq_deque- -std::priority_queue adapting std::deque
  2. -
  3. -n_pq_vector- -std::priority_queue adapting std::vector
  4. -
  5. -pairing_heap- -priority_queue - with Tag = pairing_heap_tag -
  6. -
-
-
-
-
-
-
-
-
-
-
no image
NBRL: Native tree and pb ds pairing priority queue push and pop timing test - local
-
-
-
-
-

Observations

-

These results are very similar to Priority Queue Text - push Timing Test. As stated there, pairing heaps - (priority_queue with - Tag = pairing_heap_tag) - are most suited for push and pop sequences of - non-primitive types such as strings. Observing these two tests, - one can note that a pairing heap outperforms the others in - terms of push operations, but equals binary heaps - (priority_queue with - Tag = binary_heap_tag) if - the number of push and pop operations is - equal. As the number of pop operations is at most - equal to the number of push operations, pairing heaps - are better in this case. See Priority - Queue Random Integer push and pop Timing - Test for a case which is different.

-

Priority-Queue - Performance Tests::Observations discusses this further and - summarizes.

-
- - diff --git a/libstdc++-v3/docs/html/ext/pb_ds/priority_queue_text_push_pop_timing_test_gcc.png b/libstdc++-v3/docs/html/ext/pb_ds/priority_queue_text_push_pop_timing_test_gcc.png deleted file mode 100644 index d4886ae5967..00000000000 Binary files a/libstdc++-v3/docs/html/ext/pb_ds/priority_queue_text_push_pop_timing_test_gcc.png and /dev/null differ diff --git a/libstdc++-v3/docs/html/ext/pb_ds/priority_queue_text_push_pop_timing_test_local.png b/libstdc++-v3/docs/html/ext/pb_ds/priority_queue_text_push_pop_timing_test_local.png deleted file mode 100644 index a7c5f8987ae..00000000000 Binary files a/libstdc++-v3/docs/html/ext/pb_ds/priority_queue_text_push_pop_timing_test_local.png and /dev/null differ diff --git a/libstdc++-v3/docs/html/ext/pb_ds/priority_queue_text_push_pop_timing_test_msvc.png b/libstdc++-v3/docs/html/ext/pb_ds/priority_queue_text_push_pop_timing_test_msvc.png deleted file mode 100644 index a5720402b3b..00000000000 Binary files a/libstdc++-v3/docs/html/ext/pb_ds/priority_queue_text_push_pop_timing_test_msvc.png and /dev/null differ diff --git a/libstdc++-v3/docs/html/ext/pb_ds/priority_queue_text_push_timing_test.html b/libstdc++-v3/docs/html/ext/pb_ds/priority_queue_text_push_timing_test.html deleted file mode 100644 index 67ae4b9d510..00000000000 --- a/libstdc++-v3/docs/html/ext/pb_ds/priority_queue_text_push_timing_test.html +++ /dev/null @@ -1,219 +0,0 @@ - - - - - -Priority Queue Text Push Timing Test - - - -
-

Priority Queue Text push Timing Test

-

Description

-

This test inserts a number of values with keys from an - arbitrary text ([ wickland96thirty ]) into - a container using push . It measures the average time - for push as a function of the number of values - pushed.

-

(The test was executed with priority_queue_text_push_timing_test - thirty_years_among_the_dead_preproc.txt 200 200 2100)

-

Purpose

-

The test checks the effect of different underlying - data structures (see Design::Priority - Queues::Implementations).

-

Results

-

Figures NPG, NPM, and - NPL show the results for the native priority - queues and pb_ds 's priority queues in g++, msvc++, and - local, - respectively; Figures NBRG, NBRM, and NBRL shows the - results for the binary-heap based native priority queues and - pb_ds's pairing-heap priority queues in g++, msvc++, and - local, - respectively

-
-
-
-
-
no image
NPG: Native and pb ds priority queue push timing test - g++

In the above figure, the names in the legends have the following meaning:

-
    -
  1. -n_pq_vector- -std::priority_queue adapting std::vector
  2. -
  3. -n_pq_deque- -std::priority_queue adapting std::deque
  4. -
  5. -binary_heap- -priority_queue - with Tag = binary_heap_tag -
  6. -
  7. -rc_binomial_heap- -priority_queue - with Tag = rc_binomial_heap_tag -
  8. -
  9. -thin_heap- -priority_queue - with Tag = thin_heap_tag -
  10. -
  11. -binomial_heap- -priority_queue - with Tag = binomial_heap_tag -
  12. -
  13. -pairing_heap- -priority_queue - with Tag = pairing_heap_tag -
  14. -
-
-
-
-
-
-
-
-
-
-
no image
NPM: Native and pb ds priority queue push timing test - msvc++

In the above figure, the names in the legends have the following meaning:

-
    -
  1. -n_pq_deque- -std::priority_queue adapting std::deque
  2. -
  3. -rc_binomial_heap- -priority_queue - with Tag = rc_binomial_heap_tag -
  4. -
  5. -binary_heap- -priority_queue - with Tag = binary_heap_tag -
  6. -
  7. -binomial_heap- -priority_queue - with Tag = binomial_heap_tag -
  8. -
  9. -n_pq_vector- -std::priority_queue adapting std::vector
  10. -
  11. -pairing_heap- -priority_queue - with Tag = pairing_heap_tag -
  12. -
  13. -thin_heap- -priority_queue - with Tag = thin_heap_tag -
  14. -
-
-
-
-
-
-
-
-
-
-
no image
NPL: Native and pb ds priority queue push timing test - local
-
-
-
-
-
-
-
-
-
no image
NBRG: Native and pb ds pairing priority queue push timing test - g++

In the above figure, the names in the legends have the following meaning:

-
    -
  1. -n_pq_vector- -std::priority_queue adapting std::vector
  2. -
  3. -n_pq_deque- -std::priority_queue adapting std::deque
  4. -
  5. -thin_heap- -priority_queue - with Tag = thin_heap_tag -
  6. -
  7. -pairing_heap- -priority_queue - with Tag = pairing_heap_tag -
  8. -
-
-
-
-
-
-
-
-
-
-
no image
NBRM: Native and pb ds pairing priority queue push timing test - msvc++

In the above figure, the names in the legends have the following meaning:

-
    -
  1. -n_pq_deque- -std::priority_queue adapting std::deque
  2. -
  3. -n_pq_vector- -std::priority_queue adapting std::vector
  4. -
  5. -pairing_heap- -priority_queue - with Tag = pairing_heap_tag -
  6. -
  7. -thin_heap- -priority_queue - with Tag = thin_heap_tag -
  8. -
-
-
-
-
-
-
-
-
-
-
no image
NBRL: Native and pb ds pairing priority queue push timing test - local
-
-
-
-
-

Observations

-

Pairing heaps (priority_queue with - Tag = pairing_heap_tag) - are the most suited for sequences of push and - pop operations of non-primitive types (e.g. -std::strings). (see also Priority Queue - Text push and pop Timing Test.) They are - less constrained than binomial heaps, e.g., and since - they are node-based, they outperform binary heaps. (See - Priority - Queue Random Integer push Timing Test for the case - of primitive types.)

-

The STL's priority queues do not seem to perform well in - this case: the std::vector implementation needs to - perform a logarithmic sequence of string operations for each - operation, and the deque implementation is possibly hampered by - its need to manipulate a relatively-complex type (deques - support a O(1) push_front, even though it is - not used by std::priority_queue.)

-

Priority-Queue - Performance Tests::Observations discusses this further and - summarizes.

-
- - diff --git a/libstdc++-v3/docs/html/ext/pb_ds/priority_queue_text_push_timing_test_gcc.png b/libstdc++-v3/docs/html/ext/pb_ds/priority_queue_text_push_timing_test_gcc.png deleted file mode 100644 index 8895f507cfc..00000000000 Binary files a/libstdc++-v3/docs/html/ext/pb_ds/priority_queue_text_push_timing_test_gcc.png and /dev/null differ diff --git a/libstdc++-v3/docs/html/ext/pb_ds/priority_queue_text_push_timing_test_local.png b/libstdc++-v3/docs/html/ext/pb_ds/priority_queue_text_push_timing_test_local.png deleted file mode 100644 index da7297bffa9..00000000000 Binary files a/libstdc++-v3/docs/html/ext/pb_ds/priority_queue_text_push_timing_test_local.png and /dev/null differ diff --git a/libstdc++-v3/docs/html/ext/pb_ds/priority_queue_text_push_timing_test_msvc.png b/libstdc++-v3/docs/html/ext/pb_ds/priority_queue_text_push_timing_test_msvc.png deleted file mode 100644 index ff39ca37dd9..00000000000 Binary files a/libstdc++-v3/docs/html/ext/pb_ds/priority_queue_text_push_timing_test_msvc.png and /dev/null differ diff --git a/libstdc++-v3/docs/html/ext/pb_ds/quadratic_probe_fn.html b/libstdc++-v3/docs/html/ext/pb_ds/quadratic_probe_fn.html deleted file mode 100644 index f3209d33881..00000000000 --- a/libstdc++-v3/docs/html/ext/pb_ds/quadratic_probe_fn.html +++ /dev/null @@ -1,141 +0,0 @@ - - - - - - - quadratic_probe_fn Interface - - - - -
-

quadratic_probe_fn Interface

- -

A probe sequence policy using square increments.

- -

Defined in: hash_policy.hpp

- -

Template Parameters

- - - - - - - - - - - - - - - - - -
ParameterDescriptionDefault Value
-
-typename Size_Type 
-
-
-

Size type.

-
size_t
- -

Public Types and - Constants

- -

General Definitions

- - - - - - - - - - - - - - - - - -
TypeDefinitionDescription
-
-size_type
-
-
-
-Size_Type
-
-
-

Size type.

-
- -

Public Methods

- -

Constructors, Destructor, and - Related

- - - - - - - - - - - - - -
MethodDescription
-
-void
-  swap
-  (quadratic_probe_fn &other)
-
-
-

Swaps content.

-
- -

Protected Methods

- -

Offset Methods

- - - - - - - - - - - - - -
MethodDescription
-
-inline size_type
-  operator()
-  (size_type i) const
-
-
-

Returns the i-th - offset from the hash value.

-
-
- - diff --git a/libstdc++-v3/docs/html/ext/pb_ds/random_int_find_find_timing_test_tree_gcc.png b/libstdc++-v3/docs/html/ext/pb_ds/random_int_find_find_timing_test_tree_gcc.png deleted file mode 100644 index 61962704f71..00000000000 Binary files a/libstdc++-v3/docs/html/ext/pb_ds/random_int_find_find_timing_test_tree_gcc.png and /dev/null differ diff --git a/libstdc++-v3/docs/html/ext/pb_ds/random_int_find_find_timing_test_tree_local.png b/libstdc++-v3/docs/html/ext/pb_ds/random_int_find_find_timing_test_tree_local.png deleted file mode 100644 index 83105202a48..00000000000 Binary files a/libstdc++-v3/docs/html/ext/pb_ds/random_int_find_find_timing_test_tree_local.png and /dev/null differ diff --git a/libstdc++-v3/docs/html/ext/pb_ds/random_int_find_find_timing_test_tree_msvc.png b/libstdc++-v3/docs/html/ext/pb_ds/random_int_find_find_timing_test_tree_msvc.png deleted file mode 100644 index 2206cef5a90..00000000000 Binary files a/libstdc++-v3/docs/html/ext/pb_ds/random_int_find_find_timing_test_tree_msvc.png and /dev/null differ diff --git a/libstdc++-v3/docs/html/ext/pb_ds/range_invalidation_guarantee.html b/libstdc++-v3/docs/html/ext/pb_ds/range_invalidation_guarantee.html deleted file mode 100644 index e59a257a540..00000000000 --- a/libstdc++-v3/docs/html/ext/pb_ds/range_invalidation_guarantee.html +++ /dev/null @@ -1,52 +0,0 @@ - - - - - - - range_invalidation_guarantee Interface - - - - -
-

range_invalidation_guarantee Interface

- -

Signifies an invalidation guarantee that includes all those - of its base, and additionally, that any range-type iterator - (including the returns of begin() and end()) is in the correct - relative positions to other range-type iterators as long as its - corresponding entry has not be erased, regardless of - modifications to the container object.

- -

Defined in: tag_and_trait.hpp

- -

Base Classes

- - - - - - - - - - - - - -
ClassDerivation Type
-
-point_invalidation_guarantee
-
-
-

public

-
-
- - diff --git a/libstdc++-v3/docs/html/ext/pb_ds/rationale_null_node_updator.png b/libstdc++-v3/docs/html/ext/pb_ds/rationale_null_node_updator.png deleted file mode 100644 index 43874891517..00000000000 Binary files a/libstdc++-v3/docs/html/ext/pb_ds/rationale_null_node_updator.png and /dev/null differ diff --git a/libstdc++-v3/docs/html/ext/pb_ds/rb_tree_tag.html b/libstdc++-v3/docs/html/ext/pb_ds/rb_tree_tag.html deleted file mode 100644 index 600235d5e8d..00000000000 --- a/libstdc++-v3/docs/html/ext/pb_ds/rb_tree_tag.html +++ /dev/null @@ -1,47 +0,0 @@ - - - - - - - rb_tree_tag Interface - - - - -
-

rb_tree_tag Interface

- -

Red-black tree data structure tag.

- -

Defined in: tag_and_trait.hpp

- -

Base Classes

- - - - - - - - - - - - - -
ClassDerivation Type
-
-tree_tag
-
-
-

public

-
-
- - diff --git a/libstdc++-v3/docs/html/ext/pb_ds/rc_binomial_heap_tag.html b/libstdc++-v3/docs/html/ext/pb_ds/rc_binomial_heap_tag.html deleted file mode 100644 index 46106f4c585..00000000000 --- a/libstdc++-v3/docs/html/ext/pb_ds/rc_binomial_heap_tag.html +++ /dev/null @@ -1,47 +0,0 @@ - - - - - - - rc_binomial_heap_tag Interface - - - - -
-

rc_binomial_heap_tag Interface

- -

Redundant-counter binomial-heap data structure tag.

- -

Defined in: tag_and_trait.hpp

- -

Base Classes

- - - - - - - - - - - - - -
ClassDerivation Type
-
-priority_queue_tag
-
-
-

public

-
-
- - diff --git a/libstdc++-v3/docs/html/ext/pb_ds/references.html b/libstdc++-v3/docs/html/ext/pb_ds/references.html deleted file mode 100644 index b96827bd37a..00000000000 --- a/libstdc++-v3/docs/html/ext/pb_ds/references.html +++ /dev/null @@ -1,258 +0,0 @@ - - - - - - - References - - - - -
-

References

- -
    -
  1. [abrahams97exception] Dave Abrahams, - STL Exception Handling Contract, - http://anubis.dkuug.dk/jtc1/sc22/wg21/docs/papers/1997/N1075.pdf
  2. - -
  3. [alexandrescu01modern] Andrei - Alexandrescu, Modern C++ Design: Generic Programming and - Design Patterns Applied, Addison-Wesley Publishing - Company, 2001
  4. - -
  5. [andrew04mtf] - K. Andrew and D. Gleich, "MTF, Bit, and COMB: A Guide to - Deterministic and Randomized Algorithms for the List Update - Problem"
  6. - -
  7. [austern00noset] Matthew Austern, "Why - You shouldn't use set - and What You Should Use - Instead", C++ Report, April, 2000
  8. - -
  9. [austern01htprop] Matthew Austern, "A - Proposal to Add Hashtables to the Standard Library", - http://anubis.dkuug.dk/jtc1/sc22/wg21/docs/papers/2001/n1326l.html
  10. - -
  11. [austern98segmented] Matthew Austern, - "Segmented iterators and hierarchical algorithms", Generic - Programming, April 1998, pp. 80-90
  12. - -
  13. [boost_timer], - "Boost timer library", http://www.boost.org by Beman - Dawes
  14. - -
  15. [boost_pool], - "Boost pool library", http://www.boost.org by Stephen - Cleary
  16. - -
  17. [boost_type_traits], "Boost - type_traits library", http://www.boost.org by John - Maddock, Steve Cleary, et. al.
  18. - -
  19. [brodal96priority] Gerth Stolting - Brodal, Worst-case - efficient priority queues
  20. - -
  21. [bulka99efficient] D. Bulka, and D. - Mayhew, "Efficient C++ Programming Techniques.", - Addison-Wesley Publishing Company, Addison-Wesley, 1997
  22. - -
  23. [clrs2001] T. H. - Cormen, C. E., Leiserson, R. L. Rivest, C. and Stein, - "Introduction to Algorithms, 2nd ed.", MIT Press, 2001
  24. - -
  25. [dinkumware_stl], "Dinkumware C++ Library - Reference", http://www.dinkumware.com/htm_cpl/index.html
  26. - -
  27. [dubhashi98neg] D. Dubashi, and D. Ranjan, - "Balls and bins: A study in negative dependence.", Random - Structures and Algorithms 13, 2 (1998), 99-124
  28. - -
  29. [fagin79extendible] R. Fagin, J. - Nievergelt, N. Pippenger, and H. R. Strong, "Extendible - hashing - a fast access method for dynamic files", ACM Trans. - Database Syst. 4, 3 (1979), 315-344
  30. - -
  31. [filliatre2000ptset], J. C. - Filliatre, "Ptset: Sets of integers implemented as Patricia - trees", http://www.lri.fr/~filliatr/ftp/ocaml/misc/ptset.ml
  32. - -
  33. [fredman86pairing], M. L. Fredman, R - Sedgewick, D. D. Sleator, R. E. Tarjan, The - pairing heap: a new form of self-adjusting heap
  34. - -
  35. [gamma95designpatterns] E. Gamma, - R. Helm, R. Johnson, and J. Vlissides, "Design Patterns - - Elements of Reusable Object-Oriented Software", - Addison-Wesley Publishing Company, Addison-Wesley, 1995
  36. - -
  37. [garg86order] - A. K. Garg and C. C. Gotlieb, "Order-preserving key - transformations", Trans. Database Syst. 11, 2 (1986), - 213-234
  38. - -
  39. [hyslop02making] J. Hyslop, and H. - Sutter, "Making a real hash of things", C++ Report, May - 2002
  40. - -
  41. [jossutis01stl] N. M. Jossutis, "The C++ - Standard Library - A Tutorial and Reference", Addison-Wesley - Publishing Company, Addison-Wesley, 2001
  42. - -
  43. [kt99fat_heas] Haim Kaplan and Robert E. - Tarjan, New - Heap Data Structures
  44. - -
  45. [kleft00sets] - Klaus Kleft and Angelika Langer, "Are Set Iterators Mutable - or Immutable?", C/C++ Users Jornal, October 2000
  46. - -
  47. [knuth98sorting] D. E. Knuth, "The Art of - Computer Programming - Sorting and Searching", Addison-Wesley - Publishing Company, Addison-Wesley, 1998
  48. - -
  49. [liskov98data] B. Liskov, "Data abstraction - and hierarchy", SIGPLAN Notices 23, 5 (May 1998)
  50. - -
  51. [litwin80lh] W. - Litwin, "Linear hashing: A new tool for file and table - addressing", Proceedings of International Conference on Very - Large Data Bases (June 1980), pp. 212-223
  52. - -
  53. [maverik_lowerbounds] Maverik Woo, - - Deamortization - Part 2: Binomial Heaps
  54. - -
  55. [metrowerks_stl], "Metrowerks CodeWarrior - Pro 7 MSL C++ Reference Manual",
  56. - -
  57. [meyers96more] S. Meyers, "More Effective - C++: 35 New Ways to Improve Your Programs and Designs - 2nd - ed.", Addison-Wesley Publishing Company, Addison-Wesley, - 1996
  58. - -
  59. [meyers00nonmember] S. Meyers, "How - Non-Member Functions Improve Encapsulation", C/C++ Users - Journal, 2000
  60. - -
  61. [meyers01stl] - S. Meyers, "Effective STL: 50 Specific Ways to Improve Your - Use of the Standard Template Library", Addison-Wesley - Publishing Company, Addison-Wesley, 2001
  62. - -
  63. [meyers02both] S. Meyers, "Class Template, - Member Template - or Both?", C/C++ Users Journal, 2003
  64. - -
  65. [motwani95random] R. Motwani, and P. - Raghavan, "Randomized Algorithms", Cambridge University - Press
  66. - -
  67. [mscom] COM: Component Model Object - Technologies
  68. - -
  69. [musser95rationale], David R. Musser, - "Rationale for Adding Hash Tables to the C++ Standard - Template Library"
  70. - -
  71. [musser96stltutorial] D. R. Musser - and A. Saini, "STL Tutorial and Reference Guide", - Addison-Wesley Publishing Company, Addison-Wesley, 1996
  72. - -
  73. [nelson96stlpql] Mark Nelson, Priority - Queues and the STL, Dr. Dobbs Journal, January, 1996
  74. - -
  75. [okasaki98mereable] C. Okasaki and A. - Gill, "Fast mergeable integer maps", In Workshop on ML, pages - 77--86, September 1998. 95
  76. - -
  77. [sgi_stl] SGI, - "Standard Template Library Programmer's Guide", http://www.sgi.com/tech/stl
  78. - -
  79. [select_man] - select - man page.
  80. - -
  81. [sleator84amortized] D. D. Sleator - and R. E. Tarjan, "Amortized Efficiency of List Update - Problems", ACM Symposium on Theory of Computing, 1984
  82. - -
  83. [sleator85self] D. D. Sleator and R. E. - Tarjan, "Self-Adjusting Binary Search Trees", ACM Symposium - on Theory of Computing, 1985
  84. - -
  85. [stepanov94standard] A. A. Stepanov - and M. Lee", "The Standard Template Library"
  86. - -
  87. [stroustrup97cpp] Bjarne Stroustrup, - The C++ Programming Langugage -3rd ed., Addison-Wesley - Publishing Company,Reading, MA, USA, 1997
  88. - -
  89. [vandevoorde2002cpptemplates] - D. Vandevoorde, and N. M. Josuttis, "C++ Templates: The - Complete Guide", Addison-Wesley Publishing Company, - Addison-Wesley, 2002
  90. - -
  91. [wickland96thirty] C. A. Wickland, - "Thirty Years Among the Dead", National Psychological - Institute, Los Angeles, 1996,http://myweb.wvnet.edu/gsa00121/books/amongdead30.zip
  92. -
-
-
- - diff --git a/libstdc++-v3/docs/html/ext/pb_ds/resize_error.html b/libstdc++-v3/docs/html/ext/pb_ds/resize_error.html deleted file mode 100644 index cb05b504fb9..00000000000 --- a/libstdc++-v3/docs/html/ext/pb_ds/resize_error.html +++ /dev/null @@ -1,50 +0,0 @@ - - - - - - -resize_error Interface - - - - -
-

resize_error Interface

- -

A container cannot be resized.

- -

Exception thrown when a size policy cannot supply an - adequate size for an external resize.

- -

Defined in: exception.hpp

- -

Base Classes

- - - - - - - - - - - - - -
ClassDerivation Type
-
-   resize_error
-   
-
-

public

-
-
- - diff --git a/libstdc++-v3/docs/html/ext/pb_ds/resize_policy_cd.png b/libstdc++-v3/docs/html/ext/pb_ds/resize_policy_cd.png deleted file mode 100644 index 338e33c15cc..00000000000 Binary files a/libstdc++-v3/docs/html/ext/pb_ds/resize_policy_cd.png and /dev/null differ diff --git a/libstdc++-v3/docs/html/ext/pb_ds/restoring_node_invariants.png b/libstdc++-v3/docs/html/ext/pb_ds/restoring_node_invariants.png deleted file mode 100644 index 33ba84bfe33..00000000000 Binary files a/libstdc++-v3/docs/html/ext/pb_ds/restoring_node_invariants.png and /dev/null differ diff --git a/libstdc++-v3/docs/html/ext/pb_ds/sample_probe_fn.html b/libstdc++-v3/docs/html/ext/pb_ds/sample_probe_fn.html deleted file mode 100644 index 3d18650c3b3..00000000000 --- a/libstdc++-v3/docs/html/ext/pb_ds/sample_probe_fn.html +++ /dev/null @@ -1,152 +0,0 @@ - - - - - - - sample_probe_fn Interface - - - - -
-

sample_probe_fn Interface

- -

A sample probe policy.

- -

This class serves to show the interface a probe functor - needs to support.

- -

Defined in: sample_probe_fn.hpp

- -

Public Types and - Constants

- -

General definitions.

- - - - - - - - - - - - - - - - - -
TypeDefinitionDescription
-
-size_type
-
-
-
-size_t, e.g.
-
-
-

Size type.

-
- -

Public Methods

- -

Constructors, destructor, and - related.

- - - - - - - - - - - - - - - - - - - - - - - - - -
MethodDescription
-
-  sample_probe_fn
-  ()
-
-
-

Default constructor.

- -

Must be default constructable.

-
-
-  sample_probe_fn
-  (const sample_probe_fn &other)
-
-
-

Copy constructor.

- -

Must be copy constructable.

-
-
-inline void
-  swap
-  (sample_probe_fn &other)
-
-
-

Swaps content.

- -

Must be swappable (if there is such a word).

-
- -

Protected Methods

- -

Offset methods.

- - - - - - - - - - - - - -
MethodDescription
-
-inline size_type
-  operator()
-  (const_key_reference r_key,
-    size_type i) const
-
-
-

Returns the i-th - offset from the hash value of some key r_key.

- -

size_type is the size type on which the - functor operates.

-
-
- - diff --git a/libstdc++-v3/docs/html/ext/pb_ds/sample_range_hashing.html b/libstdc++-v3/docs/html/ext/pb_ds/sample_range_hashing.html deleted file mode 100644 index 5b1a90023a2..00000000000 --- a/libstdc++-v3/docs/html/ext/pb_ds/sample_range_hashing.html +++ /dev/null @@ -1,172 +0,0 @@ - - - - - - - sample_range_hashing Interface - - - - -
-

sample_range_hashing Interface

- -

A sample range-hashing functor.

- -

This class serves to show the interface a range-hashing - functor needs to support.

- -

Defined in: sample_range_hashing.hpp

- -

Public Types and - Constants

- -

General definitions.

- - - - - - - - - - - - - - - - - -
TypeDefinitionDescription
-
-size_type
-
-
-
-size_t, e.g.
-
-
-

Size type.

-
- -

Public Methods

- -

Constructors, destructor, and - related.

- - - - - - - - - - - - - - - - - - - - - - - - - -
MethodDescription
-
-  sample_range_hashing
-  ()
-
-
-

Default constructor.

- -

Must be default constructable.

-
-
-  sample_range_hashing
-  (const sample_range_hashing &other)
-
-
-

Copy constructor.

- -

Must be copy constructable.

-
-
-inline void
-  swap
-  (sample_range_hashing &other)
-
-
-

Swaps content.

- -

Must be swappable (if there is such a word).

-
- -

Protected Methods

- -

Notification methods.

- - - - - - - - - - - - - -
MethodDescription
-
-void 
-  notify_resized
-  (size_type size)
-
-
-

Notifies the policy object that the container's size - has changed to size.

-
- -

Operators.

- - - - - - - - - - - - - -
MethodDescription
-
-inline size_type
-  operator()
-  (size_type hash) const
-
-
-

Transforms the hash value hash into a ranged-hash value.

-
-
- - diff --git a/libstdc++-v3/docs/html/ext/pb_ds/sample_ranged_hash_fn.html b/libstdc++-v3/docs/html/ext/pb_ds/sample_ranged_hash_fn.html deleted file mode 100644 index f8e47ab64c2..00000000000 --- a/libstdc++-v3/docs/html/ext/pb_ds/sample_ranged_hash_fn.html +++ /dev/null @@ -1,171 +0,0 @@ - - - - - - - sample_ranged_hash_fn Interface - - - - -
-

sample_ranged_hash_fn Interface

- -

A sample ranged-hash functor.

- -

This class serves to show the interface a ranged-hash - functor needs to support.

- -

Defined in: sample_ranged_hash_fn.hpp

- -

Public Types and - Constants

- -

General definitions.

- - - - - - - - - - - - - - - - - -
TypeDefinitionDescription
-
-size_type
-
-
-
-size_t, e.g.
-
-
-

Size type.

-
- -

Public Methods

- -

Constructors, destructor, and - related.

- - - - - - - - - - - - - - - - - - - - - - - - - -
MethodDescription
-
-  sample_ranged_hash_fn
-  ()
-
-
-

Default constructor.

- -

Must be default constructable.

-
-
-  sample_ranged_hash_fn
-  (const sample_ranged_hash_fn &other)
-
-
-

Copy constructor.

- -

Must be copy constructable.

-
-
-inline void
-  swap
-  (sample_ranged_hash_fn &other)
-
-
-

Swaps content.

- -

Must be swappable (if there is such a word).

-
- -

Protected Methods

- -

Notification methods.

- - - - - - - - - - - - - -
MethodDescription
-
-void 
-  notify_resized
-  (size_type size)
-
-
-

Notifies the policy object that the container's size - has changed to size.

-
- -

Operators.

- - - - - - - - - - - - - -
MethodDescription
-
-inline size_type 
-  operator()
-  (const_key_reference r_key) const
-
-
-

Transforms r_key into - a position within the table.

-
-
- - diff --git a/libstdc++-v3/docs/html/ext/pb_ds/sample_ranged_probe_fn.html b/libstdc++-v3/docs/html/ext/pb_ds/sample_ranged_probe_fn.html deleted file mode 100644 index b0e744cd331..00000000000 --- a/libstdc++-v3/docs/html/ext/pb_ds/sample_ranged_probe_fn.html +++ /dev/null @@ -1,178 +0,0 @@ - - - - - - - sample_ranged_probe_fn Interface - - - - -
-

sample_ranged_probe_fn Interface

- -

A sample ranged-probe functor.

- -

This class serves to show the interface a ranged-probe - functor needs to support.

- -

Defined in: sample_ranged_probe_fn.hpp

- -

Public Types and - Constants

- -

General definitions.

- - - - - - - - - - - - - - - - - -
TypeDefinitionDescription
-
-size_type
-
-
-
-size_t, e.g.
-
-
-

Size type.

-
- -

Public Methods

- -

Constructors, destructor, and - related.

- - - - - - - - - - - - - - - - - - - - - - - - - -
MethodDescription
-
-  sample_ranged_probe_fn
-  ()
-
-
-

Default constructor.

- -

Must be default constructable.

-
-
-  sample_ranged_probe_fn
-  (const sample_ranged_probe_fn &other)
-
-
-

Copy constructor.

- -

Must be copy constructable.

-
-
-inline void
-  swap
-  (sample_ranged_probe_fn &other)
-
-
-

Swaps content.

- -

Must be swappable (if there is such a word).

-
- -

Protected Methods

- -

Notification methods.

- - - - - - - - - - - - - -
MethodDescription
-
-void 
-  notify_resized
-  (size_type size)
-
-
-

Notifies the policy object that the container's size - has changed to size.

-
- -

Operators.

- - - - - - - - - - - - - -
MethodDescription
-
-inline size_type 
-  operator()
-  (const_key_reference r_key,
-    size_t hash,
-    size_type i) const
-
-
-

Transforms the const key reference - r_key into the i-th position within the table. This - method is called for - each collision within the probe sequence.

-
-
- - diff --git a/libstdc++-v3/docs/html/ext/pb_ds/sample_resize_policy.html b/libstdc++-v3/docs/html/ext/pb_ds/sample_resize_policy.html deleted file mode 100644 index 7807ace1daa..00000000000 --- a/libstdc++-v3/docs/html/ext/pb_ds/sample_resize_policy.html +++ /dev/null @@ -1,413 +0,0 @@ - - - - - - - sample_resize_policy Interface - - - - -
-

sample_resize_policy Interface

- -

A sample resize policy.

- -

This class serves to show the interface a resize policy - needs to support.

- -

Defined in: sample_resize_policy.hpp

- -

Public Types and - Constants

- -

General definitions.

- - - - - - - - - - - - - - - - - -
TypeDefinitionDescription
-
-size_type
-
-
-
-size_t, e.g.
-
-
-

Size type.

-
- -

Public Methods

- -

Constructors, destructor, and - related.

- - - - - - - - - - - - - - - - - - - - - - - - - -
MethodDescription
-
-  sample_resize_policy
-  ()
-
-
-

Default constructor.

- -

Must be default constructable.

-
-
-  sample_range_hashing
-  (const sample_resize_policy &other)
-
-
-

Copy constructor.

- -

Must be copy constructable.

-
-
-inline void
-  swap
-  (sample_resize_policy &other)
-
-
-

Swaps content.

- -

Must be swappable (if there is such a word).

-
- -

Protected Methods

- -

Insert search - notifications.

- -

Notifications called during an insert operation.

- - - - - - - - - - - - - - - - - - - - - - - - - -
MethodDescription
-
-inline void
-  notify_insert_search_start
-  ()
-
-
-

Notifies a search started.

-
-
-inline void
-  notify_insert_search_collision
-  ()
-
-
-

Notifies a search encountered a collision.

-
-
-inline void
-  notify_insert_search_end
-  ()
-
-
-

Notifies a search ended.

-
- -

Find search - notifications.

- -

Notifications called during a find operation.

- - - - - - - - - - - - - - - - - - - - - - - - - -
MethodDescription
-
-inline void
-  notify_find_search_start
-  ()
-
-
-

Notifies a search started.

-
-
-inline void
-  notify_find_search_collision
-  ()
-
-
-

Notifies a search encountered a collision.

-
-
-inline void
-  notify_find_search_end
-  ()
-
-
-

Notifies a search ended.

-
- -

Erase search - notifications.

- -

Notifications called during an insert operation.

- - - - - - - - - - - - - - - - - - - - - - - - - -
MethodDescription
-
-inline void
-  notify_erase_search_start
-  ()
-
-
-

Notifies a search started.

-
-
-inline void
-  notify_erase_search_collision
-  ()
-
-
-

Notifies a search encountered a collision.

-
-
-inline void
-  notify_erase_search_end
-  ()
-
-
-

Notifies a search ended.

-
- -

Content change - notifications.

- -

Notifications called when the content of the table changes - in a way that can affect the resize policy.

- - - - - - - - - - - - - - - - - - - - - - - - - -
MethodDescription
-
-inline void
-  notify_inserted
-  (size_type num_e)
-
-
-

Notifies an element was inserted.

-
-
-inline void
-  notify_erased
-  (size_type num_e)
-
-
-

Notifies an element was erased.

-
-
-void 
-  notify_cleared
-  ()
-
-
-

Notifies the table was cleared.

-
- -

Size change - notifications.

- -

Notifications called when the table changes size.

- - - - - - - - - - - - - -
MethodDescription
-
-void
-  notify_resized
-  (size_type new_size)
-
-
-

Notifies the table was resized to new_size.

-
- -

Queries.

- -

Called to query whether/how to resize.

- - - - - - - - - - - - - - - - - - - -
MethodDescription
-
-inline bool
-  is_resize_needed
-  () const
-
-
-

Queries whether a resize is needed.

-
-
-size_type
-  get_new_size
-  (size_type size, 
-    size_type num_used_e) const
-
-
-

Queries what the new size should be.

-
-
- - diff --git a/libstdc++-v3/docs/html/ext/pb_ds/sample_resize_trigger.html b/libstdc++-v3/docs/html/ext/pb_ds/sample_resize_trigger.html deleted file mode 100644 index d7042bc2c23..00000000000 --- a/libstdc++-v3/docs/html/ext/pb_ds/sample_resize_trigger.html +++ /dev/null @@ -1,462 +0,0 @@ - - - - - - - sample_resize_trigger Interface - - - - -
-

sample_resize_trigger Interface

- -

A sample resize trigger policy.

- -

This class serves to show the interface a trigger policy - needs to support.

- -

Defined in: - sample_resize_trigger.hpp

- -

Public Types and - Constants

- -

General definitions.

- - - - - - - - - - - - - - - - - -
TypeDefinitionDescription
-
-size_type
-
-
-
-size_t, e.g.
-
-
-

Size type.

-
- -

Public Methods

- -

Constructors, destructor, and - related.

- - - - - - - - - - - - - - - - - - - - - - - - - -
MethodDescription
-
-  sample_resize_trigger
-  ()
-
-
-

Default constructor.

- -

Must be default constructable.

-
-
-  sample_range_hashing
-  (const sample_resize_trigger &other)
-
-
-

Copy constructor.

- -

Must be copy constructable.

-
-
-inline void
-  swap
-  (sample_resize_trigger &other)
-
-
-

Swaps content.

- -

Must be swappable (if there is such a word).

-
- -

Protected Methods

- -

Insert search - notifications.

- -

Notifications called during an insert operation.

- - - - - - - - - - - - - - - - - - - - - - - - - -
MethodDescription
-
-inline void
-  notify_insert_search_start
-  ()
-
-
-

Notifies a search started.

-
-
-inline void
-  notify_insert_search_collision
-  ()
-
-
-

Notifies a search encountered a collision.

-
-
-inline void
-  notify_insert_search_end
-  ()
-
-
-

Notifies a search ended.

-
- -

Find search - notifications.

- -

Notifications called during a find operation.

- - - - - - - - - - - - - - - - - - - - - - - - - -
MethodDescription
-
-inline void
-  notify_find_search_start
-  ()
-
-
-

Notifies a search started.

-
-
-inline void
-  notify_find_search_collision
-  ()
-
-
-

Notifies a search encountered a collision.

-
-
-inline void
-  notify_find_search_end
-  ()
-
-
-

Notifies a search ended.

-
- -

Erase search - notifications.

- -

Notifications called during an insert operation.

- - - - - - - - - - - - - - - - - - - - - - - - - -
MethodDescription
-
-inline void
-  notify_erase_search_start
-  ()
-
-
-

Notifies a search started.

-
-
-inline void
-  notify_erase_search_collision
-  ()
-
-
-

Notifies a search encountered a collision.

-
-
-inline void
-  notify_erase_search_end
-  ()
-
-
-

Notifies a search ended.

-
- -

Content change - notifications.

- -

Notifications called when the content of the table changes - in a way that can affect the resize policy.

- - - - - - - - - - - - - - - - - - - - - - - - - -
MethodDescription
-
-inline void
-  notify_inserted
-  (size_type num_entries)
-
-
-

Notifies an element was inserted. the total number of - entries in the table is num_entries.

-
-
-inline void
-  notify_erased
-  (size_type num_entries)
-
-
-

Notifies an element was erased.

-
-
-void 
-  notify_cleared
-  ()
-
-
-

Notifies the table was cleared.

-
- -

Size change - notifications.

- -

Notifications called when the table changes size.

- - - - - - - - - - - - - - - - - - - -
MethodDescription
-
-void
-  notify_resized
-  (size_type new_size)
-
-
-

Notifies the table was resized as a result of this - object's signifying that a resize is needed.

-
-
-void
-  notify_externally_resized
-  (size_type new_size)
-
-
-

Notifies the table was resized externally.

-
- -

Queries.

- -

Called to query whether/how to resize.

- - - - - - - - - - - - - - - - - - - -
MethodDescription
-
-inline bool 
-  is_resize_needed
-  () const
-
-
-

Queries whether a resize is needed.

-
-
-inline bool
-  is_grow_needed
-  (size_type size, 
-    size_type num_entries) const
-
-
-

Queries whether a grow is needed.

- -

This method is called only if this object indicated - resize is needed. The actual size of the table is size, and the number of entries in - it is num_entries.

-
- -

Private Methods

- -

Overrides.

- - - - - - - - - - - - - -
MethodDescription
-
-virtual void
-  do_resize
-  (size_type new_size)
-
-
-

Resizes to new_size.

-
-
- - diff --git a/libstdc++-v3/docs/html/ext/pb_ds/sample_size_policy.html b/libstdc++-v3/docs/html/ext/pb_ds/sample_size_policy.html deleted file mode 100644 index e7f58e7e4c4..00000000000 --- a/libstdc++-v3/docs/html/ext/pb_ds/sample_size_policy.html +++ /dev/null @@ -1,163 +0,0 @@ - - - - - - - sample_size_policy Interface - - - - -
-

sample_size_policy Interface

- -

A sample size policy.

- -

This class serves to show the interface a size policy needs - to support.

- -

Defined in: sample_size_policy.hpp

- -

Public Types and - Constants

- -

General definitions.

- - - - - - - - - - - - - - - - - -
TypeDefinitionDescription
-
-size_type
-
-
-
-size_t, e.g.
-
-
-

Size type.

-
- -

Public Methods

- -

Constructors, destructor, and - related.

- - - - - - - - - - - - - - - - - - - - - - - - - -
MethodDescription
-
-  sample_size_policy
-  ()
-
-
-

Default constructor.

- -

Must be default constructable.

-
-
-  sample_range_hashing
-  (const sample_size_policy &other)
-
-
-

Copy constructor.

- -

Must be copy constructable.

-
-
-inline void
-  swap
-  (sample_size_policy &other)
-
-
-

Swaps content.

- -

Must be swappable (if there is such a word).

-
- -

Protected Methods

- -

Size methods

- - - - - - - - - - - - - - - - - - - -
MethodDescription
-
-inline size_type
-  get_nearest_larger_size
-  (size_type size) const
-
-
-

Given a size size, - returns a size that is larger.

-
-
-inline size_type
-  get_nearest_smaller_size
-  (size_type size) const
-
-
-

Given a size size, - returns a size that is smaller.

-
-
- - diff --git a/libstdc++-v3/docs/html/ext/pb_ds/sample_tree_node_update.html b/libstdc++-v3/docs/html/ext/pb_ds/sample_tree_node_update.html deleted file mode 100644 index 2cfab0a24f3..00000000000 --- a/libstdc++-v3/docs/html/ext/pb_ds/sample_tree_node_update.html +++ /dev/null @@ -1,193 +0,0 @@ - - - - - - - sample_tree_node_update Interface - - - - -
-

sample_tree_node_update Interface

- -

A sample node updater.

- -

This class serves to show the interface a node update - functor needs to support.

- -

Defined in: - sample_tree_node_update.hpp

- -

Template Parameters

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ParameterDescriptionDefault Value
-
-class Const_Node_Iterator
-
-
-

Const node iterator type.

-
-
-
-class Node_Iterator
-
-
-

Node iterator type.

-
-
-
-class Cmp_Fn
-
-
-

Comparison functor.

-
-
-
-class Allocator
-
-
-

Allocator type.

-
-
- -

Public Types and - Constants

- -

Metadata definitions.

- - - - - - - - - - - - - - - - - -
TypeDefinitionDescription
-
-metadata_type
-
-
-
-size_t
-
-
-

Metadata type.

- -

This can be any type; size_t is merely an example.

-
- -

Protected Methods

- -

Conclassors, declassor, and - related.

- - - - - - - - - - - - - -
MethodDescription
-
-  sample_tree_node_update
-  ()
-
-
-

Default constructor.

- -

Must be default constructable.

-
- -

Operators.

- - - - - - - - - - - - - -
MethodDescription
-
-inline void
-  operator()
-  (node_iterator node_it,
-    const_node_iterator end_nd_it) const
-
-
-

Updates the rank of a node through a node_iterator node_it; end_nd_it is the end node - iterator.

-
-
- - diff --git a/libstdc++-v3/docs/html/ext/pb_ds/sample_trie_e_access_traits.html b/libstdc++-v3/docs/html/ext/pb_ds/sample_trie_e_access_traits.html deleted file mode 100644 index b663e508758..00000000000 --- a/libstdc++-v3/docs/html/ext/pb_ds/sample_trie_e_access_traits.html +++ /dev/null @@ -1,231 +0,0 @@ - - - - - - - sample_trie_e_access_traits Interface - - - - -
-

sample_trie_e_access_traits Interface

- -

A sample trie element-access traits.

- -

This class serves to show the interface an element- access - traits class needs to support.

- -

Defined in: - sample_trie_e_access_traits.hpp

- -

Public Types and - Constants

- -

General definitions.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
TypeDefinitionDescription
-
-size_type
-
-
-
-size_t, e.g.
-
-
-

Size type.

-
-
-key_type
-
-
-
-std::string, e.g.
-
-
-

Key type.

-
-
-const_key_reference
-
-
-
-const string &, e.g.
-
-
-

Const key reference type.

-
- -

Element definitions.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
TypeDefinitionDescription
-
-const_iterator
-
-
-
-string::const_iterator, e.g.
-
-
-

Element const iterator type.

-
-
-e_type
-
-
-
-char, e.g.
-
-
-

Element type.

-
-
-max_size
-
-
-
-4, e.g.
-
-
-

Number of distinct elements.

-
- -

Public Methods

- -

Access methods.

- - - - - - - - - - - - - - - - - - - - - - - - - -
MethodDescription
-
-inline static const_iterator
-  begin
-  (const_key_reference r_key)
-
-
-

Returns a const_iterator to - the first element of r_key.

-
-
-inline static const_iterator
-  end
-  (const_key_reference r_key)
-
-
-

Returns a const_iterator to - the after-last element of r_key.

-
-
-inline static size_type
-  e_pos
-  (e_type e)
-
-
-

Maps an element to a - position.

-
-
- - diff --git a/libstdc++-v3/docs/html/ext/pb_ds/sample_trie_node_update.html b/libstdc++-v3/docs/html/ext/pb_ds/sample_trie_node_update.html deleted file mode 100644 index beab37cd9cd..00000000000 --- a/libstdc++-v3/docs/html/ext/pb_ds/sample_trie_node_update.html +++ /dev/null @@ -1,194 +0,0 @@ - - - - - - - sample_trie_node_update Interface - - - - -
-

sample_trie_node_update Interface

- -

A sample node updater.

- -

This class serves to show the interface a node update - functor needs to support.

- -

Defined in: - sample_trie_node_update.hpp

- -

Template Parameters

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ParameterDescriptionDefault Value
-
-class Const_Node_Iterator
-
-
-

Const node iterator type.

-
-
-
-class Node_Iterator
-
-
-

Node iterator type.

-
-
-
-class E_Access_Traits
-
-
-

Comparison functor.

-
-
-
-class Allocator
-
-
-

Allocator type.

-
-
- -

Public Types and - Constants

- -

Metadata definitions.

- - - - - - - - - - - - - - - - - -
TypeDefinitionDescription
-
-metadata_type
-
-
-
-size_t
-
-
-

Metadata type.

- -

This can be any type; size_t is merely an example.

-
- -

Protected Methods

- -

Conclassors, declassor, and - related.

- - - - - - - - - - - - - -
MethodDescription
-
-  sample_trie_node_update
-  ()
-
-
-

Default constructor.

- -

Must be default constructable.

-
- -

Operators.

- - - - - - - - - - - - - -
MethodDescription
-
-inline void
-  operator()
-  (node_iterator node_it,
-    const_node_iterator end_nd_it) const
-
-
-

Updates the rank of a node through a node_iterator node_it; end_nd_it is the end node - iterator.

-
-
- - diff --git a/libstdc++-v3/docs/html/ext/pb_ds/sample_update_policy.html b/libstdc++-v3/docs/html/ext/pb_ds/sample_update_policy.html deleted file mode 100644 index f671bcdc25a..00000000000 --- a/libstdc++-v3/docs/html/ext/pb_ds/sample_update_policy.html +++ /dev/null @@ -1,178 +0,0 @@ - - - - - - - sample_update_policy Interface - - - - -
-

sample_update_policy Interface

- -

A sample list-update policy.

- -

This class serves to show the interface a list update - functor needs to support.

- -

Defined in: sample_update_policy.hpp

- -

Public Methods

- -

Constructors, destructor, and - related.

- - - - - - - - - - - - - - - - - - - - - - - - - -
MethodDescription
-
-  sample_update_policy
-  ()
-
-
-

Default constructor.

- -

Must be default constructable.

-
-
-  sample_update_policy
-  (const sample_update_policy &other)
-
-
-

Copy constructor.

- -

Must be copy constructable.

-
-
-inline void
-  swap
-  (sample_update_policy &other)
-
-
-

Swaps content.

- -

Must be swappable (if there is such a word).

-
- -

Protected Types and - Constants

- -

Metadata definitions.

- - - - - - - - - - - - - - - - - -
TypeDefinitionDescription
-
-metadata_type
-
-
-
-Some metadata type.
-
-
-

Metadata on which this functor operates.

- -

The class must declare the metadata - type on which it operates; the list-update based - containers will append to each node an object of this - type.

-
- -

Protected Methods

- -

Metadata operations.

- - - - - - - - - - - - - - - - - - - -
MethodDescription
-
-metadata_type
-  operator()
-  () const
-
-
-

Creates a metadata object.

- -

A list-update based container object will call this - method to create a metadata type when a node is - created.

-
-
-bool 
-  operator()
-  (metadata_reference r_data) const
-
-
-

Decides whether a metadata object should be moved to - the front of the list. A list-update based containers - object will call this method to decide whether to move a - node to the front of the list. The method should return - true if the node should be moved to the - front of the list.

- -

metadata_reference is a reference to a - metadata_type.

-
-
- - diff --git a/libstdc++-v3/docs/html/ext/pb_ds/simple_list.png b/libstdc++-v3/docs/html/ext/pb_ds/simple_list.png deleted file mode 100644 index 9a05d3f5e4f..00000000000 Binary files a/libstdc++-v3/docs/html/ext/pb_ds/simple_list.png and /dev/null differ diff --git a/libstdc++-v3/docs/html/ext/pb_ds/splay_tree_tag.html b/libstdc++-v3/docs/html/ext/pb_ds/splay_tree_tag.html deleted file mode 100644 index 98c56ce695f..00000000000 --- a/libstdc++-v3/docs/html/ext/pb_ds/splay_tree_tag.html +++ /dev/null @@ -1,47 +0,0 @@ - - - - - - - splay_tree_tag Interface - - - - -
-

splay_tree_tag Interface

- -

Splay tree data structure tag.

- -

Defined in: tag_and_trait.hpp

- -

Base Classes

- - - - - - - - - - - - - -
ClassDerivation Type
-
-tree_tag
-
-
-

public

-
-
- - diff --git a/libstdc++-v3/docs/html/ext/pb_ds/string_trie_e_access_traits.html b/libstdc++-v3/docs/html/ext/pb_ds/string_trie_e_access_traits.html deleted file mode 100644 index 10fa2af1c9d..00000000000 --- a/libstdc++-v3/docs/html/ext/pb_ds/string_trie_e_access_traits.html +++ /dev/null @@ -1,400 +0,0 @@ - - - - - - - string_trie_e_access_traits Interface - - - - -
-

string_trie_e_access_traits Interface

- -

Element access traits for string types.

- -

Defined in: trie_policy.hpp

- -

Template Parameters

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ParameterDescriptionDefault Value
-
-class String 
-
-
-

String type.

-
std::string
-
-typename String::value_type Min_E_Val 
-
-
-

Minimal element.

-
SCHAR_MIN
-
-typename String::value_type Max_E_Val 
-
-
-

Maximal element.

-
SCHAR_MAX
-
-bool Reverse 
-
-
-

Indicates whether reverse iteration should be - used.

-
false
-
-class Allocator 
-
-
-

Allocator type.

-
-
-std::allocator<char>
-
-
- -

Public Types and - Constants

- -

General Definitions

- - - - - - - - - - - - - - - - - -
TypeDefinitionDescription
-
-size_type
-
-
-
-typename Allocator::size_type
-
-
-

Size type.

-
- -

Key-Type Definitions

- - - - - - - - - - - - - - - - - - - - - - - - - -
TypeDefinitionDescription
-
-key_type
-
-
-
-String
-
-
-

Key type.

-
-
-const_key_reference
-
-
-
-typename Allocator::template rebind<
-    key_type>::other::const_reference
-
-
-

Const key reference type.

-
- -

Element-Type - Definitions

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
TypeDefinitionDescription
-
-reverse
-
-
-
-Reverse
-
-
-

Reverse - iteration indicator.

-
-
-const_iterator
-
-
-
-typename __gnu_pbds::detail::__conditional_type<
-    Reverse,
-    typename String::const_reverse_iterator,
-    typename String::const_iterator>::__type
-
-
-

Element const iterator type.

-
-
-e_type
-
-
-
-typename std::iterator_traits<const_iterator>::value_type
-
-
-

Element type.

-
-
-min_e_val
-
-
-
-Min_E_Val
-
-
-

Minimal element.

-
-
-max_e_val
-
-
-
-Max_E_Val
-
-
-

Maximal element.

-
-
-max_size
-
-
-
-max_e_val - min_e_val + 1
-
-
-

Number of distinct elements.

-
- -

Public Methods

- -

Access Methods

- - - - - - - - - - - - - - - - - - - - - - - - - -
MethodDescription
-
-inline static const_iterator
-  begin
-  (const_key_reference r_key)
-
-
-

Returns a const_iterator to - the first element of r_key.

-
-
-inline static const_iterator
-  end
-  (const_key_reference r_key)
-
-
-

Returns a const_iterator to - the after-last element of r_key.

-
-
-inline static size_type
-  e_pos
-  (e_type e)
-
-
-

Maps an eelement to a - position.

-
-
- - diff --git a/libstdc++-v3/docs/html/ext/pb_ds/tests.html b/libstdc++-v3/docs/html/ext/pb_ds/tests.html deleted file mode 100644 index ab5d54bb4ff..00000000000 --- a/libstdc++-v3/docs/html/ext/pb_ds/tests.html +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - Tests - - - - -
-

Tests

- -

Associative-Container Tests - describes tests for associative containers; Priority-Queue Tests describes tests for - priority queues.

-
- - diff --git a/libstdc++-v3/docs/html/ext/pb_ds/text_find_timing_test_hash_gcc.png b/libstdc++-v3/docs/html/ext/pb_ds/text_find_timing_test_hash_gcc.png deleted file mode 100644 index 59247ec6ad9..00000000000 Binary files a/libstdc++-v3/docs/html/ext/pb_ds/text_find_timing_test_hash_gcc.png and /dev/null differ diff --git a/libstdc++-v3/docs/html/ext/pb_ds/text_find_timing_test_hash_local.png b/libstdc++-v3/docs/html/ext/pb_ds/text_find_timing_test_hash_local.png deleted file mode 100644 index d85980f30fb..00000000000 Binary files a/libstdc++-v3/docs/html/ext/pb_ds/text_find_timing_test_hash_local.png and /dev/null differ diff --git a/libstdc++-v3/docs/html/ext/pb_ds/text_find_timing_test_hash_msvc.png b/libstdc++-v3/docs/html/ext/pb_ds/text_find_timing_test_hash_msvc.png deleted file mode 100644 index 227164568f5..00000000000 Binary files a/libstdc++-v3/docs/html/ext/pb_ds/text_find_timing_test_hash_msvc.png and /dev/null differ diff --git a/libstdc++-v3/docs/html/ext/pb_ds/text_find_timing_test_tree_like_gcc.png b/libstdc++-v3/docs/html/ext/pb_ds/text_find_timing_test_tree_like_gcc.png deleted file mode 100644 index 8b6c4f0f058..00000000000 Binary files a/libstdc++-v3/docs/html/ext/pb_ds/text_find_timing_test_tree_like_gcc.png and /dev/null differ diff --git a/libstdc++-v3/docs/html/ext/pb_ds/text_find_timing_test_tree_like_local.png b/libstdc++-v3/docs/html/ext/pb_ds/text_find_timing_test_tree_like_local.png deleted file mode 100644 index b7fdc474644..00000000000 Binary files a/libstdc++-v3/docs/html/ext/pb_ds/text_find_timing_test_tree_like_local.png and /dev/null differ diff --git a/libstdc++-v3/docs/html/ext/pb_ds/text_find_timing_test_tree_like_msvc.png b/libstdc++-v3/docs/html/ext/pb_ds/text_find_timing_test_tree_like_msvc.png deleted file mode 100644 index dc82a4e7e82..00000000000 Binary files a/libstdc++-v3/docs/html/ext/pb_ds/text_find_timing_test_tree_like_msvc.png and /dev/null differ diff --git a/libstdc++-v3/docs/html/ext/pb_ds/thin_heap_tag.html b/libstdc++-v3/docs/html/ext/pb_ds/thin_heap_tag.html deleted file mode 100644 index a8e9d4d721c..00000000000 --- a/libstdc++-v3/docs/html/ext/pb_ds/thin_heap_tag.html +++ /dev/null @@ -1,47 +0,0 @@ - - - - - - - thin_heap_tag Interface - - - - -
-

thin_heap_tag Interface

- -

Thin heap data structure tag.

- -

Defined in: tag_and_trait.hpp

- -

Base Classes

- - - - - - - - - - - - - -
ClassDerivation Type
-
-priority_queue_tag
-
-
-

public

-
-
- - diff --git a/libstdc++-v3/docs/html/ext/pb_ds/tree.html b/libstdc++-v3/docs/html/ext/pb_ds/tree.html deleted file mode 100644 index d836bda123b..00000000000 --- a/libstdc++-v3/docs/html/ext/pb_ds/tree.html +++ /dev/null @@ -1,516 +0,0 @@ - - - - - - - tree Interface - - - - -
-

tree Interface

- -

A concrete basic tree-based associative container.

- -

Defined in: assoc_container.hpp

- -

Template Parameters

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ParameterDescriptionDefault Value
-
-typename Key
-
-
-

Key type.

-
-
-
-typename Mapped
-
-
-

Mapped type.

-
-
-
-class Cmp_Fn 
-
-
-

Comparison functor.

-
-
-std::less<Key>
-
-
-
-class Tag 
-
-
-

Mapped-structure tag.

-
rb_tree_tag
-
-template< 
-  typename Const_Node_Iterator, 
-  typename Node_Iterator, 
-  class Cmp_Fn_, 
-  typename Allocator_>
-class Node_Update 
-
-
-

Node updater type.

- -

Design::Tree-Based - Containers::Node Invariants explains this - concept.

-
null_tree_node_update
-
-class Allocator 
-
-
-

Allocator type.

-
-
-std::allocator<char>
-
-
- -

Base Classes

- - - - - - - - - - - - - -
ClassDerivation Type
-
-basic_tree
-
-
-

public

-
- -

Public Types and - Constants

- -

Policy Definitions

- - - - - - - - - - - - - - - - - -
TypeDefinitionDescription
-
-cmp_fn
-
-
-
-Cmp_Fn
-
-
-

Comparison functor type.

-
- -

Iterator Definitions

- - - - - - - - - - - - - - - - - - - - - - - - - -
TypeDefinitionDescription
-
-const_node_iterator
-
-
-
-const_node_iterator
-
-
-

Const node iterator.

-
-
-node_iterator
-
-
-
-node_iterator
-
-
-

Node iterator.

-
- -

Public Methods

- -

Constructors, Destructor, and - Related

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
MethodDescription
-
-  tree
-  ()
-
-
-

Default constructor.

-
-
-  tree
-  (const cmp_fn &r_cmp_fn)
-
-
-

Constructor taking some policy objects. r_cmp_fn will be copied by the - Cmp_Fn object of the - container object.

-
-
-template<
-    class It>
-  tree
-  (It first_it, 
-    It last_it)
-
-
-

Constructor taking iterators to a range of - value_types. The value_types between first_it and last_it will be inserted into the - container object.

-
-
-template<
-    class It>
-  tree
-  (It first_it, 
-    It last_it,
-    const cmp_fn &r_cmp_fn)
-
-
-

Constructor taking iterators to a range of value_types - and some policy objects The value_types between - first_it and - last_it will be inserted - into the container object. r_cmp_fn will be copied by the - cmp_fn object of the - container object.

-
-
-  tree
-  (const tree &other)
-
-
-

Copy constructor.

-
-
-virtual 
-  ~tree
-  ()
-
-
-

Destructor.

-
-
-tree &
-  operator=
-  (const tree &other)
-
-
-

Assignment operator.

-
-
-void
-  swap
-  (tree &other)
-
-
-

Swaps content.

-
- -

Policy Access Methods

- - - - - - - - - - - - - - - - - - - -
MethodDescription
-
-cmp_fn &
-  get_cmp_fn
-  ()
-
-
-

Access to the cmp_fn object.

-
-
-const cmp_fn &
-  get_cmp_fn
-  () const
-
-
-

Const access to the cmp_fn object.

-
- -

Node-Iteration Methods

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
MethodDescription
-
-node_iterator
-  node_begin
-  ()
-
-
-

Returns a node_iterator - corresponding to the node at the root of the tree.

-
-
-const_node_iterator
-  node_begin
-  () const
-
-
-

Returns a const_node_iterator - corresponding to the node at the root of the tree.

-
-
-node_iterator
-  node_end
-  ()
-
-
-

Returns a node_iterator - corresponding to a node just after a leaf of the - tree.

-
-
-const_node_iterator
-  node_end
-  () const
-
-
-

Returns a const_node_iterator - corresponding to a node just after a leaf of the - tree.

-
-
- - diff --git a/libstdc++-v3/docs/html/ext/pb_ds/tree_based_containers.html b/libstdc++-v3/docs/html/ext/pb_ds/tree_based_containers.html deleted file mode 100644 index 7a1b554b26b..00000000000 --- a/libstdc++-v3/docs/html/ext/pb_ds/tree_based_containers.html +++ /dev/null @@ -1,358 +0,0 @@ - - - - - - - Tree-Based Containers - - - - -
-

Tree Design

- -

Overview

- -

The tree-based container has the following declaration:

-
-template<
-    typename Key,
-    typename Mapped,
-    typename Cmp_Fn = std::less<Key>,
-    typename Tag = rb_tree_tag,
-    template<
-        typename Const_Node_Iterator,
-        typename Node_Iterator,
-        typename Cmp_Fn_,
-        typename Allocator_>
-    class Node_Update = null_tree_node_update,
-    typename Allocator = std::allocator<char> >
-class tree;
-
- -

The parameters have the following meaning:

- -
    -
  1. Key is the key type.
  2. - -
  3. Mapped is the mapped-policy.
  4. - -
  5. Cmp_Fn is a key comparison functor
  6. - -
  7. Tag specifies which underlying data structure - to use.
  8. - -
  9. Node_Update is a policy for updating node - invariants. This is described in Node - Invariants.
  10. - -
  11. Allocator is an allocator - type.
  12. -
- -

The Tag parameter specifies which underlying - data structure to use. Instantiating it by rb_tree_tag, splay_tree_tag, or - ov_tree_tag, - specifies an underlying red-black tree, splay tree, or - ordered-vector tree, respectively; any other tag is illegal. - Note that containers based on the former two contain more types - and methods than the latter (e.g., - reverse_iterator and rbegin), and different - exception and invalidation guarantees.

- -

Node - Invariants

- -

Consider the two trees in Figures Some node invariants A and B. The first - is a tree of floats; the second is a tree of pairs, each - signifying a geometric line interval. Each element in a tree is refered to as a node of the tree. Of course, each of - these trees can support the usual queries: the first can easily - search for 0.4; the second can easily search for - std::make_pair(10, 41).

- -

Each of these trees can efficiently support other queries. - The first can efficiently determine that the 2rd key in the - tree is 0.3; the second can efficiently determine - whether any of its intervals overlaps - std::make_pair(29,42) (useful in geometric - applications or distributed file systems with leases, for - example). (See tree_order_statistics.cc - and tree_intervals.cc - for examples.) It should be noted that an std::set can - only solve these types of problems with linear complexity.

- -

In order to do so, each tree stores some metadata in - each node, and maintains node invariants clrs2001]. The first stores in - each node the size of the sub-tree rooted at the node; the - second stores at each node the maximal endpoint of the - intervals at the sub-tree rooted at the node.

- -
-
- -
Some node invariants.
- -

Supporting such trees is difficult for a number of - reasons:

- -
    -
  1. There must be a way to specify what a node's metadata - should be (if any).
  2. - -
  3. Various operations can invalidate node invariants. - E.g., Figure Invalidation of node - invariants shows how a right rotation, performed on A, - results in B, with nodes x and y having - corrupted invariants (the grayed nodes in C); Figure Invalidation of node - invariants shows how an insert, performed on D, results - in E, with nodes x and y having corrupted - invariants (the grayed nodes in F). It is not feasible to - know outside the tree the effect of an operation on the nodes - of the tree.
  4. - -
  5. The search paths of standard associative containers are - defined by comparisons between keys, and not through - metadata.
  6. - -
  7. It is not feasible to know in advance which methods trees - can support. Besides the usual find method, the - first tree can support a find_by_order method, while - the second can support an overlaps method.
  8. -
- -
no image
- -
Invalidation of node invariants.
- -

These problems are solved by a combination of two means: - node iterators, and template-template node updater - parameters.

- -

Node Iterators

- -

Each tree-based container defines two additional iterator - types, const_node_iterator - and node_iterator. - These iterators allow descending from a node to one of its - children. Node iterator allow search paths different than those - determined by the comparison functor. tree - supports the methods:

-
-    const_node_iterator
-    node_begin() const;
-
-    node_iterator
-    node_begin();
-
-    const_node_iterator
-    node_end() const;
-
-    node_iterator
-    node_end(); 
-
- -

The first pairs return node iterators corresponding to the - root node of the tree; the latter pair returns node iterators - corresponding to a just-after-leaf node.

- -

Node Updater - (Template-Template) Parameters

- -

The tree-based containers are parametrized by a - Node_Update template-template parameter. A tree-based - container instantiates Node_Update to some - node_update class, and publicly - subclasses node_update. Figure - A tree and its update - policy shows this scheme, as well as some predefined - policies (which are explained below).

- -
no image
- -
A tree and its update policy.
- -

node_update (an instantiation of - Node_Update) must define metadata_type as - the type of metadata it requires. For order statistics, - e.g., metadata_type might be size_t. - The tree defines within each node a metadata_type - object.

- -

node_update must also define the following method - for restoring node invariants:

-
-    void 
-    operator()(node_iterator nd_it, const_node_iterator end_nd_it)
-
- -

In this method, nd_it is a node_iterator - corresponding to a node whose A) all descendants have valid - invariants, and B) its own invariants might be violated; - end_nd_it is a const_node_iterator - corresponding to a just-after-leaf node. This method should - correct the node invariants of the node pointed to by - nd_it. For example, say node x in Figure - Restoring node - invariants-A has an invalid invariant, but its' children, - y and z have valid invariants. After the - invocation, all three nodes should have valid invariants, as in - Figure Restoring node - invariants-B.

- -
no image
- -
Invalidation of node invariants.
- -

When a tree operation might invalidate some node invariant, - it invokes this method in its node_update base to - restore the invariant. For example, Figure Insert update sequence diagram shows - an insert operation (point A); the tree performs some - operations, and calls the update functor three times (points B, - C, and D). (It is well known that any insert, - erase, split or join, can restore - all node invariants by a small number of node invariant updates - [clrs2001].)

- -
-
- -
Insert update sequence diagram.
- -

To complete the description of the scheme, three questions - need to be answered:

- -
    -
  1. How can a tree which supports order statistics define a - method such as find_by_order?
  2. - -
  3. How can the node updater base access methods of the - tree?
  4. - -
  5. How can the following cyclic dependency be resolved? - node_update is a base class of the tree, yet it - uses node iterators defined in the tree (its child).
  6. -
- -

The first two questions are answered by the fact that - node_update (an instantiation of - Node_Update) is a public base class - of the tree. Consequently:

- -
    -
  1. Any public methods of node_update are - automatically methods of the tree [alexandrescu01modern]. - Thus an order-statistics node updater, tree_order_statistics_node_update - defines the find_by_order method; any tree - instantiated by this policy consequently supports this method - as well.
  2. - -
  3. In C++, if a base class declares a method as - virtual, it is virtual in its - subclasses. If node_update needs to access one of - the tree's methods, say the member function end, it simply - declares that method as virtual - abstract.
  4. -
- -

The cyclic dependency is solved through template-template - parameters. Node_Update is parametrized by the tree's node iterators, its comparison - functor, and its allocator type. Thus, - instantiations of Node_Update have all information required.

- -

pb_ds assumes that constructing a metadata object and modifying it - are exception free. Suppose that during some method, say - insert, a metadata-related operation - (e.g., changing the value of a metadata) throws an - exception. Ack! Rolling back the method is unusually complex.

- -

In Interface::Concepts::Null - Policy Classes a distinction was made between redundant - policies and null policies. Node invariants show a - case where null policies are required.

- -

Assume a regular tree is required, one which need not - support order statistics or interval overlap queries. - Seemingly, in this case a redundant policy - a policy which - doesn't affect nodes' contents would suffice. This, would lead - to the following drawbacks:

- -
    -
  1. Each node would carry a useless metadata object, wasting - space.
  2. - -
  3. The tree cannot know if its Node_Update policy - actually modifies a node's metadata (this is halting - reducible). In Figure Useless update path , - assume the shaded node is inserted. The tree would have to - traverse the useless path shown to the root, applying - redundant updates all the way.
  4. -
- -
no image
- -
Useless update path.
- -

A null policy class, null_tree_node_update - solves both these problems. The tree detects that node - invariants are irrelevant, and defines all accordingly.

- -

Additional - Methods

- -

Tree-based containers support split and join methods. - It is possible to split a tree so that it passes - all nodes with keys larger than a given key to a different - tree. These methods have the following advantages over the - alternative of externally inserting to the destination - tree and erasing from the source tree:

- -
    -
  1. These methods are efficient - red-black trees are split - and joined in poly-logarithmic complexity; ordered-vector - trees are split and joined at linear complexity. The - alternatives have super-linear complexity.
  2. - -
  3. Aside from orders of growth, these operations perform - few allocations and de-allocations. For red-black trees, allocations are not performed, - and the methods are exception-free.
  4. -
-
- - diff --git a/libstdc++-v3/docs/html/ext/pb_ds/tree_node_iterator.html b/libstdc++-v3/docs/html/ext/pb_ds/tree_node_iterator.html deleted file mode 100644 index ba09b5b4db2..00000000000 --- a/libstdc++-v3/docs/html/ext/pb_ds/tree_node_iterator.html +++ /dev/null @@ -1,143 +0,0 @@ - - - - - - - tree::node_iterator Interface - - - - -
-

tree::node_iterator - Interface

- -

Node iterator.

- -

This is an iterator to an iterator - it - iterates over nodes, and de-referencing it returns one of the - tree's iterators

- -

Base Classes

- - - - - - - - - - - - - -
ClassDerivation Type
-
-tree::const_node_iterator
-
-
-

public

-
- -

Public Methods

- -

Constructors, Destructor, and - Related

- - - - - - - - - - - - - -
MethodDescription
-
-inline 
-  node_iterator
-  ()
-
-
-

Default constructor.

-
- -

Access Methods

- - - - - - - - - - - - - -
MethodDescription
-
-inline container_base::iterator
-  operator*
-  () const
-
-
-

Access.

-
- -

Movement Methods

- - - - - - - - - - - - - - - - - - - -
MethodDescription
-
-inline node_iterator
-  get_l_child
-  () const
-
-
-

Returns the node iterator associated with the left - node.

-
-
-inline node_iterator
-  get_r_child
-  () const
-
-
-

Returns the node iterator associated with the right - node.

-
-
- - diff --git a/libstdc++-v3/docs/html/ext/pb_ds/tree_node_updator_policy_cd.png b/libstdc++-v3/docs/html/ext/pb_ds/tree_node_updator_policy_cd.png deleted file mode 100644 index 5cae5781a18..00000000000 Binary files a/libstdc++-v3/docs/html/ext/pb_ds/tree_node_updator_policy_cd.png and /dev/null differ diff --git a/libstdc++-v3/docs/html/ext/pb_ds/tree_order_statistics_node_update.html b/libstdc++-v3/docs/html/ext/pb_ds/tree_order_statistics_node_update.html deleted file mode 100644 index 449966b0e4f..00000000000 --- a/libstdc++-v3/docs/html/ext/pb_ds/tree_order_statistics_node_update.html +++ /dev/null @@ -1,678 +0,0 @@ - - - - - - - tree_order_statistics_node_update Interface - - - - -
-

tree_order_statistics_node_update Interface

- -

Functor updating ranks of entrees.

- -

Defined in: tree_policy.hpp

- -

Template Parameters

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ParameterDescriptionDefault Value
-
-class Const_Node_Iterator
-
-
-

Const node iterator type.

-
-
-
-class Node_Iterator
-
-
-

Node iterator type.

-
-
-
-class Cmp_Fn
-
-
-

Comparison functor.

-
-
-
-class Allocator
-
-
-

Allocator type.

-
-
- -

Public Types and - Constants

- -

Policy Definitions

- - - - - - - - - - - - - - - - - - - - - - - - - -
TypeDefinitionDescription
-
-cmp_fn
-
-
-
-Cmp_Fn
-
-
-

Allocator - type.

-
-
-allocator
-
-
-
-Allocator
-
-
-

Allocator - type.

-
- -

General Definitions

- - - - - - - - - - - - - - - - - -
TypeDefinitionDescription
-
-size_type
-
-
-
-typename allocator::size_type
-
-
-

Size type.

-
- -

Key-type Definitions

- - - - - - - - - - - - - - - - - - - - - - - - - -
TypeDefinitionDescription
-
-key_type
-
-
-
-The instantiating container's key type.
-
-
-

Key type.

-
-
-const_key_reference
-
-
-
-The instantiating container's const key reference type.
-
-
-

Const key reference.

-
- -

Metadata-Type - Definitions

- - - - - - - - - - - - - - - - - -
TypeDefinitionDescription
-
-metadata_type
-
-
-
-size_type
-
-
-

Metadata type.

-
- -

Iterator Definitions

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
TypeDefinitionDescription
-
-const_node_iterator
-
-
-
-Const_Node_Iterator
-
-
-

Const node iterator type.

-
-
-node_iterator
-
-
-
-Node_Iterator
-
-
-

Node iterator type.

-
-
-const_iterator
-
-
-
-typename const_node_iterator::value_type
-
-
-

Const iterator type.

-
-
-iterator
-
-
-
-typename node_iterator::value_type
-
-
-

Iterator type.

-
- -

Public Methods

- -

Find-Type Methods

- - - - - - - - - - - - - - - - - - - - - - - - - -
MethodDescription
-
-inline const_iterator
-  find_by_order
-  (size_type order) const
-
-
-

Finds an entry by order. Returns a const_iterator to - the entry with the order order, or a const_iterator to - the container object's end if order is at least the size of the - container object.

-
-
-inline iterator
-  find_by_order
-  (size_type order)
-
-
-

Finds an entry by order. Returns an iterator to the entry - with the order order, or - an iterator to - the container object's end if order is at least the size of the - container object.

-
-
-inline size_type
-  order_of_key
-  (const_key_reference r_key) const
-
-
-

Returns the order of a key within a sequence. For - example, if r_key is the - smallest key, this method will return 0; if r_key is a key between the smallest - and next key, this method will return 1; if r_key is a key larger than the - largest key, this method will return the size of r_c.

-
- -

Protected Types and - Constants

- -

Value-type - Definitions

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
TypeDefinitionDescription
-
-const_reference
-
-
-
-The instantiating container's const reference  type.
-
-
-

Const reference to the container's value-type.

-
-
-const_pointer
-
-
-
-The instantiating container's const pointer  type.
-
-
-

Const pointer to the container's value-type.

-
-
-const_metadata_reference
-
-
-
-typename Allocator::template rebind<
-    metadata_type>::other::const_reference
-
-
-

Const metadata reference.

-
-
-metadata_reference
-
-
-
-typename Allocator::template rebind<
-    metadata_type>::other::reference
-
-
-

Metadata reference.

-
- -

Protected Methods

- -

Operators

- - - - - - - - - - - - - -
MethodDescription
-
-inline void
-  operator()
-  (node_iterator node_it,
-    const_node_iterator end_nd_it) const
-
-
-

Updates the rank of a node through a node_iterator - node_it; end_nd_it is the end node iterator.

-
- -

Constructors, destructor, and - related

- - - - - - - - - - - - - -
MethodDescription
-
-virtual 
-  ~tree_order_statistics_node_update
-  ()
-
-
-

Destructor.

-
- -

Private Methods

- -

Overrides

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
MethodDescription
-
-virtual const_node_iterator
-  node_begin
-  () const = 0
-
-
-

Returns the const_node_iterator - associated with the tree's root node.

-
-
-virtual node_iterator
-  node_begin
-  () = 0
-
-
-

Returns the node_iterator - associated with the tree's root node.

-
-
-virtual const_node_iterator
-  node_end
-  () const = 0
-
-
-

Returns the const_node_iterator - associated with a just-after leaf node.

-
-
-virtual node_iterator
-  node_end
-  () = 0
-
-
-

Returns the node_iterator - associated with a just-after leaf node.

-
-
-virtual cmp_fn &
-  get_cmp_fn
-  () = 0
-
-
-

Access to the cmp_fn object.

-
-
- - diff --git a/libstdc++-v3/docs/html/ext/pb_ds/tree_order_statistics_timing_test.html b/libstdc++-v3/docs/html/ext/pb_ds/tree_order_statistics_timing_test.html deleted file mode 100644 index 0d7579027a3..00000000000 --- a/libstdc++-v3/docs/html/ext/pb_ds/tree_order_statistics_timing_test.html +++ /dev/null @@ -1,118 +0,0 @@ - - - - - -Tree Order Statistics Timing Test - - - -
-

Tree Order-Statistics Timing Test

-

Description

-

This test creates a container, inserts random integers into - the the container, and then checks the order-statistics of the - container's values. (If the container is one of pb_ds - 's trees, it does this with the order_of_key method of - tree_order_statistics_node_update - ; otherwise, it uses the find method and - std::distance .) It measures the average time for such - queries as a function of the number of values inserted.

-

(The test was executed with tree_order_statistics_timing_test - 200 200 2100)

-

Purpose

-

The test checks the performance difference of policies based - on node-invariant as opposed to a external functions. (see - Design::Associative - Containers::Tree-Based Containers::Node Invariants .)

-

Results

-

Figures NTG, NTM, and - NTL show the results for the native and - tree-based containers in g++, msvc++, and - local, - respectively.

-
-
-
-
-
no image
NTG: Native and tree-based container order-statistics queries - g++

In the above figure, the names in the legends have the following meaning:

-
    -
  1. -n_set- -std::set
  2. -
  3. -splay_tree_ost_set- -tree - with Tag = splay_tree_tag -, and Node_Update = tree_order_statistics_node_update -
  4. -
  5. -rb_tree_ost_set- -tree - with Tag = rb_tree_tag -, and Node_Update = tree_order_statistics_node_update -
  6. -
-
-
-
-
-
-
-
-
-
-
no image
NTM: Native and tree-based container order-statistics queries - msvc++

In the above figure, the names in the legends have the following meaning:

-
    -
  1. -n_set- -std::set
  2. -
  3. -splay_tree_ost_set- -tree - with Tag = splay_tree_tag -, and Node_Update = tree_order_statistics_node_update -
  4. -
  5. -rb_tree_ost_set- -tree - with Tag = rb_tree_tag -, and Node_Update = tree_order_statistics_node_update -
  6. -
-
-
-
-
-
-
-
-
-
-
no image
NTL: Native and tree-based container order-statistics queries - local
-
-
-
-
-

Observations

-

In this test, the native red-black tree can support - order-statistics queries only externally, by performing a - find (alternatively, lower_bound or - upper_bound ) and then using std::distance . - This is clearly linear, and it is not that surprising that the - cost is high.

-

pb_ds 's tree-based containers use in this test the - order_of_key method of tree_order_statistics_node_update. - This method has only linear complexity in the length of the - root-node path. Unfortunately, the average path of a splay tree - (tree - with Tag = splay_tree_tag ) can - be higher than logarithmic; the longest path of a red-black - tree (tree - with Tag = rb_tree_tag ) is - logarithmic in the number of elements. Consequently, the splay - tree has worse performance than the red-black tree.

-
- - diff --git a/libstdc++-v3/docs/html/ext/pb_ds/tree_order_statistics_timing_test_gcc.png b/libstdc++-v3/docs/html/ext/pb_ds/tree_order_statistics_timing_test_gcc.png deleted file mode 100644 index bdb00d07a7f..00000000000 Binary files a/libstdc++-v3/docs/html/ext/pb_ds/tree_order_statistics_timing_test_gcc.png and /dev/null differ diff --git a/libstdc++-v3/docs/html/ext/pb_ds/tree_order_statistics_timing_test_local.png b/libstdc++-v3/docs/html/ext/pb_ds/tree_order_statistics_timing_test_local.png deleted file mode 100644 index 2b921743f7c..00000000000 Binary files a/libstdc++-v3/docs/html/ext/pb_ds/tree_order_statistics_timing_test_local.png and /dev/null differ diff --git a/libstdc++-v3/docs/html/ext/pb_ds/tree_order_statistics_timing_test_msvc.png b/libstdc++-v3/docs/html/ext/pb_ds/tree_order_statistics_timing_test_msvc.png deleted file mode 100644 index 76dcbee44fd..00000000000 Binary files a/libstdc++-v3/docs/html/ext/pb_ds/tree_order_statistics_timing_test_msvc.png and /dev/null differ diff --git a/libstdc++-v3/docs/html/ext/pb_ds/tree_random_int_find_find_timing_test.html b/libstdc++-v3/docs/html/ext/pb_ds/tree_random_int_find_find_timing_test.html deleted file mode 100644 index 9317cfc948d..00000000000 --- a/libstdc++-v3/docs/html/ext/pb_ds/tree_random_int_find_find_timing_test.html +++ /dev/null @@ -1,160 +0,0 @@ - - - - - -Tree Text Find Timing Test - - - -
-

Tree-Based and Trie-Based Text find Find Timing - Test

-

Description

-

This test inserts a number of values with keys from an - arbitrary text ([wickland96thirty]) into - a container, then performs a series of finds using - find. It measures the average time for find - as a function of the number of values inserted.

-

(The test was executed with text_find_timing_test - thirty_years_among_the_dead_preproc.txt 200 200 2100)

-

Purpose

-

The test checks the effect of different underlying - data structures.

-

Results

-

Figures NTTG, NTTM, - and NTTL show the results for the native, - tree-based, and trie-based types in g++, local, and - local, - respectively.

-
-
-
-
-
no image
NTTG: Native, tree-based, random int find timing test using find - g++

In the above figure, the names in the legends have the following meaning:

-
    -
  1. -splay_tree_map- -tree - with Tag = splay_tree_tag -, and Node_Update = null_tree_node_update -
  2. -
  3. -ov_tree_map- -tree - with Tag = ov_tree_tag -, and Node_Update = null_tree_node_update -
  4. -
  5. -n_map- -std::map
  6. -
  7. -rb_tree_map- -tree - with Tag = rb_tree_tag -, and Node_Update = null_tree_node_update -
  8. -
-
-
-
-
-
-
-
-
no image
NTTM: Native, tree-based, random int find timing test using find - msvc++

In the above figure, the names in the legends have the following meaning:

-
    -
  1. -splay_tree_map- -tree - with Tag = splay_tree_tag -, and Node_Update = null_tree_node_update -
  2. -
  3. -ov_tree_map- -tree - with Tag = ov_tree_tag -, and Node_Update = null_tree_node_update -
  4. -
  5. -n_map- -std::map
  6. -
  7. -rb_tree_map- -tree - with Tag = rb_tree_tag -, and Node_Update = null_tree_node_update -
  8. -
-
-
-
-
-
-
-
-
no image
NTTL: Native, tree-based, random int find timing test using find - local
-
-
-

Observations

-

For this setting, a splay tree (tree - with Tag = splay_tree_tag) - does not do well. This is possibly due to two - reasons:

-
    -
  1. A splay tree is not guaranteed to be balanced - [motwani95random]. - If a splay tree contains n nodes, its - average root-leaf path can be m >> - log(n).
  2. -
  3. Assume a specific root-leaf search path has - length m, and the search-target node has - distance m' from the root. A red-black - tree will require m + 1 comparisons to - find the required node; a splay tree will require - 2 m' comparisons. A splay tree, - consequently, can perform many more comparisons - than a red-black tree.
  4. -
-

An ordered-vector tree (tree - with Tag = ov_tree_tag), - a red-black tree (tree - with Tag = rb_tree_tag), - and the native red-black tree all share - approximately the same performance.

-

An ordered-vector tree is slightly slower than - red-black trees, since it requires, in order to - find a key, more math operations than they do. - Conversely, an ordered-vector tree requires far - lower space than the others. ([austern00noset], - however, seems to have an implementation that is - also faster than a red-black tree).

-

A PATRICIA trie (trie - with Tag = pat_trie_tag) - has good look-up performance, due to its large - fan-out in this case. In this setting, a PATRICIA - trie has lookup performance comparable to a hash - table (see Hash-Based - Text find Find Timing Test), but it is - order preserving. This is not that surprising, - since a large fan-out PATRICIA trie works like a - hash table with collisions resolved by a sub-trie. - A large fan-out PATRICIA trie does not do well on - modifications (see Tree-Based and - Trie-Based Text Insert Timing Test). It is - possibly beneficial to semi-static settings, - therefore.

-

- Observations::Tree-Like-Based Container Types - summarizes some observations on tree-based and - trie-based containers.

-
-
-
-
-
-
-
- - diff --git a/libstdc++-v3/docs/html/ext/pb_ds/tree_split_join_timing_test.html b/libstdc++-v3/docs/html/ext/pb_ds/tree_split_join_timing_test.html deleted file mode 100644 index 11db03d3ca0..00000000000 --- a/libstdc++-v3/docs/html/ext/pb_ds/tree_split_join_timing_test.html +++ /dev/null @@ -1,143 +0,0 @@ - - - - - -Tree Split Join Timing Test - - - -
-

Tree Split-Join Timing Test

-

Description

-

This test a container, inserts into a number of values, - splits the container at the median, and joins the two - containers. (If the containers are one of pb_ds 's - trees, it splits and joins with the split and - join method; otherwise, it uses the erase and - insert methods.) It measures the time for splitting - and joining the containers as a function of the number of - values inserted.

-

(The test was executed with tree_split_join_timing_test - 200 200 2100)

-

Purpose

-

The test checks the performance difference of join - as opposed to a sequence of insert operations; by - implication, this test checks the most efficient way to erase a - sub-sequence from a tree-like-based container, since this can - always be performed by a small sequence of splits and joins - (see Motivation::Associative - Containers::Slightly Different Methods::Methods Related to - Split and Join and Design::Associative - Containers::Tree-Based Containers::Additional Methods - .)

-

Results

-

Figures NTG, NTM, and - NTL show the results for the native and - tree-based containers in g++, msvc++, and - local, - respectively.

-
-
-
-
-
no image
NTG: Native and tree-based container splits and joins - g++

In the above figure, the names in the legends have the following meaning:

-
    -
  1. -n_set- -std::set
  2. -
  3. -splay_tree_set- -tree - with Tag = splay_tree_tag -, and Node_Update = null_tree_node_update -
  4. -
  5. -rb_tree_set- -tree - with Tag = rb_tree_tag -, and Node_Update = null_tree_node_update -
  6. -
  7. -ov_tree_set- -tree - with Tag = ov_tree_tag -, and Node_Update = null_tree_node_update -
  8. -
-
-
-
-
-
-
-
-
-
-
no image
NTM: Native and tree-based container splits and joins - msvc++

In the above figure, the names in the legends have the following meaning:

-
    -
  1. -n_set- -std::set
  2. -
  3. -splay_tree_set- -tree - with Tag = splay_tree_tag -, and Node_Update = null_tree_node_update -
  4. -
  5. -rb_tree_set- -tree - with Tag = rb_tree_tag -, and Node_Update = null_tree_node_update -
  6. -
  7. -ov_tree_set- -tree - with Tag = ov_tree_tag -, and Node_Update = null_tree_node_update -
  8. -
-
-
-
-
-
-
-
-
-
-
no image
NTL: Native and tree-based container splits and joins - local
-
-
-
-
-

Observations

-

In this test, the native red-black trees must be split and - joined externally, through a sequence of erase and - insert operations. This is clearly super-linear, and - it is not that surprising that the cost is high.

-

pb_ds 's tree-based containers use in this test the - split and join methods, which have lower - complexity: the join method of a splay tree ( tree - with Tag = splay_tree_tag ) is - quadratic in the length of the longest root-leaf path, and - linear in the total number of elements; the join - method of a red-black tree ( tree - with Tag = rb_tree_tag ) or an - ordered-vector tree ( tree - with Tag = ov_tree_tag ) is linear - in the number of elements.

-

Asides from orders of growth, pb_ds 's trees access - their allocator very little in these operations, and some of - them do not access it at all. This leads to lower constants in - their complexity, and, for some containers, to exception-free - splits and joins (which can be determined via container_traits).

-

It is important to note that split and - join are not esoteric methods - they are the most - efficient means of erasing a contiguous range of values from a - tree based container.

-
- - diff --git a/libstdc++-v3/docs/html/ext/pb_ds/tree_split_join_timing_test_gcc.png b/libstdc++-v3/docs/html/ext/pb_ds/tree_split_join_timing_test_gcc.png deleted file mode 100644 index 88867eca6bd..00000000000 Binary files a/libstdc++-v3/docs/html/ext/pb_ds/tree_split_join_timing_test_gcc.png and /dev/null differ diff --git a/libstdc++-v3/docs/html/ext/pb_ds/tree_split_join_timing_test_local.png b/libstdc++-v3/docs/html/ext/pb_ds/tree_split_join_timing_test_local.png deleted file mode 100644 index 131d24a1a12..00000000000 Binary files a/libstdc++-v3/docs/html/ext/pb_ds/tree_split_join_timing_test_local.png and /dev/null differ diff --git a/libstdc++-v3/docs/html/ext/pb_ds/tree_split_join_timing_test_msvc.png b/libstdc++-v3/docs/html/ext/pb_ds/tree_split_join_timing_test_msvc.png deleted file mode 100644 index 37ed1b2e7c0..00000000000 Binary files a/libstdc++-v3/docs/html/ext/pb_ds/tree_split_join_timing_test_msvc.png and /dev/null differ diff --git a/libstdc++-v3/docs/html/ext/pb_ds/tree_tag.html b/libstdc++-v3/docs/html/ext/pb_ds/tree_tag.html deleted file mode 100644 index e4b20607805..00000000000 --- a/libstdc++-v3/docs/html/ext/pb_ds/tree_tag.html +++ /dev/null @@ -1,47 +0,0 @@ - - - - - - - tree_tag Interface - - - - -
-

tree_tag Interface

- -

Basic tree data structure tag.

- -

Defined in: tag_and_trait.hpp

- -

Base Classes

- - - - - - - - - - - - - -
ClassDerivation Type
-
-basic_tree_tag
-
-
-

public

-
-
- - diff --git a/libstdc++-v3/docs/html/ext/pb_ds/tree_text_find_find_timing_test.html b/libstdc++-v3/docs/html/ext/pb_ds/tree_text_find_find_timing_test.html deleted file mode 100644 index 283bdf098cd..00000000000 --- a/libstdc++-v3/docs/html/ext/pb_ds/tree_text_find_find_timing_test.html +++ /dev/null @@ -1,162 +0,0 @@ - - - - - -Tree Text Find Timing Test - - - -
-

Tree-Based and Trie-Based Text find Find Timing - Test

-

Description

-

This test inserts a number of values with keys from an - arbitrary text ([wickland96thirty]) into - a container, then performs a series of finds using - find. It measures the average time for find - as a function of the number of values inserted.

-

(The test was executed with text_find_timing_test - thirty_years_among_the_dead_preproc.txt 200 200 2100)

-

Purpose

-

The test checks the effect of different underlying - data structures.

-

Results

-

Figures NTTG, NTTM, - and NTTL show the results for the native, - tree-based, and trie-based types in g++, local, and - local, - respectively.

-
-
-
-
-
no image
NTTG: Native, tree-based, and trie-based, text find timing test using find - g++

In the above figure, the names in the legends have the following meaning:

-
    -
  1. -splay_tree_map- -tree - with Tag = splay_tree_tag -, and Node_Update = null_tree_node_update -
  2. -
  3. -ov_tree_map- -tree - with Tag = ov_tree_tag -, and Node_Update = null_tree_node_update -
  4. -
  5. -rb_tree_map- -tree - with Tag = rb_tree_tag -, and Node_Update = null_tree_node_update -
  6. -
  7. -n_map- -std::map
  8. -
  9. -pat_trie_map- -trie - with Tag = pat_trie_tag -, and Node_Update = null_trie_node_update -
  10. -
-
-
-
-
-
-
-
-
-
-
no image
NTTM: Native, tree-based, and trie-based, text find timing test using find - msvc++

In the above figure, the names in the legends have the following meaning:

-
    -
  1. -splay_tree_map- -tree - with Tag = splay_tree_tag -, and Node_Update = null_tree_node_update -
  2. -
  3. -ov_tree_map- -tree - with Tag = ov_tree_tag -, and Node_Update = null_tree_node_update -
  4. -
  5. -rb_tree_map- -tree - with Tag = rb_tree_tag -, and Node_Update = null_tree_node_update -
  6. -
  7. -n_map- -std::map
  8. -
  9. -pat_trie_map- -trie - with Tag = pat_trie_tag -, and Node_Update = null_trie_node_update -
  10. -
-
-
-
-
-
-
-
-
-
-
no image
NTTL: Native, tree-based, and trie-based, text find timing test using find - local
-
-
-
-
-

Observations

-

For this setting, a splay tree (tree - with Tag = splay_tree_tag) does - not do well. This is possibly due to two reasons:

-
    -
  1. A splay tree is not guaranteed to be balanced [motwani95random]. If a - splay tree contains n nodes, its average root-leaf - path can be m >> log(n).
  2. -
  3. Assume a specific root-leaf search path has length - m, and the search-target node has distance m' - from the root. A red-black tree will require m + 1 - comparisons to find the required node; a splay tree will - require 2 m' comparisons. A splay tree, consequently, - can perform many more comparisons than a red-black tree.
  4. -
-

An ordered-vector tree (tree - with Tag = ov_tree_tag), a red-black - tree (tree - with Tag = rb_tree_tag), and the - native red-black tree all share approximately the same - performance.

-

An ordered-vector tree is slightly slower than red-black - trees, since it requires, in order to find a key, more math - operations than they do. Conversely, an ordered-vector tree - requires far lower space than the others. ([austern00noset], however, - seems to have an implementation that is also faster than a - red-black tree).

-

A PATRICIA trie (trie - with Tag = pat_trie_tag) has good - look-up performance, due to its large fan-out in this case. In - this setting, a PATRICIA trie has look-up performance comparable - to a hash table (see Hash-Based Text - find Find Timing Test), but it is order - preserving. This is not that surprising, since a large-fan-out - PATRICIA trie works like a hash table with collisions resolved - by a sub-trie. A large-fan-out PATRICIA trie does not do well on - modifications (see Tree-Based and Trie-Based - Text Insert Timing Test). It is possibly beneficial to - semi-static settings, therefore.

-

Observations::Tree-Like-Based - Container Types summarizes some observations on tree-based - and trie-based containers.

-
- - diff --git a/libstdc++-v3/docs/html/ext/pb_ds/tree_text_insert_timing_test.html b/libstdc++-v3/docs/html/ext/pb_ds/tree_text_insert_timing_test.html deleted file mode 100644 index 6f0e26c00d6..00000000000 --- a/libstdc++-v3/docs/html/ext/pb_ds/tree_text_insert_timing_test.html +++ /dev/null @@ -1,226 +0,0 @@ - - - - - -Tree Text Insert Timing Test - - - -
-

Tree-Based and Trie-Based Text Insert Timing Test

-

Description

-

This test inserts a number of values with keys from an - arbitrary text ([ wickland96thirty ]) into - a container using insert . It measures the average - time for insert as a function of the number of values - inserted.

-

(The test was executed with tree_text_insert_timing_test - thirty_years_among_the_dead_preproc.txt 200 200 2100)

-

Purpose

-

The test checks the effect of different underlying - data structures.

-

Results

-

Figures NNTG, NVTG, - and NPTG show the results for the native - tree and pb_ds's node-based trees, the native tree and - pb_ds's vector-based trees, and the native tree - andpb_ds's PATRICIA-trie, respectively, in g++; Figures - NNTM, NVTM, and - NPTM show the same in msvc++; Figures - NNTL, NVTL, and - NPTL show the same in local.

-
-
-
-
-
no image
NNTG: Native tree and node-based trees text insert timing test using insert - g++

In the above figure, the names in the legends have the following meaning:

-
    -
  1. -splay_tree_map- -tree - with Tag = splay_tree_tag -, and Node_Update = null_tree_node_update -
  2. -
  3. -n_map- -std::map
  4. -
  5. -rb_tree_map- -tree - with Tag = rb_tree_tag -, and Node_Update = null_tree_node_update -
  6. -
-
-
-
-
-
-
-
-
-
-
no image
NVTG: Native tree and vector-based tree text insert timing test using insert - g++

In the above figure, the names in the legends have the following meaning:

-
    -
  1. -ov_tree_map- -tree - with Tag = ov_tree_tag -, and Node_Update = null_tree_node_update -
  2. -
  3. -n_map- -std::map
  4. -
-
-
-
-
-
-
-
-
-
-
no image
NPTG: Native tree and PATRICIA trie text insert timing test using insert - g++

In the above figure, the names in the legends have the following meaning:

-
    -
  1. -n_map- -std::map
  2. -
  3. -pat_trie_map- -trie - with Tag = pat_trie_tag -, and Node_Update = null_trie_node_update -
  4. -
-
-
-
-
-
-
-
-
-
-
no image
NNTM: Native tree and node-based trees text insert timing test using insert - msvc++

In the above figure, the names in the legends have the following meaning:

-
    -
  1. -splay_tree_map- -tree - with Tag = splay_tree_tag -, and Node_Update = null_tree_node_update -
  2. -
  3. -n_map- -std::map
  4. -
  5. -rb_tree_map- -tree - with Tag = rb_tree_tag -, and Node_Update = null_tree_node_update -
  6. -
-
-
-
-
-
-
-
-
-
-
no image
NVTM: Native tree and vector-based tree text insert timing test using insert - msvc++

In the above figure, the names in the legends have the following meaning:

-
    -
  1. -ov_tree_map- -tree - with Tag = ov_tree_tag -, and Node_Update = null_tree_node_update -
  2. -
  3. -n_map- -std::map
  4. -
-
-
-
-
-
-
-
-
-
-
no image
NPTM: Native tree and PATRICIA trie text insert timing test using insert - msvc++

In the above figure, the names in the legends have the following meaning:

-
    -
  1. -pat_trie_map- -trie - with Tag = pat_trie_tag -, and Node_Update = null_trie_node_update -
  2. -
  3. -n_map- -std::map
  4. -
-
-
-
-
-
-
-
-
-
-
no image
NNTL: Native tree and node-based trees text insert timing test using insert - local
-
-
-
-
-
-
-
-
-
no image
NVTL: Native tree and vector-based tree text insert timing test using insert - local
-
-
-
-
-
-
-
-
-
no image
NPTL: Native tree and PATRICIA trie text insert timing test using insert - local
-
-
-
-
-

Observations

-

Observing Figure NNTG , for this - setting, a splay tree, ( tree - with Tag = splay_tree_tag ) does - not do well. This was covered in Tree-Based and - Trie-Based Text find Find Timing Test . The two - red-black trees perform better.

-

Observing Figure NVTG, an ordered-vector - tree ( tree - with Tag = ov_tree_tag) performs - abysmally. Inserting into this type of tree has linear - complexity [ austern00noset].

-

Observing Figure NPTG , A PATRICIA trie - ( trie - with Tag = pat_trie_tag ) has - abysmal performance, as well. This is not that surprising, - since a large-fan-out PATRICIA trie works like a hash table with - collisions resolved by a sub-trie. Each time a collision is - encountered, a new "hash-table" is built A large fan-out - PATRICIA trie, however, doe does well in look-ups (see Tree-Based and - Trie-Based Text find Find Timing Test ). It is - possibly beneficial to semi-static settings, therefore.

-

Observations::Tree-Like-Based - Container Types summarizes some observations on tree-based - and trie-based containers.

-
- - diff --git a/libstdc++-v3/docs/html/ext/pb_ds/tree_text_insert_timing_test_node_tree_gcc.png b/libstdc++-v3/docs/html/ext/pb_ds/tree_text_insert_timing_test_node_tree_gcc.png deleted file mode 100644 index 22d8f6fc213..00000000000 Binary files a/libstdc++-v3/docs/html/ext/pb_ds/tree_text_insert_timing_test_node_tree_gcc.png and /dev/null differ diff --git a/libstdc++-v3/docs/html/ext/pb_ds/tree_text_insert_timing_test_node_tree_local.png b/libstdc++-v3/docs/html/ext/pb_ds/tree_text_insert_timing_test_node_tree_local.png deleted file mode 100644 index bb100084b3f..00000000000 Binary files a/libstdc++-v3/docs/html/ext/pb_ds/tree_text_insert_timing_test_node_tree_local.png and /dev/null differ diff --git a/libstdc++-v3/docs/html/ext/pb_ds/tree_text_insert_timing_test_node_tree_msvc.png b/libstdc++-v3/docs/html/ext/pb_ds/tree_text_insert_timing_test_node_tree_msvc.png deleted file mode 100644 index 18b219851c2..00000000000 Binary files a/libstdc++-v3/docs/html/ext/pb_ds/tree_text_insert_timing_test_node_tree_msvc.png and /dev/null differ diff --git a/libstdc++-v3/docs/html/ext/pb_ds/tree_text_insert_timing_test_pat_trie_gcc.png b/libstdc++-v3/docs/html/ext/pb_ds/tree_text_insert_timing_test_pat_trie_gcc.png deleted file mode 100644 index 5fe063e63c2..00000000000 Binary files a/libstdc++-v3/docs/html/ext/pb_ds/tree_text_insert_timing_test_pat_trie_gcc.png and /dev/null differ diff --git a/libstdc++-v3/docs/html/ext/pb_ds/tree_text_insert_timing_test_pat_trie_local.png b/libstdc++-v3/docs/html/ext/pb_ds/tree_text_insert_timing_test_pat_trie_local.png deleted file mode 100644 index 228de144222..00000000000 Binary files a/libstdc++-v3/docs/html/ext/pb_ds/tree_text_insert_timing_test_pat_trie_local.png and /dev/null differ diff --git a/libstdc++-v3/docs/html/ext/pb_ds/tree_text_insert_timing_test_pat_trie_msvc.png b/libstdc++-v3/docs/html/ext/pb_ds/tree_text_insert_timing_test_pat_trie_msvc.png deleted file mode 100644 index 9f13db0c093..00000000000 Binary files a/libstdc++-v3/docs/html/ext/pb_ds/tree_text_insert_timing_test_pat_trie_msvc.png and /dev/null differ diff --git a/libstdc++-v3/docs/html/ext/pb_ds/tree_text_insert_timing_test_vector_tree_gcc.png b/libstdc++-v3/docs/html/ext/pb_ds/tree_text_insert_timing_test_vector_tree_gcc.png deleted file mode 100644 index dd85dcd7ca2..00000000000 Binary files a/libstdc++-v3/docs/html/ext/pb_ds/tree_text_insert_timing_test_vector_tree_gcc.png and /dev/null differ diff --git a/libstdc++-v3/docs/html/ext/pb_ds/tree_text_insert_timing_test_vector_tree_local.png b/libstdc++-v3/docs/html/ext/pb_ds/tree_text_insert_timing_test_vector_tree_local.png deleted file mode 100644 index cecb8a10750..00000000000 Binary files a/libstdc++-v3/docs/html/ext/pb_ds/tree_text_insert_timing_test_vector_tree_local.png and /dev/null differ diff --git a/libstdc++-v3/docs/html/ext/pb_ds/tree_text_insert_timing_test_vector_tree_msvc.png b/libstdc++-v3/docs/html/ext/pb_ds/tree_text_insert_timing_test_vector_tree_msvc.png deleted file mode 100644 index 8c07313910f..00000000000 Binary files a/libstdc++-v3/docs/html/ext/pb_ds/tree_text_insert_timing_test_vector_tree_msvc.png and /dev/null differ diff --git a/libstdc++-v3/docs/html/ext/pb_ds/tree_text_lor_find_find_timing_test.html b/libstdc++-v3/docs/html/ext/pb_ds/tree_text_lor_find_find_timing_test.html deleted file mode 100644 index 48d0112c6ea..00000000000 --- a/libstdc++-v3/docs/html/ext/pb_ds/tree_text_lor_find_find_timing_test.html +++ /dev/null @@ -1,126 +0,0 @@ - - - - - -Tree Text Locality of Reference Find Timing Test - - - -
-

Tree-Based Locality-of-Reference Text find Find - Timing Test

-

Description

-

This test inserts a number of values with keys from an - arbitrary text ([ wickland96thirty ]) into - a container, then performs a series of finds using - find . It is different than Tree-Based and - Trie-Based Text find Find Timing Test in the - sequence of finds it performs: this test performs multiple - find s on the same key before moving on to the next - key. It measures the average time for find as a - function of the number of values inserted.

-

(The test was executed with tree_text_lor_find_timing_test - thirty_years_among_the_dead_preproc.txt 200 200 2100)

-

Purpose

-

The test checks the effect of different underlying - data structures in a locality-of-reference setting.

-

Results

-

Figures NTG, NTM, and - NTL show the results for the native and - pb_ds tree-based types in g++, msvc++ and - local, - respectively.

-
-
-
-
-
no image
NTG: Native and tree-based locality-of-reference text find timing test using find - g++

In the above figure, the names in the legends have the following meaning:

-
    -
  1. -ov_tree_map- -tree - with Tag = ov_tree_tag -, and Node_Update = null_tree_node_update -
  2. -
  3. -rb_tree_map- -tree - with Tag = rb_tree_tag -, and Node_Update = null_tree_node_update -
  4. -
  5. -n_map- -std::map
  6. -
  7. -splay_tree_map- -tree - with Tag = splay_tree_tag -, and Node_Update = null_tree_node_update -
  8. -
-
-
-
-
-
-
-
-
-
-
no image
NTM: Native and tree-based locality-of-reference text find timing test using find - msvc++

In the above figure, the names in the legends have the following meaning:

-
    -
  1. -ov_tree_map- -tree - with Tag = ov_tree_tag -, and Node_Update = null_tree_node_update -
  2. -
  3. -rb_tree_map- -tree - with Tag = rb_tree_tag -, and Node_Update = null_tree_node_update -
  4. -
  5. -n_map- -std::map
  6. -
  7. -splay_tree_map- -tree - with Tag = splay_tree_tag -, and Node_Update = null_tree_node_update -
  8. -
-
-
-
-
-
-
-
-
-
-
no image
NTL: Native and tree-based locality-of-reference text find timing test using find - local
-
-
-
-
-

Observations

-

For this setting, an ordered-vector tree ( tree - with Tag = ov_tree_tag ), a - red-black tree ( tree - with Tag = rb_tree_tag ), and the - native red-black tree all share approximately the same - performance.

-

A splay tree ( tree - with Tag = splay_tree_tag ) does - much better, since each (successful) find "bubbles" the - corresponding node to the root of the tree.

-

Observations::Tree-Like-Based - Container Types summarizes some observations on tree-based - and trie-based containers.

-
- - diff --git a/libstdc++-v3/docs/html/ext/pb_ds/tree_text_lor_find_timing_test_gcc.png b/libstdc++-v3/docs/html/ext/pb_ds/tree_text_lor_find_timing_test_gcc.png deleted file mode 100644 index cf5174d99c1..00000000000 Binary files a/libstdc++-v3/docs/html/ext/pb_ds/tree_text_lor_find_timing_test_gcc.png and /dev/null differ diff --git a/libstdc++-v3/docs/html/ext/pb_ds/tree_text_lor_find_timing_test_local.png b/libstdc++-v3/docs/html/ext/pb_ds/tree_text_lor_find_timing_test_local.png deleted file mode 100644 index 26f71510ff0..00000000000 Binary files a/libstdc++-v3/docs/html/ext/pb_ds/tree_text_lor_find_timing_test_local.png and /dev/null differ diff --git a/libstdc++-v3/docs/html/ext/pb_ds/tree_text_lor_find_timing_test_msvc.png b/libstdc++-v3/docs/html/ext/pb_ds/tree_text_lor_find_timing_test_msvc.png deleted file mode 100644 index 583a027f3dc..00000000000 Binary files a/libstdc++-v3/docs/html/ext/pb_ds/tree_text_lor_find_timing_test_msvc.png and /dev/null differ diff --git a/libstdc++-v3/docs/html/ext/pb_ds/trie.html b/libstdc++-v3/docs/html/ext/pb_ds/trie.html deleted file mode 100644 index 71a86883386..00000000000 --- a/libstdc++-v3/docs/html/ext/pb_ds/trie.html +++ /dev/null @@ -1,489 +0,0 @@ - - - - - - - trie Interface - - - - -
-

trie Interface

- -

A concrete basic trie-based associative container.

- -

Defined in: assoc_container.hpp

- -

Template Parameters

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ParameterDescriptionDefault Value
-
-typename Key
-
-
-

Key type.

-
-
-
-typename Mapped
-
-
-

Mapped type.

-
-
-
-class E_Access_Traits 
-
-
-

Element-access traits.

-
-
-
-class Tag 
-
-
-

Data-structure tag.

-
pat_trie_tag
-
-template< 
-  typename Const_Node_Iterator, 
-  typename Node_Iterator, 
-  class E_Access_Traits_, 
-  typename Allocator_>
-class Node_Update 
-
-
-

Node updater type.

- -

Design::Tree-Based - Containers::Node Invariants explains this - concept.

-
null_trie_node_update
-
-class Allocator 
-
-
-

Allocator type.

-
-
-std::allocator<char>
-
-
- -

Public Types and - Constants

- -

Policy Definitions

- - - - - - - - - - - - - - - - - -
TypeDefinitionDescription
-
-e_access_traits
-
-
-
-E_Access_Traits
-
-
-

Element access traits type.

-
- -

Iterator Definitions

- - - - - - - - - - - - - - - - - - - - - - - - - -
TypeDefinitionDescription
-
-const_node_iterator
-
-
-
-const_node_iterator
-
-
-

Const node iterator.

-
-
-node_iterator
-
-
-
-node_iterator
-
-
-

Node iterator.

-
- -

Public Methods

- -

Constructors, Destructor, and - Related

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
MethodDescription
-
-  trie
-  ()
-
-
-

Default constructor.

-
-
-  trie
-  (const E_Access_Traits &r_e_access_traits)
-
-
-

Constructor taking some policy objects. r_e_access_traits will be copied by - the E_Access_Traits - object of the container object.

-
-
-template<
-    class It>
-  trie
-  (It first_it, 
-    It last_it)
-
-
-

Constructor taking iterators to a range of - value_types. The value_types between first_it and last_it will be inserted into the - container object.

-
-
-template<
-    class It>
-  trie
-  (It first_it, 
-    It last_it,
-    const E_Access_Traits &r_e_access_traits)
-
-
-

Constructor taking iterators to a range of value_types - and some policy objects. The value_types between - first_it and - last_it will be inserted - into the container object.

-
-
-  trie
-  (const trie &other)
-
-
-

Copy constructor.

-
-
-virtual 
-  ~trie
-  ()
-
-
-

Destructor.

-
-
-trie &
-  operator=
-  (const trie &other)
-
-
-

Assignment operator.

-
-
-void
-  swap
-  (trie &other)
-
-
-

Swaps content.

-
- -

Policy Access Methods

- - - - - - - - - - - - - - - - - - - -
MethodDescription
-
-e_access_traits &
-  get_e_access_traits
-  ()
-
-
-

Access to the comb_hash_fn object.

-
-
-e_access_traits &
-  get_e_access_traits
-  () const
-
-
-

Const access to the comb_hash_fn object.

-
- -

Node-Iteration Methods

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
MethodDescription
-
-node_iterator
-  node_begin
-  ()
-
-
-

Returns a node_iterator - corresponding to the node at the root of the trie.

-
-
-const_node_iterator
-  node_begin
-  () const
-
-
-

Returns a const_node_iterator - corresponding to the node at the root of the trie.

-
-
-node_iterator
-  node_end
-  ()
-
-
-

Returns a node_iterator - corresponding to a node just after a leaf of the - trie.

-
-
-const_node_iterator
-  node_end
-  () const
-
-
-

Returns a const_node_iterator - corresponding to a node just after a leaf of the - trie.

-
-
- - diff --git a/libstdc++-v3/docs/html/ext/pb_ds/trie_based_containers.html b/libstdc++-v3/docs/html/ext/pb_ds/trie_based_containers.html deleted file mode 100644 index 8b670bc11dc..00000000000 --- a/libstdc++-v3/docs/html/ext/pb_ds/trie_based_containers.html +++ /dev/null @@ -1,241 +0,0 @@ - - - - - - - Trie-Based Containers - - - - -
-

Trie Design

- -

Overview

- -

The trie-based container has the following declaration:

-
-template<
-    typename Key,
-    typename Mapped,
-    typename Cmp_Fn = std::less<Key>,
-    typename Tag =  pat_trie_tag,
-    template<
-        typename Const_Node_Iterator,
-        typename Node_Iterator,
-        typename E_Access_Traits_,
-        typename Allocator_>
-    class Node_Update = null_trie_node_update,
-    typename Allocator = std::allocator<char> >
-class trie;
-
- -

The parameters have the following meaning:

- -
    -
  1. Key is the key type.
  2. - -
  3. Mapped is the mapped-policy, and is explained in - Tutorial::Associative - Containers::Associative Containers Others than Maps.
  4. - -
  5. E_Access_Traits is described in Element-Access Traits.
  6. - -
  7. Tag specifies which underlying data structure - to use, and is described shortly.
  8. - -
  9. Node_Update is a policy for updating node - invariants. This is described in Node - Invariants.
  10. - -
  11. Allocator is an allocator - type.
  12. -
- -

The Tag parameter specifies which underlying - data structure to use. Instantiating it by pat_trie_tag, specifies an - underlying PATRICIA trie (explained shortly); any other tag is - currently illegal.

-
- -

Following is a description of a (PATRICIA) trie - (pb_ds follows specifically [okasaki98mereable] and - [filliatre2000ptset]).

- -

A (PATRICIA) trie is similar to a tree, but with the - following differences:

- -
    -
  1. It explicitly views keys as a sequence of elements. - E.g., a trie can view a string as a sequence of - characters; a trie can view a number as a sequence of - bits.
  2. - -
  3. It is not (necessarily) binary. Each node has fan-out n - + 1, where n is the number of distinct - elements.
  4. - -
  5. It stores values only at leaf nodes.
  6. - -
  7. Internal nodes have the properties that A) each has at - least two children, and B) each shares the same prefix with - any of its descendant.
  8. -
- -

Element-Access Traits shows - an example of such a trie.

- -

A (PATRICIA) trie has some useful properties:

- -
    -
  1. It can be configured to use large node fan-out, giving it - very efficient find performance (albeit at insertion - complexity and size).
  2. - -
  3. It works well for common-prefix keys.
  4. - -
  5. It can support efficiently queries such as which keys - match a certain prefix. This is sometimes useful in - file systems and routers.
  6. -
- -

(We would like to thank Matt Austern for the suggestion to - include tries.)

- -

Element-Access Traits

- -

A trie inherently views its keys as sequences of elements. - For example, a trie can view a string as a sequence of - characters. A trie needs to map each of n elements to a - number in {0, n - 1}. For example, a trie can map a - character c to - static_cast<size_t>(c).

- -

Seemingly, then, a trie can assume that its keys support - (const) iterators, and that the value_type of this - iterator can be cast to a size_t. There are several - reasons, though, to decouple the mechanism by which the trie - accesses its keys' elements from the trie:

- -
    -
  1. In some cases, the numerical value of an element is - inappropriate. Consider a trie storing DNA strings. It is - logical to use a trie with a fan-out of 5 = 1 + |{'A', 'C', - 'G', 'T'}|. This requires mapping 'T' to 3, though.
  2. - -
  3. In some cases the keys' iterators are different than what - is needed. For example, a trie can be used to search for - common suffixes, by using strings' - reverse_iterator. As another example, a trie mapping - UNICODE strings would have a huge fan-out if each node would - branch on a UNICODE character; instead, one can define an - iterator iterating over 8-bit (or less) groups.
  4. -
- -

trie is, - consequently, parametrized by E_Access_Traits - - traits which instruct how to access sequences' elements. - string_trie_e_access_traits - is a traits class for strings. Each such traits define some - types, e.g.,

-
-typename E_Access_Traits::const_iterator
-
- -

is a const iterator iterating over a key's elements. The - traits class must also define methods for obtaining an iterator - to the first and last element of a key.

- -

Figure A PATRICIA trie shows a - (PATRICIA) trie resulting from inserting the words: "I wish - that I could ever see a poem lovely as a trie" (which, - unfortunately, does not rhyme).

- -

The leaf nodes contain values; each internal node contains - two typename E_Access_Traits::const_iterator - objects, indicating the maximal common prefix of all keys in - the sub-tree. For example, the shaded internal node roots a - sub-tree with leafs "a" and "as". The maximal common prefix is - "a". The internal node contains, consequently, to const - iterators, one pointing to 'a', and the other to - 's'.

- -
no image
- -
A PATRICIA trie.
- -

Node - Invariants

- -

Trie-based containers support node invariants, as do - tree-based containers (see Tree-Based - Containers::Node Invariants). There are two minor - differences, though, which, unfortunately, thwart sharing them - sharing the same node-updating policies:

- -
    -
  1. A trie's Node_Update template-template - parameter is parametrized by E_Access_Traits, while - a tree's Node_Update template-template parameter is - parametrized by Cmp_Fn.
  2. - -
  3. Tree-based containers store values in all nodes, while - trie-based containers (at least in this implementation) store - values in leafs.
  4. -
- -

Figure A trie and its update - policy shows the scheme, as well as some predefined - policies (which are explained below).

- -
no image
- -
A trie and its update policy.
- -

pb_ds offers the following pre-defined trie node - updating policies:

- -
    -
  1. trie_order_statistics_node_update - supports order statistics.
  2. - -
  3. trie_prefix_search_node_update - supports searching for ranges that match a given prefix. See - trie_prefix_search.cc.
  4. - -
  5. null_trie_node_update - is the null node updater.
  6. -
- -

Additional - Methods

- -

Trie-based containers support split and join methods; the - rationale is equal to that of tree-based containers supporting - these methods (see Tree-Based - Containers::Additional Methods).

-
- - diff --git a/libstdc++-v3/docs/html/ext/pb_ds/trie_const_node_iterator.html b/libstdc++-v3/docs/html/ext/pb_ds/trie_const_node_iterator.html deleted file mode 100644 index 0869a7c2f5b..00000000000 --- a/libstdc++-v3/docs/html/ext/pb_ds/trie_const_node_iterator.html +++ /dev/null @@ -1,478 +0,0 @@ - - - - - - - trie::const_node_iterator - Interface - - - - -
-

trie::const_node_iterator - Interface

- -

Const node iterator.

- -

This is an "iterator to an iterator" - it iterates over - nodes, and de-referencing it returns one of the tree's const - iterators

- -

Public Types and - Constants

- -

General Container - Definitions

- - - - - - - - - - - - - - - - - -
TypeDefinitionDescription
-
-size_type
-
-
-
-container_base::size_type
-
-
-

Size type.

-
- -

Iterator Definitions

- - - - - - - - - - - - - - - - - - - - - - - - - -
TypeDefinitionDescription
-
-iterator_category
-
-
-
-trivial_iterator_tag
-
-
-

Category.

- -

This tag identifies that the iterator has none of the - STL's iterators' movement abilities.

-
-
-difference_type
-
-
-
-void
-
-
-

Difference type.

-
- -

Value-Type Definitions

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
TypeDefinitionDescription
-
-value_type
-
-
-
-container_base::const_iterator
-
-
-

Iterator's value type.

-
-
-reference
-
-
-
-value_type
-
-
-

Iterator's reference type.

-
-
-const_reference
-
-
-
-value_type
-
-
-

Iterator's const reference type.

-
-
-e_access_traits
-
-
-
-trie::e_access_traits
-
-
-

Element access traits.

-
-
-const_e_iterator
-
-
-
-typename e_access_traits::const_iterator
-
-
-

A key's element const iterator.

-
- -

Metadata Definitions

- -

These are only defined if - basic_tree::Node_Update - is not null_trie_node_update

- - - - - - - - - - - - - - - - - - - - - - - - - -
TypeDefinitionDescription
-
-metadata_type
-
-
-
-typename basic_tree::Node_Update::metadata_type
-
-
-

Metadata type.

-
-
-const_metadata_reference
-
-
-
-typename Allocator::template rebind<
-    metadata_type>::other::const_reference
-
-
-

Const metadata reference type.

-
- -

Public Methods

- -

Constructors, Destructor, and - Related

- - - - - - - - - - - - - -
MethodDescription
-
-inline 
-  const_node_iterator
-  ()
-
-
-

Default constructor.

-
- -

Access Methods

- - - - - - - - - - - - - - - - - - - -
MethodDescription
-
-inline std::pair<
-    const_e_iterator,
-    const_e_iterator>
-  valid_prefix
-  () const
-
-
-

Subtree valid prefix.

- -

Returns the common prefix range of all nodes in this - node's subtree.

-
-
-inline const_reference
-  operator*
-  () const
-
-
-

Const access; returns the const iterator associated - with the current leaf.

- -

Should be called only for leaf nodes.

-
- -

Metadata Access Methods

- -

These are only defined if - basic_tree::Node_Update - is not null_trie_node_update

- - - - - - - - - - - - - -
MethodDescription
-
-inline const_metadata_reference
-  get_metadata
-  () const
-
-
-

Metadata access.

-
- -

Movement Methods

- - - - - - - - - - - - - - - - - - - -
MethodDescription
-
-inline size_type
-  num_children
-  () const
-
-
-

Returns the number of children in the corresponding - node.

- -

If the number of children is 0, then the corresponding - node is a leaf; otherwise, it is not a leaf.

-
-
-const_node_iterator
-  get_child
-  (size_type i) const
-
-
-

Returns a const node iterator to the corresponding - node's i-th child.

-
- -

Comparison Methods

- - - - - - - - - - - - - - - - - - - -
MethodDescription
-
-inline bool
-  operator==
-  (const const_node_iterator &other) const
-
-
-

Compares content to a different iterator object.

-
-
-inline bool
-  operator!=
-  (const const_node_iterator &other) const
-
-
-

Compares content (negatively) to a different iterator - object.

-
-
- - diff --git a/libstdc++-v3/docs/html/ext/pb_ds/trie_node_iterator.html b/libstdc++-v3/docs/html/ext/pb_ds/trie_node_iterator.html deleted file mode 100644 index 55029c4cb91..00000000000 --- a/libstdc++-v3/docs/html/ext/pb_ds/trie_node_iterator.html +++ /dev/null @@ -1,235 +0,0 @@ - - - - - - - trie::node_iterator Interface - - - - -
-

trie::node_iterator - Interface

- -

Node iterator.

- -

This is an "iterator to an iterator" - it iterates over - nodes, and de-referencing it returns one of the tree's - iterators

- -

Base Classes

- - - - - - - - - - - - - -
ClassDerivation Type
-
-trie::const_node_iterator
-
-
-

public

-
- -

Public Types and - Constants

- -

General Container - Definitions

- - - - - - - - - - - - - - - - - -
TypeDefinitionDescription
-
-size_type
-
-
-
-typename trie::const_node_iterator::size_type
-
-
-

Size type.

-
- -

Value-Type Definitions

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
TypeDefinitionDescription
-
-value_type
-
-
-
-container_base::iterator
-
-
-

Iterator's value type.

-
-
-reference
-
-
-
-value_type
-
-
-

Iterator's reference type.

-
-
-const_reference
-
-
-
-value_type
-
-
-

Iterator's const reference type.

-
- -

Public Methods

- -

Constructors, Destructor, and - Related

- - - - - - - - - - - - - -
MethodDescription
-
-inline 
-  pat_trie_node_it_
-  () 
-
-
-

Default constructor.

-
- -

Access Methods

- - - - - - - - - - - - - -
MethodDescription
-
-inline reference
-  operator*
-  () const
-
-
-

Access; returns the iterator associated with the - current leaf.

- -

Should be called only for leaf nodes.

-
- -

Movement Methods

- - - - - - - - - - - - - -
MethodDescription
-
-node_iterator
-  get_child
-  (size_type i) const
-
-
-

Returns a node iterator to the corresponding node's - i-th child.

-
-
- - diff --git a/libstdc++-v3/docs/html/ext/pb_ds/trie_node_updator_policy_cd.png b/libstdc++-v3/docs/html/ext/pb_ds/trie_node_updator_policy_cd.png deleted file mode 100644 index 4376929ec28..00000000000 Binary files a/libstdc++-v3/docs/html/ext/pb_ds/trie_node_updator_policy_cd.png and /dev/null differ diff --git a/libstdc++-v3/docs/html/ext/pb_ds/trie_order_statistics_node_update.html b/libstdc++-v3/docs/html/ext/pb_ds/trie_order_statistics_node_update.html deleted file mode 100644 index dcc236ff520..00000000000 --- a/libstdc++-v3/docs/html/ext/pb_ds/trie_order_statistics_node_update.html +++ /dev/null @@ -1,770 +0,0 @@ - - - - - - - trie_order_statistics_node_update Interface - - - - -
-

trie_order_statistics_node_update Interface

- -

Functor updating ranks of entrees.

- -

Defined in: trie_policy.hpp

- -

Template Parameters

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ParameterDescriptionDefault Value
-
-class Const_Node_Iterator
-
-
-

Const node iterator type.

-
-
-
-class Node_Iterator
-
-
-

Node iterator type.

-
-
-
-class E_Access_Traits
-
-
-

Comparison functor.

-
-
-
-class Allocator
-
-
-

Allocator type.

-
-
- -

Public Types and - Constants

- -

Policy Definitions

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
TypeDefinitionDescription
-
-e_access_traits
-
-
-
-E_Access_Traits
-
-
-

Element access traits.

-
-
-const_e_iterator
-
-
-
-typename e_access_traits::const_iterator
-
-
-

Const element iterator.

-
-
-allocator
-
-
-
-Allocator
-
-
-

Allocator - type.

-
- -

General Definitions

- - - - - - - - - - - - - - - - - -
TypeDefinitionDescription
-
-size_type
-
-
-
-typename allocator::size_type
-
-
-

Size type.

-
- -

Key-Type Definitions

- - - - - - - - - - - - - - - - - - - - - - - - - -
TypeDefinitionDescription
-
-key_type
-
-
-
-The instantiating container's key type.
-
-
-

Key type.

-
-
-const_key_reference
-
-
-
-The instantiating container's const key reference type.
-
-
-

Const key reference.

-
- -

Metadata-Type - Definitions

- - - - - - - - - - - - - - - - - -
TypeDefinitionDescription
-
-metadata_type
-
-
-
-size_type
-
-
-

Metadata type.

-
- -

Iterator Definitions

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
TypeDefinitionDescription
-
-const_node_iterator
-
-
-
-Const_Node_Iterator
-
-
-

Const node iterator type.

-
-
-node_iterator
-
-
-
-Node_Iterator
-
-
-

Node iterator type.

-
-
-const_iterator
-
-
-
-typename const_node_iterator::value_type
-
-
-

Const iterator type.

-
-
-iterator
-
-
-
-typename node_iterator::value_type
-
-
-

Iterator type.

-
- -

Public Methods

- -

Find-Type Methods

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
MethodDescription
-
-inline const_iterator
-  find_by_order
-  (size_type order) const
-
-
-

Finds an entry by order. Returns a const_iterator to - the entry with the order order, or a const_iterator to - the container object's end if order is at least the size of the - container object.

-
-
-inline iterator
-  find_by_order
-  (size_type order)
-
-
-

Finds an entry by order. Returns an iterator to the entry - with the order order, or - an iterator to - the container object's end if order is at least the size of the - container object.

-
-
-inline size_type
-  order_of_key
-  (const_key_reference r_key) const
-
-
-

Returns the order of a key within a sequence. For - example, if r_key is the - smallest key, this method will return 0; if r_key is a key between the smallest - and next key, this method will return 1; if r_key is a key larger than the - largest key, this method will return the size of r_c.

-
-
-inline size_type
-  order_of_prefix
-  (const_e_iterator b,
-    const_e_iterator e) const
-
-
-

Returns the order of a prefix within a sequence. For - eexample, if [b, - e] is the smallest - prefix, this method will return 0; if r_key is a key - bbetween the smallest and - next key, this method will return 1; if r_key is a key - larger than the largest key, this method will return the - size of r_c.

-
- -

Protected Types and - Constants

- -

Value-Type - Definitions

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
TypeDefinitionDescription
-
-const_reference
-
-
-
-The instantiating container's const reference  type.
-
-
-

Const reference to the container's value-type.

-
-
-const_pointer
-
-
-
-The instantiating container's const pointer  type.
-
-
-

Const pointer to the container's value-type.

-
-
-const_metadata_reference
-
-
-
-typename Allocator::template rebind<
-    metadata_type>::other::const_reference
-
-
-

Const metadata reference.

-
-
-metadata_reference
-
-
-
-typename Allocator::template rebind<
-    metadata_type>::other::reference
-
-
-

Metadata reference.

-
- -

Protected Methods

- -

Operators

- - - - - - - - - - - - - -
MethodDescription
-
-inline void
-  operator()
-  (node_iterator node_it,
-    const_node_iterator end_nd_it) const
-
-
-

Updates the rank of a node through a node_iterator - node_it; end_nd_it is the end node iterator.

-
- -

Constructors, destructor, and - related

- - - - - - - - - - - - - -
MethodDescription
-
-virtual 
-  ~trie_order_statistics_node_update
-  ()
-
-
-

Destructor.

-
- -

Private Methods

- -

Overrides

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
MethodDescription
-
-virtual bool
-  empty
-  () const = 0
-
-
-

Returns true if the container is - empty.

-
-
-virtual iterator
-  begin
-  () = 0
-
-
-

Returns the iterator associated with - the trie's first element.

-
-
-virtual iterator
-  end
-  () = 0
-
-
-

Returns the iterator associated with - the trie's just-after-last element.

-
-
-virtual const_node_iterator
-  node_begin
-  () const = 0
-
-
-

Returns the const_node_iterator - associated with the trie's root node.

-
-
-virtual node_iterator
-  node_begin
-  () = 0
-
-
-

Returns the node_iterator - associated with the trie's root node.

-
-
-virtual const_node_iterator
-  node_end
-  () const = 0
-
-
-

Returns the const_node_iterator - associated with a just-after leaf node.

-
-
-virtual node_iterator
-  node_end
-  () = 0
-
-
-

Returns the node_iterator - associated with a just-after leaf node.

-
-
-virtual e_access_traits &
-  get_e_access_traits
-  () = 0
-
-
-

Access to the cmp_fn object.

-
-
- - diff --git a/libstdc++-v3/docs/html/ext/pb_ds/trie_prefix_search_node_update.html b/libstdc++-v3/docs/html/ext/pb_ds/trie_prefix_search_node_update.html deleted file mode 100644 index da6efa2f18f..00000000000 --- a/libstdc++-v3/docs/html/ext/pb_ds/trie_prefix_search_node_update.html +++ /dev/null @@ -1,628 +0,0 @@ - - - - - - - trie_prefix_search_node_update Interface - - - - -
-

trie_prefix_search_node_update Interface

- -

A node updater that allows tries to be searched for the - range of values that match a certain prefix.

- -

Defined in: trie_policy.hpp

- -

Template Parameters

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ParameterDescriptionDefault Value
-
-class Const_Node_Iterator
-
-
-

Const node iterator type.

-
-
-
-class Node_Iterator
-
-
-

Node iterator type.

-
-
-
-class E_Access_Traits
-
-
-

Comparison functor.

-
-
-
-class Allocator
-
-
-

Allocator type.

-
-
- -

Public Types and - Constants

- -

Key-Type Definitions

- - - - - - - - - - - - - - - - - - - - - - - - - -
TypeDefinitionDescription
-
-key_type
-
-
-
-The instantiating container's key type.
-
-
-

Key type.

-
-
-const_key_reference
-
-
-
-The instantiating container's const key reference type.
-
-
-

Const key reference.

-
- -

Policy Definitions

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
TypeDefinitionDescription
-
-e_access_traits
-
-
-
-E_Access_Traits
-
-
-

Element access traits.

-
-
-const_e_iterator
-
-
-
-typename e_access_traits::const_iterator
-
-
-

Const element iterator.

-
-
-allocator
-
-
-
-Allocator
-
-
-

Allocator - type.

-
- -

General Definitions

- - - - - - - - - - - - - - - - - -
TypeDefinitionDescription
-
-size_type
-
-
-
-typename allocator::size_type
-
-
-

Size type.

-
- -

Metadata-Type - Definitions

- - - - - - - - - - - - - - - - - -
TypeDefinitionDescription
-
-metadata_type
-
-
-
-__gnu_pbds::detail::null_node_metadata
-
-
-

Metadata type.

-
- -

Iterator Definitions

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
TypeDefinitionDescription
-
-const_node_iterator
-
-
-
-Const_Node_Iterator
-
-
-

Const node iterator type.

-
-
-node_iterator
-
-
-
-Node_Iterator
-
-
-

Node iterator type.

-
-
-const_iterator
-
-
-
-typename const_node_iterator::value_type
-
-
-

Const iterator type.

-
-
-iterator
-
-
-
-typename node_iterator::value_type
-
-
-

Iterator type.

-
- -

Public Methods

- -

Find Methods

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
MethodDescription
-
-std::pair<
-    const_iterator,
-    const_iterator>
-  prefix_range
-  (const_key_reference r_key) const
-
-
-

Finds the const iterator range - corresponding to all values whose prefixes match - r_key.

-
-
-std::pair<
-    iterator,
-    iterator>
-  prefix_range
-  (const_key_reference r_key)
-
-
-

Finds the iterator range - corresponding to all values whose prefixes match - r_key.

-
-
-std::pair<
-    const_iterator,
-    const_iterator>
-  prefix_range
-  (const_e_iterator b,
-    const_e_iterator e) const
-
-
-

Finds the const iterator range - corresponding to all values whose prefixes match [b, - e).

-
-
-std::pair<
-    iterator,
-    iterator>
-  prefix_range
-  (const_e_iterator b,
-    const_e_iterator e)
-
-
-

Finds the iterator range - corresponding to all values whose prefixes match [b, - e).

-
- -

Protected Methods

- -

Operators

- - - - - - - - - - - - - -
MethodDescription
-
-inline void
-  operator()
-  (node_iterator node_it,
-    const_node_iterator end_nd_it) const
-
-
-

Called to update a node's metadata.

-
- -

Private Methods

- -

Overrides

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
MethodDescription
-
-virtual const_iterator
-  end
-  () const = 0
-
-
-

Returns the const iterator associated with - the just-after last element.

-
-
-virtual iterator
-  end
-  () = 0
-
-
-

Returns the iterator associated with - the just-after last element.

-
-
-virtual const_node_iterator
-  node_begin
-  () const = 0
-
-
-

Returns the const_node_iterator - associated with the trie's root node.

-
-
-virtual node_iterator
-  node_begin
-  () = 0
-
-
-

Returns the node_iterator - associated with the trie's root node.

-
-
-virtual const_node_iterator
-  node_end
-  () const = 0
-
-
-

Returns the const_node_iterator - associated with a just-after leaf node.

-
-
-virtual node_iterator
-  node_end
-  () = 0
-
-
-

Returns the node_iterator - associated with a just-after leaf node.

-
-
-virtual const e_access_traits &
-  get_e_access_traits
-  () const = 0
-
-
-

Access to the cmp_fn object.

-
-
- - diff --git a/libstdc++-v3/docs/html/ext/pb_ds/trie_tag.html b/libstdc++-v3/docs/html/ext/pb_ds/trie_tag.html deleted file mode 100644 index 6d2def4e77f..00000000000 --- a/libstdc++-v3/docs/html/ext/pb_ds/trie_tag.html +++ /dev/null @@ -1,47 +0,0 @@ - - - - - - - trie_tag Interface - - - - -
-

trie_tag Interface

- -

Basic trie data structure tag.

- -

Defined in: tag_and_trait.hpp

- -

Base Classes

- - - - - - - - - - - - - -
ClassDerivation Type
-
-basic_tree_tag
-
-
-

public

-
-
- - diff --git a/libstdc++-v3/docs/html/ext/pb_ds/trivial_iterator_tag.html b/libstdc++-v3/docs/html/ext/pb_ds/trivial_iterator_tag.html deleted file mode 100644 index be9813be3cb..00000000000 --- a/libstdc++-v3/docs/html/ext/pb_ds/trivial_iterator_tag.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - trivial_iterator_tag Interface - - - - -
-

trivial_iterator_tag Interface

- -

A \quot;trivial\quot; iterator tag. Signifies that the - iterators has none of the STL's movement abilities.

- -

Defined in: tag_and_trait.hpp

-
- - diff --git a/libstdc++-v3/docs/html/ext/pb_ds/tutorial.html b/libstdc++-v3/docs/html/ext/pb_ds/tutorial.html deleted file mode 100644 index 029204b3b20..00000000000 --- a/libstdc++-v3/docs/html/ext/pb_ds/tutorial.html +++ /dev/null @@ -1,670 +0,0 @@ - - - - - - - Tutorial - - - - -
-

Short Tutorial

- -

Following is a short tutorial illustrating the main points - of pb_ds. Concepts - describes and summarizes some concepts.

- -

Associative - Containers

- -

Basic Use

- -

For the most part, pb_ds's containers have the same - interface as the STL's, except for the names used for the - container classes themselves. For example, this shows basic - operations on a collision-chaining hash-based container:

- -
-cc_hash_table<int, char> c;
-
-c[2] = 'b';
-
-assert(c.find(1) == c.end());
-
- -

The container is called cc_hash_table as - opposed to unordered_map, since "unordered map" does - not necessarily mean a hash-based map (as the STL implicitly - implies). For example, list-based associative containers, which - are very useful for the construction of "multimaps" (see - Associative-Container - Performance Tests::Observations::Mapping-Semantics - Considerations), are also unordered. It is also not called - hash_map since there are more ways than one to - implement hash tables.

- -

This snippet shows a red-black tree based container:

-
-tree<int, char> c;
-
-c[2] = 'b';
-
-assert(c.find(2) != c.end());
-
- -

The container is called tree - as opposed to map, since "map" doesn't say that - much.

- -

Most of the STL's familiar methods are unchanged. - E.g., being, end, size, - empty, and clear, do just the same as is - customary. Associative-Container - Examples::Basic use, and especially basic_map.cc, - show examples of this.

- -

This isn't to say that things are exactly as one would expect, -given the container requirments and interfaces in the C++ -standard.

- - -

The names of containers' policies and policy accessors are - different than those of the STL. For example, if C is - some type of hash-based container, then

-
-C::hash_fn
-
gives the type of its hash functor, and if c is some -hash-based container object, then -
-c.get_hash_fn()
-
- -

will return a reference to its hash-functor object.

- -

Similarly, if C is some type of tree-based - container, then

-
-C::cmp_fn
-
gives the type of its comparison functor, and if c -is some tree-based container object, then -
-c.get_cmp_fn()
-
- -

will return a reference to its comparison-functor - object.

- -

It would be nice to give names consistent with those in the - existing C++ standard (inclusive of TR1). Unfortunately, these - standard containers don't consistently name types and - methods. For example, std::tr1::unordered_map uses - hasher for the hash functor, but std::map uses - key_compare for the comparison functor. Also, we could - not find an accessor for std::tr1::unordered_map's hash - functor, but std::map uses compare for accessing - the comparison functor.

- -

Instead, pb_ds attempts to be internally consistent, and -uses standard-derived terminology if possible. -

- -

Another source of difference is in scope: pb_ds - contains more types of associative containers than the STL, and - more opportunities to configure these new containers, since - different types of associative containers are useful in different - settings (see Associative-Container - Performance Tests::Observations::Underlying Data-Structure - Families).

- -

pb_ds contains different classes for hash-based containers, - tree-based containers, trie-based containers, and list-based - containers. Inteface::Containers::Associative - Containers lists the containers. Design::Associative - Containers::Hash-Based Containers, Design::Associative - Containers::Tree-Based Containers, Design::Associative - Containers::Trie-Based Containers, and Design::Associative - Containers::List-Based Containers, explain some more about - these types of containers, respectively.

- -

Since associative containers share parts of their interface, - they are organized as a class hierarchy; it is shown in Figure - Class hierarchy.

- -
-
- -
Class hierarchy.
- -

Each type or method is defined in the most-common ancestor - in which it makes sense: - basic_map.cc - shows an example of most of the associative-container - types.

- - -

For example, all associative containers support iteration. - Consequently, container_base has the - interface:

-
-template<...>
-class container_base
-{
-    ...
-    
-public:
-    ...
-    
-    const_iterator
-    begin() const;
-    
-    iterator
-    begin();
-
-    const_iterator
-    end() const;
-    
-    iterator
-    end();
-        
-    ...
-};
-
- -

and so all associative containers inherent this method. - Conversely, both collision-chaining and (general) probing - hash-based associative containers have a hash functor, so - basic_hash_table - has the interface:

-
-template<...>
-class basic_hash_table : public container_base
-{
-    ...
-    
-public:
-    ...
-    
-    const hash_fn&
-    get_hash_fn() const;
-        
-    hash_fn&
-    get_hash_fn();
-    ...
-};
-
- -

and so all hash-based associative containers inherit the - same hash-functor accessor methods.

- -

This is discussed further in Design::Associative Containers::Data-Structure - Genericity.

- -

Configuring - Associative Containers

- -

In general, each of pb_ds's containers is - parametrized by more policies than those of the STL's. For - example, the STL's hash-based container is parametrized as - follows:

-
-template<
-    typename Key,
-    typename Mapped,
-    typename Hash,
-    typename Pred,
-    typename Allocator,
-    bool Cache_Hashe_Code>
-class unordered_map;
-
- -

and so can be configured by key type, mapped type, a functor - that translates keys to unsigned integral types, an equivalence - predicate, an allocator, and an indicator whether to store hash - values with each entry. pb_ds's collision-chaining - hash-based container is parametrized as

-
-template<
-    typename Key,
-    typename Mapped,
-    typename Hash_Fn,
-    typename Eq_Fn,
-    typename Comb_Hash_Fn,
-    typename Resize_Policy
-    bool Store_Hash
-    typename Allocator>
-class cc_hash_table;
-
- -

and so can be configured by the first four types of - std::tr1::unordered_map, then a policy for translating - the key-hash result into a position within the table, then a - policy by which the table resizes, an indicator whether to - store hash values with each entry, and an allocator (which is - typically the last template parameter in STL containers).

- -

Nearly all policy parameters have default values, so this - need not be considered for casual use. It is important to note, - however, that hash-based containers' policies can dramatically - alter their performance in different settings, and that - tree-based containers' policies can make them useful for other - purposes than just look-up.

- -

Design::Associative - Containers::Hash-Based Containers, Design::Associative - Containers::Tree-Based Containers, Design::Associative - Containers::Trie-Based Containers, and Design::Associative - Containers::List-Based Containers, explain some more about - configuring hash based, tree based, trie based, and list base - containers, respectively. Interface::Container Policy - Classes shows the different policy classes for configuring - associative containers. Examples::Hash-Based - Containers, Examples::Tree-Like-Based - Containers, and Examples::Trie-Based - Containers show examples for this.

- -

Determining - Containers' Attributes

- -

Associative-containers' underlying data structures obviously - affect their performance; Unfortunately, they can also affect - their interface. When manipulating generically associative - containers, it is often useful to be able to statically - determine what they can support and what the cannot. (This was - discussed in Motivation::Associative - Containers::Data-Structure Genericity.)

- -

Happily, the STL provides a good solution to a similar - problem - that of the different behavior of iterators. If - It is an iterator, then

-
-typename std::iterator_traits<It>::iterator_category
-
- -

is one of a small number of pre-defined - structs, and,

-
-typename std::iterator_traits<It>::value_type
-
- -

is the value type to which the iterator "points".

- -

Similarly, in pb_ds, if C is an - associative container, then

-
-typename container_traits<C>::container_category
-
is one of a small number of pre-defined -structs, each one corresponding to a class in -Figure Class hierarchy. These tags are listed in -Interface::Associative -Containers::Data-Structure Tags and Traits::Data-Structure -Tags::Associative-Containers; - Design::Associative Containers::Data-Structure Tags and - Traits explains this further; Design::Associative - Containers::Data-Structure Tags and Traits::Data-structure tag - class hierarchy shows a class diagram. - -

In most cases, however, the exact underlying data structure - is not really important, but only one of its attributes: - whether it guarantees storing elements by key order, for - example. For this one can use

-
-typename container_traits<C>::order_preserving
-
- -

This is described further in Design::Data-Structure Genericity; assoc_container_traits.cc - shows an example of querying containers' attributes.

- -

Point-Type - and Range-Type Methods and Iterators

(This subsection - addresses points from Motivation::Associative - Containers::Differentiating between Iterator Types.) - -

pb_ds differentiates between two types of methods - and iterators: point-type, and range-type. For example, - find and insert are point-type methods, since - they each deal with a specific element; their returned - iterators are point-type iterators. begin and - end are range-type methods, since they are not used to - find a specific element, but rather to go over all elements in - a container object; their returned iterators are range-type - iterators.

- -

Most containers store elements in an order that is - determined by their interface. Correspondingly, it is fine that - their point-type iterators are synonymous with their range-type - iterators. For example, in the following snippet

-
-std::for_each(c.find(1), c.find(5), foo);
-
two point-type iterators (returned by find) are used -for a range-type purpose - going over all elements whose key is -between 1 and 5. - -

Conversely, the above snippet makes no sense for - self-organizing containers - ones that order (and reorder) - their elements by implementation. It would be nice to have a - uniform iterator system that would allow the above snippet to - compile only if it made sense.

- -

This could trivially be done by specializing - std::for_each for the case of iterators returned by - std::tr1::unordered_map, but this would only solve the - problem for one algorithm and one container. Fundamentally, the - problem is that one can loop using a self-organizing - container's point-type iterators.

- -

pb_ds's containers define two families of - iterators: const_point_iterator and - point_iterator are the iterator types returned by - point-type methods; const_iterator and - iterator are the iterator types returned by range-type - methods.

-
-class <- some container ->
-{
-public:
-    ...
-
-    typedef <- something -> const_iterator;
-
-    typedef <- something -> iterator;
-
-    typedef <- something -> const_point_iterator;
-
-    typedef <- something -> point_iterator;
- 
-    ...
-
-public:
-    ...
-
-    const_iterator begin () const;
-
-    iterator begin();
-
-    const_point_iterator find(...) const;
-
-    point_iterator find(...);
-};
-
- -

Design::Associative - Containers::Data-Structure Genericity::Point-Type and - Range-Type Methods and Iterators discusses the relationship - between point-type and range-type iterators in general; for - containers whose interface defines sequence order, however, it - is very simple: point-type and range-type iterators are exactly - the same, which means that the above snippet will compile if it - is used for an order-preserving associative container.

- -

For self-organizing containers, however, (hash-based - containers as a special example), the preceding snippet will - not compile, because their point-type iterators do not support - operator++.

- -

In any case, both for order-preserving and self-organizing - containers, the following snippet will compile:

-
-typename Cntnr::point_iterator it = c.find(2);
-
- -

because a range-type iterator can always be converted to a - point-type iterator.

- -

Design::Associative - Containers::Data-Structure Genericity::Point-Type and - Range-Type Methods and Iterators discusses this - further.

- -

Motivation::Associative - Containers::Differentiating between Iterator Types also - raised the point that a container's iterators might have - different invalidation rules concerning their de-referencing - abilities and movement abilities. This now corresponds exactly - to the question of whether point-type and range-type iterators - are valid. As explained in Determining - Containers' Attributes, container_traits allows - querying a container for its data structure attributes. The - iterator-invalidation guarantees are certainly a property of - the underlying data structure, and so

-
-container_traits<C>::invalidation_guarantee
-
- -

gives one of three pre-determined types that answer this - query. This is explained further in Design::Associative - Containers::Data-Structure Genericity::Point-Type and - Range-Type Methods and Iterators.

- -

Distinguishing between Maps and Sets

- -

Anyone familiar with the STL knows that there are four kinds - of associative containers: maps, sets, multimaps, and - multisets. Basic Use discussed how - to use maps, i.e. containers that associate each key to - some data.

- -

Sets are associative containers that simply store keys - - they do not map them to anything. In the STL, each map class - has a corresponding set class. E.g., - std::map<int, char> maps each - int to a char, but - std::set<int, char> simply stores - ints. In pb_ds, however, there are no - distinct classes for maps and sets. Instead, an associative - container's Mapped template parameter is a policy: if - it is instantiated by null_mapped_type, then it - is a "set"; otherwise, it is a "map". E.g.,

-
-cc_hash_table<int, char>
-
is a "map" mapping each int value to a - char, but -
-cc_hash_table<int, null_mapped_type>
-
is a type that uniquely stores int values. - -

Once the Mapped template parameter is instantiated - by null_mapped_type, then - the "set" acts very similarly to the STL's sets - it does not - map each key to a distinct null_mapped_type object. Also, - , the container's value_type is essentially - its key_type - just as with the STL's sets. For a simple example, see basic_set.cc - .

- -

The STL's multimaps and multisets allow, respectively, - non-uniquely mapping keys and non-uniquely storing keys. As - discussed in Motivation::Associative - Containers::Alternative to Multiple Equivalent Keys, the - reasons why this might be necessary are 1) that a key might be - decomposed into a primary key and a secondary key, 2) that a - key might appear more than once, or 3) any arbitrary - combination of 1)s and 2)s. Correspondingly, - one should use 1) "maps" mapping primary keys to secondary - keys, 2) "maps" mapping keys to size types, or 3) any arbitrary - combination of 1)s and 2)s. Thus, for example, an - std::multiset<int> might be used to store - multiple instances of integers, but using pb_ds's - containers, one might use

-
-tree<int, size_t>
-
i.e., a "map" of ints to -size_ts. - -

Associative-Container - Examples::"Multimaps" and "Multisets" shows some simple - examples.

- -

These "multimaps" and "multisets" might be confusing to - anyone familiar with the STL's std::multimap and - std::multiset, because there is no clear - correspondence between the two. For example, in some cases - where one uses std::multiset in the STL, one might use - in pb_ds a "multimap" of "multisets" - i.e., a - container that maps primary keys each to an associative - container that maps each secondary key to the number of times - it occurs.

- -

When one uses a "multimap," one should choose with care the - type of container used for secondary keys. This is further - explained in Associative-Container - Performance Tests::Observations::Mapping-Semantics - Considerations.

- -
-

Priority Queues

- -

Basic Use

- -

pb_ds's priority_queue container is - similar to the STL's in interface. For example:

-
-priority_queue<int> p;
-
-p.push(2);
-p.push(4);
-p.push(1);
-
-assert(p.top() == 4);
-
-p.pop();
-
-assert(p.top() == 2);
-
-assert(p.size() == 2);
-assert(!p.empty());
-
- -

Configuring Priority - Queues

- -

As opposed to associative containers, priority queues have - relatively few configuration options. The priority queue is - parametrized as follows:

-
-template<
-    typename Value_Type,
-    typename Cmp_Fn,
-    typename Tag,
-    typename Allocator>
-class priority_queue;
-
- -

The Value_Type, Cmp_Fn, and - Allocator parameters are the container's value type, - comparison-functor type, and allocator type, respectively; - these are very similar to the STL's priority queue. The - Tag parameter is different: there are a number of - pre-defined tag types corresponding to binary heaps, binomial - heaps, etc., and Tag should be instantiated - by one of them. Interface::Data-Structure Tags and - Traits::Data Structure Tags::Priority-Queues lists the - possible types, Priority-Queue - Design explains this further, and basic_priority_queue.cc - shows an example.

- -

Note that as opposed to the STL's priority queue, priority_queue is not a - sequence-adapter; it is a regular container.

- -

Supporting - More Operations

- -

priority_queue's - push method returns a point-type iterator, which can - be used for modifying or erasing arbitrary values. For - example:

-
-priority_queue<int> p;
-
-priority_queue<int>::point_iterator it = p.push(3);
-
-p.modify(it, 4);
-
- -

These types of operations are necessary for making priority - queues useful for different applications, especially graph - applications. Priority-Queue - Examples::Cross-Referencing gives some examples.

- -

Determining Container - Attributes

- -

Similarly to container_traits (described - in Associative Containers::Determining - Containers' Attributes), container_traits can be used to - statically determine priority-queues' attributes:

-
-container_traits<C>::container_category
-
is one of a small number of predefined tag structures that -identifies the underlying data structure, and -
-container_traits<C>::invalidation_guarantee
-
- -

is its invalidation guarantee. Invalidation guarantees are - especially important regarding priority queues, since in - pb_ds's design, iterators are practically the only way - to manipulate them.

- -

Design::Priority - Queues::Traits discusses this further. Priority-Queue - Examples::Generics shows an example.

-
- - diff --git a/libstdc++-v3/docs/html/ext/pb_ds/update_policy_cd.png b/libstdc++-v3/docs/html/ext/pb_ds/update_policy_cd.png deleted file mode 100644 index 115a751c350..00000000000 Binary files a/libstdc++-v3/docs/html/ext/pb_ds/update_policy_cd.png and /dev/null differ diff --git a/libstdc++-v3/docs/html/ext/pb_ds/update_seq_diagram.png b/libstdc++-v3/docs/html/ext/pb_ds/update_seq_diagram.png deleted file mode 100644 index 880a50edf8e..00000000000 Binary files a/libstdc++-v3/docs/html/ext/pb_ds/update_seq_diagram.png and /dev/null differ diff --git a/libstdc++-v3/docs/html/ext/sgiexts.html b/libstdc++-v3/docs/html/ext/sgiexts.html deleted file mode 100644 index 64b8e3138c1..00000000000 --- a/libstdc++-v3/docs/html/ext/sgiexts.html +++ /dev/null @@ -1,253 +0,0 @@ - - - - - - - - - - HP/SGI STL extensions - - - - - - - - -

HP/SGI STL extensions

- -

This page describes the extensions that SGI made to the STL subset - of the Standard C++ Library, which also includes work from the - originating HP codebase. This work is the basis for much of - libstdc++, and where possible these extensions have been - preserved. -

- -

What follows is a listing of these extensions, according to the - chapters of the library that they extend - (see the chapter-specific - notes for a description). Not every chapter has extensions, - and existing extensions may be removed (or moved) as their - functionality is standardized. -

- -

Descriptions range from the scanty to the verbose. Also check - the generated documentation - for notes and comments, especially for entries marked with '*'. - For more complete doumentation, see the SGI website. - For really complete documentation, consider perusing a - copy of Matt Austern's book "Generic Programming and the STL." -

- -

Back to the libstdc++ extensions. -

- - - -
-

Chapter 20

-

The <functional> header contains many additional functors and - helper functions, extending section 20.3. They are implemented in the - file stl_function.h: -

-
    -
  • identity_element for addition and multiplication. *
  • -
  • The functor identity, whose operator() - returns the argument unchanged. *
  • -
  • Composition functors unary_function and - binary_function, and their helpers compose1 - and compose2. *
  • -
  • select1st and select2nd, to strip pairs. *
  • -
  • project1st and project2nd. *
  • -
  • A set of functors/functions which always return the same result. They - are constant_void_fun, constant_binary_fun, - constant_unary_fun, constant0, - constant1, and constant2. *
  • -
  • The class subtractive_rng. *
  • -
  • mem_fun adaptor helpers mem_fun1 and - mem_fun1_ref are provided for backwards compatibility.
  • -
-

20.4.1 can use several different allocators; they are described on the - main extensions page. -

-

20.4.3 is extended with a special version of - get_temporary_buffer taking a second argument. The argument - is a pointer, which is ignored, but can be used to specify the template - type (instead of using explicit function template arguments like the - standard version does). That is, in addition to -

-
-   get_temporary_buffer<int>(5);
- you can also use -
-   get_temporary_buffer(5, (int*)0);
-

A class temporary_buffer is given in stl_tempbuf.h. * -

-

The specialized algorithms of section 20.4.4 are extended with - uninitialized_copy_n. * -

-

Return to the main extensions page or - to the homepage. -

- - -
-

Chapter 23

-

A few extensions and nods to backwards-compatibility have been made with - containers. Those dealing with older SGI-style allocators are dealt with - elsewhere. The remaining ones all deal with bits: -

-

The old pre-standard bit_vector class is present for - backwards compatibility. It is simply a typedef for the - vector<bool> specialization. -

-

The bitset class has a number of extensions, described in the - rest of this item. First, we'll mention that this implementation of - bitset<N> is specialized for cases where N number of - bits will fit into a single word of storage. If your choice of N is - within that range (<=32 on i686-pc-linux-gnu, for example), then all - of the operations will be faster. -

-

There are - versions of single-bit test, set, reset, and flip member functions which - do no range-checking. If we call them member functions of an instantiation - of "bitset<N>," then their names and signatures are: -

-
-   bitset<N>&   _Unchecked_set   (size_t pos);
-   bitset<N>&   _Unchecked_set   (size_t pos, int val);
-   bitset<N>&   _Unchecked_reset (size_t pos);
-   bitset<N>&   _Unchecked_flip  (size_t pos);
-   bool         _Unchecked_test  (size_t pos);
-

Note that these may in fact be removed in the future, although we have - no present plans to do so (and there doesn't seem to be any immediate - reason to). -

-

The semantics of member function operator[] are not specified - in the C++ standard. A long-standing defect report calls for sensible - obvious semantics, which are already implemented here: op[] - on a const bitset returns a bool, and for a non-const bitset returns a - reference (a nested type). However, this implementation does - no range-checking on the index argument, which is in keeping with other - containers' op[] requirements. The defect report's proposed - resolution calls for range-checking to be done. We'll just wait and see... -

-

Finally, two additional searching functions have been added. They return - the index of the first "on" bit, and the index of the first - "on" bit that is after prev, respectively: -

-
-   size_t _Find_first() const;
-   size_t _Find_next (size_t prev) const;
-

The same caveat given for the _Unchecked_* functions applies here also. -

-

Return to the main extensions page or - to the homepage. -

- - -
-

Chapter 24

-

24.3.2 describes struct iterator, which didn't exist in the - original HP STL implementation (the language wasn't rich enough at the - time). For backwards compatibility, base classes are provided which - declare the same nested typedefs: -

-
    -
  • input_iterator
  • -
  • output_iterator
  • -
  • forward_iterator
  • -
  • bidirectional_iterator
  • -
  • random_access_iterator
  • -
-

24.3.4 describes iterator operation distance, which takes - two iterators and returns a result. It is extended by another signature - which takes two iterators and a reference to a result. The result is - modified, and the function returns nothing. -

-

Return to the main extensions page or - to the homepage. -

- - -
-

Chapter 25

-

25.1.6 (count, count_if) is extended with two more versions of count - and count_if. The standard versions return their results. The - additional signatures return void, but take a final parameter by - reference to which they assign their results, e.g., -

-
-   void count (first, last, value, n);
-

25.2 (mutating algorithms) is extended with two families of signatures, - random_sample and random_sample_n. -

-

25.2.1 (copy) is extended with -

-
-   copy_n (_InputIter first, _Size count, _OutputIter result);
-

which copies the first 'count' elements at 'first' into 'result'. -

-

25.3 (sorting 'n' heaps 'n' stuff) is extended with some helper - predicates. Look in the doxygen-generated pages for notes on these. -

-
    -
  • is_heap tests whether or not a range is a heap.
  • -
  • is_sorted tests whether or not a range is sorted in - nondescending order.
  • -
-

25.3.8 (lexigraphical_compare) is extended with -

-
-   lexicographical_compare_3way(_InputIter1 first1, _InputIter1 last1,
-                                 _InputIter2 first2, _InputIter2 last2)
-

which does... what? -

-

Return to the main extensions page or - to the homepage. -

- - -
-

Chapter 26

-

26.4, the generalized numeric operations such as accumulate, are extended - with the following functions: -

-
-   power (x, n);
-   power (x, n, moniod_operation);
-

Returns, in FORTRAN syntax, "x ** n" where n>=0. In the - case of n == 0, returns the identity element for the - monoid operation. The two-argument signature uses multiplication (for - a true "power" implementation), but addition is supported as well. - The operation functor must be associative. -

-

The iota function wins the award for Extension With the - Coolest Name. It "assigns sequentially increasing values to a range. - That is, it assigns value to *first, value + 1 to *(first + 1) and so - on." Quoted from SGI documentation. -

-
-   void iota(_ForwardIter first, _ForwardIter last, _Tp value);
-

Return to the main extensions page or - to the homepage. -

- - - - -
-

-See license.html for copying conditions. -Comments and suggestions are welcome, and may be sent to -the libstdc++ mailing list. -

- - - - diff --git a/libstdc++-v3/docs/html/faq/index.html b/libstdc++-v3/docs/html/faq/index.html deleted file mode 100644 index ff6cd65c9a6..00000000000 --- a/libstdc++-v3/docs/html/faq/index.html +++ /dev/null @@ -1,1215 +0,0 @@ - - - - - - - - - libstdc++ FAQ - - - - - - -

libstdc++ Frequently Asked Questions

- -

- The latest version of this document is always available at - - http://gcc.gnu.org/onlinedocs/libstdc++/faq/. The main documentation - page is at - - http://gcc.gnu.org/onlinedocs/libstdc++/documentation.html. -

- -

- To the libstdc++ homepage. -

- - -
-

Questions

-
    -
  1. General Information - -
      -
    1. What is libstdc++?
    2. -
    3. Why should I use libstdc++?
    4. -
    5. Who's in charge of it?
    6. -
    7. [removed]
    8. -
    9. When is libstdc++ going to be finished?
    10. -
    11. How do I contribute to the effort?
    12. -
    13. What happened to libg++? I need that!
    14. -
    15. What if I have more questions?
    16. -
    17. What are the license terms for libstdc++?
    18. -
    -
  2. - -
  3. Installation -
      -
    1. How do I install libstdc++?
    2. -
    3. [removed]
    4. -
    5. What is this SVN thing that you keep - mentioning?
    6. -
    7. How do I know if it works?
    8. -
    9. This library is HUGE! And what's libsupc++?
    10. -
    11. Why do I get an error saying - libstdc++.so.X is missing when I - run my program?
    12. -
    -
  4. - -
  5. Platform-Specific Issues -
      -
    1. Can libstdc++ be used with <my - favorite compiler>?
    2. -
    3. [removed]
    4. -
    5. [removed]
    6. -
    7. I can't use 'long long' on Solaris
    8. -
    9. _XOPEN_SOURCE / - _GNU_SOURCE / etc is always defined -
    10. -
    11. OS X ctype.h is broken! How can I hack it?
    12. -
    13. Threading is broken on i386
    14. -
    15. Recent GNU/Linux glibc required?
    16. -
    17. Can't use wchar_t/wstring on FreeBSD
    18. -
    19. MIPS atomic operations
    20. -
    -
  6. - -
  7. Known Bugs and Non-Bugs -
      -
    1. What works already?
    2. -
    3. Bugs in gcc/g++ (not libstdc++)
    4. -
    5. Bugs in the C++ language/lib specification
    6. -
    7. Things in libstdc++ that only look like bugs -
    8. -
    9. Aw, that's easy to fix!
    10. -
    -
  8. - -
  9. Miscellaneous -
      -
    1. string::iterator is not char*; - vector<T>::iterator is not T*
    2. -
    3. What's next after libstdc++?
    4. -
    5. What about the STL from SGI?
    6. -
    7. Extensions and Backward Compatibility
    8. -
    9. Does libstdc++ support TR1?
    10. -
    11. Is libstdc++ thread-safe?
    12. -
    13. How do I get a copy of the ISO C++ Standard?
    14. -
    15. What's an ABI and why is it so messy?
    16. -
    17. How do I make std::vector<T>::capacity() - == std::vector<T>::size?
    18. -
    -
  10. - -
- -
- - - -

1.0 General Information

- -

1.1 What is libstdc++?

-

The GNU Standard C++ Library v3 is an - ongoing project to implement the ISO 14882 Standard C++ library - as described in chapters 17 through 27 and annex D. - For those who want to see exactly how - far the project has come, or just want the latest - bleeding-edge code, the up-to-date source is available over - anonymous SVN, and can even be browsed over the - web. -

- -
-

1.2 Why should I use libstdc++?

-

The completion of the ISO C++ standardization gave the - C++ community a powerful set of reuseable tools in the form - of the C++ Standard Library. However, all existing C++ - implementations are (as the Draft Standard used to say) - "incomplet and incorrekt," and many suffer from - limitations of the compilers that use them. -

-

The GNU C/C++/FORTRAN/<pick-a-language> compiler - (gcc, g++, etc) is widely considered to be - one of the leading compilers in the world. Its development - is overseen by the - GCC team. All of - the rapid development and near-legendary - portability - that are the hallmarks of an open-source project are being - applied to libstdc++. -

-

That means that all of the Standard classes and functions - (such as string, vector<>, iostreams, - and algorithms) will be freely available and fully compliant. - Programmers will no longer need to "roll their own" - nor be worried about platform-specific incompatibilities. -

- -
-

1.3 Who's in charge of it?

-

The libstdc++ project is contributed to by several developers - all over the world, in the same way as GCC or Linux. - Benjamin Kosnik, Gabriel Dos Reis, Phil Edwards, Ulrich Drepper, - Loren James Rittle, and Paolo Carlini are the lead maintainers of - the SVN archive. -

-

Development and discussion is held on the libstdc++ mailing - list. Subscribing to the list, or searching the list - archives, is open to everyone. You can read instructions for - doing so on the homepage. - If you have questions, ideas, code, or are just curious, sign up! -

- -
-

1.4 How do I get libstdc++?

- -

Stable versions of libstdc++-v3 are included with releases of - the GCC compilers. -

- -
-

1.5 When is libstdc++ going to be finished?

- -

Nathan Myers gave the best of all possible answers, responding to a - Usenet article asking this question: Sooner, if you help. -

- -
-

1.6 How do I contribute to the effort?

-

Here is a - page devoted to this topic. Subscribing to the mailing - list (see above, or the homepage) is a very good idea if you - have something to contribute, or if you have spare time and - want to help. Contributions don't have to be in the form of - source code; anybody who is willing to help write - documentation, for example, or has found a bug in code that - we all thought was working, is more than welcome! -

- -
-

1.7 What happened to libg++? I need that!

-

The most recent libg++ README states that libg++ is no longer - being actively maintained. It should not be used for new - projects, and is only being kicked along to support older code. -

-

The libg++ was designed and created when there was no Standard - to provide guidance. Classes like linked lists are now provided - for by list<T> and do not need to be created by - genclass. (For that matter, templates exist now and - are well-supported, whereas genclass (mostly) predates them.) -

-

There are other classes in libg++ that are not specified in the - ISO Standard (e.g., statistical analysis). While there are a - lot of really useful things that are used by a lot of people - (e.g., statistics :-), the Standards Committee couldn't include - everything, and so a lot of those "obvious" classes - didn't get included. -

-

Since libstdc++ is an implementation of the Standard Library, we - have no plans at this time to include non-Standard utilities - in the implementation, however handy they are. (The extensions - provided in the SGI STL aren't maintained by us and don't get - a lot of our attention, because they don't require a lot of our - time.) It is entirely plausible that the "useful stuff" - from libg++ might be extracted into an updated utilities library, - but nobody has started such a project yet. -

-

(The Boost site houses free - C++ libraries that do varying things, and happened to be started - by members of the Standards Committee. Certain "useful - stuff" classes will probably migrate there.) -

-

For the bold and/or desperate, the - GCC extensions page - describes where to find the last libg++ source. -

- -
-

1.8 What if I have more questions?

-

If you have read the README file, and your - question remains unanswered, then just ask the mailing list. - At present, you do not need to be subscribed to the list to - send a message to it. More information is available on the - homepage (including how to browse the list archives); to send - to the list, use - libstdc++@gcc.gnu.org. -

-

If you have a question that you think should be included here, - or if you have a question about a question/answer here, - contact Phil Edwards - or Gabriel Dos Reis. -

- -
-

1.9 What are the license terms for libstdc++?

-

See our license description - for these and related questions. -

- -
-

2.0 Installation

-

2.1 How do I install libstdc++?

-

Complete instructions are not given here (this is a FAQ, not - an installation document), but the tools required are few: -

-
    -
  • A 3.x or later release of GCC. Either install a suitable - package for your system, or compile GCC from the sources. - Note that building GCC - is much easier and more automated than building the GCC - 2.[78] series was. If you are using GCC 2.95, you can - still build earlier snapshots of libstdc++ but you - should consult the documentation that comes with the - sources, the instructions are no longer included here. -
  • -
  • GNU Make is required to build GCC 3.4 and later. -
  • -
  • The GNU Autotools are needed if you are messing with - the configury or makefiles. -
  • -
-

The file documentation.html - links to documentation of the steps necessary to build, install, - and use the library. Instructions for configuring the library - with flags such as --enable-threads are there also. -

-

The top-level install.html file contains - the exact build and installation instructions. You may wish to - browse those files over ViewVC ahead of time to get a feel for - what's required. -

- -
-

2.2 [removed]

-

This question has become moot and has been removed. The stub - is here to preserve numbering (and hence links/bookmarks). -

- -
-

2.3 What is this SVN thing that you - keep mentioning?

-

Subversion is one of several revision control packages. - It was selected for GNU projects because it's free (speech), free (beer), - and very high quality. The - Subversion home page has a better description. -

-

The "anonymous client checkout" feature of SVN is - similar to anonymous FTP in that it allows anyone to retrieve - the latest libstdc++ sources. -

-

After the first of April, American users will have a - "/pharmacy" command-line option... - -

- -
-

2.4 How do I know if it works?

-

libstdc++ comes with its own testsuite. You do not need - to actually install the library ("make - install") to run the testsuite, but you do need - DejaGNU, as described - here. -

-

To run the testsuite on the library after building it, use - "make check" while in your build directory. To run - the testsuite on the library after building and installing it, - use "make check-install" instead. -

-

If you find bugs in the testsuite programs themselves, or if you - think of a new test program that should be added to the suite, - please write up your idea and send it to the list! -

- -
-

2.5 This library is HUGE! And what's libsupc++?

-

Usually the size of libraries on disk isn't noticeable. When a - link editor (or simply "linker") pulls things from a - static archive library, only the necessary object files are copied - into your executable, not the entire library. Unfortunately, even - if you only need a single function or variable from an object file, - the entire object file is extracted. (There's nothing unique to C++ - or libstdc++ about this; it's just common behavior, given here - for background reasons.) -

-

Some of the object files which make up libstdc++.a are rather large. - If you create a statically-linked executable with - -static, those large object files are suddenly part - of your executable. Historically the best way around this was to - only place a very few functions (often only a single one) in each - source/object file; then extracting a single function is the same - as extracting a single .o file. For libstdc++ this is only - possible to a certain extent; the object files in question contain - template classes and template functions, pre-instantiated, and - splitting those up causes severe maintenance headaches. -

-

It's not a bug, and it's not really a problem. Nevertheless, some - people don't like it, so here are two pseudo-solutions: -

-

If the only functions from libstdc++.a which you need are - language support functions (those listed in clause 18 of the - standard, e.g., new and delete), - then try linking against libsupc++.a (Using - gcc instead of g++ and explicitly - linking in -lsupc++ for the final link step will - do it). This library contains only those support routines, - one per object file. But if you are using anything from the - rest of the library, such as IOStreams or vectors, then - you'll still need pieces from libstdc++.a. -

-

The second method is one we hope to incorporate into the library - build process. Some platforms can place each function and variable - into its own section in a .o file. The GNU linker can then perform - garbage collection on unused sections; this reduces the situation - to only copying needed functions into the executable, as before, - but all happens automatically. -

-

Unfortunately the garbage collection in GNU ld is buggy; sections - (corresponding to functions and variables) which are used - are mistakenly removed, leading to horrible crashes when your - executable starts up. For the time being, this feature is not used - when building the library. -

- -
-

2.6 Why do I get an error saying - libstdc++.so.X is missing when I run - my program?

-

Depending on your platform and library version, the message might - be similar to one of the following: -

-
-    ./a.out: error while loading shared libraries: libstdc++.so.6: cannot open shared object file: No such file or directory
-
-    /usr/libexec/ld-elf.so.1: Shared object "libstdc++.so.6" not found 
- -

This doesn't mean that the shared library isn't installed, only - that the dynamic linker can't find it. When a dynamically-linked - executable is run the linker finds and loads the required shared - libraries by searching a pre-configured list of directories. If - the directory where you've installed libstdc++ is not in this - list then the libraries won't be found. The simplest way to fix - this is to use the LD_LIBRARY_PATH environment - variable, which is a colon-separated list of directories in which - the linker will search for shared libraries: -

-
-    LD_LIBRARY_PATH=${prefix}/lib:$LD_LIBRARY_PATH
-    export LD_LIBRARY_PATH 
-

The exact environment variable to use will depend on your platform, - e.g. DYLD_LIBRARY_PATH for Darwin, - LD_LIBRARY_PATH_32/LD_LIBRARY_PATH_64 for Solaris 32-/64-bit, - LD_LIBRARYN32_PATH/LD_LIBRARY64_PATH for Irix N32/64-bit ABIs - and SHLIB_PATH for HP-UX. -

-

See the man pages for ld(1), ldd(1) and - ldconfig(8) for more information. The dynamic linker - has different names on different platforms but the man page is - usually called something such as ld.so / rtld / dld.so. -

- -
-

3.0 Platform-Specific Issues

-

3.1 Can libstdc++ be used with <my - favorite compiler>?

-

Probably not. Yet.

-

Because GCC advances so rapidly, development and testing of - libstdc++ is being done almost entirely under that compiler. - If you are curious about whether other, lesser compilers - (*grin*) support libstdc++, you are more than welcome to try. - Configuring and building the library (see above) will still - require certain tools, however. Also keep in mind that - building libstdc++ does not imply that your compiler - will be able to use all of the features found in the - C++ Standard Library. -

-

Since the goal of ISO Standardization is for all C++ - implementations to be able to share code, the final libstdc++ - should, in theory, be usable under any ISO-compliant - compiler. It will still be targeted and optimized for - GCC/g++, however. -

- -
-

3.2 [removed]

-

This question has become moot and has been removed. The stub - is here to preserve numbering (and hence links/bookmarks). -

- -
-

3.3 [removed]

-

This question has become moot and has been removed. The stub - is here to preserve numbering (and hence links/bookmarks). -

- -
-

3.4 I can't use 'long long' on Solaris

-

By default we try to support the C99 long long type. - This requires that certain functions from your C library be present. -

-

Up through release 3.0.2 the tests performed were too general, and - this feature was disabled when it did not need to be. The most - commonly reported platform affected was Solaris. -

-

This has been fixed for 3.0.3 and onwards. -

- -
-

3.5 _XOPEN_SOURCE / _GNU_SOURCE - / etc is always defined

-

On Solaris, g++ (but not gcc) always defines the preprocessor - macro _XOPEN_SOURCE. On GNU/Linux, the same happens - with _GNU_SOURCE. (This is not an exhaustive list; - other macros and other platforms are also affected.) -

-

These macros are typically used in C library headers, guarding new - versions of functions from their older versions. The C++ standard - library includes the C standard library, but it requires the C90 - version, which for backwards-compatibility reasons is often not the - default for many vendors. -

-

More to the point, the C++ standard requires behavior which is only - available on certain platforms after certain symbols are defined. - Usually the issue involves I/O-related typedefs. In order to - ensure correctness, the compiler simply predefines those symbols. -

-

Note that it's not enough to #define them only when the library is - being built (during installation). Since we don't have an 'export' - keyword, much of the library exists as headers, which means that - the symbols must also be defined as your programs are parsed and - compiled. -

-

To see which symbols are defined, look for CPLUSPLUS_CPP_SPEC in - the gcc config headers for your target (and try changing them to - see what happens when building complicated code). You can also run - "g++ -E -dM - < /dev/null" to display - a list of predefined macros for any particular installation. -

-

This has been discussed on the mailing lists - quite a bit. -

-

This method is something of a wart. We'd like to find a cleaner - solution, but nobody yet has contributed the time. -

- -
-

3.6 OS X ctype.h is broken! How can I hack it?

-

This is a long-standing bug in the OS X support. Fortunately, - the patch is quite simple, and well-known. - Here's a - link to the solution. -

- -
-

3.7 Threading is broken on i386

-

Support for atomic integer operations is/was broken on i386 - platforms. The assembly code accidentally used opcodes that are - only available on the i486 and later. So if you configured GCC - to target, for example, i386-linux, but actually used the programs - on an i686, then you would encounter no problems. Only when - actually running the code on a i386 will the problem appear. -

-

This is fixed in 3.2.2. -

- -
-

3.8 Recent GNU/Linux glibc required?

-

When running on GNU/Linux, libstdc++ 3.2.1 (shared library version - 5.0.1) and later uses localization and formatting code from the system - C library (glibc) version 2.2.5. That version of glibc is over a - year old and contains necessary bugfixes. Many GNU/Linux distros make - glibc version 2.3.x available now. -

-

The guideline is simple: the more recent the C++ library, the - more recent the C library. (This is also documented in the main - GCC installation instructions.) -

- -
-

3.9 Can't use wchar_t/wstring on FreeBSD

-

At the moment there are a few problems in FreeBSD's support for - wide character functions, and as a result the libstdc++ configury - decides that wchar_t support should be disabled. Once the underlying - problems are fixed in FreeBSD (soon), the library support will - automatically enable itself. -

-

You can fix the problems yourself, and learn more about the situation, - by reading - - this short thread ("_GLIBCPP_USE_WCHAR_T undefined in - FreeBSD's c++config.h?"). -

- -
-

3.10 MIPS atomic operations

-

The atomic locking routines for MIPS targets requires MIPS II - and later. A patch went in just after the 3.3 release to - make mips* use the generic implementation instead. You can also - configure for mipsel-elf as a workaround. -

-

mips*-*-linux* continues to use the MIPS II routines, and more - work in this area is expected. -

- -
-

4.0 Known Bugs and Non-Bugs

- Note that this section can get rapidly outdated -- such is the - nature of an open-source project. For the latest information, join - the mailing list or look through GCC bugzilla. - -

For 3.0.1, the most common "bug" is an apparently missing - "../" in include/Makefile, resulting in files - like gthr.h and gthr-single.h not being found. Please read - the configuration - instructions for GCC, - specifically the part about configuring in a separate build directory, - and how strongly recommended it is. Building in the source directory - is fragile, is rarely tested, and tends to break, as in this case. - This was fixed for 3.0.2. -

- -

For 3.1, the most common "bug" is a parse error when using - <fstream>, ending with a message, - "bits/basic_file.h:52: parse error before `{' - token." Please read - the installation instructions for - GCC, specifically the part about not installing newer versions on - top of older versions. If you install 3.1 over a 3.0.x release, then - the wrong basic_file.h header will be found (its location changed - between releases). -

- -

Please do not report these as bugs. We know about them. - Reporting this -- or any other problem that's already been fixed -- - hinders the development of GCC, because we have to take time to - respond to your report. Thank you. -

- -
-

4.1 What works already?

-

Short answer: Pretty much everything works except for some - corner cases. Also, localization is incomplete. For whether it works - well, or as you expect it to work, see 5.2. -

-

Long answer: See the implementation status pages for C++98, - TR1, and C++0x. -

- -
-

4.2 Bugs in gcc/g++ (not libstdc++)

-

This is by no means meant to be complete nor exhaustive, but - mentions some problems that users may encounter when building - or using libstdc++. If you are experiencing one of these - problems, you can find more information on the libstdc++ and - the GCC mailing lists. -

-

Before reporting a bug, examine the - bugs database with the - category set to "libstdc++". -

-
    -
  • Debugging is problematic, due to bugs in line-number generation - (mostly fixed in the compiler) and gdb lagging behind the - compiler (lack of personnel). We recommend configuring the - compiler using --with-dwarf2 if the DWARF2 - debugging format is not already the default on your platform. - Also, -changing your - GDB settings can have a profound effect on your C++ debugging - experiences. :-)
  • -
- -
-

4.3 Bugs in the C++ language/lib specification

-

Yes, unfortunately, there are some. In a - message - to the list, Nathan Myers announced that he has started a list of - problems in the ISO C++ Standard itself, especially with - regard to the chapters that concern the library. The list - itself is - posted on his - website. Developers who are having problems interpreting - the Standard may wish to consult his notes. -

-

For those people who are not part of the ISO Library Group - (i.e., nearly all of us needing to read this page in the first - place :-), a public list of the library defects is occasionally - published here. - Some of these have resulted in code changes. -

- -
-

4.4 Things in libstdc++ that only look like bugs

-

There are things which are not bugs in the compiler (4.2) nor - the language specification (4.3), but aren't really bugs in - libstdc++, either. Really! Please do not report these as bugs. -

-

-Weffc++ - The biggest of these is the quadzillions of warnings about the - library headers emitted when -Weffc++ is used. Making - libstdc++ "-Weffc++-clean" is not a goal of the project, - for a few reasons. Mainly, that option tries to enforce - object-oriented programming, while the Standard Library isn't - necessarily trying to be OO. -

-

reopening a stream fails - Did I just say that -Weffc++ was our biggest false-bug report? - I lied. (It used to be.) Today it seems to be reports that after - executing a sequence like -

-
-    #include <fstream>
-    ...
-    std::fstream  fs("a_file");
-    // .
-    // . do things with fs...
-    // .
-    fs.close();
-    fs.open("a_new_file");
-

all operations on the re-opened fs will fail, or at - least act very strangely. Yes, they often will, especially if - fs reached the EOF state on the previous file. The - reason is that the state flags are not cleared - on a successful call to open(). The standard unfortunately did - not specify behavior in this case, and to everybody's great sorrow, - the proposed LWG resolution in - DR #22 is to leave the flags unchanged. You must insert a call - to fs.clear() between the calls to close() and open(), - and then everything will work like we all expect it to work. - Update: for GCC 4.0 we implemented the resolution - of DR #409 and open() now calls - clear() on success! -

-

rel_ops - Another is the rel_ops namespace and the template - comparison operator functions contained therein. If they become - visible in the same namespace as other comparison functions - (e.g., 'using' them and the <iterator> header), - then you will suddenly be faced with huge numbers of ambiguity - errors. This was discussed on the -v3 list; Nathan Myers - sums - things up here. The collisions with vector/string iterator - types have been fixed for 3.1. -

-

The g++-3 headers are not ours

-

If you have found an extremely broken header file which is - causing problems for you, look carefully before submitting a - "high" priority bug report (which you probably shouldn't - do anyhow; see the last paragraph of the page describing - the GCC bug database). -

-

If the headers are in ${prefix}/include/g++-3, or if - the installed library's name looks like libstdc++-2.10.a - or libstdc++-libc6-2.10.so, then you are using the old - libstdc++-v2 library, which is nonstandard and unmaintained. Do not - report problems with -v2 to the -v3 mailing list. -

-

For GCC versions 3.0 and 3.1 the libstdc++ header files are - installed in ${prefix}/include/g++-v3 (see the 'v'?). - Starting with version 3.2 the headers are installed in - ${prefix}/include/c++/${version} as this prevents - headers from previous versions being found by mistake. -

-

glibc - If you're on a GNU/Linux system and have just upgraded to - glibc 2.2, but are still using gcc 2.95.2, then you should have - read the glibc FAQ, specifically 2.34: -

-
-2.34.   When compiling C++ programs, I get a compilation error in streambuf.h.
-
-{BH} You are using g++ 2.95.2? After upgrading to glibc 2.2, you need to
-apply a patch to the include files in /usr/include/g++, because the fpos_t
-type has changed in glibc 2.2.  The patch is at
-http://clisp.cons.org/~haible/gccinclude-glibc-2.2-compat.diff
-   
-

Note that 2.95.x shipped with the - old v2 library which is no longer - maintained. Also note that gcc 2.95.3 fixes this problem, but - requires a separate patch for libstdc++. -

-

concept checks - If you see compilation errors containing messages about - fooConcept and a constraints - member function, then most likely you have violated one of the - requirements for types used during instantiation of template - containers and functions. For example, EqualityComparableConcept - appears if your types must be comparable with == and you have not - provided this capability (a typo, or wrong visibility, or you - just plain forgot, etc). -

-

More information, including how to optionally enable/disable the - checks, is available - here. -

-

dlopen/dlsym - If you are using the C++ library across dynamically-loaded - objects, make certain that you are passing the correct options - when compiling and linking: -

-
-    // compile your library components
-    g++ -fPIC -c a.cc
-    g++ -fPIC -c b.cc
-    ...
-    g++ -fPIC -c z.cc
-
-    // create your library
-    g++ -fPIC -shared -rdynamic -o libfoo.so a.o b.o ... z.o
-
-    // link the executable
-    g++ -fPIC -rdynamic -o foo ... -L. -lfoo -ldl
-

"memory leaks" in containers - A few people have reported that the standard containers appear - to leak memory when tested with memory checkers such as - valgrind. - The library's default allocators keep free memory in a pool - for later reuse, rather than returning it to the OS. Although - this memory is always reachable by the library and is never - lost, memory debugging tools can report it as a leak. If you - want to test the library for memory leaks please read - Tips for memory leak hunting - first. -

- -

list::size() is O(n)! - See the Containers - chapter. -

-
-

4.5 Aw, that's easy to fix!

-

If you have found a bug in the library and you think you have - a working fix, then send it in! The main GCC site has a page - on submitting - patches that covers the procedure, but for libstdc++ you - should also send the patch to our mailing list in addition to - the GCC patches mailing list. The libstdc++ - contributors' page - also talks about how to submit patches. -

-

In addition to the description, the patch, and the ChangeLog - entry, it is a Good Thing if you can additionally create a small - test program to test for the presence of the bug that your - patch fixes. Bugs have a way of being reintroduced; if an old - bug creeps back in, it will be caught immediately by the - testsuite -- but only if such a test exists. -

- -
-

5.0 Miscellaneous

-

5.1 string::iterator is not char*; - vector<T>::iterator is not T*

-

If you have code that depends on container<T> iterators - being implemented as pointer-to-T, your code is broken. -

-

While there are arguments for iterators to be implemented in - that manner, A) they aren't very good ones in the long term, - and B) they were never guaranteed by the Standard anyway. The - type-safety achieved by making iterators a real class rather - than a typedef for T* outweighs nearly all opposing - arguments. -

-

Code which does assume that a vector iterator i - is a pointer can often be fixed by changing i in - certain expressions to &*i . Future revisions - of the Standard are expected to bless this usage for - vector<> (but not for basic_string<>). -

- -
-

5.2 What's next after libstdc++?

-

Hopefully, not much. The goal of libstdc++ is to produce - a fully-compliant, fully-portable Standard Library. After that, - we're mostly done: there won't be any more compliance - work to do. However: -

-
    -
  1. The ISO Committee will meet periodically to review Defect Reports - in the C++ Standard. Undoubtedly some of these will result in - changes to the Standard, which will be reflected in patches to - libstdc++. Some of that is already happening, see 4.3. Some of - those changes are being predicted by the library maintainers, and - we add code to the library based on what the current proposed - resolution specifies. Those additions are listed in - the extensions page. -

  2. -
  3. Performance tuning. Lots of performance tuning was done for the - 3.x releases, including memory expansion in container classes and - buffer usage in synchronized stream objects. - Later performance-related work includes "move semantics" - for containers and (optional) non-reference-counted strings (which - can give performance benefits for multithreaded programs.) -

  4. -
  5. An ABI for libstdc++ is being developed, so that - multiple binary-incompatible copies of the library can be replaced - with a single backwards-compatible library, like libgcc_s.so is. -

  6. -
  7. The current libstdc++ contains extensions to the Library which - must be explicitly requested by client code (for example, the - hash tables from SGI). Other extensions may be added to - libstdc++ if they seem to be "standard" enough. - (For example, the "long long" type from C99.) - Bugfixes and rewrites (to improve or fix thread safety, for - instance) will of course be a continuing task. -

  8. -
  9. There is an effort underway to add significant extensions to - the standard library specification. The latest version of this effort is - described in - - The C++ Library Technical Report 1. - See 5.5. -

  10. -
-

This - question about the next libstdc++ prompted some brief but - interesting - speculation. -

- -
-

5.3 What about the STL from SGI?

-

The STL from SGI, - version 3.3, was the final merge of the STL codebase. The - code in libstdc++ contains many fixes and changes, and - the SGI code is no longer under active - development. We expect that no future merges will take place. -

-

In particular, string is not from SGI and makes no - use of their "rope" class (which is included as an - optional extension), nor is valarray and some others. - Classes like vector<> are, however we have - made significant changes to them since then. -

-

The FAQ for SGI's STL (one jump off of their main page) is - recommended reading. -

- -
-

5.4 Extensions and Backward Compatibility

-

Headers in the ext and backward - subdirectories should be referred to by their relative paths: - -

-
-      #include <backward/hash_map> 
-

rather than using -I or other options. This is more - portable and forward-compatible. (The situation is the same as - that of other headers whose directories are not searched directly, - e.g., <sys/stat.h>, <X11/Xlib.h>. -

- -

At this time most of the features of the SGI STL extension have been - replaced by standardized libraries. - In particular, the unordered_map and unordered_set containers of TR1 - are suitable replacement for the non-standard hash_map and hash_set - containers in the SGI STL. See 5.5 for more details. -

- -

The extensions are no longer in the global or std - namespaces, instead they are declared in the __gnu_cxx - namespace. For maximum portability, consider defining a namespace - alias to use to talk about extensions, e.g.: -

-
-      #ifdef __GNUC__
-      #if __GNUC__ < 3
-        #include <hash_map.h>
-        namespace extension { using ::hash_map; }; // inherit globals
-      #else
-        #include <backward/hash_map>
-        #if __GNUC__ == 3 && __GNUC_MINOR__ == 0
-          namespace extension = std;               // GCC 3.0
-        #else
-          namespace extension = ::__gnu_cxx;       // GCC 3.1 and later
-        #endif
-      #endif
-      #else      // ...  there are other compilers, right?
-        namespace extension = std;
-      #endif
-
-      extension::hash_map<int,int> my_map; 
-

This is a bit cleaner than defining typedefs for all the - instantiations you might need. -

-

Note: explicit template specializations must - be declared in the same namespace as the original template. - This means you cannot use a namespace alias when declaring - an explicit specialization. -

-

Extensions to the library have - their own page. -

- -
-

5.5 Does libstdc++ support TR1?

- -

The C++ Standard Library Technical Report adds many new features to - the library. The latest version of this effort is described in - - Technical Report 1. -

- -

libstdc++ strives to implement all of TR1. - An overview of the implementation status - is available. -

- -

Briefly, the features of TR1 and the current status are: -

- -

Reference_wrapper - Complete - - Useful to pass references to functions that take their parameters - by value. -

- -

Reference-counted smart pointers - Complete - - The shared_ptr and weak_ptr allow several object to know about a - pointer and whether it is valid. When the last reference to the - pointer is destroyed the pointer is freed. -

- -

Function objects - Complete - - Function return types (i.e., result_of), the functions template - mem_fn (a generalization of mem_fun and mem_fun_red), function - object binders (e.g., bind, a generalization of bind1st and bind2nd), - and polymorphic function wrappers (e.g, class template function). -

- -

Type traits - Complete - - The type_traits class gives templates the ability to probe - information about the input type and enable type-dependent logic - to be performed without the need of template specializations. -

- -

A random number engine - Complete - - This library contains random number generators with several different - choices of distribution. -

- -

Tuples - Complete - - The tuple class implements small heterogeneous arrays. This is an - enhanced pair. In fact, the standard pair is enhanced with a tuple - interface. -

- -

Fixed-size arrays - Complete - - The array class implements small fixed-sized arrays with container - semantics. -

- -

Unordered containers - Complete - - The unordered_set, unordered_map, unordered_multiset, and - unordered_multimap containers are hashed versions of the map, set, - multimap, and multiset containers respectively. These classes are - suitable replacements for the SGI STL hash_map and hash_set - extensions. -

- -

C99 compatibility - Under construction - - There are many features designed to minimize the divergence of the C - and the C++ languages. -

- -

Special functions - Complete - - Twenty-three mathematical functions familiar to physicists and - engineers are included: cylindrical and spherical Bessel and Neumann - functions, hypergeometric functions, Laguerre polynomials, Legendre - functions, elliptic integrals, exponential integrals and the Riemann - zeta function all for your computing pleasure. -

- -

A regular expression engine - This library provides for regular expression objects with traversal - of text with return of subexpressions. -

- -
-

5.6 Is libstdc++ thread-safe?

-

The library strives to be thread-safe when all of the following - conditions are met: -

-
    -
  • The system's libc is itself thread-safe,
  • -
  • The compiler in use reports a thread model other than 'single'. This can be tested via output from gcc -v. Multi-thread capable versions of gcc output something like this: -
    -%gcc -v
    -Using built-in specs.
    -...
    -Thread model: posix
    -gcc version 4.1.2 20070925 (Red Hat 4.1.2-33)
    -
    - -

    Look for "Thread model" lines that aren't equal to "single."

    -
  • -
  • Requisite command-line flags are used for atomic operations and threading. Examples of this include -pthread and -march=native, although specifics vary depending on the host environment. See Machine Dependent Options.
  • -
  • An implementation of atomicity.h functions - exists for the architecture in question. See the internals documentation for more details.
  • - -
-

The user-code must guard against concurrent method calls which may - access any particular library object's state. Typically, the - application programmer may infer what object locks must be held - based on the objects referenced in a method call. Without getting - into great detail, here is an example which requires user-level - locks: -

-
-     library_class_a shared_object_a;
-
-     thread_main () {
-       library_class_b *object_b = new library_class_b;
-       shared_object_a.add_b (object_b);   // must hold lock for shared_object_a
-       shared_object_a.mutate ();          // must hold lock for shared_object_a
-     }
-
-     // Multiple copies of thread_main() are started in independent threads.
-

Under the assumption that object_a and object_b are never exposed to - another thread, here is an example that should not require any - user-level locks: -

-
-     thread_main () {
-       library_class_a object_a;
-       library_class_b *object_b = new library_class_b;
-       object_a.add_b (object_b);
-       object_a.mutate ();
-     } 
-

All library objects are safe to use in a multithreaded program as - long as each thread carefully locks out access by any other - thread while it uses any object visible to another thread, i.e., - treat library objects like any other shared resource. In general, - this requirement includes both read and write access to objects; - unless otherwise documented as safe, do not assume that two threads - may access a shared standard library object at the same time. -

-

See chapters 17 (library - introduction), 23 - (containers), and 27 (I/O) for - more information. -

- -
-

5.7 How do I get a copy of the ISO C++ Standard?

-

Copies of the full ISO 14882 standard are available on line via the - ISO mirror site for committee members. Non-members, or those who - have not paid for the privilege of sitting on the committee and - sustained their two-meeting commitment for voting rights, may get a - copy of the standard from their respective national standards - organization. In the USA, this national standards organization is - ANSI and their website is right here. - (And if you've already registered with them, clicking this link will - take you to directly to the place where you can -buy - the standard on-line. -

-

Who is your country's member body? Visit the - ISO homepage and find out! -

-

The 2003 version of the standard (the 1998 version plus TC1) is - available in print, ISBN 0-470-84674-7. -

- -
-

5.8 What's an ABI and why is it so messy?

-

"ABI" stands for "Application Binary Interface." - Conventionally, it refers to a great mass of details about how - arguments are arranged on the call stack and/or in registers, and - how various types are arranged and padded in structs. A single CPU - design may suffer multiple ABIs designed by different development - tool vendors who made different choices, or even by the same vendor - for different target applications or compiler versions. In ideal - circumstances the CPU designer presents one ABI and all the OSes and - compilers use it. In practice every ABI omits details that compiler - implementers (consciously or accidentally) must choose for themselves. -

-

That ABI definition suffices for compilers to generate code so a - program can interact safely with an OS and its lowest-level libraries. - Users usually want an ABI to encompass more detail, allowing libraries - built with different compilers (or different releases of the same - compiler!) to be linked together. For C++, this includes many more - details than for C, and CPU designers (for good reasons elaborated - below) have not stepped up to publish C++ ABIs. The details include - virtual function implementation, struct inheritance layout, name - mangling, and exception handling. Such an ABI has been defined for - GNU C++, and is immediately useful for embedded work relying only on - a "free-standing implementation" that doesn't include (much - of) the standard library. It is a good basis for the work to come. -

-

A useful C++ ABI must also incorporate many details of the standard - library implementation. For a C ABI, the layouts of a few structs - (such as FILE, stat, jmpbuf, and the like) and a few macros suffice. - For C++, the details include the complete set of names of functions - and types used, the offsets of class members and virtual functions, - and the actual definitions of all inlines. C++ exposes many more - library details to the caller than C does. It makes defining - a complete ABI a much bigger undertaking, and requires not just - documenting library implementation details, but carefully designing - those details so that future bug fixes and optimizations don't - force breaking the ABI. -

-

There are ways to help isolate library implementation details from the - ABI, but they trade off against speed. Library details used in - inner loops (e.g., getchar) must be exposed and frozen for all - time, but many others may reasonably be kept hidden from user code, - so they may later be changed. Deciding which, and implementing - the decisions, must happen before you can reasonably document a - candidate C++ ABI that encompasses the standard library. -

- -
-

5.9 How do I make std::vector<T>::capacity() - == std::vector<T>::size()?

- -

The standard idiom for deallocating a std::vector<T>'s - unused memory is to create a temporary copy of the vector and swap their - contents, e.g. for std::vector<T> v -

-
-     std::vector<T>(v).swap(v);
-   
-

The copy will take O(n) time and the swap is constant time. -

-

See Shrink-to-fit strings for - a similar solution for strings. -

- - - -
-

-See license.html for copying conditions. -Comments and suggestions are welcome, and may be sent to -the libstdc++ mailing list. -

- - - - - diff --git a/libstdc++-v3/docs/html/install.html b/libstdc++-v3/docs/html/install.html deleted file mode 100644 index 3166ebc0a86..00000000000 --- a/libstdc++-v3/docs/html/install.html +++ /dev/null @@ -1,240 +0,0 @@ - - - - - - - - - - libstdc++ Installation Instructions - - - - - -

Getting started: configure, build, install

- -

- The latest version of this document is always available at - - http://gcc.gnu.org/onlinedocs/libstdc++/install.html. -

- -

- To the libstdc++ homepage. -

- - - -
-

Contents

- -

Because libstdc++ is part of GCC, the primary source for - installation instructions is - the GCC install page. - Additional data is given here only where it applies to libstdc++. -

- - - -
- - - -

Tools you will need beforehand

-

The list of software needed to build the library is kept with the - rest of the compiler, at - - http://gcc.gnu.org/install/prerequisites.html. The same page - also lists the tools you will need if you wish to modify the source. -

- -

As of GCC 4.0.1 the minimum version of binutils required to build - libstdc++ is 2.15.90.0.1.1. You can get snapshots - (as well as releases) of binutils from - - ftp://sources.redhat.com/pub/binutils. - Older releases of libstdc++ do not require such a recent version, - but to take full advantage of useful space-saving features and - bug-fixes you should use a recent binutils if possible. - The configure process will automatically detect and use these - features if the underlying support is present. -

- -

Finally, a few system-specific requirements:

-
-
linux
- -
If gcc 3.1.0 or later on is being used on linux, an attempt - will be made to use "C" library functionality necessary for C++ - named locale support. For gcc 3.2.1 and later, this means that - glibc 2.2.5 or later is required and the "C" library de_DE locale - information must be installed. - -

- Note however that the sanity checks involving the de_DE locale are - skipped when an explicit --enable-clocale=gnu configure option is - used: only the basic checks are carried out, defending against - misconfigurations. -

- -

- If the 'gnu' locale model is being used, the following locales - are used and tested in the libstdc++ testsuites. The first column - is the name of the locale, the second is the character set it is - expected to use. -

-
-de_DE               ISO-8859-1
-de_DE@euro          ISO-8859-15
-en_HK               ISO-8859-1
-en_PH               ISO-8859-1
-en_US               ISO-8859-1
-en_US.ISO-8859-1    ISO-8859-1
-en_US.ISO-8859-15   ISO-8859-15
-en_US.UTF-8         UTF-8
-es_ES               ISO-8859-1
-es_MX               ISO-8859-1
-fr_FR               ISO-8859-1
-fr_FR@euro          ISO-8859-15
-is_IS               UTF-8
-it_IT               ISO-8859-1
-ja_JP.eucjp         EUC-JP
-se_NO.UTF-8         UTF-8
-ta_IN               UTF-8
-zh_TW               BIG5
-
-

Failure to have the underlying "C" library locale - information installed will mean that C++ named locales for the - above regions will not work: because of this, the libstdc++ - testsuite will skip the named locale tests. If this isn't an - issue, don't worry about it. If named locales are needed, the - underlying locale information must be installed. Note that - rebuilding libstdc++ after the "C" locales are installed is not - necessary. -

- -

To install support for locales, do only one of the following: -

- -
    -
  • install all locales -
      -
    • with RedHat Linux: -

      export LC_ALL=C

      -

      rpm -e glibc-common --nodeps

      -

      rpm -i --define "_install_langs all" - glibc-common-2.2.5-34.i386.rpm

      -
    • -
    • (instructions for other operating systems solicited)
    • -
    -
  • -
  • install just the necessary locales -
      -
    • with Debian Linux: -

      Add the above list, as shown, to the file - /etc/locale.gen

      -

      run /usr/sbin/locale-gen

      -
    • -
    • on most Unix-like operating systems: -

      localedef -i de_DE -f ISO-8859-1 de_DE

      -

      (repeat for each entry in the above list)

      -
    • -
    • (instructions for other operating systems solicited)
    • -
    -
  • -
-
-
- -
- -

Configuring

-

If you have never done this before, you should read the basic - GCC Installation - Instructions first. Read all of them. - Twice. -

-

When building libstdc++ you'll have to configure - the entire gccsrcdir directory. The full list of libstdc++ - specific configuration options, not dependent on the specific compiler - release being used, can be found here. -

-

Consider possibly using --enable-languages=c++ to save time by only - building the C++ language parts. -

- -
-   cd gccbuilddir
-   gccsrcdir/configure --prefix=destdir --other-opts...
- - -
-

Using the library

-

Find the new library at runtime (shared linking only)

-

If you only built a static library (libstdc++.a), or if you - specified static linking, you don't have to worry about this. - But if you built a shared library (libstdc++.so) and linked - against it, then you will need to find that library when you - run the executable. -

-

Methods vary for different platforms and different styles, but - the usual ones are printed to the screen during installation. - They include: -

-
    -
  • At runtime set LD_LIBRARY_PATH in your environment correctly, - so that the shared library for libstdc++ can be found and - loaded. Be certain that you understand all of the other - implications and behavior of LD_LIBRARY_PATH first (few - people do, and they get into trouble). -
  • -
  • Compile the path to find the library at runtime into the - program. This can be done by passing certain options to g++, - which will in turn pass them on to the linker. The exact - format of the options is dependent on which linker you use: -
      -
    • GNU ld (default on Linux): -Wl,--rpath,destdir/lib
    • -
    • IRIX ld: -Wl,-rpath,destdir/lib
    • -
    • Solaris ld: -Wl,-Rdestdir/lib
    • -
    • More...? Let us know!
    • -
    -
  • -
-

Use the ldd(1) utility to show which library the system - thinks it will get at runtime. -

-

A libstdc++.la file is also installed, for use with Libtool. If - you use Libtool to create your executables, these details are - taken care of for you. -

- - - - - - -
-

-See license.html for copying conditions. -Comments and suggestions are welcome, and may be sent to -the libstdc++ mailing list. -

- - - - - diff --git a/libstdc++-v3/docs/html/lib3styles.css b/libstdc++-v3/docs/html/lib3styles.css deleted file mode 100644 index ee88c366cd4..00000000000 --- a/libstdc++-v3/docs/html/lib3styles.css +++ /dev/null @@ -1,6 +0,0 @@ -.centered { text-align: center } -.tocheader { font-size: large } -.fineprint { font-size: x-small } -.larger { font-size: large } -BODY { background: #FFFFFF } -PRE { text-align: left ; margin-left: 1em } diff --git a/libstdc++-v3/docs/html/test.html b/libstdc++-v3/docs/html/test.html deleted file mode 100644 index 8a8694c2d6e..00000000000 --- a/libstdc++-v3/docs/html/test.html +++ /dev/null @@ -1,722 +0,0 @@ - - - - - - - - - - libstdc++ Testing Instructions - - - - -

Testing Details

- -

- The latest version of this document is always available at - - http://gcc.gnu.org/onlinedocs/libstdc++/test.html. -

- -

- To the libstdc++ homepage. -

- - -
-

Contents

- - -
- - - -

Testsuite organization and naming conventions

-

- The directory libsrcdir/testsuite contains the - individual test cases organized in sub-directories corresponding - to chapters of the C++ standard (detailed below), the dejagnu - test harness support files, and sources to various testsuite - utilities that are packaged in a separate testing library. -

- -

All test cases for functionality required by the runtime - components of the C++ standard (ISO 14882) are files within the - following directories. -

- -
-17_intro
-18_support
-19_diagnostics
-20_util
-21_strings
-22_locale
-23_containers
-25_algorithms
-26_numerics
-27_io
-   
- -

- In addition, the following directories include test files: -

- -
-tr1		  Tests for components as described by the Technical Report on Standard Library Extensions (TR1).
-backward	  Tests for backwards compatibility and deprecated features.
-demangle	  Tests for __cxa_demangle, the IA 64 C++ ABI demangler
-ext		  Tests for extensions.
-performance	  Tests for performance analysis, and performance regressions.
-thread		  Tests for threads.
-   
- -

- Some directories don't have test files, but instead contain - auxiliary information (more information): -

- -
-config		  Files for the dejagnu test harness.
-lib		  Files for the dejagnu test harness.
-libstdc++*     	  Files for the dejagnu test harness.
-data		  Sample text files for testing input and output.
-util		  Files for libtestc++, utilities and testing routines.
-   
- -

- Within a directory that includes test files, there may be - additional subdirectories, or files. Originally, test cases - were appended to one file that represented a particular section - of the chapter under test, and was named accordingly. For - instance, to test items related to 21.3.6.1 - - basic_string::find [lib.string::find] in the standard, - the following was used: -

-
-21_strings/find.cc
-   
-

- However, that practice soon became a liability as the test cases - became huge and unwieldy, and testing new or extended - functionality (like wide characters or named locales) became - frustrating, leading to aggressive pruning of test cases on some - platforms that covered up implementation errors. Now, the test - suite has a policy of one file, one test case, which solves the - above issues and gives finer grained results and more manageable - error debugging. As an example, the test case quoted above - becomes: -

-
-21_strings/basic_string/find/char/1.cc
-21_strings/basic_string/find/char/2.cc
-21_strings/basic_string/find/char/3.cc
-21_strings/basic_string/find/wchar_t/1.cc
-21_strings/basic_string/find/wchar_t/2.cc
-21_strings/basic_string/find/wchar_t/3.cc
-   
- -

- All new tests should be written with the policy of one test - case, one file in mind. -

- -

- In addition, there are some special names and suffixes that are - used within the testsuite to designate particular kinds of - tests. -

- -
    -
  • - _xin.cc -

    - This test case expects some kind of interactive input in order - to finish or pass. At the moment, the interactive tests are not - run by default. Instead, they are run by hand, like: -

    -
     
    -g++ 27_io/objects/char/3_xin.cc
    -cat 27_io/objects/char/3_xin.in | a.out
    -     
    -
  • -
  • - .in -

    - This file contains the expected input for the corresponding - _xin.cc test case. -

    -
  • -
  • - _neg.cc -

    - This test case is expected to fail: it's a negative test. At the - moment, these are almost always compile time errors. -

    -
  • -
  • - char -

    - This can either be a directory name or part of a longer file - name, and indicates that this file, or the files within this - directory are testing the char instantiation of a - template. -

    -
  • -
  • - wchar_t -

    - This can either be a directory name or part of a longer file - name, and indicates that this file, or the files within this - directory are testing the wchar_t instantiation of - a template. Some hosts do not support wchar_t - functionality, so for these targets, all of these tests will not - be run. -

    -
  • -
  • - thread -

    - This can either be a directory name or part of a longer file - name, and indicates that this file, or the files within this - directory are testing situations where multiple threads are - being used. -

    -
  • -
  • - performance -

    - This can either be an enclosing directory name or part of a - specific file name. This indicates a test that is used to - analyze runtime performance, for performance regression testing, - or for other optimization related analysis. At the moment, these - test cases are not run by default. -

    -
  • -
- -
-

Utilities: abi_check and libtestc++

-

- The testsuite directory also contains some files that implement - functionality that is intended to make writing test cases easier, - or to avoid duplication, or to provide error checking in a way that - is consistent across platforms and test harnesses. A stand-alone - executable, called abi_check, and a static library called - libtestc++ are constructed. Both of these items are not - installed, and only used during testing. -

- -

- These files include the following functionality: -

- -
    -
  • - testsuite_abi.h, - testsuite_abi.cc, - testsuite_abi_check.cc -

    - Creates the executable abi_check. - Used to check correctness of symbol versioning, visibility of - exported symbols, and compatibility on symbols in the shared - library, for hosts that support this feature. More information - can be found in the ABI documentation here -

    -
  • -
  • - testsuite_allocator.h, - testsuite_allocator.cc -

    - Contains specialized allocators that keep track of construction - and destruction. Also, support for overriding global new and - delete operators, including verification that new and delete - are called during execution, and that allocation over max_size - fails. -

    -
  • -
  • - testsuite_character.h -

    - Contains std::char_traits and - std::codecvt specializations for a user-defined - POD. -

    -
  • -
  • - testsuite_hooks.h, - testsuite_hooks.cc -

    - A large number of utilities, including: -

    -
      -
    • VERIFY
    • -
    • set_memory_limits
    • -
    • verify_demangle
    • -
    • run_tests_wrapped_locale
    • -
    • run_tests_wrapped_env
    • -
    • try_named_locale
    • -
    • try_mkfifo
    • -
    • func_callback
    • -
    • counter
    • -
    • copy_tracker
    • -
    • copy_constructor
    • -
    • assignment_operator
    • -
    • destructor
    • -
    • pod_char, pod_int and associated char_traits specializations
    • -
    -

    -
  • -
  • - testsuite_io.h -

    - Error, exception, and constraint checking for - std::streambuf, std::basic_stringbuf, std::basic_filebuf. -

    -
  • -
  • - testsuite_iterators.h -

    - Wrappers for various iterators. -

    -
  • -
  • - testsuite_performance.h -

    - A number of class abstractions for performance counters, and - reporting functions including: -

    -
      -
    • time_counter
    • -
    • resource_counter
    • -
    • report_performance
    • -
    -

    -
  • -
- -
-

How to write a new test case

- -

- The first step in making a new test case is to choose the correct - directory and file name, given the organization as previously - described. -

- -

- All files are copyright the FSF, and GPL'd: this is very - important. The first copyright year should correspond to the date - the file was checked in to SVN. -

- -

- As per the dejagnu instructions, always return 0 from main to - indicate success. -

- -

- A bunch of utility functions and classes have already been - abstracted out into the testsuite utility library, - libtestc++. To use this functionality, just include the - appropriate header file: the library or specific object files will - automatically be linked in as part of the testsuite run. -

- -

- For a test that needs to take advantage of the dejagnu test - harness, what follows below is a list of special keyword that - harness uses. Basically, a test case contains dg-keywords (see - dg.exp) indicating what to do and what kinds of behavior are to be - expected. New test cases should be written with the new style - DejaGnu framework in mind. -

- -

- To ease transition, here is the list of dg-keyword documentation - lifted from dg.exp. -

- -
-# The currently supported options are:
-#
-# dg-prms-id N
-#	set prms_id to N
-#
-# dg-options "options ..." [{ target selector }]
-#	specify special options to pass to the tool (eg: compiler)
-#
-# dg-do do-what-keyword [{ target/xfail selector }]
-#	`do-what-keyword' is tool specific and is passed unchanged to
-#	${tool}-dg-test.  An example is gcc where `keyword' can be any of:
-#	preprocess|compile|assemble|link|run
-#	and will do one of: produce a .i, produce a .s, produce a .o,
-#	produce an a.out, or produce an a.out and run it (the default is
-#	compile).
-#
-# dg-error regexp comment [{ target/xfail selector } [{.|0|linenum}]]
-#	indicate an error message <regexp> is expected on this line
-#	(the test fails if it doesn't occur)
-#	Linenum=0 for general tool messages (eg: -V arg missing).
-#	"." means the current line.
-#
-# dg-warning regexp comment [{ target/xfail selector } [{.|0|linenum}]]
-#	indicate a warning message <regexp> is expected on this line
-#	(the test fails if it doesn't occur)
-#
-# dg-bogus regexp comment [{ target/xfail selector } [{.|0|linenum}]]
-#	indicate a bogus error message <regexp> use to occur here
-#	(the test fails if it does occur)
-#
-# dg-build regexp comment [{ target/xfail selector }]
-#	indicate the build use to fail for some reason
-#	(errors covered here include bad assembler generated, tool crashes,
-#	and link failures)
-#	(the test fails if it does occur)
-#
-# dg-excess-errors comment [{ target/xfail selector }]
-#	indicate excess errors are expected (any line)
-#	(this should only be used sparingly and temporarily)
-#
-# dg-output regexp [{ target selector }]
-#	indicate the expected output of the program is <regexp>
-#	(there may be multiple occurrences of this, they are concatenated)
-#
-# dg-final { tcl code }
-#	add some tcl code to be run at the end
-#	(there may be multiple occurrences of this, they are concatenated)
-#	(unbalanced braces must be \-escaped)
-#
-# "{ target selector }" is a list of expressions that determine whether the
-# test succeeds or fails for a particular target, or in some cases whether the
-# option applies for a particular target.  If the case of `dg-do' it specifies
-# whether the test case is even attempted on the specified target.
-#
-# The target selector is always optional.  The format is one of:
-#
-# { xfail *-*-* ... } - the test is expected to fail for the given targets
-# { target *-*-* ... } - the option only applies to the given targets
-#
-# At least one target must be specified, use *-*-* for "all targets".
-# At present it is not possible to specify both `xfail' and `target'.
-# "native" may be used in place of "*-*-*".
-
-Example 1: Testing compilation only
-// { dg-do compile }
-
-Example 2: Testing for expected warnings on line 36, which all targets fail
-// { dg-warning "string literals" "" { xfail *-*-* } 36
-
-Example 3: Testing for expected warnings on line 36
-// { dg-warning "string literals" "" { target *-*-* } 36
-
-Example 4: Testing for compilation errors on line 41
-// { dg-do compile }
-// { dg-error "no match for" "" { target *-*-* } 41 }
-
-Example 5: Testing with special command line settings, or without the
-use of pre-compiled headers, in particular the stdc++.h.gch file. Any
-options here will override the DEFAULT_CXXFLAGS and PCH_CXXFLAGS set
-up in the normal.exp file.
-// { dg-options "-O0" { target *-*-* } }
-
- -

- More examples can be found in the libstdc++-v3/testsuite/*/*.cc files. -

- -
-

Options for running the tests

- -

There are several options for running tests, including testing - the regression tests, testing a subset of the regression tests, - testing the performance tests, testing just compilation, testing - installed tools, etc. In addition, there is a special rule for - checking the exported symbols of the shared library. -

- -

You can check the status of the build without installing it - using the dejagnu harness, much like the rest of the gcc tools.

-
 make check
-

in the libbuilddir directory.

-

or

-
 make check-target-libstdc++-v3
-

in the gccbuilddir directory.

- -

- These commands are functionally equivalent and will create a - 'testsuite' directory underneath libbuilddir containing - the results of the tests. Two results files will be generated: - libstdc++.sum, which is a PASS/FAIL summary for each - test, and libstdc++.log which is a log of the exact - command line passed to the compiler, the compiler output, and - the executable output (if any). -

- - -

-To debug the dejagnu test harness during runs, try invoking with a -specific argument to the variable RUNTESTFLAGS, as below. -

- -
-make check-target-libstdc++-v3 RUNTESTFLAGS="-v"
-
-or -
-make check-target-libstdc++-v3 RUNTESTFLAGS="-v -v"
-
- -

-To run a subset of the library tests, you will need to generate the -testsuite_files file by running make testsuite_files -in the libbuilddir/testsuite directory, described below. -Edit the file to remove the tests you don't want and then run the -testsuite as normal. -

- - -

-There are two ways to run on a simulator: set up DEJAGNU to point to a -specially crafted site.exp, or pass down --target_board flags. -

-Example flags to pass down for various embedded builds are as follows: -
---target=powerpc-eabism (libgloss/sim)
-make check-target-libstdc++-v3 RUNTESTFLAGS="--target_board=powerpc-sim"
-
---target=calmrisc32 (libgloss/sid)
-make check-target-libstdc++-v3 RUNTESTFLAGS="--target_board=calmrisc32-sid"
-
---target=xscale-elf (newlib/sim)
-make check-target-libstdc++-v3 RUNTESTFLAGS="--target_board=arm-sim"
-
- -

Also, here is an example of how to run the libstdc++ testsuite for a -multilibed build directory with different ABI settings: -

-
-make check-target-libstdc++-v3 RUNTESTFLAGS='--target_board \"unix{-mabi=32,,-mabi=64}\"'
-
- -

-You can run the tests with a compiler and library that have already -been installed. Make sure that the compiler (e.g., g++) -is in your PATH. If you are using shared libraries, then -you must also ensure that the directory containing the shared version -of libstdc++ is in your LD_LIBRARY_PATH, or equivalent. -If your GCC source tree is at /path/to/gcc, then you can -run the tests as follows: -

-
-runtest --tool libstdc++ --srcdir=/path/to/gcc/libstdc++-v3/testsuite
-
-

-The testsuite will create a number of files in the directory in which you -run this command,. Some of those files might use the same name as -files created by other testsuites (like the ones for GCC and G++), so -you should not try to run all the testsuites in parallel from the same -directory. -

- -

In addition, there are some testing options that are mostly of - interest to library maintainers and system integrators. As such, - these tests may not work on all cpu and host combinations, and may need to - be executed in the libbuilddir/testsuite directory. These options - include, but are not necessarily limited to, the following: -

- -
-   make testsuite_files
-

- Five files are generated that determine what test files - are run. These files are: -

-
    -
  • - testsuite_files -

    This is a list of all the test cases that will be run. Each - test case is on a separate line, given with an absolute path - from the libsrcdir/testsuite directory. -

    -
  • - -
  • - testsuite_files_interactive -

    This is a list of all the interactive test cases, using the - same format as the file list above. These tests are not run by default. -

    -
  • - -
  • - testsuite_files_performance -

    This is a list of all the performance test cases, using the - same format as the file list above. These tests are not run by default. -

    -
  • - -
  • - testsuite_thread -

    This file indicates that the host system can run tests which - incolved multiple threads. -

    -
  • - -
  • - testsuite_wchar_t -

    This file indicates that the host system can run the wchar_t - tests, and corresponds to the macro definition - _GLIBCXX_USE_WCHAR_T in the file c++config.h. -

    -
  • -
- -
-   make check-abi
-

The library ABI can be tested. This involves testing the shared - library against an ABI-defining previous version of symbol exports.

- -
-   make check-compile
-

This rule compiles, but does not link or execute, the - testsuite_files test cases and displays the output on stdout.

- -
-   make check-performance
-

This rule runs through the testsuite_files_performance - test cases and collects information for performance analysis and - can be used to spot performance regressions. Various timing - information is collected, as well as number of hard page faults, - and memory used. This is not run by default, and the implementation - is in flux. -

- -

- We are interested in any strange failures of the - testsuite; please see FAQ 2.4 - for which files to examine. -

- -
-

Running debug-mode tests

-

To run the libstdc++ test suite under the debug mode, - edit libstdc++-v3/scripts/testsuite_flags to add the - compile-time flag -D_GLIBCXX_DEBUG to the result - printed by the --build-cxx option. Additionally, add - the -D_GLIBCXX_DEBUG_PEDANTIC flag to turn on pedantic - checking. The libstdc++ test suite should produce precisely the same - results under debug mode that it does under release mode: any - deviation indicates an error in either the library or the test - suite.

- -
-

Future

- -

-Shared runs need to be implemented, for targets that support shared libraries. -

- -

-Diffing of expected output to standard streams needs to be finished off. -

- -

-The V3 testing framework supports, or will eventually support, -additional keywords for the purpose of easing the job of writing -test cases. All V3-keywords are of the form @xxx@. -Currently plans for supported keywords include: -

- -
-
@require@ <files>
-
-

- The existence of <files> is essential for the test to complete - successfully. For example, a test case foo.C using bar.baz as - input file could say -

-
-	    // @require@ bar.baz
-

- The special variable % stands for the rootname, e.g. the - file-name without its `.C' extension. Example of use (taken - verbatim from 27_io/filebuf.cc) -

-
-	   // @require@ %-*.tst %-*.txt
-
-
@diff@ <first-list> <second-list>
-
-

- After the test case compiles and ran successfully, diff - <first-list> against <second-list>, these lists should - have the same length. The test fails if diff returns non-zero a - pair of files. -

-
-
- -
-

DejaGNU internals

- -

This is information for those looking at making changes to the testsuite -structure, and/or needing to trace dejagnu's actions with --verbose. This -will not be useful to people who are "merely" adding new tests to the existing -structure. -

- -

The first key point when working with dejagnu is the idea of a "tool". -Files, directories, and functions are all implicitly used when they are -named after the tool in use. Here, the tool will always be "libstdc++". -

- -

The lib subdir contains support routines. The -lib/libstdc++.exp file ("support library") is loaded -automagically, and must explicitly load the others. For example, files can -be copied from the core compiler's support directory into lib. -

- -

Some routines in lib/libstdc++.exp are callbacks, some are -our own. Callbacks must be prefixed with the name of the tool. To easily -distinguish the others, by convention our own routines are named "v3-*". -

- -

The next key point when working with dejagnu is "test files". Any -directory whose name starts with the tool name will be searched for test files. -(We have only one.) In those directories, any .exp file is -considered a test file, and will be run in turn. Our main test file is called -normal.exp; it runs all the tests in testsuite_files using the -callbacks loaded from the support library. -

- -

The config directory is searched for any particular "target -board" information unique to this library. This is currently unused and sets -only default variables. -

- - - - -
-

-See license.html for copying conditions. -Comments and suggestions are welcome, and may be sent to -the libstdc++ mailing list. -

- - - - diff --git a/libstdc++-v3/include/Makefile.in b/libstdc++-v3/include/Makefile.in index 47ddc5bd04c..cf24e6a9c49 100644 --- a/libstdc++-v3/include/Makefile.in +++ b/libstdc++-v3/include/Makefile.in @@ -1,8 +1,8 @@ -# Makefile.in generated by automake 1.9.6 from Makefile.am. +# Makefile.in generated by automake 1.10 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005 Free Software Foundation, Inc. +# 2003, 2004, 2005, 2006 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. @@ -13,15 +13,11 @@ # PARTICULAR PURPOSE. @SET_MAKE@ -srcdir = @srcdir@ -top_srcdir = @top_srcdir@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ -top_builddir = .. am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd -INSTALL = @INSTALL@ install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c @@ -110,42 +106,13 @@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ -ENABLE_PARALLEL_FALSE = @ENABLE_PARALLEL_FALSE@ -ENABLE_PARALLEL_TRUE = @ENABLE_PARALLEL_TRUE@ -ENABLE_SYMVERS_DARWIN_FALSE = @ENABLE_SYMVERS_DARWIN_FALSE@ -ENABLE_SYMVERS_DARWIN_TRUE = @ENABLE_SYMVERS_DARWIN_TRUE@ -ENABLE_SYMVERS_FALSE = @ENABLE_SYMVERS_FALSE@ -ENABLE_SYMVERS_GNU_FALSE = @ENABLE_SYMVERS_GNU_FALSE@ -ENABLE_SYMVERS_GNU_NAMESPACE_FALSE = @ENABLE_SYMVERS_GNU_NAMESPACE_FALSE@ -ENABLE_SYMVERS_GNU_NAMESPACE_TRUE = @ENABLE_SYMVERS_GNU_NAMESPACE_TRUE@ -ENABLE_SYMVERS_GNU_TRUE = @ENABLE_SYMVERS_GNU_TRUE@ -ENABLE_SYMVERS_TRUE = @ENABLE_SYMVERS_TRUE@ -ENABLE_VISIBILITY_FALSE = @ENABLE_VISIBILITY_FALSE@ -ENABLE_VISIBILITY_TRUE = @ENABLE_VISIBILITY_TRUE@ ERROR_CONSTANTS_SRCDIR = @ERROR_CONSTANTS_SRCDIR@ EXEEXT = @EXEEXT@ EXTRA_CXX_FLAGS = @EXTRA_CXX_FLAGS@ FGREP = @FGREP@ -GLIBCXX_BUILD_DEBUG_FALSE = @GLIBCXX_BUILD_DEBUG_FALSE@ -GLIBCXX_BUILD_DEBUG_TRUE = @GLIBCXX_BUILD_DEBUG_TRUE@ -GLIBCXX_BUILD_PCH_FALSE = @GLIBCXX_BUILD_PCH_FALSE@ -GLIBCXX_BUILD_PCH_TRUE = @GLIBCXX_BUILD_PCH_TRUE@ -GLIBCXX_C_HEADERS_COMPATIBILITY_FALSE = @GLIBCXX_C_HEADERS_COMPATIBILITY_FALSE@ -GLIBCXX_C_HEADERS_COMPATIBILITY_TRUE = @GLIBCXX_C_HEADERS_COMPATIBILITY_TRUE@ -GLIBCXX_C_HEADERS_C_FALSE = @GLIBCXX_C_HEADERS_C_FALSE@ -GLIBCXX_C_HEADERS_C_GLOBAL_FALSE = @GLIBCXX_C_HEADERS_C_GLOBAL_FALSE@ -GLIBCXX_C_HEADERS_C_GLOBAL_TRUE = @GLIBCXX_C_HEADERS_C_GLOBAL_TRUE@ -GLIBCXX_C_HEADERS_C_STD_FALSE = @GLIBCXX_C_HEADERS_C_STD_FALSE@ -GLIBCXX_C_HEADERS_C_STD_TRUE = @GLIBCXX_C_HEADERS_C_STD_TRUE@ -GLIBCXX_C_HEADERS_C_TRUE = @GLIBCXX_C_HEADERS_C_TRUE@ -GLIBCXX_C_HEADERS_EXTRA_FALSE = @GLIBCXX_C_HEADERS_EXTRA_FALSE@ -GLIBCXX_C_HEADERS_EXTRA_TRUE = @GLIBCXX_C_HEADERS_EXTRA_TRUE@ -GLIBCXX_HOSTED_FALSE = @GLIBCXX_HOSTED_FALSE@ -GLIBCXX_HOSTED_TRUE = @GLIBCXX_HOSTED_TRUE@ GLIBCXX_INCLUDES = @GLIBCXX_INCLUDES@ -GLIBCXX_LDBL_COMPAT_FALSE = @GLIBCXX_LDBL_COMPAT_FALSE@ -GLIBCXX_LDBL_COMPAT_TRUE = @GLIBCXX_LDBL_COMPAT_TRUE@ GREP = @GREP@ +INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ @@ -162,9 +129,8 @@ LN_S = @LN_S@ LTLIBICONV = @LTLIBICONV@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ -MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@ -MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@ MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ NM = @NM@ OBJEXT = @OBJEXT@ OPTIMIZE_CXXFLAGS = @OPTIMIZE_CXXFLAGS@ @@ -190,13 +156,13 @@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ WARN_FLAGS = @WARN_FLAGS@ WERROR = @WERROR@ -ac_ct_AR = @ac_ct_AR@ -ac_ct_AS = @ac_ct_AS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ -ac_ct_RANLIB = @ac_ct_RANLIB@ -ac_ct_STRIP = @ac_ct_STRIP@ am__leading_dot = @am__leading_dot@ am__tar = @am__tar@ am__untar = @am__untar@ @@ -207,8 +173,12 @@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ +builddir = @builddir@ check_msgfmt = @check_msgfmt@ datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ enable_shared = @enable_shared@ enable_static = @enable_static@ exec_prefix = @exec_prefix@ @@ -228,29 +198,36 @@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ +htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ libtool_VERSION = @libtool_VERSION@ +localedir = @localedir@ localstatedir = @localstatedir@ lt_ECHO = @lt_ECHO@ mandir = @mandir@ mkdir_p = @mkdir_p@ multi_basedir = @multi_basedir@ oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ port_specific_symbol_files = @port_specific_symbol_files@ prefix = @prefix@ program_transform_name = @program_transform_name@ +psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ toplevel_srcdir = @toplevel_srcdir@ # May be used by various substitution variables. @@ -1126,10 +1103,6 @@ mostlyclean-libtool: clean-libtool: -rm -rf .libs _libs - -distclean-libtool: - -rm -f libtool -uninstall-info-am: tags: TAGS TAGS: @@ -1138,23 +1111,21 @@ CTAGS: distdir: $(DISTFILES) - $(mkdir_p) $(distdir)/.. - @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ - topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ - list='$(DISTFILES)'; for file in $$list; do \ - case $$file in \ - $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ - $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ - esac; \ + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ - dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ - if test "$$dir" != "$$file" && test "$$dir" != "."; then \ - dir="/$$dir"; \ - $(mkdir_p) "$(distdir)$$dir"; \ - else \ - dir=''; \ - fi; \ if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ @@ -1200,7 +1171,7 @@ clean-am: clean-generic clean-libtool clean-local mostlyclean-am distclean: distclean-am -rm -f Makefile -distclean-am: clean-am distclean-generic distclean-libtool +distclean-am: clean-am distclean-generic dvi: dvi-am @@ -1214,12 +1185,20 @@ info-am: install-data-am: install-data-local +install-dvi: install-dvi-am + install-exec-am: +install-html: install-html-am + install-info: install-info-am install-man: +install-pdf: install-pdf-am + +install-ps: install-ps-am + installcheck-am: maintainer-clean: maintainer-clean-am @@ -1238,18 +1217,21 @@ ps: ps-am ps-am: -uninstall-am: uninstall-info-am +uninstall-am: + +.MAKE: install-am install-strip .PHONY: all all-am all-local check check-am clean clean-generic \ clean-libtool clean-local distclean distclean-generic \ distclean-libtool distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am \ - install-data-local install-exec install-exec-am install-info \ - install-info-am install-man install-strip installcheck \ + install-data-local install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ - mostlyclean-libtool pdf pdf-am ps ps-am uninstall uninstall-am \ - uninstall-info-am + mostlyclean-libtool pdf pdf-am ps ps-am uninstall uninstall-am # Here are the rules for building the headers diff --git a/libstdc++-v3/include/backward/auto_ptr.h b/libstdc++-v3/include/backward/auto_ptr.h index 89580745090..0373b59c20f 100644 --- a/libstdc++-v3/include/backward/auto_ptr.h +++ b/libstdc++-v3/include/backward/auto_ptr.h @@ -1,6 +1,6 @@ // auto_ptr implementation -*- C++ -*- -// Copyright (C) 2007 Free Software Foundation, Inc. +// Copyright (C) 2007, 2008 Free Software Foundation, Inc. // // This file is part of the GNU ISO C++ Library. This library is free // software; you can redistribute it and/or modify it under the @@ -82,11 +82,9 @@ _GLIBCXX_BEGIN_NAMESPACE(std) * Good examples of what can and cannot be done with auto_ptr can * be found in the libstdc++ testsuite. * - * @if maint * _GLIBCXX_RESOLVE_LIB_DEFECTS * 127. auto_ptr<> conversion issues * These resolutions have all been incorporated. - * @endif */ template class auto_ptr @@ -167,12 +165,10 @@ _GLIBCXX_BEGIN_NAMESPACE(std) * deleted. If it no longer owns anything (i.e., @c get() is * @c NULL), then this has no effect. * - * @if maint * The C++ standard says there is supposed to be an empty throw * specification here, but omitting it is standard conforming. Its * presence can be detected only if _Tp::~_Tp() throws, but this is * prohibited. [17.4.3.6]/2 - * @endif */ ~auto_ptr() { delete _M_ptr; } diff --git a/libstdc++-v3/include/bits/basic_ios.h b/libstdc++-v3/include/bits/basic_ios.h index ea9c0dc6565..ca59d5678f7 100644 --- a/libstdc++-v3/include/bits/basic_ios.h +++ b/libstdc++-v3/include/bits/basic_ios.h @@ -1,7 +1,7 @@ // Iostreams base classes -*- C++ -*- // Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, -// 2006, 2007 +// 2006, 2007, 2008 // Free Software Foundation, Inc. // // This file is part of the GNU ISO C++ Library. This library is free @@ -81,9 +81,7 @@ _GLIBCXX_BEGIN_NAMESPACE(std) //@{ /** - * @if maint * These are non-standard types. - * @endif */ typedef ctype<_CharT> __ctype_type; typedef num_put<_CharT, ostreambuf_iterator<_CharT, _Traits> > diff --git a/libstdc++-v3/include/bits/basic_string.h b/libstdc++-v3/include/bits/basic_string.h index 1f36d1e9f44..d78e512ee34 100644 --- a/libstdc++-v3/include/bits/basic_string.h +++ b/libstdc++-v3/include/bits/basic_string.h @@ -1,7 +1,7 @@ // Components for manipulating sequences of characters -*- C++ -*- // Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, -// 2006, 2007 +// 2006, 2007, 2008 // Free Software Foundation, Inc. // // This file is part of the GNU ISO C++ Library. This library is free @@ -64,7 +64,6 @@ _GLIBCXX_BEGIN_NAMESPACE(std) * @doctodo * * - * @if maint * Documentation? What's that? * Nathan Myers . * @@ -104,7 +103,6 @@ _GLIBCXX_BEGIN_NAMESPACE(std) * * All but the last paragraph is considered pretty conventional * for a C++ string implementation. - * @endif */ // 21.3 Template class basic_string template diff --git a/libstdc++-v3/include/bits/ios_base.h b/libstdc++-v3/include/bits/ios_base.h index c7aa8fc7966..b8904e291ed 100644 --- a/libstdc++-v3/include/bits/ios_base.h +++ b/libstdc++-v3/include/bits/ios_base.h @@ -1,7 +1,7 @@ // Iostreams base classes -*- C++ -*- // Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, -// 2006, 2007 +// 2006, 2007, 2008 // Free Software Foundation, Inc. // // This file is part of the GNU ISO C++ Library. This library is free @@ -452,9 +452,7 @@ _GLIBCXX_BEGIN_NAMESPACE(std) protected: //@{ /** - * @if maint * ios_base data members (doc me) - * @endif */ streamsize _M_precision; streamsize _M_width; @@ -613,10 +611,8 @@ _GLIBCXX_BEGIN_NAMESPACE(std) * @brief Flags access. * @return The precision to generate on certain output operations. * - * @if maint * Be careful if you try to give a definition of "precision" here; see * DR 189. - * @endif */ streamsize precision() const diff --git a/libstdc++-v3/include/bits/locale_classes.h b/libstdc++-v3/include/bits/locale_classes.h index 691694aad22..10ca19af97d 100644 --- a/libstdc++-v3/include/bits/locale_classes.h +++ b/libstdc++-v3/include/bits/locale_classes.h @@ -97,9 +97,7 @@ _GLIBCXX_BEGIN_NAMESPACE(std) * monetary, and messages. They form a bitmask that supports union and * intersection. The category all is the union of these values. * - * @if maint * NB: Order must match _S_facet_categories definition in locale.cc - * @endif */ static const category none = 0; static const category ctype = 1L << 0; diff --git a/libstdc++-v3/include/bits/postypes.h b/libstdc++-v3/include/bits/postypes.h index 8fc8cf986bb..1248881c8e6 100644 --- a/libstdc++-v3/include/bits/postypes.h +++ b/libstdc++-v3/include/bits/postypes.h @@ -1,7 +1,7 @@ // Position types -*- C++ -*- // Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, -// 2006, 2007 +// 2006, 2007, 2008 // Free Software Foundation, Inc. // // This file is part of the GNU ISO C++ Library. This library is free @@ -62,12 +62,10 @@ _GLIBCXX_BEGIN_NAMESPACE(std) /** * @brief Type used by fpos, char_traits, and char_traits. * - * @if maint * In clauses 21.1.3.1 and 27.4.1 streamoff is described as an * implementation defined type. * Note: In versions of GCC up to and including GCC 3.3, streamoff * was typedef long. - * @endif */ #ifdef _GLIBCXX_HAVE_INT64_T typedef int64_t streamoff; diff --git a/libstdc++-v3/include/bits/stl_algo.h b/libstdc++-v3/include/bits/stl_algo.h index 4c65e1154c1..411505888f6 100644 --- a/libstdc++-v3/include/bits/stl_algo.h +++ b/libstdc++-v3/include/bits/stl_algo.h @@ -1,6 +1,6 @@ // Algorithm implementation -*- C++ -*- -// Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007 +// Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 // Free Software Foundation, Inc. // // This file is part of the GNU ISO C++ Library. This library is free @@ -142,11 +142,7 @@ _GLIBCXX_BEGIN_NAMESPACE(std) // for_each - /** - * @if maint - * This is an overload used by find() for the Input Iterator case. - * @endif - */ + /// This is an overload used by find() for the Input Iterator case. template inline _InputIterator __find(_InputIterator __first, _InputIterator __last, @@ -157,11 +153,7 @@ _GLIBCXX_BEGIN_NAMESPACE(std) return __first; } - /** - * @if maint - * This is an overload used by find_if() for the Input Iterator case. - * @endif - */ + /// This is an overload used by find_if() for the Input Iterator case. template inline _InputIterator __find_if(_InputIterator __first, _InputIterator __last, @@ -172,11 +164,7 @@ _GLIBCXX_BEGIN_NAMESPACE(std) return __first; } - /** - * @if maint - * This is an overload used by find() for the RAI case. - * @endif - */ + /// This is an overload used by find() for the RAI case. template _RandomAccessIterator __find(_RandomAccessIterator __first, _RandomAccessIterator __last, @@ -224,11 +212,7 @@ _GLIBCXX_BEGIN_NAMESPACE(std) } } - /** - * @if maint - * This is an overload used by find_if() for the RAI case. - * @endif - */ + /// This is an overload used by find_if() for the RAI case. template _RandomAccessIterator __find_if(_RandomAccessIterator __first, _RandomAccessIterator __last, @@ -290,11 +274,9 @@ _GLIBCXX_BEGIN_NAMESPACE(std) // search /** - * @if maint * This is an uglified * search_n(_ForwardIterator, _ForwardIterator, _Integer, const _Tp&) * overloaded for forward iterators. - * @endif */ template _ForwardIterator @@ -324,11 +306,9 @@ _GLIBCXX_BEGIN_NAMESPACE(std) } /** - * @if maint * This is an uglified * search_n(_ForwardIterator, _ForwardIterator, _Integer, const _Tp&) * overloaded for random access iterators. - * @endif */ template _RandomAccessIter @@ -378,12 +358,10 @@ _GLIBCXX_BEGIN_NAMESPACE(std) // search_n /** - * @if maint * This is an uglified * search_n(_ForwardIterator, _ForwardIterator, _Integer, const _Tp&, * _BinaryPredicate) * overloaded for forward iterators. - * @endif */ template @@ -419,12 +397,10 @@ _GLIBCXX_BEGIN_NAMESPACE(std) } /** - * @if maint * This is an uglified * search_n(_ForwardIterator, _ForwardIterator, _Integer, const _Tp&, * _BinaryPredicate) * overloaded for random access iterators. - * @endif */ template @@ -928,11 +904,9 @@ _GLIBCXX_BEGIN_NAMESPACE(std) } /** - * @if maint * This is an uglified unique_copy(_InputIterator, _InputIterator, * _OutputIterator) * overloaded for forward iterators and output iterator as result. - * @endif */ template _OutputIterator @@ -953,11 +927,9 @@ _GLIBCXX_BEGIN_NAMESPACE(std) } /** - * @if maint * This is an uglified unique_copy(_InputIterator, _InputIterator, * _OutputIterator) * overloaded for input iterators and output iterator as result. - * @endif */ template _OutputIterator @@ -978,11 +950,9 @@ _GLIBCXX_BEGIN_NAMESPACE(std) } /** - * @if maint * This is an uglified unique_copy(_InputIterator, _InputIterator, * _OutputIterator) * overloaded for input iterators and forward iterator as result. - * @endif */ template _ForwardIterator @@ -999,12 +969,10 @@ _GLIBCXX_BEGIN_NAMESPACE(std) } /** - * @if maint * This is an uglified * unique_copy(_InputIterator, _InputIterator, _OutputIterator, * _BinaryPredicate) * overloaded for forward iterators and output iterator as result. - * @endif */ template @@ -1030,12 +998,10 @@ _GLIBCXX_BEGIN_NAMESPACE(std) } /** - * @if maint * This is an uglified * unique_copy(_InputIterator, _InputIterator, _OutputIterator, * _BinaryPredicate) * overloaded for input iterators and output iterator as result. - * @endif */ template @@ -1061,12 +1027,10 @@ _GLIBCXX_BEGIN_NAMESPACE(std) } /** - * @if maint * This is an uglified * unique_copy(_InputIterator, _InputIterator, _OutputIterator, * _BinaryPredicate) * overloaded for input iterators and forward iterator as result. - * @endif */ template @@ -1088,11 +1052,9 @@ _GLIBCXX_BEGIN_NAMESPACE(std) } /** - * @if maint * This is an uglified reverse(_BidirectionalIterator, * _BidirectionalIterator) * overloaded for bidirectional iterators. - * @endif */ template void @@ -1110,11 +1072,9 @@ _GLIBCXX_BEGIN_NAMESPACE(std) } /** - * @if maint * This is an uglified reverse(_BidirectionalIterator, * _BidirectionalIterator) * overloaded for random access iterators. - * @endif */ template void @@ -1191,10 +1151,8 @@ _GLIBCXX_BEGIN_NAMESPACE(std) } /** - * @if maint * This is a helper function for the rotate algorithm specialized on RAIs. * It returns the greatest common divisor of two integer values. - * @endif */ template _EuclideanRingElement @@ -1209,11 +1167,7 @@ _GLIBCXX_BEGIN_NAMESPACE(std) return __m; } - /** - * @if maint - * This is a helper function for the rotate algorithm. - * @endif - */ + /// This is a helper function for the rotate algorithm. template void __rotate(_ForwardIterator __first, @@ -1249,11 +1203,7 @@ _GLIBCXX_BEGIN_NAMESPACE(std) } } - /** - * @if maint - * This is a helper function for the rotate algorithm. - * @endif - */ + /// This is a helper function for the rotate algorithm. template void __rotate(_BidirectionalIterator __first, @@ -1283,11 +1233,7 @@ _GLIBCXX_BEGIN_NAMESPACE(std) std::__reverse(__first, __middle, bidirectional_iterator_tag()); } - /** - * @if maint - * This is a helper function for the rotate algorithm. - * @endif - */ + /// This is a helper function for the rotate algorithm. template void __rotate(_RandomAccessIterator __first, @@ -1424,11 +1370,7 @@ _GLIBCXX_BEGIN_NAMESPACE(std) std::copy(__middle, __last, __result)); } - /** - * @if maint - * This is a helper function... - * @endif - */ + /// This is a helper function... template _ForwardIterator __partition(_ForwardIterator __first, _ForwardIterator __last, @@ -1453,11 +1395,7 @@ _GLIBCXX_BEGIN_NAMESPACE(std) return __first; } - /** - * @if maint - * This is a helper function... - * @endif - */ + /// This is a helper function... template _BidirectionalIterator __partition(_BidirectionalIterator __first, _BidirectionalIterator __last, @@ -1487,11 +1425,7 @@ _GLIBCXX_BEGIN_NAMESPACE(std) // partition - /** - * @if maint - * This is a helper function... - * @endif - */ + /// This is a helper function... template _ForwardIterator __inplace_stable_partition(_ForwardIterator __first, @@ -1515,11 +1449,7 @@ _GLIBCXX_BEGIN_NAMESPACE(std) return __begin; } - /** - * @if maint - * This is a helper function... - * @endif - */ + /// This is a helper function... template _ForwardIterator @@ -1617,11 +1547,7 @@ _GLIBCXX_BEGIN_NAMESPACE(std) } } - /** - * @if maint - * This is a helper function for the sort routines. - * @endif - */ + /// This is a helper function for the sort routines. template void __heap_select(_RandomAccessIterator __first, @@ -1634,11 +1560,7 @@ _GLIBCXX_BEGIN_NAMESPACE(std) std::__pop_heap(__first, __middle, __i); } - /** - * @if maint - * This is a helper function for the sort routines. - * @endif - */ + /// This is a helper function for the sort routines. template void __heap_select(_RandomAccessIterator __first, @@ -1786,11 +1708,7 @@ _GLIBCXX_BEGIN_NAMESPACE(std) return __result_real_last; } - /** - * @if maint - * This is a helper function for the sort routine. - * @endif - */ + /// This is a helper function for the sort routine. template void __unguarded_linear_insert(_RandomAccessIterator __last, _Tp __val) @@ -1806,11 +1724,7 @@ _GLIBCXX_BEGIN_NAMESPACE(std) *__last = __val; } - /** - * @if maint - * This is a helper function for the sort routine. - * @endif - */ + /// This is a helper function for the sort routine. template void __unguarded_linear_insert(_RandomAccessIterator __last, _Tp __val, @@ -1827,11 +1741,7 @@ _GLIBCXX_BEGIN_NAMESPACE(std) *__last = __val; } - /** - * @if maint - * This is a helper function for the sort routine. - * @endif - */ + /// This is a helper function for the sort routine. template void __insertion_sort(_RandomAccessIterator __first, @@ -1854,11 +1764,7 @@ _GLIBCXX_BEGIN_NAMESPACE(std) } } - /** - * @if maint - * This is a helper function for the sort routine. - * @endif - */ + /// This is a helper function for the sort routine. template void __insertion_sort(_RandomAccessIterator __first, @@ -1880,11 +1786,7 @@ _GLIBCXX_BEGIN_NAMESPACE(std) } } - /** - * @if maint - * This is a helper function for the sort routine. - * @endif - */ + /// This is a helper function for the sort routine. template inline void __unguarded_insertion_sort(_RandomAccessIterator __first, @@ -1897,11 +1799,7 @@ _GLIBCXX_BEGIN_NAMESPACE(std) std::__unguarded_linear_insert(__i, _ValueType(*__i)); } - /** - * @if maint - * This is a helper function for the sort routine. - * @endif - */ + /// This is a helper function for the sort routine. template inline void __unguarded_insertion_sort(_RandomAccessIterator __first, @@ -1915,18 +1813,12 @@ _GLIBCXX_BEGIN_NAMESPACE(std) } /** - * @if maint * @doctodo * This controls some aspect of the sort routines. - * @endif */ enum { _S_threshold = 16 }; - /** - * @if maint - * This is a helper function for the sort routine. - * @endif - */ + /// This is a helper function for the sort routine. template void __final_insertion_sort(_RandomAccessIterator __first, @@ -1941,11 +1833,7 @@ _GLIBCXX_BEGIN_NAMESPACE(std) std::__insertion_sort(__first, __last); } - /** - * @if maint - * This is a helper function for the sort routine. - * @endif - */ + /// This is a helper function for the sort routine. template void __final_insertion_sort(_RandomAccessIterator __first, @@ -1961,11 +1849,7 @@ _GLIBCXX_BEGIN_NAMESPACE(std) std::__insertion_sort(__first, __last, __comp); } - /** - * @if maint - * This is a helper function... - * @endif - */ + /// This is a helper function... template _RandomAccessIterator __unguarded_partition(_RandomAccessIterator __first, @@ -1985,11 +1869,7 @@ _GLIBCXX_BEGIN_NAMESPACE(std) } } - /** - * @if maint - * This is a helper function... - * @endif - */ + /// This is a helper function... template _RandomAccessIterator __unguarded_partition(_RandomAccessIterator __first, @@ -2010,11 +1890,7 @@ _GLIBCXX_BEGIN_NAMESPACE(std) } } - /** - * @if maint - * This is a helper function for the sort routine. - * @endif - */ + /// This is a helper function for the sort routine. template void __introsort_loop(_RandomAccessIterator __first, @@ -2046,11 +1922,7 @@ _GLIBCXX_BEGIN_NAMESPACE(std) } } - /** - * @if maint - * This is a helper function for the sort routine. - * @endif - */ + /// This is a helper function for the sort routine. template void __introsort_loop(_RandomAccessIterator __first, @@ -2083,11 +1955,7 @@ _GLIBCXX_BEGIN_NAMESPACE(std) } } - /** - * @if maint - * This is a helper function for the sort routines. Precondition: __n > 0. - * @endif - */ + /// This is a helper function for the sort routines. Precondition: __n > 0. template inline _Size __lg(_Size __n) @@ -2125,6 +1993,7 @@ _GLIBCXX_BEGIN_NAMESPACE(std) if (__depth_limit == 0) { std::__heap_select(__first, __nth + 1, __last); + // Place the nth largest element in its final position. std::iter_swap(__first, __nth); return; @@ -2578,11 +2447,7 @@ _GLIBCXX_BEGIN_NAMESPACE(std) // merge - /** - * @if maint - * This is a helper function for the merge routines. - * @endif - */ + /// This is a helper function for the merge routines. template _BidirectionalIterator3 @@ -2617,11 +2482,7 @@ _GLIBCXX_BEGIN_NAMESPACE(std) } } - /** - * @if maint - * This is a helper function for the merge routines. - * @endif - */ + /// This is a helper function for the merge routines. template _BidirectionalIterator3 @@ -2657,11 +2518,7 @@ _GLIBCXX_BEGIN_NAMESPACE(std) } } - /** - * @if maint - * This is a helper function for the merge routines. - * @endif - */ + /// This is a helper function for the merge routines. template _BidirectionalIterator1 @@ -2693,11 +2550,7 @@ _GLIBCXX_BEGIN_NAMESPACE(std) } } - /** - * @if maint - * This is a helper function for the merge routines. - * @endif - */ + /// This is a helper function for the merge routines. template void @@ -2753,11 +2606,7 @@ _GLIBCXX_BEGIN_NAMESPACE(std) } } - /** - * @if maint - * This is a helper function for the merge routines. - * @endif - */ + /// This is a helper function for the merge routines. template void @@ -2815,11 +2664,7 @@ _GLIBCXX_BEGIN_NAMESPACE(std) } } - /** - * @if maint - * This is a helper function for the merge routines. - * @endif - */ + /// This is a helper function for the merge routines. template void __merge_without_buffer(_BidirectionalIterator __first, @@ -2862,11 +2707,7 @@ _GLIBCXX_BEGIN_NAMESPACE(std) __len1 - __len11, __len2 - __len22); } - /** - * @if maint - * This is a helper function for the merge routines. - * @endif - */ + /// This is a helper function for the merge routines. template void @@ -3207,11 +3048,7 @@ _GLIBCXX_BEGIN_NAMESPACE(std) __comp); } - /** - * @if maint - * This is a helper function for the stable sorting routines. - * @endif - */ + /// This is a helper function for the stable sorting routines. template void __inplace_stable_sort(_RandomAccessIterator __first, @@ -3230,11 +3067,7 @@ _GLIBCXX_BEGIN_NAMESPACE(std) __last - __middle); } - /** - * @if maint - * This is a helper function for the stable sorting routines. - * @endif - */ + /// This is a helper function for the stable sorting routines. template void __inplace_stable_sort(_RandomAccessIterator __first, @@ -4615,14 +4448,12 @@ _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD_P) * unique_copy() is stable, so the relative order of elements that are * copied is unchanged. * - * @if maint * _GLIBCXX_RESOLVE_LIB_DEFECTS * DR 241. Does unique_copy() require CopyConstructible and Assignable? * * _GLIBCXX_RESOLVE_LIB_DEFECTS * DR 538. 241 again: Does unique_copy() require CopyConstructible and * Assignable? - * @endif */ template inline _OutputIterator @@ -4659,10 +4490,8 @@ _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD_P) * unique_copy() is stable, so the relative order of elements that are * copied is unchanged. * - * @if maint * _GLIBCXX_RESOLVE_LIB_DEFECTS * DR 241. Does unique_copy() require CopyConstructible and Assignable? - * @endif */ template diff --git a/libstdc++-v3/include/bits/stl_construct.h b/libstdc++-v3/include/bits/stl_construct.h index 460383424a6..1c4324eb0e1 100644 --- a/libstdc++-v3/include/bits/stl_construct.h +++ b/libstdc++-v3/include/bits/stl_construct.h @@ -1,6 +1,6 @@ // nonstandard construct and destroy functions -*- C++ -*- -// Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007 +// Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 // Free Software Foundation, Inc. // // This file is part of the GNU ISO C++ Library. This library is free @@ -67,10 +67,8 @@ _GLIBCXX_BEGIN_NAMESPACE(std) /** - * @if maint * Constructs an object in existing memory by invoking an allocated * object's constructor with an initializer. - * @endif */ template inline void @@ -82,9 +80,7 @@ _GLIBCXX_BEGIN_NAMESPACE(std) } /** - * @if maint * Destroy the object pointed to by a pointer type. - * @endif */ template inline void @@ -92,11 +88,9 @@ _GLIBCXX_BEGIN_NAMESPACE(std) { __pointer->~_Tp(); } /** - * @if maint * Destroy a range of objects. If the value_type of the object has * a trivial destructor, the compiler should optimize all of this * away, otherwise the objects' destructors must be invoked. - * @endif */ template inline void @@ -110,11 +104,9 @@ _GLIBCXX_BEGIN_NAMESPACE(std) } /** - * @if maint * Destroy a range of objects using the supplied allocator. For * nondefault allocators we do not optimize away invocation of * destroy() even if _Tp has a trivial destructor. - * @endif */ template class allocator; diff --git a/libstdc++-v3/include/bits/stl_deque.h b/libstdc++-v3/include/bits/stl_deque.h index 4261e758299..c5ae17a83f8 100644 --- a/libstdc++-v3/include/bits/stl_deque.h +++ b/libstdc++-v3/include/bits/stl_deque.h @@ -1,6 +1,6 @@ // Deque implementation -*- C++ -*- -// Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007 +// Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 // Free Software Foundation, Inc. // // This file is part of the GNU ISO C++ Library. This library is free @@ -69,7 +69,6 @@ _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD_D) /** - * @if maint * @brief This function controls the size of memory nodes. * @param size The size of an element. * @return The number (not byte size) of elements per node. @@ -78,7 +77,6 @@ _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD_D) * be a useful wrapper around a repeated constant expression. The '512' is * tuneable (and no other code needs to change), but no investigation has * been done since inheriting the SGI code. - * @endif */ inline size_t __deque_buf_size(size_t __size) @@ -94,9 +92,7 @@ _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD_D) * elements is done as offsets of either of those two, relying on * operator overloading in this class. * - * @if maint * All the functions are op overloads except for _M_set_node. - * @endif */ template struct _Deque_iterator @@ -221,11 +217,10 @@ _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD_D) operator[](difference_type __n) const { return *(*this + __n); } - /** @if maint + /** * Prepares to traverse new_node. Sets everything except * _M_cur, which should therefore be set by the caller * immediately afterwards, based on _M_first and _M_last. - * @endif */ void _M_set_node(_Map_pointer __new_node) @@ -357,7 +352,6 @@ _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD_D) const _Deque_iterator<_Tp, _Tp&, _Tp*>& __last, const _Tp& __value); /** - * @if maint * Deque base class. This class provides the unified face for %deque's * allocation. This class's constructor and destructor allocate and * deallocate (but do not initialize) storage. This makes %exception @@ -366,7 +360,6 @@ _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD_D) * Nothing in this class ever constructs or destroys an actual Tp element. * (Deque handles that itself.) Only/All memory management is performed * here. - * @endif */ template class _Deque_base @@ -491,14 +484,12 @@ _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD_D) } /** - * @if maint * @brief Layout storage. * @param num_elements The count of T's for which to allocate space * at first. * @return Nothing. * * The initial underlying memory layout is a bit complicated... - * @endif */ template void @@ -583,7 +574,6 @@ _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD_D) * out to violate the C++ standard (it can be detected using template * template parameters), and it was removed. * - * @if maint * Here's how a deque manages memory. Each deque has 4 members: * * - Tp** _M_map @@ -648,7 +638,6 @@ _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD_D) * All the implementation routines for deque itself work only through the * start and finish iterators. This keeps the routines simple and sane, * and we can use other standard algorithms as well. - * @endif */ template > class deque : protected _Deque_base<_Tp, _Alloc> @@ -691,10 +680,9 @@ _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD_D) using _Base::_M_deallocate_map; using _Base::_M_get_Tp_allocator; - /** @if maint + /** * A total of four data members accumulated down the heirarchy. * May be accessed via _M_impl.* - * @endif */ using _Base::_M_impl; @@ -1034,7 +1022,7 @@ _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD_D) { return this->_M_impl._M_start[difference_type(__n)]; } protected: - /// @if maint Safety check used only from at(). @endif + /// Safety check used only from at(). void _M_range_check(size_type __n) const { @@ -1414,7 +1402,6 @@ _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD_D) // called by the second initialize_dispatch above //@{ /** - * @if maint * @brief Fills the deque with whatever is in [first,last). * @param first An input iterator. * @param last An input iterator. @@ -1423,7 +1410,6 @@ _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD_D) * If the iterators are actually forward iterators (or better), then the * memory layout can be done all at once. Else we move forward using * push_back on each value from the iterator. - * @endif */ template void @@ -1438,7 +1424,6 @@ _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD_D) //@} /** - * @if maint * @brief Fills the %deque with copies of value. * @param value Initial value. * @return Nothing. @@ -1447,7 +1432,6 @@ _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD_D) * * This function is called only when the user provides an explicit size * (with or without an explicit exemplar value). - * @endif */ void _M_fill_initialize(const value_type& __value); @@ -1517,11 +1501,7 @@ _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD_D) } //@{ - /** - * @if maint - * @brief Helper functions for push_* and pop_*. - * @endif - */ + /// Helper functions for push_* and pop_*. #ifndef __GXX_EXPERIMENTAL_CXX0X__ void _M_push_back_aux(const value_type&); @@ -1645,12 +1625,7 @@ _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD_D) } //@{ - /** - * @if maint - * @brief Memory-handling helpers for the previous internal insert - * functions. - * @endif - */ + /// Memory-handling helpers for the previous internal insert functions. iterator _M_reserve_elements_at_front(size_type __n) { @@ -1681,13 +1656,11 @@ _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD_D) //@{ /** - * @if maint * @brief Memory-handling helpers for the major %map. * * Makes sure the _M_map has space for new nodes. Does not * actually add the nodes. Can invalidate _M_map pointers. * (And consequently, %deque iterators.) - * @endif */ void _M_reserve_map_at_back(size_type __nodes_to_add = 1) diff --git a/libstdc++-v3/include/bits/stl_iterator.h b/libstdc++-v3/include/bits/stl_iterator.h index 2d89e576f4e..aac03137543 100644 --- a/libstdc++-v3/include/bits/stl_iterator.h +++ b/libstdc++-v3/include/bits/stl_iterator.h @@ -1,6 +1,6 @@ // Iterators -*- C++ -*- -// Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007 +// Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 // Free Software Foundation, Inc. // // This file is part of the GNU ISO C++ Library. This library is free @@ -860,14 +860,12 @@ _GLIBCXX_BEGIN_NAMESPACE(std) // 24.4.3 Move iterators /** - * @if maint * Class template move_iterator is an iterator adapter with the same * behavior as the underlying iterator except that its dereference * operator implicitly converts the value returned by the underlying * iterator's dereference operator to an rvalue reference. Some * generic algorithms can be called with move iterators to replace * copying with moving. - * @endif */ template class move_iterator diff --git a/libstdc++-v3/include/bits/stl_iterator_base_types.h b/libstdc++-v3/include/bits/stl_iterator_base_types.h index 785abefdd34..8810f522d54 100644 --- a/libstdc++-v3/include/bits/stl_iterator_base_types.h +++ b/libstdc++-v3/include/bits/stl_iterator_base_types.h @@ -1,6 +1,6 @@ // Types used in iterator implementation -*- C++ -*- -// Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007 +// Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 // Free Software Foundation, Inc. // // This file is part of the GNU ISO C++ Library. This library is free @@ -158,10 +158,8 @@ _GLIBCXX_BEGIN_NAMESPACE(std) }; /** - * @if maint * This function is not a part of the C++ standard but is syntactic * sugar for internal library use only. - * @endif */ template inline typename iterator_traits<_Iter>::iterator_category diff --git a/libstdc++-v3/include/bits/stl_list.h b/libstdc++-v3/include/bits/stl_list.h index 0904586a9e6..79439e785e9 100644 --- a/libstdc++-v3/include/bits/stl_list.h +++ b/libstdc++-v3/include/bits/stl_list.h @@ -1,6 +1,6 @@ // List implementation -*- C++ -*- -// Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007 +// Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 // Free Software Foundation, Inc. // // This file is part of the GNU ISO C++ Library. This library is free @@ -71,11 +71,11 @@ _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD_D) // duplication. This results in some "needless" static_cast'ing later on, // but it's all safe downcasting. - /// @if maint Common part of a node in the %list. @endif + /// Common part of a node in the %list. struct _List_node_base { - _List_node_base* _M_next; ///< Self-explanatory - _List_node_base* _M_prev; ///< Self-explanatory + _List_node_base* _M_next; + _List_node_base* _M_prev; static void swap(_List_node_base& __x, _List_node_base& __y); @@ -94,19 +94,18 @@ _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD_D) unhook(); }; - /// @if maint An actual node in the %list. @endif + /// An actual node in the %list. template struct _List_node : public _List_node_base { - _Tp _M_data; ///< User's data. + ///< User's data. + _Tp _M_data; }; /** * @brief A list::iterator. * - * @if maint * All the functions are op overloads. - * @endif */ template struct _List_iterator @@ -181,9 +180,7 @@ _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD_D) /** * @brief A list::const_iterator. * - * @if maint * All the functions are op overloads. - * @endif */ template struct _List_const_iterator @@ -273,11 +270,7 @@ _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD_D) { return __x._M_node != __y._M_node; } - /** - * @if maint - * See bits/stl_deque.h's _Deque_base for an explanation. - * @endif - */ + /// See bits/stl_deque.h's _Deque_base for an explanation. template class _List_base { @@ -400,7 +393,6 @@ _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD_D) * specialized algorithms %unique to linked lists, such as * splicing, sorting, and in-place reversal. * - * @if maint * A couple points on memory allocation for list: * * First, we never actually allocate a Tp, we allocate @@ -418,7 +410,7 @@ _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD_D) * pointing to @e D, not to @e A! To get to the head of the %list, * we start at the tail and move forward by one. When this member * iterator's next/previous pointers refer to itself, the %list is - * %empty. @endif + * %empty. */ template > class list : protected _List_base<_Tp, _Alloc> @@ -457,11 +449,9 @@ _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD_D) using _Base::_M_get_Node_allocator; /** - * @if maint * @param x An instance of user data. * * Allocates space for a new node and constructs a copy of @a x in it. - * @endif */ #ifndef __GXX_EXPERIMENTAL_CXX0X__ _Node* diff --git a/libstdc++-v3/include/bits/stl_map.h b/libstdc++-v3/include/bits/stl_map.h index 64264405cb1..bf174cc0634 100644 --- a/libstdc++-v3/include/bits/stl_map.h +++ b/libstdc++-v3/include/bits/stl_map.h @@ -1,6 +1,6 @@ // Map implementation -*- C++ -*- -// Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007 +// Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 // Free Software Foundation, Inc. // // This file is part of the GNU ISO C++ Library. This library is free @@ -82,11 +82,9 @@ _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD_D) * * Maps support bidirectional iterators. * - * @if maint * The private tree data is declared exactly the same way for map and * multimap; the distinction is made entirely in how the tree functions are * called (*_unique versus *_equal, same as the standard). - * @endif */ template , typename _Alloc = std::allocator > > @@ -124,14 +122,14 @@ _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD_D) }; private: - /// @if maint This turns a red-black tree into a [multi]map. @endif + /// This turns a red-black tree into a [multi]map. typedef typename _Alloc::template rebind::other _Pair_alloc_type; typedef _Rb_tree, key_compare, _Pair_alloc_type> _Rep_type; - /// @if maint The actual tree structure. @endif + /// The actual tree structure. _Rep_type _M_t; public: diff --git a/libstdc++-v3/include/bits/stl_multimap.h b/libstdc++-v3/include/bits/stl_multimap.h index 76d6b4797f2..b264126576e 100644 --- a/libstdc++-v3/include/bits/stl_multimap.h +++ b/libstdc++-v3/include/bits/stl_multimap.h @@ -1,6 +1,6 @@ // Multimap implementation -*- C++ -*- -// Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007 +// Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 // Free Software Foundation, Inc. // // This file is part of the GNU ISO C++ Library. This library is free @@ -81,11 +81,9 @@ _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD_D) * * Multimaps support bidirectional iterators. * - * @if maint * The private tree data is declared exactly the same way for map and * multimap; the distinction is made entirely in how the tree functions are * called (*_unique versus *_equal, same as the standard). - * @endif */ template , @@ -124,13 +122,13 @@ _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD_D) }; private: - /// @if maint This turns a red-black tree into a [multi]map. @endif + /// This turns a red-black tree into a [multi]map. typedef typename _Alloc::template rebind::other _Pair_alloc_type; typedef _Rb_tree, key_compare, _Pair_alloc_type> _Rep_type; - /// @if maint The actual tree structure. @endif + /// The actual tree structure. _Rep_type _M_t; public: diff --git a/libstdc++-v3/include/bits/stl_multiset.h b/libstdc++-v3/include/bits/stl_multiset.h index 5c897bdcc34..0a8e38174c7 100644 --- a/libstdc++-v3/include/bits/stl_multiset.h +++ b/libstdc++-v3/include/bits/stl_multiset.h @@ -1,6 +1,6 @@ // Multiset implementation -*- C++ -*- -// Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007 +// Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 // Free Software Foundation, Inc. // // This file is part of the GNU ISO C++ Library. This library is free @@ -80,11 +80,9 @@ _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD_D) * * Multisets support bidirectional iterators. * - * @if maint * The private tree data is declared exactly the same way for set and * multiset; the distinction is made entirely in how the tree functions are * called (*_unique versus *_equal, same as the standard). - * @endif */ template , typename _Alloc = std::allocator<_Key> > @@ -106,12 +104,12 @@ _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD_D) typedef _Alloc allocator_type; private: - /// @if maint This turns a red-black tree into a [multi]set. @endif + /// This turns a red-black tree into a [multi]set. typedef typename _Alloc::template rebind<_Key>::other _Key_alloc_type; typedef _Rb_tree, key_compare, _Key_alloc_type> _Rep_type; - /// @if maint The actual tree structure. @endif + /// The actual tree structure. _Rep_type _M_t; public: diff --git a/libstdc++-v3/include/bits/stl_relops.h b/libstdc++-v3/include/bits/stl_relops.h index 11fc30dedd8..376a6b17369 100644 --- a/libstdc++-v3/include/bits/stl_relops.h +++ b/libstdc++-v3/include/bits/stl_relops.h @@ -1,6 +1,6 @@ // std::rel_ops implementation -*- C++ -*- -// Copyright (C) 2001, 2002, 2004, 2005 Free Software Foundation, Inc. +// Copyright (C) 2001, 2002, 2004, 2005, 2008 Free Software Foundation, Inc. // // This file is part of the GNU ISO C++ Library. This library is free // software; you can redistribute it and/or modify it under the @@ -57,7 +57,6 @@ * This is an internal header file, included by other library headers. * You should not attempt to use it directly. * - * @if maint * Inclusion of this file has been removed from * all of the other STL headers for safety reasons, except std_utility.h. * For more information, see the thread of about twenty messages starting @@ -65,7 +64,6 @@ * FAQ at http://gcc.gnu.org/onlinedocs/libstdc++/faq/index.html#4_4 . * * Short summary: the rel_ops operators should be avoided for the present. - * @endif */ #ifndef _STL_RELOPS_H diff --git a/libstdc++-v3/include/bits/stl_set.h b/libstdc++-v3/include/bits/stl_set.h index 3eb4b26962a..ab84e88aec8 100644 --- a/libstdc++-v3/include/bits/stl_set.h +++ b/libstdc++-v3/include/bits/stl_set.h @@ -1,6 +1,6 @@ // Set implementation -*- C++ -*- -// Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007 +// Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 // Free Software Foundation, Inc. // // This file is part of the GNU ISO C++ Library. This library is free @@ -83,11 +83,9 @@ _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD_D) * @param Compare Comparison function object type, defaults to less. * @param Alloc Allocator type, defaults to allocator. * - * @if maint * The private tree data is declared exactly the same way for set and * multiset; the distinction is made entirely in how the tree functions are * called (*_unique versus *_equal, same as the standard). - * @endif */ template, typename _Alloc = std::allocator<_Key> > @@ -116,7 +114,7 @@ _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD_D) typedef _Rb_tree, key_compare, _Key_alloc_type> _Rep_type; - _Rep_type _M_t; // red-black tree representing set + _Rep_type _M_t; // Red-black tree representing set. public: //@{ diff --git a/libstdc++-v3/include/bits/stl_tempbuf.h b/libstdc++-v3/include/bits/stl_tempbuf.h index 3a22fab0615..e9ba10c7e8a 100644 --- a/libstdc++-v3/include/bits/stl_tempbuf.h +++ b/libstdc++-v3/include/bits/stl_tempbuf.h @@ -1,6 +1,6 @@ // Temporary buffer implementation -*- C++ -*- -// Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007 +// Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 // Free Software Foundation, Inc. // // This file is part of the GNU ISO C++ Library. This library is free @@ -119,11 +119,9 @@ _GLIBCXX_BEGIN_NAMESPACE(std) /** - * @if maint * This class is used in two places: stl_algo.h and ext/memory, * where it is wrapped as the temporary_buffer class. See * temporary_buffer docs for more notes. - * @endif */ template class _Temporary_buffer diff --git a/libstdc++-v3/include/bits/stl_vector.h b/libstdc++-v3/include/bits/stl_vector.h index ad7d08375ac..ea75ede2431 100644 --- a/libstdc++-v3/include/bits/stl_vector.h +++ b/libstdc++-v3/include/bits/stl_vector.h @@ -1,6 +1,6 @@ // Vector implementation -*- C++ -*- -// Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007 +// Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 // Free Software Foundation, Inc. // // This file is part of the GNU ISO C++ Library. This library is free @@ -68,11 +68,7 @@ _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD_D) - /** - * @if maint - * See bits/stl_deque.h's _Deque_base for an explanation. - * @endif - */ + /// See bits/stl_deque.h's _Deque_base for an explanation. template struct _Vector_base { @@ -582,7 +578,7 @@ _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD_D) { return *(this->_M_impl._M_start + __n); } protected: - /// @if maint Safety check used only from at(). @endif + /// Safety check used only from at(). void _M_range_check(size_type __n) const { @@ -897,10 +893,8 @@ _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD_D) protected: /** - * @if maint * Memory expansion handler. Uses the member allocation function to * obtain @a n bytes of memory, and then copies [first,last) into it. - * @endif */ template pointer diff --git a/libstdc++-v3/include/ext/pool_allocator.h b/libstdc++-v3/include/ext/pool_allocator.h index 3259d983adc..e2e38a02af5 100644 --- a/libstdc++-v3/include/ext/pool_allocator.h +++ b/libstdc++-v3/include/ext/pool_allocator.h @@ -1,6 +1,6 @@ // Allocators -*- C++ -*- -// Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007 +// Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 // Free Software Foundation, Inc. // // This file is part of the GNU ISO C++ Library. This library is free @@ -64,7 +64,6 @@ _GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx) /** * @brief Base class for __pool_alloc. * - * @if maint * Uses various allocators to fulfill underlying requests (and makes as * few requests as possible when in default high-speed pool mode). * @@ -76,8 +75,6 @@ _GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx) * _S_round_up(requested_size). Thus the client has enough size * information that we can return the object to the proper free list * without permanently losing part of the object. - * - * @endif */ class __pool_alloc_base { diff --git a/libstdc++-v3/include/ext/rc_string_base.h b/libstdc++-v3/include/ext/rc_string_base.h index 81dc7eac030..6bfead9ff2a 100644 --- a/libstdc++-v3/include/ext/rc_string_base.h +++ b/libstdc++-v3/include/ext/rc_string_base.h @@ -1,6 +1,6 @@ // Reference-counted versatile string base -*- C++ -*- -// Copyright (C) 2005, 2006, 2007 Free Software Foundation, Inc. +// Copyright (C) 2005, 2006, 2007, 2008 Free Software Foundation, Inc. // // This file is part of the GNU ISO C++ Library. This library is free // software; you can redistribute it and/or modify it under the @@ -42,7 +42,6 @@ _GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx) /** - * @if maint * Documentation? What's that? * Nathan Myers . * @@ -82,7 +81,6 @@ _GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx) * * All but the last paragraph is considered pretty conventional * for a C++ string implementation. - * @endif */ template class __rc_string_base diff --git a/libstdc++-v3/include/std/bitset b/libstdc++-v3/include/std/bitset index 9a984d03d2e..deaa92db3c6 100644 --- a/libstdc++-v3/include/std/bitset +++ b/libstdc++-v3/include/std/bitset @@ -1,6 +1,6 @@ // -*- C++ -*- -// Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007 +// Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 // Free Software Foundation, Inc. // // This file is part of the GNU ISO C++ Library. This library is free @@ -65,12 +65,10 @@ _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD_D) /** - * @if maint * Base class, general case. It is a class inveriant that _Nw will be * nonnegative. * * See documentation for bitset. - * @endif */ template struct _Base_bitset @@ -330,11 +328,9 @@ _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD_D) } // end _M_do_find_next /** - * @if maint * Base class, specialization for a single word. * * See documentation for bitset. - * @endif */ template<> struct _Base_bitset<1> @@ -460,11 +456,9 @@ _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD_D) }; /** - * @if maint * Base class, specialization for no storage (zero-length %bitset). * * See documentation for bitset. - * @endif */ template<> struct _Base_bitset<0> @@ -643,7 +637,6 @@ _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD_D) * Also see http://gcc.gnu.org/onlinedocs/libstdc++/ext/sgiexts.html#ch23 * for a description of extensions. * - * @if maint * Most of the actual code isn't contained in %bitset<> itself, but in the * base class _Base_bitset. The base class works with whole words, not with * individual bits. This allows us to specialize _Base_bitset for the @@ -652,7 +645,6 @@ _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD_D) * Extra confusion can result due to the fact that the storage for * _Base_bitset @e is a regular array, and is indexed as such. This is * carefully encapsulated. - * @endif */ template class bitset @@ -991,13 +983,11 @@ _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD_D) * @note These operators do no range checking and throw no exceptions, * as required by DR 11 to the standard. * - * @if maint * _GLIBCXX_RESOLVE_LIB_DEFECTS Note that this implementation already * resolves DR 11 (items 1 and 2), but does not do the range-checking * required by that DR's resolution. -pme * The DR has since been changed: range-checking is a precondition * (users' responsibility), and these functions must not throw. -pme - * @endif */ reference operator[](size_t __position) diff --git a/libstdc++-v3/include/std/fstream b/libstdc++-v3/include/std/fstream index af7635e9145..fc2eca17851 100644 --- a/libstdc++-v3/include/std/fstream +++ b/libstdc++-v3/include/std/fstream @@ -1,7 +1,7 @@ // File based streams -*- C++ -*- // Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, -// 2006, 2007 +// 2006, 2007, 2008 // Free Software Foundation, Inc. // // This file is part of the GNU ISO C++ Library. This library is free @@ -91,11 +91,7 @@ _GLIBCXX_BEGIN_NAMESPACE(std) // External buffer. __file_type _M_file; - /** - * @if maint - * Place to stash in || out || in | out settings for current filebuf. - * @endif - */ + /// Place to stash in || out || in | out settings for current filebuf. ios_base::openmode _M_mode; // Beginning state type for codecvt. @@ -110,19 +106,13 @@ _GLIBCXX_BEGIN_NAMESPACE(std) // to eback() and _M_ext_buf. __state_type _M_state_last; - /** - * @if maint - * Pointer to the beginning of internal buffer. - * @endif - */ + /// Pointer to the beginning of internal buffer. char_type* _M_buf; /** - * @if maint * Actual size of internal buffer. This number is equal to the size * of the put area + 1 position, reserved for the overflow char of * a full area. - * @endif */ size_t _M_buf_size; @@ -130,24 +120,20 @@ _GLIBCXX_BEGIN_NAMESPACE(std) bool _M_buf_allocated; /** - * @if maint * _M_reading == false && _M_writing == false for 'uncommitted' mode; * _M_reading == true for 'read' mode; * _M_writing == true for 'write' mode; * * NB: _M_reading == true && _M_writing == true is unused. - * @endif */ bool _M_reading; bool _M_writing; //@{ /** - * @if maint * Necessary bits for putback buffer management. * * @note pbacks of over one character are not currently supported. - * @endif */ char_type _M_pback; char_type* _M_pback_cur_save; @@ -159,37 +145,29 @@ _GLIBCXX_BEGIN_NAMESPACE(std) const __codecvt_type* _M_codecvt; /** - * @if maint * Buffer for external characters. Used for input when * codecvt::always_noconv() == false. When valid, this corresponds * to eback(). - * @endif */ char* _M_ext_buf; /** - * @if maint * Size of buffer held by _M_ext_buf. - * @endif */ streamsize _M_ext_buf_size; /** - * @if maint * Pointers into the buffer held by _M_ext_buf that delimit a * subsequence of bytes that have been read but not yet converted. * When valid, _M_ext_next corresponds to egptr(). - * @endif */ const char* _M_ext_next; char* _M_ext_end; /** - * @if maint * Initializes pback buffers, and moves normal buffers to safety. * Assumptions: * _M_in_cur has already been moved back - * @endif */ void _M_create_pback() @@ -204,11 +182,9 @@ _GLIBCXX_BEGIN_NAMESPACE(std) } /** - * @if maint * Deactivates pback buffer contents, and restores normal buffer. * Assumptions: * The pback buffer has only moved forward. - * @endif */ void _M_destroy_pback() throw() @@ -384,7 +360,6 @@ _GLIBCXX_BEGIN_NAMESPACE(std) _M_terminate_output(); /** - * @if maint * This function sets the pointers of the internal buffer, both get * and put areas. Typically: * @@ -395,7 +370,6 @@ _GLIBCXX_BEGIN_NAMESPACE(std) * NB: epptr() - pbase() == _M_buf_size - 1, since _M_buf_size * reflects the actual allocated memory and the last cell is reserved * for the overflow char of a full put area. - * @endif */ void _M_set_buffer(streamsize __off) diff --git a/libstdc++-v3/include/std/istream b/libstdc++-v3/include/std/istream index 8b1666c10e3..72eb5d88f38 100644 --- a/libstdc++-v3/include/std/istream +++ b/libstdc++-v3/include/std/istream @@ -77,10 +77,8 @@ _GLIBCXX_BEGIN_NAMESPACE(std) protected: // Data Members: /** - * @if maint * The number of characters extracted in the previous unformatted * function; see gcount(). - * @endif */ streamsize _M_gcount; diff --git a/libstdc++-v3/include/std/limits b/libstdc++-v3/include/std/limits index 621a6fc347f..cb4d1e25ff3 100644 --- a/libstdc++-v3/include/std/limits +++ b/libstdc++-v3/include/std/limits @@ -1,6 +1,6 @@ // The template and inlines for the numeric_limits classes. -*- C++ -*- -// Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007 +// Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 // Free Software Foundation, Inc. // // This file is part of the GNU ISO C++ Library. This library is free @@ -205,9 +205,7 @@ _GLIBCXX_BEGIN_NAMESPACE(std) /** True if the type is signed. */ static const bool is_signed = false; /** True if the type is integer. - * @if maint * Is this supposed to be "if the type is integral"? - * @endif */ static const bool is_integer = false; /** True if the type uses an exact representation. "All integer types are @@ -278,10 +276,8 @@ _GLIBCXX_BEGIN_NAMESPACE(std) * non-fundamental types, the functions will return 0 and the data * members will all be @c false. * - * @if maint * _GLIBCXX_RESOLVE_LIB_DEFECTS: DRs 201 and 184 (hi Gaby!) are * noted, but not incorporated in this documented (yet). - * @endif */ template struct numeric_limits : public __numeric_limits_base diff --git a/libstdc++-v3/include/std/sstream b/libstdc++-v3/include/std/sstream index 66159c844f1..f8dd50a19f9 100644 --- a/libstdc++-v3/include/std/sstream +++ b/libstdc++-v3/include/std/sstream @@ -1,7 +1,7 @@ // String based streams -*- C++ -*- -// Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006 -// Free Software Foundation, Inc. +// Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, +// 2006, 2008 Free Software Foundation, Inc. // // This file is part of the GNU ISO C++ Library. This library is free // software; you can redistribute it and/or modify it under the @@ -77,11 +77,7 @@ _GLIBCXX_BEGIN_NAMESPACE(std) typedef typename __string_type::size_type __size_type; protected: - /** - * @if maint - * Place to stash in || out || in | out settings for current stringbuf. - * @endif - */ + /// Place to stash in || out || in | out settings for current stringbuf. ios_base::openmode _M_mode; // Data Members: @@ -290,10 +286,8 @@ _GLIBCXX_BEGIN_NAMESPACE(std) * Initializes @c sb using @c mode|in, and passes @c &sb to the base * class initializer. Does not allocate any buffer. * - * @if maint * That's a lie. We initialize the base class with NULL, because the * string class does its own memory management. - * @endif */ explicit basic_istringstream(ios_base::openmode __mode = ios_base::in) @@ -310,10 +304,8 @@ _GLIBCXX_BEGIN_NAMESPACE(std) * Initializes @c sb using @a str and @c mode|in, and passes @c &sb * to the base class initializer. * - * @if maint * That's a lie. We initialize the base class with NULL, because the * string class does its own memory management. - * @endif */ explicit basic_istringstream(const __string_type& __str, @@ -403,10 +395,8 @@ _GLIBCXX_BEGIN_NAMESPACE(std) * Initializes @c sb using @c mode|out, and passes @c &sb to the base * class initializer. Does not allocate any buffer. * - * @if maint * That's a lie. We initialize the base class with NULL, because the * string class does its own memory management. - * @endif */ explicit basic_ostringstream(ios_base::openmode __mode = ios_base::out) @@ -423,10 +413,8 @@ _GLIBCXX_BEGIN_NAMESPACE(std) * Initializes @c sb using @a str and @c mode|out, and passes @c &sb * to the base class initializer. * - * @if maint * That's a lie. We initialize the base class with NULL, because the * string class does its own memory management. - * @endif */ explicit basic_ostringstream(const __string_type& __str, @@ -514,10 +502,8 @@ _GLIBCXX_BEGIN_NAMESPACE(std) * Initializes @c sb using @c mode, and passes @c &sb to the base * class initializer. Does not allocate any buffer. * - * @if maint * That's a lie. We initialize the base class with NULL, because the * string class does its own memory management. - * @endif */ explicit basic_stringstream(ios_base::openmode __m = ios_base::out | ios_base::in) @@ -532,10 +518,8 @@ _GLIBCXX_BEGIN_NAMESPACE(std) * Initializes @c sb using @a str and @c mode, and passes @c &sb * to the base class initializer. * - * @if maint * That's a lie. We initialize the base class with NULL, because the * string class does its own memory management. - * @endif */ explicit basic_stringstream(const __string_type& __str, diff --git a/libstdc++-v3/include/std/streambuf b/libstdc++-v3/include/std/streambuf index 72e3fe42501..0c4d192f7a4 100644 --- a/libstdc++-v3/include/std/streambuf +++ b/libstdc++-v3/include/std/streambuf @@ -1,7 +1,7 @@ // Stream buffer classes -*- C++ -*- // Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, -// 2006, 2007 Free Software Foundation, Inc. +// 2006, 2007, 2008 Free Software Foundation, Inc. // // This file is part of the GNU ISO C++ Library. This library is free // software; you can redistribute it and/or modify it under the @@ -50,11 +50,6 @@ _GLIBCXX_BEGIN_NAMESPACE(std) - /** - * @if maint - * Does stuff. - * @endif - */ template streamsize __copy_streambufs_eof(basic_streambuf<_CharT, _Traits>*, @@ -138,11 +133,7 @@ _GLIBCXX_BEGIN_NAMESPACE(std) //@} //@{ - /** - * @if maint - * This is a non-standard type. - * @endif - */ + /// This is a non-standard type. typedef basic_streambuf __streambuf_type; //@} @@ -184,13 +175,11 @@ _GLIBCXX_BEGIN_NAMESPACE(std) protected: //@{ /** - * @if maint * This is based on _IO_FILE, just reordered to be more consistent, * and is intended to be the most minimal abstraction for an * internal buffer. * - get == input == read * - put == output == write - * @endif */ char_type* _M_in_beg; // Start of get area. char_type* _M_in_cur; // Current read area. @@ -199,11 +188,7 @@ _GLIBCXX_BEGIN_NAMESPACE(std) char_type* _M_out_cur; // Current put area. char_type* _M_out_end; // End of put area. - /** - * @if maint - * Current locale setting. - * @endif - */ + /// Current locale setting. locale _M_buf_locale; public: diff --git a/libstdc++-v3/include/std/tuple b/libstdc++-v3/include/std/tuple index 61302f1da35..d64c141878d 100644 --- a/libstdc++-v3/include/std/tuple +++ b/libstdc++-v3/include/std/tuple @@ -1,6 +1,6 @@ // -*- C++ -*- -// Copyright (C) 2007 Free Software Foundation, Inc. +// Copyright (C) 2007, 2008 Free Software Foundation, Inc. // // This file is part of the GNU ISO C++ Library. This library is free // software; you can redistribute it and/or modify it under the @@ -101,33 +101,27 @@ namespace std }; /** - * @if maint * Contains the actual implementation of the @c tuple template, stored * as a recursive inheritance hierarchy from the first element (most * derived class) to the last (least derived class). The @c Idx * parameter gives the 0-based index of the element stored at this * point in the hierarchy; we use it to implement a constant-time * get() operation. - * @endif */ template struct _Tuple_impl; /** - * @if maint * Zero-element tuple implementation. This is the basis case for the * inheritance recursion. - * @endif maint */ template struct _Tuple_impl<_Idx> { }; /** - * @if maint * Recursive tuple implementation. Here we store the @c Head element * and derive from a @c Tuple_impl containing the remaining elements * (which contains the @c Tail). - * @endif */ template struct _Tuple_impl<_Idx, _Head, _Tail...> @@ -378,19 +372,15 @@ namespace std struct tuple_element; /** - * @if maint * Recursive case for tuple_element: strip off the first element in * the tuple and retrieve the (i-1)th element of the remaining tuple. - * @endif */ template struct tuple_element<__i, tuple<_Head, _Tail...> > : tuple_element<__i - 1, tuple<_Tail...> > { }; /** - * @if maint * Basis case for tuple_element: The first element is the one we're seeking. - * @endif */ template struct tuple_element<0, tuple<_Head, _Tail...> > diff --git a/libstdc++-v3/include/tr1/tuple b/libstdc++-v3/include/tr1/tuple index b342fc3674e..ae6a36cd066 100644 --- a/libstdc++-v3/include/tr1/tuple +++ b/libstdc++-v3/include/tr1/tuple @@ -1,6 +1,6 @@ // class template tuple -*- C++ -*- -// Copyright (C) 2004, 2005, 2006, 2007 Free Software Foundation, Inc. +// Copyright (C) 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. // // This file is part of the GNU ISO C++ Library. This library is free // software; you can redistribute it and/or modify it under the @@ -64,33 +64,27 @@ namespace tr1 { typedef _Tp& type; }; /** - * @if maint * Contains the actual implementation of the @c tuple template, stored * as a recursive inheritance hierarchy from the first element (most * derived class) to the last (least derived class). The @c Idx * parameter gives the 0-based index of the element stored at this * point in the hierarchy; we use it to implement a constant-time * get() operation. - * @endif */ template struct _Tuple_impl; /** - * @if maint * Zero-element tuple implementation. This is the basis case for the * inheritance recursion. - * @endif maint */ template struct _Tuple_impl<_Idx> { }; /** - * @if maint * Recursive tuple implementation. Here we store the @c Head element * and derive from a @c Tuple_impl containing the remaining elements * (which contains the @c Tail). - * @endif */ template struct _Tuple_impl<_Idx, _Head, _Tail...> @@ -232,19 +226,15 @@ namespace tr1 struct tuple_element; /** - * @if maint * Recursive case for tuple_element: strip off the first element in * the tuple and retrieve the (i-1)th element of the remaining tuple. - * @endif */ template struct tuple_element<__i, tuple<_Head, _Tail...> > : tuple_element<__i - 1, tuple<_Tail...> > { }; /** - * @if maint * Basis case for tuple_element: The first element is the one we're seeking. - * @endif */ template struct tuple_element<0, tuple<_Head, _Tail...> > diff --git a/libstdc++-v3/include/tr1_impl/functional b/libstdc++-v3/include/tr1_impl/functional index 3c3e18aa937..2a522edf814 100644 --- a/libstdc++-v3/include/tr1_impl/functional +++ b/libstdc++-v3/include/tr1_impl/functional @@ -1,6 +1,6 @@ // TR1 functional header -*- C++ -*- -// Copyright (C) 2007 Free Software Foundation, Inc. +// Copyright (C) 2007, 2008 Free Software Foundation, Inc. // // This file is part of the GNU ISO C++ Library. This library is free // software; you can redistribute it and/or modify it under the @@ -40,11 +40,9 @@ _GLIBCXX_BEGIN_NAMESPACE_TR1 class _Mem_fn; /** - * @if maint * Actual implementation of _Has_result_type, which uses SFINAE to * determine if the type _Tp has a publicly-accessible member type * result_type. - * @endif */ template class _Has_result_type_helper : __sfinae_types @@ -70,10 +68,9 @@ _GLIBCXX_BEGIN_NAMESPACE_TR1 { }; /** - * @if maint - * If we have found a result_type, extract it. - * @endif + * */ + /// If we have found a result_type, extract it. template struct _Maybe_get_result_type { }; @@ -85,10 +82,8 @@ _GLIBCXX_BEGIN_NAMESPACE_TR1 }; /** - * @if maint * Base class for any function object that has a weak result type, as * defined in 3.3/3 of TR1. - * @endif */ template struct _Weak_result_type_impl @@ -96,77 +91,49 @@ _GLIBCXX_BEGIN_NAMESPACE_TR1 { }; - /** - * @if maint - * Retrieve the result type for a function type. - * @endif - */ + /// Retrieve the result type for a function type. template struct _Weak_result_type_impl<_Res(_ArgTypes...)> { typedef _Res result_type; }; - /** - * @if maint - * Retrieve the result type for a function reference. - * @endif - */ + /// Retrieve the result type for a function reference. template struct _Weak_result_type_impl<_Res(&)(_ArgTypes...)> { typedef _Res result_type; }; - /** - * @if maint - * Retrieve the result type for a function pointer. - * @endif - */ + /// Retrieve the result type for a function pointer. template struct _Weak_result_type_impl<_Res(*)(_ArgTypes...)> { typedef _Res result_type; }; - /** - * @if maint - * Retrieve result type for a member function pointer. - * @endif maint - */ + /// Retrieve result type for a member function pointer. template struct _Weak_result_type_impl<_Res (_Class::*)(_ArgTypes...)> { typedef _Res result_type; }; - /** - * @if maint - * Retrieve result type for a const member function pointer. - * @endif maint - */ + /// Retrieve result type for a const member function pointer. template struct _Weak_result_type_impl<_Res (_Class::*)(_ArgTypes...) const> { typedef _Res result_type; }; - /** - * @if maint - * Retrieve result type for a volatile member function pointer. - * @endif maint - */ + /// Retrieve result type for a volatile member function pointer. template struct _Weak_result_type_impl<_Res (_Class::*)(_ArgTypes...) volatile> { typedef _Res result_type; }; - /** - * @if maint - * Retrieve result type for a const volatile member function pointer. - * @endif maint - */ + /// Retrieve result type for a const volatile member function pointer. template struct _Weak_result_type_impl<_Res (_Class::*)(_ArgTypes...)const volatile> { @@ -174,10 +141,8 @@ _GLIBCXX_BEGIN_NAMESPACE_TR1 }; /** - * @if maint * Strip top-level cv-qualifiers from the function object and let * _Weak_result_type_impl perform the real work. - * @endif */ template struct _Weak_result_type @@ -189,12 +154,10 @@ _GLIBCXX_BEGIN_NAMESPACE_TR1 class result_of; /** - * @if maint * Actual implementation of result_of. When _Has_result_type is * true, gets its result from _Weak_result_type. Otherwise, uses * the function object's member template result to extract the * result type. - * @endif */ template struct _Result_of_impl; @@ -208,10 +171,8 @@ _GLIBCXX_BEGIN_NAMESPACE_TR1 }; /** - * @if maint * Determine whether we can determine a result type from @c Functor * alone. - * @endif */ template class result_of<_Functor(_ArgTypes...)> @@ -221,11 +182,7 @@ _GLIBCXX_BEGIN_NAMESPACE_TR1 { }; - /** - * @if maint - * We already know the result type for @c Functor; use it. - * @endif - */ + /// We already know the result type for @c Functor; use it. template struct _Result_of_impl { @@ -233,10 +190,8 @@ _GLIBCXX_BEGIN_NAMESPACE_TR1 }; /** - * @if maint * We need to compute the result type for this invocation the hard * way. - * @endif */ template struct _Result_of_impl @@ -246,10 +201,8 @@ _GLIBCXX_BEGIN_NAMESPACE_TR1 }; /** - * @if maint * It is unsafe to access ::result when there are zero arguments, so we * return @c void instead. - * @endif */ template struct _Result_of_impl @@ -257,11 +210,7 @@ _GLIBCXX_BEGIN_NAMESPACE_TR1 typedef void type; }; - /** - * @if maint - * Determines if the type _Tp derives from unary_function. - * @endif - */ + /// Determines if the type _Tp derives from unary_function. template struct _Derives_from_unary_function : __sfinae_types { @@ -277,11 +226,7 @@ _GLIBCXX_BEGIN_NAMESPACE_TR1 static const bool value = sizeof(__test((_Tp*)0)) == 1; }; - /** - * @if maint - * Determines if the type _Tp derives from binary_function. - * @endif - */ + /// Determines if the type _Tp derives from binary_function. template struct _Derives_from_binary_function : __sfinae_types { @@ -297,11 +242,7 @@ _GLIBCXX_BEGIN_NAMESPACE_TR1 static const bool value = sizeof(__test((_Tp*)0)) == 1; }; - /** - * @if maint - * Turns a function type into a function pointer type - * @endif - */ + /// Turns a function type into a function pointer type template::value> struct _Function_to_function_pointer { @@ -315,10 +256,8 @@ _GLIBCXX_BEGIN_NAMESPACE_TR1 }; /** - * @if maint * Invoke a function object, which may be either a member pointer or a * function object. The first parameter will tell which. - * @endif */ template inline @@ -360,16 +299,14 @@ _GLIBCXX_BEGIN_NAMESPACE_TR1 } /** - * @if maint * Knowing which of unary_function and binary_function _Tp derives * from, derives from the same and ensures that reference_wrapper * will have a weak result type. See cases below. - * @endif */ template struct _Reference_wrapper_base_impl; - // Not a unary_function or binary_function, so try a weak result type + // Not a unary_function or binary_function, so try a weak result type. template struct _Reference_wrapper_base_impl : _Weak_result_type<_Tp> @@ -390,7 +327,7 @@ _GLIBCXX_BEGIN_NAMESPACE_TR1 typename _Tp::result_type> { }; - // both unary_function and binary_function. import result_type to + // Both unary_function and binary_function. Import result_type to // avoid conflicts. template struct _Reference_wrapper_base_impl @@ -404,12 +341,10 @@ _GLIBCXX_BEGIN_NAMESPACE_TR1 }; /** - * @if maint * Derives from unary_function or binary_function when it * can. Specializations handle all of the easy cases. The primary * template determines what to do with a class type, which may * derive from both unary_function and binary_function. - * @endif */ template struct _Reference_wrapper_base @@ -570,38 +505,24 @@ _GLIBCXX_BEGIN_NAMESPACE_TR1 }; /** - * @if maint * Derives from @c unary_function or @c binary_function, or perhaps * nothing, depending on the number of arguments provided. The * primary template is the basis case, which derives nothing. - * @endif maint */ template struct _Maybe_unary_or_binary_function { }; - /** - * @if maint - * Derives from @c unary_function, as appropriate. - * @endif - */ + /// Derives from @c unary_function, as appropriate. template struct _Maybe_unary_or_binary_function<_Res, _T1> : std::unary_function<_T1, _Res> { }; - /** - * @if maint - * Derives from @c binary_function, as appropriate. - * @endif - */ + /// Derives from @c binary_function, as appropriate. template struct _Maybe_unary_or_binary_function<_Res, _T1, _T2> : std::binary_function<_T1, _T2, _Res> { }; - /** - * @if maint - * Implementation of @c mem_fn for member function pointers. - * @endif - */ + /// Implementation of @c mem_fn for member function pointers. template class _Mem_fn<_Res (_Class::*)(_ArgTypes...)> : public _Maybe_unary_or_binary_function<_Res, _Class*, _ArgTypes...> @@ -644,11 +565,7 @@ _GLIBCXX_BEGIN_NAMESPACE_TR1 _Functor __pmf; }; - /** - * @if maint - * Implementation of @c mem_fn for const member function pointers. - * @endif - */ + /// Implementation of @c mem_fn for const member function pointers. template class _Mem_fn<_Res (_Class::*)(_ArgTypes...) const> : public _Maybe_unary_or_binary_function<_Res, const _Class*, @@ -691,11 +608,7 @@ _GLIBCXX_BEGIN_NAMESPACE_TR1 _Functor __pmf; }; - /** - * @if maint - * Implementation of @c mem_fn for volatile member function pointers. - * @endif - */ + /// Implementation of @c mem_fn for volatile member function pointers. template class _Mem_fn<_Res (_Class::*)(_ArgTypes...) volatile> : public _Maybe_unary_or_binary_function<_Res, volatile _Class*, @@ -739,11 +652,7 @@ _GLIBCXX_BEGIN_NAMESPACE_TR1 _Functor __pmf; }; - /** - * @if maint - * Implementation of @c mem_fn for const volatile member function pointers. - * @endif - */ + /// Implementation of @c mem_fn for const volatile member function pointers. template class _Mem_fn<_Res (_Class::*)(_ArgTypes...) const volatile> : public _Maybe_unary_or_binary_function<_Res, const volatile _Class*, @@ -914,53 +823,51 @@ _GLIBCXX_BEGIN_NAMESPACE_TR1 template const int is_placeholder<_Tp>::value; - /** - * @if maint - * The type of placeholder objects defined by libstdc++. - * @endif - */ + /// The type of placeholder objects defined by libstdc++. template struct _Placeholder { }; // Define a large number of placeholders. There is no way to // simplify this with variadic templates, because we're introducing // unique names for each. - namespace placeholders { namespace { - _Placeholder<1> _1; - _Placeholder<2> _2; - _Placeholder<3> _3; - _Placeholder<4> _4; - _Placeholder<5> _5; - _Placeholder<6> _6; - _Placeholder<7> _7; - _Placeholder<8> _8; - _Placeholder<9> _9; - _Placeholder<10> _10; - _Placeholder<11> _11; - _Placeholder<12> _12; - _Placeholder<13> _13; - _Placeholder<14> _14; - _Placeholder<15> _15; - _Placeholder<16> _16; - _Placeholder<17> _17; - _Placeholder<18> _18; - _Placeholder<19> _19; - _Placeholder<20> _20; - _Placeholder<21> _21; - _Placeholder<22> _22; - _Placeholder<23> _23; - _Placeholder<24> _24; - _Placeholder<25> _25; - _Placeholder<26> _26; - _Placeholder<27> _27; - _Placeholder<28> _28; - _Placeholder<29> _29; - } } + namespace placeholders + { + namespace + { + _Placeholder<1> _1; + _Placeholder<2> _2; + _Placeholder<3> _3; + _Placeholder<4> _4; + _Placeholder<5> _5; + _Placeholder<6> _6; + _Placeholder<7> _7; + _Placeholder<8> _8; + _Placeholder<9> _9; + _Placeholder<10> _10; + _Placeholder<11> _11; + _Placeholder<12> _12; + _Placeholder<13> _13; + _Placeholder<14> _14; + _Placeholder<15> _15; + _Placeholder<16> _16; + _Placeholder<17> _17; + _Placeholder<18> _18; + _Placeholder<19> _19; + _Placeholder<20> _20; + _Placeholder<21> _21; + _Placeholder<22> _22; + _Placeholder<23> _23; + _Placeholder<24> _24; + _Placeholder<25> _25; + _Placeholder<26> _26; + _Placeholder<27> _27; + _Placeholder<28> _28; + _Placeholder<29> _29; + } + } /** - * @if maint * Partial specialization of is_placeholder that provides the placeholder * number for the placeholder objects defined by libstdc++. - * @endif */ template struct is_placeholder<_Placeholder<_Num> > @@ -970,19 +877,13 @@ _GLIBCXX_BEGIN_NAMESPACE_TR1 const int is_placeholder<_Placeholder<_Num> >::value; /** - * @if maint * Stores a tuple of indices. Used by bind() to extract the elements * in a tuple. - * @endif */ template struct _Index_tuple { }; - /** - * @if maint - * Builds an _Index_tuple<0, 1, 2, ..., _Num-1>. - * @endif - */ + /// Builds an _Index_tuple<0, 1, 2, ..., _Num-1>. template > struct _Build_index_tuple; @@ -1000,30 +901,24 @@ _GLIBCXX_BEGIN_NAMESPACE_TR1 }; /** - * @if maint * Used by _Safe_tuple_element to indicate that there is no tuple * element at this position. - * @endif */ struct _No_tuple_element; /** - * @if maint * Implementation helper for _Safe_tuple_element. This primary * template handles the case where it is safe to use @c * tuple_element. - * @endif */ template struct _Safe_tuple_element_impl : tuple_element<__i, _Tuple> { }; /** - * @if maint * Implementation helper for _Safe_tuple_element. This partial * specialization handles the case where it is not safe to use @c * tuple_element. We just return @c _No_tuple_element. - * @endif */ template struct _Safe_tuple_element_impl<__i, _Tuple, false> @@ -1043,7 +938,6 @@ _GLIBCXX_BEGIN_NAMESPACE_TR1 }; /** - * @if maint * Maps an argument to bind() into an actual argument to the bound * function object [TR1 3.6.3/5]. Only the first parameter should * be specified: the rest are used to determine among the various @@ -1053,7 +947,6 @@ _GLIBCXX_BEGIN_NAMESPACE_TR1 * bind expression. The first parameter is the bound argument and * the second parameter is a tuple containing references to the * rest of the arguments. - * @endif */ template::value, @@ -1061,10 +954,8 @@ _GLIBCXX_BEGIN_NAMESPACE_TR1 class _Mu; /** - * @if maint * If the argument is reference_wrapper<_Tp>, returns the * underlying reference. [TR1 3.6.3/5 bullet 1] - * @endif */ template class _Mu, false, false> @@ -1083,11 +974,9 @@ _GLIBCXX_BEGIN_NAMESPACE_TR1 }; /** - * @if maint * If the argument is a bind expression, we invoke the underlying * function object with the same cv-qualifiers as we are given and * pass along all of our arguments (unwrapped). [TR1 3.6.3/5 bullet 2] - * @endif */ template class _Mu<_Arg, true, false> @@ -1126,11 +1015,9 @@ _GLIBCXX_BEGIN_NAMESPACE_TR1 }; /** - * @if maint * If the argument is a placeholder for the Nth argument, returns * a reference to the Nth argument to the bind function object. * [TR1 3.6.3/5 bullet 3] - * @endif */ template class _Mu<_Arg, false, true> @@ -1166,11 +1053,9 @@ _GLIBCXX_BEGIN_NAMESPACE_TR1 }; /** - * @if maint * If the argument is just a value, returns a reference to that * value. The cv-qualifiers on the reference are the same as the * cv-qualifiers on the _Mu object. [TR1 3.6.3/5 bullet 4] - * @endif */ template class _Mu<_Arg, false, false> @@ -1196,11 +1081,9 @@ _GLIBCXX_BEGIN_NAMESPACE_TR1 }; /** - * @if maint * Maps member pointers into instances of _Mem_fn but leaves all * other function objects untouched. Used by tr1::bind(). The * primary template handles the non--member-pointer case. - * @endif */ template struct _Maybe_wrap_member_pointer @@ -1213,11 +1096,9 @@ _GLIBCXX_BEGIN_NAMESPACE_TR1 }; /** - * @if maint * Maps member pointers into instances of _Mem_fn but leaves all * other function objects untouched. Used by tr1::bind(). This * partial specialization handles the member pointer case. - * @endif */ template struct _Maybe_wrap_member_pointer<_Tp _Class::*> @@ -1229,11 +1110,7 @@ _GLIBCXX_BEGIN_NAMESPACE_TR1 { return type(__pm); } }; - /** - * @if maint - * Type of the function object returned from bind(). - * @endif - */ + /// Type of the function object returned from bind(). template struct _Bind; @@ -1351,11 +1228,7 @@ _GLIBCXX_BEGIN_NAMESPACE_TR1 } }; - /** - * @if maint - * Type of the function object returned from bind(). - * @endif - */ + /// Type of the function object returned from bind(). template struct _Bind_result; @@ -1447,11 +1320,7 @@ _GLIBCXX_BEGIN_NAMESPACE_TR1 } }; - /** - * @if maint - * Class template _Bind is always a bind expression. - * @endif - */ + /// Class template _Bind is always a bind expression. template struct is_bind_expression<_Bind<_Signature> > { static const bool value = true; }; @@ -1459,11 +1328,7 @@ _GLIBCXX_BEGIN_NAMESPACE_TR1 template const bool is_bind_expression<_Bind<_Signature> >::value; - /** - * @if maint - * Class template _Bind_result is always a bind expression. - * @endif - */ + /// Class template _Bind_result is always a bind expression. template struct is_bind_expression<_Bind_result<_Result, _Signature> > { static const bool value = true; }; @@ -1504,20 +1369,16 @@ _GLIBCXX_BEGIN_NAMESPACE_TR1 class bad_function_call : public std::exception { }; /** - * @if maint * The integral constant expression 0 can be converted into a * pointer to this type. It is used by the function template to * accept NULL pointers. - * @endif */ struct _M_clear_type; /** - * @if maint * Trait identifying "location-invariant" types, meaning that the * address of the object (or any of its members) will not escape. * Also implies a trivial copy constructor and assignment operator. - * @endif */ template struct __is_location_invariant @@ -1564,8 +1425,8 @@ _GLIBCXX_BEGIN_NAMESPACE_TR1 __destroy_functor }; - /* Simple type wrapper that helps avoid annoying const problems - when casting between void pointers and pointers-to-pointers. */ + // Simple type wrapper that helps avoid annoying const problems + // when casting between void pointers and pointers-to-pointers. template struct _Simple_type_wrapper { @@ -1600,11 +1461,7 @@ _GLIBCXX_BEGIN_NAMESPACE_TR1 template class function; - /** - * @if maint - * Base class of all polymorphic function object wrappers. - * @endif - */ + /// Base class of all polymorphic function object wrappers. class _Function_base { public: @@ -1693,50 +1550,36 @@ _GLIBCXX_BEGIN_NAMESPACE_TR1 static void _M_init_functor(_Any_data& __functor, const _Functor& __f) - { - _M_init_functor(__functor, __f, _Local_storage()); - } + { _M_init_functor(__functor, __f, _Local_storage()); } template static bool _M_not_empty_function(const function<_Signature>& __f) - { - return __f; - } + { return __f; } template static bool _M_not_empty_function(const _Tp*& __fp) - { - return __fp; - } + { return __fp; } template static bool _M_not_empty_function(_Tp _Class::* const& __mp) - { - return __mp; - } + { return __mp; } template static bool _M_not_empty_function(const _Tp&) - { - return true; - } + { return true; } private: static void _M_init_functor(_Any_data& __functor, const _Functor& __f, true_type) - { - new (__functor._M_access()) _Functor(__f); - } + { new (__functor._M_access()) _Functor(__f); } static void _M_init_functor(_Any_data& __functor, const _Functor& __f, false_type) - { - __functor._M_access<_Functor*>() = new _Functor(__f); - } + { __functor._M_access<_Functor*>() = new _Functor(__f); } }; template @@ -1769,7 +1612,7 @@ _GLIBCXX_BEGIN_NAMESPACE_TR1 static void _M_init_functor(_Any_data& __functor, reference_wrapper<_Functor> __f) { - // TBD: Use address_of function instead + // TBD: Use address_of function instead. _Base::_M_init_functor(__functor, &__f.get()); } }; @@ -1913,26 +1756,18 @@ _GLIBCXX_BEGIN_NAMESPACE_TR1 : public _Maybe_unary_or_binary_function<_Res, _ArgTypes...>, private _Function_base { - /** - * @if maint - * This class is used to implement the safe_bool idiom. - * @endif - */ + /// This class is used to implement the safe_bool idiom. struct _Hidden_type { _Hidden_type* _M_bool; }; - /** - * @if maint - * This typedef is used to implement the safe_bool idiom. - * @endif - */ + /// This typedef is used to implement the safe_bool idiom. typedef _Hidden_type* _Hidden_type::* _Safe_bool; typedef _Res _Signature_type(_ArgTypes...); - struct _Useless {}; + struct _Useless { }; public: typedef _Res result_type; @@ -2121,9 +1956,7 @@ _GLIBCXX_BEGIN_NAMESPACE_TR1 */ template _Functor* target(); - /** - * @overload - */ + /// @overload template const _Functor* target() const; private: @@ -2246,19 +2079,13 @@ _GLIBCXX_BEGIN_NAMESPACE_TR1 template inline bool operator==(const function<_Signature>& __f, _M_clear_type*) - { - return !__f; - } + { return !__f; } - /** - * @overload - */ + /// @overload template inline bool operator==(_M_clear_type*, const function<_Signature>& __f) - { - return !__f; - } + { return !__f; } /** * @brief Compares a polymorphic function object wrapper against 0 @@ -2270,19 +2097,13 @@ _GLIBCXX_BEGIN_NAMESPACE_TR1 template inline bool operator!=(const function<_Signature>& __f, _M_clear_type*) - { - return __f; - } + { return __f; } - /** - * @overload - */ + /// @overload template inline bool operator!=(_M_clear_type*, const function<_Signature>& __f) - { - return __f; - } + { return __f; } // [3.7.2.8] specialized algorithms @@ -2294,9 +2115,7 @@ _GLIBCXX_BEGIN_NAMESPACE_TR1 template inline void swap(function<_Signature>& __x, function<_Signature>& __y) - { - __x.swap(__y); - } + { __x.swap(__y); } _GLIBCXX_END_NAMESPACE_TR1 } diff --git a/libstdc++-v3/include/tr1_impl/random b/libstdc++-v3/include/tr1_impl/random index 02ad85af7e3..bd1f788d945 100644 --- a/libstdc++-v3/include/tr1_impl/random +++ b/libstdc++-v3/include/tr1_impl/random @@ -1,6 +1,6 @@ // random number generation -*- C++ -*- -// Copyright (C) 2007 Free Software Foundation, Inc. +// Copyright (C) 2007, 2008 Free Software Foundation, Inc. // // This file is part of the GNU ISO C++ Library. This library is free // software; you can redistribute it and/or modify it under the @@ -647,11 +647,9 @@ _GLIBCXX_BEGIN_NAMESPACE_TR1 * N1688[4.13] says "the template parameter _IntType shall denote an integral * type large enough to store values up to m." * - * @if maint * @var _M_x The state of the generator. This is a ring buffer. * @var _M_carry The carry. * @var _M_p Current index of x(i - r). - * @endif */ template class subtract_with_carry @@ -821,12 +819,10 @@ _GLIBCXX_BEGIN_NAMESPACE_TR1 /** * @brief The Marsaglia-Zaman generator (floats version). * - * @if maint * @var _M_x The state of the generator. This is a ring buffer. * @var _M_carry The carry. * @var _M_p Current index of x(i - r). * @var _M_npows Precomputed negative powers of 2. - * @endif */ template class subtract_with_carry_01 diff --git a/libstdc++-v3/libmath/Makefile.in b/libstdc++-v3/libmath/Makefile.in index f423f83e53e..7c5c8f13c62 100644 --- a/libstdc++-v3/libmath/Makefile.in +++ b/libstdc++-v3/libmath/Makefile.in @@ -1,8 +1,8 @@ -# Makefile.in generated by automake 1.9.6 from Makefile.am. +# Makefile.in generated by automake 1.10 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005 Free Software Foundation, Inc. +# 2003, 2004, 2005, 2006 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. @@ -14,15 +14,11 @@ @SET_MAKE@ -srcdir = @srcdir@ -top_srcdir = @top_srcdir@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ -top_builddir = .. am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd -INSTALL = @INSTALL@ install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c @@ -63,17 +59,18 @@ LTLIBRARIES = $(noinst_LTLIBRARIES) am__DEPENDENCIES_1 = am_libmath_la_OBJECTS = stubs.lo libmath_la_OBJECTS = $(am_libmath_la_OBJECTS) -DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) +DEFAULT_INCLUDES = -I. -I$(top_builddir)@am__isrc@ depcomp = am__depfiles_maybe = COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \ - $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ - $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) -LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ - $(AM_LDFLAGS) $(LDFLAGS) -o $@ +LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ SOURCES = $(libmath_la_SOURCES) DIST_SOURCES = $(libmath_la_SOURCES) ETAGS = etags @@ -125,42 +122,13 @@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ -ENABLE_PARALLEL_FALSE = @ENABLE_PARALLEL_FALSE@ -ENABLE_PARALLEL_TRUE = @ENABLE_PARALLEL_TRUE@ -ENABLE_SYMVERS_DARWIN_FALSE = @ENABLE_SYMVERS_DARWIN_FALSE@ -ENABLE_SYMVERS_DARWIN_TRUE = @ENABLE_SYMVERS_DARWIN_TRUE@ -ENABLE_SYMVERS_FALSE = @ENABLE_SYMVERS_FALSE@ -ENABLE_SYMVERS_GNU_FALSE = @ENABLE_SYMVERS_GNU_FALSE@ -ENABLE_SYMVERS_GNU_NAMESPACE_FALSE = @ENABLE_SYMVERS_GNU_NAMESPACE_FALSE@ -ENABLE_SYMVERS_GNU_NAMESPACE_TRUE = @ENABLE_SYMVERS_GNU_NAMESPACE_TRUE@ -ENABLE_SYMVERS_GNU_TRUE = @ENABLE_SYMVERS_GNU_TRUE@ -ENABLE_SYMVERS_TRUE = @ENABLE_SYMVERS_TRUE@ -ENABLE_VISIBILITY_FALSE = @ENABLE_VISIBILITY_FALSE@ -ENABLE_VISIBILITY_TRUE = @ENABLE_VISIBILITY_TRUE@ ERROR_CONSTANTS_SRCDIR = @ERROR_CONSTANTS_SRCDIR@ EXEEXT = @EXEEXT@ EXTRA_CXX_FLAGS = @EXTRA_CXX_FLAGS@ FGREP = @FGREP@ -GLIBCXX_BUILD_DEBUG_FALSE = @GLIBCXX_BUILD_DEBUG_FALSE@ -GLIBCXX_BUILD_DEBUG_TRUE = @GLIBCXX_BUILD_DEBUG_TRUE@ -GLIBCXX_BUILD_PCH_FALSE = @GLIBCXX_BUILD_PCH_FALSE@ -GLIBCXX_BUILD_PCH_TRUE = @GLIBCXX_BUILD_PCH_TRUE@ -GLIBCXX_C_HEADERS_COMPATIBILITY_FALSE = @GLIBCXX_C_HEADERS_COMPATIBILITY_FALSE@ -GLIBCXX_C_HEADERS_COMPATIBILITY_TRUE = @GLIBCXX_C_HEADERS_COMPATIBILITY_TRUE@ -GLIBCXX_C_HEADERS_C_FALSE = @GLIBCXX_C_HEADERS_C_FALSE@ -GLIBCXX_C_HEADERS_C_GLOBAL_FALSE = @GLIBCXX_C_HEADERS_C_GLOBAL_FALSE@ -GLIBCXX_C_HEADERS_C_GLOBAL_TRUE = @GLIBCXX_C_HEADERS_C_GLOBAL_TRUE@ -GLIBCXX_C_HEADERS_C_STD_FALSE = @GLIBCXX_C_HEADERS_C_STD_FALSE@ -GLIBCXX_C_HEADERS_C_STD_TRUE = @GLIBCXX_C_HEADERS_C_STD_TRUE@ -GLIBCXX_C_HEADERS_C_TRUE = @GLIBCXX_C_HEADERS_C_TRUE@ -GLIBCXX_C_HEADERS_EXTRA_FALSE = @GLIBCXX_C_HEADERS_EXTRA_FALSE@ -GLIBCXX_C_HEADERS_EXTRA_TRUE = @GLIBCXX_C_HEADERS_EXTRA_TRUE@ -GLIBCXX_HOSTED_FALSE = @GLIBCXX_HOSTED_FALSE@ -GLIBCXX_HOSTED_TRUE = @GLIBCXX_HOSTED_TRUE@ GLIBCXX_INCLUDES = @GLIBCXX_INCLUDES@ -GLIBCXX_LDBL_COMPAT_FALSE = @GLIBCXX_LDBL_COMPAT_FALSE@ -GLIBCXX_LDBL_COMPAT_TRUE = @GLIBCXX_LDBL_COMPAT_TRUE@ GREP = @GREP@ +INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ @@ -179,9 +147,8 @@ LN_S = @LN_S@ LTLIBICONV = @LTLIBICONV@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ -MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@ -MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@ MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ NM = @NM@ OBJEXT = @OBJEXT@ OPTIMIZE_CXXFLAGS = @OPTIMIZE_CXXFLAGS@ @@ -207,13 +174,13 @@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ WARN_FLAGS = @WARN_FLAGS@ WERROR = @WERROR@ -ac_ct_AR = @ac_ct_AR@ -ac_ct_AS = @ac_ct_AS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ -ac_ct_RANLIB = @ac_ct_RANLIB@ -ac_ct_STRIP = @ac_ct_STRIP@ am__leading_dot = @am__leading_dot@ am__tar = @am__tar@ am__untar = @am__untar@ @@ -224,8 +191,12 @@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ +builddir = @builddir@ check_msgfmt = @check_msgfmt@ datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ enable_shared = @enable_shared@ enable_static = @enable_static@ exec_prefix = @exec_prefix@ @@ -245,29 +216,36 @@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ +htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ libtool_VERSION = @libtool_VERSION@ +localedir = @localedir@ localstatedir = @localstatedir@ lt_ECHO = @lt_ECHO@ mandir = @mandir@ mkdir_p = @mkdir_p@ multi_basedir = @multi_basedir@ oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ port_specific_symbol_files = @port_specific_symbol_files@ prefix = @prefix@ program_transform_name = @program_transform_name@ +psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ toplevel_srcdir = @toplevel_srcdir@ # May be used by various substitution variables. @@ -321,7 +299,7 @@ clean-noinstLTLIBRARIES: rm -f "$${dir}/so_locations"; \ done libmath.la: $(libmath_la_OBJECTS) $(libmath_la_DEPENDENCIES) - $(LINK) $(libmath_la_LDFLAGS) $(libmath_la_OBJECTS) $(libmath_la_LIBADD) $(LIBS) + $(LINK) $(libmath_la_OBJECTS) $(libmath_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) @@ -344,10 +322,6 @@ mostlyclean-libtool: clean-libtool: -rm -rf .libs _libs -distclean-libtool: - -rm -f libtool -uninstall-info-am: - ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ @@ -397,22 +371,21 @@ distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) - @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ - topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ - list='$(DISTFILES)'; for file in $$list; do \ - case $$file in \ - $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ - $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ - esac; \ + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ - dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ - if test "$$dir" != "$$file" && test "$$dir" != "."; then \ - dir="/$$dir"; \ - $(mkdir_p) "$(distdir)$$dir"; \ - else \ - dir=''; \ - fi; \ if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ @@ -459,7 +432,7 @@ clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ - distclean-libtool distclean-tags + distclean-tags dvi: dvi-am @@ -473,12 +446,20 @@ info-am: install-data-am: +install-dvi: install-dvi-am + install-exec-am: +install-html: install-html-am + install-info: install-info-am install-man: +install-pdf: install-pdf-am + +install-ps: install-ps-am + installcheck-am: maintainer-clean: maintainer-clean-am @@ -498,19 +479,22 @@ ps: ps-am ps-am: -uninstall-am: uninstall-info-am +uninstall-am: + +.MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstLTLIBRARIES ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ - install install-am install-data install-data-am install-exec \ - install-exec-am install-info install-info-am install-man \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ - pdf pdf-am ps ps-am tags uninstall uninstall-am \ - uninstall-info-am + pdf pdf-am ps ps-am tags uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. diff --git a/libstdc++-v3/libsupc++/Makefile.in b/libstdc++-v3/libsupc++/Makefile.in index 7453d3da8f1..586ee381576 100644 --- a/libstdc++-v3/libsupc++/Makefile.in +++ b/libstdc++-v3/libsupc++/Makefile.in @@ -1,8 +1,8 @@ -# Makefile.in generated by automake 1.9.6 from Makefile.am. +# Makefile.in generated by automake 1.10 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005 Free Software Foundation, Inc. +# 2003, 2004, 2005, 2006 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. @@ -15,15 +15,11 @@ @SET_MAKE@ -srcdir = @srcdir@ -top_srcdir = @top_srcdir@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ -top_builddir = .. am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd -INSTALL = @INSTALL@ install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c @@ -115,14 +111,15 @@ am__libsupc__convenience_la_SOURCES_DIST = array_type_info.cc \ am_libsupc__convenience_la_OBJECTS = $(am__objects_1) $(am__objects_2) libsupc__convenience_la_OBJECTS = \ $(am_libsupc__convenience_la_OBJECTS) -DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) +DEFAULT_INCLUDES = -I. -I$(top_builddir)@am__isrc@ depcomp = am__depfiles_maybe = COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) -LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ - $(AM_LDFLAGS) $(LDFLAGS) -o $@ +LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) CXXLD = $(CXX) @@ -180,42 +177,13 @@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ -ENABLE_PARALLEL_FALSE = @ENABLE_PARALLEL_FALSE@ -ENABLE_PARALLEL_TRUE = @ENABLE_PARALLEL_TRUE@ -ENABLE_SYMVERS_DARWIN_FALSE = @ENABLE_SYMVERS_DARWIN_FALSE@ -ENABLE_SYMVERS_DARWIN_TRUE = @ENABLE_SYMVERS_DARWIN_TRUE@ -ENABLE_SYMVERS_FALSE = @ENABLE_SYMVERS_FALSE@ -ENABLE_SYMVERS_GNU_FALSE = @ENABLE_SYMVERS_GNU_FALSE@ -ENABLE_SYMVERS_GNU_NAMESPACE_FALSE = @ENABLE_SYMVERS_GNU_NAMESPACE_FALSE@ -ENABLE_SYMVERS_GNU_NAMESPACE_TRUE = @ENABLE_SYMVERS_GNU_NAMESPACE_TRUE@ -ENABLE_SYMVERS_GNU_TRUE = @ENABLE_SYMVERS_GNU_TRUE@ -ENABLE_SYMVERS_TRUE = @ENABLE_SYMVERS_TRUE@ -ENABLE_VISIBILITY_FALSE = @ENABLE_VISIBILITY_FALSE@ -ENABLE_VISIBILITY_TRUE = @ENABLE_VISIBILITY_TRUE@ ERROR_CONSTANTS_SRCDIR = @ERROR_CONSTANTS_SRCDIR@ EXEEXT = @EXEEXT@ EXTRA_CXX_FLAGS = @EXTRA_CXX_FLAGS@ FGREP = @FGREP@ -GLIBCXX_BUILD_DEBUG_FALSE = @GLIBCXX_BUILD_DEBUG_FALSE@ -GLIBCXX_BUILD_DEBUG_TRUE = @GLIBCXX_BUILD_DEBUG_TRUE@ -GLIBCXX_BUILD_PCH_FALSE = @GLIBCXX_BUILD_PCH_FALSE@ -GLIBCXX_BUILD_PCH_TRUE = @GLIBCXX_BUILD_PCH_TRUE@ -GLIBCXX_C_HEADERS_COMPATIBILITY_FALSE = @GLIBCXX_C_HEADERS_COMPATIBILITY_FALSE@ -GLIBCXX_C_HEADERS_COMPATIBILITY_TRUE = @GLIBCXX_C_HEADERS_COMPATIBILITY_TRUE@ -GLIBCXX_C_HEADERS_C_FALSE = @GLIBCXX_C_HEADERS_C_FALSE@ -GLIBCXX_C_HEADERS_C_GLOBAL_FALSE = @GLIBCXX_C_HEADERS_C_GLOBAL_FALSE@ -GLIBCXX_C_HEADERS_C_GLOBAL_TRUE = @GLIBCXX_C_HEADERS_C_GLOBAL_TRUE@ -GLIBCXX_C_HEADERS_C_STD_FALSE = @GLIBCXX_C_HEADERS_C_STD_FALSE@ -GLIBCXX_C_HEADERS_C_STD_TRUE = @GLIBCXX_C_HEADERS_C_STD_TRUE@ -GLIBCXX_C_HEADERS_C_TRUE = @GLIBCXX_C_HEADERS_C_TRUE@ -GLIBCXX_C_HEADERS_EXTRA_FALSE = @GLIBCXX_C_HEADERS_EXTRA_FALSE@ -GLIBCXX_C_HEADERS_EXTRA_TRUE = @GLIBCXX_C_HEADERS_EXTRA_TRUE@ -GLIBCXX_HOSTED_FALSE = @GLIBCXX_HOSTED_FALSE@ -GLIBCXX_HOSTED_TRUE = @GLIBCXX_HOSTED_TRUE@ GLIBCXX_INCLUDES = @GLIBCXX_INCLUDES@ -GLIBCXX_LDBL_COMPAT_FALSE = @GLIBCXX_LDBL_COMPAT_FALSE@ -GLIBCXX_LDBL_COMPAT_TRUE = @GLIBCXX_LDBL_COMPAT_TRUE@ GREP = @GREP@ +INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ @@ -232,9 +200,8 @@ LN_S = @LN_S@ LTLIBICONV = @LTLIBICONV@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ -MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@ -MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@ MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ NM = @NM@ OBJEXT = @OBJEXT@ OPTIMIZE_CXXFLAGS = @OPTIMIZE_CXXFLAGS@ @@ -260,13 +227,13 @@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ WARN_FLAGS = @WARN_FLAGS@ WERROR = @WERROR@ -ac_ct_AR = @ac_ct_AR@ -ac_ct_AS = @ac_ct_AS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ -ac_ct_RANLIB = @ac_ct_RANLIB@ -ac_ct_STRIP = @ac_ct_STRIP@ am__leading_dot = @am__leading_dot@ am__tar = @am__tar@ am__untar = @am__untar@ @@ -277,8 +244,12 @@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ +builddir = @builddir@ check_msgfmt = @check_msgfmt@ datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ enable_shared = @enable_shared@ enable_static = @enable_static@ exec_prefix = @exec_prefix@ @@ -298,29 +269,36 @@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ +htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ libtool_VERSION = @libtool_VERSION@ +localedir = @localedir@ localstatedir = @localstatedir@ lt_ECHO = @lt_ECHO@ mandir = @mandir@ mkdir_p = @mkdir_p@ multi_basedir = @multi_basedir@ oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ port_specific_symbol_files = @port_specific_symbol_files@ prefix = @prefix@ program_transform_name = @program_transform_name@ +psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ toplevel_srcdir = @toplevel_srcdir@ # May be used by various substitution variables. @@ -517,7 +495,7 @@ clean-noinstLTLIBRARIES: done install-toolexeclibLTLIBRARIES: $(toolexeclib_LTLIBRARIES) @$(NORMAL_INSTALL) - test -z "$(toolexeclibdir)" || $(mkdir_p) "$(DESTDIR)$(toolexeclibdir)" + test -z "$(toolexeclibdir)" || $(MKDIR_P) "$(DESTDIR)$(toolexeclibdir)" @list='$(toolexeclib_LTLIBRARIES)'; for p in $$list; do \ if test -f $$p; then \ f=$(am__strip_dir) \ @@ -528,7 +506,7 @@ install-toolexeclibLTLIBRARIES: $(toolexeclib_LTLIBRARIES) uninstall-toolexeclibLTLIBRARIES: @$(NORMAL_UNINSTALL) - @set -x; list='$(toolexeclib_LTLIBRARIES)'; for p in $$list; do \ + @list='$(toolexeclib_LTLIBRARIES)'; for p in $$list; do \ p=$(am__strip_dir) \ echo " $(LIBTOOL) --mode=uninstall rm -f '$(DESTDIR)$(toolexeclibdir)/$$p'"; \ $(LIBTOOL) --mode=uninstall rm -f "$(DESTDIR)$(toolexeclibdir)/$$p"; \ @@ -543,9 +521,9 @@ clean-toolexeclibLTLIBRARIES: rm -f "$${dir}/so_locations"; \ done libsupc++.la: $(libsupc___la_OBJECTS) $(libsupc___la_DEPENDENCIES) - $(CXXLINK) -rpath $(toolexeclibdir) $(libsupc___la_LDFLAGS) $(libsupc___la_OBJECTS) $(libsupc___la_LIBADD) $(LIBS) + $(CXXLINK) -rpath $(toolexeclibdir) $(libsupc___la_OBJECTS) $(libsupc___la_LIBADD) $(LIBS) libsupc++convenience.la: $(libsupc__convenience_la_OBJECTS) $(libsupc__convenience_la_DEPENDENCIES) - $(CXXLINK) $(libsupc__convenience_la_LDFLAGS) $(libsupc__convenience_la_OBJECTS) $(libsupc__convenience_la_LIBADD) $(LIBS) + $(CXXLINK) $(libsupc__convenience_la_OBJECTS) $(libsupc__convenience_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) @@ -577,10 +555,6 @@ mostlyclean-libtool: clean-libtool: -rm -rf .libs _libs -distclean-libtool: - -rm -f libtool -uninstall-info-am: - ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ @@ -630,23 +604,21 @@ distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) - $(mkdir_p) $(distdir)/.. - @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ - topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ - list='$(DISTFILES)'; for file in $$list; do \ - case $$file in \ - $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ - $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ - esac; \ + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ - dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ - if test "$$dir" != "$$file" && test "$$dir" != "."; then \ - dir="/$$dir"; \ - $(mkdir_p) "$(distdir)$$dir"; \ - else \ - dir=''; \ - fi; \ if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ @@ -662,7 +634,7 @@ check: check-am all-am: Makefile $(LTLIBRARIES) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(toolexeclibdir)" "$(DESTDIR)$(glibcxxinstalldir)"; do \ - test -z "$$dir" || $(mkdir_p) "$$dir"; \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am @@ -696,7 +668,7 @@ clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ - distclean-libtool distclean-tags + distclean-tags dvi: dvi-am @@ -710,12 +682,20 @@ info-am: install-data-am: install-glibcxxinstallHEADERS +install-dvi: install-dvi-am + install-exec-am: install-toolexeclibLTLIBRARIES +install-html: install-html-am + install-info: install-info-am install-man: +install-pdf: install-pdf-am + +install-ps: install-ps-am + installcheck-am: maintainer-clean: maintainer-clean-am @@ -735,22 +715,26 @@ ps: ps-am ps-am: -uninstall-am: uninstall-glibcxxinstallHEADERS uninstall-info-am \ +uninstall-am: uninstall-glibcxxinstallHEADERS \ uninstall-toolexeclibLTLIBRARIES +.MAKE: install-am install-strip + .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstLTLIBRARIES \ clean-toolexeclibLTLIBRARIES ctags distclean distclean-compile \ distclean-generic distclean-libtool distclean-tags distdir dvi \ dvi-am html html-am info info-am install install-am \ - install-data install-data-am install-exec install-exec-am \ - install-glibcxxinstallHEADERS install-info install-info-am \ - install-man install-strip install-toolexeclibLTLIBRARIES \ + install-data install-data-am install-dvi install-dvi-am \ + install-exec install-exec-am install-glibcxxinstallHEADERS \ + install-html install-html-am install-info install-info-am \ + install-man install-pdf install-pdf-am install-ps \ + install-ps-am install-strip install-toolexeclibLTLIBRARIES \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags uninstall uninstall-am uninstall-glibcxxinstallHEADERS \ - uninstall-info-am uninstall-toolexeclibLTLIBRARIES + uninstall-toolexeclibLTLIBRARIES cp-demangle.c: diff --git a/libstdc++-v3/linkage.m4 b/libstdc++-v3/linkage.m4 index 1d289b4aede..62d2c1da140 100644 --- a/libstdc++-v3/linkage.m4 +++ b/libstdc++-v3/linkage.m4 @@ -534,9 +534,6 @@ AC_DEFUN([GLIBCXX_CHECK_COMPLEX_MATH_SUPPORT], [ # be used in projects which are not available under the GNU Public License # but which still want to provide support for the GNU gettext functionality. # Please note that the actual code is *not* freely available. -# -# serial 1 -# dnl AC_REPLACE_MATHFUNCS(FUNCTION...) AC_DEFUN([AC_REPLACE_MATHFUNCS], [AC_CHECK_FUNCS([$1], , [LIBMATHOBJS="$LIBMATHOBJS ${ac_func}.lo"])]) diff --git a/libstdc++-v3/po/Makefile.in b/libstdc++-v3/po/Makefile.in index e6a32044d1f..30e4472ac90 100644 --- a/libstdc++-v3/po/Makefile.in +++ b/libstdc++-v3/po/Makefile.in @@ -1,8 +1,8 @@ -# Makefile.in generated by automake 1.9.6 from Makefile.am. +# Makefile.in generated by automake 1.10 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005 Free Software Foundation, Inc. +# 2003, 2004, 2005, 2006 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. @@ -13,15 +13,11 @@ # PARTICULAR PURPOSE. @SET_MAKE@ -srcdir = @srcdir@ -top_srcdir = @top_srcdir@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ -top_builddir = .. am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd -INSTALL = @INSTALL@ install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c @@ -110,42 +106,13 @@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ -ENABLE_PARALLEL_FALSE = @ENABLE_PARALLEL_FALSE@ -ENABLE_PARALLEL_TRUE = @ENABLE_PARALLEL_TRUE@ -ENABLE_SYMVERS_DARWIN_FALSE = @ENABLE_SYMVERS_DARWIN_FALSE@ -ENABLE_SYMVERS_DARWIN_TRUE = @ENABLE_SYMVERS_DARWIN_TRUE@ -ENABLE_SYMVERS_FALSE = @ENABLE_SYMVERS_FALSE@ -ENABLE_SYMVERS_GNU_FALSE = @ENABLE_SYMVERS_GNU_FALSE@ -ENABLE_SYMVERS_GNU_NAMESPACE_FALSE = @ENABLE_SYMVERS_GNU_NAMESPACE_FALSE@ -ENABLE_SYMVERS_GNU_NAMESPACE_TRUE = @ENABLE_SYMVERS_GNU_NAMESPACE_TRUE@ -ENABLE_SYMVERS_GNU_TRUE = @ENABLE_SYMVERS_GNU_TRUE@ -ENABLE_SYMVERS_TRUE = @ENABLE_SYMVERS_TRUE@ -ENABLE_VISIBILITY_FALSE = @ENABLE_VISIBILITY_FALSE@ -ENABLE_VISIBILITY_TRUE = @ENABLE_VISIBILITY_TRUE@ ERROR_CONSTANTS_SRCDIR = @ERROR_CONSTANTS_SRCDIR@ EXEEXT = @EXEEXT@ EXTRA_CXX_FLAGS = @EXTRA_CXX_FLAGS@ FGREP = @FGREP@ -GLIBCXX_BUILD_DEBUG_FALSE = @GLIBCXX_BUILD_DEBUG_FALSE@ -GLIBCXX_BUILD_DEBUG_TRUE = @GLIBCXX_BUILD_DEBUG_TRUE@ -GLIBCXX_BUILD_PCH_FALSE = @GLIBCXX_BUILD_PCH_FALSE@ -GLIBCXX_BUILD_PCH_TRUE = @GLIBCXX_BUILD_PCH_TRUE@ -GLIBCXX_C_HEADERS_COMPATIBILITY_FALSE = @GLIBCXX_C_HEADERS_COMPATIBILITY_FALSE@ -GLIBCXX_C_HEADERS_COMPATIBILITY_TRUE = @GLIBCXX_C_HEADERS_COMPATIBILITY_TRUE@ -GLIBCXX_C_HEADERS_C_FALSE = @GLIBCXX_C_HEADERS_C_FALSE@ -GLIBCXX_C_HEADERS_C_GLOBAL_FALSE = @GLIBCXX_C_HEADERS_C_GLOBAL_FALSE@ -GLIBCXX_C_HEADERS_C_GLOBAL_TRUE = @GLIBCXX_C_HEADERS_C_GLOBAL_TRUE@ -GLIBCXX_C_HEADERS_C_STD_FALSE = @GLIBCXX_C_HEADERS_C_STD_FALSE@ -GLIBCXX_C_HEADERS_C_STD_TRUE = @GLIBCXX_C_HEADERS_C_STD_TRUE@ -GLIBCXX_C_HEADERS_C_TRUE = @GLIBCXX_C_HEADERS_C_TRUE@ -GLIBCXX_C_HEADERS_EXTRA_FALSE = @GLIBCXX_C_HEADERS_EXTRA_FALSE@ -GLIBCXX_C_HEADERS_EXTRA_TRUE = @GLIBCXX_C_HEADERS_EXTRA_TRUE@ -GLIBCXX_HOSTED_FALSE = @GLIBCXX_HOSTED_FALSE@ -GLIBCXX_HOSTED_TRUE = @GLIBCXX_HOSTED_TRUE@ GLIBCXX_INCLUDES = @GLIBCXX_INCLUDES@ -GLIBCXX_LDBL_COMPAT_FALSE = @GLIBCXX_LDBL_COMPAT_FALSE@ -GLIBCXX_LDBL_COMPAT_TRUE = @GLIBCXX_LDBL_COMPAT_TRUE@ GREP = @GREP@ +INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ @@ -162,9 +129,8 @@ LN_S = @LN_S@ LTLIBICONV = @LTLIBICONV@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ -MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@ -MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@ MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ NM = @NM@ OBJEXT = @OBJEXT@ OPTIMIZE_CXXFLAGS = @OPTIMIZE_CXXFLAGS@ @@ -190,13 +156,13 @@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ WARN_FLAGS = @WARN_FLAGS@ WERROR = @WERROR@ -ac_ct_AR = @ac_ct_AR@ -ac_ct_AS = @ac_ct_AS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ -ac_ct_RANLIB = @ac_ct_RANLIB@ -ac_ct_STRIP = @ac_ct_STRIP@ am__leading_dot = @am__leading_dot@ am__tar = @am__tar@ am__untar = @am__untar@ @@ -207,8 +173,12 @@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ +builddir = @builddir@ check_msgfmt = @check_msgfmt@ datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ enable_shared = @enable_shared@ enable_static = @enable_static@ exec_prefix = @exec_prefix@ @@ -228,29 +198,36 @@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ +htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ libtool_VERSION = @libtool_VERSION@ +localedir = @localedir@ localstatedir = @localstatedir@ lt_ECHO = @lt_ECHO@ mandir = @mandir@ mkdir_p = @mkdir_p@ multi_basedir = @multi_basedir@ oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ port_specific_symbol_files = @port_specific_symbol_files@ prefix = @prefix@ program_transform_name = @program_transform_name@ +psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ toplevel_srcdir = @toplevel_srcdir@ # May be used by various substitution variables. @@ -328,10 +305,6 @@ mostlyclean-libtool: clean-libtool: -rm -rf .libs _libs - -distclean-libtool: - -rm -f libtool -uninstall-info-am: tags: TAGS TAGS: @@ -340,23 +313,21 @@ CTAGS: distdir: $(DISTFILES) - $(mkdir_p) $(distdir)/.. - @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ - topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ - list='$(DISTFILES)'; for file in $$list; do \ - case $$file in \ - $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ - $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ - esac; \ + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ - dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ - if test "$$dir" != "$$file" && test "$$dir" != "."; then \ - dir="/$$dir"; \ - $(mkdir_p) "$(distdir)$$dir"; \ - else \ - dir=''; \ - fi; \ if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ @@ -402,7 +373,7 @@ clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -f Makefile -distclean-am: clean-am distclean-generic distclean-libtool +distclean-am: clean-am distclean-generic dvi: dvi-am @@ -416,12 +387,20 @@ info-am: install-data-am: install-data-local +install-dvi: install-dvi-am + install-exec-am: +install-html: install-html-am + install-info: install-info-am install-man: +install-pdf: install-pdf-am + +install-ps: install-ps-am + installcheck-am: maintainer-clean: maintainer-clean-am @@ -440,17 +419,21 @@ ps: ps-am ps-am: -uninstall-am: uninstall-info-am +uninstall-am: + +.MAKE: install-am install-strip .PHONY: all all-am all-local check check-am clean clean-generic \ clean-libtool distclean distclean-generic distclean-libtool \ distdir dvi dvi-am html html-am info info-am install \ install-am install-data install-data-am install-data-local \ - install-exec install-exec-am install-info install-info-am \ - install-man install-strip installcheck installcheck-am \ + install-dvi install-dvi-am install-exec install-exec-am \ + install-html install-html-am install-info install-info-am \ + install-man install-pdf install-pdf-am install-ps \ + install-ps-am install-strip installcheck installcheck-am \ installdirs maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \ - ps ps-am uninstall uninstall-am uninstall-info-am + ps ps-am uninstall uninstall-am .po.mo: diff --git a/libstdc++-v3/scripts/make_graphs.py b/libstdc++-v3/scripts/make_graphs.py index 0b5daf24360..e230e7a9983 100755 --- a/libstdc++-v3/scripts/make_graphs.py +++ b/libstdc++-v3/scripts/make_graphs.py @@ -70,7 +70,7 @@ def make_png_str(label, test_name, build): return ret def process_html(html_f_name, src_dir, build_dir, htmls_xml_f_name, tests_info_xml_f_name, build_name, compiler_name): - doc_dir = src_dir + "/docs/html/ext/pb_ds" + doc_dir = src_dir + "/doc/html/ext/pb_ds" res_dir = build_dir html_f = open(doc_dir + '/' + html_f_name) soup = BeautifulSoup(html_f.read()) @@ -146,7 +146,7 @@ if __name__ == "__main__": tests_info_xml_f_name = sys.argv[4] build_name = sys.argv[5] compiler_name = sys.argv[6] - doc_dir = src_dir + "/docs/html/ext/pb_ds" + doc_dir = src_dir + "/doc/html/ext/pb_ds" htmls_dat = minidom.parse(htmls_xml_f_name) for html in htmls_dat.getElementsByTagName('html'): html_f_name = html.attributes['name'].value diff --git a/libstdc++-v3/src/Makefile.in b/libstdc++-v3/src/Makefile.in index acab043c071..3c4f74054ac 100644 --- a/libstdc++-v3/src/Makefile.in +++ b/libstdc++-v3/src/Makefile.in @@ -1,8 +1,8 @@ -# Makefile.in generated by automake 1.9.6 from Makefile.am. +# Makefile.in generated by automake 1.10 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005 Free Software Foundation, Inc. +# 2003, 2004, 2005, 2006 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. @@ -14,15 +14,11 @@ @SET_MAKE@ -srcdir = @srcdir@ -top_srcdir = @top_srcdir@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ -top_builddir = .. am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd -INSTALL = @INSTALL@ install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c @@ -107,7 +103,10 @@ am__objects_5 = bitmap_allocator.lo pool_allocator.lo mt_allocator.lo \ $(am__objects_4) am_libstdc___la_OBJECTS = $(am__objects_5) libstdc___la_OBJECTS = $(am_libstdc___la_OBJECTS) -DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) +libstdc___la_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ + $(CXXFLAGS) $(libstdc___la_LDFLAGS) $(LDFLAGS) -o $@ +DEFAULT_INCLUDES = -I. -I$(top_builddir)@am__isrc@ depcomp = am__depfiles_maybe = CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ @@ -164,42 +163,13 @@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ -ENABLE_PARALLEL_FALSE = @ENABLE_PARALLEL_FALSE@ -ENABLE_PARALLEL_TRUE = @ENABLE_PARALLEL_TRUE@ -ENABLE_SYMVERS_DARWIN_FALSE = @ENABLE_SYMVERS_DARWIN_FALSE@ -ENABLE_SYMVERS_DARWIN_TRUE = @ENABLE_SYMVERS_DARWIN_TRUE@ -ENABLE_SYMVERS_FALSE = @ENABLE_SYMVERS_FALSE@ -ENABLE_SYMVERS_GNU_FALSE = @ENABLE_SYMVERS_GNU_FALSE@ -ENABLE_SYMVERS_GNU_NAMESPACE_FALSE = @ENABLE_SYMVERS_GNU_NAMESPACE_FALSE@ -ENABLE_SYMVERS_GNU_NAMESPACE_TRUE = @ENABLE_SYMVERS_GNU_NAMESPACE_TRUE@ -ENABLE_SYMVERS_GNU_TRUE = @ENABLE_SYMVERS_GNU_TRUE@ -ENABLE_SYMVERS_TRUE = @ENABLE_SYMVERS_TRUE@ -ENABLE_VISIBILITY_FALSE = @ENABLE_VISIBILITY_FALSE@ -ENABLE_VISIBILITY_TRUE = @ENABLE_VISIBILITY_TRUE@ ERROR_CONSTANTS_SRCDIR = @ERROR_CONSTANTS_SRCDIR@ EXEEXT = @EXEEXT@ EXTRA_CXX_FLAGS = @EXTRA_CXX_FLAGS@ FGREP = @FGREP@ -GLIBCXX_BUILD_DEBUG_FALSE = @GLIBCXX_BUILD_DEBUG_FALSE@ -GLIBCXX_BUILD_DEBUG_TRUE = @GLIBCXX_BUILD_DEBUG_TRUE@ -GLIBCXX_BUILD_PCH_FALSE = @GLIBCXX_BUILD_PCH_FALSE@ -GLIBCXX_BUILD_PCH_TRUE = @GLIBCXX_BUILD_PCH_TRUE@ -GLIBCXX_C_HEADERS_COMPATIBILITY_FALSE = @GLIBCXX_C_HEADERS_COMPATIBILITY_FALSE@ -GLIBCXX_C_HEADERS_COMPATIBILITY_TRUE = @GLIBCXX_C_HEADERS_COMPATIBILITY_TRUE@ -GLIBCXX_C_HEADERS_C_FALSE = @GLIBCXX_C_HEADERS_C_FALSE@ -GLIBCXX_C_HEADERS_C_GLOBAL_FALSE = @GLIBCXX_C_HEADERS_C_GLOBAL_FALSE@ -GLIBCXX_C_HEADERS_C_GLOBAL_TRUE = @GLIBCXX_C_HEADERS_C_GLOBAL_TRUE@ -GLIBCXX_C_HEADERS_C_STD_FALSE = @GLIBCXX_C_HEADERS_C_STD_FALSE@ -GLIBCXX_C_HEADERS_C_STD_TRUE = @GLIBCXX_C_HEADERS_C_STD_TRUE@ -GLIBCXX_C_HEADERS_C_TRUE = @GLIBCXX_C_HEADERS_C_TRUE@ -GLIBCXX_C_HEADERS_EXTRA_FALSE = @GLIBCXX_C_HEADERS_EXTRA_FALSE@ -GLIBCXX_C_HEADERS_EXTRA_TRUE = @GLIBCXX_C_HEADERS_EXTRA_TRUE@ -GLIBCXX_HOSTED_FALSE = @GLIBCXX_HOSTED_FALSE@ -GLIBCXX_HOSTED_TRUE = @GLIBCXX_HOSTED_TRUE@ GLIBCXX_INCLUDES = @GLIBCXX_INCLUDES@ -GLIBCXX_LDBL_COMPAT_FALSE = @GLIBCXX_LDBL_COMPAT_FALSE@ -GLIBCXX_LDBL_COMPAT_TRUE = @GLIBCXX_LDBL_COMPAT_TRUE@ GREP = @GREP@ +INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ @@ -216,9 +186,8 @@ LN_S = @LN_S@ LTLIBICONV = @LTLIBICONV@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ -MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@ -MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@ MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ NM = @NM@ OBJEXT = @OBJEXT@ OPTIMIZE_CXXFLAGS = @OPTIMIZE_CXXFLAGS@ @@ -244,13 +213,13 @@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ WARN_FLAGS = @WARN_FLAGS@ WERROR = @WERROR@ -ac_ct_AR = @ac_ct_AR@ -ac_ct_AS = @ac_ct_AS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ -ac_ct_RANLIB = @ac_ct_RANLIB@ -ac_ct_STRIP = @ac_ct_STRIP@ am__leading_dot = @am__leading_dot@ am__tar = @am__tar@ am__untar = @am__untar@ @@ -261,8 +230,12 @@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ +builddir = @builddir@ check_msgfmt = @check_msgfmt@ datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ enable_shared = @enable_shared@ enable_static = @enable_static@ exec_prefix = @exec_prefix@ @@ -282,29 +255,36 @@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ +htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ libtool_VERSION = @libtool_VERSION@ +localedir = @localedir@ localstatedir = @localstatedir@ lt_ECHO = @lt_ECHO@ mandir = @mandir@ mkdir_p = @mkdir_p@ multi_basedir = @multi_basedir@ oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ port_specific_symbol_files = @port_specific_symbol_files@ prefix = @prefix@ program_transform_name = @program_transform_name@ +psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ toplevel_srcdir = @toplevel_srcdir@ # May be used by various substitution variables. @@ -509,7 +489,7 @@ $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh install-toolexeclibLTLIBRARIES: $(toolexeclib_LTLIBRARIES) @$(NORMAL_INSTALL) - test -z "$(toolexeclibdir)" || $(mkdir_p) "$(DESTDIR)$(toolexeclibdir)" + test -z "$(toolexeclibdir)" || $(MKDIR_P) "$(DESTDIR)$(toolexeclibdir)" @list='$(toolexeclib_LTLIBRARIES)'; for p in $$list; do \ if test -f $$p; then \ f=$(am__strip_dir) \ @@ -520,7 +500,7 @@ install-toolexeclibLTLIBRARIES: $(toolexeclib_LTLIBRARIES) uninstall-toolexeclibLTLIBRARIES: @$(NORMAL_UNINSTALL) - @set -x; list='$(toolexeclib_LTLIBRARIES)'; for p in $$list; do \ + @list='$(toolexeclib_LTLIBRARIES)'; for p in $$list; do \ p=$(am__strip_dir) \ echo " $(LIBTOOL) --mode=uninstall rm -f '$(DESTDIR)$(toolexeclibdir)/$$p'"; \ $(LIBTOOL) --mode=uninstall rm -f "$(DESTDIR)$(toolexeclibdir)/$$p"; \ @@ -535,7 +515,7 @@ clean-toolexeclibLTLIBRARIES: rm -f "$${dir}/so_locations"; \ done libstdc++.la: $(libstdc___la_OBJECTS) $(libstdc___la_DEPENDENCIES) - $(CXXLINK) -rpath $(toolexeclibdir) $(libstdc___la_LDFLAGS) $(libstdc___la_OBJECTS) $(libstdc___la_LIBADD) $(LIBS) + $(libstdc___la_LINK) -rpath $(toolexeclibdir) $(libstdc___la_OBJECTS) $(libstdc___la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) @@ -558,10 +538,6 @@ mostlyclean-libtool: clean-libtool: -rm -rf .libs _libs -distclean-libtool: - -rm -f libtool -uninstall-info-am: - ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ @@ -611,23 +587,21 @@ distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) - $(mkdir_p) $(distdir)/.. - @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ - topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ - list='$(DISTFILES)'; for file in $$list; do \ - case $$file in \ - $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ - $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ - esac; \ + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ - dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ - if test "$$dir" != "$$file" && test "$$dir" != "."; then \ - dir="/$$dir"; \ - $(mkdir_p) "$(distdir)$$dir"; \ - else \ - dir=''; \ - fi; \ if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ @@ -643,7 +617,7 @@ check: check-am all-am: Makefile $(LTLIBRARIES) all-local installdirs: for dir in "$(DESTDIR)$(toolexeclibdir)"; do \ - test -z "$$dir" || $(mkdir_p) "$$dir"; \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am @@ -677,7 +651,7 @@ clean-am: clean-generic clean-libtool clean-toolexeclibLTLIBRARIES \ distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ - distclean-libtool distclean-tags + distclean-tags dvi: dvi-am @@ -691,12 +665,20 @@ info-am: install-data-am: install-data-local +install-dvi: install-dvi-am + install-exec-am: install-toolexeclibLTLIBRARIES +install-html: install-html-am + install-info: install-info-am install-man: +install-pdf: install-pdf-am + +install-ps: install-ps-am + installcheck-am: maintainer-clean: maintainer-clean-am @@ -716,21 +698,24 @@ ps: ps-am ps-am: -uninstall-am: uninstall-info-am uninstall-toolexeclibLTLIBRARIES +uninstall-am: uninstall-toolexeclibLTLIBRARIES + +.MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am all-local check check-am clean \ clean-generic clean-libtool clean-toolexeclibLTLIBRARIES ctags \ distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ - install-data-am install-data-local install-exec \ - install-exec-am install-info install-info-am install-man \ - install-strip install-toolexeclibLTLIBRARIES installcheck \ - installcheck-am installdirs maintainer-clean \ - maintainer-clean-generic mostlyclean mostlyclean-compile \ - mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ - tags uninstall uninstall-am uninstall-info-am \ - uninstall-toolexeclibLTLIBRARIES + install-data-am install-data-local install-dvi install-dvi-am \ + install-exec install-exec-am install-html install-html-am \ + install-info install-info-am install-man install-pdf \ + install-pdf-am install-ps install-ps-am install-strip \ + install-toolexeclibLTLIBRARIES installcheck installcheck-am \ + installdirs maintainer-clean maintainer-clean-generic \ + mostlyclean mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool pdf pdf-am ps ps-am tags uninstall \ + uninstall-am uninstall-toolexeclibLTLIBRARIES # Symbol versioning for shared libraries. diff --git a/libstdc++-v3/testsuite/20_util/auto_ptr/assign_neg.cc b/libstdc++-v3/testsuite/20_util/auto_ptr/assign_neg.cc index ffca8986fad..04a17068dfd 100644 --- a/libstdc++-v3/testsuite/20_util/auto_ptr/assign_neg.cc +++ b/libstdc++-v3/testsuite/20_util/auto_ptr/assign_neg.cc @@ -1,6 +1,7 @@ // { dg-do compile } -// Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007 Free Software Foundation +// Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008 Free +// Software Foundation // // This file is part of the GNU ISO C++ Library. This library is free // software; you can redistribute it and/or modify it under the @@ -46,5 +47,5 @@ main() test01(); return 0; } -// { dg-error "candidates" "" { target *-*-* } 141 } -// { dg-error "::auto_ptr" "" { target *-*-* } 271 } +// { dg-error "candidates" "" { target *-*-* } 139 } +// { dg-error "::auto_ptr" "" { target *-*-* } 267 } diff --git a/libstdc++-v3/testsuite/23_containers/deque/requirements/dr438/assign_neg.cc b/libstdc++-v3/testsuite/23_containers/deque/requirements/dr438/assign_neg.cc index 16aab4f6208..3d40c00596b 100644 --- a/libstdc++-v3/testsuite/23_containers/deque/requirements/dr438/assign_neg.cc +++ b/libstdc++-v3/testsuite/23_containers/deque/requirements/dr438/assign_neg.cc @@ -19,7 +19,7 @@ // USA. // { dg-do compile } -// { dg-error "no matching" "" { target *-*-* } 1465 } +// { dg-error "no matching" "" { target *-*-* } 1449 } // { dg-excess-errors "" } #include diff --git a/libstdc++-v3/testsuite/23_containers/deque/requirements/dr438/constructor_1_neg.cc b/libstdc++-v3/testsuite/23_containers/deque/requirements/dr438/constructor_1_neg.cc index 1c50b516328..fb4c40ef8cc 100644 --- a/libstdc++-v3/testsuite/23_containers/deque/requirements/dr438/constructor_1_neg.cc +++ b/libstdc++-v3/testsuite/23_containers/deque/requirements/dr438/constructor_1_neg.cc @@ -1,6 +1,6 @@ // 2007-04-27 Paolo Carlini -// Copyright (C) 2007 Free Software Foundation +// Copyright (C) 2007, 2008 Free Software Foundation // // This file is part of the GNU ISO C++ Library. This library is free // software; you can redistribute it and/or modify it under the @@ -19,7 +19,7 @@ // USA. // { dg-do compile } -// { dg-error "no matching" "" { target *-*-* } 1400 } +// { dg-error "no matching" "" { target *-*-* } 1388 } // { dg-excess-errors "" } #include diff --git a/libstdc++-v3/testsuite/23_containers/deque/requirements/dr438/constructor_2_neg.cc b/libstdc++-v3/testsuite/23_containers/deque/requirements/dr438/constructor_2_neg.cc index 73ccf65c4e7..1f24c98278f 100644 --- a/libstdc++-v3/testsuite/23_containers/deque/requirements/dr438/constructor_2_neg.cc +++ b/libstdc++-v3/testsuite/23_containers/deque/requirements/dr438/constructor_2_neg.cc @@ -1,6 +1,6 @@ // 2007-04-27 Paolo Carlini -// Copyright (C) 2007 Free Software Foundation +// Copyright (C) 2007, 2008 Free Software Foundation // // This file is part of the GNU ISO C++ Library. This library is free // software; you can redistribute it and/or modify it under the @@ -19,7 +19,7 @@ // USA. // { dg-do compile } -// { dg-error "no matching" "" { target *-*-* } 1400 } +// { dg-error "no matching" "" { target *-*-* } 1388 } // { dg-excess-errors "" } #include diff --git a/libstdc++-v3/testsuite/23_containers/deque/requirements/dr438/insert_neg.cc b/libstdc++-v3/testsuite/23_containers/deque/requirements/dr438/insert_neg.cc index c376354debf..522022a856d 100644 --- a/libstdc++-v3/testsuite/23_containers/deque/requirements/dr438/insert_neg.cc +++ b/libstdc++-v3/testsuite/23_containers/deque/requirements/dr438/insert_neg.cc @@ -1,6 +1,6 @@ // 2007-04-27 Paolo Carlini -// Copyright (C) 2007 Free Software Foundation +// Copyright (C) 2007, 2008 Free Software Foundation // // This file is part of the GNU ISO C++ Library. This library is free // software; you can redistribute it and/or modify it under the @@ -19,7 +19,7 @@ // USA. // { dg-do compile } -// { dg-error "no matching" "" { target *-*-* } 1553 } +// { dg-error "no matching" "" { target *-*-* } 1533 } // { dg-excess-errors "" } #include diff --git a/libstdc++-v3/testsuite/23_containers/list/requirements/dr438/assign_neg.cc b/libstdc++-v3/testsuite/23_containers/list/requirements/dr438/assign_neg.cc index 071ddf3ed61..1478f3de947 100644 --- a/libstdc++-v3/testsuite/23_containers/list/requirements/dr438/assign_neg.cc +++ b/libstdc++-v3/testsuite/23_containers/list/requirements/dr438/assign_neg.cc @@ -1,6 +1,6 @@ // 2007-04-27 Paolo Carlini -// Copyright (C) 2007 Free Software Foundation +// Copyright (C) 2007, 2008 Free Software Foundation // // This file is part of the GNU ISO C++ Library. This library is free // software; you can redistribute it and/or modify it under the @@ -19,7 +19,7 @@ // USA. // { dg-do compile } -// { dg-error "no matching" "" { target *-*-* } 1327 } +// { dg-error "no matching" "" { target *-*-* } 1317 } // { dg-excess-errors "" } #include diff --git a/libstdc++-v3/testsuite/23_containers/list/requirements/dr438/constructor_1_neg.cc b/libstdc++-v3/testsuite/23_containers/list/requirements/dr438/constructor_1_neg.cc index 14eb25a6ab5..d5dc3908b7c 100644 --- a/libstdc++-v3/testsuite/23_containers/list/requirements/dr438/constructor_1_neg.cc +++ b/libstdc++-v3/testsuite/23_containers/list/requirements/dr438/constructor_1_neg.cc @@ -1,6 +1,6 @@ // 2007-04-27 Paolo Carlini -// Copyright (C) 2007 Free Software Foundation +// Copyright (C) 2007, 2008 Free Software Foundation // // This file is part of the GNU ISO C++ Library. This library is free // software; you can redistribute it and/or modify it under the @@ -19,7 +19,7 @@ // USA. // { dg-do compile } -// { dg-error "no matching" "" { target *-*-* } 1296 } +// { dg-error "no matching" "" { target *-*-* } 1286 } // { dg-excess-errors "" } #include diff --git a/libstdc++-v3/testsuite/23_containers/list/requirements/dr438/constructor_2_neg.cc b/libstdc++-v3/testsuite/23_containers/list/requirements/dr438/constructor_2_neg.cc index 0cd72fa7afe..10f726b9f73 100644 --- a/libstdc++-v3/testsuite/23_containers/list/requirements/dr438/constructor_2_neg.cc +++ b/libstdc++-v3/testsuite/23_containers/list/requirements/dr438/constructor_2_neg.cc @@ -1,6 +1,6 @@ // 2007-04-27 Paolo Carlini -// Copyright (C) 2007 Free Software Foundation +// Copyright (C) 2007, 2008 Free Software Foundation // // This file is part of the GNU ISO C++ Library. This library is free // software; you can redistribute it and/or modify it under the @@ -19,7 +19,7 @@ // USA. // { dg-do compile } -// { dg-error "no matching" "" { target *-*-* } 1296 } +// { dg-error "no matching" "" { target *-*-* } 1286 } // { dg-excess-errors "" } #include diff --git a/libstdc++-v3/testsuite/23_containers/list/requirements/dr438/insert_neg.cc b/libstdc++-v3/testsuite/23_containers/list/requirements/dr438/insert_neg.cc index 8547c2f5d69..1a97c4b4436 100644 --- a/libstdc++-v3/testsuite/23_containers/list/requirements/dr438/insert_neg.cc +++ b/libstdc++-v3/testsuite/23_containers/list/requirements/dr438/insert_neg.cc @@ -1,6 +1,6 @@ // 2007-04-27 Paolo Carlini -// Copyright (C) 2007 Free Software Foundation +// Copyright (C) 2007, 2008 Free Software Foundation // // This file is part of the GNU ISO C++ Library. This library is free // software; you can redistribute it and/or modify it under the @@ -19,7 +19,7 @@ // USA. // { dg-do compile } -// { dg-error "no matching" "" { target *-*-* } 1296 } +// { dg-error "no matching" "" { target *-*-* } 1286 } // { dg-excess-errors "" } #include diff --git a/libstdc++-v3/testsuite/23_containers/vector/requirements/dr438/assign_neg.cc b/libstdc++-v3/testsuite/23_containers/vector/requirements/dr438/assign_neg.cc index 59625e45291..eb6aa1f0b6b 100644 --- a/libstdc++-v3/testsuite/23_containers/vector/requirements/dr438/assign_neg.cc +++ b/libstdc++-v3/testsuite/23_containers/vector/requirements/dr438/assign_neg.cc @@ -1,6 +1,6 @@ // 2007-04-27 Paolo Carlini -// Copyright (C) 2007 Free Software Foundation +// Copyright (C) 2007, 2008 Free Software Foundation // // This file is part of the GNU ISO C++ Library. This library is free // software; you can redistribute it and/or modify it under the @@ -19,7 +19,7 @@ // USA. // { dg-do compile } -// { dg-error "no matching" "" { target *-*-* } 998 } +// { dg-error "no matching" "" { target *-*-* } 992 } // { dg-excess-errors "" } #include diff --git a/libstdc++-v3/testsuite/23_containers/vector/requirements/dr438/constructor_1_neg.cc b/libstdc++-v3/testsuite/23_containers/vector/requirements/dr438/constructor_1_neg.cc index 06bf7ee680b..6e65a5e8092 100644 --- a/libstdc++-v3/testsuite/23_containers/vector/requirements/dr438/constructor_1_neg.cc +++ b/libstdc++-v3/testsuite/23_containers/vector/requirements/dr438/constructor_1_neg.cc @@ -1,6 +1,6 @@ // 2007-04-27 Paolo Carlini -// Copyright (C) 2007 Free Software Foundation +// Copyright (C) 2007, 2008 Free Software Foundation // // This file is part of the GNU ISO C++ Library. This library is free // software; you can redistribute it and/or modify it under the @@ -19,7 +19,7 @@ // USA. // { dg-do compile } -// { dg-error "no matching" "" { target *-*-* } 938 } +// { dg-error "no matching" "" { target *-*-* } 932 } // { dg-excess-errors "" } #include diff --git a/libstdc++-v3/testsuite/23_containers/vector/requirements/dr438/constructor_2_neg.cc b/libstdc++-v3/testsuite/23_containers/vector/requirements/dr438/constructor_2_neg.cc index f9abb0bcc51..dce05ed2cf9 100644 --- a/libstdc++-v3/testsuite/23_containers/vector/requirements/dr438/constructor_2_neg.cc +++ b/libstdc++-v3/testsuite/23_containers/vector/requirements/dr438/constructor_2_neg.cc @@ -1,6 +1,6 @@ // 2007-04-27 Paolo Carlini -// Copyright (C) 2007 Free Software Foundation +// Copyright (C) 2007, 2008 Free Software Foundation // // This file is part of the GNU ISO C++ Library. This library is free // software; you can redistribute it and/or modify it under the @@ -19,7 +19,7 @@ // USA. // { dg-do compile } -// { dg-error "no matching" "" { target *-*-* } 938 } +// { dg-error "no matching" "" { target *-*-* } 932 } // { dg-excess-errors "" } #include diff --git a/libstdc++-v3/testsuite/23_containers/vector/requirements/dr438/insert_neg.cc b/libstdc++-v3/testsuite/23_containers/vector/requirements/dr438/insert_neg.cc index b0ce2da0eb4..3df2fc8b745 100644 --- a/libstdc++-v3/testsuite/23_containers/vector/requirements/dr438/insert_neg.cc +++ b/libstdc++-v3/testsuite/23_containers/vector/requirements/dr438/insert_neg.cc @@ -19,7 +19,7 @@ // USA. // { dg-do compile } -// { dg-error "no matching" "" { target *-*-* } 1039 } +// { dg-error "no matching" "" { target *-*-* } 1033 } // { dg-excess-errors "" } #include diff --git a/libstdc++-v3/testsuite/27_io/ios_base/cons/assign_neg.cc b/libstdc++-v3/testsuite/27_io/ios_base/cons/assign_neg.cc index ec27d187e7b..5325523a0cc 100644 --- a/libstdc++-v3/testsuite/27_io/ios_base/cons/assign_neg.cc +++ b/libstdc++-v3/testsuite/27_io/ios_base/cons/assign_neg.cc @@ -1,6 +1,7 @@ // { dg-do compile } -// Copyright (C) 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc. +// Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008 Free Software +// Foundation, Inc. // // This file is part of the GNU ISO C++ Library. This library is free // software; you can redistribute it and/or modify it under the @@ -40,7 +41,7 @@ void test01() test_base io2; io1 = io2; } -// { dg-error "synthesized" "" { target *-*-* } 41 } -// { dg-error "within this context" "" { target *-*-* } 34 } -// { dg-error "is private" "" { target *-*-* } 790 } +// { dg-error "synthesized" "" { target *-*-* } 42 } +// { dg-error "within this context" "" { target *-*-* } 35 } +// { dg-error "is private" "" { target *-*-* } 786 } // { dg-error "operator=" "" { target *-*-* } 0 } diff --git a/libstdc++-v3/testsuite/27_io/ios_base/cons/copy_neg.cc b/libstdc++-v3/testsuite/27_io/ios_base/cons/copy_neg.cc index 0c6bb296d38..536682eb6f3 100644 --- a/libstdc++-v3/testsuite/27_io/ios_base/cons/copy_neg.cc +++ b/libstdc++-v3/testsuite/27_io/ios_base/cons/copy_neg.cc @@ -1,6 +1,7 @@ // { dg-do compile } -// Copyright (C) 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc. +// Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008 Free Software +// Foundation, Inc. // // This file is part of the GNU ISO C++ Library. This library is free // software; you can redistribute it and/or modify it under the @@ -40,7 +41,7 @@ void test02() test_base io1; test_base io2 = io1; } -// { dg-error "within this context" "" { target *-*-* } 35 } -// { dg-error "synthesized" "" { target *-*-* } 41 } -// { dg-error "is private" "" { target *-*-* } 787 } +// { dg-error "within this context" "" { target *-*-* } 36 } +// { dg-error "synthesized" "" { target *-*-* } 42 } +// { dg-error "is private" "" { target *-*-* } 783 } // { dg-error "copy constructor" "" { target *-*-* } 0 } diff --git a/libstdc++-v3/testsuite/Makefile.am b/libstdc++-v3/testsuite/Makefile.am index 66bb6df5ac2..407d7c95f91 100644 --- a/libstdc++-v3/testsuite/Makefile.am +++ b/libstdc++-v3/testsuite/Makefile.am @@ -111,14 +111,6 @@ check-performance: testsuite_files_performance ${performance_script} -@(chmod + ${check_performance_script}; \ ${check_performance_script} ${glibcxx_srcdir} ${glibcxx_builddir}) -# Generates the plots and graphs for performance testing. -doc_performance_script=${glibcxx_srcdir}/scripts/make_graphs.py -doc-performance: - -@(chmod + ${doc_performance_script}; \ - ${doc_performance_script} ${glibcxx_srcdir} \ - ${glibcxx_builddir}/testsuite \ - ${glibcxx_srcdir}/testsuite/data/make_graph_htmls.xml \ - ${glibcxx_srcdir}/testsuite/data/make_graph_test_infos.xml local g++) # Runs the testsuite in parallel mode. libgomp_dir=${glibcxx_builddir}/../libgomp diff --git a/libstdc++-v3/testsuite/Makefile.in b/libstdc++-v3/testsuite/Makefile.in index 094549badc3..d6ac1538373 100644 --- a/libstdc++-v3/testsuite/Makefile.in +++ b/libstdc++-v3/testsuite/Makefile.in @@ -1,8 +1,8 @@ -# Makefile.in generated by automake 1.9.6 from Makefile.am. +# Makefile.in generated by automake 1.10 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005 Free Software Foundation, Inc. +# 2003, 2004, 2005, 2006 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. @@ -13,15 +13,11 @@ # PARTICULAR PURPOSE. @SET_MAKE@ -srcdir = @srcdir@ -top_srcdir = @top_srcdir@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ -top_builddir = .. am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd -INSTALL = @INSTALL@ install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c @@ -114,42 +110,13 @@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ -ENABLE_PARALLEL_FALSE = @ENABLE_PARALLEL_FALSE@ -ENABLE_PARALLEL_TRUE = @ENABLE_PARALLEL_TRUE@ -ENABLE_SYMVERS_DARWIN_FALSE = @ENABLE_SYMVERS_DARWIN_FALSE@ -ENABLE_SYMVERS_DARWIN_TRUE = @ENABLE_SYMVERS_DARWIN_TRUE@ -ENABLE_SYMVERS_FALSE = @ENABLE_SYMVERS_FALSE@ -ENABLE_SYMVERS_GNU_FALSE = @ENABLE_SYMVERS_GNU_FALSE@ -ENABLE_SYMVERS_GNU_NAMESPACE_FALSE = @ENABLE_SYMVERS_GNU_NAMESPACE_FALSE@ -ENABLE_SYMVERS_GNU_NAMESPACE_TRUE = @ENABLE_SYMVERS_GNU_NAMESPACE_TRUE@ -ENABLE_SYMVERS_GNU_TRUE = @ENABLE_SYMVERS_GNU_TRUE@ -ENABLE_SYMVERS_TRUE = @ENABLE_SYMVERS_TRUE@ -ENABLE_VISIBILITY_FALSE = @ENABLE_VISIBILITY_FALSE@ -ENABLE_VISIBILITY_TRUE = @ENABLE_VISIBILITY_TRUE@ ERROR_CONSTANTS_SRCDIR = @ERROR_CONSTANTS_SRCDIR@ EXEEXT = @EXEEXT@ EXTRA_CXX_FLAGS = @EXTRA_CXX_FLAGS@ FGREP = @FGREP@ -GLIBCXX_BUILD_DEBUG_FALSE = @GLIBCXX_BUILD_DEBUG_FALSE@ -GLIBCXX_BUILD_DEBUG_TRUE = @GLIBCXX_BUILD_DEBUG_TRUE@ -GLIBCXX_BUILD_PCH_FALSE = @GLIBCXX_BUILD_PCH_FALSE@ -GLIBCXX_BUILD_PCH_TRUE = @GLIBCXX_BUILD_PCH_TRUE@ -GLIBCXX_C_HEADERS_COMPATIBILITY_FALSE = @GLIBCXX_C_HEADERS_COMPATIBILITY_FALSE@ -GLIBCXX_C_HEADERS_COMPATIBILITY_TRUE = @GLIBCXX_C_HEADERS_COMPATIBILITY_TRUE@ -GLIBCXX_C_HEADERS_C_FALSE = @GLIBCXX_C_HEADERS_C_FALSE@ -GLIBCXX_C_HEADERS_C_GLOBAL_FALSE = @GLIBCXX_C_HEADERS_C_GLOBAL_FALSE@ -GLIBCXX_C_HEADERS_C_GLOBAL_TRUE = @GLIBCXX_C_HEADERS_C_GLOBAL_TRUE@ -GLIBCXX_C_HEADERS_C_STD_FALSE = @GLIBCXX_C_HEADERS_C_STD_FALSE@ -GLIBCXX_C_HEADERS_C_STD_TRUE = @GLIBCXX_C_HEADERS_C_STD_TRUE@ -GLIBCXX_C_HEADERS_C_TRUE = @GLIBCXX_C_HEADERS_C_TRUE@ -GLIBCXX_C_HEADERS_EXTRA_FALSE = @GLIBCXX_C_HEADERS_EXTRA_FALSE@ -GLIBCXX_C_HEADERS_EXTRA_TRUE = @GLIBCXX_C_HEADERS_EXTRA_TRUE@ -GLIBCXX_HOSTED_FALSE = @GLIBCXX_HOSTED_FALSE@ -GLIBCXX_HOSTED_TRUE = @GLIBCXX_HOSTED_TRUE@ GLIBCXX_INCLUDES = @GLIBCXX_INCLUDES@ -GLIBCXX_LDBL_COMPAT_FALSE = @GLIBCXX_LDBL_COMPAT_FALSE@ -GLIBCXX_LDBL_COMPAT_TRUE = @GLIBCXX_LDBL_COMPAT_TRUE@ GREP = @GREP@ +INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ @@ -166,9 +133,8 @@ LN_S = @LN_S@ LTLIBICONV = @LTLIBICONV@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ -MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@ -MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@ MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ NM = @NM@ OBJEXT = @OBJEXT@ OPTIMIZE_CXXFLAGS = @OPTIMIZE_CXXFLAGS@ @@ -194,13 +160,13 @@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ WARN_FLAGS = @WARN_FLAGS@ WERROR = @WERROR@ -ac_ct_AR = @ac_ct_AR@ -ac_ct_AS = @ac_ct_AS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ -ac_ct_RANLIB = @ac_ct_RANLIB@ -ac_ct_STRIP = @ac_ct_STRIP@ am__leading_dot = @am__leading_dot@ am__tar = @am__tar@ am__untar = @am__untar@ @@ -211,8 +177,12 @@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ +builddir = @builddir@ check_msgfmt = @check_msgfmt@ datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ enable_shared = @enable_shared@ enable_static = @enable_static@ exec_prefix = @exec_prefix@ @@ -232,29 +202,36 @@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ +htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ libtool_VERSION = @libtool_VERSION@ +localedir = @localedir@ localstatedir = @localstatedir@ lt_ECHO = @lt_ECHO@ mandir = @mandir@ mkdir_p = @mkdir_p@ multi_basedir = @multi_basedir@ oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ port_specific_symbol_files = @port_specific_symbol_files@ prefix = @prefix@ program_transform_name = @program_transform_name@ +psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ toplevel_srcdir = @toplevel_srcdir@ AUTOMAKE_OPTIONS = dejagnu nostdinc @@ -357,10 +334,6 @@ mostlyclean-libtool: clean-libtool: -rm -rf .libs _libs - -distclean-libtool: - -rm -f libtool -uninstall-info-am: tags: TAGS TAGS: @@ -373,11 +346,13 @@ check-DEJAGNU: site.exp EXPECT=$(EXPECT); export EXPECT; \ runtest=$(RUNTEST); \ if $(SHELL) -c "$$runtest --version" > /dev/null 2>&1; then \ - l='$(DEJATOOL)'; for tool in $$l; do \ - $$runtest $(AM_RUNTESTFLAGS) $(RUNTESTDEFAULTFLAGS) $(RUNTESTFLAGS); \ + exit_status=0; l='$(DEJATOOL)'; for tool in $$l; do \ + if $$runtest $(AM_RUNTESTFLAGS) $(RUNTESTDEFAULTFLAGS) $(RUNTESTFLAGS); \ + then :; else exit_status=1; fi; \ done; \ else echo "WARNING: could not find \`runtest'" 1>&2; :;\ - fi + fi; \ + exit $$exit_status distclean-DEJAGNU: -rm -f site.exp site.bak @@ -386,23 +361,21 @@ distclean-DEJAGNU: done distdir: $(DISTFILES) - $(mkdir_p) $(distdir)/.. - @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ - topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ - list='$(DISTFILES)'; for file in $$list; do \ - case $$file in \ - $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ - $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ - esac; \ + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ - dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ - if test "$$dir" != "$$file" && test "$$dir" != "."; then \ - dir="/$$dir"; \ - $(mkdir_p) "$(distdir)$$dir"; \ - else \ - dir=''; \ - fi; \ if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ @@ -449,8 +422,7 @@ clean-am: clean-generic clean-libtool clean-local mostlyclean-am distclean: distclean-am -rm -f Makefile -distclean-am: clean-am distclean-DEJAGNU distclean-generic \ - distclean-libtool +distclean-am: clean-am distclean-DEJAGNU distclean-generic dvi: dvi-am @@ -464,12 +436,20 @@ info-am: install-data-am: +install-dvi: install-dvi-am + install-exec-am: +install-html: install-html-am + install-info: install-info-am install-man: +install-pdf: install-pdf-am + +install-ps: install-ps-am + installcheck-am: maintainer-clean: maintainer-clean-am @@ -488,18 +468,21 @@ ps: ps-am ps-am: -uninstall-am: uninstall-info-am +uninstall-am: + +.MAKE: install-am install-strip .PHONY: all all-am check check-DEJAGNU check-am clean clean-generic \ clean-libtool clean-local distclean distclean-DEJAGNU \ distclean-generic distclean-libtool distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ - install-data-am install-exec install-exec-am install-info \ - install-info-am install-man install-strip installcheck \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ - mostlyclean-libtool pdf pdf-am ps ps-am uninstall uninstall-am \ - uninstall-info-am + mostlyclean-libtool pdf pdf-am ps ps-am uninstall uninstall-am # This rule generates all of the testsuite_files* lists at once. -- cgit v1.2.3